diff --git a/android/app/build.gradle b/android/app/build.gradle index 86d9b7c..9e4869f 100644 --- a/android/app/build.gradle +++ b/android/app/build.gradle @@ -9,13 +9,13 @@ else { apply plugin: 'kotlin-android' android { - compileSdkVersion 28 + compileSdkVersion 31 defaultConfig { if (buildAsApplication) { applicationId "io.github.kichikuou.system3" } minSdkVersion 19 - targetSdkVersion 28 + targetSdkVersion 31 versionCode 6 versionName "0.7.0" externalNativeBuild { diff --git a/android/app/jni/CMakeLists.txt b/android/app/jni/CMakeLists.txt index ab06425..7a347a3 100644 --- a/android/app/jni/CMakeLists.txt +++ b/android/app/jni/CMakeLists.txt @@ -9,9 +9,8 @@ project(GAME) include(FetchContent) FetchContent_Declare( SDL - URL https://libsdl.org/release/SDL2-2.0.16.tar.gz - URL_HASH SHA1=57825428174adb2ac947e4014080c262505aa972 - PATCH_COMMAND patch -p1 -i ${CMAKE_CURRENT_LIST_DIR}/SDL.patch + URL https://libsdl.org/release/SDL2-2.0.18.tar.gz + URL_HASH SHA1=419c62567d197a52a2136865c158f894939c1adf ) # TODO: Use SDL2_ttf 2.0.16 once released FetchContent_Declare( diff --git a/android/app/jni/SDL.patch b/android/app/jni/SDL.patch deleted file mode 100644 index 2e449e1..0000000 --- a/android/app/jni/SDL.patch +++ /dev/null @@ -1,17 +0,0 @@ -diff --git a/CMakeLists.txt b/CMakeLists.txt -index e7ab00feb..d86f0087a 100644 ---- a/CMakeLists.txt -+++ b/CMakeLists.txt -@@ -2053,6 +2053,12 @@ if(SDL_SHARED) - set_property(TARGET SDL2 APPEND_STRING PROPERTY COMPILE_FLAGS "-fobjc-arc") - target_compile_definitions(SDL2 PRIVATE IOS_DYLIB=1) - endif() -+ if (ANDROID) -+ # Link the cpufeatures library in Android NDK. -+ # Since we don't use a SDK-bundled CMAKE, AndroidNdkModules module cannot be used. -+ target_include_directories(SDL2 PRIVATE ${ANDROID_NDK}/sources/android/cpufeatures) -+ target_sources(SDL2 PRIVATE ${ANDROID_NDK}/sources/android/cpufeatures/cpu-features.c) -+ endif() - endif() - - if(ANDROID) diff --git a/android/app/src/main/AndroidManifest.xml b/android/app/src/main/AndroidManifest.xml index a69ab5f..a5c07b9 100644 --- a/android/app/src/main/AndroidManifest.xml +++ b/android/app/src/main/AndroidManifest.xml @@ -37,10 +37,14 @@ android:name="android.hardware.microphone" android:required="false" /> --> - - + + + - + + + + @@ -64,7 +68,9 @@ --> - + + diff --git a/android/app/src/main/java/io/github/kichikuou/system3/GameActivity.kt b/android/app/src/main/java/io/github/kichikuou/system3/GameActivity.kt index 9a7b68b..a492705 100644 --- a/android/app/src/main/java/io/github/kichikuou/system3/GameActivity.kt +++ b/android/app/src/main/java/io/github/kichikuou/system3/GameActivity.kt @@ -51,7 +51,7 @@ class GameActivity : SDLActivity() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) - gameRoot = File(intent.getStringExtra(EXTRA_GAME_ROOT)) + gameRoot = File(intent.getStringExtra(EXTRA_GAME_ROOT)!!) cdda = CddaPlayer(File(gameRoot, Launcher.PLAYLIST_FILE)) prefs = getSharedPreferences("system3", Context.MODE_PRIVATE) useFM = prefs.getBoolean(PREF_USE_FM, useFM) @@ -71,13 +71,13 @@ class GameActivity : SDLActivity() { } override fun getLibraries(): Array { - return arrayOf("hidapi", "SDL2", "system3") + return arrayOf("SDL2", "system3") } override fun getArguments(): Array { val args = arrayListOf( - "-gamedir", intent.getStringExtra(EXTRA_GAME_ROOT), - "-savedir", intent.getStringExtra(EXTRA_SAVE_DIR) + "/@") + "-gamedir", intent.getStringExtra(EXTRA_GAME_ROOT)!!, + "-savedir", intent.getStringExtra(EXTRA_SAVE_DIR)!! + "/@") if (useFM) args.add("-fm") return args.toTypedArray() @@ -148,7 +148,7 @@ class GameActivity : SDLActivity() { } } - override fun onContextMenuClosed(menu: Menu?) { + override fun onContextMenuClosed(menu: Menu) { super.onContextMenuClosed(menu) menuShown = false } diff --git a/android/app/src/main/java/org/libsdl/app/HIDDeviceBLESteamController.java b/android/app/src/main/java/org/libsdl/app/HIDDeviceBLESteamController.java index 94a2818..65c5a42 100644 --- a/android/app/src/main/java/org/libsdl/app/HIDDeviceBLESteamController.java +++ b/android/app/src/main/java/org/libsdl/app/HIDDeviceBLESteamController.java @@ -564,10 +564,10 @@ class HIDDeviceBLESteamController extends BluetoothGattCallback implements HIDDe return "Steam Controller"; } - @Override + @Override public UsbDevice getDevice() { - return null; - } + return null; + } @Override public boolean open() { diff --git a/android/app/src/main/java/org/libsdl/app/HIDDeviceManager.java b/android/app/src/main/java/org/libsdl/app/HIDDeviceManager.java index 041dc38..5ebbb97 100644 --- a/android/app/src/main/java/org/libsdl/app/HIDDeviceManager.java +++ b/android/app/src/main/java/org/libsdl/app/HIDDeviceManager.java @@ -105,36 +105,6 @@ public class HIDDeviceManager { private HIDDeviceManager(final Context context) { mContext = context; - // Make sure we have the HIDAPI library loaded with the native functions - try { - SDL.loadLibrary("hidapi"); - } catch (Throwable e) { - Log.w(TAG, "Couldn't load hidapi: " + e.toString()); - - AlertDialog.Builder builder = new AlertDialog.Builder(context); - builder.setCancelable(false); - builder.setTitle("SDL HIDAPI Error"); - builder.setMessage("Please report the following error to the SDL maintainers: " + e.getMessage()); - builder.setNegativeButton("Quit", new DialogInterface.OnClickListener() { - @Override - public void onClick(DialogInterface dialog, int which) { - try { - // If our context is an activity, exit rather than crashing when we can't - // call our native functions. - Activity activity = (Activity)context; - - activity.finish(); - } - catch (ClassCastException cce) { - // Context wasn't an activity, there's nothing we can do. Give up and return. - } - } - }); - builder.show(); - - return; - } - HIDDeviceRegisterCallback(); mSharedPreferences = mContext.getSharedPreferences("hidapi", Context.MODE_PRIVATE); @@ -149,9 +119,6 @@ public class HIDDeviceManager { { mNextDeviceId = mSharedPreferences.getInt("next_device_id", 0); } - - initializeUSB(); - initializeBluetooth(); } public Context getContext() { @@ -379,7 +346,8 @@ public class HIDDeviceManager { private void initializeBluetooth() { Log.d(TAG, "Initializing Bluetooth"); - if (mContext.getPackageManager().checkPermission(android.Manifest.permission.BLUETOOTH, mContext.getPackageName()) != PackageManager.PERMISSION_GRANTED) { + if (Build.VERSION.SDK_INT <= 30 && + mContext.getPackageManager().checkPermission(android.Manifest.permission.BLUETOOTH, mContext.getPackageName()) != PackageManager.PERMISSION_GRANTED) { Log.d(TAG, "Couldn't initialize Bluetooth, missing android.permission.BLUETOOTH"); return; } @@ -571,6 +539,18 @@ public class HIDDeviceManager { ////////// JNI interface functions ////////////////////////////////////////////////////////////////////////////////////////////////////// + public boolean initialize(boolean usb, boolean bluetooth) { + Log.v(TAG, "initialize(" + usb + ", " + bluetooth + ")"); + + if (usb) { + initializeUSB(); + } + if (bluetooth) { + initializeBluetooth(); + } + return true; + } + public boolean openDevice(int deviceID) { Log.v(TAG, "openDevice deviceID=" + deviceID); HIDDevice device = getDevice(deviceID); @@ -584,7 +564,14 @@ public class HIDDeviceManager { if (usbDevice != null && !mUsbManager.hasPermission(usbDevice)) { HIDDeviceOpenPending(deviceID); try { - mUsbManager.requestPermission(usbDevice, PendingIntent.getBroadcast(mContext, 0, new Intent(HIDDeviceManager.ACTION_USB_PERMISSION), 0)); + final int FLAG_MUTABLE = 0x02000000; // PendingIntent.FLAG_MUTABLE, but don't require SDK 31 + int flags; + if (Build.VERSION.SDK_INT >= 31) { + flags = FLAG_MUTABLE; + } else { + flags = 0; + } + mUsbManager.requestPermission(usbDevice, PendingIntent.getBroadcast(mContext, 0, new Intent(HIDDeviceManager.ACTION_USB_PERMISSION), flags)); } catch (Exception e) { Log.v(TAG, "Couldn't request permission for USB device " + usbDevice); HIDDeviceOpenResult(deviceID, false); diff --git a/android/app/src/main/java/org/libsdl/app/SDLActivity.java b/android/app/src/main/java/org/libsdl/app/SDLActivity.java index 2d83b9f..02c64b1 100644 --- a/android/app/src/main/java/org/libsdl/app/SDLActivity.java +++ b/android/app/src/main/java/org/libsdl/app/SDLActivity.java @@ -164,7 +164,6 @@ public class SDLActivity extends Activity implements View.OnSystemUiVisibilityCh */ protected String[] getLibraries() { return new String[] { - "hidapi", "SDL2", // "SDL2_image", // "SDL2_mixer", @@ -379,11 +378,14 @@ public class SDLActivity extends Activity implements View.OnSystemUiVisibilityCh } public static int getCurrentOrientation() { - final Context context = SDLActivity.getContext(); - final Display display = ((WindowManager) context.getSystemService(Context.WINDOW_SERVICE)).getDefaultDisplay(); - int result = SDL_ORIENTATION_UNKNOWN; + Activity activity = (Activity)getContext(); + if (activity == null) { + return result; + } + Display display = activity.getWindowManager().getDefaultDisplay(); + switch (display.getRotation()) { case Surface.ROTATION_0: result = SDL_ORIENTATION_PORTRAIT; @@ -497,8 +499,8 @@ public class SDLActivity extends Activity implements View.OnSystemUiVisibilityCh // If we do, the normal hardware back button will no longer work and people have to use home, // but the mouse right click will work. // - String trapBack = SDLActivity.nativeGetHint("SDL_ANDROID_TRAP_BACK_BUTTON"); - if ((trapBack != null) && trapBack.equals("1")) { + boolean trapBack = SDLActivity.nativeGetHintBoolean("SDL_ANDROID_TRAP_BACK_BUTTON", false); + if (trapBack) { // Exit and let the mouse handler handle this button (if appropriate) return; } @@ -801,6 +803,7 @@ public class SDLActivity extends Activity implements View.OnSystemUiVisibilityCh public static native void onNativeSurfaceChanged(); public static native void onNativeSurfaceDestroyed(); public static native String nativeGetHint(String name); + public static native boolean nativeGetHintBoolean(String name, boolean default_value); public static native void nativeSetenv(String name, String value); public static native void onNativeOrientationChanged(int orientation); public static native void nativeAddTouch(int touchId, String name); diff --git a/android/app/src/main/java/org/libsdl/app/SDLAudioManager.java b/android/app/src/main/java/org/libsdl/app/SDLAudioManager.java index 09e4428..2bfc718 100644 --- a/android/app/src/main/java/org/libsdl/app/SDLAudioManager.java +++ b/android/app/src/main/java/org/libsdl/app/SDLAudioManager.java @@ -47,6 +47,10 @@ public class SDLAudioManager if (desiredChannels > 2) { desiredChannels = 2; } + } + + /* AudioTrack has sample rate limitation of 48000 (fixed in 5.0.2) */ + if (Build.VERSION.SDK_INT < 22) { if (sampleRate < 8000) { sampleRate = 8000; } else if (sampleRate > 48000) { diff --git a/android/gradle/wrapper/gradle-wrapper.jar b/android/gradle/wrapper/gradle-wrapper.jar index 13372ae..2b338a9 100644 Binary files a/android/gradle/wrapper/gradle-wrapper.jar and b/android/gradle/wrapper/gradle-wrapper.jar differ diff --git a/android/gradle/wrapper/gradle-wrapper.properties b/android/gradle/wrapper/gradle-wrapper.properties index 4ba4dac..ada5af4 100644 --- a/android/gradle/wrapper/gradle-wrapper.properties +++ b/android/gradle/wrapper/gradle-wrapper.properties @@ -1,6 +1,6 @@ -#Mon Aug 10 13:00:41 JST 2020 +#Thu Nov 11 18:20:34 PST 2021 distributionBase=GRADLE_USER_HOME +distributionUrl=https\://services.gradle.org/distributions/gradle-7.3-bin.zip distributionPath=wrapper/dists -zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-7.0.2-all.zip +zipStoreBase=GRADLE_USER_HOME