From f1c2f63aa12ce69e4d0805a12f4df383cea4fdfb Mon Sep 17 00:00:00 2001 From: SachinVin Date: Sat, 19 Mar 2022 11:30:29 +0530 Subject: [PATCH 01/12] Android: Java + JNI dump CmakeLists Jni Fix --- src/CMakeLists.txt | 4 +- src/android/.gitignore | 50 +- src/android/app/build.gradle | 139 ++- .../citra_emu}/ExampleInstrumentedTest.java | 4 +- src/android/app/src/main/AndroidManifest.xml | 74 +- src/android/app/src/main/cpp/CMakeLists.txt | 16 - src/android/app/src/main/cpp/logging/log.cpp | 15 - .../src/main/cpp/logging/logcat_backend.cpp | 38 - .../app/src/main/cpp/logging/logcat_backend.h | 22 - .../app/src/main/cpp/native_interface.cpp | 22 - .../app/src/main/cpp/native_interface.h | 16 - .../src/main/cpp/ui/main/main_activity.cpp | 31 - src/android/app/src/main/ic_citra-web.png | Bin 44326 -> 0 bytes .../org/citra/citra_emu/CitraApplication.java | 55 ++ .../org/citra/citra_emu/NativeLibrary.java | 661 +++++++++++++ .../activities/CustomFilePickerActivity.java | 38 + .../activities/EmulationActivity.java | 788 ++++++++++++++++ .../citra/citra_emu/adapters/GameAdapter.java | 247 +++++ .../citra/citra_emu/applets/MiiSelector.java | 124 +++ .../citra_emu/applets/SoftwareKeyboard.java | 264 ++++++ .../camera/StillImageCameraHelper.java | 65 ++ .../citra_emu/dialogs/MotionAlertDialog.java | 140 +++ .../DiskShaderCacheProgress.java | 139 +++ .../settings/model/BooleanSetting.java | 23 + .../features/settings/model/FloatSetting.java | 23 + .../features/settings/model/IntSetting.java | 23 + .../features/settings/model/Setting.java | 42 + .../settings/model/SettingSection.java | 55 ++ .../features/settings/model/Settings.java | 131 +++ .../settings/model/StringSetting.java | 23 + .../settings/model/view/CheckBoxSetting.java | 80 ++ .../settings/model/view/DateTimeSetting.java | 40 + .../settings/model/view/HeaderSetting.java | 14 + .../model/view/InputBindingSetting.java | 382 ++++++++ .../settings/model/view/PremiumHeader.java | 14 + .../view/PremiumSingleChoiceSetting.java | 59 ++ .../settings/model/view/SettingsItem.java | 107 +++ .../model/view/SingleChoiceSetting.java | 60 ++ .../settings/model/view/SliderSetting.java | 101 ++ .../model/view/StringSingleChoiceSetting.java | 82 ++ .../settings/model/view/SubmenuSetting.java | 21 + .../settings/ui/SettingsActivity.java | 215 +++++ .../ui/SettingsActivityPresenter.java | 124 +++ .../settings/ui/SettingsActivityView.java | 103 ++ .../features/settings/ui/SettingsAdapter.java | 487 ++++++++++ .../settings/ui/SettingsFragment.java | 136 +++ .../ui/SettingsFragmentPresenter.java | 411 ++++++++ .../settings/ui/SettingsFragmentView.java | 78 ++ .../settings/ui/SettingsFrameLayout.java | 48 + .../viewholder/CheckBoxSettingViewHolder.java | 54 ++ .../ui/viewholder/DateTimeViewHolder.java | 47 + .../ui/viewholder/HeaderViewHolder.java | 32 + .../InputBindingSettingViewHolder.java | 55 ++ .../ui/viewholder/PremiumViewHolder.java | 57 ++ .../ui/viewholder/SettingViewHolder.java | 49 + .../ui/viewholder/SingleChoiceViewHolder.java | 76 ++ .../ui/viewholder/SliderViewHolder.java | 46 + .../ui/viewholder/SubmenuViewHolder.java | 45 + .../features/settings/utils/SettingsFile.java | 337 +++++++ .../fragments/CustomFilePickerFragment.java | 120 +++ .../fragments/EmulationFragment.java | 378 ++++++++ .../java/org/citra/citra_emu/model/Game.java | 76 ++ .../citra/citra_emu/model/GameDatabase.java | 280 ++++++ .../citra/citra_emu/model/GameProvider.java | 138 +++ .../citra/citra_emu/overlay/InputOverlay.java | 878 ++++++++++++++++++ .../overlay/InputOverlayDrawableButton.java | 122 +++ .../overlay/InputOverlayDrawableDpad.java | 193 ++++ .../overlay/InputOverlayDrawableJoystick.java | 264 ++++++ .../citra_emu/ui/DividerItemDecoration.java | 130 +++ .../citra/citra_emu/ui/main/MainActivity.java | 269 ++++++ .../citra_emu/ui/main/MainPresenter.java | 82 ++ .../org/citra/citra_emu/ui/main/MainView.java | 25 + .../ui/platform/PlatformGamesFragment.java | 86 ++ .../ui/platform/PlatformGamesPresenter.java | 42 + .../ui/platform/PlatformGamesView.java | 21 + .../org/citra/citra_emu/utils/Action1.java | 5 + .../citra_emu/utils/AddDirectoryHelper.java | 38 + .../java/org/citra/citra_emu/utils/BiMap.java | 22 + .../citra/citra_emu/utils/BillingManager.java | 215 +++++ .../utils/ControllerMappingHelper.java | 66 ++ .../utils/DirectoryInitialization.java | 186 ++++ .../utils/DirectoryStateReceiver.java | 22 + .../utils/EmulationMenuSettings.java | 78 ++ .../citra_emu/utils/FileBrowserHelper.java | 73 ++ .../org/citra/citra_emu/utils/FileUtil.java | 37 + .../citra_emu/utils/ForegroundService.java | 63 ++ .../utils/GameIconRequestHandler.java | 27 + .../java/org/citra/citra_emu/utils/Log.java | 39 + .../citra_emu/utils/PermissionsHandler.java | 35 + .../PicassoRoundedCornersTransformation.java | 45 + .../citra/citra_emu/utils/PicassoUtils.java | 57 ++ .../citra/citra_emu/utils/StartupHandler.java | 45 + .../org/citra/citra_emu/utils/ThemeUtil.java | 34 + .../citra_emu/viewholders/GameViewHolder.java | 46 + .../org/citra_emu/citra/CitraApplication.java | 13 - .../main/java/org/citra_emu/citra/LOG.java | 41 - .../citra_emu/citra/ui/main/MainActivity.java | 58 -- .../org/citra_emu/citra/utils/FileUtil.java | 19 - .../citra_emu/citra/utils/PermissionUtil.java | 32 - src/android/app/src/main/jni/CMakeLists.txt | 34 + .../app/src/main/jni/applets/mii_selector.cpp | 87 ++ .../app/src/main/jni/applets/mii_selector.h | 25 + .../app/src/main/jni/applets/swkbd.cpp | 151 +++ src/android/app/src/main/jni/applets/swkbd.h | 35 + .../app/src/main/jni/camera/ndk_camera.cpp | 528 +++++++++++ .../app/src/main/jni/camera/ndk_camera.h | 91 ++ .../main/jni/camera/still_image_camera.cpp | 143 +++ .../src/main/jni/camera/still_image_camera.h | 63 ++ src/android/app/src/main/jni/config.cpp | 279 ++++++ src/android/app/src/main/jni/config.h | 26 + src/android/app/src/main/jni/default_ini.h | 323 +++++++ .../src/main/jni/emu_window/emu_window.cpp | 275 ++++++ .../app/src/main/jni/emu_window/emu_window.h | 83 ++ src/android/app/src/main/jni/game_info.cpp | 150 +++ src/android/app/src/main/jni/game_info.h | 20 + .../app/src/main/jni/game_settings.cpp | 81 ++ src/android/app/src/main/jni/game_settings.h | 11 + src/android/app/src/main/jni/id_cache.cpp | 235 +++++ src/android/app/src/main/jni/id_cache.h | 50 + .../app/src/main/jni/input_manager.cpp | 332 +++++++ src/android/app/src/main/jni/input_manager.h | 141 +++ src/android/app/src/main/jni/mic.cpp | 38 + src/android/app/src/main/jni/mic.h | 21 + src/android/app/src/main/jni/native.cpp | 728 +++++++++++++++ src/android/app/src/main/jni/native.h | 160 ++++ src/android/app/src/main/jni/ndk_motion.cpp | 196 ++++ src/android/app/src/main/jni/ndk_motion.h | 28 + .../src/main/res/animator/settings_enter.xml | 28 + .../src/main/res/animator/settings_exit.xml | 28 + .../main/res/animator/settings_pop_enter.xml | 28 + .../main/res/animator/setttings_pop_exit.xml | 27 + .../src/main/res/drawable-hdpi/button_a.png | Bin 0 -> 10674 bytes .../res/drawable-hdpi/button_a_pressed.png | Bin 0 -> 10738 bytes .../src/main/res/drawable-hdpi/button_b.png | Bin 0 -> 9479 bytes .../res/drawable-hdpi/button_b_pressed.png | Bin 0 -> 9555 bytes .../src/main/res/drawable-hdpi/button_l.png | Bin 0 -> 2738 bytes .../res/drawable-hdpi/button_l_pressed.png | Bin 0 -> 2795 bytes .../src/main/res/drawable-hdpi/button_r.png | Bin 0 -> 5680 bytes .../res/drawable-hdpi/button_r_pressed.png | Bin 0 -> 5784 bytes .../main/res/drawable-hdpi/button_select.png | Bin 0 -> 13280 bytes .../drawable-hdpi/button_select_pressed.png | Bin 0 -> 13344 bytes .../main/res/drawable-hdpi/button_start.png | Bin 0 -> 9518 bytes .../drawable-hdpi/button_start_pressed.png | Bin 0 -> 14872 bytes .../src/main/res/drawable-hdpi/button_x.png | Bin 0 -> 12124 bytes .../res/drawable-hdpi/button_x_pressed.png | Bin 0 -> 12390 bytes .../src/main/res/drawable-hdpi/button_y.png | Bin 0 -> 9321 bytes .../res/drawable-hdpi/button_y_pressed.png | Bin 0 -> 9498 bytes .../src/main/res/drawable-hdpi/button_zl.png | Bin 0 -> 4423 bytes .../res/drawable-hdpi/button_zl_pressed.png | Bin 0 -> 4426 bytes .../src/main/res/drawable-hdpi/button_zr.png | Bin 0 -> 6239 bytes .../res/drawable-hdpi/button_zr_pressed.png | Bin 0 -> 6201 bytes .../app/src/main/res/drawable-hdpi/dpad.png | Bin 0 -> 4273 bytes .../dpad_pressed_one_direction.png | Bin 0 -> 3824 bytes .../dpad_pressed_two_directions.png | Bin 0 -> 5658 bytes .../main/res/drawable-hdpi/ic_cia_install.png | Bin 0 -> 514 bytes .../src/main/res/drawable-hdpi/ic_folder.png | Bin 0 -> 275 bytes .../src/main/res/drawable-hdpi/ic_premium.png | Bin 0 -> 961 bytes .../res/drawable-hdpi/ic_settings_core.png | Bin 0 -> 793 bytes .../ic_stat_notification_logo.png | Bin 0 -> 2824 bytes .../src/main/res/drawable-hdpi/stick_c.png | Bin 0 -> 14819 bytes .../res/drawable-hdpi/stick_c_pressed.png | Bin 0 -> 14825 bytes .../main/res/drawable-hdpi/stick_c_range.png | Bin 0 -> 8813 bytes .../src/main/res/drawable-hdpi/stick_main.png | Bin 0 -> 12828 bytes .../res/drawable-hdpi/stick_main_pressed.png | Bin 0 -> 8244 bytes .../res/drawable-hdpi/stick_main_range.png | Bin 0 -> 32592 bytes .../main/res/drawable-mdpi/ic_cia_install.png | Bin 0 -> 364 bytes .../src/main/res/drawable-mdpi/ic_folder.png | Bin 0 -> 214 bytes .../src/main/res/drawable-mdpi/ic_premium.png | Bin 0 -> 605 bytes .../drawable-night-hdpi/ic_cia_install.png | Bin 0 -> 556 bytes .../res/drawable-night-hdpi/ic_folder.png | Bin 0 -> 289 bytes .../res/drawable-night-hdpi/ic_premium.png | Bin 0 -> 955 bytes .../drawable-night-hdpi/ic_settings_core.png | Bin 0 -> 1152 bytes .../drawable-night-mdpi/ic_cia_install.png | Bin 0 -> 405 bytes .../res/drawable-night-mdpi/ic_folder.png | Bin 0 -> 227 bytes .../res/drawable-night-mdpi/ic_premium.png | Bin 0 -> 595 bytes .../drawable-night-xhdpi/ic_cia_install.png | Bin 0 -> 729 bytes .../res/drawable-night-xhdpi/ic_folder.png | Bin 0 -> 347 bytes .../res/drawable-night-xhdpi/ic_premium.png | Bin 0 -> 1281 bytes .../drawable-night-xhdpi/ic_settings_core.png | Bin 0 -> 1431 bytes .../drawable-night-xxhdpi/ic_cia_install.png | Bin 0 -> 1168 bytes .../res/drawable-night-xxhdpi/ic_folder.png | Bin 0 -> 555 bytes .../res/drawable-night-xxhdpi/ic_premium.png | Bin 0 -> 2049 bytes .../ic_settings_core.png | Bin 0 -> 2125 bytes .../drawable-night-xxxhdpi/ic_cia_install.png | Bin 0 -> 1433 bytes .../res/drawable-night-xxxhdpi/ic_folder.png | Bin 0 -> 657 bytes .../res/drawable-night-xxxhdpi/ic_premium.png | Bin 0 -> 2614 bytes .../ic_settings_core.png | Bin 0 -> 2587 bytes .../src/main/res/drawable-night/no_icon.png | Bin 0 -> 9238 bytes .../drawable-v24/ic_launcher_foreground.xml | 34 - .../src/main/res/drawable-xhdpi/button_a.png | Bin 0 -> 14645 bytes .../res/drawable-xhdpi/button_a_pressed.png | Bin 0 -> 14643 bytes .../src/main/res/drawable-xhdpi/button_b.png | Bin 0 -> 13040 bytes .../res/drawable-xhdpi/button_b_pressed.png | Bin 0 -> 13046 bytes .../src/main/res/drawable-xhdpi/button_l.png | Bin 0 -> 3461 bytes .../res/drawable-xhdpi/button_l_pressed.png | Bin 0 -> 3471 bytes .../src/main/res/drawable-xhdpi/button_r.png | Bin 0 -> 7603 bytes .../res/drawable-xhdpi/button_r_pressed.png | Bin 0 -> 7595 bytes .../main/res/drawable-xhdpi/button_select.png | Bin 0 -> 17681 bytes .../drawable-xhdpi/button_select_pressed.png | Bin 0 -> 17648 bytes .../main/res/drawable-xhdpi/button_start.png | Bin 0 -> 19588 bytes .../drawable-xhdpi/button_start_pressed.png | Bin 0 -> 19743 bytes .../src/main/res/drawable-xhdpi/button_x.png | Bin 0 -> 16315 bytes .../res/drawable-xhdpi/button_x_pressed.png | Bin 0 -> 16543 bytes .../src/main/res/drawable-xhdpi/button_y.png | Bin 0 -> 12529 bytes .../res/drawable-xhdpi/button_y_pressed.png | Bin 0 -> 12698 bytes .../src/main/res/drawable-xhdpi/button_zl.png | Bin 0 -> 5584 bytes .../res/drawable-xhdpi/button_zl_pressed.png | Bin 0 -> 5616 bytes .../src/main/res/drawable-xhdpi/button_zr.png | Bin 0 -> 8283 bytes .../res/drawable-xhdpi/button_zr_pressed.png | Bin 0 -> 8330 bytes .../app/src/main/res/drawable-xhdpi/dpad.png | Bin 0 -> 5296 bytes .../dpad_pressed_one_direction.png | Bin 0 -> 4781 bytes .../dpad_pressed_two_directions.png | Bin 0 -> 7857 bytes .../res/drawable-xhdpi/ic_cia_install.png | Bin 0 -> 656 bytes .../src/main/res/drawable-xhdpi/ic_folder.png | Bin 0 -> 325 bytes .../main/res/drawable-xhdpi/ic_premium.png | Bin 0 -> 1334 bytes .../res/drawable-xhdpi/ic_settings_core.png | Bin 0 -> 1029 bytes .../ic_stat_notification_logo.png | Bin 0 -> 4026 bytes .../src/main/res/drawable-xhdpi/stick_c.png | Bin 0 -> 23215 bytes .../res/drawable-xhdpi/stick_c_pressed.png | Bin 0 -> 20594 bytes .../main/res/drawable-xhdpi/stick_c_range.png | Bin 0 -> 18277 bytes .../main/res/drawable-xhdpi/stick_main.png | Bin 0 -> 19086 bytes .../res/drawable-xhdpi/stick_main_pressed.png | Bin 0 -> 11657 bytes .../res/drawable-xhdpi/stick_main_range.png | Bin 0 -> 53646 bytes .../src/main/res/drawable-xxhdpi/button_a.png | Bin 0 -> 23552 bytes .../res/drawable-xxhdpi/button_a_pressed.png | Bin 0 -> 23611 bytes .../src/main/res/drawable-xxhdpi/button_b.png | Bin 0 -> 20371 bytes .../res/drawable-xxhdpi/button_b_pressed.png | Bin 0 -> 20591 bytes .../src/main/res/drawable-xxhdpi/button_l.png | Bin 0 -> 5288 bytes .../res/drawable-xxhdpi/button_l_pressed.png | Bin 0 -> 5352 bytes .../src/main/res/drawable-xxhdpi/button_r.png | Bin 0 -> 11960 bytes .../res/drawable-xxhdpi/button_r_pressed.png | Bin 0 -> 11969 bytes .../res/drawable-xxhdpi/button_select.png | Bin 0 -> 27251 bytes .../drawable-xxhdpi/button_select_pressed.png | Bin 0 -> 27436 bytes .../main/res/drawable-xxhdpi/button_start.png | Bin 0 -> 30505 bytes .../drawable-xxhdpi/button_start_pressed.png | Bin 0 -> 30785 bytes .../src/main/res/drawable-xxhdpi/button_x.png | Bin 0 -> 27021 bytes .../res/drawable-xxhdpi/button_x_pressed.png | Bin 0 -> 27645 bytes .../src/main/res/drawable-xxhdpi/button_y.png | Bin 0 -> 19978 bytes .../res/drawable-xxhdpi/button_y_pressed.png | Bin 0 -> 20426 bytes .../main/res/drawable-xxhdpi/button_zl.png | Bin 0 -> 8675 bytes .../res/drawable-xxhdpi/button_zl_pressed.png | Bin 0 -> 8675 bytes .../main/res/drawable-xxhdpi/button_zr.png | Bin 0 -> 13105 bytes .../res/drawable-xxhdpi/button_zr_pressed.png | Bin 0 -> 13182 bytes .../app/src/main/res/drawable-xxhdpi/dpad.png | Bin 0 -> 7816 bytes .../dpad_pressed_one_direction.png | Bin 0 -> 6977 bytes .../dpad_pressed_two_directions.png | Bin 0 -> 12762 bytes .../res/drawable-xxhdpi/ic_cia_install.png | Bin 0 -> 967 bytes .../main/res/drawable-xxhdpi/ic_folder.png | Bin 0 -> 487 bytes .../main/res/drawable-xxhdpi/ic_premium.png | Bin 0 -> 2096 bytes .../res/drawable-xxhdpi/ic_settings_core.png | Bin 0 -> 1647 bytes .../ic_stat_notification_logo.png | Bin 0 -> 5936 bytes .../src/main/res/drawable-xxhdpi/stick_c.png | Bin 0 -> 41218 bytes .../res/drawable-xxhdpi/stick_c_pressed.png | Bin 0 -> 32729 bytes .../res/drawable-xxhdpi/stick_c_range.png | Bin 0 -> 28519 bytes .../main/res/drawable-xxhdpi/stick_main.png | Bin 0 -> 35658 bytes .../drawable-xxhdpi/stick_main_pressed.png | Bin 0 -> 19150 bytes .../res/drawable-xxhdpi/stick_main_range.png | Bin 0 -> 99656 bytes .../main/res/drawable-xxxhdpi/button_a.png | Bin 0 -> 29133 bytes .../res/drawable-xxxhdpi/button_a_pressed.png | Bin 0 -> 29190 bytes .../main/res/drawable-xxxhdpi/button_b.png | Bin 0 -> 24653 bytes .../res/drawable-xxxhdpi/button_b_pressed.png | Bin 0 -> 24931 bytes .../main/res/drawable-xxxhdpi/button_l.png | Bin 0 -> 6396 bytes .../res/drawable-xxxhdpi/button_l_pressed.png | Bin 0 -> 6455 bytes .../main/res/drawable-xxxhdpi/button_r.png | Bin 0 -> 14580 bytes .../res/drawable-xxxhdpi/button_r_pressed.png | Bin 0 -> 14493 bytes .../res/drawable-xxxhdpi/button_select.png | Bin 0 -> 32098 bytes .../button_select_pressed.png | Bin 0 -> 32299 bytes .../res/drawable-xxxhdpi/button_start.png | Bin 0 -> 36683 bytes .../drawable-xxxhdpi/button_start_pressed.png | Bin 0 -> 36775 bytes .../main/res/drawable-xxxhdpi/button_x.png | Bin 0 -> 33016 bytes .../res/drawable-xxxhdpi/button_x_pressed.png | Bin 0 -> 34053 bytes .../main/res/drawable-xxxhdpi/button_y.png | Bin 0 -> 24127 bytes .../res/drawable-xxxhdpi/button_y_pressed.png | Bin 0 -> 24408 bytes .../main/res/drawable-xxxhdpi/button_zl.png | Bin 0 -> 10479 bytes .../drawable-xxxhdpi/button_zl_pressed.png | Bin 0 -> 10484 bytes .../main/res/drawable-xxxhdpi/button_zr.png | Bin 0 -> 15653 bytes .../drawable-xxxhdpi/button_zr_pressed.png | Bin 0 -> 15648 bytes .../src/main/res/drawable-xxxhdpi/dpad.png | Bin 0 -> 9253 bytes .../dpad_pressed_one_direction.png | Bin 0 -> 8434 bytes .../dpad_pressed_two_directions.png | Bin 0 -> 16159 bytes .../res/drawable-xxxhdpi/ic_cia_install.png | Bin 0 -> 1244 bytes .../main/res/drawable-xxxhdpi/ic_folder.png | Bin 0 -> 591 bytes .../main/res/drawable-xxxhdpi/ic_premium.png | Bin 0 -> 2654 bytes .../res/drawable-xxxhdpi/ic_settings_core.png | Bin 0 -> 2093 bytes .../src/main/res/drawable-xxxhdpi/stick_c.png | Bin 0 -> 57013 bytes .../res/drawable-xxxhdpi/stick_c_pressed.png | Bin 0 -> 40273 bytes .../res/drawable-xxxhdpi/stick_c_range.png | Bin 0 -> 34281 bytes .../main/res/drawable-xxxhdpi/stick_main.png | Bin 0 -> 45881 bytes .../drawable-xxxhdpi/stick_main_pressed.png | Bin 0 -> 24942 bytes .../res/drawable-xxxhdpi/stick_main_range.png | Bin 0 -> 136109 bytes .../main/res/drawable/gamelist_divider.xml | 11 + .../app/src/main/res/drawable/ic_add.xml | 5 - .../res/drawable/ic_launcher_background.xml | 170 ---- .../app/src/main/res/drawable/no_icon.png | Bin 0 -> 8610 bytes .../main/res/layout/activity_emulation.xml | 17 + .../app/src/main/res/layout/activity_main.xml | 57 +- .../src/main/res/layout/activity_settings.xml | 5 + .../app/src/main/res/layout/card_game.xml | 82 ++ .../src/main/res/layout/dialog_checkbox.xml | 16 + .../main/res/layout/dialog_progress_bar.xml | 26 + .../src/main/res/layout/dialog_seekbar.xml | 37 + .../main/res/layout/filepicker_toolbar.xml | 32 + .../main/res/layout/fragment_emulation.xml | 47 + .../app/src/main/res/layout/fragment_grid.xml | 33 + .../src/main/res/layout/fragment_settings.xml | 12 + .../src/main/res/layout/list_item_setting.xml | 43 + .../res/layout/list_item_setting_checkbox.xml | 52 ++ .../res/layout/list_item_settings_header.xml | 19 + .../main/res/layout/premium_item_setting.xml | 43 + .../res/layout/sysclock_datetime_picker.xml | 22 + .../app/src/main/res/menu/menu_emulation.xml | 113 +++ .../app/src/main/res/menu/menu_game_grid.xml | 34 + .../app/src/main/res/menu/menu_settings.xml | 2 + .../res/mipmap-anydpi-v26/ic_citra_round.xml | 5 - .../{ic_citra.xml => ic_launcher.xml} | 4 +- .../app/src/main/res/mipmap-hdpi/ic_citra.png | Bin 2949 -> 0 bytes .../main/res/mipmap-hdpi/ic_citra_round.png | Bin 5207 -> 0 bytes .../src/main/res/mipmap-hdpi/ic_launcher.png | Bin 0 -> 5899 bytes .../mipmap-hdpi/ic_launcher_foreground.png | Bin 6285 -> 7416 bytes .../app/src/main/res/mipmap-mdpi/ic_citra.png | Bin 1555 -> 0 bytes .../main/res/mipmap-mdpi/ic_citra_round.png | Bin 2979 -> 0 bytes .../src/main/res/mipmap-mdpi/ic_launcher.png | Bin 0 -> 3377 bytes .../mipmap-mdpi/ic_launcher_foreground.png | Bin 3644 -> 4413 bytes .../src/main/res/mipmap-xhdpi/ic_citra.png | Bin 4345 -> 0 bytes .../main/res/mipmap-xhdpi/ic_citra_round.png | Bin 7785 -> 0 bytes .../src/main/res/mipmap-xhdpi/ic_launcher.png | Bin 0 -> 8742 bytes .../mipmap-xhdpi/ic_launcher_foreground.png | Bin 9166 -> 10530 bytes .../src/main/res/mipmap-xxhdpi/ic_citra.png | Bin 7407 -> 0 bytes .../main/res/mipmap-xxhdpi/ic_citra_round.png | Bin 12975 -> 0 bytes .../main/res/mipmap-xxhdpi/ic_launcher.png | Bin 0 -> 14300 bytes .../mipmap-xxhdpi/ic_launcher_foreground.png | Bin 15434 -> 17511 bytes .../src/main/res/mipmap-xxxhdpi/ic_citra.png | Bin 10820 -> 0 bytes .../res/mipmap-xxxhdpi/ic_citra_round.png | Bin 18933 -> 0 bytes .../main/res/mipmap-xxxhdpi/ic_launcher.png | Bin 0 -> 20804 bytes .../mipmap-xxxhdpi/ic_launcher_foreground.png | Bin 23235 -> 24886 bytes .../app/src/main/res/values-de/strings.xml | 167 ++++ .../app/src/main/res/values-es/strings.xml | 167 ++++ .../app/src/main/res/values-fi/strings.xml | 96 ++ .../app/src/main/res/values-fr/strings.xml | 167 ++++ .../app/src/main/res/values-it/strings.xml | 167 ++++ .../app/src/main/res/values-ja/strings.xml | 114 +++ .../app/src/main/res/values-ko/strings.xml | 169 ++++ .../app/src/main/res/values-nb/strings.xml | 167 ++++ .../app/src/main/res/values-night/colors.xml | 17 + .../res/values-night/styles_filepicker.xml | 5 + .../app/src/main/res/values-pt/strings.xml | 167 ++++ .../src/main/res/values-w1000dp/integers.xml | 4 + .../src/main/res/values-w1050dp/dimens.xml | 6 + .../src/main/res/values-w500dp/integers.xml | 4 + .../src/main/res/values-w750dp/integers.xml | 4 + .../app/src/main/res/values-w820dp/dimens.xml | 5 + .../app/src/main/res/values-zh/strings.xml | 167 ++++ .../app/src/main/res/values/arrays.xml | 174 ++++ .../app/src/main/res/values/colors.xml | 16 +- .../app/src/main/res/values/dimens.xml | 10 + .../app/src/main/res/values/integers.xml | 65 ++ .../app/src/main/res/values/strings.xml | 226 +++++ .../app/src/main/res/values/styles.xml | 65 +- .../src/main/res/values/styles_filepicker.xml | 5 + .../citra_emu}/ExampleUnitTest.java | 4 +- src/android/build.gradle | 2 +- src/android/code-style-java.xml | 135 ++- src/android/gradle.properties | 2 + .../gradle/wrapper/gradle-wrapper.properties | 4 +- 364 files changed, 17934 insertions(+), 765 deletions(-) rename src/android/app/src/androidTest/java/org/{citra_emu/citra => citra/citra_emu}/ExampleInstrumentedTest.java (84%) delete mode 100644 src/android/app/src/main/cpp/CMakeLists.txt delete mode 100644 src/android/app/src/main/cpp/logging/log.cpp delete mode 100644 src/android/app/src/main/cpp/logging/logcat_backend.cpp delete mode 100644 src/android/app/src/main/cpp/logging/logcat_backend.h delete mode 100644 src/android/app/src/main/cpp/native_interface.cpp delete mode 100644 src/android/app/src/main/cpp/native_interface.h delete mode 100644 src/android/app/src/main/cpp/ui/main/main_activity.cpp delete mode 100644 src/android/app/src/main/ic_citra-web.png create mode 100644 src/android/app/src/main/java/org/citra/citra_emu/CitraApplication.java create mode 100644 src/android/app/src/main/java/org/citra/citra_emu/NativeLibrary.java create mode 100644 src/android/app/src/main/java/org/citra/citra_emu/activities/CustomFilePickerActivity.java create mode 100644 src/android/app/src/main/java/org/citra/citra_emu/activities/EmulationActivity.java create mode 100644 src/android/app/src/main/java/org/citra/citra_emu/adapters/GameAdapter.java create mode 100644 src/android/app/src/main/java/org/citra/citra_emu/applets/MiiSelector.java create mode 100644 src/android/app/src/main/java/org/citra/citra_emu/applets/SoftwareKeyboard.java create mode 100644 src/android/app/src/main/java/org/citra/citra_emu/camera/StillImageCameraHelper.java create mode 100644 src/android/app/src/main/java/org/citra/citra_emu/dialogs/MotionAlertDialog.java create mode 100644 src/android/app/src/main/java/org/citra/citra_emu/disk_shader_cache/DiskShaderCacheProgress.java create mode 100644 src/android/app/src/main/java/org/citra/citra_emu/features/settings/model/BooleanSetting.java create mode 100644 src/android/app/src/main/java/org/citra/citra_emu/features/settings/model/FloatSetting.java create mode 100644 src/android/app/src/main/java/org/citra/citra_emu/features/settings/model/IntSetting.java create mode 100644 src/android/app/src/main/java/org/citra/citra_emu/features/settings/model/Setting.java create mode 100644 src/android/app/src/main/java/org/citra/citra_emu/features/settings/model/SettingSection.java create mode 100644 src/android/app/src/main/java/org/citra/citra_emu/features/settings/model/Settings.java create mode 100644 src/android/app/src/main/java/org/citra/citra_emu/features/settings/model/StringSetting.java create mode 100644 src/android/app/src/main/java/org/citra/citra_emu/features/settings/model/view/CheckBoxSetting.java create mode 100644 src/android/app/src/main/java/org/citra/citra_emu/features/settings/model/view/DateTimeSetting.java create mode 100644 src/android/app/src/main/java/org/citra/citra_emu/features/settings/model/view/HeaderSetting.java create mode 100644 src/android/app/src/main/java/org/citra/citra_emu/features/settings/model/view/InputBindingSetting.java create mode 100644 src/android/app/src/main/java/org/citra/citra_emu/features/settings/model/view/PremiumHeader.java create mode 100644 src/android/app/src/main/java/org/citra/citra_emu/features/settings/model/view/PremiumSingleChoiceSetting.java create mode 100644 src/android/app/src/main/java/org/citra/citra_emu/features/settings/model/view/SettingsItem.java create mode 100644 src/android/app/src/main/java/org/citra/citra_emu/features/settings/model/view/SingleChoiceSetting.java create mode 100644 src/android/app/src/main/java/org/citra/citra_emu/features/settings/model/view/SliderSetting.java create mode 100644 src/android/app/src/main/java/org/citra/citra_emu/features/settings/model/view/StringSingleChoiceSetting.java create mode 100644 src/android/app/src/main/java/org/citra/citra_emu/features/settings/model/view/SubmenuSetting.java create mode 100644 src/android/app/src/main/java/org/citra/citra_emu/features/settings/ui/SettingsActivity.java create mode 100644 src/android/app/src/main/java/org/citra/citra_emu/features/settings/ui/SettingsActivityPresenter.java create mode 100644 src/android/app/src/main/java/org/citra/citra_emu/features/settings/ui/SettingsActivityView.java create mode 100644 src/android/app/src/main/java/org/citra/citra_emu/features/settings/ui/SettingsAdapter.java create mode 100644 src/android/app/src/main/java/org/citra/citra_emu/features/settings/ui/SettingsFragment.java create mode 100644 src/android/app/src/main/java/org/citra/citra_emu/features/settings/ui/SettingsFragmentPresenter.java create mode 100644 src/android/app/src/main/java/org/citra/citra_emu/features/settings/ui/SettingsFragmentView.java create mode 100644 src/android/app/src/main/java/org/citra/citra_emu/features/settings/ui/SettingsFrameLayout.java create mode 100644 src/android/app/src/main/java/org/citra/citra_emu/features/settings/ui/viewholder/CheckBoxSettingViewHolder.java create mode 100644 src/android/app/src/main/java/org/citra/citra_emu/features/settings/ui/viewholder/DateTimeViewHolder.java create mode 100644 src/android/app/src/main/java/org/citra/citra_emu/features/settings/ui/viewholder/HeaderViewHolder.java create mode 100644 src/android/app/src/main/java/org/citra/citra_emu/features/settings/ui/viewholder/InputBindingSettingViewHolder.java create mode 100644 src/android/app/src/main/java/org/citra/citra_emu/features/settings/ui/viewholder/PremiumViewHolder.java create mode 100644 src/android/app/src/main/java/org/citra/citra_emu/features/settings/ui/viewholder/SettingViewHolder.java create mode 100644 src/android/app/src/main/java/org/citra/citra_emu/features/settings/ui/viewholder/SingleChoiceViewHolder.java create mode 100644 src/android/app/src/main/java/org/citra/citra_emu/features/settings/ui/viewholder/SliderViewHolder.java create mode 100644 src/android/app/src/main/java/org/citra/citra_emu/features/settings/ui/viewholder/SubmenuViewHolder.java create mode 100644 src/android/app/src/main/java/org/citra/citra_emu/features/settings/utils/SettingsFile.java create mode 100644 src/android/app/src/main/java/org/citra/citra_emu/fragments/CustomFilePickerFragment.java create mode 100644 src/android/app/src/main/java/org/citra/citra_emu/fragments/EmulationFragment.java create mode 100644 src/android/app/src/main/java/org/citra/citra_emu/model/Game.java create mode 100644 src/android/app/src/main/java/org/citra/citra_emu/model/GameDatabase.java create mode 100644 src/android/app/src/main/java/org/citra/citra_emu/model/GameProvider.java create mode 100644 src/android/app/src/main/java/org/citra/citra_emu/overlay/InputOverlay.java create mode 100644 src/android/app/src/main/java/org/citra/citra_emu/overlay/InputOverlayDrawableButton.java create mode 100644 src/android/app/src/main/java/org/citra/citra_emu/overlay/InputOverlayDrawableDpad.java create mode 100644 src/android/app/src/main/java/org/citra/citra_emu/overlay/InputOverlayDrawableJoystick.java create mode 100644 src/android/app/src/main/java/org/citra/citra_emu/ui/DividerItemDecoration.java create mode 100644 src/android/app/src/main/java/org/citra/citra_emu/ui/main/MainActivity.java create mode 100644 src/android/app/src/main/java/org/citra/citra_emu/ui/main/MainPresenter.java create mode 100644 src/android/app/src/main/java/org/citra/citra_emu/ui/main/MainView.java create mode 100644 src/android/app/src/main/java/org/citra/citra_emu/ui/platform/PlatformGamesFragment.java create mode 100644 src/android/app/src/main/java/org/citra/citra_emu/ui/platform/PlatformGamesPresenter.java create mode 100644 src/android/app/src/main/java/org/citra/citra_emu/ui/platform/PlatformGamesView.java create mode 100644 src/android/app/src/main/java/org/citra/citra_emu/utils/Action1.java create mode 100644 src/android/app/src/main/java/org/citra/citra_emu/utils/AddDirectoryHelper.java create mode 100644 src/android/app/src/main/java/org/citra/citra_emu/utils/BiMap.java create mode 100644 src/android/app/src/main/java/org/citra/citra_emu/utils/BillingManager.java create mode 100644 src/android/app/src/main/java/org/citra/citra_emu/utils/ControllerMappingHelper.java create mode 100644 src/android/app/src/main/java/org/citra/citra_emu/utils/DirectoryInitialization.java create mode 100644 src/android/app/src/main/java/org/citra/citra_emu/utils/DirectoryStateReceiver.java create mode 100644 src/android/app/src/main/java/org/citra/citra_emu/utils/EmulationMenuSettings.java create mode 100644 src/android/app/src/main/java/org/citra/citra_emu/utils/FileBrowserHelper.java create mode 100644 src/android/app/src/main/java/org/citra/citra_emu/utils/FileUtil.java create mode 100644 src/android/app/src/main/java/org/citra/citra_emu/utils/ForegroundService.java create mode 100644 src/android/app/src/main/java/org/citra/citra_emu/utils/GameIconRequestHandler.java create mode 100644 src/android/app/src/main/java/org/citra/citra_emu/utils/Log.java create mode 100644 src/android/app/src/main/java/org/citra/citra_emu/utils/PermissionsHandler.java create mode 100644 src/android/app/src/main/java/org/citra/citra_emu/utils/PicassoRoundedCornersTransformation.java create mode 100644 src/android/app/src/main/java/org/citra/citra_emu/utils/PicassoUtils.java create mode 100644 src/android/app/src/main/java/org/citra/citra_emu/utils/StartupHandler.java create mode 100644 src/android/app/src/main/java/org/citra/citra_emu/utils/ThemeUtil.java create mode 100644 src/android/app/src/main/java/org/citra/citra_emu/viewholders/GameViewHolder.java delete mode 100644 src/android/app/src/main/java/org/citra_emu/citra/CitraApplication.java delete mode 100644 src/android/app/src/main/java/org/citra_emu/citra/LOG.java delete mode 100644 src/android/app/src/main/java/org/citra_emu/citra/ui/main/MainActivity.java delete mode 100644 src/android/app/src/main/java/org/citra_emu/citra/utils/FileUtil.java delete mode 100644 src/android/app/src/main/java/org/citra_emu/citra/utils/PermissionUtil.java create mode 100644 src/android/app/src/main/jni/CMakeLists.txt create mode 100644 src/android/app/src/main/jni/applets/mii_selector.cpp create mode 100644 src/android/app/src/main/jni/applets/mii_selector.h create mode 100644 src/android/app/src/main/jni/applets/swkbd.cpp create mode 100644 src/android/app/src/main/jni/applets/swkbd.h create mode 100644 src/android/app/src/main/jni/camera/ndk_camera.cpp create mode 100644 src/android/app/src/main/jni/camera/ndk_camera.h create mode 100644 src/android/app/src/main/jni/camera/still_image_camera.cpp create mode 100644 src/android/app/src/main/jni/camera/still_image_camera.h create mode 100644 src/android/app/src/main/jni/config.cpp create mode 100644 src/android/app/src/main/jni/config.h create mode 100644 src/android/app/src/main/jni/default_ini.h create mode 100644 src/android/app/src/main/jni/emu_window/emu_window.cpp create mode 100644 src/android/app/src/main/jni/emu_window/emu_window.h create mode 100644 src/android/app/src/main/jni/game_info.cpp create mode 100644 src/android/app/src/main/jni/game_info.h create mode 100644 src/android/app/src/main/jni/game_settings.cpp create mode 100644 src/android/app/src/main/jni/game_settings.h create mode 100644 src/android/app/src/main/jni/id_cache.cpp create mode 100644 src/android/app/src/main/jni/id_cache.h create mode 100644 src/android/app/src/main/jni/input_manager.cpp create mode 100644 src/android/app/src/main/jni/input_manager.h create mode 100644 src/android/app/src/main/jni/mic.cpp create mode 100644 src/android/app/src/main/jni/mic.h create mode 100644 src/android/app/src/main/jni/native.cpp create mode 100644 src/android/app/src/main/jni/native.h create mode 100644 src/android/app/src/main/jni/ndk_motion.cpp create mode 100644 src/android/app/src/main/jni/ndk_motion.h create mode 100644 src/android/app/src/main/res/animator/settings_enter.xml create mode 100644 src/android/app/src/main/res/animator/settings_exit.xml create mode 100644 src/android/app/src/main/res/animator/settings_pop_enter.xml create mode 100644 src/android/app/src/main/res/animator/setttings_pop_exit.xml create mode 100644 src/android/app/src/main/res/drawable-hdpi/button_a.png create mode 100644 src/android/app/src/main/res/drawable-hdpi/button_a_pressed.png create mode 100644 src/android/app/src/main/res/drawable-hdpi/button_b.png create mode 100644 src/android/app/src/main/res/drawable-hdpi/button_b_pressed.png create mode 100644 src/android/app/src/main/res/drawable-hdpi/button_l.png create mode 100644 src/android/app/src/main/res/drawable-hdpi/button_l_pressed.png create mode 100644 src/android/app/src/main/res/drawable-hdpi/button_r.png create mode 100644 src/android/app/src/main/res/drawable-hdpi/button_r_pressed.png create mode 100644 src/android/app/src/main/res/drawable-hdpi/button_select.png create mode 100644 src/android/app/src/main/res/drawable-hdpi/button_select_pressed.png create mode 100644 src/android/app/src/main/res/drawable-hdpi/button_start.png create mode 100644 src/android/app/src/main/res/drawable-hdpi/button_start_pressed.png create mode 100644 src/android/app/src/main/res/drawable-hdpi/button_x.png create mode 100644 src/android/app/src/main/res/drawable-hdpi/button_x_pressed.png create mode 100644 src/android/app/src/main/res/drawable-hdpi/button_y.png create mode 100644 src/android/app/src/main/res/drawable-hdpi/button_y_pressed.png create mode 100644 src/android/app/src/main/res/drawable-hdpi/button_zl.png create mode 100644 src/android/app/src/main/res/drawable-hdpi/button_zl_pressed.png create mode 100644 src/android/app/src/main/res/drawable-hdpi/button_zr.png create mode 100644 src/android/app/src/main/res/drawable-hdpi/button_zr_pressed.png create mode 100644 src/android/app/src/main/res/drawable-hdpi/dpad.png create mode 100644 src/android/app/src/main/res/drawable-hdpi/dpad_pressed_one_direction.png create mode 100644 src/android/app/src/main/res/drawable-hdpi/dpad_pressed_two_directions.png create mode 100644 src/android/app/src/main/res/drawable-hdpi/ic_cia_install.png create mode 100644 src/android/app/src/main/res/drawable-hdpi/ic_folder.png create mode 100644 src/android/app/src/main/res/drawable-hdpi/ic_premium.png create mode 100644 src/android/app/src/main/res/drawable-hdpi/ic_settings_core.png create mode 100644 src/android/app/src/main/res/drawable-hdpi/ic_stat_notification_logo.png create mode 100644 src/android/app/src/main/res/drawable-hdpi/stick_c.png create mode 100644 src/android/app/src/main/res/drawable-hdpi/stick_c_pressed.png create mode 100644 src/android/app/src/main/res/drawable-hdpi/stick_c_range.png create mode 100644 src/android/app/src/main/res/drawable-hdpi/stick_main.png create mode 100644 src/android/app/src/main/res/drawable-hdpi/stick_main_pressed.png create mode 100644 src/android/app/src/main/res/drawable-hdpi/stick_main_range.png create mode 100644 src/android/app/src/main/res/drawable-mdpi/ic_cia_install.png create mode 100644 src/android/app/src/main/res/drawable-mdpi/ic_folder.png create mode 100644 src/android/app/src/main/res/drawable-mdpi/ic_premium.png create mode 100644 src/android/app/src/main/res/drawable-night-hdpi/ic_cia_install.png create mode 100644 src/android/app/src/main/res/drawable-night-hdpi/ic_folder.png create mode 100644 src/android/app/src/main/res/drawable-night-hdpi/ic_premium.png create mode 100644 src/android/app/src/main/res/drawable-night-hdpi/ic_settings_core.png create mode 100644 src/android/app/src/main/res/drawable-night-mdpi/ic_cia_install.png create mode 100644 src/android/app/src/main/res/drawable-night-mdpi/ic_folder.png create mode 100644 src/android/app/src/main/res/drawable-night-mdpi/ic_premium.png create mode 100644 src/android/app/src/main/res/drawable-night-xhdpi/ic_cia_install.png create mode 100644 src/android/app/src/main/res/drawable-night-xhdpi/ic_folder.png create mode 100644 src/android/app/src/main/res/drawable-night-xhdpi/ic_premium.png create mode 100644 src/android/app/src/main/res/drawable-night-xhdpi/ic_settings_core.png create mode 100644 src/android/app/src/main/res/drawable-night-xxhdpi/ic_cia_install.png create mode 100644 src/android/app/src/main/res/drawable-night-xxhdpi/ic_folder.png create mode 100644 src/android/app/src/main/res/drawable-night-xxhdpi/ic_premium.png create mode 100644 src/android/app/src/main/res/drawable-night-xxhdpi/ic_settings_core.png create mode 100644 src/android/app/src/main/res/drawable-night-xxxhdpi/ic_cia_install.png create mode 100644 src/android/app/src/main/res/drawable-night-xxxhdpi/ic_folder.png create mode 100644 src/android/app/src/main/res/drawable-night-xxxhdpi/ic_premium.png create mode 100644 src/android/app/src/main/res/drawable-night-xxxhdpi/ic_settings_core.png create mode 100644 src/android/app/src/main/res/drawable-night/no_icon.png delete mode 100644 src/android/app/src/main/res/drawable-v24/ic_launcher_foreground.xml create mode 100644 src/android/app/src/main/res/drawable-xhdpi/button_a.png create mode 100644 src/android/app/src/main/res/drawable-xhdpi/button_a_pressed.png create mode 100644 src/android/app/src/main/res/drawable-xhdpi/button_b.png create mode 100644 src/android/app/src/main/res/drawable-xhdpi/button_b_pressed.png create mode 100644 src/android/app/src/main/res/drawable-xhdpi/button_l.png create mode 100644 src/android/app/src/main/res/drawable-xhdpi/button_l_pressed.png create mode 100644 src/android/app/src/main/res/drawable-xhdpi/button_r.png create mode 100644 src/android/app/src/main/res/drawable-xhdpi/button_r_pressed.png create mode 100644 src/android/app/src/main/res/drawable-xhdpi/button_select.png create mode 100644 src/android/app/src/main/res/drawable-xhdpi/button_select_pressed.png create mode 100644 src/android/app/src/main/res/drawable-xhdpi/button_start.png create mode 100644 src/android/app/src/main/res/drawable-xhdpi/button_start_pressed.png create mode 100644 src/android/app/src/main/res/drawable-xhdpi/button_x.png create mode 100644 src/android/app/src/main/res/drawable-xhdpi/button_x_pressed.png create mode 100644 src/android/app/src/main/res/drawable-xhdpi/button_y.png create mode 100644 src/android/app/src/main/res/drawable-xhdpi/button_y_pressed.png create mode 100644 src/android/app/src/main/res/drawable-xhdpi/button_zl.png create mode 100644 src/android/app/src/main/res/drawable-xhdpi/button_zl_pressed.png create mode 100644 src/android/app/src/main/res/drawable-xhdpi/button_zr.png create mode 100644 src/android/app/src/main/res/drawable-xhdpi/button_zr_pressed.png create mode 100644 src/android/app/src/main/res/drawable-xhdpi/dpad.png create mode 100644 src/android/app/src/main/res/drawable-xhdpi/dpad_pressed_one_direction.png create mode 100644 src/android/app/src/main/res/drawable-xhdpi/dpad_pressed_two_directions.png create mode 100644 src/android/app/src/main/res/drawable-xhdpi/ic_cia_install.png create mode 100644 src/android/app/src/main/res/drawable-xhdpi/ic_folder.png create mode 100644 src/android/app/src/main/res/drawable-xhdpi/ic_premium.png create mode 100644 src/android/app/src/main/res/drawable-xhdpi/ic_settings_core.png create mode 100644 src/android/app/src/main/res/drawable-xhdpi/ic_stat_notification_logo.png create mode 100644 src/android/app/src/main/res/drawable-xhdpi/stick_c.png create mode 100644 src/android/app/src/main/res/drawable-xhdpi/stick_c_pressed.png create mode 100644 src/android/app/src/main/res/drawable-xhdpi/stick_c_range.png create mode 100644 src/android/app/src/main/res/drawable-xhdpi/stick_main.png create mode 100644 src/android/app/src/main/res/drawable-xhdpi/stick_main_pressed.png create mode 100644 src/android/app/src/main/res/drawable-xhdpi/stick_main_range.png create mode 100644 src/android/app/src/main/res/drawable-xxhdpi/button_a.png create mode 100644 src/android/app/src/main/res/drawable-xxhdpi/button_a_pressed.png create mode 100644 src/android/app/src/main/res/drawable-xxhdpi/button_b.png create mode 100644 src/android/app/src/main/res/drawable-xxhdpi/button_b_pressed.png create mode 100644 src/android/app/src/main/res/drawable-xxhdpi/button_l.png create mode 100644 src/android/app/src/main/res/drawable-xxhdpi/button_l_pressed.png create mode 100644 src/android/app/src/main/res/drawable-xxhdpi/button_r.png create mode 100644 src/android/app/src/main/res/drawable-xxhdpi/button_r_pressed.png create mode 100644 src/android/app/src/main/res/drawable-xxhdpi/button_select.png create mode 100644 src/android/app/src/main/res/drawable-xxhdpi/button_select_pressed.png create mode 100644 src/android/app/src/main/res/drawable-xxhdpi/button_start.png create mode 100644 src/android/app/src/main/res/drawable-xxhdpi/button_start_pressed.png create mode 100644 src/android/app/src/main/res/drawable-xxhdpi/button_x.png create mode 100644 src/android/app/src/main/res/drawable-xxhdpi/button_x_pressed.png create mode 100644 src/android/app/src/main/res/drawable-xxhdpi/button_y.png create mode 100644 src/android/app/src/main/res/drawable-xxhdpi/button_y_pressed.png create mode 100644 src/android/app/src/main/res/drawable-xxhdpi/button_zl.png create mode 100644 src/android/app/src/main/res/drawable-xxhdpi/button_zl_pressed.png create mode 100644 src/android/app/src/main/res/drawable-xxhdpi/button_zr.png create mode 100644 src/android/app/src/main/res/drawable-xxhdpi/button_zr_pressed.png create mode 100644 src/android/app/src/main/res/drawable-xxhdpi/dpad.png create mode 100644 src/android/app/src/main/res/drawable-xxhdpi/dpad_pressed_one_direction.png create mode 100644 src/android/app/src/main/res/drawable-xxhdpi/dpad_pressed_two_directions.png create mode 100644 src/android/app/src/main/res/drawable-xxhdpi/ic_cia_install.png create mode 100644 src/android/app/src/main/res/drawable-xxhdpi/ic_folder.png create mode 100644 src/android/app/src/main/res/drawable-xxhdpi/ic_premium.png create mode 100644 src/android/app/src/main/res/drawable-xxhdpi/ic_settings_core.png create mode 100644 src/android/app/src/main/res/drawable-xxhdpi/ic_stat_notification_logo.png create mode 100644 src/android/app/src/main/res/drawable-xxhdpi/stick_c.png create mode 100644 src/android/app/src/main/res/drawable-xxhdpi/stick_c_pressed.png create mode 100644 src/android/app/src/main/res/drawable-xxhdpi/stick_c_range.png create mode 100644 src/android/app/src/main/res/drawable-xxhdpi/stick_main.png create mode 100644 src/android/app/src/main/res/drawable-xxhdpi/stick_main_pressed.png create mode 100644 src/android/app/src/main/res/drawable-xxhdpi/stick_main_range.png create mode 100644 src/android/app/src/main/res/drawable-xxxhdpi/button_a.png create mode 100644 src/android/app/src/main/res/drawable-xxxhdpi/button_a_pressed.png create mode 100644 src/android/app/src/main/res/drawable-xxxhdpi/button_b.png create mode 100644 src/android/app/src/main/res/drawable-xxxhdpi/button_b_pressed.png create mode 100644 src/android/app/src/main/res/drawable-xxxhdpi/button_l.png create mode 100644 src/android/app/src/main/res/drawable-xxxhdpi/button_l_pressed.png create mode 100644 src/android/app/src/main/res/drawable-xxxhdpi/button_r.png create mode 100644 src/android/app/src/main/res/drawable-xxxhdpi/button_r_pressed.png create mode 100644 src/android/app/src/main/res/drawable-xxxhdpi/button_select.png create mode 100644 src/android/app/src/main/res/drawable-xxxhdpi/button_select_pressed.png create mode 100644 src/android/app/src/main/res/drawable-xxxhdpi/button_start.png create mode 100644 src/android/app/src/main/res/drawable-xxxhdpi/button_start_pressed.png create mode 100644 src/android/app/src/main/res/drawable-xxxhdpi/button_x.png create mode 100644 src/android/app/src/main/res/drawable-xxxhdpi/button_x_pressed.png create mode 100644 src/android/app/src/main/res/drawable-xxxhdpi/button_y.png create mode 100644 src/android/app/src/main/res/drawable-xxxhdpi/button_y_pressed.png create mode 100644 src/android/app/src/main/res/drawable-xxxhdpi/button_zl.png create mode 100644 src/android/app/src/main/res/drawable-xxxhdpi/button_zl_pressed.png create mode 100644 src/android/app/src/main/res/drawable-xxxhdpi/button_zr.png create mode 100644 src/android/app/src/main/res/drawable-xxxhdpi/button_zr_pressed.png create mode 100644 src/android/app/src/main/res/drawable-xxxhdpi/dpad.png create mode 100644 src/android/app/src/main/res/drawable-xxxhdpi/dpad_pressed_one_direction.png create mode 100644 src/android/app/src/main/res/drawable-xxxhdpi/dpad_pressed_two_directions.png create mode 100644 src/android/app/src/main/res/drawable-xxxhdpi/ic_cia_install.png create mode 100644 src/android/app/src/main/res/drawable-xxxhdpi/ic_folder.png create mode 100644 src/android/app/src/main/res/drawable-xxxhdpi/ic_premium.png create mode 100644 src/android/app/src/main/res/drawable-xxxhdpi/ic_settings_core.png create mode 100644 src/android/app/src/main/res/drawable-xxxhdpi/stick_c.png create mode 100644 src/android/app/src/main/res/drawable-xxxhdpi/stick_c_pressed.png create mode 100644 src/android/app/src/main/res/drawable-xxxhdpi/stick_c_range.png create mode 100644 src/android/app/src/main/res/drawable-xxxhdpi/stick_main.png create mode 100644 src/android/app/src/main/res/drawable-xxxhdpi/stick_main_pressed.png create mode 100644 src/android/app/src/main/res/drawable-xxxhdpi/stick_main_range.png create mode 100644 src/android/app/src/main/res/drawable/gamelist_divider.xml delete mode 100644 src/android/app/src/main/res/drawable/ic_add.xml delete mode 100644 src/android/app/src/main/res/drawable/ic_launcher_background.xml create mode 100644 src/android/app/src/main/res/drawable/no_icon.png create mode 100644 src/android/app/src/main/res/layout/activity_emulation.xml create mode 100644 src/android/app/src/main/res/layout/activity_settings.xml create mode 100644 src/android/app/src/main/res/layout/card_game.xml create mode 100644 src/android/app/src/main/res/layout/dialog_checkbox.xml create mode 100644 src/android/app/src/main/res/layout/dialog_progress_bar.xml create mode 100644 src/android/app/src/main/res/layout/dialog_seekbar.xml create mode 100644 src/android/app/src/main/res/layout/filepicker_toolbar.xml create mode 100644 src/android/app/src/main/res/layout/fragment_emulation.xml create mode 100644 src/android/app/src/main/res/layout/fragment_grid.xml create mode 100644 src/android/app/src/main/res/layout/fragment_settings.xml create mode 100644 src/android/app/src/main/res/layout/list_item_setting.xml create mode 100644 src/android/app/src/main/res/layout/list_item_setting_checkbox.xml create mode 100644 src/android/app/src/main/res/layout/list_item_settings_header.xml create mode 100644 src/android/app/src/main/res/layout/premium_item_setting.xml create mode 100644 src/android/app/src/main/res/layout/sysclock_datetime_picker.xml create mode 100644 src/android/app/src/main/res/menu/menu_emulation.xml create mode 100644 src/android/app/src/main/res/menu/menu_game_grid.xml create mode 100644 src/android/app/src/main/res/menu/menu_settings.xml delete mode 100644 src/android/app/src/main/res/mipmap-anydpi-v26/ic_citra_round.xml rename src/android/app/src/main/res/mipmap-anydpi-v26/{ic_citra.xml => ic_launcher.xml} (90%) delete mode 100644 src/android/app/src/main/res/mipmap-hdpi/ic_citra.png delete mode 100644 src/android/app/src/main/res/mipmap-hdpi/ic_citra_round.png create mode 100644 src/android/app/src/main/res/mipmap-hdpi/ic_launcher.png delete mode 100644 src/android/app/src/main/res/mipmap-mdpi/ic_citra.png delete mode 100644 src/android/app/src/main/res/mipmap-mdpi/ic_citra_round.png create mode 100644 src/android/app/src/main/res/mipmap-mdpi/ic_launcher.png delete mode 100644 src/android/app/src/main/res/mipmap-xhdpi/ic_citra.png delete mode 100644 src/android/app/src/main/res/mipmap-xhdpi/ic_citra_round.png create mode 100644 src/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png delete mode 100644 src/android/app/src/main/res/mipmap-xxhdpi/ic_citra.png delete mode 100644 src/android/app/src/main/res/mipmap-xxhdpi/ic_citra_round.png create mode 100644 src/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png delete mode 100644 src/android/app/src/main/res/mipmap-xxxhdpi/ic_citra.png delete mode 100644 src/android/app/src/main/res/mipmap-xxxhdpi/ic_citra_round.png create mode 100644 src/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png create mode 100644 src/android/app/src/main/res/values-de/strings.xml create mode 100644 src/android/app/src/main/res/values-es/strings.xml create mode 100644 src/android/app/src/main/res/values-fi/strings.xml create mode 100644 src/android/app/src/main/res/values-fr/strings.xml create mode 100644 src/android/app/src/main/res/values-it/strings.xml create mode 100644 src/android/app/src/main/res/values-ja/strings.xml create mode 100644 src/android/app/src/main/res/values-ko/strings.xml create mode 100644 src/android/app/src/main/res/values-nb/strings.xml create mode 100644 src/android/app/src/main/res/values-night/colors.xml create mode 100644 src/android/app/src/main/res/values-night/styles_filepicker.xml create mode 100644 src/android/app/src/main/res/values-pt/strings.xml create mode 100644 src/android/app/src/main/res/values-w1000dp/integers.xml create mode 100644 src/android/app/src/main/res/values-w1050dp/dimens.xml create mode 100644 src/android/app/src/main/res/values-w500dp/integers.xml create mode 100644 src/android/app/src/main/res/values-w750dp/integers.xml create mode 100644 src/android/app/src/main/res/values-w820dp/dimens.xml create mode 100644 src/android/app/src/main/res/values-zh/strings.xml create mode 100644 src/android/app/src/main/res/values/arrays.xml create mode 100644 src/android/app/src/main/res/values/dimens.xml create mode 100644 src/android/app/src/main/res/values/integers.xml create mode 100644 src/android/app/src/main/res/values/strings.xml create mode 100644 src/android/app/src/main/res/values/styles_filepicker.xml rename src/android/app/src/test/java/org/{citra_emu/citra => citra/citra_emu}/ExampleUnitTest.java (91%) diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 26d2fb869..60cce39af 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -117,8 +117,10 @@ endif() if (ENABLE_QT) add_subdirectory(citra_qt) endif() + if (ANDROID) - add_subdirectory(android/app/src/main/cpp) + include_directories(android/app/src/main) + add_subdirectory(android/app/src/main/jni) else() add_subdirectory(dedicated_room) endif() diff --git a/src/android/.gitignore b/src/android/.gitignore index 4423a0b45..40b6c5cd0 100644 --- a/src/android/.gitignore +++ b/src/android/.gitignore @@ -1,12 +1,46 @@ +# Built application files +*.apk +*.ap_ + +# Files for the ART/Dalvik VM +*.dex + +# Java class files +*.class + +# Generated files +bin/ +gen/ +out/ + +# Gradle files +.gradle/ +build/ + +# Local configuration file (sdk path, etc) +local.properties + +# Proguard folder generated by Eclipse +proguard/ + +# Log Files +*.log + +# Android Studio Navigation editor temp files +.navigation/ + +# Android Studio captures folder +captures/ + +# IntelliJ *.iml -.gradle -/local.properties -/.idea/libraries -/.idea/modules.xml -/.idea/workspace.xml -.DS_Store -/build -/captures +.idea/ + +# Keystore files +# Uncomment the following line if you do not want to check your keystore files in. +#*.jks + +# External native build folder generated in Android Studio 2.2 and later .externalNativeBuild # CXX compile cache diff --git a/src/android/app/build.gradle b/src/android/app/build.gradle index e57271517..012615ae2 100644 --- a/src/android/app/build.gradle +++ b/src/android/app/build.gradle @@ -1,8 +1,16 @@ apply plugin: 'com.android.application' +/** + * Use the number of seconds/10 since Jan 1 2016 as the versionCode. + * This lets us upload a new build at most every 10 seconds for the + * next 680 years. + */ +def autoVersion = (int) (((new Date().getTime() / 1000) - 1451606400) / 10) +def buildType +def abiFilter = "arm64-v8a" //, "x86" + android { - compileSdkVersion 26 - buildToolsVersion '28.0.3' + compileSdkVersion 29 compileOptions { sourceCompatibility JavaVersion.VERSION_1_8 @@ -13,34 +21,54 @@ android { // This is important as it will run lint but not abort on error // Lint has some overly obnoxious "errors" that should really be warnings abortOnError false + + //Uncomment disable lines for test builds... + //disable 'MissingTranslation'bin + //disable 'ExtraTranslation' } defaultConfig { - applicationId "org.citra_emu" - minSdkVersion 21 - targetSdkVersion 26 - - versionCode(getBuildVersionCode()) - - versionName "${getVersion()}" + // TODO If this is ever modified, change application_id in strings.xml + applicationId "org.citra.citra_emu" + minSdkVersion 26 + targetSdkVersion 29 + versionCode autoVersion + versionName getVersion() + ndk.abiFilters abiFilter } signingConfigs { - release { - if (project.hasProperty('keystore')) { - storeFile file(project.property('keystore')) - storePassword project.property('storepass') - keyAlias project.property('keyalias') - keyPassword project.property('keypass') - } - } + //release { + // storeFile file('') + // storePassword System.getenv('ANDROID_KEYPASS') + // keyAlias = 'key0' + // keyPassword System.getenv('ANDROID_KEYPASS') + //} + } + + applicationVariants.all { variant -> + buildType = variant.buildType.name // sets the current build type } // Define build types, which are orthogonal to product flavors. buildTypes { + // Signed by release key, allowing for upload to Play Store. release { - signingConfig signingConfigs.release + signingConfig signingConfigs.debug + } + + // builds a release build that doesn't need signing + // Attaches 'debug' suffix to version and package name, allowing installation alongside the release build. + relWithDebInfo { + initWith release + applicationIdSuffix ".debug" + versionNameSuffix '-debug' + signingConfig signingConfigs.debug + minifyEnabled false + testCoverageEnabled false + debuggable true + jniDebuggable true } // Signed by debug key disallowing distribution on Play Store. @@ -49,13 +77,14 @@ android { // TODO If this is ever modified, change application_id in debug/strings.xml applicationIdSuffix ".debug" versionNameSuffix '-debug' + debuggable true jniDebuggable true } } externalNativeBuild { cmake { - version getCmakeVersion() + version "3.10.2" path "../../../CMakeLists.txt" } } @@ -65,76 +94,46 @@ android { cmake { arguments "-DENABLE_QT=0", // Don't use QT "-DENABLE_SDL2=0", // Don't use SDL - "-DANDROID_ARM_NEON=true", // cryptopp requires Neon to work - "-DENABLE_CUBEB=0", - "-DANDROID_STL=c++_shared" + "-DENABLE_WEB_SERVICE=0", // Don't use telemetry + "-DANDROID_ARM_NEON=true" // cryptopp requires Neon to work - abiFilters "arm64-v8a" - - targets "citra-android" + abiFilters abiFilter } } } } -ext { - androidSupportVersion = '26.1.0' -} - dependencies { - implementation "com.android.support:support-v13:$androidSupportVersion" - implementation "com.android.support:cardview-v7:$androidSupportVersion" - implementation "com.android.support:recyclerview-v7:$androidSupportVersion" - implementation "com.android.support:design:$androidSupportVersion" + implementation 'androidx.appcompat:appcompat:1.1.0' + implementation 'androidx.exifinterface:exifinterface:1.2.0' + implementation 'androidx.cardview:cardview:1.0.0' + implementation 'androidx.recyclerview:recyclerview:1.1.0' + implementation 'com.google.android.material:material:1.1.0' - // Android TV UI libraries. - implementation "com.android.support:leanback-v17:$androidSupportVersion" + // For loading huge screenshots from the disk. + implementation 'com.squareup.picasso:picasso:2.71828' - implementation 'com.android.support.constraint:constraint-layout:1.1.0' + // Allows FRP-style asynchronous operations in Android. + implementation 'io.reactivex:rxandroid:1.2.1' + implementation 'com.nononsenseapps:filepicker:4.2.1' + implementation 'org.ini4j:ini4j:0.5.4' + implementation 'androidx.constraintlayout:constraintlayout:1.1.3' + implementation 'androidx.localbroadcastmanager:localbroadcastmanager:1.0.0' + implementation 'androidx.swiperefreshlayout:swiperefreshlayout:1.0.0' - testImplementation "com.android.support.test:runner:1.0.2" - androidTestImplementation "com.android.support.test:runner:1.0.1" + implementation 'com.android.billingclient:billing:2.0.3' } def getVersion() { - def versionNumber = '0.0' + def versionName = '0.0' try { - versionNumber = 'git describe --always --long'.execute([], project.rootDir).text + versionName = 'git describe --always --long'.execute([], project.rootDir).text .trim() .replaceAll(/(-0)?-[^-]+$/, "") } catch (Exception e) { logger.error('Cannot find git, defaulting to dummy version number') } - return versionNumber -} - - -def getBuildVersionCode() { - try { - def versionNumber = 'git rev-list --first-parent --count HEAD'.execute([], project.rootDir).text - .trim() - return Integer.valueOf(versionNumber) - } catch (Exception e) { - logger.error('Cannot find git, defaulting to dummy version number') - } - - return 0 -} - -def getCmakeVersion() { - try { - // Tokenized form of the output will be - ["cmake", "version", "M.m.p-rcx"], the version number - // will be at index 2 - def version_string = 'cmake -version'.execute([], project.rootDir).text - .trim().tokenize()[2] - - return version_string - } - catch(Exception e) { - logger.error('Cannot find Cmake, using default Cmake') - } - - return null + return versionName } diff --git a/src/android/app/src/androidTest/java/org/citra_emu/citra/ExampleInstrumentedTest.java b/src/android/app/src/androidTest/java/org/citra/citra_emu/ExampleInstrumentedTest.java similarity index 84% rename from src/android/app/src/androidTest/java/org/citra_emu/citra/ExampleInstrumentedTest.java rename to src/android/app/src/androidTest/java/org/citra/citra_emu/ExampleInstrumentedTest.java index 7055de885..671fb4b30 100644 --- a/src/android/app/src/androidTest/java/org/citra_emu/citra/ExampleInstrumentedTest.java +++ b/src/android/app/src/androidTest/java/org/citra/citra_emu/ExampleInstrumentedTest.java @@ -1,4 +1,4 @@ -package org.citra_emu.citra; +package org.citra.citra_emu; import android.content.Context; import android.support.test.InstrumentationRegistry; @@ -21,6 +21,6 @@ public class ExampleInstrumentedTest { // Context of the app under test. Context appContext = InstrumentationRegistry.getTargetContext(); - assertEquals("org.citra_emu.citra_android", appContext.getPackageName()); + assertEquals("org.citra.citra_emu", appContext.getPackageName()); } } diff --git a/src/android/app/src/main/AndroidManifest.xml b/src/android/app/src/main/AndroidManifest.xml index c1e38446a..b51382d21 100644 --- a/src/android/app/src/main/AndroidManifest.xml +++ b/src/android/app/src/main/AndroidManifest.xml @@ -1,39 +1,91 @@ + package="org.citra.citra_emu"> - - + + + + + + + + + android:banner="@mipmap/ic_launcher" + android:requestLegacyExternalStorage="true"> + android:name="org.citra.citra_emu.ui.main.MainActivity" + android:theme="@style/CitraBase" + android:resizeableActivity="false"> - + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/android/app/src/main/cpp/CMakeLists.txt b/src/android/app/src/main/cpp/CMakeLists.txt deleted file mode 100644 index f3a7e0131..000000000 --- a/src/android/app/src/main/cpp/CMakeLists.txt +++ /dev/null @@ -1,16 +0,0 @@ -cmake_minimum_required(VERSION 3.8) - -add_library(citra-android SHARED - logging/log.cpp - logging/logcat_backend.cpp - logging/logcat_backend.h - native_interface.cpp - native_interface.h - ui/main/main_activity.cpp - ) - -# find Android's log library -find_library(log-lib log) - -target_link_libraries(citra-android ${log-lib} core common inih) -target_include_directories(citra-android PRIVATE "../../../../../" "./") diff --git a/src/android/app/src/main/cpp/logging/log.cpp b/src/android/app/src/main/cpp/logging/log.cpp deleted file mode 100644 index 044f4eb4c..000000000 --- a/src/android/app/src/main/cpp/logging/log.cpp +++ /dev/null @@ -1,15 +0,0 @@ -#include "common/logging/log.h" -#include "native_interface.h" - -namespace Log { -extern "C" { -JNICALL void Java_org_citra_1emu_citra_LOG_logEntry(JNIEnv* env, jclass type, jint level, - jstring file_name, jint line_number, - jstring function, jstring msg) { - using CitraJNI::GetJString; - FmtLogMessage(Class::Frontend, static_cast(level), GetJString(env, file_name).data(), - static_cast(line_number), GetJString(env, function).data(), - GetJString(env, msg).data()); -} -} -} // namespace Log diff --git a/src/android/app/src/main/cpp/logging/logcat_backend.cpp b/src/android/app/src/main/cpp/logging/logcat_backend.cpp deleted file mode 100644 index 17b6ae1a0..000000000 --- a/src/android/app/src/main/cpp/logging/logcat_backend.cpp +++ /dev/null @@ -1,38 +0,0 @@ -// Copyright 2019 Citra Emulator Project -// Licensed under GPLv2 or any later version -// Refer to the license.txt file included. - -#include -#include "common/assert.h" -#include "common/logging/text_formatter.h" -#include "logcat_backend.h" - -namespace Log { -void LogcatBackend::Write(const Entry& entry) { - android_LogPriority priority; - switch (entry.log_level) { - case Level::Trace: - priority = ANDROID_LOG_VERBOSE; - break; - case Level::Debug: - priority = ANDROID_LOG_DEBUG; - break; - case Level::Info: - priority = ANDROID_LOG_INFO; - break; - case Level::Warning: - priority = ANDROID_LOG_WARN; - break; - case Level::Error: - priority = ANDROID_LOG_ERROR; - break; - case Level::Critical: - priority = ANDROID_LOG_FATAL; - break; - case Level::Count: - UNREACHABLE(); - } - - __android_log_print(priority, "citra", "%s\n", FormatLogMessage(entry).c_str()); -} -} // namespace Log \ No newline at end of file diff --git a/src/android/app/src/main/cpp/logging/logcat_backend.h b/src/android/app/src/main/cpp/logging/logcat_backend.h deleted file mode 100644 index f3bac4762..000000000 --- a/src/android/app/src/main/cpp/logging/logcat_backend.h +++ /dev/null @@ -1,22 +0,0 @@ -// Copyright 2019 Citra Emulator Project -// Licensed under GPLv2 or any later version -// Refer to the license.txt file included. - -#pragma once - -#include "common/logging/backend.h" - -namespace Log { -class LogcatBackend : public Backend { -public: - static const char* Name() { - return "Logcat"; - } - - const char* GetName() const override { - return Name(); - } - - void Write(const Entry& entry) override; -}; -} // namespace Log diff --git a/src/android/app/src/main/cpp/native_interface.cpp b/src/android/app/src/main/cpp/native_interface.cpp deleted file mode 100644 index fc4d73b77..000000000 --- a/src/android/app/src/main/cpp/native_interface.cpp +++ /dev/null @@ -1,22 +0,0 @@ -// Copyright 2019 Citra Emulator Project -// Licensed under GPLv2 or any later version -// Refer to the license.txt file included. - -#include "native_interface.h" - -namespace CitraJNI { -jint JNI_OnLoad(JavaVM* vm, void* reserved) { - return JNI_VERSION_1_6; -} - -std::string GetJString(JNIEnv* env, jstring jstr) { - std::string result = ""; - if (!jstr) - return result; - - const char* s = env->GetStringUTFChars(jstr, nullptr); - result = s; - env->ReleaseStringUTFChars(jstr, s); - return result; -} -} // namespace CitraJNI diff --git a/src/android/app/src/main/cpp/native_interface.h b/src/android/app/src/main/cpp/native_interface.h deleted file mode 100644 index a7b99cb51..000000000 --- a/src/android/app/src/main/cpp/native_interface.h +++ /dev/null @@ -1,16 +0,0 @@ -// Copyright 2019 Citra Emulator Project -// Licensed under GPLv2 or any later version -// Refer to the license.txt file included. - -#pragma once - -#include -#include - -namespace CitraJNI { -extern "C" { -jint JNI_OnLoad(JavaVM* vm, void* reserved); -} - -std::string GetJString(JNIEnv* env, jstring jstr); -} // namespace CitraJNI diff --git a/src/android/app/src/main/cpp/ui/main/main_activity.cpp b/src/android/app/src/main/cpp/ui/main/main_activity.cpp deleted file mode 100644 index b99ba1890..000000000 --- a/src/android/app/src/main/cpp/ui/main/main_activity.cpp +++ /dev/null @@ -1,31 +0,0 @@ -// Copyright 2019 Citra Emulator Project -// Licensed under GPLv2 or any later version -// Refer to the license.txt file included. - -#include "common/common_paths.h" -#include "common/file_util.h" -#include "common/logging/filter.h" -#include "common/logging/log.h" -#include "core/settings.h" -#include "logging/logcat_backend.h" -#include "native_interface.h" - -namespace MainActivity { -extern "C" { -JNICALL void Java_org_citra_1emu_citra_ui_main_MainActivity_initUserPath(JNIEnv* env, jclass type, - jstring path) { - FileUtil::SetUserPath(CitraJNI::GetJString(env, path) + '/'); -} - -JNICALL void Java_org_citra_1emu_citra_ui_main_MainActivity_initLogging(JNIEnv* env, jclass type) { - Log::Filter log_filter(Log::Level::Debug); - log_filter.ParseFilterString(Settings::values.log_filter); - Log::SetGlobalFilter(log_filter); - - const std::string& log_dir = FileUtil::GetUserPath(FileUtil::UserPath::LogDir); - FileUtil::CreateFullPath(log_dir); - Log::AddBackend(std::make_unique(log_dir + LOG_FILE)); - Log::AddBackend(std::make_unique()); -} -}; -}; // namespace MainActivity diff --git a/src/android/app/src/main/ic_citra-web.png b/src/android/app/src/main/ic_citra-web.png deleted file mode 100644 index 129946a37216c54a4a32057fac0dc36cb3fa7a14..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 44326 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 VcYoN;G7#`{-sB>t(#YfP{{kd`qRRjP diff --git a/src/android/app/src/main/java/org/citra/citra_emu/CitraApplication.java b/src/android/app/src/main/java/org/citra/citra_emu/CitraApplication.java new file mode 100644 index 000000000..9d3f80465 --- /dev/null +++ b/src/android/app/src/main/java/org/citra/citra_emu/CitraApplication.java @@ -0,0 +1,55 @@ +// Copyright 2019 Citra Emulator Project +// Licensed under GPLv2 or any later version +// Refer to the license.txt file included. + +package org.citra.citra_emu; + +import android.app.Application; +import android.app.NotificationChannel; +import android.app.NotificationManager; +import android.content.Context; +import android.os.Build; + +import org.citra.citra_emu.model.GameDatabase; +import org.citra.citra_emu.utils.DirectoryInitialization; +import org.citra.citra_emu.utils.PermissionsHandler; + +public class CitraApplication extends Application { + public static GameDatabase databaseHelper; + private static CitraApplication application; + + private void createNotificationChannel() { + // Create the NotificationChannel, but only on API 26+ because + // the NotificationChannel class is new and not in the support library + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { + CharSequence name = getString(R.string.app_notification_channel_name); + String description = getString(R.string.app_notification_channel_description); + NotificationChannel channel = new NotificationChannel(getString(R.string.app_notification_channel_id), name, NotificationManager.IMPORTANCE_LOW); + channel.setDescription(description); + channel.setSound(null, null); + channel.setVibrationPattern(null); + // Register the channel with the system; you can't change the importance + // or other notification behaviors after this + NotificationManager notificationManager = getSystemService(NotificationManager.class); + notificationManager.createNotificationChannel(channel); + } + } + + @Override + public void onCreate() { + super.onCreate(); + application = this; + + if (PermissionsHandler.hasWriteAccess(getApplicationContext())) { + DirectoryInitialization.start(getApplicationContext()); + } + + createNotificationChannel(); + + databaseHelper = new GameDatabase(this); + } + + public static Context getAppContext() { + return application.getApplicationContext(); + } +} diff --git a/src/android/app/src/main/java/org/citra/citra_emu/NativeLibrary.java b/src/android/app/src/main/java/org/citra/citra_emu/NativeLibrary.java new file mode 100644 index 000000000..48555252e --- /dev/null +++ b/src/android/app/src/main/java/org/citra/citra_emu/NativeLibrary.java @@ -0,0 +1,661 @@ +/* + * Copyright 2013 Dolphin Emulator Project + * Licensed under GPLv2+ + * Refer to the license.txt file included. + */ + +package org.citra.citra_emu; + +import android.app.Activity; +import android.app.Dialog; +import android.content.pm.PackageManager; +import android.content.res.Configuration; +import android.os.Bundle; +import android.text.Html; +import android.text.method.LinkMovementMethod; +import android.view.Surface; +import android.view.ViewGroup; +import android.widget.EditText; +import android.widget.FrameLayout; +import android.widget.TextView; + +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; +import androidx.appcompat.app.AlertDialog; +import androidx.core.content.ContextCompat; +import androidx.fragment.app.DialogFragment; + +import org.citra.citra_emu.activities.EmulationActivity; +import org.citra.citra_emu.applets.SoftwareKeyboard; +import org.citra.citra_emu.utils.EmulationMenuSettings; +import org.citra.citra_emu.utils.Log; +import org.citra.citra_emu.utils.PermissionsHandler; + +import java.lang.ref.WeakReference; +import java.util.Date; +import java.util.Objects; + +import static android.Manifest.permission.CAMERA; +import static android.Manifest.permission.RECORD_AUDIO; + +/** + * Class which contains methods that interact + * with the native side of the Citra code. + */ +public final class NativeLibrary { + /** + * Default touchscreen device + */ + public static final String TouchScreenDevice = "Touchscreen"; + public static WeakReference sEmulationActivity = new WeakReference<>(null); + + private static boolean alertResult = false; + private static String alertPromptResult = ""; + private static int alertPromptButton = 0; + private static final Object alertPromptLock = new Object(); + private static boolean alertPromptInProgress = false; + private static String alertPromptCaption = ""; + private static int alertPromptButtonConfig = 0; + private static EditText alertPromptEditText = null; + + static { + try { + System.loadLibrary("main"); + } catch (UnsatisfiedLinkError ex) { + Log.error("[NativeLibrary] " + ex.toString()); + } + } + + private NativeLibrary() { + // Disallows instantiation. + } + + /** + * Handles button press events for a gamepad. + * + * @param Device The input descriptor of the gamepad. + * @param Button Key code identifying which button was pressed. + * @param Action Mask identifying which action is happening (button pressed down, or button released). + * @return If we handled the button press. + */ + public static native boolean onGamePadEvent(String Device, int Button, int Action); + + /** + * Handles gamepad movement events. + * + * @param Device The device ID of the gamepad. + * @param Axis The axis ID + * @param x_axis The value of the x-axis represented by the given ID. + * @param y_axis The value of the y-axis represented by the given ID + */ + public static native boolean onGamePadMoveEvent(String Device, int Axis, float x_axis, float y_axis); + + /** + * Handles gamepad movement events. + * + * @param Device The device ID of the gamepad. + * @param Axis_id The axis ID + * @param axis_val The value of the axis represented by the given ID. + */ + public static native boolean onGamePadAxisEvent(String Device, int Axis_id, float axis_val); + + /** + * Handles touch events. + * + * @param x_axis The value of the x-axis. + * @param y_axis The value of the y-axis + * @param pressed To identify if the touch held down or released. + * @return true if the pointer is within the touchscreen + */ + public static native boolean onTouchEvent(float x_axis, float y_axis, boolean pressed); + + /** + * Handles touch movement. + * + * @param x_axis The value of the instantaneous x-axis. + * @param y_axis The value of the instantaneous y-axis. + */ + public static native void onTouchMoved(float x_axis, float y_axis); + + public static native void ReloadSettings(); + + public static native String GetUserSetting(String gameID, String Section, String Key); + + public static native void SetUserSetting(String gameID, String Section, String Key, String Value); + + public static native void InitGameIni(String gameID); + + /** + * Gets the embedded icon within the given ROM. + * + * @param filename the file path to the ROM. + * @return an integer array containing the color data for the icon. + */ + public static native int[] GetIcon(String filename); + + /** + * Gets the embedded title of the given ISO/ROM. + * + * @param filename The file path to the ISO/ROM. + * @return the embedded title of the ISO/ROM. + */ + public static native String GetTitle(String filename); + + public static native String GetDescription(String filename); + + public static native String GetGameId(String filename); + + public static native String GetRegions(String filename); + + public static native String GetCompany(String filename); + + public static native String GetGitRevision(); + + /** + * Sets the current working user directory + * If not set, it auto-detects a location + */ + public static native void SetUserDirectory(String directory); + + public static native String[] GetInstalledGamePaths(); + + // Create the config.ini file. + public static native void CreateConfigFile(); + + public static native int DefaultCPUCore(); + + /** + * Begins emulation. + */ + public static native void Run(String path); + + public static native String[] GetTextureFilterNames(); + + /** + * Begins emulation from the specified savestate. + */ + public static native void Run(String path, String savestatePath, boolean deleteSavestate); + + // Surface Handling + public static native void SurfaceChanged(Surface surf); + + public static native void SurfaceDestroyed(); + + public static native void DoFrame(); + + /** + * Unpauses emulation from a paused state. + */ + public static native void UnPauseEmulation(); + + /** + * Pauses emulation. + */ + public static native void PauseEmulation(); + + /** + * Stops emulation. + */ + public static native void StopEmulation(); + + /** + * Returns true if emulation is running (or is paused). + */ + public static native boolean IsRunning(); + + /** + * Returns the performance stats for the current game + **/ + public static native double[] GetPerfStats(); + + /** + * Notifies the core emulation that the orientation has changed. + */ + public static native void NotifyOrientationChange(int layout_option, int rotation); + + /** + * Swaps the top and bottom screens. + */ + public static native void SwapScreens(boolean swap_screens, int rotation); + + public enum CoreError { + ErrorSystemFiles, + ErrorSavestate, + ErrorUnknown, + } + + private static boolean coreErrorAlertResult = false; + private static final Object coreErrorAlertLock = new Object(); + + public static class CoreErrorDialogFragment extends DialogFragment { + static CoreErrorDialogFragment newInstance(String title, String message) { + CoreErrorDialogFragment frag = new CoreErrorDialogFragment(); + Bundle args = new Bundle(); + args.putString("title", title); + args.putString("message", message); + frag.setArguments(args); + return frag; + } + + @NonNull + @Override + public Dialog onCreateDialog(Bundle savedInstanceState) { + final Activity emulationActivity = Objects.requireNonNull(getActivity()); + + final String title = Objects.requireNonNull(Objects.requireNonNull(getArguments()).getString("title")); + final String message = Objects.requireNonNull(Objects.requireNonNull(getArguments()).getString("message")); + + return new AlertDialog.Builder(emulationActivity) + .setTitle(title) + .setMessage(message) + .setPositiveButton(R.string.continue_button, (dialog, which) -> { + coreErrorAlertResult = true; + synchronized (coreErrorAlertLock) { + coreErrorAlertLock.notify(); + } + }) + .setNegativeButton(R.string.abort_button, (dialog, which) -> { + coreErrorAlertResult = false; + synchronized (coreErrorAlertLock) { + coreErrorAlertLock.notify(); + } + }).setOnDismissListener(dialog -> { + coreErrorAlertResult = true; + synchronized (coreErrorAlertLock) { + coreErrorAlertLock.notify(); + } + }).create(); + } + } + + private static void OnCoreErrorImpl(String title, String message) { + final EmulationActivity emulationActivity = sEmulationActivity.get(); + if (emulationActivity == null) { + Log.error("[NativeLibrary] EmulationActivity not present"); + return; + } + + CoreErrorDialogFragment fragment = CoreErrorDialogFragment.newInstance(title, message); + fragment.show(emulationActivity.getSupportFragmentManager(), "coreError"); + } + + /** + * Handles a core error. + * @return true: continue; false: abort + */ + public static boolean OnCoreError(CoreError error, String details) { + final EmulationActivity emulationActivity = sEmulationActivity.get(); + if (emulationActivity == null) { + Log.error("[NativeLibrary] EmulationActivity not present"); + return false; + } + + String title, message; + switch (error) { + case ErrorSystemFiles: { + title = emulationActivity.getString(R.string.system_archive_not_found); + message = emulationActivity.getString(R.string.system_archive_not_found_message, details.isEmpty() ? emulationActivity.getString(R.string.system_archive_general) : details); + break; + } + case ErrorSavestate: { + title = emulationActivity.getString(R.string.save_load_error); + message = details; + break; + } + case ErrorUnknown: { + title = emulationActivity.getString(R.string.fatal_error); + message = emulationActivity.getString(R.string.fatal_error_message); + break; + } + default: { + return true; + } + } + + // Show the AlertDialog on the main thread. + emulationActivity.runOnUiThread(() -> OnCoreErrorImpl(title, message)); + + // Wait for the lock to notify that it is complete. + synchronized (coreErrorAlertLock) { + try { + coreErrorAlertLock.wait(); + } catch (Exception ignored) { + } + } + + return coreErrorAlertResult; + } + + public static boolean isPortraitMode() { + return CitraApplication.getAppContext().getResources().getConfiguration().orientation == + Configuration.ORIENTATION_PORTRAIT; + } + + public static int landscapeScreenLayout() { + return EmulationMenuSettings.getLandscapeScreenLayout(); + } + + public static boolean displayAlertMsg(final String caption, final String text, + final boolean yesNo) { + Log.error("[NativeLibrary] Alert: " + text); + final EmulationActivity emulationActivity = sEmulationActivity.get(); + boolean result = false; + if (emulationActivity == null) { + Log.warning("[NativeLibrary] EmulationActivity is null, can't do panic alert."); + } else { + // Create object used for waiting. + final Object lock = new Object(); + AlertDialog.Builder builder = new AlertDialog.Builder(emulationActivity) + .setTitle(caption) + .setMessage(text); + + // If not yes/no dialog just have one button that dismisses modal, + // otherwise have a yes and no button that sets alertResult accordingly. + if (!yesNo) { + builder + .setCancelable(false) + .setPositiveButton(android.R.string.ok, (dialog, whichButton) -> + { + dialog.dismiss(); + synchronized (lock) { + lock.notify(); + } + }); + } else { + alertResult = false; + + builder + .setPositiveButton(android.R.string.yes, (dialog, whichButton) -> + { + alertResult = true; + dialog.dismiss(); + synchronized (lock) { + lock.notify(); + } + }) + .setNegativeButton(android.R.string.no, (dialog, whichButton) -> + { + alertResult = false; + dialog.dismiss(); + synchronized (lock) { + lock.notify(); + } + }); + } + + // Show the AlertDialog on the main thread. + emulationActivity.runOnUiThread(builder::show); + + // Wait for the lock to notify that it is complete. + synchronized (lock) { + try { + lock.wait(); + } catch (Exception e) { + } + } + + if (yesNo) + result = alertResult; + } + return result; + } + + public static void retryDisplayAlertPrompt() { + if (!alertPromptInProgress) { + return; + } + displayAlertPromptImpl(alertPromptCaption, alertPromptEditText.getText().toString(), alertPromptButtonConfig).show(); + } + + public static String displayAlertPrompt(String caption, String text, int buttonConfig) { + alertPromptCaption = caption; + alertPromptButtonConfig = buttonConfig; + alertPromptInProgress = true; + + // Show the AlertDialog on the main thread + sEmulationActivity.get().runOnUiThread(() -> displayAlertPromptImpl(alertPromptCaption, text, alertPromptButtonConfig).show()); + + // Wait for the lock to notify that it is complete + synchronized (alertPromptLock) { + try { + alertPromptLock.wait(); + } catch (Exception e) { + } + } + alertPromptInProgress = false; + + return alertPromptResult; + } + + public static AlertDialog.Builder displayAlertPromptImpl(String caption, String text, int buttonConfig) { + final EmulationActivity emulationActivity = sEmulationActivity.get(); + alertPromptResult = ""; + alertPromptButton = 0; + + FrameLayout.LayoutParams params = new FrameLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT); + params.leftMargin = params.rightMargin = CitraApplication.getAppContext().getResources().getDimensionPixelSize(R.dimen.dialog_margin); + + // Set up the input + alertPromptEditText = new EditText(CitraApplication.getAppContext()); + alertPromptEditText.setText(text); + alertPromptEditText.setSingleLine(); + alertPromptEditText.setLayoutParams(params); + + FrameLayout container = new FrameLayout(emulationActivity); + container.addView(alertPromptEditText); + + AlertDialog.Builder builder = new AlertDialog.Builder(emulationActivity) + .setTitle(caption) + .setView(container) + .setPositiveButton(android.R.string.ok, (dialogInterface, i) -> + { + alertPromptButton = buttonConfig; + alertPromptResult = alertPromptEditText.getText().toString(); + synchronized (alertPromptLock) { + alertPromptLock.notifyAll(); + } + }) + .setOnDismissListener(dialogInterface -> + { + alertPromptResult = ""; + synchronized (alertPromptLock) { + alertPromptLock.notifyAll(); + } + }); + + if (buttonConfig > 0) { + builder.setNegativeButton(android.R.string.cancel, (dialogInterface, i) -> + { + alertPromptResult = ""; + synchronized (alertPromptLock) { + alertPromptLock.notifyAll(); + } + }); + } + + return builder; + } + + public static int alertPromptButton() { + return alertPromptButton; + } + + public static void exitEmulationActivity(int resultCode) { + final int Success = 0; + final int ErrorNotInitialized = 1; + final int ErrorGetLoader = 2; + final int ErrorSystemMode = 3; + final int ErrorLoader = 4; + final int ErrorLoader_ErrorEncrypted = 5; + final int ErrorLoader_ErrorInvalidFormat = 6; + final int ErrorSystemFiles = 7; + final int ErrorVideoCore = 8; + final int ErrorVideoCore_ErrorGenericDrivers = 9; + final int ErrorVideoCore_ErrorBelowGL33 = 10; + final int ShutdownRequested = 11; + final int ErrorUnknown = 12; + + final EmulationActivity emulationActivity = sEmulationActivity.get(); + if (emulationActivity == null) { + Log.warning("[NativeLibrary] EmulationActivity is null, can't exit."); + return; + } + + int captionId = R.string.loader_error_invalid_format; + if (resultCode == ErrorLoader_ErrorEncrypted) { + captionId = R.string.loader_error_encrypted; + } + + AlertDialog.Builder builder = new AlertDialog.Builder(emulationActivity) + .setTitle(captionId) + .setMessage(Html.fromHtml("Please follow the guides to redump your game cartidges or installed titles.", Html.FROM_HTML_MODE_LEGACY)) + .setPositiveButton(android.R.string.ok, (dialog, whichButton) -> emulationActivity.finish()) + .setOnDismissListener(dialogInterface -> emulationActivity.finish()); + emulationActivity.runOnUiThread(() -> { + AlertDialog alert = builder.create(); + alert.show(); + ((TextView) alert.findViewById(android.R.id.message)).setMovementMethod(LinkMovementMethod.getInstance()); + }); + } + + public static void setEmulationActivity(EmulationActivity emulationActivity) { + Log.verbose("[NativeLibrary] Registering EmulationActivity."); + sEmulationActivity = new WeakReference<>(emulationActivity); + } + + public static void clearEmulationActivity() { + Log.verbose("[NativeLibrary] Unregistering EmulationActivity."); + + sEmulationActivity.clear(); + } + + private static final Object cameraPermissionLock = new Object(); + private static boolean cameraPermissionGranted = false; + public static final int REQUEST_CODE_NATIVE_CAMERA = 800; + + public static boolean RequestCameraPermission() { + final EmulationActivity emulationActivity = sEmulationActivity.get(); + if (emulationActivity == null) { + Log.error("[NativeLibrary] EmulationActivity not present"); + return false; + } + if (ContextCompat.checkSelfPermission(emulationActivity, CAMERA) == PackageManager.PERMISSION_GRANTED) { + // Permission already granted + return true; + } + emulationActivity.requestPermissions(new String[]{CAMERA}, REQUEST_CODE_NATIVE_CAMERA); + + // Wait until result is returned + synchronized (cameraPermissionLock) { + try { + cameraPermissionLock.wait(); + } catch (InterruptedException ignored) { + } + } + return cameraPermissionGranted; + } + + public static void CameraPermissionResult(boolean granted) { + cameraPermissionGranted = granted; + synchronized (cameraPermissionLock) { + cameraPermissionLock.notify(); + } + } + + private static final Object micPermissionLock = new Object(); + private static boolean micPermissionGranted = false; + public static final int REQUEST_CODE_NATIVE_MIC = 900; + + public static boolean RequestMicPermission() { + final EmulationActivity emulationActivity = sEmulationActivity.get(); + if (emulationActivity == null) { + Log.error("[NativeLibrary] EmulationActivity not present"); + return false; + } + if (ContextCompat.checkSelfPermission(emulationActivity, RECORD_AUDIO) == PackageManager.PERMISSION_GRANTED) { + // Permission already granted + return true; + } + emulationActivity.requestPermissions(new String[]{RECORD_AUDIO}, REQUEST_CODE_NATIVE_MIC); + + // Wait until result is returned + synchronized (micPermissionLock) { + try { + micPermissionLock.wait(); + } catch (InterruptedException ignored) { + } + } + return micPermissionGranted; + } + + public static void MicPermissionResult(boolean granted) { + micPermissionGranted = granted; + synchronized (micPermissionLock) { + micPermissionLock.notify(); + } + } + + /// Notifies that the activity is now in foreground and camera devices can now be reloaded + public static native void ReloadCameraDevices(); + + public static native boolean LoadAmiibo(byte[] bytes); + + public static native void RemoveAmiibo(); + + public static native void InstallCIAS(String[] path); + + public static final int SAVESTATE_SLOT_COUNT = 10; + + public static final class SavestateInfo { + public int slot; + public Date time; + } + + @Nullable + public static native SavestateInfo[] GetSavestateInfo(); + + public static native void SaveState(int slot); + public static native void LoadState(int slot); + + /** + * Button type for use in onTouchEvent + */ + public static final class ButtonType { + public static final int BUTTON_A = 700; + public static final int BUTTON_B = 701; + public static final int BUTTON_X = 702; + public static final int BUTTON_Y = 703; + public static final int BUTTON_START = 704; + public static final int BUTTON_SELECT = 705; + public static final int BUTTON_HOME = 706; + public static final int BUTTON_ZL = 707; + public static final int BUTTON_ZR = 708; + public static final int DPAD_UP = 709; + public static final int DPAD_DOWN = 710; + public static final int DPAD_LEFT = 711; + public static final int DPAD_RIGHT = 712; + public static final int STICK_LEFT = 713; + public static final int STICK_LEFT_UP = 714; + public static final int STICK_LEFT_DOWN = 715; + public static final int STICK_LEFT_LEFT = 716; + public static final int STICK_LEFT_RIGHT = 717; + public static final int STICK_C = 718; + public static final int STICK_C_UP = 719; + public static final int STICK_C_DOWN = 720; + public static final int STICK_C_LEFT = 771; + public static final int STICK_C_RIGHT = 772; + public static final int TRIGGER_L = 773; + public static final int TRIGGER_R = 774; + public static final int DPAD = 780; + public static final int BUTTON_DEBUG = 781; + public static final int BUTTON_GPIO14 = 782; + } + + /** + * Button states + */ + public static final class ButtonState { + public static final int RELEASED = 0; + public static final int PRESSED = 1; + } +} diff --git a/src/android/app/src/main/java/org/citra/citra_emu/activities/CustomFilePickerActivity.java b/src/android/app/src/main/java/org/citra/citra_emu/activities/CustomFilePickerActivity.java new file mode 100644 index 000000000..3083286e2 --- /dev/null +++ b/src/android/app/src/main/java/org/citra/citra_emu/activities/CustomFilePickerActivity.java @@ -0,0 +1,38 @@ +package org.citra.citra_emu.activities; + +import android.content.Intent; +import android.os.Environment; + +import androidx.annotation.Nullable; + +import com.nononsenseapps.filepicker.AbstractFilePickerFragment; +import com.nononsenseapps.filepicker.FilePickerActivity; + +import org.citra.citra_emu.fragments.CustomFilePickerFragment; + +import java.io.File; + +public class CustomFilePickerActivity extends FilePickerActivity { + public static final String EXTRA_TITLE = "filepicker.intent.TITLE"; + public static final String EXTRA_EXTENSIONS = "filepicker.intent.EXTENSIONS"; + + @Override + protected AbstractFilePickerFragment getFragment( + @Nullable final String startPath, final int mode, final boolean allowMultiple, + final boolean allowCreateDir, final boolean allowExistingFile, + final boolean singleClick) { + CustomFilePickerFragment fragment = new CustomFilePickerFragment(); + // startPath is allowed to be null. In that case, default folder should be SD-card and not "/" + fragment.setArgs( + startPath != null ? startPath : Environment.getExternalStorageDirectory().getPath(), + mode, allowMultiple, allowCreateDir, allowExistingFile, singleClick); + + Intent intent = getIntent(); + int title = intent == null ? 0 : intent.getIntExtra(EXTRA_TITLE, 0); + fragment.setTitle(title); + String allowedExtensions = intent == null ? "*" : intent.getStringExtra(EXTRA_EXTENSIONS); + fragment.setAllowedExtensions(allowedExtensions); + + return fragment; + } +} diff --git a/src/android/app/src/main/java/org/citra/citra_emu/activities/EmulationActivity.java b/src/android/app/src/main/java/org/citra/citra_emu/activities/EmulationActivity.java new file mode 100644 index 000000000..adddcf110 --- /dev/null +++ b/src/android/app/src/main/java/org/citra/citra_emu/activities/EmulationActivity.java @@ -0,0 +1,788 @@ +package org.citra.citra_emu.activities; + +import android.app.Activity; +import android.content.Intent; +import android.content.SharedPreferences; +import android.content.pm.PackageManager; +import android.os.Bundle; +import android.os.Handler; +import android.preference.PreferenceManager; +import android.util.SparseIntArray; +import android.view.InputDevice; +import android.view.KeyEvent; +import android.view.LayoutInflater; +import android.view.Menu; +import android.view.MenuItem; +import android.view.MotionEvent; +import android.view.SubMenu; +import android.view.View; +import android.widget.CheckBox; +import android.widget.SeekBar; +import android.widget.TextView; + +import androidx.annotation.IntDef; +import androidx.annotation.NonNull; +import androidx.appcompat.app.AlertDialog; +import androidx.appcompat.app.AppCompatActivity; +import androidx.core.app.NotificationManagerCompat; +import androidx.fragment.app.FragmentActivity; + +import org.citra.citra_emu.CitraApplication; +import org.citra.citra_emu.NativeLibrary; +import org.citra.citra_emu.R; +import org.citra.citra_emu.features.settings.model.view.InputBindingSetting; +import org.citra.citra_emu.features.settings.ui.SettingsActivity; +import org.citra.citra_emu.features.settings.utils.SettingsFile; +import org.citra.citra_emu.camera.StillImageCameraHelper; +import org.citra.citra_emu.fragments.EmulationFragment; +import org.citra.citra_emu.ui.main.MainActivity; +import org.citra.citra_emu.utils.ControllerMappingHelper; +import org.citra.citra_emu.utils.EmulationMenuSettings; +import org.citra.citra_emu.utils.FileBrowserHelper; +import org.citra.citra_emu.utils.FileUtil; +import org.citra.citra_emu.utils.ForegroundService; + +import java.io.File; +import java.io.IOException; +import java.lang.annotation.Retention; +import java.util.Collections; +import java.util.List; + +import static android.Manifest.permission.CAMERA; +import static android.Manifest.permission.RECORD_AUDIO; +import static java.lang.annotation.RetentionPolicy.SOURCE; + +public final class EmulationActivity extends AppCompatActivity { + public static final String EXTRA_SELECTED_GAME = "SelectedGame"; + public static final String EXTRA_SELECTED_TITLE = "SelectedTitle"; + public static final int MENU_ACTION_EDIT_CONTROLS_PLACEMENT = 0; + public static final int MENU_ACTION_TOGGLE_CONTROLS = 1; + public static final int MENU_ACTION_ADJUST_SCALE = 2; + public static final int MENU_ACTION_EXIT = 3; + public static final int MENU_ACTION_SHOW_FPS = 4; + public static final int MENU_ACTION_SCREEN_LAYOUT_LANDSCAPE = 5; + public static final int MENU_ACTION_SCREEN_LAYOUT_PORTRAIT = 6; + public static final int MENU_ACTION_SCREEN_LAYOUT_SINGLE = 7; + public static final int MENU_ACTION_SCREEN_LAYOUT_SIDEBYSIDE = 8; + public static final int MENU_ACTION_SWAP_SCREENS = 9; + public static final int MENU_ACTION_RESET_OVERLAY = 10; + public static final int MENU_ACTION_SHOW_OVERLAY = 11; + public static final int MENU_ACTION_OPEN_SETTINGS = 12; + public static final int MENU_ACTION_LOAD_AMIIBO = 13; + public static final int MENU_ACTION_REMOVE_AMIIBO = 14; + public static final int MENU_ACTION_JOYSTICK_REL_CENTER = 15; + public static final int MENU_ACTION_DPAD_SLIDE_ENABLE = 16; + + public static final int REQUEST_SELECT_AMIIBO = 2; + private static final int EMULATION_RUNNING_NOTIFICATION = 0x1000; + private static SparseIntArray buttonsActionsMap = new SparseIntArray(); + + static { + buttonsActionsMap.append(R.id.menu_emulation_edit_layout, + EmulationActivity.MENU_ACTION_EDIT_CONTROLS_PLACEMENT); + buttonsActionsMap.append(R.id.menu_emulation_toggle_controls, + EmulationActivity.MENU_ACTION_TOGGLE_CONTROLS); + buttonsActionsMap + .append(R.id.menu_emulation_adjust_scale, EmulationActivity.MENU_ACTION_ADJUST_SCALE); + buttonsActionsMap.append(R.id.menu_emulation_show_fps, + EmulationActivity.MENU_ACTION_SHOW_FPS); + buttonsActionsMap.append(R.id.menu_screen_layout_landscape, + EmulationActivity.MENU_ACTION_SCREEN_LAYOUT_LANDSCAPE); + buttonsActionsMap.append(R.id.menu_screen_layout_portrait, + EmulationActivity.MENU_ACTION_SCREEN_LAYOUT_PORTRAIT); + buttonsActionsMap.append(R.id.menu_screen_layout_single, + EmulationActivity.MENU_ACTION_SCREEN_LAYOUT_SINGLE); + buttonsActionsMap.append(R.id.menu_screen_layout_sidebyside, + EmulationActivity.MENU_ACTION_SCREEN_LAYOUT_SIDEBYSIDE); + buttonsActionsMap.append(R.id.menu_emulation_swap_screens, + EmulationActivity.MENU_ACTION_SWAP_SCREENS); + buttonsActionsMap + .append(R.id.menu_emulation_reset_overlay, EmulationActivity.MENU_ACTION_RESET_OVERLAY); + buttonsActionsMap + .append(R.id.menu_emulation_show_overlay, EmulationActivity.MENU_ACTION_SHOW_OVERLAY); + buttonsActionsMap + .append(R.id.menu_emulation_open_settings, EmulationActivity.MENU_ACTION_OPEN_SETTINGS); + buttonsActionsMap + .append(R.id.menu_emulation_amiibo_load, EmulationActivity.MENU_ACTION_LOAD_AMIIBO); + buttonsActionsMap + .append(R.id.menu_emulation_amiibo_remove, EmulationActivity.MENU_ACTION_REMOVE_AMIIBO); + buttonsActionsMap.append(R.id.menu_emulation_joystick_rel_center, + EmulationActivity.MENU_ACTION_JOYSTICK_REL_CENTER); + buttonsActionsMap.append(R.id.menu_emulation_dpad_slide_enable, + EmulationActivity.MENU_ACTION_DPAD_SLIDE_ENABLE); + } + + private View mDecorView; + private EmulationFragment mEmulationFragment; + private SharedPreferences mPreferences; + private ControllerMappingHelper mControllerMappingHelper; + private Intent foregroundService; + private boolean activityRecreated; + private String mSelectedTitle; + private String mPath; + + public static void launch(FragmentActivity activity, String path, String title) { + Intent launcher = new Intent(activity, EmulationActivity.class); + + launcher.putExtra(EXTRA_SELECTED_GAME, path); + launcher.putExtra(EXTRA_SELECTED_TITLE, title); + activity.startActivity(launcher); + } + + public static void tryDismissRunningNotification(Activity activity) { + NotificationManagerCompat.from(activity).cancel(EMULATION_RUNNING_NOTIFICATION); + } + + @Override + protected void onDestroy() { + stopService(foregroundService); + super.onDestroy(); + } + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + + if (savedInstanceState == null) { + // Get params we were passed + Intent gameToEmulate = getIntent(); + mPath = gameToEmulate.getStringExtra(EXTRA_SELECTED_GAME); + mSelectedTitle = gameToEmulate.getStringExtra(EXTRA_SELECTED_TITLE); + activityRecreated = false; + } else { + activityRecreated = true; + restoreState(savedInstanceState); + } + + mControllerMappingHelper = new ControllerMappingHelper(); + + // Get a handle to the Window containing the UI. + mDecorView = getWindow().getDecorView(); + mDecorView.setOnSystemUiVisibilityChangeListener(visibility -> + { + if ((visibility & View.SYSTEM_UI_FLAG_FULLSCREEN) == 0) { + // Go back to immersive fullscreen mode in 3s + Handler handler = new Handler(getMainLooper()); + handler.postDelayed(this::enableFullscreenImmersive, 3000 /* 3s */); + } + }); + // Set these options now so that the SurfaceView the game renders into is the right size. + enableFullscreenImmersive(); + + setTheme(R.style.CitraEmulationBase); + + setContentView(R.layout.activity_emulation); + + // Find or create the EmulationFragment + mEmulationFragment = (EmulationFragment) getSupportFragmentManager() + .findFragmentById(R.id.frame_emulation_fragment); + if (mEmulationFragment == null) { + mEmulationFragment = EmulationFragment.newInstance(mPath); + getSupportFragmentManager().beginTransaction() + .add(R.id.frame_emulation_fragment, mEmulationFragment) + .commit(); + } + + setTitle(mSelectedTitle); + + mPreferences = PreferenceManager.getDefaultSharedPreferences(this); + + // Start a foreground service to prevent the app from getting killed in the background + foregroundService = new Intent(EmulationActivity.this, ForegroundService.class); + startForegroundService(foregroundService); + + // Override Citra core INI with the one set by our in game menu + NativeLibrary.SwapScreens(EmulationMenuSettings.getSwapScreens(), + getWindowManager().getDefaultDisplay().getRotation()); + } + + @Override + protected void onSaveInstanceState(@NonNull Bundle outState) { + outState.putString(EXTRA_SELECTED_GAME, mPath); + outState.putString(EXTRA_SELECTED_TITLE, mSelectedTitle); + super.onSaveInstanceState(outState); + } + + protected void restoreState(Bundle savedInstanceState) { + mPath = savedInstanceState.getString(EXTRA_SELECTED_GAME); + mSelectedTitle = savedInstanceState.getString(EXTRA_SELECTED_TITLE); + + // If an alert prompt was in progress when state was restored, retry displaying it + NativeLibrary.retryDisplayAlertPrompt(); + } + + @Override + public void onRestart() { + super.onRestart(); + NativeLibrary.ReloadCameraDevices(); + } + + @Override + public void onBackPressed() { + NativeLibrary.PauseEmulation(); + new AlertDialog.Builder(this) + .setTitle(R.string.emulation_close_game) + .setMessage(R.string.emulation_close_game_message) + .setPositiveButton(android.R.string.yes, (dialogInterface, i) -> + { + mEmulationFragment.stopEmulation(); + finish(); + }) + .setNegativeButton(android.R.string.cancel, (dialogInterface, i) -> + NativeLibrary.UnPauseEmulation()) + .setOnCancelListener(dialogInterface -> + NativeLibrary.UnPauseEmulation()) + .create() + .show(); + } + + @Override + public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) { + switch (requestCode) { + case NativeLibrary.REQUEST_CODE_NATIVE_CAMERA: + if (grantResults[0] != PackageManager.PERMISSION_GRANTED && + shouldShowRequestPermissionRationale(CAMERA)) { + new AlertDialog.Builder(this) + .setTitle(R.string.camera) + .setMessage(R.string.camera_permission_needed) + .setPositiveButton(android.R.string.ok, null) + .show(); + } + NativeLibrary.CameraPermissionResult(grantResults[0] == PackageManager.PERMISSION_GRANTED); + break; + case NativeLibrary.REQUEST_CODE_NATIVE_MIC: + if (grantResults[0] != PackageManager.PERMISSION_GRANTED && + shouldShowRequestPermissionRationale(RECORD_AUDIO)) { + new AlertDialog.Builder(this) + .setTitle(R.string.microphone) + .setMessage(R.string.microphone_permission_needed) + .setPositiveButton(android.R.string.ok, null) + .show(); + } + NativeLibrary.MicPermissionResult(grantResults[0] == PackageManager.PERMISSION_GRANTED); + break; + default: + super.onRequestPermissionsResult(requestCode, permissions, grantResults); + break; + } + } + + private void enableFullscreenImmersive() { + // It would be nice to use IMMERSIVE_STICKY, but that doesn't show the toolbar. + mDecorView.setSystemUiVisibility( + View.SYSTEM_UI_FLAG_LAYOUT_STABLE | + View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION | + View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN | + View.SYSTEM_UI_FLAG_HIDE_NAVIGATION | + View.SYSTEM_UI_FLAG_FULLSCREEN | + View.SYSTEM_UI_FLAG_IMMERSIVE); + } + + @Override + public boolean onCreateOptionsMenu(Menu menu) { + // Inflate the menu; this adds items to the action bar if it is present. + getMenuInflater().inflate(R.menu.menu_emulation, menu); + + int layoutOptionMenuItem = R.id.menu_screen_layout_landscape; + switch (EmulationMenuSettings.getLandscapeScreenLayout()) { + case EmulationMenuSettings.LayoutOption_SingleScreen: + layoutOptionMenuItem = R.id.menu_screen_layout_single; + break; + case EmulationMenuSettings.LayoutOption_SideScreen: + layoutOptionMenuItem = R.id.menu_screen_layout_sidebyside; + break; + case EmulationMenuSettings.LayoutOption_MobilePortrait: + layoutOptionMenuItem = R.id.menu_screen_layout_portrait; + break; + } + + menu.findItem(layoutOptionMenuItem).setChecked(true); + menu.findItem(R.id.menu_emulation_joystick_rel_center).setChecked(EmulationMenuSettings.getJoystickRelCenter()); + menu.findItem(R.id.menu_emulation_dpad_slide_enable).setChecked(EmulationMenuSettings.getDpadSlideEnable()); + menu.findItem(R.id.menu_emulation_show_fps).setChecked(EmulationMenuSettings.getShowFps()); + menu.findItem(R.id.menu_emulation_swap_screens).setChecked(EmulationMenuSettings.getSwapScreens()); + menu.findItem(R.id.menu_emulation_show_overlay).setChecked(EmulationMenuSettings.getShowOverlay()); + + return true; + } + + private void DisplaySavestateWarning() { + SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(CitraApplication.getAppContext()); + if (preferences.getBoolean("savestateWarningShown", false)) { + return; + } + + LayoutInflater inflater = mEmulationFragment.requireActivity().getLayoutInflater(); + View view = inflater.inflate(R.layout.dialog_checkbox, null); + CheckBox checkBox = view.findViewById(R.id.checkBox); + + new AlertDialog.Builder(this) + .setTitle(R.string.savestate_warning_title) + .setMessage(R.string.savestate_warning_message) + .setView(view) + .setPositiveButton(android.R.string.ok, (dialog, which) -> { + preferences.edit().putBoolean("savestateWarningShown", checkBox.isChecked()).apply(); + }) + .show(); + } + + @Override + public boolean onPrepareOptionsMenu(Menu menu) { + super.onPrepareOptionsMenu(menu); + + final NativeLibrary.SavestateInfo[] savestates = NativeLibrary.GetSavestateInfo(); + if (savestates == null) { + menu.findItem(R.id.menu_emulation_save_state).setVisible(false); + menu.findItem(R.id.menu_emulation_load_state).setVisible(false); + return true; + } + menu.findItem(R.id.menu_emulation_save_state).setVisible(true); + menu.findItem(R.id.menu_emulation_load_state).setVisible(true); + + final SubMenu saveStateMenu = menu.findItem(R.id.menu_emulation_save_state).getSubMenu(); + final SubMenu loadStateMenu = menu.findItem(R.id.menu_emulation_load_state).getSubMenu(); + saveStateMenu.clear(); + loadStateMenu.clear(); + + // Update savestates information + for (int i = 0; i < NativeLibrary.SAVESTATE_SLOT_COUNT; ++i) { + final int slot = i + 1; + final String text = getString(R.string.emulation_empty_state_slot, slot); + saveStateMenu.add(text).setEnabled(true).setOnMenuItemClickListener((item) -> { + DisplaySavestateWarning(); + NativeLibrary.SaveState(slot); + return true; + }); + loadStateMenu.add(text).setEnabled(false).setOnMenuItemClickListener((item) -> { + NativeLibrary.LoadState(slot); + return true; + }); + } + for (final NativeLibrary.SavestateInfo info : savestates) { + final String text = getString(R.string.emulation_occupied_state_slot, info.slot, info.time); + saveStateMenu.getItem(info.slot - 1).setTitle(text); + loadStateMenu.getItem(info.slot - 1).setTitle(text).setEnabled(true); + } + return true; + } + + @SuppressWarnings("WrongConstant") + @Override + public boolean onOptionsItemSelected(MenuItem item) { + int action = buttonsActionsMap.get(item.getItemId(), -1); + + switch (action) { + // Edit the placement of the controls + case MENU_ACTION_EDIT_CONTROLS_PLACEMENT: + editControlsPlacement(); + break; + + // Enable/Disable specific buttons or the entire input overlay. + case MENU_ACTION_TOGGLE_CONTROLS: + toggleControls(); + break; + + // Adjust the scale of the overlay controls. + case MENU_ACTION_ADJUST_SCALE: + adjustScale(); + break; + + // Toggle the visibility of the Performance stats TextView + case MENU_ACTION_SHOW_FPS: { + final boolean isEnabled = !EmulationMenuSettings.getShowFps(); + EmulationMenuSettings.setShowFps(isEnabled); + item.setChecked(isEnabled); + + mEmulationFragment.updateShowFpsOverlay(); + break; + } + // Sets the screen layout to Landscape + case MENU_ACTION_SCREEN_LAYOUT_LANDSCAPE: + changeScreenOrientation(EmulationMenuSettings.LayoutOption_MobileLandscape, item); + break; + + // Sets the screen layout to Portrait + case MENU_ACTION_SCREEN_LAYOUT_PORTRAIT: + changeScreenOrientation(EmulationMenuSettings.LayoutOption_MobilePortrait, item); + break; + + // Sets the screen layout to Single + case MENU_ACTION_SCREEN_LAYOUT_SINGLE: + changeScreenOrientation(EmulationMenuSettings.LayoutOption_SingleScreen, item); + break; + + // Sets the screen layout to Side by Side + case MENU_ACTION_SCREEN_LAYOUT_SIDEBYSIDE: + changeScreenOrientation(EmulationMenuSettings.LayoutOption_SideScreen, item); + break; + + // Swap the top and bottom screen locations + case MENU_ACTION_SWAP_SCREENS: { + final boolean isEnabled = !EmulationMenuSettings.getSwapScreens(); + EmulationMenuSettings.setSwapScreens(isEnabled); + item.setChecked(isEnabled); + + NativeLibrary.SwapScreens(isEnabled, getWindowManager().getDefaultDisplay() + .getRotation()); + break; + } + + // Reset overlay placement + case MENU_ACTION_RESET_OVERLAY: + resetOverlay(); + break; + + // Show or hide overlay + case MENU_ACTION_SHOW_OVERLAY: { + final boolean isEnabled = !EmulationMenuSettings.getShowOverlay(); + EmulationMenuSettings.setShowOverlay(isEnabled); + item.setChecked(isEnabled); + + mEmulationFragment.refreshInputOverlay(); + break; + } + + case MENU_ACTION_EXIT: + mEmulationFragment.stopEmulation(); + finish(); + break; + + case MENU_ACTION_OPEN_SETTINGS: + SettingsActivity.launch(this, SettingsFile.FILE_NAME_CONFIG, ""); + break; + + case MENU_ACTION_LOAD_AMIIBO: + FileBrowserHelper.openFilePicker(this, REQUEST_SELECT_AMIIBO, + R.string.select_amiibo, + Collections.singletonList("bin"), false); + break; + + case MENU_ACTION_REMOVE_AMIIBO: + RemoveAmiibo(); + break; + + case MENU_ACTION_JOYSTICK_REL_CENTER: + final boolean isJoystickRelCenterEnabled = !EmulationMenuSettings.getJoystickRelCenter(); + EmulationMenuSettings.setJoystickRelCenter(isJoystickRelCenterEnabled); + item.setChecked(isJoystickRelCenterEnabled); + break; + case MENU_ACTION_DPAD_SLIDE_ENABLE: + final boolean isDpadSlideEnabled = !EmulationMenuSettings.getDpadSlideEnable(); + EmulationMenuSettings.setDpadSlideEnable(isDpadSlideEnabled); + item.setChecked(isDpadSlideEnabled); + break; + } + + return true; + } + + private void changeScreenOrientation(int layoutOption, MenuItem item) { + item.setChecked(true); + NativeLibrary.NotifyOrientationChange(layoutOption, getWindowManager().getDefaultDisplay() + .getRotation()); + EmulationMenuSettings.setLandscapeScreenLayout(layoutOption); + } + + private void editControlsPlacement() { + if (mEmulationFragment.isConfiguringControls()) { + mEmulationFragment.stopConfiguringControls(); + } else { + mEmulationFragment.startConfiguringControls(); + } + } + + // Gets button presses + @Override + public boolean dispatchKeyEvent(KeyEvent event) { + int action; + int button = mPreferences.getInt(InputBindingSetting.getInputButtonKey(event.getKeyCode()), event.getKeyCode()); + + switch (event.getAction()) { + case KeyEvent.ACTION_DOWN: + // Handling the case where the back button is pressed. + if (event.getKeyCode() == KeyEvent.KEYCODE_BACK) { + onBackPressed(); + return true; + } + + // Normal key events. + action = NativeLibrary.ButtonState.PRESSED; + break; + case KeyEvent.ACTION_UP: + action = NativeLibrary.ButtonState.RELEASED; + break; + default: + return false; + } + InputDevice input = event.getDevice(); + + if (input == null) { + // Controller was disconnected + return false; + } + + return NativeLibrary.onGamePadEvent(input.getDescriptor(), button, action); + } + + @Override + protected void onActivityResult(int requestCode, int resultCode, Intent result) { + super.onActivityResult(requestCode, resultCode, result); + switch (requestCode) { + case StillImageCameraHelper.REQUEST_CAMERA_FILE_PICKER: + StillImageCameraHelper.OnFilePickerResult(resultCode == RESULT_OK ? result : null); + break; + case REQUEST_SELECT_AMIIBO: + // If the user picked a file, as opposed to just backing out. + if (resultCode == MainActivity.RESULT_OK) { + String[] selectedFiles = FileBrowserHelper.getSelectedFiles(result); + if (selectedFiles == null) + return; + + onAmiiboSelected(selectedFiles[0]); + } + break; + } + } + + private void onAmiiboSelected(String selectedFile) { + File file = new File(selectedFile); + boolean success = false; + try { + byte[] bytes = FileUtil.getBytesFromFile(file); + success = NativeLibrary.LoadAmiibo(bytes); + } catch (IOException e) { + e.printStackTrace(); + } + + if (!success) { + new AlertDialog.Builder(this) + .setTitle(R.string.amiibo_load_error) + .setMessage(R.string.amiibo_load_error_message) + .setPositiveButton(android.R.string.ok, null) + .create() + .show(); + } + } + + private void RemoveAmiibo() { + NativeLibrary.RemoveAmiibo(); + } + + private void toggleControls() { + final SharedPreferences.Editor editor = mPreferences.edit(); + boolean[] enabledButtons = new boolean[14]; + AlertDialog.Builder builder = new AlertDialog.Builder(this); + builder.setTitle(R.string.emulation_toggle_controls); + + for (int i = 0; i < enabledButtons.length; i++) { + // Buttons that are disabled by default + boolean defaultValue = true; + switch (i) { + case 6: // ZL + case 7: // ZR + case 12: // C-stick + defaultValue = false; + break; + } + + enabledButtons[i] = mPreferences.getBoolean("buttonToggle" + i, defaultValue); + } + builder.setMultiChoiceItems(R.array.n3dsButtons, enabledButtons, + (dialog, indexSelected, isChecked) -> editor + .putBoolean("buttonToggle" + indexSelected, isChecked)); + builder.setPositiveButton(android.R.string.ok, (dialogInterface, i) -> + { + editor.apply(); + + mEmulationFragment.refreshInputOverlay(); + }); + + AlertDialog alertDialog = builder.create(); + alertDialog.show(); + } + + private void adjustScale() { + LayoutInflater inflater = LayoutInflater.from(this); + View view = inflater.inflate(R.layout.dialog_seekbar, null); + + final SeekBar seekbar = view.findViewById(R.id.seekbar); + final TextView value = view.findViewById(R.id.text_value); + final TextView units = view.findViewById(R.id.text_units); + + seekbar.setMax(150); + seekbar.setProgress(mPreferences.getInt("controlScale", 50)); + seekbar.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() { + public void onStartTrackingTouch(SeekBar seekBar) { + } + + public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) { + value.setText(String.valueOf(progress + 50)); + } + + public void onStopTrackingTouch(SeekBar seekBar) { + setControlScale(seekbar.getProgress()); + } + }); + + value.setText(String.valueOf(seekbar.getProgress() + 50)); + units.setText("%"); + + AlertDialog.Builder builder = new AlertDialog.Builder(this); + builder.setTitle(R.string.emulation_control_scale); + builder.setView(view); + final int previousProgress = seekbar.getProgress(); + builder.setNegativeButton(android.R.string.cancel, (dialogInterface, i) -> { + setControlScale(previousProgress); + }); + builder.setPositiveButton(android.R.string.ok, (dialogInterface, i) -> + { + setControlScale(seekbar.getProgress()); + }); + builder.setNeutralButton(R.string.slider_default, (dialogInterface, i) -> { + setControlScale(50); + }); + + AlertDialog alertDialog = builder.create(); + alertDialog.show(); + } + + private void setControlScale(int scale) { + SharedPreferences.Editor editor = mPreferences.edit(); + editor.putInt("controlScale", scale); + editor.apply(); + mEmulationFragment.refreshInputOverlay(); + } + + private void resetOverlay() { + new AlertDialog.Builder(this) + .setTitle(getString(R.string.emulation_touch_overlay_reset)) + .setPositiveButton(android.R.string.yes, (dialogInterface, i) -> mEmulationFragment.resetInputOverlay()) + .setNegativeButton(android.R.string.cancel, (dialogInterface, i) -> { + }) + .create() + .show(); + } + + @Override + public boolean dispatchGenericMotionEvent(MotionEvent event) { + if (((event.getSource() & InputDevice.SOURCE_CLASS_JOYSTICK) == 0)) { + return super.dispatchGenericMotionEvent(event); + } + + // Don't attempt to do anything if we are disconnecting a device. + if (event.getActionMasked() == MotionEvent.ACTION_CANCEL) { + return true; + } + + InputDevice input = event.getDevice(); + List motions = input.getMotionRanges(); + + float[] axisValuesCirclePad = {0.0f, 0.0f}; + float[] axisValuesCStick = {0.0f, 0.0f}; + float[] axisValuesDPad = {0.0f, 0.0f}; + boolean isTriggerPressedLMapped = false; + boolean isTriggerPressedRMapped = false; + boolean isTriggerPressedZLMapped = false; + boolean isTriggerPressedZRMapped = false; + boolean isTriggerPressedL = false; + boolean isTriggerPressedR = false; + boolean isTriggerPressedZL = false; + boolean isTriggerPressedZR = false; + + for (InputDevice.MotionRange range : motions) { + int axis = range.getAxis(); + float origValue = event.getAxisValue(axis); + float value = mControllerMappingHelper.scaleAxis(input, axis, origValue); + int nextMapping = mPreferences.getInt(InputBindingSetting.getInputAxisButtonKey(axis), -1); + int guestOrientation = mPreferences.getInt(InputBindingSetting.getInputAxisOrientationKey(axis), -1); + + if (nextMapping == -1 || guestOrientation == -1) { + // Axis is unmapped + continue; + } + + if ((value > 0.f && value < 0.1f) || (value < 0.f && value > -0.1f)) { + // Skip joystick wobble + value = 0.f; + } + + if (nextMapping == NativeLibrary.ButtonType.STICK_LEFT) { + axisValuesCirclePad[guestOrientation] = value; + } else if (nextMapping == NativeLibrary.ButtonType.STICK_C) { + axisValuesCStick[guestOrientation] = value; + } else if (nextMapping == NativeLibrary.ButtonType.DPAD) { + axisValuesDPad[guestOrientation] = value; + } else if (nextMapping == NativeLibrary.ButtonType.TRIGGER_L) { + isTriggerPressedLMapped = true; + isTriggerPressedL = value != 0.f; + } else if (nextMapping == NativeLibrary.ButtonType.TRIGGER_R) { + isTriggerPressedRMapped = true; + isTriggerPressedR = value != 0.f; + } else if (nextMapping == NativeLibrary.ButtonType.BUTTON_ZL) { + isTriggerPressedZLMapped = true; + isTriggerPressedZL = value != 0.f; + } else if (nextMapping == NativeLibrary.ButtonType.BUTTON_ZR) { + isTriggerPressedZRMapped = true; + isTriggerPressedZR = value != 0.f; + } + } + + // Circle-Pad and C-Stick status + NativeLibrary.onGamePadMoveEvent(input.getDescriptor(), NativeLibrary.ButtonType.STICK_LEFT, axisValuesCirclePad[0], axisValuesCirclePad[1]); + NativeLibrary.onGamePadMoveEvent(input.getDescriptor(), NativeLibrary.ButtonType.STICK_C, axisValuesCStick[0], axisValuesCStick[1]); + + // Triggers L/R and ZL/ZR + if (isTriggerPressedLMapped) { + NativeLibrary.onGamePadEvent(NativeLibrary.TouchScreenDevice, NativeLibrary.ButtonType.TRIGGER_L, isTriggerPressedL ? NativeLibrary.ButtonState.PRESSED : NativeLibrary.ButtonState.RELEASED); + } + if (isTriggerPressedRMapped) { + NativeLibrary.onGamePadEvent(NativeLibrary.TouchScreenDevice, NativeLibrary.ButtonType.TRIGGER_R, isTriggerPressedR ? NativeLibrary.ButtonState.PRESSED : NativeLibrary.ButtonState.RELEASED); + } + if (isTriggerPressedZLMapped) { + NativeLibrary.onGamePadEvent(NativeLibrary.TouchScreenDevice, NativeLibrary.ButtonType.BUTTON_ZL, isTriggerPressedZL ? NativeLibrary.ButtonState.PRESSED : NativeLibrary.ButtonState.RELEASED); + } + if (isTriggerPressedZRMapped) { + NativeLibrary.onGamePadEvent(NativeLibrary.TouchScreenDevice, NativeLibrary.ButtonType.BUTTON_ZR, isTriggerPressedZR ? NativeLibrary.ButtonState.PRESSED : NativeLibrary.ButtonState.RELEASED); + } + + // Work-around to allow D-pad axis to be bound to emulated buttons + if (axisValuesDPad[0] == 0.f) { + NativeLibrary.onGamePadEvent(NativeLibrary.TouchScreenDevice, NativeLibrary.ButtonType.DPAD_LEFT, NativeLibrary.ButtonState.RELEASED); + NativeLibrary.onGamePadEvent(NativeLibrary.TouchScreenDevice, NativeLibrary.ButtonType.DPAD_RIGHT, NativeLibrary.ButtonState.RELEASED); + } + if (axisValuesDPad[0] < 0.f) { + NativeLibrary.onGamePadEvent(NativeLibrary.TouchScreenDevice, NativeLibrary.ButtonType.DPAD_LEFT, NativeLibrary.ButtonState.PRESSED); + NativeLibrary.onGamePadEvent(NativeLibrary.TouchScreenDevice, NativeLibrary.ButtonType.DPAD_RIGHT, NativeLibrary.ButtonState.RELEASED); + } + if (axisValuesDPad[0] > 0.f) { + NativeLibrary.onGamePadEvent(NativeLibrary.TouchScreenDevice, NativeLibrary.ButtonType.DPAD_LEFT, NativeLibrary.ButtonState.RELEASED); + NativeLibrary.onGamePadEvent(NativeLibrary.TouchScreenDevice, NativeLibrary.ButtonType.DPAD_RIGHT, NativeLibrary.ButtonState.PRESSED); + } + if (axisValuesDPad[1] == 0.f) { + NativeLibrary.onGamePadEvent(NativeLibrary.TouchScreenDevice, NativeLibrary.ButtonType.DPAD_UP, NativeLibrary.ButtonState.RELEASED); + NativeLibrary.onGamePadEvent(NativeLibrary.TouchScreenDevice, NativeLibrary.ButtonType.DPAD_DOWN, NativeLibrary.ButtonState.RELEASED); + } + if (axisValuesDPad[1] < 0.f) { + NativeLibrary.onGamePadEvent(NativeLibrary.TouchScreenDevice, NativeLibrary.ButtonType.DPAD_UP, NativeLibrary.ButtonState.PRESSED); + NativeLibrary.onGamePadEvent(NativeLibrary.TouchScreenDevice, NativeLibrary.ButtonType.DPAD_DOWN, NativeLibrary.ButtonState.RELEASED); + } + if (axisValuesDPad[1] > 0.f) { + NativeLibrary.onGamePadEvent(NativeLibrary.TouchScreenDevice, NativeLibrary.ButtonType.DPAD_UP, NativeLibrary.ButtonState.RELEASED); + NativeLibrary.onGamePadEvent(NativeLibrary.TouchScreenDevice, NativeLibrary.ButtonType.DPAD_DOWN, NativeLibrary.ButtonState.PRESSED); + } + + return true; + } + + public boolean isActivityRecreated() { + return activityRecreated; + } + + @Retention(SOURCE) + @IntDef({MENU_ACTION_EDIT_CONTROLS_PLACEMENT, MENU_ACTION_TOGGLE_CONTROLS, MENU_ACTION_ADJUST_SCALE, + MENU_ACTION_EXIT, MENU_ACTION_SHOW_FPS, MENU_ACTION_SCREEN_LAYOUT_LANDSCAPE, + MENU_ACTION_SCREEN_LAYOUT_PORTRAIT, MENU_ACTION_SCREEN_LAYOUT_SINGLE, MENU_ACTION_SCREEN_LAYOUT_SIDEBYSIDE, + MENU_ACTION_SWAP_SCREENS, MENU_ACTION_RESET_OVERLAY, MENU_ACTION_SHOW_OVERLAY, MENU_ACTION_OPEN_SETTINGS}) + public @interface MenuAction { + } +} diff --git a/src/android/app/src/main/java/org/citra/citra_emu/adapters/GameAdapter.java b/src/android/app/src/main/java/org/citra/citra_emu/adapters/GameAdapter.java new file mode 100644 index 000000000..bc791638a --- /dev/null +++ b/src/android/app/src/main/java/org/citra/citra_emu/adapters/GameAdapter.java @@ -0,0 +1,247 @@ +package org.citra.citra_emu.adapters; + +import android.database.Cursor; +import android.database.DataSetObserver; +import android.graphics.Rect; +import android.graphics.drawable.Drawable; +import android.os.Build; +import android.os.SystemClock; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; + +import androidx.annotation.NonNull; +import androidx.annotation.RequiresApi; +import androidx.core.content.ContextCompat; +import androidx.fragment.app.FragmentActivity; +import androidx.recyclerview.widget.RecyclerView; + +import org.citra.citra_emu.R; +import org.citra.citra_emu.activities.EmulationActivity; +import org.citra.citra_emu.model.GameDatabase; +import org.citra.citra_emu.ui.DividerItemDecoration; +import org.citra.citra_emu.utils.Log; +import org.citra.citra_emu.utils.PicassoUtils; +import org.citra.citra_emu.viewholders.GameViewHolder; + +import java.nio.file.Path; +import java.nio.file.Paths; +import java.util.stream.Stream; + +/** + * This adapter gets its information from a database Cursor. This fact, paired with the usage of + * ContentProviders and Loaders, allows for efficient display of a limited view into a (possibly) + * large dataset. + */ +public final class GameAdapter extends RecyclerView.Adapter implements + View.OnClickListener { + private Cursor mCursor; + private GameDataSetObserver mObserver; + + private boolean mDatasetValid; + private long mLastClickTime = 0; + + /** + * Initializes the adapter's observer, which watches for changes to the dataset. The adapter will + * display no data until a Cursor is supplied by a CursorLoader. + */ + public GameAdapter() { + mDatasetValid = false; + mObserver = new GameDataSetObserver(); + } + + /** + * Called by the LayoutManager when it is necessary to create a new view. + * + * @param parent The RecyclerView (I think?) the created view will be thrown into. + * @param viewType Not used here, but useful when more than one type of child will be used in the RecyclerView. + * @return The created ViewHolder with references to all the child view's members. + */ + @Override + public GameViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { + // Create a new view. + View gameCard = LayoutInflater.from(parent.getContext()) + .inflate(R.layout.card_game, parent, false); + + gameCard.setOnClickListener(this); + + // Use that view to create a ViewHolder. + return new GameViewHolder(gameCard); + } + + /** + * Called by the LayoutManager when a new view is not necessary because we can recycle + * an existing one (for example, if a view just scrolled onto the screen from the bottom, we + * can use the view that just scrolled off the top instead of inflating a new one.) + * + * @param holder A ViewHolder representing the view we're recycling. + * @param position The position of the 'new' view in the dataset. + */ + @RequiresApi(api = Build.VERSION_CODES.O) + @Override + public void onBindViewHolder(@NonNull GameViewHolder holder, int position) { + if (mDatasetValid) { + if (mCursor.moveToPosition(position)) { + PicassoUtils.loadGameIcon(holder.imageIcon, + mCursor.getString(GameDatabase.GAME_COLUMN_PATH)); + + holder.textGameTitle.setText(mCursor.getString(GameDatabase.GAME_COLUMN_TITLE).replaceAll("[\\t\\n\\r]+", " ")); + holder.textCompany.setText(mCursor.getString(GameDatabase.GAME_COLUMN_COMPANY)); + + final Path gamePath = Paths.get(mCursor.getString(GameDatabase.GAME_COLUMN_PATH)); + holder.textFileName.setText(gamePath.getFileName().toString()); + + // TODO These shouldn't be necessary once the move to a DB-based model is complete. + holder.gameId = mCursor.getString(GameDatabase.GAME_COLUMN_GAME_ID); + holder.path = mCursor.getString(GameDatabase.GAME_COLUMN_PATH); + holder.title = mCursor.getString(GameDatabase.GAME_COLUMN_TITLE); + holder.description = mCursor.getString(GameDatabase.GAME_COLUMN_DESCRIPTION); + holder.regions = mCursor.getString(GameDatabase.GAME_COLUMN_REGIONS); + holder.company = mCursor.getString(GameDatabase.GAME_COLUMN_COMPANY); + + final int backgroundColorId = isValidGame(holder.path) ? R.color.card_view_background : R.color.card_view_disabled; + View itemView = holder.getItemView(); + itemView.setBackgroundColor(ContextCompat.getColor(itemView.getContext(), backgroundColorId)); + } else { + Log.error("[GameAdapter] Can't bind view; Cursor is not valid."); + } + } else { + Log.error("[GameAdapter] Can't bind view; dataset is not valid."); + } + } + + /** + * Called by the LayoutManager to find out how much data we have. + * + * @return Size of the dataset. + */ + @Override + public int getItemCount() { + if (mDatasetValid && mCursor != null) { + return mCursor.getCount(); + } + Log.error("[GameAdapter] Dataset is not valid."); + return 0; + } + + /** + * Return the contents of the _id column for a given row. + * + * @param position The row for which Android wants an ID. + * @return A valid ID from the database, or 0 if not available. + */ + @Override + public long getItemId(int position) { + if (mDatasetValid && mCursor != null) { + if (mCursor.moveToPosition(position)) { + return mCursor.getLong(GameDatabase.COLUMN_DB_ID); + } + } + + Log.error("[GameAdapter] Dataset is not valid."); + return 0; + } + + /** + * Tell Android whether or not each item in the dataset has a stable identifier. + * Which it does, because it's a database, so always tell Android 'true'. + * + * @param hasStableIds ignored. + */ + @Override + public void setHasStableIds(boolean hasStableIds) { + super.setHasStableIds(true); + } + + /** + * When a load is finished, call this to replace the existing data with the newly-loaded + * data. + * + * @param cursor The newly-loaded Cursor. + */ + public void swapCursor(Cursor cursor) { + // Sanity check. + if (cursor == mCursor) { + return; + } + + // Before getting rid of the old cursor, disassociate it from the Observer. + final Cursor oldCursor = mCursor; + if (oldCursor != null && mObserver != null) { + oldCursor.unregisterDataSetObserver(mObserver); + } + + mCursor = cursor; + if (mCursor != null) { + // Attempt to associate the new Cursor with the Observer. + if (mObserver != null) { + mCursor.registerDataSetObserver(mObserver); + } + + mDatasetValid = true; + } else { + mDatasetValid = false; + } + + notifyDataSetChanged(); + } + + /** + * Launches the game that was clicked on. + * + * @param view The card representing the game the user wants to play. + */ + @Override + public void onClick(View view) { + // Double-click prevention, using threshold of 1000 ms + if (SystemClock.elapsedRealtime() - mLastClickTime < 1000) { + return; + } + mLastClickTime = SystemClock.elapsedRealtime(); + + GameViewHolder holder = (GameViewHolder) view.getTag(); + + EmulationActivity.launch((FragmentActivity) view.getContext(), holder.path, holder.title); + } + + public static class SpacesItemDecoration extends DividerItemDecoration { + private int space; + + public SpacesItemDecoration(Drawable divider, int space) { + super(divider); + this.space = space; + } + + @Override + public void getItemOffsets(Rect outRect, @NonNull View view, @NonNull RecyclerView parent, + @NonNull RecyclerView.State state) { + outRect.left = 0; + outRect.right = 0; + outRect.bottom = space; + outRect.top = 0; + } + } + + private boolean isValidGame(String path) { + return Stream.of( + ".rar", ".zip", ".7z", ".torrent", ".tar", ".gz").noneMatch(suffix -> path.toLowerCase().endsWith(suffix)); + } + + private final class GameDataSetObserver extends DataSetObserver { + @Override + public void onChanged() { + super.onChanged(); + + mDatasetValid = true; + notifyDataSetChanged(); + } + + @Override + public void onInvalidated() { + super.onInvalidated(); + + mDatasetValid = false; + notifyDataSetChanged(); + } + } +} diff --git a/src/android/app/src/main/java/org/citra/citra_emu/applets/MiiSelector.java b/src/android/app/src/main/java/org/citra/citra_emu/applets/MiiSelector.java new file mode 100644 index 000000000..85b55b00d --- /dev/null +++ b/src/android/app/src/main/java/org/citra/citra_emu/applets/MiiSelector.java @@ -0,0 +1,124 @@ +// Copyright 2020 Citra Emulator Project +// Licensed under GPLv2 or any later version +// Refer to the license.txt file included. + +package org.citra.citra_emu.applets; + +import android.app.Activity; +import android.app.Dialog; +import android.content.DialogInterface; +import android.os.Bundle; + +import org.citra.citra_emu.NativeLibrary; +import org.citra.citra_emu.R; +import org.citra.citra_emu.activities.EmulationActivity; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Collections; +import java.util.Objects; + +import androidx.annotation.NonNull; +import androidx.appcompat.app.AlertDialog; +import androidx.fragment.app.DialogFragment; + +public final class MiiSelector { + public static class MiiSelectorConfig implements java.io.Serializable { + public boolean enable_cancel_button; + public String title; + public long initially_selected_mii_index; + // List of Miis to display + public String[] mii_names; + } + + public static class MiiSelectorData { + public long return_code; + public int index; + + private MiiSelectorData(long return_code, int index) { + this.return_code = return_code; + this.index = index; + } + } + + public static class MiiSelectorDialogFragment extends DialogFragment { + static MiiSelectorDialogFragment newInstance(MiiSelectorConfig config) { + MiiSelectorDialogFragment frag = new MiiSelectorDialogFragment(); + Bundle args = new Bundle(); + args.putSerializable("config", config); + frag.setArguments(args); + return frag; + } + + @NonNull + @Override + public Dialog onCreateDialog(Bundle savedInstanceState) { + final Activity emulationActivity = Objects.requireNonNull(getActivity()); + + MiiSelectorConfig config = + Objects.requireNonNull((MiiSelectorConfig) Objects.requireNonNull(getArguments()) + .getSerializable("config")); + + // Note: we intentionally leave out the Standard Mii in the native code so that + // the string can get translated + ArrayList list = new ArrayList<>(); + list.add(emulationActivity.getString(R.string.standard_mii)); + list.addAll(Arrays.asList(config.mii_names)); + + final int initialIndex = config.initially_selected_mii_index < list.size() + ? (int) config.initially_selected_mii_index + : 0; + data.index = initialIndex; + AlertDialog.Builder builder = + new AlertDialog.Builder(emulationActivity) + .setTitle(config.title.isEmpty() + ? emulationActivity.getString(R.string.mii_selector) + : config.title) + .setSingleChoiceItems(list.toArray(new String[]{}), initialIndex, + (dialog, which) -> { + data.index = which; + }) + .setPositiveButton(android.R.string.ok, (dialog, which) -> { + data.return_code = 0; + synchronized (finishLock) { + finishLock.notifyAll(); + } + }); + if (config.enable_cancel_button) { + builder.setNegativeButton(android.R.string.cancel, (dialog, which) -> { + data.return_code = 1; + synchronized (finishLock) { + finishLock.notifyAll(); + } + }); + } + setCancelable(false); + return builder.create(); + } + } + + private static MiiSelectorData data; + private static final Object finishLock = new Object(); + + private static void ExecuteImpl(MiiSelectorConfig config) { + final EmulationActivity emulationActivity = NativeLibrary.sEmulationActivity.get(); + + data = new MiiSelectorData(0, 0); + + MiiSelectorDialogFragment fragment = MiiSelectorDialogFragment.newInstance(config); + fragment.show(emulationActivity.getSupportFragmentManager(), "mii_selector"); + } + + public static MiiSelectorData Execute(MiiSelectorConfig config) { + NativeLibrary.sEmulationActivity.get().runOnUiThread(() -> ExecuteImpl(config)); + + synchronized (finishLock) { + try { + finishLock.wait(); + } catch (Exception ignored) { + } + } + + return data; + } +} diff --git a/src/android/app/src/main/java/org/citra/citra_emu/applets/SoftwareKeyboard.java b/src/android/app/src/main/java/org/citra/citra_emu/applets/SoftwareKeyboard.java new file mode 100644 index 000000000..7be5f6d97 --- /dev/null +++ b/src/android/app/src/main/java/org/citra/citra_emu/applets/SoftwareKeyboard.java @@ -0,0 +1,264 @@ +// Copyright 2020 Citra Emulator Project +// Licensed under GPLv2 or any later version +// Refer to the license.txt file included. + +package org.citra.citra_emu.applets; + +import android.app.Activity; +import android.app.Dialog; +import android.content.DialogInterface; +import android.os.Bundle; +import android.text.InputFilter; +import android.text.Spanned; +import android.view.ViewGroup; +import android.widget.EditText; +import android.widget.FrameLayout; + +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; +import androidx.appcompat.app.AlertDialog; +import androidx.fragment.app.DialogFragment; + +import org.citra.citra_emu.CitraApplication; +import org.citra.citra_emu.NativeLibrary; +import org.citra.citra_emu.R; +import org.citra.citra_emu.activities.EmulationActivity; +import org.citra.citra_emu.utils.Log; + +import java.util.Objects; + +public final class SoftwareKeyboard { + /// Corresponds to Frontend::ButtonConfig + private interface ButtonConfig { + int Single = 0; /// Ok button + int Dual = 1; /// Cancel | Ok buttons + int Triple = 2; /// Cancel | I Forgot | Ok buttons + int None = 3; /// No button (returned by swkbdInputText in special cases) + } + + /// Corresponds to Frontend::ValidationError + public enum ValidationError { + None, + // Button Selection + ButtonOutOfRange, + // Configured Filters + MaxDigitsExceeded, + AtSignNotAllowed, + PercentNotAllowed, + BackslashNotAllowed, + ProfanityNotAllowed, + CallbackFailed, + // Allowed Input Type + FixedLengthRequired, + MaxLengthExceeded, + BlankInputNotAllowed, + EmptyInputNotAllowed, + } + + public static class KeyboardConfig implements java.io.Serializable { + public int button_config; + public int max_text_length; + public boolean multiline_mode; /// True if the keyboard accepts multiple lines of input + public String hint_text; /// Displayed in the field as a hint before + @Nullable + public String[] button_text; /// Contains the button text that the caller provides + } + + /// Corresponds to Frontend::KeyboardData + public static class KeyboardData { + public int button; + public String text; + + private KeyboardData(int button, String text) { + this.button = button; + this.text = text; + } + } + + private static class Filter implements InputFilter { + @Override + public CharSequence filter(CharSequence source, int start, int end, Spanned dest, + int dstart, int dend) { + String text = new StringBuilder(dest) + .replace(dstart, dend, source.subSequence(start, end).toString()) + .toString(); + if (ValidateFilters(text) == ValidationError.None) { + return null; // Accept replacement + } + return dest.subSequence(dstart, dend); // Request the subsequence to be unchanged + } + } + + public static class KeyboardDialogFragment extends DialogFragment { + static KeyboardDialogFragment newInstance(KeyboardConfig config) { + KeyboardDialogFragment frag = new KeyboardDialogFragment(); + Bundle args = new Bundle(); + args.putSerializable("config", config); + frag.setArguments(args); + return frag; + } + + @NonNull + @Override + public Dialog onCreateDialog(Bundle savedInstanceState) { + final Activity emulationActivity = getActivity(); + assert emulationActivity != null; + + FrameLayout.LayoutParams params = new FrameLayout.LayoutParams( + ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT); + params.leftMargin = params.rightMargin = + CitraApplication.getAppContext().getResources().getDimensionPixelSize( + R.dimen.dialog_margin); + + KeyboardConfig config = Objects.requireNonNull( + (KeyboardConfig) Objects.requireNonNull(getArguments()).getSerializable("config")); + + // Set up the input + EditText editText = new EditText(CitraApplication.getAppContext()); + editText.setHint(config.hint_text); + editText.setSingleLine(!config.multiline_mode); + editText.setLayoutParams(params); + editText.setFilters(new InputFilter[]{ + new Filter(), new InputFilter.LengthFilter(config.max_text_length)}); + + FrameLayout container = new FrameLayout(emulationActivity); + container.addView(editText); + + AlertDialog.Builder builder = new AlertDialog.Builder(emulationActivity) + .setTitle(R.string.software_keyboard) + .setView(container); + setCancelable(false); + + switch (config.button_config) { + case ButtonConfig.Triple: { + final String text = config.button_text[1].isEmpty() + ? emulationActivity.getString(R.string.i_forgot) + : config.button_text[1]; + builder.setNeutralButton(text, null); + } + // fallthrough + case ButtonConfig.Dual: { + final String text = config.button_text[0].isEmpty() + ? emulationActivity.getString(android.R.string.cancel) + : config.button_text[0]; + builder.setNegativeButton(text, null); + } + // fallthrough + case ButtonConfig.Single: { + final String text = config.button_text[2].isEmpty() + ? emulationActivity.getString(android.R.string.ok) + : config.button_text[2]; + builder.setPositiveButton(text, null); + break; + } + } + + final AlertDialog dialog = builder.create(); + dialog.create(); + if (dialog.getButton(DialogInterface.BUTTON_POSITIVE) != null) { + dialog.getButton(DialogInterface.BUTTON_POSITIVE).setOnClickListener((view) -> { + data.button = config.button_config; + data.text = editText.getText().toString(); + final ValidationError error = ValidateInput(data.text); + if (error != ValidationError.None) { + HandleValidationError(config, error); + return; + } + + dialog.dismiss(); + + synchronized (finishLock) { + finishLock.notifyAll(); + } + }); + } + if (dialog.getButton(DialogInterface.BUTTON_NEUTRAL) != null) { + dialog.getButton(DialogInterface.BUTTON_NEUTRAL).setOnClickListener((view) -> { + data.button = 1; + dialog.dismiss(); + synchronized (finishLock) { + finishLock.notifyAll(); + } + }); + } + if (dialog.getButton(DialogInterface.BUTTON_NEGATIVE) != null) { + dialog.getButton(DialogInterface.BUTTON_NEGATIVE).setOnClickListener((view) -> { + data.button = 0; + dialog.dismiss(); + synchronized (finishLock) { + finishLock.notifyAll(); + } + }); + } + + return dialog; + } + } + + private static KeyboardData data; + private static final Object finishLock = new Object(); + + private static void ExecuteImpl(KeyboardConfig config) { + final EmulationActivity emulationActivity = NativeLibrary.sEmulationActivity.get(); + + data = new KeyboardData(0, ""); + + KeyboardDialogFragment fragment = KeyboardDialogFragment.newInstance(config); + fragment.show(emulationActivity.getSupportFragmentManager(), "keyboard"); + } + + private static void HandleValidationError(KeyboardConfig config, ValidationError error) { + final EmulationActivity emulationActivity = NativeLibrary.sEmulationActivity.get(); + String message = ""; + switch (error) { + case FixedLengthRequired: + message = + emulationActivity.getString(R.string.fixed_length_required, config.max_text_length); + break; + case MaxLengthExceeded: + message = + emulationActivity.getString(R.string.max_length_exceeded, config.max_text_length); + break; + case BlankInputNotAllowed: + message = emulationActivity.getString(R.string.blank_input_not_allowed); + break; + case EmptyInputNotAllowed: + message = emulationActivity.getString(R.string.empty_input_not_allowed); + break; + } + + new AlertDialog.Builder(emulationActivity) + .setTitle(R.string.software_keyboard) + .setMessage(message) + .setPositiveButton(android.R.string.ok, null) + .show(); + } + + public static KeyboardData Execute(KeyboardConfig config) { + if (config.button_config == ButtonConfig.None) { + Log.error("Unexpected button config None"); + return new KeyboardData(0, ""); + } + + NativeLibrary.sEmulationActivity.get().runOnUiThread(() -> ExecuteImpl(config)); + + synchronized (finishLock) { + try { + finishLock.wait(); + } catch (Exception ignored) { + } + } + + return data; + } + + public static void ShowError(String error) { + NativeLibrary.displayAlertMsg( + CitraApplication.getAppContext().getResources().getString(R.string.software_keyboard), + error, false); + } + + private static native ValidationError ValidateFilters(String text); + + private static native ValidationError ValidateInput(String text); +} diff --git a/src/android/app/src/main/java/org/citra/citra_emu/camera/StillImageCameraHelper.java b/src/android/app/src/main/java/org/citra/citra_emu/camera/StillImageCameraHelper.java new file mode 100644 index 000000000..701cb0710 --- /dev/null +++ b/src/android/app/src/main/java/org/citra/citra_emu/camera/StillImageCameraHelper.java @@ -0,0 +1,65 @@ +// Copyright 2020 Citra Emulator Project +// Licensed under GPLv2 or any later version +// Refer to the license.txt file included. + +package org.citra.citra_emu.camera; + +import android.content.Intent; +import android.graphics.Bitmap; +import android.provider.MediaStore; + +import org.citra.citra_emu.NativeLibrary; +import org.citra.citra_emu.R; +import org.citra.citra_emu.activities.EmulationActivity; +import org.citra.citra_emu.utils.PicassoUtils; + +import androidx.annotation.Nullable; + +// Used in native code. +public final class StillImageCameraHelper { + public static final int REQUEST_CAMERA_FILE_PICKER = 1; + private static final Object filePickerLock = new Object(); + private static @Nullable + String filePickerPath; + + // Opens file picker for camera. + public static @Nullable + String OpenFilePicker() { + final EmulationActivity emulationActivity = NativeLibrary.sEmulationActivity.get(); + + // At this point, we are assuming that we already have permissions as they are + // needed to launch a game + emulationActivity.runOnUiThread(() -> { + Intent intent = new Intent(Intent.ACTION_PICK); + intent.setDataAndType(MediaStore.Images.Media.INTERNAL_CONTENT_URI, "image/*"); + emulationActivity.startActivityForResult( + Intent.createChooser(intent, + emulationActivity.getString(R.string.camera_select_image)), + REQUEST_CAMERA_FILE_PICKER); + }); + + synchronized (filePickerLock) { + try { + filePickerLock.wait(); + } catch (InterruptedException ignored) { + } + } + + return filePickerPath; + } + + // Called from EmulationActivity. + public static void OnFilePickerResult(Intent result) { + filePickerPath = result == null ? null : result.getDataString(); + + synchronized (filePickerLock) { + filePickerLock.notifyAll(); + } + } + + // Blocking call. Load image from file and crop/resize it to fit in width x height. + @Nullable + public static Bitmap LoadImageFromFile(String uri, int width, int height) { + return PicassoUtils.LoadBitmapFromFile(uri, width, height); + } +} diff --git a/src/android/app/src/main/java/org/citra/citra_emu/dialogs/MotionAlertDialog.java b/src/android/app/src/main/java/org/citra/citra_emu/dialogs/MotionAlertDialog.java new file mode 100644 index 000000000..0f10f1858 --- /dev/null +++ b/src/android/app/src/main/java/org/citra/citra_emu/dialogs/MotionAlertDialog.java @@ -0,0 +1,140 @@ +package org.citra.citra_emu.dialogs; + +import android.content.Context; +import android.view.InputDevice; +import android.view.KeyEvent; +import android.view.MotionEvent; + +import androidx.annotation.NonNull; +import androidx.appcompat.app.AlertDialog; + +import org.citra.citra_emu.features.settings.model.view.InputBindingSetting; +import org.citra.citra_emu.utils.Log; + +import java.util.ArrayList; +import java.util.List; + +/** + * {@link AlertDialog} derivative that listens for + * motion events from controllers and joysticks. + */ +public final class MotionAlertDialog extends AlertDialog { + // The selected input preference + private final InputBindingSetting setting; + private final ArrayList mPreviousValues = new ArrayList<>(); + private int mPrevDeviceId = 0; + private boolean mWaitingForEvent = true; + + /** + * Constructor + * + * @param context The current {@link Context}. + * @param setting The Preference to show this dialog for. + */ + public MotionAlertDialog(Context context, InputBindingSetting setting) { + super(context); + + this.setting = setting; + } + + public boolean onKeyEvent(int keyCode, KeyEvent event) { + Log.debug("[MotionAlertDialog] Received key event: " + event.getAction()); + switch (event.getAction()) { + case KeyEvent.ACTION_UP: + setting.onKeyInput(event); + dismiss(); + // Even if we ignore the key, we still consume it. Thus return true regardless. + return true; + + default: + return false; + } + } + + @Override + public boolean onKeyLongPress(int keyCode, @NonNull KeyEvent event) { + return super.onKeyLongPress(keyCode, event); + } + + @Override + public boolean dispatchKeyEvent(KeyEvent event) { + // Handle this key if we care about it, otherwise pass it down the framework + return onKeyEvent(event.getKeyCode(), event) || super.dispatchKeyEvent(event); + } + + @Override + public boolean dispatchGenericMotionEvent(@NonNull MotionEvent event) { + // Handle this event if we care about it, otherwise pass it down the framework + return onMotionEvent(event) || super.dispatchGenericMotionEvent(event); + } + + private boolean onMotionEvent(MotionEvent event) { + if ((event.getSource() & InputDevice.SOURCE_CLASS_JOYSTICK) == 0) + return false; + if (event.getAction() != MotionEvent.ACTION_MOVE) + return false; + + InputDevice input = event.getDevice(); + + List motionRanges = input.getMotionRanges(); + + if (input.getId() != mPrevDeviceId) { + mPreviousValues.clear(); + } + mPrevDeviceId = input.getId(); + boolean firstEvent = mPreviousValues.isEmpty(); + + int numMovedAxis = 0; + float axisMoveValue = 0.0f; + InputDevice.MotionRange lastMovedRange = null; + char lastMovedDir = '?'; + if (mWaitingForEvent) { + for (int i = 0; i < motionRanges.size(); i++) { + InputDevice.MotionRange range = motionRanges.get(i); + int axis = range.getAxis(); + float origValue = event.getAxisValue(axis); + float value = origValue;//ControllerMappingHelper.scaleAxis(input, axis, origValue); + if (firstEvent) { + mPreviousValues.add(value); + } else { + float previousValue = mPreviousValues.get(i); + + // Only handle the axes that are not neutral (more than 0.5) + // but ignore any axis that has a constant value (e.g. always 1) + if (Math.abs(value) > 0.5f && value != previousValue) { + // It is common to have multiple axes with the same physical input. For example, + // shoulder butters are provided as both AXIS_LTRIGGER and AXIS_BRAKE. + // To handle this, we ignore an axis motion that's the exact same as a motion + // we already saw. This way, we ignore axes with two names, but catch the case + // where a joystick is moved in two directions. + // ref: bottom of https://developer.android.com/training/game-controllers/controller-input.html + if (value != axisMoveValue) { + axisMoveValue = value; + numMovedAxis++; + lastMovedRange = range; + lastMovedDir = value < 0.0f ? '-' : '+'; + } + } + // Special case for d-pads (axis value jumps between 0 and 1 without any values + // in between). Without this, the user would need to press the d-pad twice + // due to the first press being caught by the "if (firstEvent)" case further up. + else if (Math.abs(value) < 0.25f && Math.abs(previousValue) > 0.75f) { + numMovedAxis++; + lastMovedRange = range; + lastMovedDir = previousValue < 0.0f ? '-' : '+'; + } + } + + mPreviousValues.set(i, value); + } + + // If only one axis moved, that's the winner. + if (numMovedAxis == 1) { + mWaitingForEvent = false; + setting.onMotionInput(input, lastMovedRange, lastMovedDir); + dismiss(); + } + } + return true; + } +} \ No newline at end of file diff --git a/src/android/app/src/main/java/org/citra/citra_emu/disk_shader_cache/DiskShaderCacheProgress.java b/src/android/app/src/main/java/org/citra/citra_emu/disk_shader_cache/DiskShaderCacheProgress.java new file mode 100644 index 000000000..8f9d215a3 --- /dev/null +++ b/src/android/app/src/main/java/org/citra/citra_emu/disk_shader_cache/DiskShaderCacheProgress.java @@ -0,0 +1,139 @@ +// Copyright 2021 Citra Emulator Project +// Licensed under GPLv2 or any later version +// Refer to the license.txt file included. + +package org.citra.citra_emu.disk_shader_cache; + +import android.app.Activity; +import android.app.Dialog; +import android.content.DialogInterface; +import android.os.Bundle; +import android.os.Handler; +import android.view.LayoutInflater; +import android.view.View; +import android.widget.ProgressBar; +import android.widget.TextView; + +import androidx.annotation.NonNull; +import androidx.appcompat.app.AlertDialog; +import androidx.fragment.app.DialogFragment; + +import org.citra.citra_emu.NativeLibrary; +import org.citra.citra_emu.R; +import org.citra.citra_emu.activities.EmulationActivity; +import org.citra.citra_emu.utils.Log; + +import java.util.Objects; + +public class DiskShaderCacheProgress { + + // Equivalent to VideoCore::LoadCallbackStage + public enum LoadCallbackStage { + Prepare, + Decompile, + Build, + Complete, + } + + private static final Object finishLock = new Object(); + private static ProgressDialogFragment fragment; + + public static class ProgressDialogFragment extends DialogFragment { + ProgressBar progressBar; + TextView progressText; + AlertDialog dialog; + + static ProgressDialogFragment newInstance(String title, String message) { + ProgressDialogFragment frag = new ProgressDialogFragment(); + Bundle args = new Bundle(); + args.putString("title", title); + args.putString("message", message); + frag.setArguments(args); + return frag; + } + + @NonNull + @Override + public Dialog onCreateDialog(Bundle savedInstanceState) { + final Activity emulationActivity = Objects.requireNonNull(getActivity()); + + final String title = Objects.requireNonNull(Objects.requireNonNull(getArguments()).getString("title")); + final String message = Objects.requireNonNull(Objects.requireNonNull(getArguments()).getString("message")); + + LayoutInflater inflater = LayoutInflater.from(emulationActivity); + View view = inflater.inflate(R.layout.dialog_progress_bar, null); + + progressBar = view.findViewById(R.id.progress_bar); + progressText = view.findViewById(R.id.progress_text); + progressText.setText(""); + + setCancelable(false); + setRetainInstance(true); + + AlertDialog.Builder builder = new AlertDialog.Builder(emulationActivity); + builder.setTitle(title); + builder.setMessage(message); + builder.setView(view); + builder.setNegativeButton(android.R.string.cancel, null); + + dialog = builder.create(); + dialog.create(); + + dialog.getButton(DialogInterface.BUTTON_NEGATIVE).setOnClickListener((v) -> emulationActivity.onBackPressed()); + + synchronized (finishLock) { + finishLock.notifyAll(); + } + + return dialog; + } + + private void onUpdateProgress(String msg, int progress, int max) { + Objects.requireNonNull(getActivity()).runOnUiThread(() -> { + progressBar.setProgress(progress); + progressBar.setMax(max); + progressText.setText(String.format("%d/%d", progress, max)); + dialog.setMessage(msg); + }); + } + } + + private static void prepareDialog() { + NativeLibrary.sEmulationActivity.get().runOnUiThread(() -> { + final EmulationActivity emulationActivity = NativeLibrary.sEmulationActivity.get(); + fragment = ProgressDialogFragment.newInstance(emulationActivity.getString(R.string.loading), emulationActivity.getString(R.string.preparing_shaders)); + fragment.show(emulationActivity.getSupportFragmentManager(), "diskShaders"); + }); + + synchronized (finishLock) { + try { + finishLock.wait(); + } catch (Exception ignored) { + } + } + } + + public static void loadProgress(LoadCallbackStage stage, int progress, int max) { + final EmulationActivity emulationActivity = NativeLibrary.sEmulationActivity.get(); + if (emulationActivity == null) { + Log.error("[DiskShaderCacheProgress] EmulationActivity not present"); + return; + } + + switch (stage) { + case Prepare: + prepareDialog(); + break; + case Decompile: + fragment.onUpdateProgress(emulationActivity.getString(R.string.preparing_shaders), progress, max); + break; + case Build: + fragment.onUpdateProgress(emulationActivity.getString(R.string.building_shaders), progress, max); + break; + case Complete: + // Workaround for when dialog is dismissed when the app is in the background + fragment.dismissAllowingStateLoss(); + break; + } + } +} diff --git a/src/android/app/src/main/java/org/citra/citra_emu/features/settings/model/BooleanSetting.java b/src/android/app/src/main/java/org/citra/citra_emu/features/settings/model/BooleanSetting.java new file mode 100644 index 000000000..932dcf1d3 --- /dev/null +++ b/src/android/app/src/main/java/org/citra/citra_emu/features/settings/model/BooleanSetting.java @@ -0,0 +1,23 @@ +package org.citra.citra_emu.features.settings.model; + +public final class BooleanSetting extends Setting { + private boolean mValue; + + public BooleanSetting(String key, String section, boolean value) { + super(key, section); + mValue = value; + } + + public boolean getValue() { + return mValue; + } + + public void setValue(boolean value) { + mValue = value; + } + + @Override + public String getValueAsString() { + return mValue ? "True" : "False"; + } +} diff --git a/src/android/app/src/main/java/org/citra/citra_emu/features/settings/model/FloatSetting.java b/src/android/app/src/main/java/org/citra/citra_emu/features/settings/model/FloatSetting.java new file mode 100644 index 000000000..275f0ecea --- /dev/null +++ b/src/android/app/src/main/java/org/citra/citra_emu/features/settings/model/FloatSetting.java @@ -0,0 +1,23 @@ +package org.citra.citra_emu.features.settings.model; + +public final class FloatSetting extends Setting { + private float mValue; + + public FloatSetting(String key, String section, float value) { + super(key, section); + mValue = value; + } + + public float getValue() { + return mValue; + } + + public void setValue(float value) { + mValue = value; + } + + @Override + public String getValueAsString() { + return Float.toString(mValue); + } +} diff --git a/src/android/app/src/main/java/org/citra/citra_emu/features/settings/model/IntSetting.java b/src/android/app/src/main/java/org/citra/citra_emu/features/settings/model/IntSetting.java new file mode 100644 index 000000000..f712e5bfa --- /dev/null +++ b/src/android/app/src/main/java/org/citra/citra_emu/features/settings/model/IntSetting.java @@ -0,0 +1,23 @@ +package org.citra.citra_emu.features.settings.model; + +public final class IntSetting extends Setting { + private int mValue; + + public IntSetting(String key, String section, int value) { + super(key, section); + mValue = value; + } + + public int getValue() { + return mValue; + } + + public void setValue(int value) { + mValue = value; + } + + @Override + public String getValueAsString() { + return Integer.toString(mValue); + } +} diff --git a/src/android/app/src/main/java/org/citra/citra_emu/features/settings/model/Setting.java b/src/android/app/src/main/java/org/citra/citra_emu/features/settings/model/Setting.java new file mode 100644 index 000000000..b762847c9 --- /dev/null +++ b/src/android/app/src/main/java/org/citra/citra_emu/features/settings/model/Setting.java @@ -0,0 +1,42 @@ +package org.citra.citra_emu.features.settings.model; + +/** + * Abstraction for a setting item as read from / written to Citra's configuration ini files. + * These files generally consist of a key/value pair, though the type of value is ambiguous and + * must be inferred at read-time. The type of value determines which child of this class is used + * to represent the Setting. + */ +public abstract class Setting { + private String mKey; + private String mSection; + + /** + * Base constructor. + * + * @param key Everything to the left of the = in a line from the ini file. + * @param section The corresponding recent section header; e.g. [Core] or [Enhancements] without the brackets. + */ + public Setting(String key, String section) { + mKey = key; + mSection = section; + } + + /** + * @return The identifier used to write this setting to the ini file. + */ + public String getKey() { + return mKey; + } + + /** + * @return The name of the header under which this Setting should be written in the ini file. + */ + public String getSection() { + return mSection; + } + + /** + * @return A representation of this Setting's backing value converted to a String (e.g. for serialization). + */ + public abstract String getValueAsString(); +} diff --git a/src/android/app/src/main/java/org/citra/citra_emu/features/settings/model/SettingSection.java b/src/android/app/src/main/java/org/citra/citra_emu/features/settings/model/SettingSection.java new file mode 100644 index 000000000..0a291aa6b --- /dev/null +++ b/src/android/app/src/main/java/org/citra/citra_emu/features/settings/model/SettingSection.java @@ -0,0 +1,55 @@ +package org.citra.citra_emu.features.settings.model; + +import java.util.HashMap; + +/** + * A semantically-related group of Settings objects. These Settings are + * internally stored as a HashMap. + */ +public final class SettingSection { + private String mName; + + private HashMap mSettings = new HashMap<>(); + + /** + * Create a new SettingSection with no Settings in it. + * + * @param name The header of this section; e.g. [Core] or [Enhancements] without the brackets. + */ + public SettingSection(String name) { + mName = name; + } + + public String getName() { + return mName; + } + + /** + * Convenience method; inserts a value directly into the backing HashMap. + * + * @param setting The Setting to be inserted. + */ + public void putSetting(Setting setting) { + mSettings.put(setting.getKey(), setting); + } + + /** + * Convenience method; gets a value directly from the backing HashMap. + * + * @param key Used to retrieve the Setting. + * @return A Setting object (you should probably cast this before using) + */ + public Setting getSetting(String key) { + return mSettings.get(key); + } + + public HashMap getSettings() { + return mSettings; + } + + public void mergeSection(SettingSection settingSection) { + for (Setting setting : settingSection.mSettings.values()) { + putSetting(setting); + } + } +} diff --git a/src/android/app/src/main/java/org/citra/citra_emu/features/settings/model/Settings.java b/src/android/app/src/main/java/org/citra/citra_emu/features/settings/model/Settings.java new file mode 100644 index 000000000..dc6778409 --- /dev/null +++ b/src/android/app/src/main/java/org/citra/citra_emu/features/settings/model/Settings.java @@ -0,0 +1,131 @@ +package org.citra.citra_emu.features.settings.model; + +import android.text.TextUtils; + +import org.citra.citra_emu.CitraApplication; +import org.citra.citra_emu.R; +import org.citra.citra_emu.features.settings.ui.SettingsActivityView; +import org.citra.citra_emu.features.settings.utils.SettingsFile; + +import java.util.Arrays; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.TreeMap; + +public class Settings { + public static final String SECTION_PREMIUM = "Premium"; + public static final String SECTION_CORE = "Core"; + public static final String SECTION_SYSTEM = "System"; + public static final String SECTION_CAMERA = "Camera"; + public static final String SECTION_CONTROLS = "Controls"; + public static final String SECTION_RENDERER = "Renderer"; + public static final String SECTION_LAYOUT = "Layout"; + public static final String SECTION_AUDIO = "Audio"; + public static final String SECTION_DEBUG = "Debug"; + + private String gameId; + + private static final Map> configFileSectionsMap = new HashMap<>(); + + static { + configFileSectionsMap.put(SettingsFile.FILE_NAME_CONFIG, Arrays.asList(SECTION_PREMIUM, SECTION_CORE, SECTION_SYSTEM, SECTION_CAMERA, SECTION_CONTROLS, SECTION_RENDERER, SECTION_LAYOUT, SECTION_AUDIO, SECTION_DEBUG)); + } + + /** + * A HashMap that constructs a new SettingSection instead of returning null + * when getting a key not already in the map + */ + public static final class SettingsSectionMap extends HashMap { + @Override + public SettingSection get(Object key) { + if (!(key instanceof String)) { + return null; + } + + String stringKey = (String) key; + + if (!super.containsKey(stringKey)) { + SettingSection section = new SettingSection(stringKey); + super.put(stringKey, section); + return section; + } + return super.get(key); + } + } + + private HashMap sections = new Settings.SettingsSectionMap(); + + public SettingSection getSection(String sectionName) { + return sections.get(sectionName); + } + + public boolean isEmpty() { + return sections.isEmpty(); + } + + public HashMap getSections() { + return sections; + } + + public void loadSettings(SettingsActivityView view) { + sections = new Settings.SettingsSectionMap(); + loadCitraSettings(view); + + if (!TextUtils.isEmpty(gameId)) { + loadCustomGameSettings(gameId, view); + } + } + + private void loadCitraSettings(SettingsActivityView view) { + for (Map.Entry> entry : configFileSectionsMap.entrySet()) { + String fileName = entry.getKey(); + sections.putAll(SettingsFile.readFile(fileName, view)); + } + } + + private void loadCustomGameSettings(String gameId, SettingsActivityView view) { + // custom game settings + mergeSections(SettingsFile.readCustomGameSettings(gameId, view)); + } + + private void mergeSections(HashMap updatedSections) { + for (Map.Entry entry : updatedSections.entrySet()) { + if (sections.containsKey(entry.getKey())) { + SettingSection originalSection = sections.get(entry.getKey()); + SettingSection updatedSection = entry.getValue(); + originalSection.mergeSection(updatedSection); + } else { + sections.put(entry.getKey(), entry.getValue()); + } + } + } + + public void loadSettings(String gameId, SettingsActivityView view) { + this.gameId = gameId; + loadSettings(view); + } + + public void saveSettings(SettingsActivityView view) { + if (TextUtils.isEmpty(gameId)) { + view.showToastMessage(CitraApplication.getAppContext().getString(R.string.ini_saved), false); + + for (Map.Entry> entry : configFileSectionsMap.entrySet()) { + String fileName = entry.getKey(); + List sectionNames = entry.getValue(); + TreeMap iniSections = new TreeMap<>(); + for (String section : sectionNames) { + iniSections.put(section, sections.get(section)); + } + + SettingsFile.saveFile(fileName, iniSections, view); + } + } else { + // custom game settings + view.showToastMessage(CitraApplication.getAppContext().getString(R.string.gameid_saved, gameId), false); + + SettingsFile.saveCustomGameSettings(gameId, sections); + } + + } +} \ No newline at end of file diff --git a/src/android/app/src/main/java/org/citra/citra_emu/features/settings/model/StringSetting.java b/src/android/app/src/main/java/org/citra/citra_emu/features/settings/model/StringSetting.java new file mode 100644 index 000000000..b906b7010 --- /dev/null +++ b/src/android/app/src/main/java/org/citra/citra_emu/features/settings/model/StringSetting.java @@ -0,0 +1,23 @@ +package org.citra.citra_emu.features.settings.model; + +public final class StringSetting extends Setting { + private String mValue; + + public StringSetting(String key, String section, String value) { + super(key, section); + mValue = value; + } + + public String getValue() { + return mValue; + } + + public void setValue(String value) { + mValue = value; + } + + @Override + public String getValueAsString() { + return mValue; + } +} diff --git a/src/android/app/src/main/java/org/citra/citra_emu/features/settings/model/view/CheckBoxSetting.java b/src/android/app/src/main/java/org/citra/citra_emu/features/settings/model/view/CheckBoxSetting.java new file mode 100644 index 000000000..baf40709f --- /dev/null +++ b/src/android/app/src/main/java/org/citra/citra_emu/features/settings/model/view/CheckBoxSetting.java @@ -0,0 +1,80 @@ +package org.citra.citra_emu.features.settings.model.view; + +import org.citra.citra_emu.CitraApplication; +import org.citra.citra_emu.R; +import org.citra.citra_emu.features.settings.model.BooleanSetting; +import org.citra.citra_emu.features.settings.model.IntSetting; +import org.citra.citra_emu.features.settings.model.Setting; +import org.citra.citra_emu.features.settings.ui.SettingsFragmentView; + +public final class CheckBoxSetting extends SettingsItem { + private boolean mDefaultValue; + private boolean mShowPerformanceWarning; + private SettingsFragmentView mView; + + public CheckBoxSetting(String key, String section, int titleId, int descriptionId, + boolean defaultValue, Setting setting) { + super(key, section, setting, titleId, descriptionId); + mDefaultValue = defaultValue; + mShowPerformanceWarning = false; + } + + public CheckBoxSetting(String key, String section, int titleId, int descriptionId, + boolean defaultValue, Setting setting, boolean show_performance_warning, SettingsFragmentView view) { + super(key, section, setting, titleId, descriptionId); + mDefaultValue = defaultValue; + mView = view; + mShowPerformanceWarning = show_performance_warning; + } + + public boolean isChecked() { + if (getSetting() == null) { + return mDefaultValue; + } + + // Try integer setting + try { + IntSetting setting = (IntSetting) getSetting(); + return setting.getValue() == 1; + } catch (ClassCastException exception) { + } + + // Try boolean setting + try { + BooleanSetting setting = (BooleanSetting) getSetting(); + return setting.getValue() == true; + } catch (ClassCastException exception) { + } + + return mDefaultValue; + } + + /** + * Write a value to the backing boolean. If that boolean was previously null, + * initializes a new one and returns it, so it can be added to the Hashmap. + * + * @param checked Pretty self explanatory. + * @return null if overwritten successfully; otherwise, a newly created BooleanSetting. + */ + public IntSetting setChecked(boolean checked) { + // Show a performance warning if the setting has been disabled + if (mShowPerformanceWarning && !checked) { + mView.showToastMessage(CitraApplication.getAppContext().getString(R.string.performance_warning), true); + } + + if (getSetting() == null) { + IntSetting setting = new IntSetting(getKey(), getSection(), checked ? 1 : 0); + setSetting(setting); + return setting; + } else { + IntSetting setting = (IntSetting) getSetting(); + setting.setValue(checked ? 1 : 0); + return null; + } + } + + @Override + public int getType() { + return TYPE_CHECKBOX; + } +} diff --git a/src/android/app/src/main/java/org/citra/citra_emu/features/settings/model/view/DateTimeSetting.java b/src/android/app/src/main/java/org/citra/citra_emu/features/settings/model/view/DateTimeSetting.java new file mode 100644 index 000000000..afc3352cc --- /dev/null +++ b/src/android/app/src/main/java/org/citra/citra_emu/features/settings/model/view/DateTimeSetting.java @@ -0,0 +1,40 @@ +package org.citra.citra_emu.features.settings.model.view; + +import org.citra.citra_emu.features.settings.model.Setting; +import org.citra.citra_emu.features.settings.model.StringSetting; + +public final class DateTimeSetting extends SettingsItem { + private String mDefaultValue; + + public DateTimeSetting(String key, String section, int titleId, int descriptionId, + String defaultValue, Setting setting) { + super(key, section, setting, titleId, descriptionId); + mDefaultValue = defaultValue; + } + + public String getValue() { + if (getSetting() != null) { + StringSetting setting = (StringSetting) getSetting(); + return setting.getValue(); + } else { + return mDefaultValue; + } + } + + public StringSetting setSelectedValue(String datetime) { + if (getSetting() == null) { + StringSetting setting = new StringSetting(getKey(), getSection(), datetime); + setSetting(setting); + return setting; + } else { + StringSetting setting = (StringSetting) getSetting(); + setting.setValue(datetime); + return null; + } + } + + @Override + public int getType() { + return TYPE_DATETIME_SETTING; + } +} \ No newline at end of file diff --git a/src/android/app/src/main/java/org/citra/citra_emu/features/settings/model/view/HeaderSetting.java b/src/android/app/src/main/java/org/citra/citra_emu/features/settings/model/view/HeaderSetting.java new file mode 100644 index 000000000..bac8876cd --- /dev/null +++ b/src/android/app/src/main/java/org/citra/citra_emu/features/settings/model/view/HeaderSetting.java @@ -0,0 +1,14 @@ +package org.citra.citra_emu.features.settings.model.view; + +import org.citra.citra_emu.features.settings.model.Setting; + +public final class HeaderSetting extends SettingsItem { + public HeaderSetting(String key, Setting setting, int titleId, int descriptionId) { + super(key, null, setting, titleId, descriptionId); + } + + @Override + public int getType() { + return SettingsItem.TYPE_HEADER; + } +} diff --git a/src/android/app/src/main/java/org/citra/citra_emu/features/settings/model/view/InputBindingSetting.java b/src/android/app/src/main/java/org/citra/citra_emu/features/settings/model/view/InputBindingSetting.java new file mode 100644 index 000000000..e9141a208 --- /dev/null +++ b/src/android/app/src/main/java/org/citra/citra_emu/features/settings/model/view/InputBindingSetting.java @@ -0,0 +1,382 @@ +package org.citra.citra_emu.features.settings.model.view; + +import android.content.SharedPreferences; +import android.preference.PreferenceManager; +import android.view.InputDevice; +import android.view.KeyEvent; +import android.widget.Toast; + +import org.citra.citra_emu.CitraApplication; +import org.citra.citra_emu.NativeLibrary; +import org.citra.citra_emu.R; +import org.citra.citra_emu.features.settings.model.Setting; +import org.citra.citra_emu.features.settings.model.StringSetting; +import org.citra.citra_emu.features.settings.utils.SettingsFile; + +public final class InputBindingSetting extends SettingsItem { + private static final String INPUT_MAPPING_PREFIX = "InputMapping"; + + public InputBindingSetting(String key, String section, int titleId, Setting setting) { + super(key, section, setting, titleId, 0); + } + + public String getValue() { + if (getSetting() == null) { + return ""; + } + + StringSetting setting = (StringSetting) getSetting(); + return setting.getValue(); + } + + /** + * Returns true if this key is for the 3DS Circle Pad + */ + private boolean IsCirclePad() { + switch (getKey()) { + case SettingsFile.KEY_CIRCLEPAD_AXIS_HORIZONTAL: + case SettingsFile.KEY_CIRCLEPAD_AXIS_VERTICAL: + return true; + } + return false; + } + + /** + * Returns true if this key is for a horizontal axis for a 3DS analog stick or D-pad + */ + public boolean IsHorizontalOrientation() { + switch (getKey()) { + case SettingsFile.KEY_CIRCLEPAD_AXIS_HORIZONTAL: + case SettingsFile.KEY_CSTICK_AXIS_HORIZONTAL: + case SettingsFile.KEY_DPAD_AXIS_HORIZONTAL: + return true; + } + return false; + } + + /** + * Returns true if this key is for the 3DS C-Stick + */ + private boolean IsCStick() { + switch (getKey()) { + case SettingsFile.KEY_CSTICK_AXIS_HORIZONTAL: + case SettingsFile.KEY_CSTICK_AXIS_VERTICAL: + return true; + } + return false; + } + + /** + * Returns true if this key is for the 3DS D-Pad + */ + private boolean IsDPad() { + switch (getKey()) { + case SettingsFile.KEY_DPAD_AXIS_HORIZONTAL: + case SettingsFile.KEY_DPAD_AXIS_VERTICAL: + return true; + } + return false; + } + + /** + * Returns true if this key is for the 3DS L/R or ZL/ZR buttons. Note, these are not real + * triggers on the 3DS, but we support them as such on a physical gamepad. + */ + public boolean IsTrigger() { + switch (getKey()) { + case SettingsFile.KEY_BUTTON_L: + case SettingsFile.KEY_BUTTON_R: + case SettingsFile.KEY_BUTTON_ZL: + case SettingsFile.KEY_BUTTON_ZR: + return true; + } + return false; + } + + /** + * Returns true if a gamepad axis can be used to map this key. + */ + public boolean IsAxisMappingSupported() { + return IsCirclePad() || IsCStick() || IsDPad() || IsTrigger(); + } + + /** + * Returns true if a gamepad button can be used to map this key. + */ + private boolean IsButtonMappingSupported() { + return !IsAxisMappingSupported() || IsTrigger(); + } + + /** + * Returns the Citra button code for the settings key. + */ + private int getButtonCode() { + switch (getKey()) { + case SettingsFile.KEY_BUTTON_A: + return NativeLibrary.ButtonType.BUTTON_A; + case SettingsFile.KEY_BUTTON_B: + return NativeLibrary.ButtonType.BUTTON_B; + case SettingsFile.KEY_BUTTON_X: + return NativeLibrary.ButtonType.BUTTON_X; + case SettingsFile.KEY_BUTTON_Y: + return NativeLibrary.ButtonType.BUTTON_Y; + case SettingsFile.KEY_BUTTON_L: + return NativeLibrary.ButtonType.TRIGGER_L; + case SettingsFile.KEY_BUTTON_R: + return NativeLibrary.ButtonType.TRIGGER_R; + case SettingsFile.KEY_BUTTON_ZL: + return NativeLibrary.ButtonType.BUTTON_ZL; + case SettingsFile.KEY_BUTTON_ZR: + return NativeLibrary.ButtonType.BUTTON_ZR; + case SettingsFile.KEY_BUTTON_SELECT: + return NativeLibrary.ButtonType.BUTTON_SELECT; + case SettingsFile.KEY_BUTTON_START: + return NativeLibrary.ButtonType.BUTTON_START; + case SettingsFile.KEY_BUTTON_UP: + return NativeLibrary.ButtonType.DPAD_UP; + case SettingsFile.KEY_BUTTON_DOWN: + return NativeLibrary.ButtonType.DPAD_DOWN; + case SettingsFile.KEY_BUTTON_LEFT: + return NativeLibrary.ButtonType.DPAD_LEFT; + case SettingsFile.KEY_BUTTON_RIGHT: + return NativeLibrary.ButtonType.DPAD_RIGHT; + } + return -1; + } + + /** + * Returns the settings key for the specified Citra button code. + */ + private static String getButtonKey(int buttonCode) { + switch (buttonCode) { + case NativeLibrary.ButtonType.BUTTON_A: + return SettingsFile.KEY_BUTTON_A; + case NativeLibrary.ButtonType.BUTTON_B: + return SettingsFile.KEY_BUTTON_B; + case NativeLibrary.ButtonType.BUTTON_X: + return SettingsFile.KEY_BUTTON_X; + case NativeLibrary.ButtonType.BUTTON_Y: + return SettingsFile.KEY_BUTTON_Y; + case NativeLibrary.ButtonType.TRIGGER_L: + return SettingsFile.KEY_BUTTON_L; + case NativeLibrary.ButtonType.TRIGGER_R: + return SettingsFile.KEY_BUTTON_R; + case NativeLibrary.ButtonType.BUTTON_ZL: + return SettingsFile.KEY_BUTTON_ZL; + case NativeLibrary.ButtonType.BUTTON_ZR: + return SettingsFile.KEY_BUTTON_ZR; + case NativeLibrary.ButtonType.BUTTON_SELECT: + return SettingsFile.KEY_BUTTON_SELECT; + case NativeLibrary.ButtonType.BUTTON_START: + return SettingsFile.KEY_BUTTON_START; + case NativeLibrary.ButtonType.DPAD_UP: + return SettingsFile.KEY_BUTTON_UP; + case NativeLibrary.ButtonType.DPAD_DOWN: + return SettingsFile.KEY_BUTTON_DOWN; + case NativeLibrary.ButtonType.DPAD_LEFT: + return SettingsFile.KEY_BUTTON_LEFT; + case NativeLibrary.ButtonType.DPAD_RIGHT: + return SettingsFile.KEY_BUTTON_RIGHT; + } + return ""; + } + + /** + * Returns the key used to lookup the reverse mapping for this key, which is used to cleanup old + * settings on re-mapping or clearing of a setting. + */ + private String getReverseKey() { + String reverseKey = INPUT_MAPPING_PREFIX + "_ReverseMapping_" + getKey(); + + if (IsAxisMappingSupported() && !IsTrigger()) { + // Triggers are the only axis-supported mappings without orientation + reverseKey += "_" + (IsHorizontalOrientation() ? 0 : 1); + } + + return reverseKey; + } + + /** + * Removes the old mapping for this key from the settings, e.g. on user clearing the setting. + */ + public void removeOldMapping() { + // Get preferences editor + SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(CitraApplication.getAppContext()); + SharedPreferences.Editor editor = preferences.edit(); + + // Try remove all possible keys we wrote for this setting + String oldKey = preferences.getString(getReverseKey(), ""); + if (!oldKey.equals("")) { + editor.remove(getKey()); // Used for ui text + editor.remove(oldKey); // Used for button mapping + editor.remove(oldKey + "_GuestOrientation"); // Used for axis orientation + editor.remove(oldKey + "_GuestButton"); // Used for axis button + } + + // Apply changes + editor.apply(); + } + + /** + * Helper function to get the settings key for an gamepad button. + */ + public static String getInputButtonKey(int keyCode) { + return INPUT_MAPPING_PREFIX + "_Button_" + keyCode; + } + + /** + * Helper function to get the settings key for an gamepad axis. + */ + public static String getInputAxisKey(int axis) { + return INPUT_MAPPING_PREFIX + "_HostAxis_" + axis; + } + + /** + * Helper function to get the settings key for an gamepad axis button (stick or trigger). + */ + public static String getInputAxisButtonKey(int axis) { + return getInputAxisKey(axis) + "_GuestButton"; + } + + /** + * Helper function to get the settings key for an gamepad axis orientation. + */ + public static String getInputAxisOrientationKey(int axis) { + return getInputAxisKey(axis) + "_GuestOrientation"; + } + + /** + * Helper function to write a gamepad button mapping for the setting. + */ + private void WriteButtonMapping(String key) { + // Get preferences editor + SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(CitraApplication.getAppContext()); + SharedPreferences.Editor editor = preferences.edit(); + + // Remove mapping for another setting using this input + int oldButtonCode = preferences.getInt(key, -1); + if (oldButtonCode != -1) { + String oldKey = getButtonKey(oldButtonCode); + editor.remove(oldKey); // Only need to remove UI text setting, others will be overwritten + } + + // Cleanup old mapping for this setting + removeOldMapping(); + + // Write new mapping + editor.putInt(key, getButtonCode()); + + // Write next reverse mapping for future cleanup + editor.putString(getReverseKey(), key); + + // Apply changes + editor.apply(); + } + + /** + * Helper function to write a gamepad axis mapping for the setting. + */ + private void WriteAxisMapping(int axis, int value) { + // Get preferences editor + SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(CitraApplication.getAppContext()); + SharedPreferences.Editor editor = preferences.edit(); + + // Cleanup old mapping + removeOldMapping(); + + // Write new mapping + editor.putInt(getInputAxisOrientationKey(axis), IsHorizontalOrientation() ? 0 : 1); + editor.putInt(getInputAxisButtonKey(axis), value); + + // Write next reverse mapping for future cleanup + editor.putString(getReverseKey(), getInputAxisKey(axis)); + + // Apply changes + editor.apply(); + } + + /** + * Saves the provided key input setting as an Android preference. + * + * @param keyEvent KeyEvent of this key press. + */ + public void onKeyInput(KeyEvent keyEvent) { + if (!IsButtonMappingSupported()) { + Toast.makeText(CitraApplication.getAppContext(), R.string.input_message_analog_only, Toast.LENGTH_LONG).show(); + return; + } + + InputDevice device = keyEvent.getDevice(); + + WriteButtonMapping(getInputButtonKey(keyEvent.getKeyCode())); + + String uiString = device.getName() + ": Button " + keyEvent.getKeyCode(); + setUiString(uiString); + } + + /** + * Saves the provided motion input setting as an Android preference. + * + * @param device InputDevice from which the input event originated. + * @param motionRange MotionRange of the movement + * @param axisDir Either '-' or '+' (currently unused) + */ + public void onMotionInput(InputDevice device, InputDevice.MotionRange motionRange, + char axisDir) { + if (!IsAxisMappingSupported()) { + Toast.makeText(CitraApplication.getAppContext(), R.string.input_message_button_only, Toast.LENGTH_LONG).show(); + return; + } + + SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(CitraApplication.getAppContext()); + SharedPreferences.Editor editor = preferences.edit(); + + int button; + if (IsCirclePad()) { + button = NativeLibrary.ButtonType.STICK_LEFT; + } else if (IsCStick()) { + button = NativeLibrary.ButtonType.STICK_C; + } else if (IsDPad()) { + button = NativeLibrary.ButtonType.DPAD; + } else { + button = getButtonCode(); + } + + WriteAxisMapping(motionRange.getAxis(), button); + + String uiString = device.getName() + ": Axis " + motionRange.getAxis(); + setUiString(uiString); + + editor.apply(); + } + + /** + * Sets the string to use in the configuration UI for the gamepad input. + */ + private StringSetting setUiString(String ui) { + SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(CitraApplication.getAppContext()); + SharedPreferences.Editor editor = preferences.edit(); + + if (getSetting() == null) { + StringSetting setting = new StringSetting(getKey(), getSection(), ""); + setSetting(setting); + + editor.putString(setting.getKey(), ui); + editor.apply(); + + return setting; + } else { + StringSetting setting = (StringSetting) getSetting(); + + editor.putString(setting.getKey(), ui); + editor.apply(); + + return null; + } + } + + @Override + public int getType() { + return TYPE_INPUT_BINDING; + } +} diff --git a/src/android/app/src/main/java/org/citra/citra_emu/features/settings/model/view/PremiumHeader.java b/src/android/app/src/main/java/org/citra/citra_emu/features/settings/model/view/PremiumHeader.java new file mode 100644 index 000000000..8942bf13a --- /dev/null +++ b/src/android/app/src/main/java/org/citra/citra_emu/features/settings/model/view/PremiumHeader.java @@ -0,0 +1,14 @@ +package org.citra.citra_emu.features.settings.model.view; + +import org.citra.citra_emu.features.settings.model.Setting; + +public final class PremiumHeader extends SettingsItem { + public PremiumHeader() { + super(null, null, null, 0, 0); + } + + @Override + public int getType() { + return SettingsItem.TYPE_PREMIUM; + } +} diff --git a/src/android/app/src/main/java/org/citra/citra_emu/features/settings/model/view/PremiumSingleChoiceSetting.java b/src/android/app/src/main/java/org/citra/citra_emu/features/settings/model/view/PremiumSingleChoiceSetting.java new file mode 100644 index 000000000..c0560d2dc --- /dev/null +++ b/src/android/app/src/main/java/org/citra/citra_emu/features/settings/model/view/PremiumSingleChoiceSetting.java @@ -0,0 +1,59 @@ +package org.citra.citra_emu.features.settings.model.view; + +import android.content.SharedPreferences; +import android.preference.PreferenceManager; + +import org.citra.citra_emu.CitraApplication; +import org.citra.citra_emu.R; +import org.citra.citra_emu.features.settings.model.Setting; +import org.citra.citra_emu.features.settings.ui.SettingsFragmentView; + +public final class PremiumSingleChoiceSetting extends SettingsItem { + private int mDefaultValue; + + private int mChoicesId; + private int mValuesId; + private SettingsFragmentView mView; + + private static SharedPreferences mPreferences = PreferenceManager.getDefaultSharedPreferences(CitraApplication.getAppContext()); + + public PremiumSingleChoiceSetting(String key, String section, int titleId, int descriptionId, + int choicesId, int valuesId, int defaultValue, Setting setting, SettingsFragmentView view) { + super(key, section, setting, titleId, descriptionId); + mValuesId = valuesId; + mChoicesId = choicesId; + mDefaultValue = defaultValue; + mView = view; + } + + public int getChoicesId() { + return mChoicesId; + } + + public int getValuesId() { + return mValuesId; + } + + public int getSelectedValue() { + return mPreferences.getInt(getKey(), mDefaultValue); + } + + /** + * Write a value to the backing int. If that int was previously null, + * initializes a new one and returns it, so it can be added to the Hashmap. + * + * @param selection New value of the int. + * @return null if overwritten successfully otherwise; a newly created IntSetting. + */ + public void setSelectedValue(int selection) { + final SharedPreferences.Editor editor = mPreferences.edit(); + editor.putInt(getKey(), selection); + editor.apply(); + mView.showToastMessage(CitraApplication.getAppContext().getString(R.string.design_updated), false); + } + + @Override + public int getType() { + return TYPE_SINGLE_CHOICE; + } +} diff --git a/src/android/app/src/main/java/org/citra/citra_emu/features/settings/model/view/SettingsItem.java b/src/android/app/src/main/java/org/citra/citra_emu/features/settings/model/view/SettingsItem.java new file mode 100644 index 000000000..305352022 --- /dev/null +++ b/src/android/app/src/main/java/org/citra/citra_emu/features/settings/model/view/SettingsItem.java @@ -0,0 +1,107 @@ +package org.citra.citra_emu.features.settings.model.view; + +import org.citra.citra_emu.features.settings.model.Setting; +import org.citra.citra_emu.features.settings.model.Settings; +import org.citra.citra_emu.features.settings.ui.SettingsAdapter; + +/** + * ViewModel abstraction for an Item in the RecyclerView powering SettingsFragments. + * Each one corresponds to a {@link Setting} object, so this class's subclasses + * should vaguely correspond to those subclasses. There are a few with multiple analogues + * and a few with none (Headers, for example, do not correspond to anything in the ini + * file.) + */ +public abstract class SettingsItem { + public static final int TYPE_HEADER = 0; + public static final int TYPE_CHECKBOX = 1; + public static final int TYPE_SINGLE_CHOICE = 2; + public static final int TYPE_SLIDER = 3; + public static final int TYPE_SUBMENU = 4; + public static final int TYPE_INPUT_BINDING = 5; + public static final int TYPE_STRING_SINGLE_CHOICE = 6; + public static final int TYPE_DATETIME_SETTING = 7; + public static final int TYPE_PREMIUM = 8; + + private String mKey; + private String mSection; + + private Setting mSetting; + + private int mNameId; + private int mDescriptionId; + private boolean mIsPremium; + + /** + * Base constructor. Takes a key / section name in case the third parameter, the Setting, + * is null; in which case, one can be constructed and saved using the key / section. + * + * @param key Identifier for the Setting represented by this Item. + * @param section Section to which the Setting belongs. + * @param setting A possibly-null backing Setting, to be modified on UI events. + * @param nameId Resource ID for a text string to be displayed as this setting's name. + * @param descriptionId Resource ID for a text string to be displayed as this setting's description. + */ + public SettingsItem(String key, String section, Setting setting, int nameId, + int descriptionId) { + mKey = key; + mSection = section; + mSetting = setting; + mNameId = nameId; + mDescriptionId = descriptionId; + mIsPremium = (section == Settings.SECTION_PREMIUM); + } + + /** + * @return The identifier for the backing Setting. + */ + public String getKey() { + return mKey; + } + + /** + * @return The header under which the backing Setting belongs. + */ + public String getSection() { + return mSection; + } + + /** + * @return The backing Setting, possibly null. + */ + public Setting getSetting() { + return mSetting; + } + + /** + * Replace the backing setting with a new one. Generally used in cases where + * the backing setting is null. + * + * @param setting A non-null Setting. + */ + public void setSetting(Setting setting) { + mSetting = setting; + } + + /** + * @return A resource ID for a text string representing this Setting's name. + */ + public int getNameId() { + return mNameId; + } + + public int getDescriptionId() { + return mDescriptionId; + } + + public boolean isPremium() { + return mIsPremium; + } + + /** + * Used by {@link SettingsAdapter}'s onCreateViewHolder() + * method to determine which type of ViewHolder should be created. + * + * @return An integer (ideally, one of the constants defined in this file) + */ + public abstract int getType(); +} diff --git a/src/android/app/src/main/java/org/citra/citra_emu/features/settings/model/view/SingleChoiceSetting.java b/src/android/app/src/main/java/org/citra/citra_emu/features/settings/model/view/SingleChoiceSetting.java new file mode 100644 index 000000000..ee9d225d6 --- /dev/null +++ b/src/android/app/src/main/java/org/citra/citra_emu/features/settings/model/view/SingleChoiceSetting.java @@ -0,0 +1,60 @@ +package org.citra.citra_emu.features.settings.model.view; + +import org.citra.citra_emu.features.settings.model.IntSetting; +import org.citra.citra_emu.features.settings.model.Setting; + +public final class SingleChoiceSetting extends SettingsItem { + private int mDefaultValue; + + private int mChoicesId; + private int mValuesId; + + public SingleChoiceSetting(String key, String section, int titleId, int descriptionId, + int choicesId, int valuesId, int defaultValue, Setting setting) { + super(key, section, setting, titleId, descriptionId); + mValuesId = valuesId; + mChoicesId = choicesId; + mDefaultValue = defaultValue; + } + + public int getChoicesId() { + return mChoicesId; + } + + public int getValuesId() { + return mValuesId; + } + + public int getSelectedValue() { + if (getSetting() != null) { + IntSetting setting = (IntSetting) getSetting(); + return setting.getValue(); + } else { + return mDefaultValue; + } + } + + /** + * Write a value to the backing int. If that int was previously null, + * initializes a new one and returns it, so it can be added to the Hashmap. + * + * @param selection New value of the int. + * @return null if overwritten successfully otherwise; a newly created IntSetting. + */ + public IntSetting setSelectedValue(int selection) { + if (getSetting() == null) { + IntSetting setting = new IntSetting(getKey(), getSection(), selection); + setSetting(setting); + return setting; + } else { + IntSetting setting = (IntSetting) getSetting(); + setting.setValue(selection); + return null; + } + } + + @Override + public int getType() { + return TYPE_SINGLE_CHOICE; + } +} diff --git a/src/android/app/src/main/java/org/citra/citra_emu/features/settings/model/view/SliderSetting.java b/src/android/app/src/main/java/org/citra/citra_emu/features/settings/model/view/SliderSetting.java new file mode 100644 index 000000000..551b13f99 --- /dev/null +++ b/src/android/app/src/main/java/org/citra/citra_emu/features/settings/model/view/SliderSetting.java @@ -0,0 +1,101 @@ +package org.citra.citra_emu.features.settings.model.view; + +import org.citra.citra_emu.features.settings.model.FloatSetting; +import org.citra.citra_emu.features.settings.model.IntSetting; +import org.citra.citra_emu.features.settings.model.Setting; +import org.citra.citra_emu.utils.Log; + +public final class SliderSetting extends SettingsItem { + private int mMin; + private int mMax; + private int mDefaultValue; + + private String mUnits; + + public SliderSetting(String key, String section, int titleId, int descriptionId, + int min, int max, String units, int defaultValue, Setting setting) { + super(key, section, setting, titleId, descriptionId); + mMin = min; + mMax = max; + mUnits = units; + mDefaultValue = defaultValue; + } + + public int getMin() { + return mMin; + } + + public int getMax() { + return mMax; + } + + public int getDefaultValue() { + return mDefaultValue; + } + + public int getSelectedValue() { + Setting setting = getSetting(); + + if (setting == null) { + return mDefaultValue; + } + + if (setting instanceof IntSetting) { + IntSetting intSetting = (IntSetting) setting; + return intSetting.getValue(); + } else if (setting instanceof FloatSetting) { + FloatSetting floatSetting = (FloatSetting) setting; + return Math.round(floatSetting.getValue()); + } else { + Log.error("[SliderSetting] Error casting setting type."); + return -1; + } + } + + /** + * Write a value to the backing int. If that int was previously null, + * initializes a new one and returns it, so it can be added to the Hashmap. + * + * @param selection New value of the int. + * @return null if overwritten successfully otherwise; a newly created IntSetting. + */ + public IntSetting setSelectedValue(int selection) { + if (getSetting() == null) { + IntSetting setting = new IntSetting(getKey(), getSection(), selection); + setSetting(setting); + return setting; + } else { + IntSetting setting = (IntSetting) getSetting(); + setting.setValue(selection); + return null; + } + } + + /** + * Write a value to the backing float. If that float was previously null, + * initializes a new one and returns it, so it can be added to the Hashmap. + * + * @param selection New value of the float. + * @return null if overwritten successfully otherwise; a newly created FloatSetting. + */ + public FloatSetting setSelectedValue(float selection) { + if (getSetting() == null) { + FloatSetting setting = new FloatSetting(getKey(), getSection(), selection); + setSetting(setting); + return setting; + } else { + FloatSetting setting = (FloatSetting) getSetting(); + setting.setValue(selection); + return null; + } + } + + public String getUnits() { + return mUnits; + } + + @Override + public int getType() { + return TYPE_SLIDER; + } +} diff --git a/src/android/app/src/main/java/org/citra/citra_emu/features/settings/model/view/StringSingleChoiceSetting.java b/src/android/app/src/main/java/org/citra/citra_emu/features/settings/model/view/StringSingleChoiceSetting.java new file mode 100644 index 000000000..057145d9d --- /dev/null +++ b/src/android/app/src/main/java/org/citra/citra_emu/features/settings/model/view/StringSingleChoiceSetting.java @@ -0,0 +1,82 @@ +package org.citra.citra_emu.features.settings.model.view; + +import org.citra.citra_emu.features.settings.model.Setting; +import org.citra.citra_emu.features.settings.model.StringSetting; + +public class StringSingleChoiceSetting extends SettingsItem { + private String mDefaultValue; + + private String[] mChoicesId; + private String[] mValuesId; + + public StringSingleChoiceSetting(String key, String section, int titleId, int descriptionId, + String[] choicesId, String[] valuesId, String defaultValue, Setting setting) { + super(key, section, setting, titleId, descriptionId); + mValuesId = valuesId; + mChoicesId = choicesId; + mDefaultValue = defaultValue; + } + + public String[] getChoicesId() { + return mChoicesId; + } + + public String[] getValuesId() { + return mValuesId; + } + + public String getValueAt(int index) { + if (mValuesId == null) + return null; + + if (index >= 0 && index < mValuesId.length) { + return mValuesId[index]; + } + + return ""; + } + + public String getSelectedValue() { + if (getSetting() != null) { + StringSetting setting = (StringSetting) getSetting(); + return setting.getValue(); + } else { + return mDefaultValue; + } + } + + public int getSelectValueIndex() { + String selectedValue = getSelectedValue(); + for (int i = 0; i < mValuesId.length; i++) { + if (mValuesId[i].equals(selectedValue)) { + return i; + } + } + + return -1; + } + + /** + * Write a value to the backing int. If that int was previously null, + * initializes a new one and returns it, so it can be added to the Hashmap. + * + * @param selection New value of the int. + * @return null if overwritten successfully otherwise; a newly created IntSetting. + */ + public StringSetting setSelectedValue(String selection) { + if (getSetting() == null) { + StringSetting setting = new StringSetting(getKey(), getSection(), selection); + setSetting(setting); + return setting; + } else { + StringSetting setting = (StringSetting) getSetting(); + setting.setValue(selection); + return null; + } + } + + @Override + public int getType() { + return TYPE_STRING_SINGLE_CHOICE; + } +} diff --git a/src/android/app/src/main/java/org/citra/citra_emu/features/settings/model/view/SubmenuSetting.java b/src/android/app/src/main/java/org/citra/citra_emu/features/settings/model/view/SubmenuSetting.java new file mode 100644 index 000000000..9d44a923f --- /dev/null +++ b/src/android/app/src/main/java/org/citra/citra_emu/features/settings/model/view/SubmenuSetting.java @@ -0,0 +1,21 @@ +package org.citra.citra_emu.features.settings.model.view; + +import org.citra.citra_emu.features.settings.model.Setting; + +public final class SubmenuSetting extends SettingsItem { + private String mMenuKey; + + public SubmenuSetting(String key, Setting setting, int titleId, int descriptionId, String menuKey) { + super(key, null, setting, titleId, descriptionId); + mMenuKey = menuKey; + } + + public String getMenuKey() { + return mMenuKey; + } + + @Override + public int getType() { + return TYPE_SUBMENU; + } +} diff --git a/src/android/app/src/main/java/org/citra/citra_emu/features/settings/ui/SettingsActivity.java b/src/android/app/src/main/java/org/citra/citra_emu/features/settings/ui/SettingsActivity.java new file mode 100644 index 000000000..23c3c4c9e --- /dev/null +++ b/src/android/app/src/main/java/org/citra/citra_emu/features/settings/ui/SettingsActivity.java @@ -0,0 +1,215 @@ +package org.citra.citra_emu.features.settings.ui; + +import android.app.ProgressDialog; +import android.content.Context; +import android.content.Intent; +import android.content.IntentFilter; +import android.os.Bundle; +import android.provider.Settings; +import android.view.Menu; +import android.view.MenuInflater; +import android.widget.Toast; + +import androidx.annotation.NonNull; +import androidx.appcompat.app.AppCompatActivity; +import androidx.fragment.app.FragmentTransaction; +import androidx.localbroadcastmanager.content.LocalBroadcastManager; + +import org.citra.citra_emu.NativeLibrary; +import org.citra.citra_emu.R; +import org.citra.citra_emu.utils.DirectoryInitialization; +import org.citra.citra_emu.utils.DirectoryStateReceiver; +import org.citra.citra_emu.utils.EmulationMenuSettings; + +public final class SettingsActivity extends AppCompatActivity implements SettingsActivityView { + private static final String ARG_MENU_TAG = "menu_tag"; + private static final String ARG_GAME_ID = "game_id"; + private static final String FRAGMENT_TAG = "settings"; + private SettingsActivityPresenter mPresenter = new SettingsActivityPresenter(this); + + private ProgressDialog dialog; + + public static void launch(Context context, String menuTag, String gameId) { + Intent settings = new Intent(context, SettingsActivity.class); + settings.putExtra(ARG_MENU_TAG, menuTag); + settings.putExtra(ARG_GAME_ID, gameId); + context.startActivity(settings); + } + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + + setContentView(R.layout.activity_settings); + + Intent launcher = getIntent(); + String gameID = launcher.getStringExtra(ARG_GAME_ID); + String menuTag = launcher.getStringExtra(ARG_MENU_TAG); + + mPresenter.onCreate(savedInstanceState, menuTag, gameID); + + // Show "Back" button in the action bar for navigation + getSupportActionBar().setDisplayHomeAsUpEnabled(true); + } + + @Override + public boolean onSupportNavigateUp() { + onBackPressed(); + + return true; + } + + @Override + public boolean onCreateOptionsMenu(Menu menu) { + MenuInflater inflater = getMenuInflater(); + inflater.inflate(R.menu.menu_settings, menu); + + return true; + } + + @Override + protected void onSaveInstanceState(@NonNull Bundle outState) { + // Critical: If super method is not called, rotations will be busted. + super.onSaveInstanceState(outState); + mPresenter.saveState(outState); + } + + @Override + protected void onStart() { + super.onStart(); + mPresenter.onStart(); + } + + /** + * If this is called, the user has left the settings screen (potentially through the + * home button) and will expect their changes to be persisted. So we kick off an + * IntentService which will do so on a background thread. + */ + @Override + protected void onStop() { + super.onStop(); + + mPresenter.onStop(isFinishing()); + + // Update framebuffer layout when closing the settings + NativeLibrary.NotifyOrientationChange(EmulationMenuSettings.getLandscapeScreenLayout(), + getWindowManager().getDefaultDisplay().getRotation()); + } + + @Override + public void showSettingsFragment(String menuTag, boolean addToStack, String gameID) { + if (!addToStack && getFragment() != null) { + return; + } + + FragmentTransaction transaction = getSupportFragmentManager().beginTransaction(); + + if (addToStack) { + if (areSystemAnimationsEnabled()) { + transaction.setCustomAnimations( + R.animator.settings_enter, + R.animator.settings_exit, + R.animator.settings_pop_enter, + R.animator.setttings_pop_exit); + } + + transaction.addToBackStack(null); + } + transaction.replace(R.id.frame_content, SettingsFragment.newInstance(menuTag, gameID), FRAGMENT_TAG); + + transaction.commit(); + } + + private boolean areSystemAnimationsEnabled() { + float duration = Settings.Global.getFloat( + getContentResolver(), + Settings.Global.ANIMATOR_DURATION_SCALE, 1); + float transition = Settings.Global.getFloat( + getContentResolver(), + Settings.Global.TRANSITION_ANIMATION_SCALE, 1); + return duration != 0 && transition != 0; + } + + @Override + public void startDirectoryInitializationService(DirectoryStateReceiver receiver, IntentFilter filter) { + LocalBroadcastManager.getInstance(this).registerReceiver( + receiver, + filter); + DirectoryInitialization.start(this); + } + + @Override + public void stopListeningToDirectoryInitializationService(DirectoryStateReceiver receiver) { + LocalBroadcastManager.getInstance(this).unregisterReceiver(receiver); + } + + @Override + public void showLoading() { + if (dialog == null) { + dialog = new ProgressDialog(this); + dialog.setMessage(getString(R.string.load_settings)); + dialog.setIndeterminate(true); + } + + dialog.show(); + } + + @Override + public void hideLoading() { + dialog.dismiss(); + } + + @Override + public void showPermissionNeededHint() { + Toast.makeText(this, R.string.write_permission_needed, Toast.LENGTH_SHORT) + .show(); + } + + @Override + public void showExternalStorageNotMountedHint() { + Toast.makeText(this, R.string.external_storage_not_mounted, Toast.LENGTH_SHORT) + .show(); + } + + @Override + public org.citra.citra_emu.features.settings.model.Settings getSettings() { + return mPresenter.getSettings(); + } + + @Override + public void setSettings(org.citra.citra_emu.features.settings.model.Settings settings) { + mPresenter.setSettings(settings); + } + + @Override + public void onSettingsFileLoaded(org.citra.citra_emu.features.settings.model.Settings settings) { + SettingsFragmentView fragment = getFragment(); + + if (fragment != null) { + fragment.onSettingsFileLoaded(settings); + } + } + + @Override + public void onSettingsFileNotFound() { + SettingsFragmentView fragment = getFragment(); + + if (fragment != null) { + fragment.loadDefaultSettings(); + } + } + + @Override + public void showToastMessage(String message, boolean is_long) { + Toast.makeText(this, message, is_long ? Toast.LENGTH_LONG : Toast.LENGTH_SHORT).show(); + } + + @Override + public void onSettingChanged() { + mPresenter.onSettingChanged(); + } + + private SettingsFragment getFragment() { + return (SettingsFragment) getSupportFragmentManager().findFragmentByTag(FRAGMENT_TAG); + } +} diff --git a/src/android/app/src/main/java/org/citra/citra_emu/features/settings/ui/SettingsActivityPresenter.java b/src/android/app/src/main/java/org/citra/citra_emu/features/settings/ui/SettingsActivityPresenter.java new file mode 100644 index 000000000..0d63873bb --- /dev/null +++ b/src/android/app/src/main/java/org/citra/citra_emu/features/settings/ui/SettingsActivityPresenter.java @@ -0,0 +1,124 @@ +package org.citra.citra_emu.features.settings.ui; + +import android.content.IntentFilter; +import android.os.Bundle; +import android.text.TextUtils; + +import org.citra.citra_emu.NativeLibrary; +import org.citra.citra_emu.features.settings.model.Settings; +import org.citra.citra_emu.features.settings.utils.SettingsFile; +import org.citra.citra_emu.utils.DirectoryInitialization; +import org.citra.citra_emu.utils.DirectoryInitialization.DirectoryInitializationState; +import org.citra.citra_emu.utils.DirectoryStateReceiver; +import org.citra.citra_emu.utils.Log; +import org.citra.citra_emu.utils.ThemeUtil; + +import java.io.File; + +public final class SettingsActivityPresenter { + private static final String KEY_SHOULD_SAVE = "should_save"; + + private SettingsActivityView mView; + + private Settings mSettings = new Settings(); + + private boolean mShouldSave; + + private DirectoryStateReceiver directoryStateReceiver; + + private String menuTag; + private String gameId; + + public SettingsActivityPresenter(SettingsActivityView view) { + mView = view; + } + + public void onCreate(Bundle savedInstanceState, String menuTag, String gameId) { + if (savedInstanceState == null) { + this.menuTag = menuTag; + this.gameId = gameId; + } else { + mShouldSave = savedInstanceState.getBoolean(KEY_SHOULD_SAVE); + } + } + + public void onStart() { + prepareCitraDirectoriesIfNeeded(); + } + + void loadSettingsUI() { + if (mSettings.isEmpty()) { + if (!TextUtils.isEmpty(gameId)) { + mSettings.loadSettings(gameId, mView); + } else { + mSettings.loadSettings(mView); + } + } + + mView.showSettingsFragment(menuTag, false, gameId); + mView.onSettingsFileLoaded(mSettings); + } + + private void prepareCitraDirectoriesIfNeeded() { + File configFile = new File(DirectoryInitialization.getUserDirectory() + "/config/" + SettingsFile.FILE_NAME_CONFIG + ".ini"); + if (!configFile.exists()) { + Log.error("Citra config file could not be found!"); + } + if (DirectoryInitialization.areCitraDirectoriesReady()) { + loadSettingsUI(); + } else { + mView.showLoading(); + IntentFilter statusIntentFilter = new IntentFilter( + DirectoryInitialization.BROADCAST_ACTION); + + directoryStateReceiver = + new DirectoryStateReceiver(directoryInitializationState -> + { + if (directoryInitializationState == DirectoryInitializationState.CITRA_DIRECTORIES_INITIALIZED) { + mView.hideLoading(); + loadSettingsUI(); + } else if (directoryInitializationState == DirectoryInitializationState.EXTERNAL_STORAGE_PERMISSION_NEEDED) { + mView.showPermissionNeededHint(); + mView.hideLoading(); + } else if (directoryInitializationState == DirectoryInitializationState.CANT_FIND_EXTERNAL_STORAGE) { + mView.showExternalStorageNotMountedHint(); + mView.hideLoading(); + } + }); + + mView.startDirectoryInitializationService(directoryStateReceiver, statusIntentFilter); + } + } + + public void setSettings(Settings settings) { + mSettings = settings; + } + + public Settings getSettings() { + return mSettings; + } + + public void onStop(boolean finishing) { + if (directoryStateReceiver != null) { + mView.stopListeningToDirectoryInitializationService(directoryStateReceiver); + directoryStateReceiver = null; + } + + if (mSettings != null && finishing && mShouldSave) { + Log.debug("[SettingsActivity] Settings activity stopping. Saving settings to INI..."); + mSettings.saveSettings(mView); + } + + ThemeUtil.applyTheme(); + + NativeLibrary.ReloadSettings(); + } + + public void onSettingChanged() { + mShouldSave = true; + } + + public void saveState(Bundle outState) { + outState.putBoolean(KEY_SHOULD_SAVE, mShouldSave); + } +} diff --git a/src/android/app/src/main/java/org/citra/citra_emu/features/settings/ui/SettingsActivityView.java b/src/android/app/src/main/java/org/citra/citra_emu/features/settings/ui/SettingsActivityView.java new file mode 100644 index 000000000..0d26d48a7 --- /dev/null +++ b/src/android/app/src/main/java/org/citra/citra_emu/features/settings/ui/SettingsActivityView.java @@ -0,0 +1,103 @@ +package org.citra.citra_emu.features.settings.ui; + +import android.content.IntentFilter; + +import org.citra.citra_emu.features.settings.model.Settings; +import org.citra.citra_emu.utils.DirectoryStateReceiver; + +/** + * Abstraction for the Activity that manages SettingsFragments. + */ +public interface SettingsActivityView { + /** + * Show a new SettingsFragment. + * + * @param menuTag Identifier for the settings group that should be displayed. + * @param addToStack Whether or not this fragment should replace a previous one. + */ + void showSettingsFragment(String menuTag, boolean addToStack, String gameId); + + /** + * Called by a contained Fragment to get access to the Setting HashMap + * loaded from disk, so that each Fragment doesn't need to perform its own + * read operation. + * + * @return A possibly null HashMap of Settings. + */ + Settings getSettings(); + + /** + * Used to provide the Activity with Settings HashMaps if a Fragment already + * has one; for example, if a rotation occurs, the Fragment will not be killed, + * but the Activity will, so the Activity needs to have its HashMaps resupplied. + * + * @param settings The ArrayList of all the Settings HashMaps. + */ + void setSettings(Settings settings); + + /** + * Called when an asynchronous load operation completes. + * + * @param settings The (possibly null) result of the ini load operation. + */ + void onSettingsFileLoaded(Settings settings); + + /** + * Called when an asynchronous load operation fails. + */ + void onSettingsFileNotFound(); + + /** + * Display a popup text message on screen. + * + * @param message The contents of the onscreen message. + * @param is_long Whether this should be a long Toast or short one. + */ + void showToastMessage(String message, boolean is_long); + + /** + * End the activity. + */ + void finish(); + + /** + * Called by a containing Fragment to tell the Activity that a setting was changed; + * unless this has been called, the Activity will not save to disk. + */ + void onSettingChanged(); + + /** + * Show loading dialog while loading the settings + */ + void showLoading(); + + /** + * Hide the loading the dialog + */ + void hideLoading(); + + /** + * Show a hint to the user that the app needs write to external storage access + */ + void showPermissionNeededHint(); + + /** + * Show a hint to the user that the app needs the external storage to be mounted + */ + void showExternalStorageNotMountedHint(); + + /** + * Start the DirectoryInitialization and listen for the result. + * + * @param receiver the broadcast receiver for the DirectoryInitialization + * @param filter the Intent broadcasts to be received. + */ + void startDirectoryInitializationService(DirectoryStateReceiver receiver, IntentFilter filter); + + /** + * Stop listening to the DirectoryInitialization. + * + * @param receiver The broadcast receiver to unregister. + */ + void stopListeningToDirectoryInitializationService(DirectoryStateReceiver receiver); +} diff --git a/src/android/app/src/main/java/org/citra/citra_emu/features/settings/ui/SettingsAdapter.java b/src/android/app/src/main/java/org/citra/citra_emu/features/settings/ui/SettingsAdapter.java new file mode 100644 index 000000000..bfd7c71a9 --- /dev/null +++ b/src/android/app/src/main/java/org/citra/citra_emu/features/settings/ui/SettingsAdapter.java @@ -0,0 +1,487 @@ +package org.citra.citra_emu.features.settings.ui; + +import android.content.Context; +import android.content.DialogInterface; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.widget.DatePicker; +import android.widget.SeekBar; +import android.widget.TextView; +import android.widget.TimePicker; + +import androidx.appcompat.app.AlertDialog; +import androidx.recyclerview.widget.RecyclerView; + +import org.citra.citra_emu.R; +import org.citra.citra_emu.dialogs.MotionAlertDialog; +import org.citra.citra_emu.features.settings.model.FloatSetting; +import org.citra.citra_emu.features.settings.model.IntSetting; +import org.citra.citra_emu.features.settings.model.StringSetting; +import org.citra.citra_emu.features.settings.model.view.CheckBoxSetting; +import org.citra.citra_emu.features.settings.model.view.DateTimeSetting; +import org.citra.citra_emu.features.settings.model.view.InputBindingSetting; +import org.citra.citra_emu.features.settings.model.view.PremiumSingleChoiceSetting; +import org.citra.citra_emu.features.settings.model.view.SettingsItem; +import org.citra.citra_emu.features.settings.model.view.SingleChoiceSetting; +import org.citra.citra_emu.features.settings.model.view.SliderSetting; +import org.citra.citra_emu.features.settings.model.view.StringSingleChoiceSetting; +import org.citra.citra_emu.features.settings.model.view.SubmenuSetting; +import org.citra.citra_emu.features.settings.ui.viewholder.CheckBoxSettingViewHolder; +import org.citra.citra_emu.features.settings.ui.viewholder.DateTimeViewHolder; +import org.citra.citra_emu.features.settings.ui.viewholder.HeaderViewHolder; +import org.citra.citra_emu.features.settings.ui.viewholder.InputBindingSettingViewHolder; +import org.citra.citra_emu.features.settings.ui.viewholder.PremiumViewHolder; +import org.citra.citra_emu.features.settings.ui.viewholder.SettingViewHolder; +import org.citra.citra_emu.features.settings.ui.viewholder.SingleChoiceViewHolder; +import org.citra.citra_emu.features.settings.ui.viewholder.SliderViewHolder; +import org.citra.citra_emu.features.settings.ui.viewholder.SubmenuViewHolder; +import org.citra.citra_emu.ui.main.MainActivity; +import org.citra.citra_emu.utils.Log; + +import java.util.ArrayList; + +public final class SettingsAdapter extends RecyclerView.Adapter + implements DialogInterface.OnClickListener, SeekBar.OnSeekBarChangeListener { + private SettingsFragmentView mView; + private Context mContext; + private ArrayList mSettings; + + private SettingsItem mClickedItem; + private int mClickedPosition; + private int mSeekbarProgress; + + private AlertDialog mDialog; + private TextView mTextSliderValue; + + public SettingsAdapter(SettingsFragmentView view, Context context) { + mView = view; + mContext = context; + mClickedPosition = -1; + } + + @Override + public SettingViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { + View view; + LayoutInflater inflater = LayoutInflater.from(parent.getContext()); + + switch (viewType) { + case SettingsItem.TYPE_HEADER: + view = inflater.inflate(R.layout.list_item_settings_header, parent, false); + return new HeaderViewHolder(view, this); + + case SettingsItem.TYPE_CHECKBOX: + view = inflater.inflate(R.layout.list_item_setting_checkbox, parent, false); + return new CheckBoxSettingViewHolder(view, this); + + case SettingsItem.TYPE_SINGLE_CHOICE: + case SettingsItem.TYPE_STRING_SINGLE_CHOICE: + view = inflater.inflate(R.layout.list_item_setting, parent, false); + return new SingleChoiceViewHolder(view, this); + + case SettingsItem.TYPE_SLIDER: + view = inflater.inflate(R.layout.list_item_setting, parent, false); + return new SliderViewHolder(view, this); + + case SettingsItem.TYPE_SUBMENU: + view = inflater.inflate(R.layout.list_item_setting, parent, false); + return new SubmenuViewHolder(view, this); + + case SettingsItem.TYPE_INPUT_BINDING: + view = inflater.inflate(R.layout.list_item_setting, parent, false); + return new InputBindingSettingViewHolder(view, this, mContext); + + case SettingsItem.TYPE_DATETIME_SETTING: + view = inflater.inflate(R.layout.list_item_setting, parent, false); + return new DateTimeViewHolder(view, this); + + case SettingsItem.TYPE_PREMIUM: + view = inflater.inflate(R.layout.premium_item_setting, parent, false); + return new PremiumViewHolder(view, this, mView); + + default: + Log.error("[SettingsAdapter] Invalid view type: " + viewType); + return null; + } + } + + @Override + public void onBindViewHolder(SettingViewHolder holder, int position) { + holder.bind(getItem(position)); + } + + private SettingsItem getItem(int position) { + return mSettings.get(position); + } + + @Override + public int getItemCount() { + if (mSettings != null) { + return mSettings.size(); + } else { + return 0; + } + } + + @Override + public int getItemViewType(int position) { + return getItem(position).getType(); + } + + public void setSettings(ArrayList settings) { + mSettings = settings; + notifyDataSetChanged(); + } + + public void onBooleanClick(CheckBoxSetting item, int position, boolean checked) { + IntSetting setting = item.setChecked(checked); + notifyItemChanged(position); + + if (setting != null) { + mView.putSetting(setting); + } + + mView.onSettingChanged(); + } + + public void onSingleChoiceClick(PremiumSingleChoiceSetting item) { + mClickedItem = item; + + int value = getSelectionForSingleChoiceValue(item); + + AlertDialog.Builder builder = new AlertDialog.Builder(mView.getActivity()); + + builder.setTitle(item.getNameId()); + builder.setSingleChoiceItems(item.getChoicesId(), value, this); + + mDialog = builder.show(); + } + + public void onSingleChoiceClick(SingleChoiceSetting item) { + mClickedItem = item; + + int value = getSelectionForSingleChoiceValue(item); + + AlertDialog.Builder builder = new AlertDialog.Builder(mView.getActivity()); + + builder.setTitle(item.getNameId()); + builder.setSingleChoiceItems(item.getChoicesId(), value, this); + + mDialog = builder.show(); + } + + public void onSingleChoiceClick(SingleChoiceSetting item, int position) { + mClickedPosition = position; + + if (!item.isPremium() || MainActivity.isPremiumActive()) { + // Setting is either not Premium, or the user has Premium + onSingleChoiceClick(item); + return; + } + + // User needs Premium, invoke the billing flow + MainActivity.invokePremiumBilling(() -> onSingleChoiceClick(item)); + } + + public void onSingleChoiceClick(PremiumSingleChoiceSetting item, int position) { + mClickedPosition = position; + + if (!item.isPremium() || MainActivity.isPremiumActive()) { + // Setting is either not Premium, or the user has Premium + onSingleChoiceClick(item); + return; + } + + // User needs Premium, invoke the billing flow + MainActivity.invokePremiumBilling(() -> onSingleChoiceClick(item)); + } + + public void onStringSingleChoiceClick(StringSingleChoiceSetting item) { + mClickedItem = item; + + AlertDialog.Builder builder = new AlertDialog.Builder(mView.getActivity()); + + builder.setTitle(item.getNameId()); + builder.setSingleChoiceItems(item.getChoicesId(), item.getSelectValueIndex(), this); + + mDialog = builder.show(); + } + + public void onStringSingleChoiceClick(StringSingleChoiceSetting item, int position) { + mClickedPosition = position; + + if (!item.isPremium() || MainActivity.isPremiumActive()) { + // Setting is either not Premium, or the user has Premium + onStringSingleChoiceClick(item); + return; + } + + // User needs Premium, invoke the billing flow + MainActivity.invokePremiumBilling(() -> onStringSingleChoiceClick(item)); + } + + DialogInterface.OnClickListener defaultCancelListener = (dialog, which) -> closeDialog(); + + public void onDateTimeClick(DateTimeSetting item, int position) { + mClickedItem = item; + mClickedPosition = position; + + AlertDialog.Builder builder = new AlertDialog.Builder(mView.getActivity()); + + LayoutInflater inflater = LayoutInflater.from(mView.getActivity()); + View view = inflater.inflate(R.layout.sysclock_datetime_picker, null); + + DatePicker dp = view.findViewById(R.id.date_picker); + TimePicker tp = view.findViewById(R.id.time_picker); + + //set date and time to substrings of settingValue; format = 2018-12-24 04:20:69 (alright maybe not that 69) + String settingValue = item.getValue(); + dp.updateDate(Integer.parseInt(settingValue.substring(0, 4)), Integer.parseInt(settingValue.substring(5, 7)) - 1, Integer.parseInt(settingValue.substring(8, 10))); + + tp.setIs24HourView(true); + tp.setHour(Integer.parseInt(settingValue.substring(11, 13))); + tp.setMinute(Integer.parseInt(settingValue.substring(14, 16))); + + DialogInterface.OnClickListener ok = (dialog, which) -> { + //set it + int year = dp.getYear(); + if (year < 2000) { + year = 2000; + } + String month = ("00" + (dp.getMonth() + 1)).substring(String.valueOf(dp.getMonth() + 1).length()); + String day = ("00" + dp.getDayOfMonth()).substring(String.valueOf(dp.getDayOfMonth()).length()); + String hr = ("00" + tp.getHour()).substring(String.valueOf(tp.getHour()).length()); + String min = ("00" + tp.getMinute()).substring(String.valueOf(tp.getMinute()).length()); + String datetime = year + "-" + month + "-" + day + " " + hr + ":" + min + ":01"; + + StringSetting setting = item.setSelectedValue(datetime); + if (setting != null) { + mView.putSetting(setting); + } + + mView.onSettingChanged(); + + mClickedItem = null; + closeDialog(); + }; + + builder.setView(view); + builder.setPositiveButton(android.R.string.ok, ok); + builder.setNegativeButton(android.R.string.cancel, defaultCancelListener); + mDialog = builder.show(); + } + + public void onSliderClick(SliderSetting item, int position) { + mClickedItem = item; + mClickedPosition = position; + mSeekbarProgress = item.getSelectedValue(); + AlertDialog.Builder builder = new AlertDialog.Builder(mView.getActivity()); + + LayoutInflater inflater = LayoutInflater.from(mView.getActivity()); + View view = inflater.inflate(R.layout.dialog_seekbar, null); + + SeekBar seekbar = view.findViewById(R.id.seekbar); + + builder.setTitle(item.getNameId()); + builder.setView(view); + builder.setPositiveButton(android.R.string.ok, this); + builder.setNegativeButton(android.R.string.cancel, defaultCancelListener); + builder.setNeutralButton(R.string.slider_default, (DialogInterface dialog, int which) -> { + seekbar.setProgress(item.getDefaultValue()); + onClick(dialog, which); + }); + mDialog = builder.show(); + + mTextSliderValue = view.findViewById(R.id.text_value); + mTextSliderValue.setText(String.valueOf(mSeekbarProgress)); + + TextView units = view.findViewById(R.id.text_units); + units.setText(item.getUnits()); + + seekbar.setMin(item.getMin()); + seekbar.setMax(item.getMax()); + seekbar.setProgress(mSeekbarProgress); + + seekbar.setOnSeekBarChangeListener(this); + } + + public void onSubmenuClick(SubmenuSetting item) { + mView.loadSubMenu(item.getMenuKey()); + } + + public void onInputBindingClick(final InputBindingSetting item, final int position) { + final MotionAlertDialog dialog = new MotionAlertDialog(mContext, item); + dialog.setTitle(R.string.input_binding); + + int messageResId = R.string.input_binding_description; + if (item.IsAxisMappingSupported() && !item.IsTrigger()) { + // Use specialized message for axis left/right or up/down + if (item.IsHorizontalOrientation()) { + messageResId = R.string.input_binding_description_horizontal_axis; + } else { + messageResId = R.string.input_binding_description_vertical_axis; + } + } + + dialog.setMessage(String.format(mContext.getString(messageResId), mContext.getString(item.getNameId()))); + dialog.setButton(AlertDialog.BUTTON_NEGATIVE, mContext.getString(android.R.string.cancel), this); + dialog.setButton(AlertDialog.BUTTON_NEUTRAL, mContext.getString(R.string.clear), (dialogInterface, i) -> + item.removeOldMapping()); + dialog.setOnDismissListener(dialog1 -> + { + StringSetting setting = new StringSetting(item.getKey(), item.getSection(), item.getValue()); + notifyItemChanged(position); + + mView.putSetting(setting); + + mView.onSettingChanged(); + }); + dialog.setCanceledOnTouchOutside(false); + dialog.show(); + } + + @Override + public void onClick(DialogInterface dialog, int which) { + if (mClickedItem instanceof SingleChoiceSetting) { + SingleChoiceSetting scSetting = (SingleChoiceSetting) mClickedItem; + + int value = getValueForSingleChoiceSelection(scSetting, which); + if (scSetting.getSelectedValue() != value) { + mView.onSettingChanged(); + } + + // Get the backing Setting, which may be null (if for example it was missing from the file) + IntSetting setting = scSetting.setSelectedValue(value); + if (setting != null) { + mView.putSetting(setting); + } + + closeDialog(); + } else if (mClickedItem instanceof PremiumSingleChoiceSetting) { + PremiumSingleChoiceSetting scSetting = (PremiumSingleChoiceSetting) mClickedItem; + scSetting.setSelectedValue(getValueForSingleChoiceSelection(scSetting, which)); + closeDialog(); + } else if (mClickedItem instanceof StringSingleChoiceSetting) { + StringSingleChoiceSetting scSetting = (StringSingleChoiceSetting) mClickedItem; + String value = scSetting.getValueAt(which); + if (!scSetting.getSelectedValue().equals(value)) + mView.onSettingChanged(); + + StringSetting setting = scSetting.setSelectedValue(value); + if (setting != null) { + mView.putSetting(setting); + } + + closeDialog(); + } else if (mClickedItem instanceof SliderSetting) { + SliderSetting sliderSetting = (SliderSetting) mClickedItem; + if (sliderSetting.getSelectedValue() != mSeekbarProgress) { + mView.onSettingChanged(); + } + + if (sliderSetting.getSetting() instanceof FloatSetting) { + float value = (float) mSeekbarProgress; + + FloatSetting setting = sliderSetting.setSelectedValue(value); + if (setting != null) { + mView.putSetting(setting); + } + } else { + IntSetting setting = sliderSetting.setSelectedValue(mSeekbarProgress); + if (setting != null) { + mView.putSetting(setting); + } + } + + closeDialog(); + } + + mClickedItem = null; + mSeekbarProgress = -1; + } + + public void closeDialog() { + if (mDialog != null) { + if (mClickedPosition != -1) { + notifyItemChanged(mClickedPosition); + mClickedPosition = -1; + } + mDialog.dismiss(); + mDialog = null; + } + } + + @Override + public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) { + mSeekbarProgress = progress; + mTextSliderValue.setText(String.valueOf(mSeekbarProgress)); + } + + @Override + public void onStartTrackingTouch(SeekBar seekBar) { + } + + @Override + public void onStopTrackingTouch(SeekBar seekBar) { + } + + private int getValueForSingleChoiceSelection(SingleChoiceSetting item, int which) { + int valuesId = item.getValuesId(); + + if (valuesId > 0) { + int[] valuesArray = mContext.getResources().getIntArray(valuesId); + return valuesArray[which]; + } else { + return which; + } + } + + private int getValueForSingleChoiceSelection(PremiumSingleChoiceSetting item, int which) { + int valuesId = item.getValuesId(); + + if (valuesId > 0) { + int[] valuesArray = mContext.getResources().getIntArray(valuesId); + return valuesArray[which]; + } else { + return which; + } + } + + private int getSelectionForSingleChoiceValue(SingleChoiceSetting item) { + int value = item.getSelectedValue(); + int valuesId = item.getValuesId(); + + if (valuesId > 0) { + int[] valuesArray = mContext.getResources().getIntArray(valuesId); + for (int index = 0; index < valuesArray.length; index++) { + int current = valuesArray[index]; + if (current == value) { + return index; + } + } + } else { + return value; + } + + return -1; + } + + private int getSelectionForSingleChoiceValue(PremiumSingleChoiceSetting item) { + int value = item.getSelectedValue(); + int valuesId = item.getValuesId(); + + if (valuesId > 0) { + int[] valuesArray = mContext.getResources().getIntArray(valuesId); + for (int index = 0; index < valuesArray.length; index++) { + int current = valuesArray[index]; + if (current == value) { + return index; + } + } + } else { + return value; + } + + return -1; + } +} diff --git a/src/android/app/src/main/java/org/citra/citra_emu/features/settings/ui/SettingsFragment.java b/src/android/app/src/main/java/org/citra/citra_emu/features/settings/ui/SettingsFragment.java new file mode 100644 index 000000000..5799dcb8d --- /dev/null +++ b/src/android/app/src/main/java/org/citra/citra_emu/features/settings/ui/SettingsFragment.java @@ -0,0 +1,136 @@ +package org.citra.citra_emu.features.settings.ui; + +import android.content.Context; +import android.os.Bundle; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; + +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; +import androidx.fragment.app.Fragment; +import androidx.recyclerview.widget.LinearLayoutManager; +import androidx.recyclerview.widget.RecyclerView; + +import org.citra.citra_emu.R; +import org.citra.citra_emu.features.settings.model.Setting; +import org.citra.citra_emu.features.settings.model.Settings; +import org.citra.citra_emu.features.settings.model.view.SettingsItem; +import org.citra.citra_emu.ui.DividerItemDecoration; + +import java.util.ArrayList; + +public final class SettingsFragment extends Fragment implements SettingsFragmentView { + private static final String ARGUMENT_MENU_TAG = "menu_tag"; + private static final String ARGUMENT_GAME_ID = "game_id"; + + private SettingsFragmentPresenter mPresenter = new SettingsFragmentPresenter(this); + private SettingsActivityView mActivity; + + private SettingsAdapter mAdapter; + + public static Fragment newInstance(String menuTag, String gameId) { + SettingsFragment fragment = new SettingsFragment(); + + Bundle arguments = new Bundle(); + arguments.putString(ARGUMENT_MENU_TAG, menuTag); + arguments.putString(ARGUMENT_GAME_ID, gameId); + + fragment.setArguments(arguments); + return fragment; + } + + @Override + public void onAttach(@NonNull Context context) { + super.onAttach(context); + + mActivity = (SettingsActivityView) context; + mPresenter.onAttach(); + } + + @Override + public void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + + setRetainInstance(true); + String menuTag = getArguments().getString(ARGUMENT_MENU_TAG); + String gameId = getArguments().getString(ARGUMENT_GAME_ID); + + mAdapter = new SettingsAdapter(this, getActivity()); + + mPresenter.onCreate(menuTag, gameId); + } + + @Nullable + @Override + public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { + return inflater.inflate(R.layout.fragment_settings, container, false); + } + + @Override + public void onViewCreated(View view, @Nullable Bundle savedInstanceState) { + LinearLayoutManager manager = new LinearLayoutManager(getActivity()); + + RecyclerView recyclerView = view.findViewById(R.id.list_settings); + + recyclerView.setAdapter(mAdapter); + recyclerView.setLayoutManager(manager); + recyclerView.addItemDecoration(new DividerItemDecoration(getActivity(), null)); + + SettingsActivityView activity = (SettingsActivityView) getActivity(); + + mPresenter.onViewCreated(activity.getSettings()); + } + + @Override + public void onDetach() { + super.onDetach(); + mActivity = null; + + if (mAdapter != null) { + mAdapter.closeDialog(); + } + } + + @Override + public void onSettingsFileLoaded(Settings settings) { + mPresenter.setSettings(settings); + } + + @Override + public void passSettingsToActivity(Settings settings) { + if (mActivity != null) { + mActivity.setSettings(settings); + } + } + + @Override + public void showSettingsList(ArrayList settingsList) { + mAdapter.setSettings(settingsList); + } + + @Override + public void loadDefaultSettings() { + mPresenter.loadDefaultSettings(); + } + + @Override + public void loadSubMenu(String menuKey) { + mActivity.showSettingsFragment(menuKey, true, getArguments().getString(ARGUMENT_GAME_ID)); + } + + @Override + public void showToastMessage(String message, boolean is_long) { + mActivity.showToastMessage(message, is_long); + } + + @Override + public void putSetting(Setting setting) { + mPresenter.putSetting(setting); + } + + @Override + public void onSettingChanged() { + mActivity.onSettingChanged(); + } +} diff --git a/src/android/app/src/main/java/org/citra/citra_emu/features/settings/ui/SettingsFragmentPresenter.java b/src/android/app/src/main/java/org/citra/citra_emu/features/settings/ui/SettingsFragmentPresenter.java new file mode 100644 index 000000000..f845e9ce8 --- /dev/null +++ b/src/android/app/src/main/java/org/citra/citra_emu/features/settings/ui/SettingsFragmentPresenter.java @@ -0,0 +1,411 @@ +package org.citra.citra_emu.features.settings.ui; + +import android.app.Activity; +import android.content.Context; +import android.hardware.camera2.CameraAccessException; +import android.hardware.camera2.CameraCharacteristics; +import android.hardware.camera2.CameraManager; +import android.text.TextUtils; + +import org.citra.citra_emu.NativeLibrary; +import org.citra.citra_emu.R; +import org.citra.citra_emu.features.settings.model.Setting; +import org.citra.citra_emu.features.settings.model.SettingSection; +import org.citra.citra_emu.features.settings.model.Settings; +import org.citra.citra_emu.features.settings.model.StringSetting; +import org.citra.citra_emu.features.settings.model.view.CheckBoxSetting; +import org.citra.citra_emu.features.settings.model.view.DateTimeSetting; +import org.citra.citra_emu.features.settings.model.view.HeaderSetting; +import org.citra.citra_emu.features.settings.model.view.InputBindingSetting; +import org.citra.citra_emu.features.settings.model.view.PremiumHeader; +import org.citra.citra_emu.features.settings.model.view.PremiumSingleChoiceSetting; +import org.citra.citra_emu.features.settings.model.view.SettingsItem; +import org.citra.citra_emu.features.settings.model.view.SingleChoiceSetting; +import org.citra.citra_emu.features.settings.model.view.SliderSetting; +import org.citra.citra_emu.features.settings.model.view.StringSingleChoiceSetting; +import org.citra.citra_emu.features.settings.model.view.SubmenuSetting; +import org.citra.citra_emu.features.settings.utils.SettingsFile; +import org.citra.citra_emu.utils.Log; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Objects; + +public final class SettingsFragmentPresenter { + private SettingsFragmentView mView; + + private String mMenuTag; + private String mGameID; + + private Settings mSettings; + private ArrayList mSettingsList; + + public SettingsFragmentPresenter(SettingsFragmentView view) { + mView = view; + } + + public void onCreate(String menuTag, String gameId) { + mGameID = gameId; + mMenuTag = menuTag; + } + + public void onViewCreated(Settings settings) { + setSettings(settings); + } + + /** + * If the screen is rotated, the Activity will forget the settings map. This fragment + * won't, though; so rather than have the Activity reload from disk, have the fragment pass + * the settings map back to the Activity. + */ + public void onAttach() { + if (mSettings != null) { + mView.passSettingsToActivity(mSettings); + } + } + + public void putSetting(Setting setting) { + mSettings.getSection(setting.getSection()).putSetting(setting); + } + + private StringSetting asStringSetting(Setting setting) { + if (setting == null) { + return null; + } + + StringSetting stringSetting = new StringSetting(setting.getKey(), setting.getSection(), setting.getValueAsString()); + putSetting(stringSetting); + return stringSetting; + } + + public void loadDefaultSettings() { + loadSettingsList(); + } + + public void setSettings(Settings settings) { + if (mSettingsList == null && settings != null) { + mSettings = settings; + + loadSettingsList(); + } else { + mView.getActivity().setTitle(R.string.preferences_settings); + mView.showSettingsList(mSettingsList); + } + } + + private void loadSettingsList() { + if (!TextUtils.isEmpty(mGameID)) { + mView.getActivity().setTitle("Game Settings: " + mGameID); + } + ArrayList sl = new ArrayList<>(); + + if (mMenuTag == null) { + return; + } + + switch (mMenuTag) { + case SettingsFile.FILE_NAME_CONFIG: + addConfigSettings(sl); + break; + case Settings.SECTION_PREMIUM: + addPremiumSettings(sl); + break; + case Settings.SECTION_CORE: + addGeneralSettings(sl); + break; + case Settings.SECTION_SYSTEM: + addSystemSettings(sl); + break; + case Settings.SECTION_CAMERA: + addCameraSettings(sl); + break; + case Settings.SECTION_CONTROLS: + addInputSettings(sl); + break; + case Settings.SECTION_RENDERER: + addGraphicsSettings(sl); + break; + case Settings.SECTION_AUDIO: + addAudioSettings(sl); + break; + case Settings.SECTION_DEBUG: + addDebugSettings(sl); + break; + default: + mView.showToastMessage("Unimplemented menu", false); + return; + } + + mSettingsList = sl; + mView.showSettingsList(mSettingsList); + } + + private void addConfigSettings(ArrayList sl) { + mView.getActivity().setTitle(R.string.preferences_settings); + + sl.add(new SubmenuSetting(null, null, R.string.preferences_premium, 0, Settings.SECTION_PREMIUM)); + sl.add(new SubmenuSetting(null, null, R.string.preferences_general, 0, Settings.SECTION_CORE)); + sl.add(new SubmenuSetting(null, null, R.string.preferences_system, 0, Settings.SECTION_SYSTEM)); + sl.add(new SubmenuSetting(null, null, R.string.preferences_camera, 0, Settings.SECTION_CAMERA)); + sl.add(new SubmenuSetting(null, null, R.string.preferences_controls, 0, Settings.SECTION_CONTROLS)); + sl.add(new SubmenuSetting(null, null, R.string.preferences_graphics, 0, Settings.SECTION_RENDERER)); + sl.add(new SubmenuSetting(null, null, R.string.preferences_audio, 0, Settings.SECTION_AUDIO)); + sl.add(new SubmenuSetting(null, null, R.string.preferences_debug, 0, Settings.SECTION_DEBUG)); + } + + private void addPremiumSettings(ArrayList sl) { + mView.getActivity().setTitle(R.string.preferences_premium); + + SettingSection premiumSection = mSettings.getSection(Settings.SECTION_PREMIUM); + Setting design = premiumSection.getSetting(SettingsFile.KEY_DESIGN); + + sl.add(new PremiumHeader()); + + if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.Q) { + sl.add(new PremiumSingleChoiceSetting(SettingsFile.KEY_DESIGN, Settings.SECTION_PREMIUM, R.string.design, 0, R.array.designNames, R.array.designValues, 0, design, mView)); + } else { + // Pre-Android 10 does not support System Default + sl.add(new PremiumSingleChoiceSetting(SettingsFile.KEY_DESIGN, Settings.SECTION_PREMIUM, R.string.design, 0, R.array.designNamesOld, R.array.designValuesOld, 0, design, mView)); + } + + String[] textureFilterNames = NativeLibrary.GetTextureFilterNames(); + Setting textureFilterName = premiumSection.getSetting(SettingsFile.KEY_TEXTURE_FILTER_NAME); + sl.add(new StringSingleChoiceSetting(SettingsFile.KEY_TEXTURE_FILTER_NAME, Settings.SECTION_PREMIUM, R.string.texture_filter_name, R.string.texture_filter_description, textureFilterNames, textureFilterNames, "none", textureFilterName)); + } + + private void addGeneralSettings(ArrayList sl) { + mView.getActivity().setTitle(R.string.preferences_general); + + SettingSection rendererSection = mSettings.getSection(Settings.SECTION_RENDERER); + Setting frameLimitEnable = rendererSection.getSetting(SettingsFile.KEY_FRAME_LIMIT_ENABLED); + Setting frameLimitValue = rendererSection.getSetting(SettingsFile.KEY_FRAME_LIMIT); + + sl.add(new CheckBoxSetting(SettingsFile.KEY_FRAME_LIMIT_ENABLED, Settings.SECTION_RENDERER, R.string.frame_limit_enable, R.string.frame_limit_enable_description, true, frameLimitEnable)); + sl.add(new SliderSetting(SettingsFile.KEY_FRAME_LIMIT, Settings.SECTION_RENDERER, R.string.frame_limit_slider, R.string.frame_limit_slider_description, 1, 200, "%", 100, frameLimitValue)); + } + + private void addSystemSettings(ArrayList sl) { + mView.getActivity().setTitle(R.string.preferences_system); + + SettingSection systemSection = mSettings.getSection(Settings.SECTION_SYSTEM); + Setting region = systemSection.getSetting(SettingsFile.KEY_REGION_VALUE); + Setting language = systemSection.getSetting(SettingsFile.KEY_LANGUAGE); + Setting systemClock = systemSection.getSetting(SettingsFile.KEY_INIT_CLOCK); + Setting dateTime = systemSection.getSetting(SettingsFile.KEY_INIT_TIME); + + sl.add(new SingleChoiceSetting(SettingsFile.KEY_REGION_VALUE, Settings.SECTION_SYSTEM, R.string.emulated_region, 0, R.array.regionNames, R.array.regionValues, -1, region)); + sl.add(new SingleChoiceSetting(SettingsFile.KEY_LANGUAGE, Settings.SECTION_SYSTEM, R.string.emulated_language, 0, R.array.languageNames, R.array.languageValues, 1, language)); + sl.add(new SingleChoiceSetting(SettingsFile.KEY_INIT_CLOCK, Settings.SECTION_SYSTEM, R.string.init_clock, R.string.init_clock_description, R.array.systemClockNames, R.array.systemClockValues, 0, systemClock)); + sl.add(new DateTimeSetting(SettingsFile.KEY_INIT_TIME, Settings.SECTION_SYSTEM, R.string.init_time, R.string.init_time_description, "2000-01-01 00:00:01", dateTime)); + } + + private void addCameraSettings(ArrayList sl) { + final Activity activity = mView.getActivity(); + activity.setTitle(R.string.preferences_camera); + + // Get the camera IDs + CameraManager cameraManager = (CameraManager) activity.getSystemService(Context.CAMERA_SERVICE); + ArrayList supportedCameraNameList = new ArrayList<>(); + ArrayList supportedCameraIdList = new ArrayList<>(); + if (cameraManager != null) { + try { + for (String id : cameraManager.getCameraIdList()) { + final CameraCharacteristics characteristics = cameraManager.getCameraCharacteristics(id); + if (Objects.requireNonNull(characteristics.get(CameraCharacteristics.INFO_SUPPORTED_HARDWARE_LEVEL)) == CameraCharacteristics.INFO_SUPPORTED_HARDWARE_LEVEL_LEGACY) { + continue; // Legacy cameras cannot be used with the NDK + } + + supportedCameraIdList.add(id); + + final int facing = Objects.requireNonNull(characteristics.get(CameraCharacteristics.LENS_FACING)); + int stringId = R.string.camera_facing_external; + switch (facing) { + case CameraCharacteristics.LENS_FACING_FRONT: + stringId = R.string.camera_facing_front; + break; + case CameraCharacteristics.LENS_FACING_BACK: + stringId = R.string.camera_facing_back; + break; + case CameraCharacteristics.LENS_FACING_EXTERNAL: + stringId = R.string.camera_facing_external; + break; + } + supportedCameraNameList.add(String.format("%1$s (%2$s)", id, activity.getString(stringId))); + } + } catch (CameraAccessException e) { + Log.error("Couldn't retrieve camera list"); + e.printStackTrace(); + } + } + + // Create the names and values for display + ArrayList cameraDeviceNameList = new ArrayList<>(Arrays.asList(activity.getResources().getStringArray(R.array.cameraDeviceNames))); + cameraDeviceNameList.addAll(supportedCameraNameList); + ArrayList cameraDeviceValueList = new ArrayList<>(Arrays.asList(activity.getResources().getStringArray(R.array.cameraDeviceValues))); + cameraDeviceValueList.addAll(supportedCameraIdList); + + final String[] cameraDeviceNames = cameraDeviceNameList.toArray(new String[]{}); + final String[] cameraDeviceValues = cameraDeviceValueList.toArray(new String[]{}); + + final boolean haveCameraDevices = !supportedCameraIdList.isEmpty(); + + String[] imageSourceNames = activity.getResources().getStringArray(R.array.cameraImageSourceNames); + String[] imageSourceValues = activity.getResources().getStringArray(R.array.cameraImageSourceValues); + if (!haveCameraDevices) { + // Remove the last entry (ndk / Device Camera) + imageSourceNames = Arrays.copyOfRange(imageSourceNames, 0, imageSourceNames.length - 1); + imageSourceValues = Arrays.copyOfRange(imageSourceValues, 0, imageSourceValues.length - 1); + } + + final String defaultImageSource = haveCameraDevices ? "ndk" : "image"; + + SettingSection cameraSection = mSettings.getSection(Settings.SECTION_CAMERA); + + Setting innerCameraImageSource = cameraSection.getSetting(SettingsFile.KEY_CAMERA_INNER_NAME); + Setting innerCameraConfig = asStringSetting(cameraSection.getSetting(SettingsFile.KEY_CAMERA_INNER_CONFIG)); + Setting innerCameraFlip = cameraSection.getSetting(SettingsFile.KEY_CAMERA_INNER_FLIP); + sl.add(new HeaderSetting(null, null, R.string.inner_camera, 0)); + sl.add(new StringSingleChoiceSetting(SettingsFile.KEY_CAMERA_INNER_NAME, Settings.SECTION_CAMERA, R.string.image_source, R.string.image_source_description, imageSourceNames, imageSourceValues, defaultImageSource, innerCameraImageSource)); + if (haveCameraDevices) + sl.add(new StringSingleChoiceSetting(SettingsFile.KEY_CAMERA_INNER_CONFIG, Settings.SECTION_CAMERA, R.string.camera_device, R.string.camera_device_description, cameraDeviceNames, cameraDeviceValues, "_front", innerCameraConfig)); + sl.add(new SingleChoiceSetting(SettingsFile.KEY_CAMERA_INNER_FLIP, Settings.SECTION_CAMERA, R.string.image_flip, 0, R.array.cameraFlipNames, R.array.cameraFlipValues, 0, innerCameraFlip)); + + Setting outerLeftCameraImageSource = cameraSection.getSetting(SettingsFile.KEY_CAMERA_OUTER_LEFT_NAME); + Setting outerLeftCameraConfig = asStringSetting(cameraSection.getSetting(SettingsFile.KEY_CAMERA_OUTER_LEFT_CONFIG)); + Setting outerLeftCameraFlip = cameraSection.getSetting(SettingsFile.KEY_CAMERA_OUTER_LEFT_FLIP); + sl.add(new HeaderSetting(null, null, R.string.outer_left_camera, 0)); + sl.add(new StringSingleChoiceSetting(SettingsFile.KEY_CAMERA_OUTER_LEFT_NAME, Settings.SECTION_CAMERA, R.string.image_source, R.string.image_source_description, imageSourceNames, imageSourceValues, defaultImageSource, outerLeftCameraImageSource)); + if (haveCameraDevices) + sl.add(new StringSingleChoiceSetting(SettingsFile.KEY_CAMERA_OUTER_LEFT_CONFIG, Settings.SECTION_CAMERA, R.string.camera_device, R.string.camera_device_description, cameraDeviceNames, cameraDeviceValues, "_back", outerLeftCameraConfig)); + sl.add(new SingleChoiceSetting(SettingsFile.KEY_CAMERA_OUTER_LEFT_FLIP, Settings.SECTION_CAMERA, R.string.image_flip, 0, R.array.cameraFlipNames, R.array.cameraFlipValues, 0, outerLeftCameraFlip)); + + Setting outerRightCameraImageSource = cameraSection.getSetting(SettingsFile.KEY_CAMERA_OUTER_RIGHT_NAME); + Setting outerRightCameraConfig = asStringSetting(cameraSection.getSetting(SettingsFile.KEY_CAMERA_OUTER_RIGHT_CONFIG)); + Setting outerRightCameraFlip = cameraSection.getSetting(SettingsFile.KEY_CAMERA_OUTER_RIGHT_FLIP); + sl.add(new HeaderSetting(null, null, R.string.outer_right_camera, 0)); + sl.add(new StringSingleChoiceSetting(SettingsFile.KEY_CAMERA_OUTER_RIGHT_NAME, Settings.SECTION_CAMERA, R.string.image_source, R.string.image_source_description, imageSourceNames, imageSourceValues, defaultImageSource, outerRightCameraImageSource)); + if (haveCameraDevices) + sl.add(new StringSingleChoiceSetting(SettingsFile.KEY_CAMERA_OUTER_RIGHT_CONFIG, Settings.SECTION_CAMERA, R.string.camera_device, R.string.camera_device_description, cameraDeviceNames, cameraDeviceValues, "_back", outerRightCameraConfig)); + sl.add(new SingleChoiceSetting(SettingsFile.KEY_CAMERA_OUTER_RIGHT_FLIP, Settings.SECTION_CAMERA, R.string.image_flip, 0, R.array.cameraFlipNames, R.array.cameraFlipValues, 0, outerRightCameraFlip)); + } + + private void addInputSettings(ArrayList sl) { + mView.getActivity().setTitle(R.string.preferences_controls); + + SettingSection controlsSection = mSettings.getSection(Settings.SECTION_CONTROLS); + Setting buttonA = controlsSection.getSetting(SettingsFile.KEY_BUTTON_A); + Setting buttonB = controlsSection.getSetting(SettingsFile.KEY_BUTTON_B); + Setting buttonX = controlsSection.getSetting(SettingsFile.KEY_BUTTON_X); + Setting buttonY = controlsSection.getSetting(SettingsFile.KEY_BUTTON_Y); + Setting buttonSelect = controlsSection.getSetting(SettingsFile.KEY_BUTTON_SELECT); + Setting buttonStart = controlsSection.getSetting(SettingsFile.KEY_BUTTON_START); + Setting circlepadAxisVert = controlsSection.getSetting(SettingsFile.KEY_CIRCLEPAD_AXIS_VERTICAL); + Setting circlepadAxisHoriz = controlsSection.getSetting(SettingsFile.KEY_CIRCLEPAD_AXIS_HORIZONTAL); + Setting cstickAxisVert = controlsSection.getSetting(SettingsFile.KEY_CSTICK_AXIS_VERTICAL); + Setting cstickAxisHoriz = controlsSection.getSetting(SettingsFile.KEY_CSTICK_AXIS_HORIZONTAL); + Setting dpadAxisVert = controlsSection.getSetting(SettingsFile.KEY_DPAD_AXIS_VERTICAL); + Setting dpadAxisHoriz = controlsSection.getSetting(SettingsFile.KEY_DPAD_AXIS_HORIZONTAL); + // Setting buttonUp = controlsSection.getSetting(SettingsFile.KEY_BUTTON_UP); + // Setting buttonDown = controlsSection.getSetting(SettingsFile.KEY_BUTTON_DOWN); + // Setting buttonLeft = controlsSection.getSetting(SettingsFile.KEY_BUTTON_LEFT); + // Setting buttonRight = controlsSection.getSetting(SettingsFile.KEY_BUTTON_RIGHT); + Setting buttonL = controlsSection.getSetting(SettingsFile.KEY_BUTTON_L); + Setting buttonR = controlsSection.getSetting(SettingsFile.KEY_BUTTON_R); + Setting buttonZL = controlsSection.getSetting(SettingsFile.KEY_BUTTON_ZL); + Setting buttonZR = controlsSection.getSetting(SettingsFile.KEY_BUTTON_ZR); + + sl.add(new HeaderSetting(null, null, R.string.generic_buttons, 0)); + sl.add(new InputBindingSetting(SettingsFile.KEY_BUTTON_A, Settings.SECTION_CONTROLS, R.string.button_a, buttonA)); + sl.add(new InputBindingSetting(SettingsFile.KEY_BUTTON_B, Settings.SECTION_CONTROLS, R.string.button_b, buttonB)); + sl.add(new InputBindingSetting(SettingsFile.KEY_BUTTON_X, Settings.SECTION_CONTROLS, R.string.button_x, buttonX)); + sl.add(new InputBindingSetting(SettingsFile.KEY_BUTTON_Y, Settings.SECTION_CONTROLS, R.string.button_y, buttonY)); + sl.add(new InputBindingSetting(SettingsFile.KEY_BUTTON_SELECT, Settings.SECTION_CONTROLS, R.string.button_select, buttonSelect)); + sl.add(new InputBindingSetting(SettingsFile.KEY_BUTTON_START, Settings.SECTION_CONTROLS, R.string.button_start, buttonStart)); + + sl.add(new HeaderSetting(null, null, R.string.controller_circlepad, 0)); + sl.add(new InputBindingSetting(SettingsFile.KEY_CIRCLEPAD_AXIS_VERTICAL, Settings.SECTION_CONTROLS, R.string.controller_axis_vertical, circlepadAxisVert)); + sl.add(new InputBindingSetting(SettingsFile.KEY_CIRCLEPAD_AXIS_HORIZONTAL, Settings.SECTION_CONTROLS, R.string.controller_axis_horizontal, circlepadAxisHoriz)); + + sl.add(new HeaderSetting(null, null, R.string.controller_c, 0)); + sl.add(new InputBindingSetting(SettingsFile.KEY_CSTICK_AXIS_VERTICAL, Settings.SECTION_CONTROLS, R.string.controller_axis_vertical, cstickAxisVert)); + sl.add(new InputBindingSetting(SettingsFile.KEY_CSTICK_AXIS_HORIZONTAL, Settings.SECTION_CONTROLS, R.string.controller_axis_horizontal, cstickAxisHoriz)); + + sl.add(new HeaderSetting(null, null, R.string.controller_dpad, 0)); + sl.add(new InputBindingSetting(SettingsFile.KEY_DPAD_AXIS_VERTICAL, Settings.SECTION_CONTROLS, R.string.controller_axis_vertical, dpadAxisVert)); + sl.add(new InputBindingSetting(SettingsFile.KEY_DPAD_AXIS_HORIZONTAL, Settings.SECTION_CONTROLS, R.string.controller_axis_horizontal, dpadAxisHoriz)); + + // TODO(bunnei): Figure out what to do with these. Configuring is functional, but removing for MVP because they are confusing. + // sl.add(new InputBindingSetting(SettingsFile.KEY_BUTTON_UP, Settings.SECTION_CONTROLS, R.string.generic_up, buttonUp)); + // sl.add(new InputBindingSetting(SettingsFile.KEY_BUTTON_DOWN, Settings.SECTION_CONTROLS, R.string.generic_down, buttonDown)); + // sl.add(new InputBindingSetting(SettingsFile.KEY_BUTTON_LEFT, Settings.SECTION_CONTROLS, R.string.generic_left, buttonLeft)); + // sl.add(new InputBindingSetting(SettingsFile.KEY_BUTTON_RIGHT, Settings.SECTION_CONTROLS, R.string.generic_right, buttonRight)); + + sl.add(new HeaderSetting(null, null, R.string.controller_triggers, 0)); + sl.add(new InputBindingSetting(SettingsFile.KEY_BUTTON_L, Settings.SECTION_CONTROLS, R.string.button_l, buttonL)); + sl.add(new InputBindingSetting(SettingsFile.KEY_BUTTON_R, Settings.SECTION_CONTROLS, R.string.button_r, buttonR)); + sl.add(new InputBindingSetting(SettingsFile.KEY_BUTTON_ZL, Settings.SECTION_CONTROLS, R.string.button_zl, buttonZL)); + sl.add(new InputBindingSetting(SettingsFile.KEY_BUTTON_ZR, Settings.SECTION_CONTROLS, R.string.button_zr, buttonZR)); + } + + private void addGraphicsSettings(ArrayList sl) { + mView.getActivity().setTitle(R.string.preferences_graphics); + + SettingSection rendererSection = mSettings.getSection(Settings.SECTION_RENDERER); + Setting resolutionFactor = rendererSection.getSetting(SettingsFile.KEY_RESOLUTION_FACTOR); + Setting filterMode = rendererSection.getSetting(SettingsFile.KEY_FILTER_MODE); + Setting useAsynchronousGpuEmulation = rendererSection.getSetting(SettingsFile.KEY_USE_ASYNCHRONOUS_GPU_EMULATION); + Setting shadersAccurateMul = rendererSection.getSetting(SettingsFile.KEY_SHADERS_ACCURATE_MUL); + Setting render3dMode = rendererSection.getSetting(SettingsFile.KEY_RENDER_3D); + Setting factor3d = rendererSection.getSetting(SettingsFile.KEY_FACTOR_3D); + Setting useDiskShaderCache = rendererSection.getSetting(SettingsFile.KEY_USE_DISK_SHADER_CACHE); + + SettingSection layoutSection = mSettings.getSection(Settings.SECTION_LAYOUT); + Setting cardboardScreenSize = layoutSection.getSetting(SettingsFile.KEY_CARDBOARD_SCREEN_SIZE); + Setting cardboardXShift = layoutSection.getSetting(SettingsFile.KEY_CARDBOARD_X_SHIFT); + Setting cardboardYShift = layoutSection.getSetting(SettingsFile.KEY_CARDBOARD_Y_SHIFT); + + sl.add(new HeaderSetting(null, null, R.string.renderer, 0)); + sl.add(new SliderSetting(SettingsFile.KEY_RESOLUTION_FACTOR, Settings.SECTION_RENDERER, R.string.internal_resolution, R.string.internal_resolution_description, 1, 4, "x", 1, resolutionFactor)); + sl.add(new CheckBoxSetting(SettingsFile.KEY_FILTER_MODE, Settings.SECTION_RENDERER, R.string.linear_filtering, R.string.linear_filtering_description, true, filterMode)); + sl.add(new CheckBoxSetting(SettingsFile.KEY_USE_ASYNCHRONOUS_GPU_EMULATION, Settings.SECTION_RENDERER, R.string.asynchronous_gpu, R.string.asynchronous_gpu_description, true, useAsynchronousGpuEmulation)); + sl.add(new CheckBoxSetting(SettingsFile.KEY_SHADERS_ACCURATE_MUL, Settings.SECTION_RENDERER, R.string.shaders_accurate_mul, R.string.shaders_accurate_mul_description, false, shadersAccurateMul)); + sl.add(new CheckBoxSetting(SettingsFile.KEY_USE_DISK_SHADER_CACHE, Settings.SECTION_RENDERER, R.string.use_disk_shader_cache, R.string.use_disk_shader_cache_description, true, useDiskShaderCache)); + + sl.add(new HeaderSetting(null, null, R.string.stereoscopy, 0)); + sl.add(new SingleChoiceSetting(SettingsFile.KEY_RENDER_3D, Settings.SECTION_RENDERER, R.string.render3d, 0, R.array.render3dModes, R.array.render3dValues, 0, render3dMode)); + sl.add(new SliderSetting(SettingsFile.KEY_FACTOR_3D, Settings.SECTION_RENDERER, R.string.factor3d, R.string.factor3d_description, 0, 100, "%", 0, factor3d)); + + sl.add(new HeaderSetting(null, null, R.string.cardboard_vr, 0)); + sl.add(new SliderSetting(SettingsFile.KEY_CARDBOARD_SCREEN_SIZE, Settings.SECTION_LAYOUT, R.string.cardboard_screen_size, R.string.cardboard_screen_size_description, 30, 100, "%", 85, cardboardScreenSize)); + sl.add(new SliderSetting(SettingsFile.KEY_CARDBOARD_X_SHIFT, Settings.SECTION_LAYOUT, R.string.cardboard_x_shift, R.string.cardboard_x_shift_description, -100, 100, "%", 0, cardboardXShift)); + sl.add(new SliderSetting(SettingsFile.KEY_CARDBOARD_Y_SHIFT, Settings.SECTION_LAYOUT, R.string.cardboard_y_shift, R.string.cardboard_y_shift_description, -100, 100, "%", 0, cardboardYShift)); + } + + private void addAudioSettings(ArrayList sl) { + mView.getActivity().setTitle(R.string.preferences_audio); + + SettingSection audioSection = mSettings.getSection(Settings.SECTION_AUDIO); + Setting audioStretch = audioSection.getSetting(SettingsFile.KEY_ENABLE_AUDIO_STRETCHING); + Setting micInputType = audioSection.getSetting(SettingsFile.KEY_MIC_INPUT_TYPE); + + sl.add(new CheckBoxSetting(SettingsFile.KEY_ENABLE_AUDIO_STRETCHING, Settings.SECTION_AUDIO, R.string.audio_stretch, R.string.audio_stretch_description, true, audioStretch)); + sl.add(new SingleChoiceSetting(SettingsFile.KEY_MIC_INPUT_TYPE, Settings.SECTION_AUDIO, R.string.audio_input_type, 0, R.array.audioInputTypeNames, R.array.audioInputTypeValues, 1, micInputType)); + } + + private void addDebugSettings(ArrayList sl) { + mView.getActivity().setTitle(R.string.preferences_debug); + + SettingSection coreSection = mSettings.getSection(Settings.SECTION_CORE); + SettingSection rendererSection = mSettings.getSection(Settings.SECTION_RENDERER); + Setting useCpuJit = coreSection.getSetting(SettingsFile.KEY_CPU_JIT); + Setting hardwareRenderer = rendererSection.getSetting(SettingsFile.KEY_HW_RENDERER); + Setting hardwareShader = rendererSection.getSetting(SettingsFile.KEY_HW_SHADER); + Setting vsyncEnable = rendererSection.getSetting(SettingsFile.KEY_USE_VSYNC); + + sl.add(new HeaderSetting(null, null, R.string.debug_warning, 0)); + sl.add(new CheckBoxSetting(SettingsFile.KEY_CPU_JIT, Settings.SECTION_CORE, R.string.cpu_jit, R.string.cpu_jit_description, true, useCpuJit, true, mView)); + sl.add(new CheckBoxSetting(SettingsFile.KEY_HW_RENDERER, Settings.SECTION_RENDERER, R.string.hw_renderer, R.string.hw_renderer_description, true, hardwareRenderer, true, mView)); + sl.add(new CheckBoxSetting(SettingsFile.KEY_HW_SHADER, Settings.SECTION_RENDERER, R.string.hw_shaders, R.string.hw_shaders_description, true, hardwareShader, true, mView)); + sl.add(new CheckBoxSetting(SettingsFile.KEY_USE_VSYNC, Settings.SECTION_RENDERER, R.string.vsync, R.string.vsync_description, true, vsyncEnable)); + } +} diff --git a/src/android/app/src/main/java/org/citra/citra_emu/features/settings/ui/SettingsFragmentView.java b/src/android/app/src/main/java/org/citra/citra_emu/features/settings/ui/SettingsFragmentView.java new file mode 100644 index 000000000..c36eb55a7 --- /dev/null +++ b/src/android/app/src/main/java/org/citra/citra_emu/features/settings/ui/SettingsFragmentView.java @@ -0,0 +1,78 @@ +package org.citra.citra_emu.features.settings.ui; + +import androidx.fragment.app.FragmentActivity; + +import org.citra.citra_emu.features.settings.model.Setting; +import org.citra.citra_emu.features.settings.model.Settings; +import org.citra.citra_emu.features.settings.model.view.SettingsItem; + +import java.util.ArrayList; + +/** + * Abstraction for a screen showing a list of settings. Instances of + * this type of view will each display a layer of the setting hierarchy. + */ +public interface SettingsFragmentView { + /** + * Called by the containing Activity to notify the Fragment that an + * asynchronous load operation completed. + * + * @param settings The (possibly null) result of the ini load operation. + */ + void onSettingsFileLoaded(Settings settings); + + /** + * Pass a settings HashMap to the containing activity, so that it can + * share the HashMap with other SettingsFragments; useful so that rotations + * do not require an additional load operation. + * + * @param settings An ArrayList containing all the settings HashMaps. + */ + void passSettingsToActivity(Settings settings); + + /** + * Pass an ArrayList to the View so that it can be displayed on screen. + * + * @param settingsList The result of converting the HashMap to an ArrayList + */ + void showSettingsList(ArrayList settingsList); + + /** + * Called by the containing Activity when an asynchronous load operation fails. + * Instructs the Fragment to load the settings screen with defaults selected. + */ + void loadDefaultSettings(); + + /** + * @return The Fragment's containing activity. + */ + FragmentActivity getActivity(); + + /** + * Tell the Fragment to tell the containing Activity to show a new + * Fragment containing a submenu of settings. + * + * @param menuKey Identifier for the settings group that should be shown. + */ + void loadSubMenu(String menuKey); + + /** + * Tell the Fragment to tell the containing activity to display a toast message. + * + * @param message Text to be shown in the Toast + * @param is_long Whether this should be a long Toast or short one. + */ + void showToastMessage(String message, boolean is_long); + + /** + * Have the fragment add a setting to the HashMap. + * + * @param setting The (possibly previously missing) new setting. + */ + void putSetting(Setting setting); + + /** + * Have the fragment tell the containing Activity that a setting was modified. + */ + void onSettingChanged(); +} diff --git a/src/android/app/src/main/java/org/citra/citra_emu/features/settings/ui/SettingsFrameLayout.java b/src/android/app/src/main/java/org/citra/citra_emu/features/settings/ui/SettingsFrameLayout.java new file mode 100644 index 000000000..67bde5709 --- /dev/null +++ b/src/android/app/src/main/java/org/citra/citra_emu/features/settings/ui/SettingsFrameLayout.java @@ -0,0 +1,48 @@ +package org.citra.citra_emu.features.settings.ui; + +import android.content.Context; +import android.util.AttributeSet; +import android.widget.FrameLayout; + +/** + * FrameLayout subclass with few Properties added to simplify animations. + * Don't remove the methods appearing as unused, in order not to break the menu animations + */ +public final class SettingsFrameLayout extends FrameLayout { + private float mVisibleness = 1.0f; + + public SettingsFrameLayout(Context context) { + super(context); + } + + public SettingsFrameLayout(Context context, AttributeSet attrs) { + super(context, attrs); + } + + public SettingsFrameLayout(Context context, AttributeSet attrs, int defStyleAttr) { + super(context, attrs, defStyleAttr); + } + + public SettingsFrameLayout(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) { + super(context, attrs, defStyleAttr, defStyleRes); + } + + public float getYFraction() { + return getY() / getHeight(); + } + + public void setYFraction(float yFraction) { + final int height = getHeight(); + setY((height > 0) ? (yFraction * height) : -9999); + } + + public float getVisibleness() { + return mVisibleness; + } + + public void setVisibleness(float visibleness) { + setScaleX(visibleness); + setScaleY(visibleness); + setAlpha(visibleness); + } +} diff --git a/src/android/app/src/main/java/org/citra/citra_emu/features/settings/ui/viewholder/CheckBoxSettingViewHolder.java b/src/android/app/src/main/java/org/citra/citra_emu/features/settings/ui/viewholder/CheckBoxSettingViewHolder.java new file mode 100644 index 000000000..d914f7d0b --- /dev/null +++ b/src/android/app/src/main/java/org/citra/citra_emu/features/settings/ui/viewholder/CheckBoxSettingViewHolder.java @@ -0,0 +1,54 @@ +package org.citra.citra_emu.features.settings.ui.viewholder; + +import android.view.View; +import android.widget.CheckBox; +import android.widget.TextView; + +import org.citra.citra_emu.R; +import org.citra.citra_emu.features.settings.model.view.CheckBoxSetting; +import org.citra.citra_emu.features.settings.model.view.SettingsItem; +import org.citra.citra_emu.features.settings.ui.SettingsAdapter; + +public final class CheckBoxSettingViewHolder extends SettingViewHolder { + private CheckBoxSetting mItem; + + private TextView mTextSettingName; + private TextView mTextSettingDescription; + + private CheckBox mCheckbox; + + public CheckBoxSettingViewHolder(View itemView, SettingsAdapter adapter) { + super(itemView, adapter); + } + + @Override + protected void findViews(View root) { + mTextSettingName = root.findViewById(R.id.text_setting_name); + mTextSettingDescription = root.findViewById(R.id.text_setting_description); + mCheckbox = root.findViewById(R.id.checkbox); + } + + @Override + public void bind(SettingsItem item) { + mItem = (CheckBoxSetting) item; + + mTextSettingName.setText(item.getNameId()); + + if (item.getDescriptionId() > 0) { + mTextSettingDescription.setText(item.getDescriptionId()); + mTextSettingDescription.setVisibility(View.VISIBLE); + } else { + mTextSettingDescription.setText(""); + mTextSettingDescription.setVisibility(View.GONE); + } + + mCheckbox.setChecked(mItem.isChecked()); + } + + @Override + public void onClick(View clicked) { + mCheckbox.toggle(); + + getAdapter().onBooleanClick(mItem, getAdapterPosition(), mCheckbox.isChecked()); + } +} diff --git a/src/android/app/src/main/java/org/citra/citra_emu/features/settings/ui/viewholder/DateTimeViewHolder.java b/src/android/app/src/main/java/org/citra/citra_emu/features/settings/ui/viewholder/DateTimeViewHolder.java new file mode 100644 index 000000000..09ea93010 --- /dev/null +++ b/src/android/app/src/main/java/org/citra/citra_emu/features/settings/ui/viewholder/DateTimeViewHolder.java @@ -0,0 +1,47 @@ +package org.citra.citra_emu.features.settings.ui.viewholder; + +import android.view.View; +import android.widget.TextView; + +import org.citra.citra_emu.R; +import org.citra.citra_emu.features.settings.model.view.DateTimeSetting; +import org.citra.citra_emu.features.settings.model.view.SettingsItem; +import org.citra.citra_emu.features.settings.ui.SettingsAdapter; +import org.citra.citra_emu.utils.Log; + +public final class DateTimeViewHolder extends SettingViewHolder { + private DateTimeSetting mItem; + + private TextView mTextSettingName; + private TextView mTextSettingDescription; + + public DateTimeViewHolder(View itemView, SettingsAdapter adapter) { + super(itemView, adapter); + } + + @Override + protected void findViews(View root) { + mTextSettingName = root.findViewById(R.id.text_setting_name); + Log.error("test " + mTextSettingName); + mTextSettingDescription = root.findViewById(R.id.text_setting_description); + Log.error("test " + mTextSettingDescription); + } + + @Override + public void bind(SettingsItem item) { + mItem = (DateTimeSetting) item; + mTextSettingName.setText(item.getNameId()); + + if (item.getDescriptionId() > 0) { + mTextSettingDescription.setText(item.getDescriptionId()); + mTextSettingDescription.setVisibility(View.VISIBLE); + } else { + mTextSettingDescription.setVisibility(View.GONE); + } + } + + @Override + public void onClick(View clicked) { + getAdapter().onDateTimeClick(mItem, getAdapterPosition()); + } +} diff --git a/src/android/app/src/main/java/org/citra/citra_emu/features/settings/ui/viewholder/HeaderViewHolder.java b/src/android/app/src/main/java/org/citra/citra_emu/features/settings/ui/viewholder/HeaderViewHolder.java new file mode 100644 index 000000000..baf80ed76 --- /dev/null +++ b/src/android/app/src/main/java/org/citra/citra_emu/features/settings/ui/viewholder/HeaderViewHolder.java @@ -0,0 +1,32 @@ +package org.citra.citra_emu.features.settings.ui.viewholder; + +import android.view.View; +import android.widget.TextView; + +import org.citra.citra_emu.R; +import org.citra.citra_emu.features.settings.model.view.SettingsItem; +import org.citra.citra_emu.features.settings.ui.SettingsAdapter; + +public final class HeaderViewHolder extends SettingViewHolder { + private TextView mHeaderName; + + public HeaderViewHolder(View itemView, SettingsAdapter adapter) { + super(itemView, adapter); + itemView.setOnClickListener(null); + } + + @Override + protected void findViews(View root) { + mHeaderName = root.findViewById(R.id.text_header_name); + } + + @Override + public void bind(SettingsItem item) { + mHeaderName.setText(item.getNameId()); + } + + @Override + public void onClick(View clicked) { + // no-op + } +} \ No newline at end of file diff --git a/src/android/app/src/main/java/org/citra/citra_emu/features/settings/ui/viewholder/InputBindingSettingViewHolder.java b/src/android/app/src/main/java/org/citra/citra_emu/features/settings/ui/viewholder/InputBindingSettingViewHolder.java new file mode 100644 index 000000000..7d95c250a --- /dev/null +++ b/src/android/app/src/main/java/org/citra/citra_emu/features/settings/ui/viewholder/InputBindingSettingViewHolder.java @@ -0,0 +1,55 @@ +package org.citra.citra_emu.features.settings.ui.viewholder; + +import android.content.Context; +import android.content.SharedPreferences; +import android.preference.PreferenceManager; +import android.view.View; +import android.widget.TextView; + +import org.citra.citra_emu.R; +import org.citra.citra_emu.features.settings.model.view.InputBindingSetting; +import org.citra.citra_emu.features.settings.model.view.SettingsItem; +import org.citra.citra_emu.features.settings.ui.SettingsAdapter; + +public final class InputBindingSettingViewHolder extends SettingViewHolder { + private InputBindingSetting mItem; + + private TextView mTextSettingName; + private TextView mTextSettingDescription; + + private Context mContext; + + public InputBindingSettingViewHolder(View itemView, SettingsAdapter adapter, Context context) { + super(itemView, adapter); + + mContext = context; + } + + @Override + protected void findViews(View root) { + mTextSettingName = root.findViewById(R.id.text_setting_name); + mTextSettingDescription = root.findViewById(R.id.text_setting_description); + } + + @Override + public void bind(SettingsItem item) { + SharedPreferences sharedPreferences = PreferenceManager.getDefaultSharedPreferences(mContext); + + mItem = (InputBindingSetting) item; + + mTextSettingName.setText(item.getNameId()); + + String key = sharedPreferences.getString(mItem.getKey(), ""); + if (key != null && !key.isEmpty()) { + mTextSettingDescription.setText(key); + mTextSettingDescription.setVisibility(View.VISIBLE); + } else { + mTextSettingDescription.setVisibility(View.GONE); + } + } + + @Override + public void onClick(View clicked) { + getAdapter().onInputBindingClick(mItem, getAdapterPosition()); + } +} diff --git a/src/android/app/src/main/java/org/citra/citra_emu/features/settings/ui/viewholder/PremiumViewHolder.java b/src/android/app/src/main/java/org/citra/citra_emu/features/settings/ui/viewholder/PremiumViewHolder.java new file mode 100644 index 000000000..be0853ff0 --- /dev/null +++ b/src/android/app/src/main/java/org/citra/citra_emu/features/settings/ui/viewholder/PremiumViewHolder.java @@ -0,0 +1,57 @@ +package org.citra.citra_emu.features.settings.ui.viewholder; + +import android.view.View; +import android.widget.TextView; + +import org.citra.citra_emu.R; +import org.citra.citra_emu.features.settings.model.view.SettingsItem; +import org.citra.citra_emu.features.settings.ui.SettingsAdapter; +import org.citra.citra_emu.features.settings.ui.SettingsFragmentView; +import org.citra.citra_emu.ui.main.MainActivity; + +public final class PremiumViewHolder extends SettingViewHolder { + private TextView mHeaderName; + private TextView mTextDescription; + private SettingsFragmentView mView; + + public PremiumViewHolder(View itemView, SettingsAdapter adapter, SettingsFragmentView view) { + super(itemView, adapter); + mView = view; + itemView.setOnClickListener(this); + } + + @Override + protected void findViews(View root) { + mHeaderName = root.findViewById(R.id.text_setting_name); + mTextDescription = root.findViewById(R.id.text_setting_description); + } + + @Override + public void bind(SettingsItem item) { + updateText(); + } + + @Override + public void onClick(View clicked) { + if (MainActivity.isPremiumActive()) { + return; + } + + // Invoke billing flow if Premium is not already active, then refresh the UI to indicate + // the purchase has completed. + MainActivity.invokePremiumBilling(() -> updateText()); + } + + /** + * Update the text shown to the user, based on whether Premium is active + */ + private void updateText() { + if (MainActivity.isPremiumActive()) { + mHeaderName.setText(R.string.premium_settings_welcome); + mTextDescription.setText(R.string.premium_settings_welcome_description); + } else { + mHeaderName.setText(R.string.premium_settings_upsell); + mTextDescription.setText(R.string.premium_settings_upsell_description); + } + } +} diff --git a/src/android/app/src/main/java/org/citra/citra_emu/features/settings/ui/viewholder/SettingViewHolder.java b/src/android/app/src/main/java/org/citra/citra_emu/features/settings/ui/viewholder/SettingViewHolder.java new file mode 100644 index 000000000..2643ea121 --- /dev/null +++ b/src/android/app/src/main/java/org/citra/citra_emu/features/settings/ui/viewholder/SettingViewHolder.java @@ -0,0 +1,49 @@ +package org.citra.citra_emu.features.settings.ui.viewholder; + +import android.view.View; + +import androidx.recyclerview.widget.RecyclerView; + +import org.citra.citra_emu.features.settings.model.view.SettingsItem; +import org.citra.citra_emu.features.settings.ui.SettingsAdapter; + +public abstract class SettingViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener { + private SettingsAdapter mAdapter; + + public SettingViewHolder(View itemView, SettingsAdapter adapter) { + super(itemView); + + mAdapter = adapter; + + itemView.setOnClickListener(this); + + findViews(itemView); + } + + protected SettingsAdapter getAdapter() { + return mAdapter; + } + + /** + * Gets handles to all this ViewHolder's child views using their XML-defined identifiers. + * + * @param root The newly inflated top-level view. + */ + protected abstract void findViews(View root); + + /** + * Called by the adapter to set this ViewHolder's child views to display the list item + * it must now represent. + * + * @param item The list item that should be represented by this ViewHolder. + */ + public abstract void bind(SettingsItem item); + + /** + * Called when this ViewHolder's view is clicked on. Implementations should usually pass + * this event up to the adapter. + * + * @param clicked The view that was clicked on. + */ + public abstract void onClick(View clicked); +} diff --git a/src/android/app/src/main/java/org/citra/citra_emu/features/settings/ui/viewholder/SingleChoiceViewHolder.java b/src/android/app/src/main/java/org/citra/citra_emu/features/settings/ui/viewholder/SingleChoiceViewHolder.java new file mode 100644 index 000000000..a175af9f8 --- /dev/null +++ b/src/android/app/src/main/java/org/citra/citra_emu/features/settings/ui/viewholder/SingleChoiceViewHolder.java @@ -0,0 +1,76 @@ +package org.citra.citra_emu.features.settings.ui.viewholder; + +import android.content.res.Resources; +import android.view.View; +import android.widget.TextView; + +import org.citra.citra_emu.R; +import org.citra.citra_emu.features.settings.model.view.PremiumSingleChoiceSetting; +import org.citra.citra_emu.features.settings.model.view.SettingsItem; +import org.citra.citra_emu.features.settings.model.view.SingleChoiceSetting; +import org.citra.citra_emu.features.settings.model.view.StringSingleChoiceSetting; +import org.citra.citra_emu.features.settings.ui.SettingsAdapter; + +public final class SingleChoiceViewHolder extends SettingViewHolder { + private SettingsItem mItem; + + private TextView mTextSettingName; + private TextView mTextSettingDescription; + + public SingleChoiceViewHolder(View itemView, SettingsAdapter adapter) { + super(itemView, adapter); + } + + @Override + protected void findViews(View root) { + mTextSettingName = root.findViewById(R.id.text_setting_name); + mTextSettingDescription = root.findViewById(R.id.text_setting_description); + } + + @Override + public void bind(SettingsItem item) { + mItem = item; + + mTextSettingName.setText(item.getNameId()); + mTextSettingDescription.setVisibility(View.VISIBLE); + if (item.getDescriptionId() > 0) { + mTextSettingDescription.setText(item.getDescriptionId()); + } else if (item instanceof SingleChoiceSetting) { + SingleChoiceSetting setting = (SingleChoiceSetting) item; + int selected = setting.getSelectedValue(); + Resources resMgr = mTextSettingDescription.getContext().getResources(); + String[] choices = resMgr.getStringArray(setting.getChoicesId()); + int[] values = resMgr.getIntArray(setting.getValuesId()); + for (int i = 0; i < values.length; ++i) { + if (values[i] == selected) { + mTextSettingDescription.setText(choices[i]); + } + } + } else if (item instanceof PremiumSingleChoiceSetting) { + PremiumSingleChoiceSetting setting = (PremiumSingleChoiceSetting) item; + int selected = setting.getSelectedValue(); + Resources resMgr = mTextSettingDescription.getContext().getResources(); + String[] choices = resMgr.getStringArray(setting.getChoicesId()); + int[] values = resMgr.getIntArray(setting.getValuesId()); + for (int i = 0; i < values.length; ++i) { + if (values[i] == selected) { + mTextSettingDescription.setText(choices[i]); + } + } + } else { + mTextSettingDescription.setVisibility(View.GONE); + } + } + + @Override + public void onClick(View clicked) { + int position = getAdapterPosition(); + if (mItem instanceof SingleChoiceSetting) { + getAdapter().onSingleChoiceClick((SingleChoiceSetting) mItem, position); + } else if (mItem instanceof PremiumSingleChoiceSetting) { + getAdapter().onSingleChoiceClick((PremiumSingleChoiceSetting) mItem, position); + } else if (mItem instanceof StringSingleChoiceSetting) { + getAdapter().onStringSingleChoiceClick((StringSingleChoiceSetting) mItem, position); + } + } +} diff --git a/src/android/app/src/main/java/org/citra/citra_emu/features/settings/ui/viewholder/SliderViewHolder.java b/src/android/app/src/main/java/org/citra/citra_emu/features/settings/ui/viewholder/SliderViewHolder.java new file mode 100644 index 000000000..ce503bc54 --- /dev/null +++ b/src/android/app/src/main/java/org/citra/citra_emu/features/settings/ui/viewholder/SliderViewHolder.java @@ -0,0 +1,46 @@ +package org.citra.citra_emu.features.settings.ui.viewholder; + +import android.view.View; +import android.widget.TextView; + +import org.citra.citra_emu.R; +import org.citra.citra_emu.features.settings.model.view.SettingsItem; +import org.citra.citra_emu.features.settings.model.view.SliderSetting; +import org.citra.citra_emu.features.settings.ui.SettingsAdapter; + +public final class SliderViewHolder extends SettingViewHolder { + private SliderSetting mItem; + + private TextView mTextSettingName; + private TextView mTextSettingDescription; + + public SliderViewHolder(View itemView, SettingsAdapter adapter) { + super(itemView, adapter); + } + + @Override + protected void findViews(View root) { + mTextSettingName = root.findViewById(R.id.text_setting_name); + mTextSettingDescription = root.findViewById(R.id.text_setting_description); + } + + @Override + public void bind(SettingsItem item) { + mItem = (SliderSetting) item; + + mTextSettingName.setText(item.getNameId()); + + if (item.getDescriptionId() > 0) { + mTextSettingDescription.setText(item.getDescriptionId()); + mTextSettingDescription.setVisibility(View.VISIBLE); + } else { + mTextSettingDescription.setVisibility(View.GONE); + } + } + + @Override + public void onClick(View clicked) { + getAdapter().onSliderClick(mItem, getAdapterPosition()); + } +} + diff --git a/src/android/app/src/main/java/org/citra/citra_emu/features/settings/ui/viewholder/SubmenuViewHolder.java b/src/android/app/src/main/java/org/citra/citra_emu/features/settings/ui/viewholder/SubmenuViewHolder.java new file mode 100644 index 000000000..cb8c3e92a --- /dev/null +++ b/src/android/app/src/main/java/org/citra/citra_emu/features/settings/ui/viewholder/SubmenuViewHolder.java @@ -0,0 +1,45 @@ +package org.citra.citra_emu.features.settings.ui.viewholder; + +import android.view.View; +import android.widget.TextView; + +import org.citra.citra_emu.R; +import org.citra.citra_emu.features.settings.model.view.SettingsItem; +import org.citra.citra_emu.features.settings.model.view.SubmenuSetting; +import org.citra.citra_emu.features.settings.ui.SettingsAdapter; + +public final class SubmenuViewHolder extends SettingViewHolder { + private SubmenuSetting mItem; + + private TextView mTextSettingName; + private TextView mTextSettingDescription; + + public SubmenuViewHolder(View itemView, SettingsAdapter adapter) { + super(itemView, adapter); + } + + @Override + protected void findViews(View root) { + mTextSettingName = root.findViewById(R.id.text_setting_name); + mTextSettingDescription = root.findViewById(R.id.text_setting_description); + } + + @Override + public void bind(SettingsItem item) { + mItem = (SubmenuSetting) item; + + mTextSettingName.setText(item.getNameId()); + + if (item.getDescriptionId() > 0) { + mTextSettingDescription.setText(item.getDescriptionId()); + mTextSettingDescription.setVisibility(View.VISIBLE); + } else { + mTextSettingDescription.setVisibility(View.GONE); + } + } + + @Override + public void onClick(View clicked) { + getAdapter().onSubmenuClick(mItem); + } +} \ No newline at end of file diff --git a/src/android/app/src/main/java/org/citra/citra_emu/features/settings/utils/SettingsFile.java b/src/android/app/src/main/java/org/citra/citra_emu/features/settings/utils/SettingsFile.java new file mode 100644 index 000000000..5403cd7e4 --- /dev/null +++ b/src/android/app/src/main/java/org/citra/citra_emu/features/settings/utils/SettingsFile.java @@ -0,0 +1,337 @@ +package org.citra.citra_emu.features.settings.utils; + +import androidx.annotation.NonNull; + +import org.citra.citra_emu.CitraApplication; +import org.citra.citra_emu.NativeLibrary; +import org.citra.citra_emu.R; +import org.citra.citra_emu.features.settings.model.FloatSetting; +import org.citra.citra_emu.features.settings.model.IntSetting; +import org.citra.citra_emu.features.settings.model.Setting; +import org.citra.citra_emu.features.settings.model.SettingSection; +import org.citra.citra_emu.features.settings.model.Settings; +import org.citra.citra_emu.features.settings.model.StringSetting; +import org.citra.citra_emu.features.settings.ui.SettingsActivityView; +import org.citra.citra_emu.utils.BiMap; +import org.citra.citra_emu.utils.DirectoryInitialization; +import org.citra.citra_emu.utils.Log; +import org.ini4j.Wini; + +import java.io.BufferedReader; +import java.io.File; +import java.io.FileNotFoundException; +import java.io.FileReader; +import java.io.IOException; +import java.util.HashMap; +import java.util.Set; +import java.util.TreeMap; +import java.util.TreeSet; + +/** + * Contains static methods for interacting with .ini files in which settings are stored. + */ +public final class SettingsFile { + public static final String FILE_NAME_CONFIG = "config"; + + public static final String KEY_CPU_JIT = "use_cpu_jit"; + + public static final String KEY_DESIGN = "design"; + + public static final String KEY_PREMIUM = "premium"; + + public static final String KEY_HW_RENDERER = "use_hw_renderer"; + public static final String KEY_HW_SHADER = "use_hw_shader"; + public static final String KEY_SHADERS_ACCURATE_MUL = "shaders_accurate_mul"; + public static final String KEY_USE_SHADER_JIT = "use_shader_jit"; + public static final String KEY_USE_DISK_SHADER_CACHE = "use_disk_shader_cache"; + public static final String KEY_USE_VSYNC = "use_vsync_new"; + public static final String KEY_RESOLUTION_FACTOR = "resolution_factor"; + public static final String KEY_FRAME_LIMIT_ENABLED = "use_frame_limit"; + public static final String KEY_FRAME_LIMIT = "frame_limit"; + public static final String KEY_BACKGROUND_RED = "bg_red"; + public static final String KEY_BACKGROUND_BLUE = "bg_blue"; + public static final String KEY_BACKGROUND_GREEN = "bg_green"; + public static final String KEY_RENDER_3D = "render_3d"; + public static final String KEY_FACTOR_3D = "factor_3d"; + public static final String KEY_PP_SHADER_NAME = "pp_shader_name"; + public static final String KEY_FILTER_MODE = "filter_mode"; + public static final String KEY_TEXTURE_FILTER_NAME = "texture_filter_name"; + public static final String KEY_USE_ASYNCHRONOUS_GPU_EMULATION = "use_asynchronous_gpu_emulation"; + + public static final String KEY_LAYOUT_OPTION = "layout_option"; + public static final String KEY_SWAP_SCREEN = "swap_screen"; + public static final String KEY_CARDBOARD_SCREEN_SIZE = "cardboard_screen_size"; + public static final String KEY_CARDBOARD_X_SHIFT = "cardboard_x_shift"; + public static final String KEY_CARDBOARD_Y_SHIFT = "cardboard_y_shift"; + + public static final String KEY_AUDIO_OUTPUT_ENGINE = "output_engine"; + public static final String KEY_ENABLE_AUDIO_STRETCHING = "enable_audio_stretching"; + public static final String KEY_VOLUME = "volume"; + public static final String KEY_MIC_INPUT_TYPE = "mic_input_type"; + + public static final String KEY_USE_VIRTUAL_SD = "use_virtual_sd"; + + public static final String KEY_IS_NEW_3DS = "is_new_3ds"; + public static final String KEY_REGION_VALUE = "region_value"; + public static final String KEY_LANGUAGE = "language"; + + public static final String KEY_INIT_CLOCK = "init_clock"; + public static final String KEY_INIT_TIME = "init_time"; + + public static final String KEY_BUTTON_A = "button_a"; + public static final String KEY_BUTTON_B = "button_b"; + public static final String KEY_BUTTON_X = "button_x"; + public static final String KEY_BUTTON_Y = "button_y"; + public static final String KEY_BUTTON_SELECT = "button_select"; + public static final String KEY_BUTTON_START = "button_start"; + public static final String KEY_BUTTON_UP = "button_up"; + public static final String KEY_BUTTON_DOWN = "button_down"; + public static final String KEY_BUTTON_LEFT = "button_left"; + public static final String KEY_BUTTON_RIGHT = "button_right"; + public static final String KEY_BUTTON_L = "button_l"; + public static final String KEY_BUTTON_R = "button_r"; + public static final String KEY_BUTTON_ZL = "button_zl"; + public static final String KEY_BUTTON_ZR = "button_zr"; + public static final String KEY_CIRCLEPAD_AXIS_VERTICAL = "circlepad_axis_vertical"; + public static final String KEY_CIRCLEPAD_AXIS_HORIZONTAL = "circlepad_axis_horizontal"; + public static final String KEY_CSTICK_AXIS_VERTICAL = "cstick_axis_vertical"; + public static final String KEY_CSTICK_AXIS_HORIZONTAL = "cstick_axis_horizontal"; + public static final String KEY_DPAD_AXIS_VERTICAL = "dpad_axis_vertical"; + public static final String KEY_DPAD_AXIS_HORIZONTAL = "dpad_axis_horizontal"; + public static final String KEY_CIRCLEPAD_UP = "circlepad_up"; + public static final String KEY_CIRCLEPAD_DOWN = "circlepad_down"; + public static final String KEY_CIRCLEPAD_LEFT = "circlepad_left"; + public static final String KEY_CIRCLEPAD_RIGHT = "circlepad_right"; + public static final String KEY_CSTICK_UP = "cstick_up"; + public static final String KEY_CSTICK_DOWN = "cstick_down"; + public static final String KEY_CSTICK_LEFT = "cstick_left"; + public static final String KEY_CSTICK_RIGHT = "cstick_right"; + + public static final String KEY_CAMERA_OUTER_RIGHT_NAME = "camera_outer_right_name"; + public static final String KEY_CAMERA_OUTER_RIGHT_CONFIG = "camera_outer_right_config"; + public static final String KEY_CAMERA_OUTER_RIGHT_FLIP = "camera_outer_right_flip"; + public static final String KEY_CAMERA_OUTER_LEFT_NAME = "camera_outer_left_name"; + public static final String KEY_CAMERA_OUTER_LEFT_CONFIG = "camera_outer_left_config"; + public static final String KEY_CAMERA_OUTER_LEFT_FLIP = "camera_outer_left_flip"; + public static final String KEY_CAMERA_INNER_NAME = "camera_inner_name"; + public static final String KEY_CAMERA_INNER_CONFIG = "camera_inner_config"; + public static final String KEY_CAMERA_INNER_FLIP = "camera_inner_flip"; + + public static final String KEY_LOG_FILTER = "log_filter"; + + private static BiMap sectionsMap = new BiMap<>(); + + static { + //TODO: Add members to sectionsMap when game-specific settings are added + } + + + private SettingsFile() { + } + + /** + * Reads a given .ini file from disk and returns it as a HashMap of Settings, themselves + * effectively a HashMap of key/value settings. If unsuccessful, outputs an error telling why it + * failed. + * + * @param ini The ini file to load the settings from + * @param isCustomGame + * @param view The current view. + * @return An Observable that emits a HashMap of the file's contents, then completes. + */ + static HashMap readFile(final File ini, boolean isCustomGame, SettingsActivityView view) { + HashMap sections = new Settings.SettingsSectionMap(); + + BufferedReader reader = null; + + try { + reader = new BufferedReader(new FileReader(ini)); + + SettingSection current = null; + for (String line; (line = reader.readLine()) != null; ) { + if (line.startsWith("[") && line.endsWith("]")) { + current = sectionFromLine(line, isCustomGame); + sections.put(current.getName(), current); + } else if ((current != null)) { + Setting setting = settingFromLine(current, line); + if (setting != null) { + current.putSetting(setting); + } + } + } + } catch (FileNotFoundException e) { + Log.error("[SettingsFile] File not found: " + ini.getAbsolutePath() + e.getMessage()); + if (view != null) + view.onSettingsFileNotFound(); + } catch (IOException e) { + Log.error("[SettingsFile] Error reading from: " + ini.getAbsolutePath() + e.getMessage()); + if (view != null) + view.onSettingsFileNotFound(); + } finally { + if (reader != null) { + try { + reader.close(); + } catch (IOException e) { + Log.error("[SettingsFile] Error closing: " + ini.getAbsolutePath() + e.getMessage()); + } + } + } + + return sections; + } + + public static HashMap readFile(final String fileName, SettingsActivityView view) { + return readFile(getSettingsFile(fileName), false, view); + } + + /** + * Reads a given .ini file from disk and returns it as a HashMap of SettingSections, themselves + * effectively a HashMap of key/value settings. If unsuccessful, outputs an error telling why it + * failed. + * + * @param gameId the id of the game to load it's settings. + * @param view The current view. + */ + public static HashMap readCustomGameSettings(final String gameId, SettingsActivityView view) { + return readFile(getCustomGameSettingsFile(gameId), true, view); + } + + /** + * Saves a Settings HashMap to a given .ini file on disk. If unsuccessful, outputs an error + * telling why it failed. + * + * @param fileName The target filename without a path or extension. + * @param sections The HashMap containing the Settings we want to serialize. + * @param view The current view. + */ + public static void saveFile(final String fileName, TreeMap sections, + SettingsActivityView view) { + File ini = getSettingsFile(fileName); + + try { + Wini writer = new Wini(ini); + + Set keySet = sections.keySet(); + for (String key : keySet) { + SettingSection section = sections.get(key); + writeSection(writer, section); + } + writer.store(); + } catch (IOException e) { + Log.error("[SettingsFile] File not found: " + fileName + ".ini: " + e.getMessage()); + view.showToastMessage(CitraApplication.getAppContext().getString(R.string.error_saving, fileName, e.getMessage()), false); + } + } + + + public static void saveCustomGameSettings(final String gameId, final HashMap sections) { + Set sortedSections = new TreeSet<>(sections.keySet()); + + for (String sectionKey : sortedSections) { + SettingSection section = sections.get(sectionKey); + + HashMap settings = section.getSettings(); + Set sortedKeySet = new TreeSet<>(settings.keySet()); + + for (String settingKey : sortedKeySet) { + Setting setting = settings.get(settingKey); + NativeLibrary.SetUserSetting(gameId, mapSectionNameFromIni(section.getName()), setting.getKey(), setting.getValueAsString()); + } + } + } + + private static String mapSectionNameFromIni(String generalSectionName) { + if (sectionsMap.getForward(generalSectionName) != null) { + return sectionsMap.getForward(generalSectionName); + } + + return generalSectionName; + } + + private static String mapSectionNameToIni(String generalSectionName) { + if (sectionsMap.getBackward(generalSectionName) != null) { + return sectionsMap.getBackward(generalSectionName); + } + + return generalSectionName; + } + + @NonNull + private static File getSettingsFile(String fileName) { + return new File( + DirectoryInitialization.getUserDirectory() + "/config/" + fileName + ".ini"); + } + + private static File getCustomGameSettingsFile(String gameId) { + return new File(DirectoryInitialization.getUserDirectory() + "/GameSettings/" + gameId + ".ini"); + } + + private static SettingSection sectionFromLine(String line, boolean isCustomGame) { + String sectionName = line.substring(1, line.length() - 1); + if (isCustomGame) { + sectionName = mapSectionNameToIni(sectionName); + } + return new SettingSection(sectionName); + } + + /** + * For a line of text, determines what type of data is being represented, and returns + * a Setting object containing this data. + * + * @param current The section currently being parsed by the consuming method. + * @param line The line of text being parsed. + * @return A typed Setting containing the key/value contained in the line. + */ + private static Setting settingFromLine(SettingSection current, String line) { + String[] splitLine = line.split("="); + + if (splitLine.length != 2) { + Log.warning("Skipping invalid config line \"" + line + "\""); + return null; + } + + String key = splitLine[0].trim(); + String value = splitLine[1].trim(); + + if (value.isEmpty()) { + Log.warning("Skipping null value in config line \"" + line + "\""); + return null; + } + + try { + int valueAsInt = Integer.parseInt(value); + + return new IntSetting(key, current.getName(), valueAsInt); + } catch (NumberFormatException ex) { + } + + try { + float valueAsFloat = Float.parseFloat(value); + + return new FloatSetting(key, current.getName(), valueAsFloat); + } catch (NumberFormatException ex) { + } + + return new StringSetting(key, current.getName(), value); + } + + /** + * Writes the contents of a Section HashMap to disk. + * + * @param parser A Wini pointed at a file on disk. + * @param section A section containing settings to be written to the file. + */ + private static void writeSection(Wini parser, SettingSection section) { + // Write the section header. + String header = section.getName(); + + // Write this section's values. + HashMap settings = section.getSettings(); + Set keySet = settings.keySet(); + + for (String key : keySet) { + Setting setting = settings.get(key); + parser.put(header, setting.getKey(), setting.getValueAsString()); + } + } +} diff --git a/src/android/app/src/main/java/org/citra/citra_emu/fragments/CustomFilePickerFragment.java b/src/android/app/src/main/java/org/citra/citra_emu/fragments/CustomFilePickerFragment.java new file mode 100644 index 000000000..c18ecd4c3 --- /dev/null +++ b/src/android/app/src/main/java/org/citra/citra_emu/fragments/CustomFilePickerFragment.java @@ -0,0 +1,120 @@ +package org.citra.citra_emu.fragments; + +import android.net.Uri; +import android.os.Bundle; +import android.os.Environment; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.widget.TextView; + +import androidx.annotation.NonNull; +import androidx.appcompat.widget.Toolbar; +import androidx.core.content.FileProvider; + +import com.nononsenseapps.filepicker.FilePickerFragment; + +import org.citra.citra_emu.R; + +import java.io.File; +import java.util.Arrays; +import java.util.Collections; +import java.util.List; + +public class CustomFilePickerFragment extends FilePickerFragment { + private static String ALL_FILES = "*"; + private int mTitle; + private static List extensions = Collections.singletonList(ALL_FILES); + + @NonNull + @Override + public Uri toUri(@NonNull final File file) { + return FileProvider + .getUriForFile(getContext(), + getContext().getApplicationContext().getPackageName() + ".filesprovider", + file); + } + + @Override + public void onActivityCreated(Bundle savedInstanceState) { + super.onActivityCreated(savedInstanceState); + + if (mode == MODE_DIR) { + TextView ok = getActivity().findViewById(R.id.nnf_button_ok); + ok.setText(R.string.select_dir); + + TextView cancel = getActivity().findViewById(R.id.nnf_button_cancel); + cancel.setVisibility(View.GONE); + } + } + + @Override + protected View inflateRootView(LayoutInflater inflater, ViewGroup container) { + View view = super.inflateRootView(inflater, container); + if (mTitle != 0) { + Toolbar toolbar = view.findViewById(com.nononsenseapps.filepicker.R.id.nnf_picker_toolbar); + ViewGroup parent = (ViewGroup) toolbar.getParent(); + int index = parent.indexOfChild(toolbar); + View newToolbar = inflater.inflate(R.layout.filepicker_toolbar, toolbar, false); + TextView title = newToolbar.findViewById(R.id.filepicker_title); + title.setText(mTitle); + parent.removeView(toolbar); + parent.addView(newToolbar, index); + } + return view; + } + + public void setTitle(int title) { + mTitle = title; + } + + public void setAllowedExtensions(String allowedExtensions) { + if (allowedExtensions == null) + return; + + extensions = Arrays.asList(allowedExtensions.split(",")); + } + + @Override + protected boolean isItemVisible(@NonNull final File file) { + // Some users jump to the conclusion that Dolphin isn't able to detect their + // files if the files don't show up in the file picker when mode == MODE_DIR. + // To avoid this, show files even when the user needs to select a directory. + return (showHiddenItems || !file.isHidden()) && + (file.isDirectory() || extensions.contains(ALL_FILES) || + extensions.contains(fileExtension(file.getName()).toLowerCase())); + } + + @Override + public boolean isCheckable(@NonNull final File file) { + // We need to make a small correction to the isCheckable logic due to + // overriding isItemVisible to show files when mode == MODE_DIR. + // AbstractFilePickerFragment always treats files as checkable when + // allowExistingFile == true, but we don't want files to be checkable when mode == MODE_DIR. + return super.isCheckable(file) && !(mode == MODE_DIR && file.isFile()); + } + + @Override + public void goUp() { + if (Environment.getExternalStorageDirectory().getPath().equals(mCurrentPath.getPath())) { + goToDir(new File("/storage/")); + return; + } + if (mCurrentPath.equals(new File("/storage/"))){ + return; + } + super.goUp(); + } + + @Override + public void onClickDir(@NonNull View view, @NonNull DirViewHolder viewHolder) { + if(viewHolder.file.equals(new File("/storage/emulated/"))) + viewHolder.file = new File("/storage/emulated/0/"); + super.onClickDir(view, viewHolder); + } + + private static String fileExtension(@NonNull String filename) { + int i = filename.lastIndexOf('.'); + return i < 0 ? "" : filename.substring(i + 1); + } +} diff --git a/src/android/app/src/main/java/org/citra/citra_emu/fragments/EmulationFragment.java b/src/android/app/src/main/java/org/citra/citra_emu/fragments/EmulationFragment.java new file mode 100644 index 000000000..445faa047 --- /dev/null +++ b/src/android/app/src/main/java/org/citra/citra_emu/fragments/EmulationFragment.java @@ -0,0 +1,378 @@ +package org.citra.citra_emu.fragments; + +import android.content.Context; +import android.content.IntentFilter; +import android.content.SharedPreferences; +import android.os.Bundle; +import android.os.Handler; +import android.preference.PreferenceManager; +import android.view.Choreographer; +import android.view.LayoutInflater; +import android.view.Surface; +import android.view.SurfaceHolder; +import android.view.SurfaceView; +import android.view.View; +import android.view.ViewGroup; +import android.widget.Button; +import android.widget.TextView; +import android.widget.Toast; + +import androidx.annotation.NonNull; +import androidx.fragment.app.Fragment; +import androidx.localbroadcastmanager.content.LocalBroadcastManager; + +import org.citra.citra_emu.NativeLibrary; +import org.citra.citra_emu.R; +import org.citra.citra_emu.activities.EmulationActivity; +import org.citra.citra_emu.overlay.InputOverlay; +import org.citra.citra_emu.utils.DirectoryInitialization; +import org.citra.citra_emu.utils.DirectoryInitialization.DirectoryInitializationState; +import org.citra.citra_emu.utils.DirectoryStateReceiver; +import org.citra.citra_emu.utils.EmulationMenuSettings; +import org.citra.citra_emu.utils.Log; + +public final class EmulationFragment extends Fragment implements SurfaceHolder.Callback, Choreographer.FrameCallback { + private static final String KEY_GAMEPATH = "gamepath"; + + private static final Handler perfStatsUpdateHandler = new Handler(); + + private SharedPreferences mPreferences; + + private InputOverlay mInputOverlay; + + private EmulationState mEmulationState; + + private DirectoryStateReceiver directoryStateReceiver; + + private EmulationActivity activity; + + private TextView mPerfStats; + + private Runnable perfStatsUpdater; + + public static EmulationFragment newInstance(String gamePath) { + Bundle args = new Bundle(); + args.putString(KEY_GAMEPATH, gamePath); + + EmulationFragment fragment = new EmulationFragment(); + fragment.setArguments(args); + return fragment; + } + + @Override + public void onAttach(@NonNull Context context) { + super.onAttach(context); + + if (context instanceof EmulationActivity) { + activity = (EmulationActivity) context; + NativeLibrary.setEmulationActivity((EmulationActivity) context); + } else { + throw new IllegalStateException("EmulationFragment must have EmulationActivity parent"); + } + } + + /** + * Initialize anything that doesn't depend on the layout / views in here. + */ + @Override + public void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + + // So this fragment doesn't restart on configuration changes; i.e. rotation. + setRetainInstance(true); + + mPreferences = PreferenceManager.getDefaultSharedPreferences(getActivity()); + + String gamePath = getArguments().getString(KEY_GAMEPATH); + mEmulationState = new EmulationState(gamePath); + } + + /** + * Initialize the UI and start emulation in here. + */ + @Override + public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { + View contents = inflater.inflate(R.layout.fragment_emulation, container, false); + + SurfaceView surfaceView = contents.findViewById(R.id.surface_emulation); + surfaceView.getHolder().addCallback(this); + + mInputOverlay = contents.findViewById(R.id.surface_input_overlay); + mPerfStats = contents.findViewById(R.id.show_fps_text); + + Button doneButton = contents.findViewById(R.id.done_control_config); + if (doneButton != null) { + doneButton.setOnClickListener(v -> stopConfiguringControls()); + } + + // Show/hide the "Show FPS" overlay + updateShowFpsOverlay(); + + // The new Surface created here will get passed to the native code via onSurfaceChanged. + return contents; + } + + @Override + public void onResume() { + super.onResume(); + Choreographer.getInstance().postFrameCallback(this); + if (DirectoryInitialization.areCitraDirectoriesReady()) { + mEmulationState.run(activity.isActivityRecreated()); + } else { + setupCitraDirectoriesThenStartEmulation(); + } + } + + @Override + public void onPause() { + if (directoryStateReceiver != null) { + LocalBroadcastManager.getInstance(getActivity()).unregisterReceiver(directoryStateReceiver); + directoryStateReceiver = null; + } + + if (mEmulationState.isRunning()) { + mEmulationState.pause(); + } + + Choreographer.getInstance().removeFrameCallback(this); + super.onPause(); + } + + @Override + public void onDetach() { + NativeLibrary.clearEmulationActivity(); + super.onDetach(); + } + + private void setupCitraDirectoriesThenStartEmulation() { + IntentFilter statusIntentFilter = new IntentFilter( + DirectoryInitialization.BROADCAST_ACTION); + + directoryStateReceiver = + new DirectoryStateReceiver(directoryInitializationState -> + { + if (directoryInitializationState == + DirectoryInitializationState.CITRA_DIRECTORIES_INITIALIZED) { + mEmulationState.run(activity.isActivityRecreated()); + } else if (directoryInitializationState == + DirectoryInitializationState.EXTERNAL_STORAGE_PERMISSION_NEEDED) { + Toast.makeText(getContext(), R.string.write_permission_needed, Toast.LENGTH_SHORT) + .show(); + } else if (directoryInitializationState == + DirectoryInitializationState.CANT_FIND_EXTERNAL_STORAGE) { + Toast.makeText(getContext(), R.string.external_storage_not_mounted, + Toast.LENGTH_SHORT) + .show(); + } + }); + + // Registers the DirectoryStateReceiver and its intent filters + LocalBroadcastManager.getInstance(getActivity()).registerReceiver( + directoryStateReceiver, + statusIntentFilter); + DirectoryInitialization.start(getActivity()); + } + + public void refreshInputOverlay() { + mInputOverlay.refreshControls(); + } + + public void resetInputOverlay() { + // Reset button scale + SharedPreferences.Editor editor = mPreferences.edit(); + editor.putInt("controlScale", 50); + editor.apply(); + + mInputOverlay.resetButtonPlacement(); + } + + public void updateShowFpsOverlay() { + if (EmulationMenuSettings.getShowFps()) { + final int SYSTEM_FPS = 0; + final int FPS = 1; + final int FRAMETIME = 2; + final int SPEED = 3; + + perfStatsUpdater = () -> + { + final double[] perfStats = NativeLibrary.GetPerfStats(); + if (perfStats[FPS] > 0) { + mPerfStats.setText(String.format("FPS: %d Speed: %d%%", (int) (perfStats[FPS] + 0.5), + (int) (perfStats[SPEED] * 100.0 + 0.5))); + } + + perfStatsUpdateHandler.postDelayed(perfStatsUpdater, 3000); + }; + perfStatsUpdateHandler.post(perfStatsUpdater); + + mPerfStats.setVisibility(View.VISIBLE); + } else { + if (perfStatsUpdater != null) { + perfStatsUpdateHandler.removeCallbacks(perfStatsUpdater); + } + + mPerfStats.setVisibility(View.GONE); + } + } + + @Override + public void surfaceCreated(SurfaceHolder holder) { + // We purposely don't do anything here. + // All work is done in surfaceChanged, which we are guaranteed to get even for surface creation. + } + + @Override + public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) { + Log.debug("[EmulationFragment] Surface changed. Resolution: " + width + "x" + height); + mEmulationState.newSurface(holder.getSurface()); + } + + @Override + public void surfaceDestroyed(SurfaceHolder holder) { + mEmulationState.clearSurface(); + } + + @Override + public void doFrame(long frameTimeNanos) { + Choreographer.getInstance().postFrameCallback(this); + NativeLibrary.DoFrame(); + } + + public void stopEmulation() { + mEmulationState.stop(); + } + + public void startConfiguringControls() { + getView().findViewById(R.id.done_control_config).setVisibility(View.VISIBLE); + mInputOverlay.setIsInEditMode(true); + } + + public void stopConfiguringControls() { + getView().findViewById(R.id.done_control_config).setVisibility(View.GONE); + mInputOverlay.setIsInEditMode(false); + } + + public boolean isConfiguringControls() { + return mInputOverlay.isInEditMode(); + } + + private static class EmulationState { + private final String mGamePath; + private State state; + private Surface mSurface; + private boolean mRunWhenSurfaceIsValid; + + EmulationState(String gamePath) { + mGamePath = gamePath; + // Starting state is stopped. + state = State.STOPPED; + } + + public synchronized boolean isStopped() { + return state == State.STOPPED; + } + + // Getters for the current state + + public synchronized boolean isPaused() { + return state == State.PAUSED; + } + + public synchronized boolean isRunning() { + return state == State.RUNNING; + } + + public synchronized void stop() { + if (state != State.STOPPED) { + Log.debug("[EmulationFragment] Stopping emulation."); + state = State.STOPPED; + NativeLibrary.StopEmulation(); + } else { + Log.warning("[EmulationFragment] Stop called while already stopped."); + } + } + + // State changing methods + + public synchronized void pause() { + if (state != State.PAUSED) { + state = State.PAUSED; + Log.debug("[EmulationFragment] Pausing emulation."); + + // Release the surface before pausing, since emulation has to be running for that. + NativeLibrary.SurfaceDestroyed(); + NativeLibrary.PauseEmulation(); + } else { + Log.warning("[EmulationFragment] Pause called while already paused."); + } + } + + public synchronized void run(boolean isActivityRecreated) { + if (isActivityRecreated) { + if (NativeLibrary.IsRunning()) { + state = State.PAUSED; + } + } else { + Log.debug("[EmulationFragment] activity resumed or fresh start"); + } + + // If the surface is set, run now. Otherwise, wait for it to get set. + if (mSurface != null) { + runWithValidSurface(); + } else { + mRunWhenSurfaceIsValid = true; + } + } + + // Surface callbacks + public synchronized void newSurface(Surface surface) { + mSurface = surface; + if (mRunWhenSurfaceIsValid) { + runWithValidSurface(); + } + } + + public synchronized void clearSurface() { + if (mSurface == null) { + Log.warning("[EmulationFragment] clearSurface called, but surface already null."); + } else { + mSurface = null; + Log.debug("[EmulationFragment] Surface destroyed."); + + if (state == State.RUNNING) { + NativeLibrary.SurfaceDestroyed(); + state = State.PAUSED; + } else if (state == State.PAUSED) { + Log.warning("[EmulationFragment] Surface cleared while emulation paused."); + } else { + Log.warning("[EmulationFragment] Surface cleared while emulation stopped."); + } + } + } + + private void runWithValidSurface() { + mRunWhenSurfaceIsValid = false; + if (state == State.STOPPED) { + NativeLibrary.SurfaceChanged(mSurface); + Thread mEmulationThread = new Thread(() -> + { + Log.debug("[EmulationFragment] Starting emulation thread."); + NativeLibrary.Run(mGamePath); + }, "NativeEmulation"); + mEmulationThread.start(); + + } else if (state == State.PAUSED) { + Log.debug("[EmulationFragment] Resuming emulation."); + NativeLibrary.SurfaceChanged(mSurface); + NativeLibrary.UnPauseEmulation(); + } else { + Log.debug("[EmulationFragment] Bug, run called while already running."); + } + state = State.RUNNING; + } + + private enum State { + STOPPED, RUNNING, PAUSED + } + } +} diff --git a/src/android/app/src/main/java/org/citra/citra_emu/model/Game.java b/src/android/app/src/main/java/org/citra/citra_emu/model/Game.java new file mode 100644 index 000000000..a4ffc59c7 --- /dev/null +++ b/src/android/app/src/main/java/org/citra/citra_emu/model/Game.java @@ -0,0 +1,76 @@ +package org.citra.citra_emu.model; + +import android.content.ContentValues; +import android.database.Cursor; + +import java.nio.file.Paths; + +public final class Game { + private String mTitle; + private String mDescription; + private String mPath; + private String mGameId; + private String mCompany; + private String mRegions; + + public Game(String title, String description, String regions, String path, + String gameId, String company) { + mTitle = title; + mDescription = description; + mRegions = regions; + mPath = path; + mGameId = gameId; + mCompany = company; + } + + public static ContentValues asContentValues(String title, String description, String regions, String path, String gameId, String company) { + ContentValues values = new ContentValues(); + + if (gameId.isEmpty()) { + // Homebrew, etc. may not have a game ID, use filename as a unique identifier + gameId = Paths.get(path).getFileName().toString(); + } + + values.put(GameDatabase.KEY_GAME_TITLE, title); + values.put(GameDatabase.KEY_GAME_DESCRIPTION, description); + values.put(GameDatabase.KEY_GAME_REGIONS, regions); + values.put(GameDatabase.KEY_GAME_PATH, path); + values.put(GameDatabase.KEY_GAME_ID, gameId); + values.put(GameDatabase.KEY_GAME_COMPANY, company); + + return values; + } + + public static Game fromCursor(Cursor cursor) { + return new Game(cursor.getString(GameDatabase.GAME_COLUMN_TITLE), + cursor.getString(GameDatabase.GAME_COLUMN_DESCRIPTION), + cursor.getString(GameDatabase.GAME_COLUMN_REGIONS), + cursor.getString(GameDatabase.GAME_COLUMN_PATH), + cursor.getString(GameDatabase.GAME_COLUMN_GAME_ID), + cursor.getString(GameDatabase.GAME_COLUMN_COMPANY)); + } + + public String getTitle() { + return mTitle; + } + + public String getDescription() { + return mDescription; + } + + public String getCompany() { + return mCompany; + } + + public String getRegions() { + return mRegions; + } + + public String getPath() { + return mPath; + } + + public String getGameId() { + return mGameId; + } +} diff --git a/src/android/app/src/main/java/org/citra/citra_emu/model/GameDatabase.java b/src/android/app/src/main/java/org/citra/citra_emu/model/GameDatabase.java new file mode 100644 index 000000000..215528541 --- /dev/null +++ b/src/android/app/src/main/java/org/citra/citra_emu/model/GameDatabase.java @@ -0,0 +1,280 @@ +package org.citra.citra_emu.model; + +import android.content.ContentValues; +import android.content.Context; +import android.database.Cursor; +import android.database.sqlite.SQLiteDatabase; +import android.database.sqlite.SQLiteOpenHelper; + +import org.citra.citra_emu.NativeLibrary; +import org.citra.citra_emu.utils.Log; + +import java.io.File; +import java.lang.reflect.Array; +import java.util.Arrays; +import java.util.HashSet; +import java.util.Set; + +import rx.Observable; + +/** + * A helper class that provides several utilities simplifying interaction with + * the SQLite database. + */ +public final class GameDatabase extends SQLiteOpenHelper { + public static final int COLUMN_DB_ID = 0; + public static final int GAME_COLUMN_PATH = 1; + public static final int GAME_COLUMN_TITLE = 2; + public static final int GAME_COLUMN_DESCRIPTION = 3; + public static final int GAME_COLUMN_REGIONS = 4; + public static final int GAME_COLUMN_GAME_ID = 5; + public static final int GAME_COLUMN_COMPANY = 6; + public static final int FOLDER_COLUMN_PATH = 1; + public static final String KEY_DB_ID = "_id"; + public static final String KEY_GAME_PATH = "path"; + public static final String KEY_GAME_TITLE = "title"; + public static final String KEY_GAME_DESCRIPTION = "description"; + public static final String KEY_GAME_REGIONS = "regions"; + public static final String KEY_GAME_ID = "game_id"; + public static final String KEY_GAME_COMPANY = "company"; + public static final String KEY_FOLDER_PATH = "path"; + public static final String TABLE_NAME_FOLDERS = "folders"; + public static final String TABLE_NAME_GAMES = "games"; + private static final int DB_VERSION = 2; + private static final String TYPE_PRIMARY = " INTEGER PRIMARY KEY"; + private static final String TYPE_INTEGER = " INTEGER"; + private static final String TYPE_STRING = " TEXT"; + + private static final String CONSTRAINT_UNIQUE = " UNIQUE"; + + private static final String SEPARATOR = ", "; + + private static final String SQL_CREATE_GAMES = "CREATE TABLE " + TABLE_NAME_GAMES + "(" + + KEY_DB_ID + TYPE_PRIMARY + SEPARATOR + + KEY_GAME_PATH + TYPE_STRING + SEPARATOR + + KEY_GAME_TITLE + TYPE_STRING + SEPARATOR + + KEY_GAME_DESCRIPTION + TYPE_STRING + SEPARATOR + + KEY_GAME_REGIONS + TYPE_STRING + SEPARATOR + + KEY_GAME_ID + TYPE_STRING + SEPARATOR + + KEY_GAME_COMPANY + TYPE_STRING + ")"; + + private static final String SQL_CREATE_FOLDERS = "CREATE TABLE " + TABLE_NAME_FOLDERS + "(" + + KEY_DB_ID + TYPE_PRIMARY + SEPARATOR + + KEY_FOLDER_PATH + TYPE_STRING + CONSTRAINT_UNIQUE + ")"; + + private static final String SQL_DELETE_FOLDERS = "DROP TABLE IF EXISTS " + TABLE_NAME_FOLDERS; + private static final String SQL_DELETE_GAMES = "DROP TABLE IF EXISTS " + TABLE_NAME_GAMES; + + public GameDatabase(Context context) { + // Superclass constructor builds a database or uses an existing one. + super(context, "games.db", null, DB_VERSION); + } + + @Override + public void onCreate(SQLiteDatabase database) { + Log.debug("[GameDatabase] GameDatabase - Creating database..."); + + execSqlAndLog(database, SQL_CREATE_GAMES); + execSqlAndLog(database, SQL_CREATE_FOLDERS); + } + + @Override + public void onDowngrade(SQLiteDatabase database, int oldVersion, int newVersion) { + Log.verbose("[GameDatabase] Downgrades not supporting, clearing databases.."); + execSqlAndLog(database, SQL_DELETE_FOLDERS); + execSqlAndLog(database, SQL_CREATE_FOLDERS); + + execSqlAndLog(database, SQL_DELETE_GAMES); + execSqlAndLog(database, SQL_CREATE_GAMES); + } + + @Override + public void onUpgrade(SQLiteDatabase database, int oldVersion, int newVersion) { + Log.info("[GameDatabase] Upgrading database from schema version " + oldVersion + " to " + + newVersion); + + // Delete all the games + execSqlAndLog(database, SQL_DELETE_GAMES); + execSqlAndLog(database, SQL_CREATE_GAMES); + } + + public void resetDatabase(SQLiteDatabase database) { + execSqlAndLog(database, SQL_DELETE_FOLDERS); + execSqlAndLog(database, SQL_CREATE_FOLDERS); + + execSqlAndLog(database, SQL_DELETE_GAMES); + execSqlAndLog(database, SQL_CREATE_GAMES); + } + + public void scanLibrary(SQLiteDatabase database) { + // Before scanning known folders, go through the game table and remove any entries for which the file itself is missing. + Cursor fileCursor = database.query(TABLE_NAME_GAMES, + null, // Get all columns. + null, // Get all rows. + null, + null, // No grouping. + null, + null); // Order of games is irrelevant. + + // Possibly overly defensive, but ensures that moveToNext() does not skip a row. + fileCursor.moveToPosition(-1); + + while (fileCursor.moveToNext()) { + String gamePath = fileCursor.getString(GAME_COLUMN_PATH); + File game = new File(gamePath); + + if (!game.exists()) { + Log.error("[GameDatabase] Game file no longer exists. Removing from the library: " + + gamePath); + database.delete(TABLE_NAME_GAMES, + KEY_DB_ID + " = ?", + new String[]{Long.toString(fileCursor.getLong(COLUMN_DB_ID))}); + } + } + + // Get a cursor listing all the folders the user has added to the library. + Cursor folderCursor = database.query(TABLE_NAME_FOLDERS, + null, // Get all columns. + null, // Get all rows. + null, + null, // No grouping. + null, + null); // Order of folders is irrelevant. + + Set allowedExtensions = new HashSet(Arrays.asList( + ".3ds", ".3dsx", ".elf", ".axf", ".cci", ".cxi", ".app", ".rar", ".zip", ".7z", ".torrent", ".tar", ".gz")); + + // Possibly overly defensive, but ensures that moveToNext() does not skip a row. + folderCursor.moveToPosition(-1); + + // Iterate through all results of the DB query (i.e. all folders in the library.) + while (folderCursor.moveToNext()) { + String folderPath = folderCursor.getString(FOLDER_COLUMN_PATH); + + File folder = new File(folderPath); + // If the folder is empty because it no longer exists, remove it from the library. + if (!folder.exists()) { + Log.error( + "[GameDatabase] Folder no longer exists. Removing from the library: " + folderPath); + database.delete(TABLE_NAME_FOLDERS, + KEY_DB_ID + " = ?", + new String[]{Long.toString(folderCursor.getLong(COLUMN_DB_ID))}); + } + + addGamesRecursive(database, folder, allowedExtensions, 3); + } + + fileCursor.close(); + folderCursor.close(); + + Arrays.stream(NativeLibrary.GetInstalledGamePaths()) + .forEach(filePath -> attemptToAddGame(database, filePath)); + + database.close(); + } + + private static void addGamesRecursive(SQLiteDatabase database, File parent, Set allowedExtensions, int depth) { + if (depth <= 0) { + return; + } + + File[] children = parent.listFiles(); + if (children != null) { + for (File file : children) { + if (file.isHidden()) { + continue; + } + + if (file.isDirectory()) { + Set newExtensions = new HashSet<>(Arrays.asList( + ".3ds", ".3dsx", ".elf", ".axf", ".cci", ".cxi", ".app")); + addGamesRecursive(database, file, newExtensions, depth - 1); + } else { + String filePath = file.getPath(); + + int extensionStart = filePath.lastIndexOf('.'); + if (extensionStart > 0) { + String fileExtension = filePath.substring(extensionStart); + + // Check that the file has an extension we care about before trying to read out of it. + if (allowedExtensions.contains(fileExtension.toLowerCase())) { + attemptToAddGame(database, filePath); + } + } + } + } + } + } + + private static void attemptToAddGame(SQLiteDatabase database, String filePath) { + String name = NativeLibrary.GetTitle(filePath); + + // If the game's title field is empty, use the filename. + if (name.isEmpty()) { + name = filePath.substring(filePath.lastIndexOf("/") + 1); + } + + String gameId = NativeLibrary.GetGameId(filePath); + + // If the game's ID field is empty, use the filename without extension. + if (gameId.isEmpty()) { + gameId = filePath.substring(filePath.lastIndexOf("/") + 1, + filePath.lastIndexOf(".")); + } + + ContentValues game = Game.asContentValues(name, + NativeLibrary.GetDescription(filePath).replace("\n", " "), + NativeLibrary.GetRegions(filePath), + filePath, + gameId, + NativeLibrary.GetCompany(filePath)); + + // Try to update an existing game first. + int rowsMatched = database.update(TABLE_NAME_GAMES, // Which table to update. + game, + // The values to fill the row with. + KEY_GAME_ID + " = ?", + // The WHERE clause used to find the right row. + new String[]{game.getAsString( + KEY_GAME_ID)}); // The ? in WHERE clause is replaced with this, + // which is provided as an array because there + // could potentially be more than one argument. + + // If update fails, insert a new game instead. + if (rowsMatched == 0) { + Log.verbose("[GameDatabase] Adding game: " + game.getAsString(KEY_GAME_TITLE)); + database.insert(TABLE_NAME_GAMES, null, game); + } else { + Log.verbose("[GameDatabase] Updated game: " + game.getAsString(KEY_GAME_TITLE)); + } + } + + public Observable getGames() { + return Observable.create(subscriber -> + { + Log.info("[GameDatabase] Reading games list..."); + + SQLiteDatabase database = getReadableDatabase(); + Cursor resultCursor = database.query( + TABLE_NAME_GAMES, + null, + null, + null, + null, + null, + KEY_GAME_TITLE + " ASC" + ); + + // Pass the result cursor to the consumer. + subscriber.onNext(resultCursor); + + // Tell the consumer we're done; it will unsubscribe implicitly. + subscriber.onCompleted(); + }); + } + + private void execSqlAndLog(SQLiteDatabase database, String sql) { + Log.verbose("[GameDatabase] Executing SQL: " + sql); + database.execSQL(sql); + } +} diff --git a/src/android/app/src/main/java/org/citra/citra_emu/model/GameProvider.java b/src/android/app/src/main/java/org/citra/citra_emu/model/GameProvider.java new file mode 100644 index 000000000..33b289fc4 --- /dev/null +++ b/src/android/app/src/main/java/org/citra/citra_emu/model/GameProvider.java @@ -0,0 +1,138 @@ +package org.citra.citra_emu.model; + +import android.content.ContentProvider; +import android.content.ContentValues; +import android.database.Cursor; +import android.database.sqlite.SQLiteDatabase; +import android.net.Uri; + +import androidx.annotation.NonNull; + +import org.citra.citra_emu.BuildConfig; +import org.citra.citra_emu.utils.Log; + +/** + * Provides an interface allowing Activities to interact with the SQLite database. + * CRUD methods in this class can be called by Activities using getContentResolver(). + */ +public final class GameProvider extends ContentProvider { + public static final String REFRESH_LIBRARY = "refresh"; + public static final String RESET_LIBRARY = "reset"; + + public static final String AUTHORITY = "content://" + BuildConfig.APPLICATION_ID + ".provider"; + public static final Uri URI_FOLDER = + Uri.parse(AUTHORITY + "/" + GameDatabase.TABLE_NAME_FOLDERS + "/"); + public static final Uri URI_REFRESH = Uri.parse(AUTHORITY + "/" + REFRESH_LIBRARY + "/"); + public static final Uri URI_RESET = Uri.parse(AUTHORITY + "/" + RESET_LIBRARY + "/"); + + public static final String MIME_TYPE_FOLDER = "vnd.android.cursor.item/vnd.dolphin.folder"; + public static final String MIME_TYPE_GAME = "vnd.android.cursor.item/vnd.dolphin.game"; + + + private GameDatabase mDbHelper; + + @Override + public boolean onCreate() { + Log.info("[GameProvider] Creating Content Provider..."); + + mDbHelper = new GameDatabase(getContext()); + + return true; + } + + @Override + public Cursor query(@NonNull Uri uri, String[] projection, String selection, + String[] selectionArgs, String sortOrder) { + Log.info("[GameProvider] Querying URI: " + uri); + + SQLiteDatabase db = mDbHelper.getReadableDatabase(); + + String table = uri.getLastPathSegment(); + + if (table == null) { + Log.error("[GameProvider] Badly formatted URI: " + uri); + return null; + } + + Cursor cursor = db.query(table, projection, selection, selectionArgs, null, null, sortOrder); + cursor.setNotificationUri(getContext().getContentResolver(), uri); + + return cursor; + } + + @Override + public String getType(@NonNull Uri uri) { + Log.verbose("[GameProvider] Getting MIME type for URI: " + uri); + String lastSegment = uri.getLastPathSegment(); + + if (lastSegment == null) { + Log.error("[GameProvider] Badly formatted URI: " + uri); + return null; + } + + if (lastSegment.equals(GameDatabase.TABLE_NAME_FOLDERS)) { + return MIME_TYPE_FOLDER; + } else if (lastSegment.equals(GameDatabase.TABLE_NAME_GAMES)) { + return MIME_TYPE_GAME; + } + + Log.error("[GameProvider] Unknown MIME type for URI: " + uri); + return null; + } + + @Override + public Uri insert(@NonNull Uri uri, ContentValues values) { + Log.info("[GameProvider] Inserting row at URI: " + uri); + + SQLiteDatabase database = mDbHelper.getWritableDatabase(); + String table = uri.getLastPathSegment(); + + if (table != null) { + if (table.equals(RESET_LIBRARY)) { + mDbHelper.resetDatabase(database); + return uri; + } + if (table.equals(REFRESH_LIBRARY)) { + Log.info( + "[GameProvider] URI specified table REFRESH_LIBRARY. No insertion necessary; refreshing library contents..."); + mDbHelper.scanLibrary(database); + return uri; + } + + long id = database.insertWithOnConflict(table, null, values, SQLiteDatabase.CONFLICT_IGNORE); + + // If insertion was successful... + if (id > 0) { + // If we just added a folder, add its contents to the game list. + if (table.equals(GameDatabase.TABLE_NAME_FOLDERS)) { + mDbHelper.scanLibrary(database); + } + + // Notify the UI that its contents should be refreshed. + getContext().getContentResolver().notifyChange(uri, null); + uri = Uri.withAppendedPath(uri, Long.toString(id)); + } else { + Log.error("[GameProvider] Row already exists: " + uri + " id: " + id); + } + } else { + Log.error("[GameProvider] Badly formatted URI: " + uri); + } + + database.close(); + + return uri; + } + + @Override + public int delete(@NonNull Uri uri, String selection, String[] selectionArgs) { + Log.error("[GameProvider] Delete operations unsupported. URI: " + uri); + return 0; + } + + @Override + public int update(@NonNull Uri uri, ContentValues values, String selection, + String[] selectionArgs) { + Log.error("[GameProvider] Update operations unsupported. URI: " + uri); + return 0; + } +} diff --git a/src/android/app/src/main/java/org/citra/citra_emu/overlay/InputOverlay.java b/src/android/app/src/main/java/org/citra/citra_emu/overlay/InputOverlay.java new file mode 100644 index 000000000..cdb2f7666 --- /dev/null +++ b/src/android/app/src/main/java/org/citra/citra_emu/overlay/InputOverlay.java @@ -0,0 +1,878 @@ +/** + * Copyright 2013 Dolphin Emulator Project + * Licensed under GPLv2+ + * Refer to the license.txt file included. + */ + +package org.citra.citra_emu.overlay; + +import android.app.Activity; +import android.content.Context; +import android.content.SharedPreferences; +import android.content.res.Configuration; +import android.content.res.Resources; +import android.graphics.Bitmap; +import android.graphics.BitmapFactory; +import android.graphics.Canvas; +import android.graphics.Rect; +import android.graphics.drawable.Drawable; +import android.preference.PreferenceManager; +import android.util.AttributeSet; +import android.util.DisplayMetrics; +import android.view.Display; +import android.view.MotionEvent; +import android.view.SurfaceView; +import android.view.View; +import android.view.View.OnTouchListener; + +import org.citra.citra_emu.NativeLibrary; +import org.citra.citra_emu.NativeLibrary.ButtonState; +import org.citra.citra_emu.NativeLibrary.ButtonType; +import org.citra.citra_emu.R; +import org.citra.citra_emu.utils.EmulationMenuSettings; + +import java.util.HashSet; +import java.util.Set; + +/** + * Draws the interactive input overlay on top of the + * {@link SurfaceView} that is rendering emulation. + */ +public final class InputOverlay extends SurfaceView implements OnTouchListener { + private final Set overlayButtons = new HashSet<>(); + private final Set overlayDpads = new HashSet<>(); + private final Set overlayJoysticks = new HashSet<>(); + + private boolean mIsInEditMode = false; + private InputOverlayDrawableButton mButtonBeingConfigured; + private InputOverlayDrawableDpad mDpadBeingConfigured; + private InputOverlayDrawableJoystick mJoystickBeingConfigured; + + private SharedPreferences mPreferences; + + // Stores the ID of the pointer that interacted with the 3DS touchscreen. + private int mTouchscreenPointerId = -1; + + /** + * Constructor + * + * @param context The current {@link Context}. + * @param attrs {@link AttributeSet} for parsing XML attributes. + */ + public InputOverlay(Context context, AttributeSet attrs) { + super(context, attrs); + + mPreferences = PreferenceManager.getDefaultSharedPreferences(getContext()); + if (!mPreferences.getBoolean("OverlayInit", false)) { + defaultOverlay(); + } + + // Reset 3ds touchscreen pointer ID + mTouchscreenPointerId = -1; + + // Load the controls. + refreshControls(); + + // Set the on touch listener. + setOnTouchListener(this); + + // Force draw + setWillNotDraw(false); + + // Request focus for the overlay so it has priority on presses. + requestFocus(); + } + + /** + * Resizes a {@link Bitmap} by a given scale factor + * + * @param context The current {@link Context} + * @param bitmap The {@link Bitmap} to scale. + * @param scale The scale factor for the bitmap. + * @return The scaled {@link Bitmap} + */ + public static Bitmap resizeBitmap(Context context, Bitmap bitmap, float scale) { + // Determine the button size based on the smaller screen dimension. + // This makes sure the buttons are the same size in both portrait and landscape. + DisplayMetrics dm = context.getResources().getDisplayMetrics(); + int minDimension = Math.min(dm.widthPixels, dm.heightPixels); + + return Bitmap.createScaledBitmap(bitmap, + (int) (minDimension * scale), + (int) (minDimension * scale), + true); + } + + /** + * Initializes an InputOverlayDrawableButton, given by resId, with all of the + * parameters set for it to be properly shown on the InputOverlay. + *

+ * This works due to the way the X and Y coordinates are stored within + * the {@link SharedPreferences}. + *

+ * In the input overlay configuration menu, + * once a touch event begins and then ends (ie. Organizing the buttons to one's own liking for the overlay). + * the X and Y coordinates of the button at the END of its touch event + * (when you remove your finger/stylus from the touchscreen) are then stored + * within a SharedPreferences instance so that those values can be retrieved here. + *

+ * This has a few benefits over the conventional way of storing the values + * (ie. within the Citra ini file). + *

    + *
  • No native calls
  • + *
  • Keeps Android-only values inside the Android environment
  • + *
+ *

+ * Technically no modifications should need to be performed on the returned + * InputOverlayDrawableButton. Simply add it to the HashSet of overlay items and wait + * for Android to call the onDraw method. + * + * @param context The current {@link Context}. + * @param defaultResId The resource ID of the {@link Drawable} to get the {@link Bitmap} of (Default State). + * @param pressedResId The resource ID of the {@link Drawable} to get the {@link Bitmap} of (Pressed State). + * @param buttonId Identifier for determining what type of button the initialized InputOverlayDrawableButton represents. + * @return An {@link InputOverlayDrawableButton} with the correct drawing bounds set. + */ + private static InputOverlayDrawableButton initializeOverlayButton(Context context, + int defaultResId, int pressedResId, int buttonId, String orientation) { + // Resources handle for fetching the initial Drawable resource. + final Resources res = context.getResources(); + + // SharedPreference to retrieve the X and Y coordinates for the InputOverlayDrawableButton. + final SharedPreferences sPrefs = PreferenceManager.getDefaultSharedPreferences(context); + + // Decide scale based on button ID and user preference + float scale; + + switch (buttonId) { + case ButtonType.BUTTON_HOME: + case ButtonType.BUTTON_START: + case ButtonType.BUTTON_SELECT: + scale = 0.08f; + break; + case ButtonType.TRIGGER_L: + case ButtonType.TRIGGER_R: + case ButtonType.BUTTON_ZL: + case ButtonType.BUTTON_ZR: + scale = 0.18f; + break; + default: + scale = 0.11f; + break; + } + + scale *= (sPrefs.getInt("controlScale", 50) + 50); + scale /= 100; + + // Initialize the InputOverlayDrawableButton. + final Bitmap defaultStateBitmap = + resizeBitmap(context, BitmapFactory.decodeResource(res, defaultResId), scale); + final Bitmap pressedStateBitmap = + resizeBitmap(context, BitmapFactory.decodeResource(res, pressedResId), scale); + final InputOverlayDrawableButton overlayDrawable = + new InputOverlayDrawableButton(res, defaultStateBitmap, pressedStateBitmap, buttonId); + + // The X and Y coordinates of the InputOverlayDrawableButton on the InputOverlay. + // These were set in the input overlay configuration menu. + String xKey; + String yKey; + + xKey = buttonId + orientation + "-X"; + yKey = buttonId + orientation + "-Y"; + + int drawableX = (int) sPrefs.getFloat(xKey, 0f); + int drawableY = (int) sPrefs.getFloat(yKey, 0f); + + int width = overlayDrawable.getWidth(); + int height = overlayDrawable.getHeight(); + + // Now set the bounds for the InputOverlayDrawableButton. + // This will dictate where on the screen (and the what the size) the InputOverlayDrawableButton will be. + overlayDrawable.setBounds(drawableX, drawableY, drawableX + width, drawableY + height); + + // Need to set the image's position + overlayDrawable.setPosition(drawableX, drawableY); + + return overlayDrawable; + } + + /** + * Initializes an {@link InputOverlayDrawableDpad} + * + * @param context The current {@link Context}. + * @param defaultResId The {@link Bitmap} resource ID of the default sate. + * @param pressedOneDirectionResId The {@link Bitmap} resource ID of the pressed sate in one direction. + * @param pressedTwoDirectionsResId The {@link Bitmap} resource ID of the pressed sate in two directions. + * @param buttonUp Identifier for the up button. + * @param buttonDown Identifier for the down button. + * @param buttonLeft Identifier for the left button. + * @param buttonRight Identifier for the right button. + * @return the initialized {@link InputOverlayDrawableDpad} + */ + private static InputOverlayDrawableDpad initializeOverlayDpad(Context context, + int defaultResId, + int pressedOneDirectionResId, + int pressedTwoDirectionsResId, + int buttonUp, + int buttonDown, + int buttonLeft, + int buttonRight, + String orientation) { + // Resources handle for fetching the initial Drawable resource. + final Resources res = context.getResources(); + + // SharedPreference to retrieve the X and Y coordinates for the InputOverlayDrawableDpad. + final SharedPreferences sPrefs = PreferenceManager.getDefaultSharedPreferences(context); + + // Decide scale based on button ID and user preference + float scale = 0.22f; + + scale *= (sPrefs.getInt("controlScale", 50) + 50); + scale /= 100; + + // Initialize the InputOverlayDrawableDpad. + final Bitmap defaultStateBitmap = + resizeBitmap(context, BitmapFactory.decodeResource(res, defaultResId), scale); + final Bitmap pressedOneDirectionStateBitmap = + resizeBitmap(context, BitmapFactory.decodeResource(res, pressedOneDirectionResId), + scale); + final Bitmap pressedTwoDirectionsStateBitmap = + resizeBitmap(context, BitmapFactory.decodeResource(res, pressedTwoDirectionsResId), + scale); + final InputOverlayDrawableDpad overlayDrawable = + new InputOverlayDrawableDpad(res, defaultStateBitmap, + pressedOneDirectionStateBitmap, pressedTwoDirectionsStateBitmap, + buttonUp, buttonDown, buttonLeft, buttonRight); + + // The X and Y coordinates of the InputOverlayDrawableDpad on the InputOverlay. + // These were set in the input overlay configuration menu. + int drawableX = (int) sPrefs.getFloat(buttonUp + orientation + "-X", 0f); + int drawableY = (int) sPrefs.getFloat(buttonUp + orientation + "-Y", 0f); + + int width = overlayDrawable.getWidth(); + int height = overlayDrawable.getHeight(); + + // Now set the bounds for the InputOverlayDrawableDpad. + // This will dictate where on the screen (and the what the size) the InputOverlayDrawableDpad will be. + overlayDrawable.setBounds(drawableX, drawableY, drawableX + width, drawableY + height); + + // Need to set the image's position + overlayDrawable.setPosition(drawableX, drawableY); + + return overlayDrawable; + } + + /** + * Initializes an {@link InputOverlayDrawableJoystick} + * + * @param context The current {@link Context} + * @param resOuter Resource ID for the outer image of the joystick (the static image that shows the circular bounds). + * @param defaultResInner Resource ID for the default inner image of the joystick (the one you actually move around). + * @param pressedResInner Resource ID for the pressed inner image of the joystick. + * @param joystick Identifier for which joystick this is. + * @return the initialized {@link InputOverlayDrawableJoystick}. + */ + private static InputOverlayDrawableJoystick initializeOverlayJoystick(Context context, + int resOuter, int defaultResInner, int pressedResInner, int joystick, String orientation) { + // Resources handle for fetching the initial Drawable resource. + final Resources res = context.getResources(); + + // SharedPreference to retrieve the X and Y coordinates for the InputOverlayDrawableJoystick. + final SharedPreferences sPrefs = PreferenceManager.getDefaultSharedPreferences(context); + + // Decide scale based on user preference + float scale = 0.275f; + scale *= (sPrefs.getInt("controlScale", 50) + 50); + scale /= 100; + + // Initialize the InputOverlayDrawableJoystick. + final Bitmap bitmapOuter = + resizeBitmap(context, BitmapFactory.decodeResource(res, resOuter), scale); + final Bitmap bitmapInnerDefault = BitmapFactory.decodeResource(res, defaultResInner); + final Bitmap bitmapInnerPressed = BitmapFactory.decodeResource(res, pressedResInner); + + // The X and Y coordinates of the InputOverlayDrawableButton on the InputOverlay. + // These were set in the input overlay configuration menu. + int drawableX = (int) sPrefs.getFloat(joystick + orientation + "-X", 0f); + int drawableY = (int) sPrefs.getFloat(joystick + orientation + "-Y", 0f); + + // Decide inner scale based on joystick ID + float outerScale = 1.f; + if (joystick == ButtonType.STICK_C) { + outerScale = 2.f; + } + + // Now set the bounds for the InputOverlayDrawableJoystick. + // This will dictate where on the screen (and the what the size) the InputOverlayDrawableJoystick will be. + int outerSize = bitmapOuter.getWidth(); + Rect outerRect = new Rect(drawableX, drawableY, drawableX + (int) (outerSize / outerScale), drawableY + (int) (outerSize / outerScale)); + Rect innerRect = new Rect(0, 0, (int) (outerSize / outerScale), (int) (outerSize / outerScale)); + + // Send the drawableId to the joystick so it can be referenced when saving control position. + final InputOverlayDrawableJoystick overlayDrawable + = new InputOverlayDrawableJoystick(res, bitmapOuter, + bitmapInnerDefault, bitmapInnerPressed, + outerRect, innerRect, joystick); + + // Need to set the image's position + overlayDrawable.setPosition(drawableX, drawableY); + + return overlayDrawable; + } + + @Override + public void draw(Canvas canvas) { + super.draw(canvas); + + for (InputOverlayDrawableButton button : overlayButtons) { + button.draw(canvas); + } + + for (InputOverlayDrawableDpad dpad : overlayDpads) { + dpad.draw(canvas); + } + + for (InputOverlayDrawableJoystick joystick : overlayJoysticks) { + joystick.draw(canvas); + } + } + + @Override + public boolean onTouch(View v, MotionEvent event) { + if (isInEditMode()) { + return onTouchWhileEditing(event); + } + + int pointerIndex = event.getActionIndex(); + + if (mPreferences.getBoolean("isTouchEnabled", true)) { + switch (event.getAction() & MotionEvent.ACTION_MASK) { + case MotionEvent.ACTION_DOWN: + case MotionEvent.ACTION_POINTER_DOWN: + if (NativeLibrary.onTouchEvent(event.getX(pointerIndex), event.getY(pointerIndex), true)) { + mTouchscreenPointerId = event.getPointerId(pointerIndex); + } + break; + case MotionEvent.ACTION_UP: + case MotionEvent.ACTION_POINTER_UP: + if (mTouchscreenPointerId == event.getPointerId(pointerIndex)) { + // We don't really care where the touch has been released. We only care whether it has been + // released or not. + NativeLibrary.onTouchEvent(0, 0, false); + mTouchscreenPointerId = -1; + } + break; + } + + for (int i = 0; i < event.getPointerCount(); i++) { + if (mTouchscreenPointerId == event.getPointerId(i)) { + NativeLibrary.onTouchMoved(event.getX(i), event.getY(i)); + } + } + } + + for (InputOverlayDrawableButton button : overlayButtons) { + // Determine the button state to apply based on the MotionEvent action flag. + switch (event.getAction() & MotionEvent.ACTION_MASK) { + case MotionEvent.ACTION_DOWN: + case MotionEvent.ACTION_POINTER_DOWN: + // If a pointer enters the bounds of a button, press that button. + if (button.getBounds() + .contains((int) event.getX(pointerIndex), (int) event.getY(pointerIndex))) { + button.setPressedState(true); + button.setTrackId(event.getPointerId(pointerIndex)); + NativeLibrary.onGamePadEvent(NativeLibrary.TouchScreenDevice, button.getId(), + ButtonState.PRESSED); + } + break; + case MotionEvent.ACTION_UP: + case MotionEvent.ACTION_POINTER_UP: + // If a pointer ends, release the button it was pressing. + if (button.getTrackId() == event.getPointerId(pointerIndex)) { + button.setPressedState(false); + NativeLibrary.onGamePadEvent(NativeLibrary.TouchScreenDevice, button.getId(), + ButtonState.RELEASED); + } + break; + } + } + + for (InputOverlayDrawableDpad dpad : overlayDpads) { + // Determine the button state to apply based on the MotionEvent action flag. + switch (event.getAction() & MotionEvent.ACTION_MASK) { + case MotionEvent.ACTION_DOWN: + case MotionEvent.ACTION_POINTER_DOWN: + // If a pointer enters the bounds of a button, press that button. + if (dpad.getBounds() + .contains((int) event.getX(pointerIndex), (int) event.getY(pointerIndex))) { + dpad.setTrackId(event.getPointerId(pointerIndex)); + } + break; + case MotionEvent.ACTION_UP: + case MotionEvent.ACTION_POINTER_UP: + // If a pointer ends, release the buttons. + if (dpad.getTrackId() == event.getPointerId(pointerIndex)) { + for (int i = 0; i < 4; i++) { + dpad.setState(InputOverlayDrawableDpad.STATE_DEFAULT); + NativeLibrary.onGamePadEvent(NativeLibrary.TouchScreenDevice, dpad.getId(i), + NativeLibrary.ButtonState.RELEASED); + } + dpad.setTrackId(-1); + } + break; + } + + if (dpad.getTrackId() != -1) { + for (int i = 0; i < event.getPointerCount(); i++) { + if (dpad.getTrackId() == event.getPointerId(i)) { + float touchX = event.getX(i); + float touchY = event.getY(i); + float maxY = dpad.getBounds().bottom; + float maxX = dpad.getBounds().right; + touchX -= dpad.getBounds().centerX(); + maxX -= dpad.getBounds().centerX(); + touchY -= dpad.getBounds().centerY(); + maxY -= dpad.getBounds().centerY(); + final float AxisX = touchX / maxX; + final float AxisY = touchY / maxY; + + boolean up = false; + boolean down = false; + boolean left = false; + boolean right = false; + if (EmulationMenuSettings.getDpadSlideEnable() || + (event.getAction() & MotionEvent.ACTION_MASK) == MotionEvent.ACTION_DOWN || + (event.getAction() & MotionEvent.ACTION_MASK) == MotionEvent.ACTION_POINTER_DOWN) { + if (AxisY < -InputOverlayDrawableDpad.VIRT_AXIS_DEADZONE) { + NativeLibrary.onGamePadEvent(NativeLibrary.TouchScreenDevice, dpad.getId(0), + NativeLibrary.ButtonState.PRESSED); + up = true; + } else { + NativeLibrary.onGamePadEvent(NativeLibrary.TouchScreenDevice, dpad.getId(0), + NativeLibrary.ButtonState.RELEASED); + } + if (AxisY > InputOverlayDrawableDpad.VIRT_AXIS_DEADZONE) { + NativeLibrary.onGamePadEvent(NativeLibrary.TouchScreenDevice, dpad.getId(1), + NativeLibrary.ButtonState.PRESSED); + down = true; + } else { + NativeLibrary.onGamePadEvent(NativeLibrary.TouchScreenDevice, dpad.getId(1), + NativeLibrary.ButtonState.RELEASED); + } + if (AxisX < -InputOverlayDrawableDpad.VIRT_AXIS_DEADZONE) { + NativeLibrary.onGamePadEvent(NativeLibrary.TouchScreenDevice, dpad.getId(2), + NativeLibrary.ButtonState.PRESSED); + left = true; + } else { + NativeLibrary.onGamePadEvent(NativeLibrary.TouchScreenDevice, dpad.getId(2), + NativeLibrary.ButtonState.RELEASED); + } + if (AxisX > InputOverlayDrawableDpad.VIRT_AXIS_DEADZONE) { + NativeLibrary.onGamePadEvent(NativeLibrary.TouchScreenDevice, dpad.getId(3), + NativeLibrary.ButtonState.PRESSED); + right = true; + } else { + NativeLibrary.onGamePadEvent(NativeLibrary.TouchScreenDevice, dpad.getId(3), + NativeLibrary.ButtonState.RELEASED); + } + + // Set state + if (up) { + if (left) + dpad.setState(InputOverlayDrawableDpad.STATE_PRESSED_UP_LEFT); + else if (right) + dpad.setState(InputOverlayDrawableDpad.STATE_PRESSED_UP_RIGHT); + else + dpad.setState(InputOverlayDrawableDpad.STATE_PRESSED_UP); + } else if (down) { + if (left) + dpad.setState(InputOverlayDrawableDpad.STATE_PRESSED_DOWN_LEFT); + else if (right) + dpad.setState(InputOverlayDrawableDpad.STATE_PRESSED_DOWN_RIGHT); + else + dpad.setState(InputOverlayDrawableDpad.STATE_PRESSED_DOWN); + } else if (left) { + dpad.setState(InputOverlayDrawableDpad.STATE_PRESSED_LEFT); + } else if (right) { + dpad.setState(InputOverlayDrawableDpad.STATE_PRESSED_RIGHT); + } else { + dpad.setState(InputOverlayDrawableDpad.STATE_DEFAULT); + } + } + } + } + } + } + + for (InputOverlayDrawableJoystick joystick : overlayJoysticks) { + joystick.TrackEvent(event); + int axisID = joystick.getId(); + float[] axises = joystick.getAxisValues(); + + NativeLibrary + .onGamePadMoveEvent(NativeLibrary.TouchScreenDevice, axisID, axises[0], axises[1]); + } + + invalidate(); + + return true; + } + + public boolean onTouchWhileEditing(MotionEvent event) { + int pointerIndex = event.getActionIndex(); + int fingerPositionX = (int) event.getX(pointerIndex); + int fingerPositionY = (int) event.getY(pointerIndex); + + String orientation = + getResources().getConfiguration().orientation == Configuration.ORIENTATION_PORTRAIT ? + "-Portrait" : ""; + + // Maybe combine Button and Joystick as subclasses of the same parent? + // Or maybe create an interface like IMoveableHUDControl? + + for (InputOverlayDrawableButton button : overlayButtons) { + // Determine the button state to apply based on the MotionEvent action flag. + switch (event.getAction() & MotionEvent.ACTION_MASK) { + case MotionEvent.ACTION_DOWN: + case MotionEvent.ACTION_POINTER_DOWN: + // If no button is being moved now, remember the currently touched button to move. + if (mButtonBeingConfigured == null && + button.getBounds().contains(fingerPositionX, fingerPositionY)) { + mButtonBeingConfigured = button; + mButtonBeingConfigured.onConfigureTouch(event); + } + break; + case MotionEvent.ACTION_MOVE: + if (mButtonBeingConfigured != null) { + mButtonBeingConfigured.onConfigureTouch(event); + invalidate(); + return true; + } + break; + + case MotionEvent.ACTION_UP: + case MotionEvent.ACTION_POINTER_UP: + if (mButtonBeingConfigured == button) { + // Persist button position by saving new place. + saveControlPosition(mButtonBeingConfigured.getId(), + mButtonBeingConfigured.getBounds().left, + mButtonBeingConfigured.getBounds().top, orientation); + mButtonBeingConfigured = null; + } + break; + } + } + + for (InputOverlayDrawableDpad dpad : overlayDpads) { + // Determine the button state to apply based on the MotionEvent action flag. + switch (event.getAction() & MotionEvent.ACTION_MASK) { + case MotionEvent.ACTION_DOWN: + case MotionEvent.ACTION_POINTER_DOWN: + // If no button is being moved now, remember the currently touched button to move. + if (mButtonBeingConfigured == null && + dpad.getBounds().contains(fingerPositionX, fingerPositionY)) { + mDpadBeingConfigured = dpad; + mDpadBeingConfigured.onConfigureTouch(event); + } + break; + case MotionEvent.ACTION_MOVE: + if (mDpadBeingConfigured != null) { + mDpadBeingConfigured.onConfigureTouch(event); + invalidate(); + return true; + } + break; + + case MotionEvent.ACTION_UP: + case MotionEvent.ACTION_POINTER_UP: + if (mDpadBeingConfigured == dpad) { + // Persist button position by saving new place. + saveControlPosition(mDpadBeingConfigured.getId(0), + mDpadBeingConfigured.getBounds().left, mDpadBeingConfigured.getBounds().top, + orientation); + mDpadBeingConfigured = null; + } + break; + } + } + + for (InputOverlayDrawableJoystick joystick : overlayJoysticks) { + switch (event.getAction()) { + case MotionEvent.ACTION_DOWN: + case MotionEvent.ACTION_POINTER_DOWN: + if (mJoystickBeingConfigured == null && + joystick.getBounds().contains(fingerPositionX, fingerPositionY)) { + mJoystickBeingConfigured = joystick; + mJoystickBeingConfigured.onConfigureTouch(event); + } + break; + case MotionEvent.ACTION_MOVE: + if (mJoystickBeingConfigured != null) { + mJoystickBeingConfigured.onConfigureTouch(event); + invalidate(); + } + break; + case MotionEvent.ACTION_UP: + case MotionEvent.ACTION_POINTER_UP: + if (mJoystickBeingConfigured != null) { + saveControlPosition(mJoystickBeingConfigured.getId(), + mJoystickBeingConfigured.getBounds().left, + mJoystickBeingConfigured.getBounds().top, orientation); + mJoystickBeingConfigured = null; + } + break; + } + } + + return true; + } + + private void setDpadState(InputOverlayDrawableDpad dpad, boolean up, boolean down, boolean left, + boolean right) { + if (up) { + if (left) + dpad.setState(InputOverlayDrawableDpad.STATE_PRESSED_UP_LEFT); + else if (right) + dpad.setState(InputOverlayDrawableDpad.STATE_PRESSED_UP_RIGHT); + else + dpad.setState(InputOverlayDrawableDpad.STATE_PRESSED_UP); + } else if (down) { + if (left) + dpad.setState(InputOverlayDrawableDpad.STATE_PRESSED_DOWN_LEFT); + else if (right) + dpad.setState(InputOverlayDrawableDpad.STATE_PRESSED_DOWN_RIGHT); + else + dpad.setState(InputOverlayDrawableDpad.STATE_PRESSED_DOWN); + } else if (left) { + dpad.setState(InputOverlayDrawableDpad.STATE_PRESSED_LEFT); + } else if (right) { + dpad.setState(InputOverlayDrawableDpad.STATE_PRESSED_RIGHT); + } + } + + private void addOverlayControls(String orientation) { + if (mPreferences.getBoolean("buttonToggle0", true)) { + overlayButtons.add(initializeOverlayButton(getContext(), R.drawable.button_a, + R.drawable.button_a_pressed, ButtonType.BUTTON_A, orientation)); + } + if (mPreferences.getBoolean("buttonToggle1", true)) { + overlayButtons.add(initializeOverlayButton(getContext(), R.drawable.button_b, + R.drawable.button_b_pressed, ButtonType.BUTTON_B, orientation)); + } + if (mPreferences.getBoolean("buttonToggle2", true)) { + overlayButtons.add(initializeOverlayButton(getContext(), R.drawable.button_x, + R.drawable.button_x_pressed, ButtonType.BUTTON_X, orientation)); + } + if (mPreferences.getBoolean("buttonToggle3", true)) { + overlayButtons.add(initializeOverlayButton(getContext(), R.drawable.button_y, + R.drawable.button_y_pressed, ButtonType.BUTTON_Y, orientation)); + } + if (mPreferences.getBoolean("buttonToggle4", true)) { + overlayButtons.add(initializeOverlayButton(getContext(), R.drawable.button_l, + R.drawable.button_l_pressed, ButtonType.TRIGGER_L, orientation)); + } + if (mPreferences.getBoolean("buttonToggle5", true)) { + overlayButtons.add(initializeOverlayButton(getContext(), R.drawable.button_r, + R.drawable.button_r_pressed, ButtonType.TRIGGER_R, orientation)); + } + if (mPreferences.getBoolean("buttonToggle6", false)) { + overlayButtons.add(initializeOverlayButton(getContext(), R.drawable.button_zl, + R.drawable.button_zl_pressed, ButtonType.BUTTON_ZL, orientation)); + } + if (mPreferences.getBoolean("buttonToggle7", false)) { + overlayButtons.add(initializeOverlayButton(getContext(), R.drawable.button_zr, + R.drawable.button_zr_pressed, ButtonType.BUTTON_ZR, orientation)); + } + if (mPreferences.getBoolean("buttonToggle8", true)) { + overlayButtons.add(initializeOverlayButton(getContext(), R.drawable.button_start, + R.drawable.button_start_pressed, ButtonType.BUTTON_START, orientation)); + } + if (mPreferences.getBoolean("buttonToggle9", true)) { + overlayButtons.add(initializeOverlayButton(getContext(), R.drawable.button_select, + R.drawable.button_select_pressed, ButtonType.BUTTON_SELECT, orientation)); + } + if (mPreferences.getBoolean("buttonToggle10", true)) { + overlayDpads.add(initializeOverlayDpad(getContext(), R.drawable.dpad, + R.drawable.dpad_pressed_one_direction, + R.drawable.dpad_pressed_two_directions, + ButtonType.DPAD_UP, ButtonType.DPAD_DOWN, + ButtonType.DPAD_LEFT, ButtonType.DPAD_RIGHT, orientation)); + } + if (mPreferences.getBoolean("buttonToggle11", true)) { + overlayJoysticks.add(initializeOverlayJoystick(getContext(), R.drawable.stick_main_range, + R.drawable.stick_main, R.drawable.stick_main_pressed, + ButtonType.STICK_LEFT, orientation)); + } + if (mPreferences.getBoolean("buttonToggle12", false)) { + overlayJoysticks.add(initializeOverlayJoystick(getContext(), R.drawable.stick_c_range, + R.drawable.stick_c, R.drawable.stick_c_pressed, ButtonType.STICK_C, orientation)); + } + } + + public void refreshControls() { + // Remove all the overlay buttons from the HashSet. + overlayButtons.clear(); + overlayDpads.clear(); + overlayJoysticks.clear(); + + String orientation = + getResources().getConfiguration().orientation == Configuration.ORIENTATION_PORTRAIT ? + "-Portrait" : ""; + + // Add all the enabled overlay items back to the HashSet. + if (EmulationMenuSettings.getShowOverlay()) { + addOverlayControls(orientation); + } + + invalidate(); + } + + private void saveControlPosition(int sharedPrefsId, int x, int y, String orientation) { + final SharedPreferences sPrefs = PreferenceManager.getDefaultSharedPreferences(getContext()); + SharedPreferences.Editor sPrefsEditor = sPrefs.edit(); + sPrefsEditor.putFloat(sharedPrefsId + orientation + "-X", x); + sPrefsEditor.putFloat(sharedPrefsId + orientation + "-Y", y); + sPrefsEditor.apply(); + } + + public void setIsInEditMode(boolean isInEditMode) { + mIsInEditMode = isInEditMode; + } + + private void defaultOverlay() { + if (!mPreferences.getBoolean("OverlayInit", false)) { + // It's possible that a user has created their overlay before this was added + // Only change the overlay if the 'A' button is not in the upper corner. + if (mPreferences.getFloat(ButtonType.BUTTON_A + "-X", 0f) == 0f) { + defaultOverlayLandscape(); + } + if (mPreferences.getFloat(ButtonType.BUTTON_A + "-Portrait" + "-X", 0f) == 0f) { + defaultOverlayPortrait(); + } + } + + SharedPreferences.Editor sPrefsEditor = mPreferences.edit(); + sPrefsEditor.putBoolean("OverlayInit", true); + sPrefsEditor.apply(); + } + + public void resetButtonPlacement() { + boolean isLandscape = + getResources().getConfiguration().orientation == Configuration.ORIENTATION_LANDSCAPE; + + if (isLandscape) { + defaultOverlayLandscape(); + } else { + defaultOverlayPortrait(); + } + + refreshControls(); + } + + private void defaultOverlayLandscape() { + SharedPreferences.Editor sPrefsEditor = mPreferences.edit(); + // Get screen size + Display display = ((Activity) getContext()).getWindowManager().getDefaultDisplay(); + DisplayMetrics outMetrics = new DisplayMetrics(); + display.getMetrics(outMetrics); + float maxX = outMetrics.heightPixels; + float maxY = outMetrics.widthPixels; + // Height and width changes depending on orientation. Use the larger value for height. + if (maxY > maxX) { + float tmp = maxX; + maxX = maxY; + maxY = tmp; + } + Resources res = getResources(); + + // Each value is a percent from max X/Y stored as an int. Have to bring that value down + // to a decimal before multiplying by MAX X/Y. + sPrefsEditor.putFloat(ButtonType.BUTTON_A + "-X", (((float) res.getInteger(R.integer.N3DS_BUTTON_A_X) / 1000) * maxX)); + sPrefsEditor.putFloat(ButtonType.BUTTON_A + "-Y", (((float) res.getInteger(R.integer.N3DS_BUTTON_A_Y) / 1000) * maxY)); + sPrefsEditor.putFloat(ButtonType.BUTTON_B + "-X", (((float) res.getInteger(R.integer.N3DS_BUTTON_B_X) / 1000) * maxX)); + sPrefsEditor.putFloat(ButtonType.BUTTON_B + "-Y", (((float) res.getInteger(R.integer.N3DS_BUTTON_B_Y) / 1000) * maxY)); + sPrefsEditor.putFloat(ButtonType.BUTTON_X + "-X", (((float) res.getInteger(R.integer.N3DS_BUTTON_X_X) / 1000) * maxX)); + sPrefsEditor.putFloat(ButtonType.BUTTON_X + "-Y", (((float) res.getInteger(R.integer.N3DS_BUTTON_X_Y) / 1000) * maxY)); + sPrefsEditor.putFloat(ButtonType.BUTTON_Y + "-X", (((float) res.getInteger(R.integer.N3DS_BUTTON_Y_X) / 1000) * maxX)); + sPrefsEditor.putFloat(ButtonType.BUTTON_Y + "-Y", (((float) res.getInteger(R.integer.N3DS_BUTTON_Y_Y) / 1000) * maxY)); + sPrefsEditor.putFloat(ButtonType.BUTTON_ZL + "-X", (((float) res.getInteger(R.integer.N3DS_BUTTON_ZL_X) / 1000) * maxX)); + sPrefsEditor.putFloat(ButtonType.BUTTON_ZL + "-Y", (((float) res.getInteger(R.integer.N3DS_BUTTON_ZL_Y) / 1000) * maxY)); + sPrefsEditor.putFloat(ButtonType.BUTTON_ZR + "-X", (((float) res.getInteger(R.integer.N3DS_BUTTON_ZR_X) / 1000) * maxX)); + sPrefsEditor.putFloat(ButtonType.BUTTON_ZR + "-Y", (((float) res.getInteger(R.integer.N3DS_BUTTON_ZR_Y) / 1000) * maxY)); + sPrefsEditor.putFloat(ButtonType.DPAD_UP + "-X", (((float) res.getInteger(R.integer.N3DS_BUTTON_UP_X) / 1000) * maxX)); + sPrefsEditor.putFloat(ButtonType.DPAD_UP + "-Y", (((float) res.getInteger(R.integer.N3DS_BUTTON_UP_Y) / 1000) * maxY)); + sPrefsEditor.putFloat(ButtonType.TRIGGER_L + "-X", (((float) res.getInteger(R.integer.N3DS_TRIGGER_L_X) / 1000) * maxX)); + sPrefsEditor.putFloat(ButtonType.TRIGGER_L + "-Y", (((float) res.getInteger(R.integer.N3DS_TRIGGER_L_Y) / 1000) * maxY)); + sPrefsEditor.putFloat(ButtonType.TRIGGER_R + "-X", (((float) res.getInteger(R.integer.N3DS_TRIGGER_R_X) / 1000) * maxX)); + sPrefsEditor.putFloat(ButtonType.TRIGGER_R + "-Y", (((float) res.getInteger(R.integer.N3DS_TRIGGER_R_Y) / 1000) * maxY)); + sPrefsEditor.putFloat(ButtonType.BUTTON_START + "-X", (((float) res.getInteger(R.integer.N3DS_BUTTON_START_X) / 1000) * maxX)); + sPrefsEditor.putFloat(ButtonType.BUTTON_START + "-Y", (((float) res.getInteger(R.integer.N3DS_BUTTON_START_Y) / 1000) * maxY)); + sPrefsEditor.putFloat(ButtonType.BUTTON_SELECT + "-X", (((float) res.getInteger(R.integer.N3DS_BUTTON_SELECT_X) / 1000) * maxX)); + sPrefsEditor.putFloat(ButtonType.BUTTON_SELECT + "-Y", (((float) res.getInteger(R.integer.N3DS_BUTTON_SELECT_Y) / 1000) * maxY)); + sPrefsEditor.putFloat(ButtonType.BUTTON_HOME + "-X", (((float) res.getInteger(R.integer.N3DS_BUTTON_HOME_X) / 1000) * maxX)); + sPrefsEditor.putFloat(ButtonType.BUTTON_HOME + "-Y", (((float) res.getInteger(R.integer.N3DS_BUTTON_HOME_Y) / 1000) * maxY)); + sPrefsEditor.putFloat(ButtonType.STICK_C + "-X", (((float) res.getInteger(R.integer.N3DS_STICK_C_X) / 1000) * maxX)); + sPrefsEditor.putFloat(ButtonType.STICK_C + "-Y", (((float) res.getInteger(R.integer.N3DS_STICK_C_Y) / 1000) * maxY)); + sPrefsEditor.putFloat(ButtonType.STICK_LEFT + "-X", (((float) res.getInteger(R.integer.N3DS_STICK_MAIN_X) / 1000) * maxX)); + sPrefsEditor.putFloat(ButtonType.STICK_LEFT + "-Y", (((float) res.getInteger(R.integer.N3DS_STICK_MAIN_Y) / 1000) * maxY)); + + // We want to commit right away, otherwise the overlay could load before this is saved. + sPrefsEditor.commit(); + } + + private void defaultOverlayPortrait() { + SharedPreferences.Editor sPrefsEditor = mPreferences.edit(); + // Get screen size + Display display = ((Activity) getContext()).getWindowManager().getDefaultDisplay(); + DisplayMetrics outMetrics = new DisplayMetrics(); + display.getMetrics(outMetrics); + float maxX = outMetrics.heightPixels; + float maxY = outMetrics.widthPixels; + // Height and width changes depending on orientation. Use the larger value for height. + if (maxY < maxX) { + float tmp = maxX; + maxX = maxY; + maxY = tmp; + } + Resources res = getResources(); + String portrait = "-Portrait"; + + // Each value is a percent from max X/Y stored as an int. Have to bring that value down + // to a decimal before multiplying by MAX X/Y. + sPrefsEditor.putFloat(ButtonType.BUTTON_A + portrait + "-X", (((float) res.getInteger(R.integer.N3DS_BUTTON_A_PORTRAIT_X) / 1000) * maxX)); + sPrefsEditor.putFloat(ButtonType.BUTTON_A + portrait + "-Y", (((float) res.getInteger(R.integer.N3DS_BUTTON_A_PORTRAIT_Y) / 1000) * maxY)); + sPrefsEditor.putFloat(ButtonType.BUTTON_B + portrait + "-X", (((float) res.getInteger(R.integer.N3DS_BUTTON_B_PORTRAIT_X) / 1000) * maxX)); + sPrefsEditor.putFloat(ButtonType.BUTTON_B + portrait + "-Y", (((float) res.getInteger(R.integer.N3DS_BUTTON_B_PORTRAIT_Y) / 1000) * maxY)); + sPrefsEditor.putFloat(ButtonType.BUTTON_X + portrait + "-X", (((float) res.getInteger(R.integer.N3DS_BUTTON_X_PORTRAIT_X) / 1000) * maxX)); + sPrefsEditor.putFloat(ButtonType.BUTTON_X + portrait + "-Y", (((float) res.getInteger(R.integer.N3DS_BUTTON_X_PORTRAIT_Y) / 1000) * maxY)); + sPrefsEditor.putFloat(ButtonType.BUTTON_Y + portrait + "-X", (((float) res.getInteger(R.integer.N3DS_BUTTON_Y_PORTRAIT_X) / 1000) * maxX)); + sPrefsEditor.putFloat(ButtonType.BUTTON_Y + portrait + "-Y", (((float) res.getInteger(R.integer.N3DS_BUTTON_Y_PORTRAIT_Y) / 1000) * maxY)); + sPrefsEditor.putFloat(ButtonType.BUTTON_ZL + portrait + "-X", (((float) res.getInteger(R.integer.N3DS_BUTTON_ZL_PORTRAIT_X) / 1000) * maxX)); + sPrefsEditor.putFloat(ButtonType.BUTTON_ZL + portrait + "-Y", (((float) res.getInteger(R.integer.N3DS_BUTTON_ZL_PORTRAIT_Y) / 1000) * maxY)); + sPrefsEditor.putFloat(ButtonType.BUTTON_ZR + portrait + "-X", (((float) res.getInteger(R.integer.N3DS_BUTTON_ZR_PORTRAIT_X) / 1000) * maxX)); + sPrefsEditor.putFloat(ButtonType.BUTTON_ZR + portrait + "-Y", (((float) res.getInteger(R.integer.N3DS_BUTTON_ZR_PORTRAIT_Y) / 1000) * maxY)); + sPrefsEditor.putFloat(ButtonType.DPAD_UP + portrait + "-X", (((float) res.getInteger(R.integer.N3DS_BUTTON_UP_PORTRAIT_X) / 1000) * maxX)); + sPrefsEditor.putFloat(ButtonType.DPAD_UP + portrait + "-Y", (((float) res.getInteger(R.integer.N3DS_BUTTON_UP_PORTRAIT_Y) / 1000) * maxY)); + sPrefsEditor.putFloat(ButtonType.TRIGGER_L + portrait + "-X", (((float) res.getInteger(R.integer.N3DS_TRIGGER_L_PORTRAIT_X) / 1000) * maxX)); + sPrefsEditor.putFloat(ButtonType.TRIGGER_L + portrait + "-Y", (((float) res.getInteger(R.integer.N3DS_TRIGGER_L_PORTRAIT_Y) / 1000) * maxY)); + sPrefsEditor.putFloat(ButtonType.TRIGGER_R + portrait + "-X", (((float) res.getInteger(R.integer.N3DS_TRIGGER_R_PORTRAIT_X) / 1000) * maxX)); + sPrefsEditor.putFloat(ButtonType.TRIGGER_R + portrait + "-Y", (((float) res.getInteger(R.integer.N3DS_TRIGGER_R_PORTRAIT_Y) / 1000) * maxY)); + sPrefsEditor.putFloat(ButtonType.BUTTON_START + portrait + "-X", (((float) res.getInteger(R.integer.N3DS_BUTTON_START_PORTRAIT_X) / 1000) * maxX)); + sPrefsEditor.putFloat(ButtonType.BUTTON_START + portrait + "-Y", (((float) res.getInteger(R.integer.N3DS_BUTTON_START_PORTRAIT_Y) / 1000) * maxY)); + sPrefsEditor.putFloat(ButtonType.BUTTON_SELECT + portrait + "-X", (((float) res.getInteger(R.integer.N3DS_BUTTON_SELECT_PORTRAIT_X) / 1000) * maxX)); + sPrefsEditor.putFloat(ButtonType.BUTTON_SELECT + portrait + "-Y", (((float) res.getInteger(R.integer.N3DS_BUTTON_SELECT_PORTRAIT_Y) / 1000) * maxY)); + sPrefsEditor.putFloat(ButtonType.BUTTON_HOME + portrait + "-X", (((float) res.getInteger(R.integer.N3DS_BUTTON_HOME_PORTRAIT_X) / 1000) * maxX)); + sPrefsEditor.putFloat(ButtonType.BUTTON_HOME + portrait + "-Y", (((float) res.getInteger(R.integer.N3DS_BUTTON_HOME_PORTRAIT_Y) / 1000) * maxY)); + sPrefsEditor.putFloat(ButtonType.STICK_C + portrait + "-X", (((float) res.getInteger(R.integer.N3DS_STICK_C_PORTRAIT_X) / 1000) * maxX)); + sPrefsEditor.putFloat(ButtonType.STICK_C + portrait + "-Y", (((float) res.getInteger(R.integer.N3DS_STICK_C_PORTRAIT_Y) / 1000) * maxY)); + sPrefsEditor.putFloat(ButtonType.STICK_LEFT + portrait + "-X", (((float) res.getInteger(R.integer.N3DS_STICK_MAIN_PORTRAIT_X) / 1000) * maxX)); + sPrefsEditor.putFloat(ButtonType.STICK_LEFT + portrait + "-Y", (((float) res.getInteger(R.integer.N3DS_STICK_MAIN_PORTRAIT_Y) / 1000) * maxY)); + + // We want to commit right away, otherwise the overlay could load before this is saved. + sPrefsEditor.commit(); + } + + public boolean isInEditMode() { + return mIsInEditMode; + } +} diff --git a/src/android/app/src/main/java/org/citra/citra_emu/overlay/InputOverlayDrawableButton.java b/src/android/app/src/main/java/org/citra/citra_emu/overlay/InputOverlayDrawableButton.java new file mode 100644 index 000000000..81352296c --- /dev/null +++ b/src/android/app/src/main/java/org/citra/citra_emu/overlay/InputOverlayDrawableButton.java @@ -0,0 +1,122 @@ +/** + * Copyright 2013 Dolphin Emulator Project + * Licensed under GPLv2+ + * Refer to the license.txt file included. + */ + +package org.citra.citra_emu.overlay; + +import android.content.res.Resources; +import android.graphics.Bitmap; +import android.graphics.Canvas; +import android.graphics.Rect; +import android.graphics.drawable.BitmapDrawable; +import android.view.MotionEvent; + +/** + * Custom {@link BitmapDrawable} that is capable + * of storing it's own ID. + */ +public final class InputOverlayDrawableButton { + // The ID identifying what type of button this Drawable represents. + private int mButtonType; + private int mTrackId; + private int mPreviousTouchX, mPreviousTouchY; + private int mControlPositionX, mControlPositionY; + private int mWidth; + private int mHeight; + private BitmapDrawable mDefaultStateBitmap; + private BitmapDrawable mPressedStateBitmap; + private boolean mPressedState = false; + + /** + * Constructor + * + * @param res {@link Resources} instance. + * @param defaultStateBitmap {@link Bitmap} to use with the default state Drawable. + * @param pressedStateBitmap {@link Bitmap} to use with the pressed state Drawable. + * @param buttonType Identifier for this type of button. + */ + public InputOverlayDrawableButton(Resources res, Bitmap defaultStateBitmap, + Bitmap pressedStateBitmap, int buttonType) { + mDefaultStateBitmap = new BitmapDrawable(res, defaultStateBitmap); + mPressedStateBitmap = new BitmapDrawable(res, pressedStateBitmap); + mButtonType = buttonType; + + mWidth = mDefaultStateBitmap.getIntrinsicWidth(); + mHeight = mDefaultStateBitmap.getIntrinsicHeight(); + } + + /** + * Gets this InputOverlayDrawableButton's button ID. + * + * @return this InputOverlayDrawableButton's button ID. + */ + public int getId() { + return mButtonType; + } + + public int getTrackId() { + return mTrackId; + } + + public void setTrackId(int trackId) { + mTrackId = trackId; + } + + public boolean onConfigureTouch(MotionEvent event) { + int pointerIndex = event.getActionIndex(); + int fingerPositionX = (int) event.getX(pointerIndex); + int fingerPositionY = (int) event.getY(pointerIndex); + switch (event.getAction()) { + case MotionEvent.ACTION_DOWN: + mPreviousTouchX = fingerPositionX; + mPreviousTouchY = fingerPositionY; + break; + case MotionEvent.ACTION_MOVE: + mControlPositionX += fingerPositionX - mPreviousTouchX; + mControlPositionY += fingerPositionY - mPreviousTouchY; + setBounds(mControlPositionX, mControlPositionY, getWidth() + mControlPositionX, + getHeight() + mControlPositionY); + mPreviousTouchX = fingerPositionX; + mPreviousTouchY = fingerPositionY; + break; + + } + return true; + } + + public void setPosition(int x, int y) { + mControlPositionX = x; + mControlPositionY = y; + } + + public void draw(Canvas canvas) { + getCurrentStateBitmapDrawable().draw(canvas); + } + + private BitmapDrawable getCurrentStateBitmapDrawable() { + return mPressedState ? mPressedStateBitmap : mDefaultStateBitmap; + } + + public void setBounds(int left, int top, int right, int bottom) { + mDefaultStateBitmap.setBounds(left, top, right, bottom); + mPressedStateBitmap.setBounds(left, top, right, bottom); + } + + public Rect getBounds() { + return mDefaultStateBitmap.getBounds(); + } + + public int getWidth() { + return mWidth; + } + + public int getHeight() { + return mHeight; + } + + public void setPressedState(boolean isPressed) { + mPressedState = isPressed; + } +} diff --git a/src/android/app/src/main/java/org/citra/citra_emu/overlay/InputOverlayDrawableDpad.java b/src/android/app/src/main/java/org/citra/citra_emu/overlay/InputOverlayDrawableDpad.java new file mode 100644 index 000000000..87f3b7cd9 --- /dev/null +++ b/src/android/app/src/main/java/org/citra/citra_emu/overlay/InputOverlayDrawableDpad.java @@ -0,0 +1,193 @@ +/** + * Copyright 2016 Dolphin Emulator Project + * Licensed under GPLv2+ + * Refer to the license.txt file included. + */ + +package org.citra.citra_emu.overlay; + +import android.content.res.Resources; +import android.graphics.Bitmap; +import android.graphics.Canvas; +import android.graphics.Rect; +import android.graphics.drawable.BitmapDrawable; +import android.view.MotionEvent; + +/** + * Custom {@link BitmapDrawable} that is capable + * of storing it's own ID. + */ +public final class InputOverlayDrawableDpad { + public static final int STATE_DEFAULT = 0; + public static final int STATE_PRESSED_UP = 1; + public static final int STATE_PRESSED_DOWN = 2; + public static final int STATE_PRESSED_LEFT = 3; + public static final int STATE_PRESSED_RIGHT = 4; + public static final int STATE_PRESSED_UP_LEFT = 5; + public static final int STATE_PRESSED_UP_RIGHT = 6; + public static final int STATE_PRESSED_DOWN_LEFT = 7; + public static final int STATE_PRESSED_DOWN_RIGHT = 8; + public static final float VIRT_AXIS_DEADZONE = 0.5f; + // The ID identifying what type of button this Drawable represents. + private int[] mButtonType = new int[4]; + private int mTrackId; + private int mPreviousTouchX, mPreviousTouchY; + private int mControlPositionX, mControlPositionY; + private int mWidth; + private int mHeight; + private BitmapDrawable mDefaultStateBitmap; + private BitmapDrawable mPressedOneDirectionStateBitmap; + private BitmapDrawable mPressedTwoDirectionsStateBitmap; + private int mPressState = STATE_DEFAULT; + + /** + * Constructor + * + * @param res {@link Resources} instance. + * @param defaultStateBitmap {@link Bitmap} of the default state. + * @param pressedOneDirectionStateBitmap {@link Bitmap} of the pressed state in one direction. + * @param pressedTwoDirectionsStateBitmap {@link Bitmap} of the pressed state in two direction. + * @param buttonUp Identifier for the up button. + * @param buttonDown Identifier for the down button. + * @param buttonLeft Identifier for the left button. + * @param buttonRight Identifier for the right button. + */ + public InputOverlayDrawableDpad(Resources res, + Bitmap defaultStateBitmap, + Bitmap pressedOneDirectionStateBitmap, + Bitmap pressedTwoDirectionsStateBitmap, + int buttonUp, int buttonDown, + int buttonLeft, int buttonRight) { + mDefaultStateBitmap = new BitmapDrawable(res, defaultStateBitmap); + mPressedOneDirectionStateBitmap = new BitmapDrawable(res, pressedOneDirectionStateBitmap); + mPressedTwoDirectionsStateBitmap = new BitmapDrawable(res, pressedTwoDirectionsStateBitmap); + + mWidth = mDefaultStateBitmap.getIntrinsicWidth(); + mHeight = mDefaultStateBitmap.getIntrinsicHeight(); + + mButtonType[0] = buttonUp; + mButtonType[1] = buttonDown; + mButtonType[2] = buttonLeft; + mButtonType[3] = buttonRight; + + mTrackId = -1; + } + + public void draw(Canvas canvas) { + int px = mControlPositionX + (getWidth() / 2); + int py = mControlPositionY + (getHeight() / 2); + switch (mPressState) { + case STATE_DEFAULT: + mDefaultStateBitmap.draw(canvas); + break; + case STATE_PRESSED_UP: + mPressedOneDirectionStateBitmap.draw(canvas); + break; + case STATE_PRESSED_RIGHT: + canvas.save(); + canvas.rotate(90, px, py); + mPressedOneDirectionStateBitmap.draw(canvas); + canvas.restore(); + break; + case STATE_PRESSED_DOWN: + canvas.save(); + canvas.rotate(180, px, py); + mPressedOneDirectionStateBitmap.draw(canvas); + canvas.restore(); + break; + case STATE_PRESSED_LEFT: + canvas.save(); + canvas.rotate(270, px, py); + mPressedOneDirectionStateBitmap.draw(canvas); + canvas.restore(); + break; + case STATE_PRESSED_UP_LEFT: + mPressedTwoDirectionsStateBitmap.draw(canvas); + break; + case STATE_PRESSED_UP_RIGHT: + canvas.save(); + canvas.rotate(90, px, py); + mPressedTwoDirectionsStateBitmap.draw(canvas); + canvas.restore(); + break; + case STATE_PRESSED_DOWN_RIGHT: + canvas.save(); + canvas.rotate(180, px, py); + mPressedTwoDirectionsStateBitmap.draw(canvas); + canvas.restore(); + break; + case STATE_PRESSED_DOWN_LEFT: + canvas.save(); + canvas.rotate(270, px, py); + mPressedTwoDirectionsStateBitmap.draw(canvas); + canvas.restore(); + break; + } + } + + /** + * Gets one of the InputOverlayDrawableDpad's button IDs. + * + * @return the requested InputOverlayDrawableDpad's button ID. + */ + public int getId(int direction) { + return mButtonType[direction]; + } + + public int getTrackId() { + return mTrackId; + } + + public void setTrackId(int trackId) { + mTrackId = trackId; + } + + public boolean onConfigureTouch(MotionEvent event) { + int pointerIndex = event.getActionIndex(); + int fingerPositionX = (int) event.getX(pointerIndex); + int fingerPositionY = (int) event.getY(pointerIndex); + switch (event.getAction()) { + case MotionEvent.ACTION_DOWN: + mPreviousTouchX = fingerPositionX; + mPreviousTouchY = fingerPositionY; + break; + case MotionEvent.ACTION_MOVE: + mControlPositionX += fingerPositionX - mPreviousTouchX; + mControlPositionY += fingerPositionY - mPreviousTouchY; + setBounds(mControlPositionX, mControlPositionY, getWidth() + mControlPositionX, + getHeight() + mControlPositionY); + mPreviousTouchX = fingerPositionX; + mPreviousTouchY = fingerPositionY; + break; + + } + return true; + } + + public void setPosition(int x, int y) { + mControlPositionX = x; + mControlPositionY = y; + } + + public void setBounds(int left, int top, int right, int bottom) { + mDefaultStateBitmap.setBounds(left, top, right, bottom); + mPressedOneDirectionStateBitmap.setBounds(left, top, right, bottom); + mPressedTwoDirectionsStateBitmap.setBounds(left, top, right, bottom); + } + + public Rect getBounds() { + return mDefaultStateBitmap.getBounds(); + } + + public int getWidth() { + return mWidth; + } + + public int getHeight() { + return mHeight; + } + + public void setState(int pressState) { + mPressState = pressState; + } +} diff --git a/src/android/app/src/main/java/org/citra/citra_emu/overlay/InputOverlayDrawableJoystick.java b/src/android/app/src/main/java/org/citra/citra_emu/overlay/InputOverlayDrawableJoystick.java new file mode 100644 index 000000000..956a8b1e9 --- /dev/null +++ b/src/android/app/src/main/java/org/citra/citra_emu/overlay/InputOverlayDrawableJoystick.java @@ -0,0 +1,264 @@ +/** + * Copyright 2013 Dolphin Emulator Project + * Licensed under GPLv2+ + * Refer to the license.txt file included. + */ + +package org.citra.citra_emu.overlay; + +import android.content.res.Resources; +import android.graphics.Bitmap; +import android.graphics.Canvas; +import android.graphics.Rect; +import android.graphics.drawable.BitmapDrawable; +import android.view.MotionEvent; + +import org.citra.citra_emu.NativeLibrary.ButtonType; +import org.citra.citra_emu.utils.EmulationMenuSettings; + +/** + * Custom {@link BitmapDrawable} that is capable + * of storing it's own ID. + */ +public final class InputOverlayDrawableJoystick { + private final int[] axisIDs = {0, 0, 0, 0}; + private final float[] axises = {0f, 0f}; + private int trackId = -1; + private int mJoystickType; + private int mControlPositionX, mControlPositionY; + private int mPreviousTouchX, mPreviousTouchY; + private int mWidth; + private int mHeight; + private Rect mVirtBounds; + private Rect mOrigBounds; + private BitmapDrawable mOuterBitmap; + private BitmapDrawable mDefaultStateInnerBitmap; + private BitmapDrawable mPressedStateInnerBitmap; + private BitmapDrawable mBoundsBoxBitmap; + private boolean mPressedState = false; + + /** + * Constructor + * + * @param res {@link Resources} instance. + * @param bitmapOuter {@link Bitmap} which represents the outer non-movable part of the joystick. + * @param bitmapInnerDefault {@link Bitmap} which represents the default inner movable part of the joystick. + * @param bitmapInnerPressed {@link Bitmap} which represents the pressed inner movable part of the joystick. + * @param rectOuter {@link Rect} which represents the outer joystick bounds. + * @param rectInner {@link Rect} which represents the inner joystick bounds. + * @param joystick Identifier for which joystick this is. + */ + public InputOverlayDrawableJoystick(Resources res, Bitmap bitmapOuter, + Bitmap bitmapInnerDefault, Bitmap bitmapInnerPressed, + Rect rectOuter, Rect rectInner, int joystick) { + axisIDs[0] = joystick + 1; // Up + axisIDs[1] = joystick + 2; // Down + axisIDs[2] = joystick + 3; // Left + axisIDs[3] = joystick + 4; // Right + mJoystickType = joystick; + + mOuterBitmap = new BitmapDrawable(res, bitmapOuter); + mDefaultStateInnerBitmap = new BitmapDrawable(res, bitmapInnerDefault); + mPressedStateInnerBitmap = new BitmapDrawable(res, bitmapInnerPressed); + mBoundsBoxBitmap = new BitmapDrawable(res, bitmapOuter); + mWidth = bitmapOuter.getWidth(); + mHeight = bitmapOuter.getHeight(); + + setBounds(rectOuter); + mDefaultStateInnerBitmap.setBounds(rectInner); + mPressedStateInnerBitmap.setBounds(rectInner); + mVirtBounds = getBounds(); + mOrigBounds = mOuterBitmap.copyBounds(); + mBoundsBoxBitmap.setAlpha(0); + mBoundsBoxBitmap.setBounds(getVirtBounds()); + SetInnerBounds(); + } + + /** + * Gets this InputOverlayDrawableJoystick's button ID. + * + * @return this InputOverlayDrawableJoystick's button ID. + */ + public int getId() { + return mJoystickType; + } + + public void draw(Canvas canvas) { + mOuterBitmap.draw(canvas); + getCurrentStateBitmapDrawable().draw(canvas); + mBoundsBoxBitmap.draw(canvas); + } + + public void TrackEvent(MotionEvent event) { + int pointerIndex = event.getActionIndex(); + + switch (event.getAction() & MotionEvent.ACTION_MASK) { + case MotionEvent.ACTION_DOWN: + case MotionEvent.ACTION_POINTER_DOWN: + if (getBounds().contains((int) event.getX(pointerIndex), (int) event.getY(pointerIndex))) { + mPressedState = true; + mOuterBitmap.setAlpha(0); + mBoundsBoxBitmap.setAlpha(255); + if (EmulationMenuSettings.getJoystickRelCenter()) { + getVirtBounds().offset((int) event.getX(pointerIndex) - getVirtBounds().centerX(), + (int) event.getY(pointerIndex) - getVirtBounds().centerY()); + } + mBoundsBoxBitmap.setBounds(getVirtBounds()); + trackId = event.getPointerId(pointerIndex); + } + break; + case MotionEvent.ACTION_UP: + case MotionEvent.ACTION_POINTER_UP: + if (trackId == event.getPointerId(pointerIndex)) { + mPressedState = false; + axises[0] = axises[1] = 0.0f; + mOuterBitmap.setAlpha(255); + mBoundsBoxBitmap.setAlpha(0); + setVirtBounds(new Rect(mOrigBounds.left, mOrigBounds.top, mOrigBounds.right, + mOrigBounds.bottom)); + setBounds(new Rect(mOrigBounds.left, mOrigBounds.top, mOrigBounds.right, + mOrigBounds.bottom)); + SetInnerBounds(); + trackId = -1; + } + break; + } + + if (trackId == -1) + return; + + for (int i = 0; i < event.getPointerCount(); i++) { + if (trackId == event.getPointerId(i)) { + float touchX = event.getX(i); + float touchY = event.getY(i); + float maxY = getVirtBounds().bottom; + float maxX = getVirtBounds().right; + touchX -= getVirtBounds().centerX(); + maxX -= getVirtBounds().centerX(); + touchY -= getVirtBounds().centerY(); + maxY -= getVirtBounds().centerY(); + final float AxisX = touchX / maxX; + final float AxisY = touchY / maxY; + + // Clamp the circle pad input to a circle + final float angle = (float) Math.atan2(AxisY, AxisX); + float radius = (float) Math.sqrt(AxisX * AxisX + AxisY * AxisY); + if(radius > 1.0f) + { + radius = 1.0f; + } + axises[0] = ((float)Math.cos(angle) * radius); + axises[1] = ((float)Math.sin(angle) * radius); + SetInnerBounds(); + } + } + } + + public boolean onConfigureTouch(MotionEvent event) { + int pointerIndex = event.getActionIndex(); + int fingerPositionX = (int) event.getX(pointerIndex); + int fingerPositionY = (int) event.getY(pointerIndex); + + int scale = 1; + if (mJoystickType == ButtonType.STICK_C) { + // C-stick is scaled down to be half the size of the circle pad + scale = 2; + } + + switch (event.getAction()) { + case MotionEvent.ACTION_DOWN: + mPreviousTouchX = fingerPositionX; + mPreviousTouchY = fingerPositionY; + break; + case MotionEvent.ACTION_MOVE: + int deltaX = fingerPositionX - mPreviousTouchX; + int deltaY = fingerPositionY - mPreviousTouchY; + mControlPositionX += deltaX; + mControlPositionY += deltaY; + setBounds(new Rect(mControlPositionX, mControlPositionY, + mOuterBitmap.getIntrinsicWidth() / scale + mControlPositionX, + mOuterBitmap.getIntrinsicHeight() / scale + mControlPositionY)); + setVirtBounds(new Rect(mControlPositionX, mControlPositionY, + mOuterBitmap.getIntrinsicWidth() / scale + mControlPositionX, + mOuterBitmap.getIntrinsicHeight() / scale + mControlPositionY)); + SetInnerBounds(); + setOrigBounds(new Rect(new Rect(mControlPositionX, mControlPositionY, + mOuterBitmap.getIntrinsicWidth() / scale + mControlPositionX, + mOuterBitmap.getIntrinsicHeight() / scale + mControlPositionY))); + mPreviousTouchX = fingerPositionX; + mPreviousTouchY = fingerPositionY; + break; + } + return true; + } + + + public float[] getAxisValues() { + return axises; + } + + public int[] getAxisIDs() { + return axisIDs; + } + + private void SetInnerBounds() { + int X = getVirtBounds().centerX() + (int) ((axises[0]) * (getVirtBounds().width() / 2)); + int Y = getVirtBounds().centerY() + (int) ((axises[1]) * (getVirtBounds().height() / 2)); + + if (mJoystickType == ButtonType.STICK_LEFT) { + X += 1; + Y += 1; + } + + if (X > getVirtBounds().centerX() + (getVirtBounds().width() / 2)) + X = getVirtBounds().centerX() + (getVirtBounds().width() / 2); + if (X < getVirtBounds().centerX() - (getVirtBounds().width() / 2)) + X = getVirtBounds().centerX() - (getVirtBounds().width() / 2); + if (Y > getVirtBounds().centerY() + (getVirtBounds().height() / 2)) + Y = getVirtBounds().centerY() + (getVirtBounds().height() / 2); + if (Y < getVirtBounds().centerY() - (getVirtBounds().height() / 2)) + Y = getVirtBounds().centerY() - (getVirtBounds().height() / 2); + + int width = mPressedStateInnerBitmap.getBounds().width() / 2; + int height = mPressedStateInnerBitmap.getBounds().height() / 2; + mDefaultStateInnerBitmap.setBounds(X - width, Y - height, X + width, Y + height); + mPressedStateInnerBitmap.setBounds(mDefaultStateInnerBitmap.getBounds()); + } + + public void setPosition(int x, int y) { + mControlPositionX = x; + mControlPositionY = y; + } + + private BitmapDrawable getCurrentStateBitmapDrawable() { + return mPressedState ? mPressedStateInnerBitmap : mDefaultStateInnerBitmap; + } + + public Rect getBounds() { + return mOuterBitmap.getBounds(); + } + + public void setBounds(Rect bounds) { + mOuterBitmap.setBounds(bounds); + } + + private void setOrigBounds(Rect bounds) { + mOrigBounds = bounds; + } + + private Rect getVirtBounds() { + return mVirtBounds; + } + + private void setVirtBounds(Rect bounds) { + mVirtBounds = bounds; + } + + public int getWidth() { + return mWidth; + } + + public int getHeight() { + return mHeight; + } +} diff --git a/src/android/app/src/main/java/org/citra/citra_emu/ui/DividerItemDecoration.java b/src/android/app/src/main/java/org/citra/citra_emu/ui/DividerItemDecoration.java new file mode 100644 index 000000000..96ccc08bb --- /dev/null +++ b/src/android/app/src/main/java/org/citra/citra_emu/ui/DividerItemDecoration.java @@ -0,0 +1,130 @@ +package org.citra.citra_emu.ui; + +import android.content.Context; +import android.content.res.TypedArray; +import android.graphics.Canvas; +import android.graphics.Rect; +import android.graphics.drawable.Drawable; +import android.util.AttributeSet; +import android.view.View; + +import androidx.annotation.NonNull; +import androidx.recyclerview.widget.LinearLayoutManager; +import androidx.recyclerview.widget.RecyclerView; + +/** + * Implementation from: + * https://gist.github.com/lapastillaroja/858caf1a82791b6c1a36 + */ +public class DividerItemDecoration extends RecyclerView.ItemDecoration { + + private Drawable mDivider; + private boolean mShowFirstDivider = false; + private boolean mShowLastDivider = false; + + public DividerItemDecoration(Context context, AttributeSet attrs) { + final TypedArray a = context + .obtainStyledAttributes(attrs, new int[]{android.R.attr.listDivider}); + mDivider = a.getDrawable(0); + a.recycle(); + } + + public DividerItemDecoration(Context context, AttributeSet attrs, boolean showFirstDivider, + boolean showLastDivider) { + this(context, attrs); + mShowFirstDivider = showFirstDivider; + mShowLastDivider = showLastDivider; + } + + public DividerItemDecoration(Drawable divider) { + mDivider = divider; + } + + public DividerItemDecoration(Drawable divider, boolean showFirstDivider, + boolean showLastDivider) { + this(divider); + mShowFirstDivider = showFirstDivider; + mShowLastDivider = showLastDivider; + } + + @Override + public void getItemOffsets(@NonNull Rect outRect, @NonNull View view, @NonNull RecyclerView parent, + @NonNull RecyclerView.State state) { + super.getItemOffsets(outRect, view, parent, state); + if (mDivider == null) { + return; + } + if (parent.getChildAdapterPosition(view) < 1) { + return; + } + + if (getOrientation(parent) == LinearLayoutManager.VERTICAL) { + outRect.top = mDivider.getIntrinsicHeight(); + } else { + outRect.left = mDivider.getIntrinsicWidth(); + } + } + + @Override + public void onDrawOver(@NonNull Canvas c, @NonNull RecyclerView parent, @NonNull RecyclerView.State state) { + if (mDivider == null) { + super.onDrawOver(c, parent, state); + return; + } + + // Initialization needed to avoid compiler warning + int left = 0, right = 0, top = 0, bottom = 0, size; + int orientation = getOrientation(parent); + int childCount = parent.getChildCount(); + + if (orientation == LinearLayoutManager.VERTICAL) { + size = mDivider.getIntrinsicHeight(); + left = parent.getPaddingLeft(); + right = parent.getWidth() - parent.getPaddingRight(); + } else { //horizontal + size = mDivider.getIntrinsicWidth(); + top = parent.getPaddingTop(); + bottom = parent.getHeight() - parent.getPaddingBottom(); + } + + for (int i = mShowFirstDivider ? 0 : 1; i < childCount; i++) { + View child = parent.getChildAt(i); + RecyclerView.LayoutParams params = (RecyclerView.LayoutParams) child.getLayoutParams(); + + if (orientation == LinearLayoutManager.VERTICAL) { + top = child.getTop() - params.topMargin; + bottom = top + size; + } else { //horizontal + left = child.getLeft() - params.leftMargin; + right = left + size; + } + mDivider.setBounds(left, top, right, bottom); + mDivider.draw(c); + } + + // show last divider + if (mShowLastDivider && childCount > 0) { + View child = parent.getChildAt(childCount - 1); + RecyclerView.LayoutParams params = (RecyclerView.LayoutParams) child.getLayoutParams(); + if (orientation == LinearLayoutManager.VERTICAL) { + top = child.getBottom() + params.bottomMargin; + bottom = top + size; + } else { // horizontal + left = child.getRight() + params.rightMargin; + right = left + size; + } + mDivider.setBounds(left, top, right, bottom); + mDivider.draw(c); + } + } + + private int getOrientation(RecyclerView parent) { + if (parent.getLayoutManager() instanceof LinearLayoutManager) { + LinearLayoutManager layoutManager = (LinearLayoutManager) parent.getLayoutManager(); + return layoutManager.getOrientation(); + } else { + throw new IllegalStateException( + "DividerItemDecoration can only be used with a LinearLayoutManager."); + } + } +} diff --git a/src/android/app/src/main/java/org/citra/citra_emu/ui/main/MainActivity.java b/src/android/app/src/main/java/org/citra/citra_emu/ui/main/MainActivity.java new file mode 100644 index 000000000..402c8a4e0 --- /dev/null +++ b/src/android/app/src/main/java/org/citra/citra_emu/ui/main/MainActivity.java @@ -0,0 +1,269 @@ +package org.citra.citra_emu.ui.main; + +import android.content.Intent; +import android.content.pm.PackageManager; +import android.os.Bundle; +import android.view.Menu; +import android.view.MenuInflater; +import android.view.MenuItem; +import android.widget.Toast; + +import androidx.annotation.NonNull; +import androidx.appcompat.app.AppCompatActivity; +import androidx.appcompat.widget.Toolbar; + +import org.citra.citra_emu.NativeLibrary; +import org.citra.citra_emu.R; +import org.citra.citra_emu.activities.EmulationActivity; +import org.citra.citra_emu.features.settings.ui.SettingsActivity; +import org.citra.citra_emu.model.GameProvider; +import org.citra.citra_emu.ui.platform.PlatformGamesFragment; +import org.citra.citra_emu.utils.AddDirectoryHelper; +import org.citra.citra_emu.utils.BillingManager; +import org.citra.citra_emu.utils.DirectoryInitialization; +import org.citra.citra_emu.utils.FileBrowserHelper; +import org.citra.citra_emu.utils.PermissionsHandler; +import org.citra.citra_emu.utils.PicassoUtils; +import org.citra.citra_emu.utils.StartupHandler; +import org.citra.citra_emu.utils.ThemeUtil; + +import java.util.Arrays; +import java.util.Collections; + +/** + * The main Activity of the Lollipop style UI. Manages several PlatformGamesFragments, which + * individually display a grid of available games for each Fragment, in a tabbed layout. + */ +public final class MainActivity extends AppCompatActivity implements MainView { + private Toolbar mToolbar; + private int mFrameLayoutId; + private PlatformGamesFragment mPlatformGamesFragment; + + private MainPresenter mPresenter = new MainPresenter(this); + + // Singleton to manage user billing state + private static BillingManager mBillingManager; + + private static MenuItem mPremiumButton; + + @Override + protected void onCreate(Bundle savedInstanceState) { + ThemeUtil.applyTheme(); + + super.onCreate(savedInstanceState); + setContentView(R.layout.activity_main); + + findViews(); + + setSupportActionBar(mToolbar); + + mFrameLayoutId = R.id.games_platform_frame; + mPresenter.onCreate(); + + if (savedInstanceState == null) { + StartupHandler.HandleInit(this); + if (PermissionsHandler.hasWriteAccess(this)) { + mPlatformGamesFragment = new PlatformGamesFragment(); + getSupportFragmentManager().beginTransaction().add(mFrameLayoutId, mPlatformGamesFragment) + .commit(); + } + } else { + mPlatformGamesFragment = (PlatformGamesFragment) getSupportFragmentManager().getFragment(savedInstanceState, "mPlatformGamesFragment"); + } + PicassoUtils.init(); + + // Setup billing manager, so we can globally query for Premium status + mBillingManager = new BillingManager(this); + + // Dismiss previous notifications (should not happen unless a crash occurred) + EmulationActivity.tryDismissRunningNotification(this); + } + + @Override + protected void onSaveInstanceState(@NonNull Bundle outState) { + super.onSaveInstanceState(outState); + if (PermissionsHandler.hasWriteAccess(this)) { + if (getSupportFragmentManager() == null) { + return; + } + if (outState == null) { + return; + } + getSupportFragmentManager().putFragment(outState, "mPlatformGamesFragment", mPlatformGamesFragment); + } + } + + @Override + protected void onResume() { + super.onResume(); + mPresenter.addDirIfNeeded(new AddDirectoryHelper(this)); + } + + // TODO: Replace with a ButterKnife injection. + private void findViews() { + mToolbar = findViewById(R.id.toolbar_main); + } + + @Override + public boolean onCreateOptionsMenu(Menu menu) { + MenuInflater inflater = getMenuInflater(); + inflater.inflate(R.menu.menu_game_grid, menu); + mPremiumButton = menu.findItem(R.id.button_premium); + + if (mBillingManager.isPremiumCached()) { + // User had premium in a previous session, hide upsell option + setPremiumButtonVisible(false); + } + + return true; + } + + static public void setPremiumButtonVisible(boolean isVisible) { + if (mPremiumButton != null) { + mPremiumButton.setVisible(isVisible); + } + } + + /** + * MainView + */ + + @Override + public void setVersionString(String version) { + mToolbar.setSubtitle(version); + } + + @Override + public void refresh() { + getContentResolver().insert(GameProvider.URI_REFRESH, null); + refreshFragment(); + } + + @Override + public void launchSettingsActivity(String menuTag) { + if (PermissionsHandler.hasWriteAccess(this)) { + SettingsActivity.launch(this, menuTag, ""); + } else { + PermissionsHandler.checkWritePermission(this); + } + } + + @Override + public void launchFileListActivity(int request) { + if (PermissionsHandler.hasWriteAccess(this)) { + switch (request) { + case MainPresenter.REQUEST_ADD_DIRECTORY: + FileBrowserHelper.openDirectoryPicker(this, + MainPresenter.REQUEST_ADD_DIRECTORY, + R.string.select_game_folder, + Arrays.asList("elf", "axf", "cci", "3ds", + "cxi", "app", "3dsx", "cia", + "rar", "zip", "7z", "torrent", + "tar", "gz")); + break; + case MainPresenter.REQUEST_INSTALL_CIA: + FileBrowserHelper.openFilePicker(this, MainPresenter.REQUEST_INSTALL_CIA, + R.string.install_cia_title, + Collections.singletonList("cia"), true); + break; + } + } else { + PermissionsHandler.checkWritePermission(this); + } + } + + /** + * @param requestCode An int describing whether the Activity that is returning did so successfully. + * @param resultCode An int describing what Activity is giving us this callback. + * @param result The information the returning Activity is providing us. + */ + @Override + protected void onActivityResult(int requestCode, int resultCode, Intent result) { + super.onActivityResult(requestCode, resultCode, result); + switch (requestCode) { + case MainPresenter.REQUEST_ADD_DIRECTORY: + // If the user picked a file, as opposed to just backing out. + if (resultCode == MainActivity.RESULT_OK) { + // When a new directory is picked, we currently will reset the existing games + // database. This effectively means that only one game directory is supported. + // TODO(bunnei): Consider fixing this in the future, or removing code for this. + getContentResolver().insert(GameProvider.URI_RESET, null); + // Add the new directory + mPresenter.onDirectorySelected(FileBrowserHelper.getSelectedDirectory(result)); + } + break; + case MainPresenter.REQUEST_INSTALL_CIA: + // If the user picked a file, as opposed to just backing out. + if (resultCode == MainActivity.RESULT_OK) { + NativeLibrary.InstallCIAS(FileBrowserHelper.getSelectedFiles(result)); + mPresenter.refeshGameList(); + } + break; + } + } + + @Override + public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) { + switch (requestCode) { + case PermissionsHandler.REQUEST_CODE_WRITE_PERMISSION: + if (grantResults[0] == PackageManager.PERMISSION_GRANTED) { + DirectoryInitialization.start(this); + + mPlatformGamesFragment = new PlatformGamesFragment(); + getSupportFragmentManager().beginTransaction().add(mFrameLayoutId, mPlatformGamesFragment) + .commit(); + + // Immediately prompt user to select a game directory on first boot + if (mPresenter != null) { + mPresenter.launchFileListActivity(MainPresenter.REQUEST_ADD_DIRECTORY); + } + } else { + Toast.makeText(this, R.string.write_permission_needed, Toast.LENGTH_SHORT) + .show(); + } + break; + default: + super.onRequestPermissionsResult(requestCode, permissions, grantResults); + break; + } + } + + /** + * Called by the framework whenever any actionbar/toolbar icon is clicked. + * + * @param item The icon that was clicked on. + * @return True if the event was handled, false to bubble it up to the OS. + */ + @Override + public boolean onOptionsItemSelected(MenuItem item) { + return mPresenter.handleOptionSelection(item.getItemId()); + } + + private void refreshFragment() { + if (mPlatformGamesFragment != null) { + mPlatformGamesFragment.refresh(); + } + } + + @Override + protected void onDestroy() { + EmulationActivity.tryDismissRunningNotification(this); + super.onDestroy(); + } + + /** + * @return true if Premium subscription is currently active + */ + public static boolean isPremiumActive() { + return mBillingManager.isPremiumActive(); + } + + /** + * Invokes the billing flow for Premium + * + * @param callback Optional callback, called once, on completion of billing + */ + public static void invokePremiumBilling(Runnable callback) { + mBillingManager.invokePremiumBilling(callback); + } +} diff --git a/src/android/app/src/main/java/org/citra/citra_emu/ui/main/MainPresenter.java b/src/android/app/src/main/java/org/citra/citra_emu/ui/main/MainPresenter.java new file mode 100644 index 000000000..4e9994c2a --- /dev/null +++ b/src/android/app/src/main/java/org/citra/citra_emu/ui/main/MainPresenter.java @@ -0,0 +1,82 @@ +package org.citra.citra_emu.ui.main; + +import android.os.SystemClock; + +import org.citra.citra_emu.BuildConfig; +import org.citra.citra_emu.CitraApplication; +import org.citra.citra_emu.R; +import org.citra.citra_emu.features.settings.model.Settings; +import org.citra.citra_emu.features.settings.utils.SettingsFile; +import org.citra.citra_emu.model.GameDatabase; +import org.citra.citra_emu.utils.AddDirectoryHelper; + +public final class MainPresenter { + public static final int REQUEST_ADD_DIRECTORY = 1; + public static final int REQUEST_INSTALL_CIA = 2; + + private final MainView mView; + private String mDirToAdd; + private long mLastClickTime = 0; + + public MainPresenter(MainView view) { + mView = view; + } + + public void onCreate() { + String versionName = BuildConfig.VERSION_NAME; + mView.setVersionString(versionName); + refeshGameList(); + } + + public void launchFileListActivity(int request) { + if (mView != null) { + mView.launchFileListActivity(request); + } + } + + public boolean handleOptionSelection(int itemId) { + // Double-click prevention, using threshold of 500 ms + if (SystemClock.elapsedRealtime() - mLastClickTime < 500) { + return false; + } + mLastClickTime = SystemClock.elapsedRealtime(); + + switch (itemId) { + case R.id.menu_settings_core: + mView.launchSettingsActivity(SettingsFile.FILE_NAME_CONFIG); + return true; + + case R.id.button_add_directory: + launchFileListActivity(REQUEST_ADD_DIRECTORY); + return true; + + case R.id.button_install_cia: + launchFileListActivity(REQUEST_INSTALL_CIA); + return true; + + case R.id.button_premium: + mView.launchSettingsActivity(Settings.SECTION_PREMIUM); + return true; + } + + return false; + } + + public void addDirIfNeeded(AddDirectoryHelper helper) { + if (mDirToAdd != null) { + helper.addDirectory(mDirToAdd, mView::refresh); + + mDirToAdd = null; + } + } + + public void onDirectorySelected(String dir) { + mDirToAdd = dir; + } + + public void refeshGameList() { + GameDatabase databaseHelper = CitraApplication.databaseHelper; + databaseHelper.scanLibrary(databaseHelper.getWritableDatabase()); + mView.refresh(); + } +} diff --git a/src/android/app/src/main/java/org/citra/citra_emu/ui/main/MainView.java b/src/android/app/src/main/java/org/citra/citra_emu/ui/main/MainView.java new file mode 100644 index 000000000..de7c04875 --- /dev/null +++ b/src/android/app/src/main/java/org/citra/citra_emu/ui/main/MainView.java @@ -0,0 +1,25 @@ +package org.citra.citra_emu.ui.main; + +/** + * Abstraction for the screen that shows on application launch. + * Implementations will differ primarily to target touch-screen + * or non-touch screen devices. + */ +public interface MainView { + /** + * Pass the view the native library's version string. Displaying + * it is optional. + * + * @param version A string pulled from native code. + */ + void setVersionString(String version); + + /** + * Tell the view to refresh its contents. + */ + void refresh(); + + void launchSettingsActivity(String menuTag); + + void launchFileListActivity(int request); +} diff --git a/src/android/app/src/main/java/org/citra/citra_emu/ui/platform/PlatformGamesFragment.java b/src/android/app/src/main/java/org/citra/citra_emu/ui/platform/PlatformGamesFragment.java new file mode 100644 index 000000000..9fc30796f --- /dev/null +++ b/src/android/app/src/main/java/org/citra/citra_emu/ui/platform/PlatformGamesFragment.java @@ -0,0 +1,86 @@ +package org.citra.citra_emu.ui.platform; + +import android.database.Cursor; +import android.os.Bundle; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.widget.TextView; + +import androidx.core.content.ContextCompat; +import androidx.fragment.app.Fragment; +import androidx.recyclerview.widget.GridLayoutManager; +import androidx.recyclerview.widget.RecyclerView; +import androidx.swiperefreshlayout.widget.SwipeRefreshLayout; + +import org.citra.citra_emu.CitraApplication; +import org.citra.citra_emu.R; +import org.citra.citra_emu.adapters.GameAdapter; +import org.citra.citra_emu.model.GameDatabase; + +public final class PlatformGamesFragment extends Fragment implements PlatformGamesView { + private PlatformGamesPresenter mPresenter = new PlatformGamesPresenter(this); + + private GameAdapter mAdapter; + private RecyclerView mRecyclerView; + private TextView mTextView; + + @Override + public void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + } + + @Override + public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { + View rootView = inflater.inflate(R.layout.fragment_grid, container, false); + + findViews(rootView); + + mPresenter.onCreateView(); + + return rootView; + } + + @Override + public void onViewCreated(View view, Bundle savedInstanceState) { + int columns = getResources().getInteger(R.integer.game_grid_columns); + RecyclerView.LayoutManager layoutManager = new GridLayoutManager(getActivity(), columns); + mAdapter = new GameAdapter(); + + mRecyclerView.setLayoutManager(layoutManager); + mRecyclerView.setAdapter(mAdapter); + mRecyclerView.addItemDecoration(new GameAdapter.SpacesItemDecoration(ContextCompat.getDrawable(getActivity(), R.drawable.gamelist_divider), 1)); + + // Add swipe down to refresh gesture + final SwipeRefreshLayout pullToRefresh = view.findViewById(R.id.refresh_grid_games); + pullToRefresh.setOnRefreshListener(() -> { + GameDatabase databaseHelper = CitraApplication.databaseHelper; + databaseHelper.scanLibrary(databaseHelper.getWritableDatabase()); + refresh(); + pullToRefresh.setRefreshing(false); + }); + } + + @Override + public void refresh() { + mPresenter.refresh(); + updateTextView(); + } + + @Override + public void showGames(Cursor games) { + if (mAdapter != null) { + mAdapter.swapCursor(games); + } + updateTextView(); + } + + private void updateTextView() { + mTextView.setVisibility(mAdapter.getItemCount() == 0 ? View.VISIBLE : View.GONE); + } + + private void findViews(View root) { + mRecyclerView = root.findViewById(R.id.grid_games); + mTextView = root.findViewById(R.id.gamelist_empty_text); + } +} diff --git a/src/android/app/src/main/java/org/citra/citra_emu/ui/platform/PlatformGamesPresenter.java b/src/android/app/src/main/java/org/citra/citra_emu/ui/platform/PlatformGamesPresenter.java new file mode 100644 index 000000000..9d8040e1b --- /dev/null +++ b/src/android/app/src/main/java/org/citra/citra_emu/ui/platform/PlatformGamesPresenter.java @@ -0,0 +1,42 @@ +package org.citra.citra_emu.ui.platform; + + +import org.citra.citra_emu.CitraApplication; +import org.citra.citra_emu.model.GameDatabase; +import org.citra.citra_emu.utils.Log; + +import rx.android.schedulers.AndroidSchedulers; +import rx.schedulers.Schedulers; + +public final class PlatformGamesPresenter { + private final PlatformGamesView mView; + + public PlatformGamesPresenter(PlatformGamesView view) { + mView = view; + } + + public void onCreateView() { + loadGames(); + } + + public void refresh() { + Log.debug("[PlatformGamesPresenter] : Refreshing..."); + loadGames(); + } + + private void loadGames() { + Log.debug("[PlatformGamesPresenter] : Loading games..."); + + GameDatabase databaseHelper = CitraApplication.databaseHelper; + + databaseHelper.getGames() + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()) + .subscribe(games -> + { + Log.debug("[PlatformGamesPresenter] : Load finished, swapping cursor..."); + + mView.showGames(games); + }); + } +} diff --git a/src/android/app/src/main/java/org/citra/citra_emu/ui/platform/PlatformGamesView.java b/src/android/app/src/main/java/org/citra/citra_emu/ui/platform/PlatformGamesView.java new file mode 100644 index 000000000..4332121eb --- /dev/null +++ b/src/android/app/src/main/java/org/citra/citra_emu/ui/platform/PlatformGamesView.java @@ -0,0 +1,21 @@ +package org.citra.citra_emu.ui.platform; + +import android.database.Cursor; + +/** + * Abstraction for a screen representing a single platform's games. + */ +public interface PlatformGamesView { + /** + * Tell the view to refresh its contents. + */ + void refresh(); + + /** + * To be called when an asynchronous database read completes. Passes the + * result, in this case a {@link Cursor}, to the view. + * + * @param games A Cursor containing the games read from the database. + */ + void showGames(Cursor games); +} diff --git a/src/android/app/src/main/java/org/citra/citra_emu/utils/Action1.java b/src/android/app/src/main/java/org/citra/citra_emu/utils/Action1.java new file mode 100644 index 000000000..886846ec5 --- /dev/null +++ b/src/android/app/src/main/java/org/citra/citra_emu/utils/Action1.java @@ -0,0 +1,5 @@ +package org.citra.citra_emu.utils; + +public interface Action1 { + void call(T t); +} diff --git a/src/android/app/src/main/java/org/citra/citra_emu/utils/AddDirectoryHelper.java b/src/android/app/src/main/java/org/citra/citra_emu/utils/AddDirectoryHelper.java new file mode 100644 index 000000000..7578c353f --- /dev/null +++ b/src/android/app/src/main/java/org/citra/citra_emu/utils/AddDirectoryHelper.java @@ -0,0 +1,38 @@ +package org.citra.citra_emu.utils; + +import android.content.AsyncQueryHandler; +import android.content.ContentValues; +import android.content.Context; +import android.net.Uri; + +import org.citra.citra_emu.model.GameDatabase; +import org.citra.citra_emu.model.GameProvider; + +public class AddDirectoryHelper { + private Context mContext; + + public AddDirectoryHelper(Context context) { + this.mContext = context; + } + + public void addDirectory(String dir, AddDirectoryListener addDirectoryListener) { + AsyncQueryHandler handler = new AsyncQueryHandler(mContext.getContentResolver()) { + @Override + protected void onInsertComplete(int token, Object cookie, Uri uri) { + addDirectoryListener.onDirectoryAdded(); + } + }; + + ContentValues file = new ContentValues(); + file.put(GameDatabase.KEY_FOLDER_PATH, dir); + + handler.startInsert(0, // We don't need to identify this call to the handler + null, // We don't need to pass additional data to the handler + GameProvider.URI_FOLDER, // Tell the GameProvider we are adding a folder + file); + } + + public interface AddDirectoryListener { + void onDirectoryAdded(); + } +} diff --git a/src/android/app/src/main/java/org/citra/citra_emu/utils/BiMap.java b/src/android/app/src/main/java/org/citra/citra_emu/utils/BiMap.java new file mode 100644 index 000000000..dfbab1780 --- /dev/null +++ b/src/android/app/src/main/java/org/citra/citra_emu/utils/BiMap.java @@ -0,0 +1,22 @@ +package org.citra.citra_emu.utils; + +import java.util.HashMap; +import java.util.Map; + +public class BiMap { + private Map forward = new HashMap(); + private Map backward = new HashMap(); + + public synchronized void add(K key, V value) { + forward.put(key, value); + backward.put(value, key); + } + + public synchronized V getForward(K key) { + return forward.get(key); + } + + public synchronized K getBackward(V key) { + return backward.get(key); + } +} diff --git a/src/android/app/src/main/java/org/citra/citra_emu/utils/BillingManager.java b/src/android/app/src/main/java/org/citra/citra_emu/utils/BillingManager.java new file mode 100644 index 000000000..5dc54c235 --- /dev/null +++ b/src/android/app/src/main/java/org/citra/citra_emu/utils/BillingManager.java @@ -0,0 +1,215 @@ +package org.citra.citra_emu.utils; + +import android.app.Activity; +import android.content.SharedPreferences; +import android.preference.PreferenceManager; +import android.widget.Toast; + +import com.android.billingclient.api.AcknowledgePurchaseParams; +import com.android.billingclient.api.AcknowledgePurchaseResponseListener; +import com.android.billingclient.api.BillingClient; +import com.android.billingclient.api.BillingClientStateListener; +import com.android.billingclient.api.BillingFlowParams; +import com.android.billingclient.api.BillingResult; +import com.android.billingclient.api.Purchase; +import com.android.billingclient.api.Purchase.PurchasesResult; +import com.android.billingclient.api.PurchasesUpdatedListener; +import com.android.billingclient.api.SkuDetails; +import com.android.billingclient.api.SkuDetailsParams; + +import org.citra.citra_emu.CitraApplication; +import org.citra.citra_emu.R; +import org.citra.citra_emu.features.settings.utils.SettingsFile; +import org.citra.citra_emu.ui.main.MainActivity; + +import java.util.ArrayList; +import java.util.List; + +public class BillingManager implements PurchasesUpdatedListener { + private final String BILLING_SKU_PREMIUM = "citra.citra_emu.product_id.premium"; + + private final Activity mActivity; + private BillingClient mBillingClient; + private SkuDetails mSkuPremium; + private boolean mIsPremiumActive = false; + private boolean mIsServiceConnected = false; + private Runnable mUpdateBillingCallback; + + private static SharedPreferences mPreferences = PreferenceManager.getDefaultSharedPreferences(CitraApplication.getAppContext()); + + public BillingManager(Activity activity) { + mActivity = activity; + mBillingClient = BillingClient.newBuilder(mActivity).enablePendingPurchases().setListener(this).build(); + querySkuDetails(); + } + + static public boolean isPremiumCached() { + return mPreferences.getBoolean(SettingsFile.KEY_PREMIUM, false); + } + + /** + * @return true if Premium subscription is currently active + */ + public boolean isPremiumActive() { + return mIsPremiumActive; + } + + /** + * Invokes the billing flow for Premium + * + * @param callback Optional callback, called once, on completion of billing + */ + public void invokePremiumBilling(Runnable callback) { + if (mSkuPremium == null) { + return; + } + + // Optional callback to refresh the UI for the caller when billing completes + mUpdateBillingCallback = callback; + + // Invoke the billing flow + BillingFlowParams flowParams = BillingFlowParams.newBuilder() + .setSkuDetails(mSkuPremium) + .build(); + mBillingClient.launchBillingFlow(mActivity, flowParams); + } + + private void updatePremiumState(boolean isPremiumActive) { + mIsPremiumActive = isPremiumActive; + + // Cache state for synchronous UI + SharedPreferences.Editor editor = mPreferences.edit(); + editor.putBoolean(SettingsFile.KEY_PREMIUM, isPremiumActive); + editor.apply(); + + // No need to show button in action bar if Premium is active + MainActivity.setPremiumButtonVisible(!isPremiumActive); + } + + @Override + public void onPurchasesUpdated(BillingResult billingResult, List purchaseList) { + if (purchaseList == null || purchaseList.isEmpty()) { + // Premium is not active, or billing is unavailable + updatePremiumState(false); + return; + } + + Purchase premiumPurchase = null; + for (Purchase purchase : purchaseList) { + if (purchase.getSku().equals(BILLING_SKU_PREMIUM)) { + premiumPurchase = purchase; + } + } + + if (premiumPurchase != null && premiumPurchase.getPurchaseState() == Purchase.PurchaseState.PURCHASED) { + // Premium has been purchased + updatePremiumState(true); + + // Acknowledge the purchase if it hasn't already been acknowledged. + if (!premiumPurchase.isAcknowledged()) { + AcknowledgePurchaseParams acknowledgePurchaseParams = + AcknowledgePurchaseParams.newBuilder() + .setPurchaseToken(premiumPurchase.getPurchaseToken()) + .build(); + + AcknowledgePurchaseResponseListener acknowledgePurchaseResponseListener = billingResult1 -> { + Toast.makeText(mActivity, R.string.premium_settings_welcome, Toast.LENGTH_SHORT).show(); + }; + mBillingClient.acknowledgePurchase(acknowledgePurchaseParams, acknowledgePurchaseResponseListener); + } + + if (mUpdateBillingCallback != null) { + try { + mUpdateBillingCallback.run(); + } catch (Exception e) { + e.printStackTrace(); + } + mUpdateBillingCallback = null; + } + } + } + + private void onQuerySkuDetailsFinished(List skuDetailsList) { + if (skuDetailsList == null) { + // This can happen when no user is signed in + return; + } + + if (skuDetailsList.isEmpty()) { + return; + } + + mSkuPremium = skuDetailsList.get(0); + + queryPurchases(); + } + + private void querySkuDetails() { + Runnable queryToExecute = new Runnable() { + @Override + public void run() { + SkuDetailsParams.Builder params = SkuDetailsParams.newBuilder(); + List skuList = new ArrayList<>(); + + skuList.add(BILLING_SKU_PREMIUM); + params.setSkusList(skuList).setType(BillingClient.SkuType.INAPP); + + mBillingClient.querySkuDetailsAsync(params.build(), + (billingResult, skuDetailsList) -> onQuerySkuDetailsFinished(skuDetailsList)); + } + }; + + executeServiceRequest(queryToExecute); + } + + private void onQueryPurchasesFinished(PurchasesResult result) { + // Have we been disposed of in the meantime? If so, or bad result code, then quit + if (mBillingClient == null || result.getResponseCode() != BillingClient.BillingResponseCode.OK) { + updatePremiumState(false); + return; + } + // Update the UI and purchases inventory with new list of purchases + onPurchasesUpdated(result.getBillingResult(), result.getPurchasesList()); + } + + private void queryPurchases() { + Runnable queryToExecute = new Runnable() { + @Override + public void run() { + final PurchasesResult purchasesResult = mBillingClient.queryPurchases(BillingClient.SkuType.INAPP); + onQueryPurchasesFinished(purchasesResult); + } + }; + + executeServiceRequest(queryToExecute); + } + + private void startServiceConnection(final Runnable executeOnFinish) { + mBillingClient.startConnection(new BillingClientStateListener() { + @Override + public void onBillingSetupFinished(BillingResult billingResult) { + if (billingResult.getResponseCode() == BillingClient.BillingResponseCode.OK) { + mIsServiceConnected = true; + } + + if (executeOnFinish != null) { + executeOnFinish.run(); + } + } + + @Override + public void onBillingServiceDisconnected() { + mIsServiceConnected = false; + } + }); + } + + private void executeServiceRequest(Runnable runnable) { + if (mIsServiceConnected) { + runnable.run(); + } else { + // If billing service was disconnected, we try to reconnect 1 time. + startServiceConnection(runnable); + } + } +} diff --git a/src/android/app/src/main/java/org/citra/citra_emu/utils/ControllerMappingHelper.java b/src/android/app/src/main/java/org/citra/citra_emu/utils/ControllerMappingHelper.java new file mode 100644 index 000000000..f801a05f0 --- /dev/null +++ b/src/android/app/src/main/java/org/citra/citra_emu/utils/ControllerMappingHelper.java @@ -0,0 +1,66 @@ +package org.citra.citra_emu.utils; + +import android.view.InputDevice; +import android.view.KeyEvent; +import android.view.MotionEvent; + +/** + * Some controllers have incorrect mappings. This class has special-case fixes for them. + */ +public class ControllerMappingHelper { + /** + * Some controllers report extra button presses that can be ignored. + */ + public boolean shouldKeyBeIgnored(InputDevice inputDevice, int keyCode) { + if (isDualShock4(inputDevice)) { + // The two analog triggers generate analog motion events as well as a keycode. + // We always prefer to use the analog values, so throw away the button press + return keyCode == KeyEvent.KEYCODE_BUTTON_L2 || keyCode == KeyEvent.KEYCODE_BUTTON_R2; + } + return false; + } + + /** + * Scale an axis to be zero-centered with a proper range. + */ + public float scaleAxis(InputDevice inputDevice, int axis, float value) { + if (isDualShock4(inputDevice)) { + // Android doesn't have correct mappings for this controller's triggers. It reports them + // as RX & RY, centered at -1.0, and with a range of [-1.0, 1.0] + // Scale them to properly zero-centered with a range of [0.0, 1.0]. + if (axis == MotionEvent.AXIS_RX || axis == MotionEvent.AXIS_RY) { + return (value + 1) / 2.0f; + } + } else if (isXboxOneWireless(inputDevice)) { + // Same as the DualShock 4, the mappings are missing. + if (axis == MotionEvent.AXIS_Z || axis == MotionEvent.AXIS_RZ) { + return (value + 1) / 2.0f; + } + if (axis == MotionEvent.AXIS_GENERIC_1) { + // This axis is stuck at ~.5. Ignore it. + return 0.0f; + } + } else if (isMogaPro2Hid(inputDevice)) { + // This controller has a broken axis that reports a constant value. Ignore it. + if (axis == MotionEvent.AXIS_GENERIC_1) { + return 0.0f; + } + } + return value; + } + + private boolean isDualShock4(InputDevice inputDevice) { + // Sony DualShock 4 controller + return inputDevice.getVendorId() == 0x54c && inputDevice.getProductId() == 0x9cc; + } + + private boolean isXboxOneWireless(InputDevice inputDevice) { + // Microsoft Xbox One controller + return inputDevice.getVendorId() == 0x45e && inputDevice.getProductId() == 0x2e0; + } + + private boolean isMogaPro2Hid(InputDevice inputDevice) { + // Moga Pro 2 HID + return inputDevice.getVendorId() == 0x20d6 && inputDevice.getProductId() == 0x6271; + } +} diff --git a/src/android/app/src/main/java/org/citra/citra_emu/utils/DirectoryInitialization.java b/src/android/app/src/main/java/org/citra/citra_emu/utils/DirectoryInitialization.java new file mode 100644 index 000000000..58e552f5e --- /dev/null +++ b/src/android/app/src/main/java/org/citra/citra_emu/utils/DirectoryInitialization.java @@ -0,0 +1,186 @@ +/** + * Copyright 2014 Dolphin Emulator Project + * Licensed under GPLv2+ + * Refer to the license.txt file included. + */ + +package org.citra.citra_emu.utils; + +import android.content.Context; +import android.content.Intent; +import android.content.SharedPreferences; +import android.os.Environment; +import android.preference.PreferenceManager; + +import androidx.localbroadcastmanager.content.LocalBroadcastManager; + +import org.citra.citra_emu.NativeLibrary; + +import java.io.File; +import java.io.FileOutputStream; +import java.io.IOException; +import java.io.InputStream; +import java.io.OutputStream; +import java.util.concurrent.atomic.AtomicBoolean; + +/** + * A service that spawns its own thread in order to copy several binary and shader files + * from the Citra APK to the external file system. + */ +public final class DirectoryInitialization { + public static final String BROADCAST_ACTION = "org.citra.citra_emu.BROADCAST"; + + public static final String EXTRA_STATE = "directoryState"; + private static volatile DirectoryInitializationState directoryState = null; + private static String userPath; + private static AtomicBoolean isCitraDirectoryInitializationRunning = new AtomicBoolean(false); + + public static void start(Context context) { + // Can take a few seconds to run, so don't block UI thread. + //noinspection TrivialFunctionalExpressionUsage + ((Runnable) () -> init(context)).run(); + } + + private static void init(Context context) { + if (!isCitraDirectoryInitializationRunning.compareAndSet(false, true)) + return; + + if (directoryState != DirectoryInitializationState.CITRA_DIRECTORIES_INITIALIZED) { + if (PermissionsHandler.hasWriteAccess(context)) { + if (setCitraUserDirectory()) { + initializeInternalStorage(context); + NativeLibrary.CreateConfigFile(); + directoryState = DirectoryInitializationState.CITRA_DIRECTORIES_INITIALIZED; + } else { + directoryState = DirectoryInitializationState.CANT_FIND_EXTERNAL_STORAGE; + } + } else { + directoryState = DirectoryInitializationState.EXTERNAL_STORAGE_PERMISSION_NEEDED; + } + } + + isCitraDirectoryInitializationRunning.set(false); + sendBroadcastState(directoryState, context); + } + + private static void deleteDirectoryRecursively(File file) { + if (file.isDirectory()) { + for (File child : file.listFiles()) + deleteDirectoryRecursively(child); + } + file.delete(); + } + + public static boolean areCitraDirectoriesReady() { + return directoryState == DirectoryInitializationState.CITRA_DIRECTORIES_INITIALIZED; + } + + public static String getUserDirectory() { + if (directoryState == null) { + throw new IllegalStateException("DirectoryInitialization has to run at least once!"); + } else if (isCitraDirectoryInitializationRunning.get()) { + throw new IllegalStateException( + "DirectoryInitialization has to finish running first!"); + } + return userPath; + } + + private static native void SetSysDirectory(String path); + + private static boolean setCitraUserDirectory() { + if (Environment.MEDIA_MOUNTED.equals(Environment.getExternalStorageState())) { + File externalPath = Environment.getExternalStorageDirectory(); + if (externalPath != null) { + userPath = externalPath.getAbsolutePath() + "/citra-emu"; + Log.debug("[DirectoryInitialization] User Dir: " + userPath); + // NativeLibrary.SetUserDirectory(userPath); + return true; + } + + } + + return false; + } + + private static void initializeInternalStorage(Context context) { + File sysDirectory = new File(context.getFilesDir(), "Sys"); + + SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(context); + String revision = NativeLibrary.GetGitRevision(); + if (!preferences.getString("sysDirectoryVersion", "").equals(revision)) { + // There is no extracted Sys directory, or there is a Sys directory from another + // version of Citra that might contain outdated files. Let's (re-)extract Sys. + deleteDirectoryRecursively(sysDirectory); + copyAssetFolder("Sys", sysDirectory, true, context); + + SharedPreferences.Editor editor = preferences.edit(); + editor.putString("sysDirectoryVersion", revision); + editor.apply(); + } + + // Let the native code know where the Sys directory is. + SetSysDirectory(sysDirectory.getPath()); + } + + private static void sendBroadcastState(DirectoryInitializationState state, Context context) { + Intent localIntent = + new Intent(BROADCAST_ACTION) + .putExtra(EXTRA_STATE, state); + LocalBroadcastManager.getInstance(context).sendBroadcast(localIntent); + } + + private static void copyAsset(String asset, File output, Boolean overwrite, Context context) { + Log.verbose("[DirectoryInitialization] Copying File " + asset + " to " + output); + + try { + if (!output.exists() || overwrite) { + InputStream in = context.getAssets().open(asset); + OutputStream out = new FileOutputStream(output); + copyFile(in, out); + in.close(); + out.close(); + } + } catch (IOException e) { + Log.error("[DirectoryInitialization] Failed to copy asset file: " + asset + + e.getMessage()); + } + } + + private static void copyAssetFolder(String assetFolder, File outputFolder, Boolean overwrite, + Context context) { + Log.verbose("[DirectoryInitialization] Copying Folder " + assetFolder + " to " + + outputFolder); + + try { + boolean createdFolder = false; + for (String file : context.getAssets().list(assetFolder)) { + if (!createdFolder) { + outputFolder.mkdir(); + createdFolder = true; + } + copyAssetFolder(assetFolder + File.separator + file, new File(outputFolder, file), + overwrite, context); + copyAsset(assetFolder + File.separator + file, new File(outputFolder, file), overwrite, + context); + } + } catch (IOException e) { + Log.error("[DirectoryInitialization] Failed to copy asset folder: " + assetFolder + + e.getMessage()); + } + } + + private static void copyFile(InputStream in, OutputStream out) throws IOException { + byte[] buffer = new byte[1024]; + int read; + + while ((read = in.read(buffer)) != -1) { + out.write(buffer, 0, read); + } + } + + public enum DirectoryInitializationState { + CITRA_DIRECTORIES_INITIALIZED, + EXTERNAL_STORAGE_PERMISSION_NEEDED, + CANT_FIND_EXTERNAL_STORAGE + } +} diff --git a/src/android/app/src/main/java/org/citra/citra_emu/utils/DirectoryStateReceiver.java b/src/android/app/src/main/java/org/citra/citra_emu/utils/DirectoryStateReceiver.java new file mode 100644 index 000000000..5d1e951ca --- /dev/null +++ b/src/android/app/src/main/java/org/citra/citra_emu/utils/DirectoryStateReceiver.java @@ -0,0 +1,22 @@ +package org.citra.citra_emu.utils; + +import android.content.BroadcastReceiver; +import android.content.Context; +import android.content.Intent; + +import org.citra.citra_emu.utils.DirectoryInitialization.DirectoryInitializationState; + +public class DirectoryStateReceiver extends BroadcastReceiver { + Action1 callback; + + public DirectoryStateReceiver(Action1 callback) { + this.callback = callback; + } + + @Override + public void onReceive(Context context, Intent intent) { + DirectoryInitializationState state = (DirectoryInitializationState) intent + .getSerializableExtra(DirectoryInitialization.EXTRA_STATE); + callback.call(state); + } +} diff --git a/src/android/app/src/main/java/org/citra/citra_emu/utils/EmulationMenuSettings.java b/src/android/app/src/main/java/org/citra/citra_emu/utils/EmulationMenuSettings.java new file mode 100644 index 000000000..9664f8464 --- /dev/null +++ b/src/android/app/src/main/java/org/citra/citra_emu/utils/EmulationMenuSettings.java @@ -0,0 +1,78 @@ +package org.citra.citra_emu.utils; + +import android.content.SharedPreferences; +import android.preference.PreferenceManager; + +import org.citra.citra_emu.CitraApplication; + +public class EmulationMenuSettings { + private static SharedPreferences mPreferences = PreferenceManager.getDefaultSharedPreferences(CitraApplication.getAppContext()); + + // These must match what is defined in src/core/settings.h + public static final int LayoutOption_Default = 0; + public static final int LayoutOption_SingleScreen = 1; + public static final int LayoutOption_LargeScreen = 2; + public static final int LayoutOption_SideScreen = 3; + public static final int LayoutOption_MobilePortrait = 4; + public static final int LayoutOption_MobileLandscape = 5; + + public static boolean getJoystickRelCenter() { + return mPreferences.getBoolean("EmulationMenuSettings_JoystickRelCenter", true); + } + + public static void setJoystickRelCenter(boolean value) { + final SharedPreferences.Editor editor = mPreferences.edit(); + editor.putBoolean("EmulationMenuSettings_JoystickRelCenter", value); + editor.apply(); + } + + public static boolean getDpadSlideEnable() { + return mPreferences.getBoolean("EmulationMenuSettings_DpadSlideEnable", true); + } + + public static void setDpadSlideEnable(boolean value) { + final SharedPreferences.Editor editor = mPreferences.edit(); + editor.putBoolean("EmulationMenuSettings_DpadSlideEnable", value); + editor.apply(); + } + + public static int getLandscapeScreenLayout() { + return mPreferences.getInt("EmulationMenuSettings_LandscapeScreenLayout", LayoutOption_MobileLandscape); + } + + public static void setLandscapeScreenLayout(int value) { + final SharedPreferences.Editor editor = mPreferences.edit(); + editor.putInt("EmulationMenuSettings_LandscapeScreenLayout", value); + editor.apply(); + } + + public static boolean getShowFps() { + return mPreferences.getBoolean("EmulationMenuSettings_ShowFps", false); + } + + public static void setShowFps(boolean value) { + final SharedPreferences.Editor editor = mPreferences.edit(); + editor.putBoolean("EmulationMenuSettings_ShowFps", value); + editor.apply(); + } + + public static boolean getSwapScreens() { + return mPreferences.getBoolean("EmulationMenuSettings_SwapScreens", false); + } + + public static void setSwapScreens(boolean value) { + final SharedPreferences.Editor editor = mPreferences.edit(); + editor.putBoolean("EmulationMenuSettings_SwapScreens", value); + editor.apply(); + } + + public static boolean getShowOverlay() { + return mPreferences.getBoolean("EmulationMenuSettings_ShowOverylay", true); + } + + public static void setShowOverlay(boolean value) { + final SharedPreferences.Editor editor = mPreferences.edit(); + editor.putBoolean("EmulationMenuSettings_ShowOverylay", value); + editor.apply(); + } +} diff --git a/src/android/app/src/main/java/org/citra/citra_emu/utils/FileBrowserHelper.java b/src/android/app/src/main/java/org/citra/citra_emu/utils/FileBrowserHelper.java new file mode 100644 index 000000000..baf691f5c --- /dev/null +++ b/src/android/app/src/main/java/org/citra/citra_emu/utils/FileBrowserHelper.java @@ -0,0 +1,73 @@ +package org.citra.citra_emu.utils; + +import android.content.Intent; +import android.net.Uri; +import android.os.Environment; + +import androidx.annotation.Nullable; +import androidx.fragment.app.FragmentActivity; + +import com.nononsenseapps.filepicker.FilePickerActivity; +import com.nononsenseapps.filepicker.Utils; + +import org.citra.citra_emu.activities.CustomFilePickerActivity; + +import java.io.File; +import java.util.List; + +public final class FileBrowserHelper { + public static void openDirectoryPicker(FragmentActivity activity, int requestCode, int title, List extensions) { + Intent i = new Intent(activity, CustomFilePickerActivity.class); + + i.putExtra(FilePickerActivity.EXTRA_ALLOW_MULTIPLE, false); + i.putExtra(FilePickerActivity.EXTRA_ALLOW_CREATE_DIR, false); + i.putExtra(FilePickerActivity.EXTRA_MODE, FilePickerActivity.MODE_DIR); + i.putExtra(FilePickerActivity.EXTRA_START_PATH, + Environment.getExternalStorageDirectory().getPath()); + i.putExtra(CustomFilePickerActivity.EXTRA_TITLE, title); + i.putExtra(CustomFilePickerActivity.EXTRA_EXTENSIONS, String.join(",", extensions)); + + activity.startActivityForResult(i, requestCode); + } + + public static void openFilePicker(FragmentActivity activity, int requestCode, int title, + List extensions, boolean allowMultiple) { + Intent i = new Intent(activity, CustomFilePickerActivity.class); + + i.putExtra(FilePickerActivity.EXTRA_ALLOW_MULTIPLE, allowMultiple); + i.putExtra(FilePickerActivity.EXTRA_ALLOW_CREATE_DIR, false); + i.putExtra(FilePickerActivity.EXTRA_MODE, FilePickerActivity.MODE_FILE); + i.putExtra(FilePickerActivity.EXTRA_START_PATH, + Environment.getExternalStorageDirectory().getPath()); + i.putExtra(CustomFilePickerActivity.EXTRA_TITLE, title); + i.putExtra(CustomFilePickerActivity.EXTRA_EXTENSIONS, String.join(",", extensions)); + + activity.startActivityForResult(i, requestCode); + } + + @Nullable + public static String getSelectedDirectory(Intent result) { + // Use the provided utility method to parse the result + List files = Utils.getSelectedFilesFromResult(result); + if (!files.isEmpty()) { + File file = Utils.getFileForUri(files.get(0)); + return file.getAbsolutePath(); + } + + return null; + } + + @Nullable + public static String[] getSelectedFiles(Intent result) { + // Use the provided utility method to parse the result + List files = Utils.getSelectedFilesFromResult(result); + if (!files.isEmpty()) { + String[] paths = new String[files.size()]; + for (int i = 0; i < files.size(); i++) + paths[i] = Utils.getFileForUri(files.get(i)).getAbsolutePath(); + return paths; + } + + return null; + } +} diff --git a/src/android/app/src/main/java/org/citra/citra_emu/utils/FileUtil.java b/src/android/app/src/main/java/org/citra/citra_emu/utils/FileUtil.java new file mode 100644 index 000000000..f9025171b --- /dev/null +++ b/src/android/app/src/main/java/org/citra/citra_emu/utils/FileUtil.java @@ -0,0 +1,37 @@ +package org.citra.citra_emu.utils; + +import java.io.File; +import java.io.FileInputStream; +import java.io.IOException; +import java.io.InputStream; + +public class FileUtil { + public static byte[] getBytesFromFile(File file) throws IOException { + final long length = file.length(); + + // You cannot create an array using a long type. + if (length > Integer.MAX_VALUE) { + // File is too large + throw new IOException("File is too large!"); + } + + byte[] bytes = new byte[(int) length]; + + int offset = 0; + int numRead; + + try (InputStream is = new FileInputStream(file)) { + while (offset < bytes.length + && (numRead = is.read(bytes, offset, bytes.length - offset)) >= 0) { + offset += numRead; + } + } + + // Ensure all the bytes have been read in + if (offset < bytes.length) { + throw new IOException("Could not completely read file " + file.getName()); + } + + return bytes; + } +} diff --git a/src/android/app/src/main/java/org/citra/citra_emu/utils/ForegroundService.java b/src/android/app/src/main/java/org/citra/citra_emu/utils/ForegroundService.java new file mode 100644 index 000000000..bc256877b --- /dev/null +++ b/src/android/app/src/main/java/org/citra/citra_emu/utils/ForegroundService.java @@ -0,0 +1,63 @@ +/** + * Copyright 2014 Dolphin Emulator Project + * Licensed under GPLv2+ + * Refer to the license.txt file included. + */ + +package org.citra.citra_emu.utils; + +import android.app.PendingIntent; +import android.app.Service; +import android.content.Intent; +import android.os.IBinder; + +import androidx.core.app.NotificationCompat; +import androidx.core.app.NotificationManagerCompat; + +import org.citra.citra_emu.R; +import org.citra.citra_emu.activities.EmulationActivity; + +/** + * A service that shows a permanent notification in the background to avoid the app getting + * cleared from memory by the system. + */ +public class ForegroundService extends Service { + private static final int EMULATION_RUNNING_NOTIFICATION = 0x1000; + + private void showRunningNotification() { + // Intent is used to resume emulation if the notification is clicked + PendingIntent contentIntent = PendingIntent.getActivity(this, 0, + new Intent(this, EmulationActivity.class), PendingIntent.FLAG_UPDATE_CURRENT); + + NotificationCompat.Builder builder = new NotificationCompat.Builder(this, getString(R.string.app_notification_channel_id)) + .setSmallIcon(R.drawable.ic_stat_notification_logo) + .setContentTitle(getString(R.string.app_name)) + .setContentText(getString(R.string.app_notification_running)) + .setPriority(NotificationCompat.PRIORITY_LOW) + .setOngoing(true) + .setVibrate(null) + .setSound(null) + .setContentIntent(contentIntent); + startForeground(EMULATION_RUNNING_NOTIFICATION, builder.build()); + } + + @Override + public IBinder onBind(Intent intent) { + return null; + } + + @Override + public void onCreate() { + showRunningNotification(); + } + + @Override + public int onStartCommand(Intent intent, int flags, int startId) { + return START_STICKY; + } + + @Override + public void onDestroy() { + NotificationManagerCompat.from(this).cancel(EMULATION_RUNNING_NOTIFICATION); + } +} diff --git a/src/android/app/src/main/java/org/citra/citra_emu/utils/GameIconRequestHandler.java b/src/android/app/src/main/java/org/citra/citra_emu/utils/GameIconRequestHandler.java new file mode 100644 index 000000000..b790c2480 --- /dev/null +++ b/src/android/app/src/main/java/org/citra/citra_emu/utils/GameIconRequestHandler.java @@ -0,0 +1,27 @@ +package org.citra.citra_emu.utils; + +import android.graphics.Bitmap; + +import com.squareup.picasso.Picasso; +import com.squareup.picasso.Request; +import com.squareup.picasso.RequestHandler; + +import org.citra.citra_emu.NativeLibrary; + +import java.nio.IntBuffer; + +public class GameIconRequestHandler extends RequestHandler { + @Override + public boolean canHandleRequest(Request data) { + return "iso".equals(data.uri.getScheme()); + } + + @Override + public Result load(Request request, int networkPolicy) { + String url = request.uri.getHost() + request.uri.getPath(); + int[] vector = NativeLibrary.GetIcon(url); + Bitmap bitmap = Bitmap.createBitmap(48, 48, Bitmap.Config.RGB_565); + bitmap.copyPixelsFromBuffer(IntBuffer.wrap(vector)); + return new Result(bitmap, Picasso.LoadedFrom.DISK); + } +} diff --git a/src/android/app/src/main/java/org/citra/citra_emu/utils/Log.java b/src/android/app/src/main/java/org/citra/citra_emu/utils/Log.java new file mode 100644 index 000000000..070d01eb1 --- /dev/null +++ b/src/android/app/src/main/java/org/citra/citra_emu/utils/Log.java @@ -0,0 +1,39 @@ +package org.citra.citra_emu.utils; + +import org.citra.citra_emu.BuildConfig; + +/** + * Contains methods that call through to {@link android.util.Log}, but + * with the same TAG automatically provided. Also no-ops VERBOSE and DEBUG log + * levels in release builds. + */ +public final class Log { + private static final String TAG = "Citra Frontend"; + + private Log() { + } + + public static void verbose(String message) { + if (BuildConfig.DEBUG) { + android.util.Log.v(TAG, message); + } + } + + public static void debug(String message) { + if (BuildConfig.DEBUG) { + android.util.Log.d(TAG, message); + } + } + + public static void info(String message) { + android.util.Log.i(TAG, message); + } + + public static void warning(String message) { + android.util.Log.w(TAG, message); + } + + public static void error(String message) { + android.util.Log.e(TAG, message); + } +} diff --git a/src/android/app/src/main/java/org/citra/citra_emu/utils/PermissionsHandler.java b/src/android/app/src/main/java/org/citra/citra_emu/utils/PermissionsHandler.java new file mode 100644 index 000000000..a29e23e8d --- /dev/null +++ b/src/android/app/src/main/java/org/citra/citra_emu/utils/PermissionsHandler.java @@ -0,0 +1,35 @@ +package org.citra.citra_emu.utils; + +import android.annotation.TargetApi; +import android.content.Context; +import android.content.pm.PackageManager; +import android.os.Build; + +import androidx.core.content.ContextCompat; +import androidx.fragment.app.FragmentActivity; + +import static android.Manifest.permission.WRITE_EXTERNAL_STORAGE; + +public class PermissionsHandler { + public static final int REQUEST_CODE_WRITE_PERMISSION = 500; + + // We use permissions acceptance as an indicator if this is a first boot for the user. + public static boolean isFirstBoot(final FragmentActivity activity) { + return ContextCompat.checkSelfPermission(activity, WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED; + } + + @TargetApi(Build.VERSION_CODES.M) + public static boolean checkWritePermission(final FragmentActivity activity) { + if (isFirstBoot(activity)) { + activity.requestPermissions(new String[]{WRITE_EXTERNAL_STORAGE}, + REQUEST_CODE_WRITE_PERMISSION); + return false; + } + + return true; + } + + public static boolean hasWriteAccess(Context context) { + return ContextCompat.checkSelfPermission(context, WRITE_EXTERNAL_STORAGE) == PackageManager.PERMISSION_GRANTED; + } +} diff --git a/src/android/app/src/main/java/org/citra/citra_emu/utils/PicassoRoundedCornersTransformation.java b/src/android/app/src/main/java/org/citra/citra_emu/utils/PicassoRoundedCornersTransformation.java new file mode 100644 index 000000000..892b46387 --- /dev/null +++ b/src/android/app/src/main/java/org/citra/citra_emu/utils/PicassoRoundedCornersTransformation.java @@ -0,0 +1,45 @@ +package org.citra.citra_emu.utils; + +import android.graphics.Bitmap; +import android.graphics.BitmapShader; +import android.graphics.Canvas; +import android.graphics.Paint; +import android.graphics.Rect; +import android.graphics.RectF; + +import com.squareup.picasso.Transformation; + +public class PicassoRoundedCornersTransformation implements Transformation { + @Override + public Bitmap transform(Bitmap icon) { + final int width = icon.getWidth(); + final int height = icon.getHeight(); + final Rect rect = new Rect(0, 0, width, height); + final int size = Math.min(width, height); + final int x = (width - size) / 2; + final int y = (height - size) / 2; + + Bitmap squaredBitmap = Bitmap.createBitmap(icon, x, y, size, size); + if (squaredBitmap != icon) { + icon.recycle(); + } + + Bitmap output = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888); + Canvas canvas = new Canvas(output); + BitmapShader shader = new BitmapShader(squaredBitmap, BitmapShader.TileMode.CLAMP, BitmapShader.TileMode.CLAMP); + Paint paint = new Paint(); + paint.setAntiAlias(true); + paint.setShader(shader); + + canvas.drawRoundRect(new RectF(rect), 10, 10, paint); + + squaredBitmap.recycle(); + + return output; + } + + @Override + public String key() { + return "circle"; + } +} \ No newline at end of file diff --git a/src/android/app/src/main/java/org/citra/citra_emu/utils/PicassoUtils.java b/src/android/app/src/main/java/org/citra/citra_emu/utils/PicassoUtils.java new file mode 100644 index 000000000..c99726685 --- /dev/null +++ b/src/android/app/src/main/java/org/citra/citra_emu/utils/PicassoUtils.java @@ -0,0 +1,57 @@ +package org.citra.citra_emu.utils; + +import android.graphics.Bitmap; +import android.net.Uri; +import android.widget.ImageView; + +import com.squareup.picasso.Picasso; + +import org.citra.citra_emu.CitraApplication; +import org.citra.citra_emu.R; + +import java.io.IOException; + +import androidx.annotation.Nullable; + +public class PicassoUtils { + private static boolean mPicassoInitialized = false; + + public static void init() { + if (mPicassoInitialized) { + return; + } + Picasso picassoInstance = new Picasso.Builder(CitraApplication.getAppContext()) + .addRequestHandler(new GameIconRequestHandler()) + .build(); + + Picasso.setSingletonInstance(picassoInstance); + mPicassoInitialized = true; + } + + public static void loadGameIcon(ImageView imageView, String gamePath) { + Picasso + .get() + .load(Uri.parse("iso:/" + gamePath)) + .fit() + .centerInside() + .config(Bitmap.Config.RGB_565) + .error(R.drawable.no_icon) + .transform(new PicassoRoundedCornersTransformation()) + .into(imageView); + } + + // Blocking call. Load image from file and crop/resize it to fit in width x height. + @Nullable + public static Bitmap LoadBitmapFromFile(String uri, int width, int height) { + try { + return Picasso.get() + .load(Uri.parse(uri)) + .config(Bitmap.Config.ARGB_8888) + .centerCrop() + .resize(width, height) + .get(); + } catch (IOException e) { + return null; + } + } +} diff --git a/src/android/app/src/main/java/org/citra/citra_emu/utils/StartupHandler.java b/src/android/app/src/main/java/org/citra/citra_emu/utils/StartupHandler.java new file mode 100644 index 000000000..9112bf90c --- /dev/null +++ b/src/android/app/src/main/java/org/citra/citra_emu/utils/StartupHandler.java @@ -0,0 +1,45 @@ +package org.citra.citra_emu.utils; + +import android.content.Intent; +import android.os.Bundle; +import android.text.TextUtils; + +import androidx.appcompat.app.AlertDialog; +import androidx.fragment.app.FragmentActivity; + +import org.citra.citra_emu.R; +import org.citra.citra_emu.activities.EmulationActivity; + +public final class StartupHandler { + private static void handlePermissionsCheck(FragmentActivity parent) { + // Ask the user to grant write permission if it's not already granted + PermissionsHandler.checkWritePermission(parent); + + String start_file = ""; + Bundle extras = parent.getIntent().getExtras(); + if (extras != null) { + start_file = extras.getString("AutoStartFile"); + } + + if (!TextUtils.isEmpty(start_file)) { + // Start the emulation activity, send the ISO passed in and finish the main activity + Intent emulation_intent = new Intent(parent, EmulationActivity.class); + emulation_intent.putExtra("SelectedGame", start_file); + parent.startActivity(emulation_intent); + parent.finish(); + } + } + + public static void HandleInit(FragmentActivity parent) { + if (PermissionsHandler.isFirstBoot(parent)) { + // Prompt user with standard first boot disclaimer + new AlertDialog.Builder(parent) + .setTitle(R.string.app_name) + .setIcon(R.mipmap.ic_launcher) + .setMessage(parent.getResources().getString(R.string.app_disclaimer)) + .setPositiveButton(android.R.string.ok, null) + .setOnDismissListener(dialogInterface -> handlePermissionsCheck(parent)) + .show(); + } + } +} diff --git a/src/android/app/src/main/java/org/citra/citra_emu/utils/ThemeUtil.java b/src/android/app/src/main/java/org/citra/citra_emu/utils/ThemeUtil.java new file mode 100644 index 000000000..74ef3867f --- /dev/null +++ b/src/android/app/src/main/java/org/citra/citra_emu/utils/ThemeUtil.java @@ -0,0 +1,34 @@ +package org.citra.citra_emu.utils; + +import android.content.SharedPreferences; +import android.os.Build; +import android.preference.PreferenceManager; + +import androidx.appcompat.app.AppCompatDelegate; + +import org.citra.citra_emu.CitraApplication; +import org.citra.citra_emu.features.settings.utils.SettingsFile; + +public class ThemeUtil { + private static SharedPreferences mPreferences = PreferenceManager.getDefaultSharedPreferences(CitraApplication.getAppContext()); + + private static void applyTheme(int designValue) { + switch (designValue) { + case 0: + AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_NO); + break; + case 1: + AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_YES); + break; + case 2: + AppCompatDelegate.setDefaultNightMode(android.os.Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q ? + AppCompatDelegate.MODE_NIGHT_FOLLOW_SYSTEM : + AppCompatDelegate.MODE_NIGHT_AUTO_BATTERY); + break; + } + } + + public static void applyTheme() { + applyTheme(mPreferences.getInt(SettingsFile.KEY_DESIGN, 0)); + } +} diff --git a/src/android/app/src/main/java/org/citra/citra_emu/viewholders/GameViewHolder.java b/src/android/app/src/main/java/org/citra/citra_emu/viewholders/GameViewHolder.java new file mode 100644 index 000000000..50dbcbe18 --- /dev/null +++ b/src/android/app/src/main/java/org/citra/citra_emu/viewholders/GameViewHolder.java @@ -0,0 +1,46 @@ +package org.citra.citra_emu.viewholders; + +import android.view.View; +import android.widget.ImageView; +import android.widget.TextView; + +import androidx.recyclerview.widget.RecyclerView; + +import org.citra.citra_emu.R; + +/** + * A simple class that stores references to views so that the GameAdapter doesn't need to + * keep calling findViewById(), which is expensive. + */ +public class GameViewHolder extends RecyclerView.ViewHolder { + private View itemView; + public ImageView imageIcon; + public TextView textGameTitle; + public TextView textCompany; + public TextView textFileName; + + public String gameId; + + // TODO Not need any of this stuff. Currently only the properties dialog needs it. + public String path; + public String title; + public String description; + public String regions; + public String company; + + public GameViewHolder(View itemView) { + super(itemView); + + this.itemView = itemView; + itemView.setTag(this); + + imageIcon = itemView.findViewById(R.id.image_game_screen); + textGameTitle = itemView.findViewById(R.id.text_game_title); + textCompany = itemView.findViewById(R.id.text_company); + textFileName = itemView.findViewById(R.id.text_filename); + } + + public View getItemView() { + return itemView; + } +} diff --git a/src/android/app/src/main/java/org/citra_emu/citra/CitraApplication.java b/src/android/app/src/main/java/org/citra_emu/citra/CitraApplication.java deleted file mode 100644 index 10cb52783..000000000 --- a/src/android/app/src/main/java/org/citra_emu/citra/CitraApplication.java +++ /dev/null @@ -1,13 +0,0 @@ -// Copyright 2018 Citra Emulator Project -// Licensed under GPLv2 or any later version -// Refer to the license.txt file included. - -package org.citra_emu.citra; - -import android.app.Application; - -public class CitraApplication extends Application { - static { - System.loadLibrary("citra-android"); - } -} diff --git a/src/android/app/src/main/java/org/citra_emu/citra/LOG.java b/src/android/app/src/main/java/org/citra_emu/citra/LOG.java deleted file mode 100644 index c52f30b68..000000000 --- a/src/android/app/src/main/java/org/citra_emu/citra/LOG.java +++ /dev/null @@ -1,41 +0,0 @@ -package org.citra_emu.citra; - -public class LOG { - - private interface LOG_LEVEL { - int TRACE = 0, DEBUG = 1, INFO = 2, WARNING = 3, ERROR = 4, CRITICAL = 5; - } - - public static void TRACE(String msg, Object... args) { - LOG(LOG_LEVEL.TRACE, msg, args); - } - - public static void DEBUG(String msg, Object... args) { - LOG(LOG_LEVEL.DEBUG, msg, args); - } - - public static void INFO(String msg, Object... args) { - LOG(LOG_LEVEL.INFO, msg, args); - } - - public static void WARNING(String msg, Object... args) { - LOG(LOG_LEVEL.WARNING, msg, args); - } - - public static void ERROR(String msg, Object... args) { - LOG(LOG_LEVEL.ERROR, msg, args); - } - - public static void CRITICAL(String msg, Object... args) { - LOG(LOG_LEVEL.CRITICAL, msg, args); - } - - private static void LOG(int level, String msg, Object... args) { - StackTraceElement trace = Thread.currentThread().getStackTrace()[4]; - logEntry(level, trace.getFileName(), trace.getLineNumber(), trace.getMethodName(), - String.format(msg, args)); - } - - private static native void logEntry(int level, String file_name, int line_number, - String function, String message); -} diff --git a/src/android/app/src/main/java/org/citra_emu/citra/ui/main/MainActivity.java b/src/android/app/src/main/java/org/citra_emu/citra/ui/main/MainActivity.java deleted file mode 100644 index 5b4f3d3bc..000000000 --- a/src/android/app/src/main/java/org/citra_emu/citra/ui/main/MainActivity.java +++ /dev/null @@ -1,58 +0,0 @@ -// Copyright 2018 Citra Emulator Project -// Licensed under GPLv2 or any later version -// Refer to the license.txt file included. - -package org.citra_emu.citra.ui.main; - -import android.Manifest; -import android.content.pm.PackageManager; -import android.os.Bundle; -import android.support.annotation.NonNull; -import android.support.v7.app.AlertDialog; -import android.support.v7.app.AppCompatActivity; - -import org.citra_emu.citra.R; -import org.citra_emu.citra.utils.FileUtil; -import org.citra_emu.citra.utils.PermissionUtil; - -public final class MainActivity extends AppCompatActivity { - - // Java enums suck - private interface PermissionCodes { int INITIALIZE = 0; } - - @Override - protected void onCreate(Bundle savedInstanceState) { - super.onCreate(savedInstanceState); - setContentView(R.layout.activity_main); - - PermissionUtil.verifyPermission(this, Manifest.permission.WRITE_EXTERNAL_STORAGE, - PermissionCodes.INITIALIZE); - } - - @Override - public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, - @NonNull int[] grantResults) { - switch (requestCode) { - case PermissionCodes.INITIALIZE: - if (grantResults[0] == PackageManager.PERMISSION_GRANTED) { - initUserPath(FileUtil.getUserPath().toString()); - initLogging(); - } else { - AlertDialog.Builder dialog = - new AlertDialog.Builder(this) - .setTitle("Permission Error") - .setMessage("Citra requires storage permissions to function.") - .setCancelable(false) - .setPositiveButton("OK", (dialogInterface, which) -> { - PermissionUtil.verifyPermission( - MainActivity.this, Manifest.permission.WRITE_EXTERNAL_STORAGE, - PermissionCodes.INITIALIZE); - }); - dialog.show(); - } - } - } - - private static native void initUserPath(String path); - private static native void initLogging(); -} diff --git a/src/android/app/src/main/java/org/citra_emu/citra/utils/FileUtil.java b/src/android/app/src/main/java/org/citra_emu/citra/utils/FileUtil.java deleted file mode 100644 index 5346c5352..000000000 --- a/src/android/app/src/main/java/org/citra_emu/citra/utils/FileUtil.java +++ /dev/null @@ -1,19 +0,0 @@ -// Copyright 2019 Citra Emulator Project -// Licensed under GPLv2 or any later version -// Refer to the license.txt file included. - -package org.citra_emu.citra.utils; - -import android.os.Environment; - -import java.io.File; - -public class FileUtil { - public static File getUserPath() { - File storage = Environment.getExternalStorageDirectory(); - File userPath = new File(storage, "citra"); - if (!userPath.isDirectory()) - userPath.mkdir(); - return userPath; - } -} diff --git a/src/android/app/src/main/java/org/citra_emu/citra/utils/PermissionUtil.java b/src/android/app/src/main/java/org/citra_emu/citra/utils/PermissionUtil.java deleted file mode 100644 index 33c8129e5..000000000 --- a/src/android/app/src/main/java/org/citra_emu/citra/utils/PermissionUtil.java +++ /dev/null @@ -1,32 +0,0 @@ -// Copyright 2019 Citra Emulator Project -// Licensed under GPLv2 or any later version -// Refer to the license.txt file included. - -package org.citra_emu.citra.utils; - -import android.app.Activity; -import android.content.pm.PackageManager; -import android.support.v4.app.ActivityCompat; -import android.support.v4.content.ContextCompat; - -public class PermissionUtil { - - /** - * Checks a permission, if needed shows a dialog to request it - * - * @param activity the activity requiring the permission - * @param permission the permission needed - * @param requestCode supplied to the callback to determine the next action - */ - public static void verifyPermission(Activity activity, String permission, int requestCode) { - if (ContextCompat.checkSelfPermission(activity, permission) == - PackageManager.PERMISSION_GRANTED) { - // call the callback called by requestPermissions - activity.onRequestPermissionsResult(requestCode, new String[] {permission}, - new int[] {PackageManager.PERMISSION_GRANTED}); - return; - } - - ActivityCompat.requestPermissions(activity, new String[] {permission}, requestCode); - } -} diff --git a/src/android/app/src/main/jni/CMakeLists.txt b/src/android/app/src/main/jni/CMakeLists.txt new file mode 100644 index 000000000..3fd3a3eab --- /dev/null +++ b/src/android/app/src/main/jni/CMakeLists.txt @@ -0,0 +1,34 @@ +add_library(main SHARED + applets/mii_selector.cpp + applets/mii_selector.h + applets/swkbd.cpp + applets/swkbd.h + input_manager.cpp + input_manager.h + camera/ndk_camera.cpp + camera/ndk_camera.h + camera/still_image_camera.cpp + camera/still_image_camera.h + config.cpp + config.h + default_ini.h + emu_window/emu_window.cpp + emu_window/emu_window.h + game_info.cpp + game_info.h + game_settings.cpp + game_settings.h + id_cache.cpp + id_cache.h + mic.cpp + mic.h + native.cpp + native.h + ndk_motion.cpp + ndk_motion.h +) + +target_link_libraries(main PRIVATE audio_core common core input_common network) +target_link_libraries(main PRIVATE android camera2ndk mediandk jnigraphics EGL glad inih log yuv) + +set(CPACK_PACKAGE_EXECUTABLES ${CPACK_PACKAGE_EXECUTABLES} main) diff --git a/src/android/app/src/main/jni/applets/mii_selector.cpp b/src/android/app/src/main/jni/applets/mii_selector.cpp new file mode 100644 index 000000000..0e8e79238 --- /dev/null +++ b/src/android/app/src/main/jni/applets/mii_selector.cpp @@ -0,0 +1,87 @@ +// Copyright 2020 Citra Emulator Project +// Licensed under GPLv2 or any later version +// Refer to the license.txt file included. + +#include "common/string_util.h" +#include "jni/applets/mii_selector.h" +#include "jni/id_cache.h" + +static jclass s_mii_selector_class; +static jclass s_mii_selector_config_class; +static jclass s_mii_selector_data_class; +static jmethodID s_mii_selector_execute; + +namespace MiiSelector { + +AndroidMiiSelector::~AndroidMiiSelector() = default; + +void AndroidMiiSelector::Setup(const Frontend::MiiSelectorConfig& config) { + JNIEnv* env = IDCache::GetEnvForThread(); + auto miis = Frontend::LoadMiis(); + + // Create the Java MiiSelectorConfig object + jobject java_config = env->AllocObject(s_mii_selector_config_class); + env->SetBooleanField(java_config, + env->GetFieldID(s_mii_selector_config_class, "enable_cancel_button", "Z"), + static_cast(config.enable_cancel_button)); + env->SetObjectField(java_config, + env->GetFieldID(s_mii_selector_config_class, "title", "Ljava/lang/String;"), + env->NewStringUTF(config.title.c_str())); + env->SetLongField( + java_config, + env->GetFieldID(s_mii_selector_config_class, "initially_selected_mii_index", "J"), + static_cast(config.initially_selected_mii_index)); + + // List mii names + // The 'Standard Mii' is not included here as we need Java side to translate it + const jclass string_class = reinterpret_cast(env->FindClass("java/lang/String")); + const jobjectArray array = + env->NewObjectArray(static_cast(miis.size()), string_class, nullptr); + for (std::size_t i = 0; i < miis.size(); ++i) { + const auto name = Common::UTF16BufferToUTF8(miis[i].mii_name); + env->SetObjectArrayElement(array, static_cast(i), env->NewStringUTF(name.c_str())); + } + env->SetObjectField( + java_config, + env->GetFieldID(s_mii_selector_config_class, "mii_names", "[Ljava/lang/String;"), array); + + // Invoke backend Execute method + jobject data = + env->CallStaticObjectMethod(s_mii_selector_class, s_mii_selector_execute, java_config); + + const u32 return_code = static_cast( + env->GetLongField(data, env->GetFieldID(s_mii_selector_data_class, "return_code", "J"))); + if (return_code == 1) { + Finalize(return_code, HLE::Applets::MiiData{}); + return; + } + + const int index = static_cast( + env->GetIntField(data, env->GetFieldID(s_mii_selector_data_class, "index", "I"))); + ASSERT_MSG(index >= 0 && index <= miis.size(), "Index returned is out of bound"); + Finalize(return_code, index == 0 + ? HLE::Applets::MiiSelector::GetStandardMiiResult().selected_mii_data + : miis.at(static_cast(index - 1))); +} + +void InitJNI(JNIEnv* env) { + s_mii_selector_class = reinterpret_cast( + env->NewGlobalRef(env->FindClass("org/citra/citra_emu/applets/MiiSelector"))); + s_mii_selector_config_class = reinterpret_cast(env->NewGlobalRef( + env->FindClass("org/citra/citra_emu/applets/MiiSelector$MiiSelectorConfig"))); + s_mii_selector_data_class = reinterpret_cast(env->NewGlobalRef( + env->FindClass("org/citra/citra_emu/applets/MiiSelector$MiiSelectorData"))); + + s_mii_selector_execute = + env->GetStaticMethodID(s_mii_selector_class, "Execute", + "(Lorg/citra/citra_emu/applets/MiiSelector$MiiSelectorConfig;)Lorg/" + "citra/citra_emu/applets/MiiSelector$MiiSelectorData;"); +} + +void CleanupJNI(JNIEnv* env) { + env->DeleteGlobalRef(s_mii_selector_class); + env->DeleteGlobalRef(s_mii_selector_config_class); + env->DeleteGlobalRef(s_mii_selector_data_class); +} + +} // namespace MiiSelector diff --git a/src/android/app/src/main/jni/applets/mii_selector.h b/src/android/app/src/main/jni/applets/mii_selector.h new file mode 100644 index 000000000..f33d1cb8d --- /dev/null +++ b/src/android/app/src/main/jni/applets/mii_selector.h @@ -0,0 +1,25 @@ +// Copyright 2020 Citra Emulator Project +// Licensed under GPLv2 or any later version +// Refer to the license.txt file included. + +#pragma once + +#include +#include "core/frontend/applets/mii_selector.h" + +namespace MiiSelector { + +class AndroidMiiSelector final : public Frontend::MiiSelector { +public: + ~AndroidMiiSelector(); + + void Setup(const Frontend::MiiSelectorConfig& config) override; +}; + +// Should be called in JNI_Load +void InitJNI(JNIEnv* env); + +// Should be called in JNI_Unload +void CleanupJNI(JNIEnv* env); + +} // namespace MiiSelector diff --git a/src/android/app/src/main/jni/applets/swkbd.cpp b/src/android/app/src/main/jni/applets/swkbd.cpp new file mode 100644 index 000000000..062d307a6 --- /dev/null +++ b/src/android/app/src/main/jni/applets/swkbd.cpp @@ -0,0 +1,151 @@ +// Copyright 2020 Citra Emulator Project +// Licensed under GPLv2 or any later version +// Refer to the license.txt file included. + +#include +#include +#include "core/core.h" +#include "jni/applets/swkbd.h" +#include "jni/id_cache.h" + +static std::string GetJString(JNIEnv* env, jstring jstr) { + if (!jstr) { + return {}; + } + + const char* s = env->GetStringUTFChars(jstr, nullptr); + std::string result = s; + env->ReleaseStringUTFChars(jstr, s); + return result; +} + +static jclass s_software_keyboard_class; +static jclass s_keyboard_config_class; +static jclass s_keyboard_data_class; +static jclass s_validation_error_class; +static jmethodID s_swkbd_execute; +static jmethodID s_swkbd_show_error; + +namespace SoftwareKeyboard { + +static jobject ToJavaKeyboardConfig(const Frontend::KeyboardConfig& config) { + JNIEnv* env = IDCache::GetEnvForThread(); + jobject object = env->AllocObject(s_keyboard_config_class); + env->SetIntField(object, env->GetFieldID(s_keyboard_config_class, "button_config", "I"), + static_cast(config.button_config)); + env->SetIntField(object, env->GetFieldID(s_keyboard_config_class, "max_text_length", "I"), + static_cast(config.max_text_length)); + env->SetBooleanField(object, env->GetFieldID(s_keyboard_config_class, "multiline_mode", "Z"), + static_cast(config.multiline_mode)); + env->SetObjectField(object, + env->GetFieldID(s_keyboard_config_class, "hint_text", "Ljava/lang/String;"), + env->NewStringUTF(config.hint_text.c_str())); + + const jclass string_class = reinterpret_cast(env->FindClass("java/lang/String")); + const jobjectArray array = + env->NewObjectArray(static_cast(config.button_text.size()), string_class, + env->NewStringUTF(config.button_text[0].c_str())); + for (std::size_t i = 1; i < config.button_text.size(); ++i) { + env->SetObjectArrayElement(array, static_cast(i), + env->NewStringUTF(config.button_text[i].c_str())); + } + env->SetObjectField( + object, env->GetFieldID(s_keyboard_config_class, "button_text", "[Ljava/lang/String;"), + array); + + return object; +} + +static Frontend::KeyboardData ToFrontendKeyboardData(jobject object) { + JNIEnv* env = IDCache::GetEnvForThread(); + const jstring string = reinterpret_cast(env->GetObjectField( + object, env->GetFieldID(s_keyboard_data_class, "text", "Ljava/lang/String;"))); + return Frontend::KeyboardData{ + GetJString(env, string), + static_cast( + env->GetIntField(object, env->GetFieldID(s_keyboard_data_class, "button", "I")))}; +} + +AndroidKeyboard::~AndroidKeyboard() = default; + +void AndroidKeyboard::Execute(const Frontend::KeyboardConfig& config) { + SoftwareKeyboard::Execute(config); + + const auto data = ToFrontendKeyboardData(IDCache::GetEnvForThread()->CallStaticObjectMethod( + s_software_keyboard_class, s_swkbd_execute, ToJavaKeyboardConfig(config))); + Finalize(data.text, data.button); +} + +void AndroidKeyboard::ShowError(const std::string& error) { + JNIEnv* env = IDCache::GetEnvForThread(); + env->CallStaticVoidMethod(s_software_keyboard_class, s_swkbd_show_error, + env->NewStringUTF(error.c_str())); +} + +void InitJNI(JNIEnv* env) { + s_software_keyboard_class = reinterpret_cast( + env->NewGlobalRef(env->FindClass("org/citra/citra_emu/applets/SoftwareKeyboard"))); + s_keyboard_config_class = reinterpret_cast(env->NewGlobalRef( + env->FindClass("org/citra/citra_emu/applets/SoftwareKeyboard$KeyboardConfig"))); + s_keyboard_data_class = reinterpret_cast(env->NewGlobalRef( + env->FindClass("org/citra/citra_emu/applets/SoftwareKeyboard$KeyboardData"))); + s_validation_error_class = reinterpret_cast(env->NewGlobalRef( + env->FindClass("org/citra/citra_emu/applets/SoftwareKeyboard$ValidationError"))); + + s_swkbd_execute = env->GetStaticMethodID( + s_software_keyboard_class, "Execute", + "(Lorg/citra/citra_emu/applets/SoftwareKeyboard$KeyboardConfig;)Lorg/citra/citra_emu/" + "applets/SoftwareKeyboard$KeyboardData;"); + s_swkbd_show_error = + env->GetStaticMethodID(s_software_keyboard_class, "ShowError", "(Ljava/lang/String;)V"); +} + +void CleanupJNI(JNIEnv* env) { + env->DeleteGlobalRef(s_software_keyboard_class); + env->DeleteGlobalRef(s_keyboard_config_class); + env->DeleteGlobalRef(s_keyboard_data_class); + env->DeleteGlobalRef(s_validation_error_class); +} + +} // namespace SoftwareKeyboard + +jobject ToJavaValidationError(Frontend::ValidationError error) { + static const std::map ValidationErrorNameMap{{ + {Frontend::ValidationError::None, "None"}, + {Frontend::ValidationError::ButtonOutOfRange, "ButtonOutOfRange"}, + {Frontend::ValidationError::MaxDigitsExceeded, "MaxDigitsExceeded"}, + {Frontend::ValidationError::AtSignNotAllowed, "AtSignNotAllowed"}, + {Frontend::ValidationError::PercentNotAllowed, "PercentNotAllowed"}, + {Frontend::ValidationError::BackslashNotAllowed, "BackslashNotAllowed"}, + {Frontend::ValidationError::ProfanityNotAllowed, "ProfanityNotAllowed"}, + {Frontend::ValidationError::CallbackFailed, "CallbackFailed"}, + {Frontend::ValidationError::FixedLengthRequired, "FixedLengthRequired"}, + {Frontend::ValidationError::MaxLengthExceeded, "MaxLengthExceeded"}, + {Frontend::ValidationError::BlankInputNotAllowed, "BlankInputNotAllowed"}, + {Frontend::ValidationError::EmptyInputNotAllowed, "EmptyInputNotAllowed"}, + }}; + ASSERT(ValidationErrorNameMap.count(error)); + + JNIEnv* env = IDCache::GetEnvForThread(); + return env->GetStaticObjectField( + s_validation_error_class, + env->GetStaticFieldID(s_validation_error_class, ValidationErrorNameMap.at(error), + "Lorg/citra/citra_emu/applets/SoftwareKeyboard$ValidationError;")); +} + +jobject Java_org_citra_citra_1emu_applets_SoftwareKeyboard_ValidateFilters(JNIEnv* env, + jclass clazz, + jstring text) { + + const auto ret = + Core::System::GetInstance().GetSoftwareKeyboard()->ValidateFilters(GetJString(env, text)); + return ToJavaValidationError(ret); +} + +jobject Java_org_citra_citra_1emu_applets_SoftwareKeyboard_ValidateInput(JNIEnv* env, jclass clazz, + jstring text) { + + const auto ret = + Core::System::GetInstance().GetSoftwareKeyboard()->ValidateInput(GetJString(env, text)); + return ToJavaValidationError(ret); +} diff --git a/src/android/app/src/main/jni/applets/swkbd.h b/src/android/app/src/main/jni/applets/swkbd.h new file mode 100644 index 000000000..664626695 --- /dev/null +++ b/src/android/app/src/main/jni/applets/swkbd.h @@ -0,0 +1,35 @@ +// Copyright 2020 Citra Emulator Project +// Licensed under GPLv2 or any later version +// Refer to the license.txt file included. + +#pragma once + +#include +#include "core/frontend/applets/swkbd.h" + +namespace SoftwareKeyboard { + +class AndroidKeyboard final : public Frontend::SoftwareKeyboard { +public: + ~AndroidKeyboard(); + + void Execute(const Frontend::KeyboardConfig& config) override; + void ShowError(const std::string& error) override; +}; + +// Should be called in JNI_Load +void InitJNI(JNIEnv* env); + +// Should be called in JNI_Unload +void CleanupJNI(JNIEnv* env); + +} // namespace SoftwareKeyboard + +// Native function calls +extern "C" { +JNIEXPORT jobject JNICALL Java_org_citra_citra_1emu_applets_SoftwareKeyboard_ValidateFilters( + JNIEnv* env, jclass clazz, jstring text); + +JNIEXPORT jobject JNICALL Java_org_citra_citra_1emu_applets_SoftwareKeyboard_ValidateInput( + JNIEnv* env, jclass clazz, jstring text); +} diff --git a/src/android/app/src/main/jni/camera/ndk_camera.cpp b/src/android/app/src/main/jni/camera/ndk_camera.cpp new file mode 100644 index 000000000..bf8ad18c8 --- /dev/null +++ b/src/android/app/src/main/jni/camera/ndk_camera.cpp @@ -0,0 +1,528 @@ +// Copyright 2020 Citra Emulator Project +// Licensed under GPLv2 or any later version +// Refer to the license.txt file included. + +#include +#include +#include +#include +#include +#include +#include +#include +#include "common/scope_exit.h" +#include "common/thread.h" +#include "core/frontend/camera/blank_camera.h" +#include "jni/camera/ndk_camera.h" +#include "jni/camera/still_image_camera.h" +#include "jni/id_cache.h" + +namespace Camera::NDK { + +/** + * Implementation detail of NDK camera interface, holding a ton of different structs. + * As long as the object lives, the camera is opened and capturing image. To turn off the camera, + * one needs to destruct the object. + * The pixel format is 'Android 420' which can contain a variety of YUV420 formats. The exact + * format used can be determined by examing the 'pixel stride'. + */ +struct CaptureSession final { + explicit CaptureSession(ACameraManager* manager, const std::string& id) { + Load(manager, id); + } + + void Load(ACameraManager* manager, const std::string& id); + + std::pair selected_resolution{}; + + ACameraDevice_StateCallbacks device_callbacks{}; + AImageReader_ImageListener listener{}; + ACameraCaptureSession_stateCallbacks session_callbacks{}; + std::array requests{}; + +#define MEMBER(type, name, func) \ + struct type##Deleter { \ + void operator()(type* ptr) { \ + type##_##func(ptr); \ + } \ + }; \ + std::unique_ptr name + + MEMBER(ACameraDevice, device, close); + MEMBER(AImageReader, image_reader, delete); + MEMBER(ANativeWindow, native_window, release); + + MEMBER(ACaptureSessionOutputContainer, outputs, free); + MEMBER(ACaptureSessionOutput, output, free); + MEMBER(ACameraOutputTarget, target, free); + MEMBER(ACaptureRequest, request, free); + + // Put session last to close the session before we destruct everything else + MEMBER(ACameraCaptureSession, session, close); +#undef MEMBER + + bool ready = false; + + std::mutex data_mutex; + + // Clang does not yet have shared_ptr to arrays support. Managed data are actually arrays. + std::array, 3> data{}; // I420 format, planes are Y, U, V. + std::array row_stride{}; // Row stride for the planes. + int pixel_stride{}; // Pixel stride for the UV planes. + Common::Event active_event; // Signals that the session has become ready + + int sensor_orientation{}; // Sensor Orientation + bool facing_front{}; // Whether this camera faces front. Used for handling device rotation. + + std::mutex status_mutex; + bool disconnected{}; // Whether this device has been closed and should be reopened + bool reload_requested{}; +}; + +void OnDisconnected(void* context, ACameraDevice* device) { + LOG_WARNING(Service_CAM, "Camera device disconnected"); + + CaptureSession* that = reinterpret_cast(context); + { + std::lock_guard lock{that->status_mutex}; + that->disconnected = true; + } +} + +static void OnError(void* context, ACameraDevice* device, int error) { + LOG_ERROR(Service_CAM, "Camera device error {}", error); +} + +#define MEDIA_CALL(func) \ + { \ + auto ret = func; \ + if (ret != AMEDIA_OK) { \ + LOG_ERROR(Service_CAM, "Call " #func " returned error {}", ret); \ + return; \ + } \ + } + +#define CAMERA_CALL(func) \ + { \ + auto ret = func; \ + if (ret != ACAMERA_OK) { \ + LOG_ERROR(Service_CAM, "Call " #func " returned error {}", ret); \ + return; \ + } \ + } + +void ImageCallback(void* context, AImageReader* reader) { + AImage* image{}; + MEDIA_CALL(AImageReader_acquireLatestImage(reader, &image)); + SCOPE_EXIT({ AImage_delete(image); }); + + std::array, 3> data; + std::array row_stride; + for (const int plane : {0, 1, 2}) { + u8* ptr; + int size; + MEDIA_CALL(AImage_getPlaneData(image, plane, &ptr, &size)); + data[plane].reset(new u8[size], std::default_delete()); + std::memcpy(data[plane].get(), ptr, static_cast(size)); + + MEDIA_CALL(AImage_getPlaneRowStride(image, plane, &row_stride[plane])); + } + + CaptureSession* that = reinterpret_cast(context); + { + std::lock_guard lock{that->data_mutex}; + that->data = data; + that->row_stride = row_stride; + MEDIA_CALL(AImage_getPlanePixelStride(image, 1, &that->pixel_stride)); + } + { + std::lock_guard lock{that->status_mutex}; + if (!that->ready) { + that->active_event.Set(); // Mark the session as active + } + } +} + +#define CREATE(type, name, statement) \ + { \ + type* raw; \ + statement; \ + name.reset(raw); \ + } + +// We have to define these no-op callbacks +static void OnClosed(void* context, ACameraCaptureSession* session) {} +static void OnReady(void* context, ACameraCaptureSession* session) {} +static void OnActive(void* context, ACameraCaptureSession* session) {} + +void CaptureSession::Load(ACameraManager* manager, const std::string& id) { + { + std::lock_guard lock{status_mutex}; + ready = disconnected = reload_requested = false; + } + + device_callbacks = { + /*context*/ this, + /*onDisconnected*/ &OnDisconnected, + /*onError*/ &OnError, + }; + + CREATE(ACameraDevice, device, + CAMERA_CALL(ACameraManager_openCamera(manager, id.c_str(), &device_callbacks, &raw))); + + ACameraMetadata* metadata; + CAMERA_CALL(ACameraManager_getCameraCharacteristics(manager, id.c_str(), &metadata)); + + ACameraMetadata_const_entry entry; + CAMERA_CALL(ACameraMetadata_getConstEntry( + metadata, ACAMERA_SCALER_AVAILABLE_STREAM_CONFIGURATIONS, &entry)); + + // We select the minimum resolution larger than 640x640 if any, or the maximum resolution. + selected_resolution = {}; + for (std::size_t i = 0; i < entry.count; i += 4) { + // (format, width, height, input?) + if (entry.data.i32[i + 3] & ACAMERA_SCALER_AVAILABLE_STREAM_CONFIGURATIONS_INPUT) { + // This is an input stream + continue; + } + + int format = entry.data.i32[i + 0]; + if (format == AIMAGE_FORMAT_YUV_420_888) { + int width = entry.data.i32[i + 1]; + int height = entry.data.i32[i + 2]; + if (selected_resolution.first <= 640 || selected_resolution.second <= 640) { + // Selected resolution is not large enough + selected_resolution = std::max(selected_resolution, std::make_pair(width, height)); + } else if (width >= 640 && height >= 640) { + // Selected resolution and this one are both large enough + selected_resolution = std::min(selected_resolution, std::make_pair(width, height)); + } + } + } + + CAMERA_CALL(ACameraMetadata_getConstEntry(metadata, ACAMERA_SENSOR_ORIENTATION, &entry)); + sensor_orientation = entry.data.i32[0]; + + CAMERA_CALL(ACameraMetadata_getConstEntry(metadata, ACAMERA_LENS_FACING, &entry)); + if (entry.data.i32[0] == ACAMERA_LENS_FACING_FRONT) { + facing_front = true; + } + ACameraMetadata_free(metadata); + + if (selected_resolution == std::pair{}) { + LOG_ERROR(Service_CAM, "Device does not support any YUV output format"); + return; + } + + CREATE(AImageReader, image_reader, + MEDIA_CALL(AImageReader_new(selected_resolution.first, selected_resolution.second, + AIMAGE_FORMAT_YUV_420_888, 4, &raw))); + + listener = { + /*context*/ this, + /*onImageAvailable*/ &ImageCallback, + }; + MEDIA_CALL(AImageReader_setImageListener(image_reader.get(), &listener)); + + CREATE(ANativeWindow, native_window, + MEDIA_CALL(AImageReader_getWindow(image_reader.get(), &raw))); + ANativeWindow_acquire(native_window.get()); + + CREATE(ACaptureSessionOutput, output, + CAMERA_CALL(ACaptureSessionOutput_create(native_window.get(), &raw))); + + CREATE(ACaptureSessionOutputContainer, outputs, + CAMERA_CALL(ACaptureSessionOutputContainer_create(&raw))); + CAMERA_CALL(ACaptureSessionOutputContainer_add(outputs.get(), output.get())); + + session_callbacks = { + /*context*/ nullptr, + /*onClosed*/ &OnClosed, + /*onReady*/ &OnReady, + /*onActive*/ &OnActive, + }; + CREATE(ACameraCaptureSession, session, + CAMERA_CALL(ACameraDevice_createCaptureSession(device.get(), outputs.get(), + &session_callbacks, &raw))); + CREATE(ACaptureRequest, request, + CAMERA_CALL(ACameraDevice_createCaptureRequest(device.get(), TEMPLATE_PREVIEW, &raw))); + + CREATE(ACameraOutputTarget, target, + CAMERA_CALL(ACameraOutputTarget_create(native_window.get(), &raw))); + CAMERA_CALL(ACaptureRequest_addTarget(request.get(), target.get())); + + requests = {request.get()}; + CAMERA_CALL(ACameraCaptureSession_setRepeatingRequest(session.get(), nullptr, 1, + requests.data(), nullptr)); + + // Wait until the first image comes + active_event.Wait(); + { + std::lock_guard lock{status_mutex}; + ready = true; + } +} + +#undef MEDIA_CALL +#undef CAMERA_CALL +#undef CREATE + +Interface::Interface(Factory& factory_, const std::string& id_, const Service::CAM::Flip& flip) + : factory(factory_), id(id_) { + mirror = base_mirror = + flip == Service::CAM::Flip::Horizontal || flip == Service::CAM::Flip::Reverse; + invert = base_invert = + flip == Service::CAM::Flip::Vertical || flip == Service::CAM::Flip::Reverse; +} + +Interface::~Interface() { + factory.camera_permission_requested = false; +} + +void Interface::StartCapture() { + session = factory.CreateCaptureSession(id); +} + +void Interface::StopCapture() { + session.reset(); +} + +void Interface::SetResolution(const Service::CAM::Resolution& resolution_) { + resolution = resolution_; +} + +void Interface::SetFlip(Service::CAM::Flip flip) { + mirror = base_mirror ^ + (flip == Service::CAM::Flip::Horizontal || flip == Service::CAM::Flip::Reverse); + invert = + base_invert ^ (flip == Service::CAM::Flip::Vertical || flip == Service::CAM::Flip::Reverse); +} + +void Interface::SetFormat(Service::CAM::OutputFormat format_) { + format = format_; +} + +struct YUVImage { + int width{}; + int height{}; + std::vector y; + std::vector u; + std::vector v; + + explicit YUVImage(int width_, int height_) + : width(width_), height(height_), y(static_cast(width * height)), + u(static_cast(width * height / 4)), + v(static_cast(width * height / 4)) {} + + void Swap(YUVImage& other) { + y.swap(other.y); + u.swap(other.u); + v.swap(other.v); + std::swap(width, other.width); + std::swap(height, other.height); + } + + void Clear() { + y.clear(); + u.clear(); + v.clear(); + width = height = 0; + } +}; + +#define YUV(image) \ + image.y.data(), image.width, image.u.data(), image.width / 2, image.v.data(), image.width / 2 + +std::vector Interface::ReceiveFrame() { + bool should_reload = false; + { + std::lock_guard lock{session->status_mutex}; + if (session->reload_requested) { + session->reload_requested = false; + should_reload = session->disconnected; + } + } + if (should_reload) { + LOG_INFO(Service_CAM, "Reloading camera session"); + session->Load(factory.manager.get(), id); + } + + bool session_ready; + { + std::lock_guard lock{session->status_mutex}; + session_ready = session->ready; + } + if (!session_ready) { // Camera was not opened + return std::vector(resolution.width * resolution.height); + } + + std::array, 3> data; + std::array row_stride; + { + std::lock_guard lock{session->data_mutex}; + data = session->data; + row_stride = session->row_stride; + } + + ASSERT_MSG(data[0] && data[1] && data[2], "Data is not available"); + + auto [width, height] = session->selected_resolution; + + YUVImage converted(width, height); + libyuv::Android420ToI420(data[0].get(), row_stride[0], data[1].get(), row_stride[1], + data[2].get(), row_stride[2], session->pixel_stride, YUV(converted), + width, height); + + // Rotate the image to get it in upright position + // The g_rotation here is the display rotation which is opposite of the device rotation + const int rotation = + (session->sensor_orientation + (session->facing_front ? g_rotation : 4 - g_rotation) * 90) % + 360; + if (rotation == 90 || rotation == 270) { + std::swap(width, height); + } + YUVImage rotated(width, height); + libyuv::I420Rotate(YUV(converted), YUV(rotated), converted.width, converted.height, + static_cast(rotation)); + converted.Clear(); + + // Calculate crop coordinates + int crop_width{}, crop_height{}; + if (resolution.width * height > resolution.height * width) { + crop_width = width; + crop_height = width * resolution.height / resolution.width; + } else { + crop_height = height; + crop_width = height * resolution.width / resolution.height; + } + const int crop_x = (width - crop_width) / 2; + const int crop_y = (height - crop_height) / 2; + + const int y_offset = crop_y * width + crop_x; + const int uv_offset = crop_y / 2 * width / 2 + crop_x / 2; + YUVImage scaled(resolution.width, resolution.height); + // Crop and scale + libyuv::I420Scale(rotated.y.data() + y_offset, width, rotated.u.data() + uv_offset, width / 2, + rotated.v.data() + uv_offset, width / 2, crop_width, crop_height, YUV(scaled), + resolution.width, resolution.height, libyuv::kFilterBilinear); + rotated.Clear(); + + if (mirror) { + YUVImage mirrored(scaled.width, scaled.height); + libyuv::I420Mirror(YUV(scaled), YUV(mirrored), resolution.width, resolution.height); + scaled.Swap(mirrored); + } + + std::vector output(resolution.width * resolution.height); + if (format == Service::CAM::OutputFormat::RGB565) { + libyuv::I420ToRGB565(YUV(scaled), reinterpret_cast(output.data()), + resolution.width * 2, resolution.width, + invert ? -resolution.height : resolution.height); + } else { + libyuv::I420ToYUY2(YUV(scaled), reinterpret_cast(output.data()), resolution.width * 2, + resolution.width, invert ? -resolution.height : resolution.height); + } + return output; +} + +#undef YUV + +bool Interface::IsPreviewAvailable() { + if (!session) { + return false; + } + std::lock_guard lock{session->status_mutex}; + return session->ready; +} + +Factory::Factory() = default; + +Factory::~Factory() = default; + +std::shared_ptr Factory::CreateCaptureSession(const std::string& id) { + if (opened_camera_map.count(id) && !opened_camera_map.at(id).expired()) { + return opened_camera_map.at(id).lock(); + } + const auto& session = std::make_shared(manager.get(), id); + opened_camera_map.insert_or_assign(id, session); + return session; +} + +std::unique_ptr Factory::Create(const std::string& config, + const Service::CAM::Flip& flip) { + + manager.reset(ACameraManager_create()); + ACameraIdList* id_list = nullptr; + + auto ret = ACameraManager_getCameraIdList(manager.get(), &id_list); + if (ret != ACAMERA_OK) { + LOG_ERROR(Service_CAM, "Failed to get camera ID list: ret {}", ret); + return std::make_unique(); + } + + SCOPE_EXIT({ ACameraManager_deleteCameraIdList(id_list); }); + + if (id_list->numCameras <= 0) { + LOG_WARNING(Service_CAM, "No camera devices found, falling back to StillImage"); + // TODO: A better way of doing this? + return std::make_unique()->Create("", flip); + } + + // Request camera permission + if (!camera_permission_granted) { + if (camera_permission_requested) { // Permissions already denied + return std::make_unique(); + } + camera_permission_requested = true; + + JNIEnv* env = IDCache::GetEnvForThread(); + jboolean result = env->CallStaticBooleanMethod(IDCache::GetNativeLibraryClass(), + IDCache::GetRequestCameraPermission()); + if (result != JNI_TRUE) { + LOG_ERROR(Service_CAM, "Camera permissions denied"); + return std::make_unique(); + } + camera_permission_granted = true; + } + + if (config.empty()) { + LOG_WARNING(Service_CAM, "Camera ID not set, using default camera"); + return std::make_unique(*this, id_list->cameraIds[0], flip); + } + + for (int i = 0; i < id_list->numCameras; ++i) { + const char* id = id_list->cameraIds[i]; + if (config == id) { + return std::make_unique(*this, id, flip); + } + + if (config != FrontCameraPlaceholder && config != BackCameraPlaceholder) { + continue; + } + + ACameraMetadata* metadata; + ACameraManager_getCameraCharacteristics(manager.get(), id, &metadata); + SCOPE_EXIT({ ACameraMetadata_free(metadata); }); + + ACameraMetadata_const_entry entry; + ACameraMetadata_getConstEntry(metadata, ACAMERA_LENS_FACING, &entry); + if ((entry.data.i32[0] == ACAMERA_LENS_FACING_FRONT && config == FrontCameraPlaceholder) || + (entry.data.i32[0] == ACAMERA_LENS_FACING_BACK && config == BackCameraPlaceholder)) { + return std::make_unique(*this, id, flip); + } + } + + LOG_ERROR(Service_CAM, "Camera ID {} not found", config); + return std::make_unique(); +} + +void Factory::ReloadCameraDevices() { + for (const auto& [id, ptr] : opened_camera_map) { + if (auto session = ptr.lock()) { + std::lock_guard lock{session->status_mutex}; + session->reload_requested = true; + } + } +} + +} // namespace Camera::NDK diff --git a/src/android/app/src/main/jni/camera/ndk_camera.h b/src/android/app/src/main/jni/camera/ndk_camera.h new file mode 100644 index 000000000..4b9bbfdaa --- /dev/null +++ b/src/android/app/src/main/jni/camera/ndk_camera.h @@ -0,0 +1,91 @@ +// Copyright 2020 Citra Emulator Project +// Licensed under GPLv2 or any later version +// Refer to the license.txt file included. + +#pragma once + +#include +#include +#include +#include +#include "common/common_types.h" +#include "core/frontend/camera/factory.h" +#include "core/frontend/camera/interface.h" +#include "core/hle/service/cam/cam.h" + +namespace Camera::NDK { + +struct CaptureSession; +class Factory; + +class Interface : public CameraInterface { +public: + Interface(Factory& factory, const std::string& id, const Service::CAM::Flip& flip); + ~Interface() override; + void StartCapture() override; + void StopCapture() override; + void SetResolution(const Service::CAM::Resolution& resolution) override; + void SetFlip(Service::CAM::Flip flip) override; + void SetEffect(Service::CAM::Effect effect) override{}; + void SetFormat(Service::CAM::OutputFormat format) override; + void SetFrameRate(Service::CAM::FrameRate frame_rate) override{}; + std::vector ReceiveFrame() override; + bool IsPreviewAvailable() override; + +private: + Factory& factory; + std::shared_ptr session; + std::string id; + + Service::CAM::Resolution resolution; + + // Flipping parameters. mirror = horizontal, invert = vertical. + bool base_mirror{}; + bool base_invert{}; + bool mirror{}; + bool invert{}; + + Service::CAM::OutputFormat format; +}; + +// Placeholders to mean 'use any front/back camera' +constexpr std::string_view FrontCameraPlaceholder = "_front"; +constexpr std::string_view BackCameraPlaceholder = "_back"; + +class Factory final : public CameraFactory { +public: + explicit Factory(); + ~Factory() override; + + std::unique_ptr Create(const std::string& config, + const Service::CAM::Flip& flip) override; + + // Request the reopening of all previously disconnected camera devices. + // Called when the application is brought to foreground (i.e. we have priority with the camera) + void ReloadCameraDevices(); + +private: + // Avoid requesting for permission more than once on each call + bool camera_permission_requested = false; + bool camera_permission_granted = false; + + std::shared_ptr CreateCaptureSession(const std::string& id); + + // The session is cached, to avoid opening the same camera twice. + // This is weak_ptr so that the session is destructed when all cameras are closed + std::unordered_map> opened_camera_map; + + struct ACameraManagerDeleter { + void operator()(ACameraManager* manager) { + ACameraManager_delete(manager); + } + }; + std::unique_ptr manager; + + friend class Interface; +}; + +// Device rotation. Updated in native.cpp. +inline int g_rotation = 0; + +} // namespace Camera::NDK diff --git a/src/android/app/src/main/jni/camera/still_image_camera.cpp b/src/android/app/src/main/jni/camera/still_image_camera.cpp new file mode 100644 index 000000000..496b51fa8 --- /dev/null +++ b/src/android/app/src/main/jni/camera/still_image_camera.cpp @@ -0,0 +1,143 @@ +// Copyright 2020 Citra Emulator Project +// Licensed under GPLv2 or any later version +// Refer to the license.txt file included. + +#include +#include +#include "common/logging/log.h" +#include "core/frontend/camera/blank_camera.h" +#include "jni/camera/still_image_camera.h" + +static jclass s_still_image_camera_helper_class; +static jmethodID s_open_file_picker; +static jmethodID s_load_image_from_file; + +namespace Camera::StillImage { + +void InitJNI(JNIEnv* env) { + s_still_image_camera_helper_class = reinterpret_cast( + env->NewGlobalRef(env->FindClass("org/citra/citra_emu/camera/StillImageCameraHelper"))); + s_open_file_picker = env->GetStaticMethodID(s_still_image_camera_helper_class, "OpenFilePicker", + "()Ljava/lang/String;"); + s_load_image_from_file = + env->GetStaticMethodID(s_still_image_camera_helper_class, "LoadImageFromFile", + "(Ljava/lang/String;II)Landroid/graphics/Bitmap;"); +} + +void CleanupJNI(JNIEnv* env) { + env->DeleteGlobalRef(s_still_image_camera_helper_class); +} + +Interface::Interface(SharedGlobalRef path_, const Service::CAM::Flip& flip) + : path(std::move(path_)) { + mirror = base_mirror = + flip == Service::CAM::Flip::Horizontal || flip == Service::CAM::Flip::Reverse; + invert = base_invert = + flip == Service::CAM::Flip::Vertical || flip == Service::CAM::Flip::Reverse; +} + +Interface::~Interface() { + Factory::last_path.reset(); +} + +void Interface::StartCapture() { + JNIEnv* env = IDCache::GetEnvForThread(); + jobject bitmap = + env->CallStaticObjectMethod(s_still_image_camera_helper_class, s_load_image_from_file, + path.get(), resolution.width, resolution.height); + if (bitmap == nullptr) { + LOG_ERROR(Frontend, "Could not load image from file"); + opened = false; + return; + } + + int ret; + +#define BITMAP_CALL(func) \ + ret = AndroidBitmap_##func; \ + if (ret != ANDROID_BITMAP_RESULT_SUCCESS) { \ + LOG_ERROR(Frontend, #func " failed with code {}", ret); \ + opened = false; \ + return; \ + } + + AndroidBitmapInfo info; + BITMAP_CALL(getInfo(env, bitmap, &info)); + ASSERT_MSG(info.format == AndroidBitmapFormat::ANDROID_BITMAP_FORMAT_RGBA_8888, + "Bitmap format was incorrect"); + ASSERT_MSG(info.width == resolution.width && info.height == resolution.height, + "Bitmap resolution was incorrect"); + + void* raw_data; + BITMAP_CALL(lockPixels(env, bitmap, &raw_data)); + std::vector data(info.height * info.stride); + libyuv::ABGRToARGB(reinterpret_cast(raw_data), info.stride, data.data(), info.stride, + info.width, info.height); + BITMAP_CALL(unlockPixels(env, bitmap)); + + if (mirror) { + std::vector mirrored(data.size()); + libyuv::ARGBMirror(data.data(), info.stride, mirrored.data(), info.stride, info.width, + info.height); + data.swap(mirrored); + } + + image.resize(info.height * info.width); + if (format == Service::CAM::OutputFormat::RGB565) { + libyuv::ARGBToRGB565(data.data(), info.stride, reinterpret_cast(image.data()), + info.width * 2, info.width, invert ? -info.height : info.height); + } else { + libyuv::ARGBToYUY2(data.data(), info.stride, reinterpret_cast(image.data()), + info.width * 2, info.width, invert ? -info.height : info.height); + } + opened = true; + +#undef BITMAP_CALL +} + +void Interface::SetResolution(const Service::CAM::Resolution& resolution_) { + resolution = resolution_; +} + +void Interface::SetFlip(Service::CAM::Flip flip) { + mirror = base_mirror ^ + (flip == Service::CAM::Flip::Horizontal || flip == Service::CAM::Flip::Reverse); + invert = + base_invert ^ (flip == Service::CAM::Flip::Vertical || flip == Service::CAM::Flip::Reverse); +} + +void Interface::SetFormat(Service::CAM::OutputFormat format_) { + format = format_; +} + +std::vector Interface::ReceiveFrame() { + return image; +} + +bool Interface::IsPreviewAvailable() { + return opened; +} + +SharedGlobalRef Factory::last_path{}; + +std::unique_ptr Factory::Create(const std::string& config, + const Service::CAM::Flip& flip) { + + JNIEnv* env = IDCache::GetEnvForThread(); + if (last_path != nullptr) { + return std::make_unique(last_path, flip); + } + + // Open file picker to get the string + jstring path = reinterpret_cast( + env->CallStaticObjectMethod(s_still_image_camera_helper_class, s_open_file_picker)); + if (path == nullptr) { + return std::make_unique(); + } else { + auto shared_path = NewSharedGlobalRef(path); + last_path = shared_path; + return std::make_unique(std::move(shared_path), flip); + } +} + +} // namespace Camera::StillImage diff --git a/src/android/app/src/main/jni/camera/still_image_camera.h b/src/android/app/src/main/jni/camera/still_image_camera.h new file mode 100644 index 000000000..ab12040a3 --- /dev/null +++ b/src/android/app/src/main/jni/camera/still_image_camera.h @@ -0,0 +1,63 @@ +// Copyright 2020 Citra Emulator Project +// Licensed under GPLv2 or any later version +// Refer to the license.txt file included. + +#pragma once + +#include +#include +#include +#include +#include "common/common_types.h" +#include "core/frontend/camera/factory.h" +#include "core/frontend/camera/interface.h" +#include "core/hle/service/cam/cam.h" +#include "jni/id_cache.h" + +namespace Camera::StillImage { + +class Interface final : public CameraInterface { +public: + Interface(SharedGlobalRef path, const Service::CAM::Flip& flip); + ~Interface(); + void StartCapture() override; + void StopCapture() override{}; + void SetResolution(const Service::CAM::Resolution& resolution) override; + void SetFlip(Service::CAM::Flip flip) override; + void SetEffect(Service::CAM::Effect effect) override{}; + void SetFormat(Service::CAM::OutputFormat format) override; + void SetFrameRate(Service::CAM::FrameRate frame_rate) override{}; + std::vector ReceiveFrame() override; + bool IsPreviewAvailable() override; + +private: + SharedGlobalRef path; + Service::CAM::Resolution resolution; + + // Flipping parameters. mirror = horizontal, invert = vertical. + bool base_mirror{}; + bool base_invert{}; + bool mirror{}; + bool invert{}; + + Service::CAM::OutputFormat format; + std::vector image; // Data fetched from the frontend + bool opened{}; // Whether the camera was successfully opened +}; + +class Factory final : public CameraFactory { +public: + std::unique_ptr Create(const std::string& config, + const Service::CAM::Flip& flip) override; + +private: + /// Record the path chosen to avoid multiple prompt problem + static SharedGlobalRef last_path; + + friend class Interface; +}; + +void InitJNI(JNIEnv* env); +void CleanupJNI(JNIEnv* env); + +} // namespace Camera::StillImage diff --git a/src/android/app/src/main/jni/config.cpp b/src/android/app/src/main/jni/config.cpp new file mode 100644 index 000000000..e8653da23 --- /dev/null +++ b/src/android/app/src/main/jni/config.cpp @@ -0,0 +1,279 @@ +// Copyright 2014 Citra Emulator Project +// Licensed under GPLv2 or any later version +// Refer to the license.txt file included. + +#include +#include +#include +#include +#include + +#include "common/file_util.h" +#include "common/logging/log.h" +#include "common/param_package.h" +#include "core/core.h" +#include "core/hle/service/cfg/cfg.h" +#include "core/hle/service/service.h" +#include "core/settings.h" +#include "input_common/main.h" +#include "input_common/udp/client.h" +#include "jni/camera/ndk_camera.h" +#include "jni/config.h" +#include "jni/default_ini.h" +#include "jni/input_manager.h" + +Config::Config() { + // TODO: Don't hardcode the path; let the frontend decide where to put the config files. + sdl2_config_loc = FileUtil::GetUserPath(FileUtil::UserPath::ConfigDir) + "config.ini"; + sdl2_config = std::make_unique(sdl2_config_loc); + + Reload(); +} + +Config::~Config() = default; + +bool Config::LoadINI(const std::string& default_contents, bool retry) { + const std::string& location = this->sdl2_config_loc; + if (sdl2_config->ParseError() < 0) { + if (retry) { + LOG_WARNING(Config, "Failed to load {}. Creating file from defaults...", location); + FileUtil::CreateFullPath(location); + FileUtil::WriteStringToFile(true, location, default_contents); + sdl2_config = std::make_unique(location); // Reopen file + + return LoadINI(default_contents, false); + } + LOG_ERROR(Config, "Failed."); + return false; + } + LOG_INFO(Config, "Successfully loaded {}", location); + return true; +} + +static const std::array default_buttons = { + InputManager::N3DS_BUTTON_A, InputManager::N3DS_BUTTON_B, + InputManager::N3DS_BUTTON_X, InputManager::N3DS_BUTTON_Y, + InputManager::N3DS_DPAD_UP, InputManager::N3DS_DPAD_DOWN, + InputManager::N3DS_DPAD_LEFT, InputManager::N3DS_DPAD_RIGHT, + InputManager::N3DS_TRIGGER_L, InputManager::N3DS_TRIGGER_R, + InputManager::N3DS_BUTTON_START, InputManager::N3DS_BUTTON_SELECT, + InputManager::N3DS_BUTTON_DEBUG, InputManager::N3DS_BUTTON_GPIO14, + InputManager::N3DS_BUTTON_ZL, InputManager::N3DS_BUTTON_ZR, + InputManager::N3DS_BUTTON_HOME, +}; + +static const std::array default_analogs{{ + InputManager::N3DS_CIRCLEPAD, + InputManager::N3DS_STICK_C, +}}; + +void Config::UpdateCFG() { + std::shared_ptr cfg = std::make_shared(); + cfg->SetSystemLanguage(static_cast( + sdl2_config->GetInteger("System", "language", Service::CFG::SystemLanguage::LANGUAGE_EN))); + cfg->UpdateConfigNANDSavegame(); +} + +void Config::ReadValues() { + // Controls + for (int i = 0; i < Settings::NativeButton::NumButtons; ++i) { + std::string default_param = InputManager::GenerateButtonParamPackage(default_buttons[i]); + Settings::values.current_input_profile.buttons[i] = + sdl2_config->GetString("Controls", Settings::NativeButton::mapping[i], default_param); + if (Settings::values.current_input_profile.buttons[i].empty()) + Settings::values.current_input_profile.buttons[i] = default_param; + } + + for (int i = 0; i < Settings::NativeAnalog::NumAnalogs; ++i) { + std::string default_param = InputManager::GenerateAnalogParamPackage(default_analogs[i]); + Settings::values.current_input_profile.analogs[i] = + sdl2_config->GetString("Controls", Settings::NativeAnalog::mapping[i], default_param); + if (Settings::values.current_input_profile.analogs[i].empty()) + Settings::values.current_input_profile.analogs[i] = default_param; + } + + Settings::values.current_input_profile.motion_device = sdl2_config->GetString( + "Controls", "motion_device", + "engine:motion_emu,update_period:100,sensitivity:0.01,tilt_clamp:90.0"); + Settings::values.current_input_profile.touch_device = + sdl2_config->GetString("Controls", "touch_device", "engine:emu_window"); + Settings::values.current_input_profile.udp_input_address = sdl2_config->GetString( + "Controls", "udp_input_address", InputCommon::CemuhookUDP::DEFAULT_ADDR); + Settings::values.current_input_profile.udp_input_port = + static_cast(sdl2_config->GetInteger("Controls", "udp_input_port", + InputCommon::CemuhookUDP::DEFAULT_PORT)); + + // Core + Settings::values.use_cpu_jit = sdl2_config->GetBoolean("Core", "use_cpu_jit", true); + Settings::values.cpu_clock_percentage = + static_cast(sdl2_config->GetInteger("Core", "cpu_clock_percentage", 100)); + + // Premium + Settings::values.texture_filter_name = + sdl2_config->GetString("Premium", "texture_filter_name", "none"); + + // Renderer + Settings::values.use_gles = sdl2_config->GetBoolean("Renderer", "use_gles", true); + Settings::values.use_hw_renderer = sdl2_config->GetBoolean("Renderer", "use_hw_renderer", true); + Settings::values.use_hw_shader = sdl2_config->GetBoolean("Renderer", "use_hw_shader", true); + Settings::values.shaders_accurate_mul = + sdl2_config->GetBoolean("Renderer", "shaders_accurate_mul", false); + Settings::values.use_asynchronous_gpu_emulation = + sdl2_config->GetBoolean("Renderer", "use_asynchronous_gpu_emulation", true); + Settings::values.use_shader_jit = sdl2_config->GetBoolean("Renderer", "use_shader_jit", true); + Settings::values.resolution_factor = + static_cast(sdl2_config->GetInteger("Renderer", "resolution_factor", 1)); + Settings::values.use_disk_shader_cache = + sdl2_config->GetBoolean("Renderer", "use_disk_shader_cache", true); + Settings::values.use_vsync_new = sdl2_config->GetBoolean("Renderer", "use_vsync_new", true); + + // Work around to map Android setting for enabling the frame limiter to the format Citra expects + if (sdl2_config->GetBoolean("Renderer", "use_frame_limit", true)) { + Settings::values.frame_limit = + static_cast(sdl2_config->GetInteger("Renderer", "frame_limit", 100)); + } else { + Settings::values.frame_limit = 0; + } + + Settings::values.render_3d = static_cast( + sdl2_config->GetInteger("Renderer", "render_3d", 0)); + Settings::values.factor_3d = + static_cast(sdl2_config->GetInteger("Renderer", "factor_3d", 0)); + std::string default_shader = "none (builtin)"; + if (Settings::values.render_3d == Settings::StereoRenderOption::Anaglyph) + default_shader = "dubois (builtin)"; + else if (Settings::values.render_3d == Settings::StereoRenderOption::Interlaced) + default_shader = "horizontal (builtin)"; + Settings::values.pp_shader_name = + sdl2_config->GetString("Renderer", "pp_shader_name", default_shader); + Settings::values.filter_mode = sdl2_config->GetBoolean("Renderer", "filter_mode", true); + + Settings::values.bg_red = static_cast(sdl2_config->GetReal("Renderer", "bg_red", 0.0)); + Settings::values.bg_green = + static_cast(sdl2_config->GetReal("Renderer", "bg_green", 0.0)); + Settings::values.bg_blue = static_cast(sdl2_config->GetReal("Renderer", "bg_blue", 0.0)); + + // Layout + Settings::values.layout_option = static_cast(sdl2_config->GetInteger( + "Layout", "layout_option", static_cast(Settings::LayoutOption::MobileLandscape))); + Settings::values.custom_layout = sdl2_config->GetBoolean("Layout", "custom_layout", false); + Settings::values.custom_top_left = + static_cast(sdl2_config->GetInteger("Layout", "custom_top_left", 0)); + Settings::values.custom_top_top = + static_cast(sdl2_config->GetInteger("Layout", "custom_top_top", 0)); + Settings::values.custom_top_right = + static_cast(sdl2_config->GetInteger("Layout", "custom_top_right", 400)); + Settings::values.custom_top_bottom = + static_cast(sdl2_config->GetInteger("Layout", "custom_top_bottom", 240)); + Settings::values.custom_bottom_left = + static_cast(sdl2_config->GetInteger("Layout", "custom_bottom_left", 40)); + Settings::values.custom_bottom_top = + static_cast(sdl2_config->GetInteger("Layout", "custom_bottom_top", 240)); + Settings::values.custom_bottom_right = + static_cast(sdl2_config->GetInteger("Layout", "custom_bottom_right", 360)); + Settings::values.custom_bottom_bottom = + static_cast(sdl2_config->GetInteger("Layout", "custom_bottom_bottom", 480)); + Settings::values.cardboard_screen_size = + static_cast(sdl2_config->GetInteger("Layout", "cardboard_screen_size", 85)); + Settings::values.cardboard_x_shift = + static_cast(sdl2_config->GetInteger("Layout", "cardboard_x_shift", 0)); + Settings::values.cardboard_y_shift = + static_cast(sdl2_config->GetInteger("Layout", "cardboard_y_shift", 0)); + + // Audio + Settings::values.enable_dsp_lle = sdl2_config->GetBoolean("Audio", "enable_dsp_lle", false); + Settings::values.enable_dsp_lle_multithread = + sdl2_config->GetBoolean("Audio", "enable_dsp_lle_multithread", false); + Settings::values.sink_id = sdl2_config->GetString("Audio", "output_engine", "auto"); + Settings::values.enable_audio_stretching = + sdl2_config->GetBoolean("Audio", "enable_audio_stretching", true); + Settings::values.audio_device_id = sdl2_config->GetString("Audio", "output_device", "auto"); + Settings::values.volume = static_cast(sdl2_config->GetReal("Audio", "volume", 1)); + Settings::values.mic_input_device = + sdl2_config->GetString("Audio", "mic_input_device", "Default"); + Settings::values.mic_input_type = + static_cast(sdl2_config->GetInteger("Audio", "mic_input_type", 1)); + + // Data Storage + Settings::values.use_virtual_sd = + sdl2_config->GetBoolean("Data Storage", "use_virtual_sd", true); + + // System + Settings::values.is_new_3ds = sdl2_config->GetBoolean("System", "is_new_3ds", true); + Settings::values.region_value = + sdl2_config->GetInteger("System", "region_value", Settings::REGION_VALUE_AUTO_SELECT); + Settings::values.init_clock = + static_cast(sdl2_config->GetInteger("System", "init_clock", 0)); + { + std::tm t; + t.tm_sec = 1; + t.tm_min = 0; + t.tm_hour = 0; + t.tm_mday = 1; + t.tm_mon = 0; + t.tm_year = 100; + t.tm_isdst = 0; + std::istringstream string_stream( + sdl2_config->GetString("System", "init_time", "2000-01-01 00:00:01")); + string_stream >> std::get_time(&t, "%Y-%m-%d %H:%M:%S"); + if (string_stream.fail()) { + LOG_ERROR(Config, "Failed To parse init_time. Using 2000-01-01 00:00:01"); + } + Settings::values.init_time = + std::chrono::duration_cast( + std::chrono::system_clock::from_time_t(std::mktime(&t)).time_since_epoch()) + .count(); + } + + // Camera + using namespace Service::CAM; + Settings::values.camera_name[OuterRightCamera] = + sdl2_config->GetString("Camera", "camera_outer_right_name", "ndk"); + Settings::values.camera_config[OuterRightCamera] = sdl2_config->GetString( + "Camera", "camera_outer_right_config", std::string{Camera::NDK::BackCameraPlaceholder}); + Settings::values.camera_flip[OuterRightCamera] = + sdl2_config->GetInteger("Camera", "camera_outer_right_flip", 0); + Settings::values.camera_name[InnerCamera] = + sdl2_config->GetString("Camera", "camera_inner_name", "ndk"); + Settings::values.camera_config[InnerCamera] = sdl2_config->GetString( + "Camera", "camera_inner_config", std::string{Camera::NDK::FrontCameraPlaceholder}); + Settings::values.camera_flip[InnerCamera] = + sdl2_config->GetInteger("Camera", "camera_inner_flip", 0); + Settings::values.camera_name[OuterLeftCamera] = + sdl2_config->GetString("Camera", "camera_outer_left_name", "ndk"); + Settings::values.camera_config[OuterLeftCamera] = sdl2_config->GetString( + "Camera", "camera_outer_left_config", std::string{Camera::NDK::BackCameraPlaceholder}); + Settings::values.camera_flip[OuterLeftCamera] = + sdl2_config->GetInteger("Camera", "camera_outer_left_flip", 0); + + // Miscellaneous + Settings::values.log_filter = sdl2_config->GetString("Miscellaneous", "log_filter", "*:Info"); + + // Debugging + Settings::values.record_frame_times = + sdl2_config->GetBoolean("Debugging", "record_frame_times", false); + Settings::values.use_gdbstub = sdl2_config->GetBoolean("Debugging", "use_gdbstub", false); + Settings::values.gdbstub_port = + static_cast(sdl2_config->GetInteger("Debugging", "gdbstub_port", 24689)); + + for (const auto& service_module : Service::service_module_map) { + bool use_lle = sdl2_config->GetBoolean("Debugging", "LLE\\" + service_module.name, false); + Settings::values.lle_modules.emplace(service_module.name, use_lle); + } + + // Web Service + Settings::values.enable_telemetry = + sdl2_config->GetBoolean("WebService", "enable_telemetry", true); + Settings::values.web_api_url = + sdl2_config->GetString("WebService", "web_api_url", "https://api.citra-emu.org"); + Settings::values.citra_username = sdl2_config->GetString("WebService", "citra_username", ""); + Settings::values.citra_token = sdl2_config->GetString("WebService", "citra_token", ""); + + // Update CFG file based on settings + UpdateCFG(); +} + +void Config::Reload() { + LoadINI(DefaultINI::sdl2_config_file); + ReadValues(); +} diff --git a/src/android/app/src/main/jni/config.h b/src/android/app/src/main/jni/config.h new file mode 100644 index 000000000..465457856 --- /dev/null +++ b/src/android/app/src/main/jni/config.h @@ -0,0 +1,26 @@ +// Copyright 2014 Citra Emulator Project +// Licensed under GPLv2 or any later version +// Refer to the license.txt file included. + +#pragma once + +#include +#include + +class INIReader; + +class Config { +private: + std::unique_ptr sdl2_config; + std::string sdl2_config_loc; + + bool LoadINI(const std::string& default_contents = "", bool retry = true); + void ReadValues(); + void UpdateCFG(); + +public: + Config(); + ~Config(); + + void Reload(); +}; diff --git a/src/android/app/src/main/jni/default_ini.h b/src/android/app/src/main/jni/default_ini.h new file mode 100644 index 000000000..56ab75e1a --- /dev/null +++ b/src/android/app/src/main/jni/default_ini.h @@ -0,0 +1,323 @@ +// Copyright 2014 Citra Emulator Project +// Licensed under GPLv2 or any later version +// Refer to the license.txt file included. + +#pragma once + +namespace DefaultINI { + +const char* sdl2_config_file = R"( +[Controls] +# The input devices and parameters for each 3DS native input +# It should be in the format of "engine:[engine_name],[param1]:[value1],[param2]:[value2]..." +# Escape characters $0 (for ':'), $1 (for ',') and $2 (for '$') can be used in values + +# for button input, the following devices are available: +# - "keyboard" (default) for keyboard input. Required parameters: +# - "code": the code of the key to bind +# - "sdl" for joystick input using SDL. Required parameters: +# - "joystick": the index of the joystick to bind +# - "button"(optional): the index of the button to bind +# - "hat"(optional): the index of the hat to bind as direction buttons +# - "axis"(optional): the index of the axis to bind +# - "direction"(only used for hat): the direction name of the hat to bind. Can be "up", "down", "left" or "right" +# - "threshold"(only used for axis): a float value in (-1.0, 1.0) which the button is +# triggered if the axis value crosses +# - "direction"(only used for axis): "+" means the button is triggered when the axis value +# is greater than the threshold; "-" means the button is triggered when the axis value +# is smaller than the threshold +button_a= +button_b= +button_x= +button_y= +button_up= +button_down= +button_left= +button_right= +button_l= +button_r= +button_start= +button_select= +button_debug= +button_gpio14= +button_zl= +button_zr= +button_home= + +# for analog input, the following devices are available: +# - "analog_from_button" (default) for emulating analog input from direction buttons. Required parameters: +# - "up", "down", "left", "right": sub-devices for each direction. +# Should be in the format as a button input devices using escape characters, for example, "engine$0keyboard$1code$00" +# - "modifier": sub-devices as a modifier. +# - "modifier_scale": a float number representing the applied modifier scale to the analog input. +# Must be in range of 0.0-1.0. Defaults to 0.5 +# - "sdl" for joystick input using SDL. Required parameters: +# - "joystick": the index of the joystick to bind +# - "axis_x": the index of the axis to bind as x-axis (default to 0) +# - "axis_y": the index of the axis to bind as y-axis (default to 1) +circle_pad= +c_stick= + +# for motion input, the following devices are available: +# - "motion_emu" (default) for emulating motion input from mouse input. Required parameters: +# - "update_period": update period in milliseconds (default to 100) +# - "sensitivity": the coefficient converting mouse movement to tilting angle (default to 0.01) +# - "tilt_clamp": the max value of the tilt angle in degrees (default to 90) +# - "cemuhookudp" reads motion input from a udp server that uses cemuhook's udp protocol +motion_device= + +# for touch input, the following devices are available: +# - "emu_window" (default) for emulating touch input from mouse input to the emulation window. No parameters required +# - "cemuhookudp" reads touch input from a udp server that uses cemuhook's udp protocol +# - "min_x", "min_y", "max_x", "max_y": defines the udp device's touch screen coordinate system +touch_device= engine:emu_window + +# Most desktop operating systems do not expose a way to poll the motion state of the controllers +# so as a way around it, cemuhook created a udp client/server protocol to broadcast the data directly +# from a controller device to the client program. Citra has a client that can connect and read +# from any cemuhook compatible motion program. + +# IPv4 address of the udp input server (Default "127.0.0.1") +udp_input_address= + +# Port of the udp input server. (Default 26760) +udp_input_port= + +# The pad to request data on. Should be between 0 (Pad 1) and 3 (Pad 4). (Default 0) +udp_pad_index= + +[Core] +# Whether to use the Just-In-Time (JIT) compiler for CPU emulation +# 0: Interpreter (slow), 1 (default): JIT (fast) +use_cpu_jit = + +# Change the Clock Frequency of the emulated 3DS CPU. +# Underclocking can increase the performance of the game at the risk of freezing. +# Overclocking may fix lag that happens on console, but also comes with the risk of freezing. +# Range is any positive integer (but we suspect 25 - 400 is a good idea) Default is 100 +cpu_clock_percentage = + +[Renderer] +# Whether to render using GLES or OpenGL +# 0: OpenGL, 1 (default): GLES +use_gles = + +# Whether to use software or hardware rendering. +# 0: Software, 1 (default): Hardware +use_hw_renderer = + +# Whether to use hardware shaders to emulate 3DS shaders +# 0: Software, 1 (default): Hardware +use_hw_shader = + +# Whether to use separable shaders to emulate 3DS shaders (macOS only) +# 0: Off (Default), 1 : On +separable_shader = + +# Whether to use accurate multiplication in hardware shaders +# 0: Off (Default. Faster, but causes issues in some games) 1: On (Slower, but correct) +shaders_accurate_mul = + +# Enable asynchronous GPU emulation +# 0: Off (Slower, but more accurate) 1: On (Default. Faster, but may cause issues in some games) +use_asynchronous_gpu_emulation = + +# Whether to use the Just-In-Time (JIT) compiler for shader emulation +# 0: Interpreter (slow), 1 (default): JIT (fast) +use_shader_jit = + +# Forces VSync on the display thread. Usually doesn't impact performance, but on some drivers it can +# so only turn this off if you notice a speed difference. +# 0: Off, 1 (default): On +use_vsync_new = + +# Reduce stuttering by storing and loading generated shaders to disk +# 0: Off, 1 (default. On) +use_disk_shader_cache = + +# Resolution scale factor +# 0: Auto (scales resolution to window size), 1: Native 3DS screen resolution, Otherwise a scale +# factor for the 3DS resolution +resolution_factor = + +# Whether to enable V-Sync (caps the framerate at 60FPS) or not. +# 0 (default): Off, 1: On +vsync_enabled = + +# Turns on the frame limiter, which will limit frames output to the target game speed +# 0: Off, 1: On (default) +use_frame_limit = + +# Limits the speed of the game to run no faster than this value as a percentage of target speed +# 1 - 9999: Speed limit as a percentage of target game speed. 100 (default) +frame_limit = + +# The clear color for the renderer. What shows up on the sides of the bottom screen. +# Must be in range of 0.0-1.0. Defaults to 0.0 for all. +bg_red = +bg_blue = +bg_green = + +# Whether and how Stereoscopic 3D should be rendered +# 0 (default): Off, 1: Side by Side, 2: Anaglyph, 3: Interlaced, 4: Reverse Interlaced, 5: Cardboard VR +render_3d = + +# Change 3D Intensity +# 0 - 100: Intensity. 0 (default) +factor_3d = + +# The name of the post processing shader to apply. +# Loaded from shaders if render_3d is off or side by side. +# Loaded from shaders/anaglyph if render_3d is anaglyph +pp_shader_name = + +# Whether to enable linear filtering or not +# This is required for some shaders to work correctly +# 0: Nearest, 1 (default): Linear +filter_mode = + +[Layout] +# Layout for the screen inside the render window. +# 0 (default): Default Top Bottom Screen, 1: Single Screen Only, 2: Large Screen Small Screen, 3: Side by Side +layout_option = + +# Toggle custom layout (using the settings below) on or off. +# 0 (default): Off, 1: On +custom_layout = + +# Screen placement when using Custom layout option +# 0x, 0y is the top left corner of the render window. +custom_top_left = +custom_top_top = +custom_top_right = +custom_top_bottom = +custom_bottom_left = +custom_bottom_top = +custom_bottom_right = +custom_bottom_bottom = + +# Swaps the prominent screen with the other screen. +# For example, if Single Screen is chosen, setting this to 1 will display the bottom screen instead of the top screen. +# 0 (default): Top Screen is prominent, 1: Bottom Screen is prominent +swap_screen = + +# Screen placement settings when using Cardboard VR (render3d = 4) +# 30 - 100: Screen size as a percentage of the viewport. 85 (default) +cardboard_screen_size = +# -100 - 100: Screen X-Coordinate shift as a percentage of empty space. 0 (default) +cardboard_x_shift = +# -100 - 100: Screen Y-Coordinate shift as a percentage of empty space. 0 (default) +cardboard_y_shift = + +[Audio] +# Whether or not to enable DSP LLE +# 0 (default): No, 1: Yes +enable_dsp_lle = + +# Whether or not to run DSP LLE on a different thread +# 0 (default): No, 1: Yes +enable_dsp_lle_thread = + +# Which audio output engine to use. +# auto (default): Auto-select, null: No audio output, sdl2: SDL2 (if available) +output_engine = + +# Whether or not to enable the audio-stretching post-processing effect. +# This effect adjusts audio speed to match emulation speed and helps prevent audio stutter, +# at the cost of increasing audio latency. +# 0: No, 1 (default): Yes +enable_audio_stretching = + +# Which audio device to use. +# auto (default): Auto-select +output_device = + +# Which mic input type to use. +# 0: None, 1 (default): Real device, 2: Static noise +mic_input_type = + +# Output volume. +# 1.0 (default): 100%, 0.0; mute +volume = + +[Data Storage] +# Whether to create a virtual SD card. +# 1 (default): Yes, 0: No +use_virtual_sd = + +[System] +# The system model that Citra will try to emulate +# 0: Old 3DS (default), 1: New 3DS +is_new_3ds = + +# The system region that Citra will use during emulation +# -1: Auto-select (default), 0: Japan, 1: USA, 2: Europe, 3: Australia, 4: China, 5: Korea, 6: Taiwan +region_value = + +# The system language that Citra will use during emulation +# 0: Japanese, 1: English (default), 2: French, 3: German, 4: Italian, 5: Spanish, +# 6: Simplified Chinese, 7: Korean, 8: Dutch, 9: Portuguese, 10: Russian, 11: Traditional Chinese +language = + +# The clock to use when citra starts +# 0: System clock (default), 1: fixed time +init_clock = + +# Time used when init_clock is set to fixed_time in the format %Y-%m-%d %H:%M:%S +# set to fixed time. Default 2000-01-01 00:00:01 +# Note: 3DS can only handle times later then Jan 1 2000 +init_time = + +[Camera] +# Which camera engine to use for the right outer camera +# blank: a dummy camera that always returns black image +# image: loads a still image from the storage. When the camera is started, you will be prompted +# to select an image. +# ndk (Default): uses the device camera. You can specify the camera ID to use in the config field. +# If you don't specify an ID, the default setting will be used. For outer cameras, +# the back-facing camera will be used. For the inner camera, the front-facing +# camera will be used. Please note that 'Legacy' cameras are not supported. +camera_outer_right_name = + +# A config string for the right outer camera. Its meaning is defined by the camera engine +camera_outer_right_config = + +# The image flip to apply +# 0: None (default), 1: Horizontal, 2: Vertical, 3: Reverse +camera_outer_right_flip = + +# ... for the left outer camera +camera_outer_left_name = +camera_outer_left_config = +camera_outer_left_flip = + +# ... for the inner camera +camera_inner_name = +camera_inner_config = +camera_inner_flip = + +[Miscellaneous] +# A filter which removes logs below a certain logging level. +# Examples: *:Debug Kernel.SVC:Trace Service.*:Critical +log_filter = *:Info + +[Debugging] +# Record frame time data, can be found in the log directory. Boolean value +record_frame_times = +# Port for listening to GDB connections. +use_gdbstub=false +gdbstub_port=24689 +# To LLE a service module add "LLE\=true" + +[WebService] +# Whether or not to enable telemetry +# 0: No, 1 (default): Yes +enable_telemetry = +# URL for Web API +web_api_url = https://api.citra-emu.org +# Username and token for Citra Web Service +# See https://profile.citra-emu.org/ for more info +citra_username = +citra_token = +)"; +} diff --git a/src/android/app/src/main/jni/emu_window/emu_window.cpp b/src/android/app/src/main/jni/emu_window/emu_window.cpp new file mode 100644 index 000000000..86faef554 --- /dev/null +++ b/src/android/app/src/main/jni/emu_window/emu_window.cpp @@ -0,0 +1,275 @@ +// Copyright 2019 Citra Emulator Project +// Licensed under GPLv2 or any later version +// Refer to the license.txt file included. + +#include +#include +#include +#include + +#include +#include + +#include "common/logging/log.h" +#include "core/settings.h" +#include "input_common/main.h" +#include "jni/emu_window/emu_window.h" +#include "jni/id_cache.h" +#include "jni/input_manager.h" +#include "network/network.h" +#include "video_core/renderer_base.h" +#include "video_core/video_core.h" + +static constexpr std::array egl_attribs{EGL_SURFACE_TYPE, + EGL_WINDOW_BIT, + EGL_RENDERABLE_TYPE, + EGL_OPENGL_ES3_BIT_KHR, + EGL_BLUE_SIZE, + 8, + EGL_GREEN_SIZE, + 8, + EGL_RED_SIZE, + 8, + EGL_DEPTH_SIZE, + 0, + EGL_STENCIL_SIZE, + 0, + EGL_NONE}; +static constexpr std::array egl_empty_attribs{EGL_WIDTH, 1, EGL_HEIGHT, 1, EGL_NONE}; +static constexpr std::array egl_context_attribs{EGL_CONTEXT_CLIENT_VERSION, 3, EGL_NONE}; + +SharedContext_Android::SharedContext_Android(EGLDisplay egl_display, EGLConfig egl_config, + EGLContext egl_share_context) + : egl_display{egl_display}, egl_surface{eglCreatePbufferSurface(egl_display, egl_config, + egl_empty_attribs.data())}, + egl_context{eglCreateContext(egl_display, egl_config, egl_share_context, + egl_context_attribs.data())} { + ASSERT_MSG(egl_surface, "eglCreatePbufferSurface() failed!"); + ASSERT_MSG(egl_context, "eglCreateContext() failed!"); +} + +SharedContext_Android::~SharedContext_Android() { + if (!eglDestroySurface(egl_display, egl_surface)) { + LOG_CRITICAL(Frontend, "eglDestroySurface() failed"); + } + + if (!eglDestroyContext(egl_display, egl_context)) { + LOG_CRITICAL(Frontend, "eglDestroySurface() failed"); + } +} + +void SharedContext_Android::MakeCurrent() { + eglMakeCurrent(egl_display, egl_surface, egl_surface, egl_context); +} + +void SharedContext_Android::DoneCurrent() { + eglMakeCurrent(egl_display, EGL_NO_SURFACE, EGL_NO_SURFACE, EGL_NO_CONTEXT); +} + +static bool IsPortraitMode() { + return JNI_FALSE != IDCache::GetEnvForThread()->CallStaticBooleanMethod( + IDCache::GetNativeLibraryClass(), IDCache::GetIsPortraitMode()); +} + +static void UpdateLandscapeScreenLayout() { + Settings::values.layout_option = + static_cast(IDCache::GetEnvForThread()->CallStaticIntMethod( + IDCache::GetNativeLibraryClass(), IDCache::GetLandscapeScreenLayout())); +} + +void EmuWindow_Android::OnSurfaceChanged(ANativeWindow* surface) { + render_window = surface; + StopPresenting(); +} + +bool EmuWindow_Android::OnTouchEvent(int x, int y, bool pressed) { + if (pressed) { + return TouchPressed((unsigned)std::max(x, 0), (unsigned)std::max(y, 0)); + } + + TouchReleased(); + return true; +} + +void EmuWindow_Android::OnTouchMoved(int x, int y) { + TouchMoved((unsigned)std::max(x, 0), (unsigned)std::max(y, 0)); +} + +void EmuWindow_Android::OnFramebufferSizeChanged() { + UpdateLandscapeScreenLayout(); + const bool is_portrait_mode{IsPortraitMode()}; + const int bigger{window_width > window_height ? window_width : window_height}; + const int smaller{window_width < window_height ? window_width : window_height}; + if (is_portrait_mode) { + UpdateCurrentFramebufferLayout(smaller, bigger, is_portrait_mode); + } else { + UpdateCurrentFramebufferLayout(bigger, smaller, is_portrait_mode); + } +} + +EmuWindow_Android::EmuWindow_Android(ANativeWindow* surface) { + LOG_DEBUG(Frontend, "Initializing EmuWindow_Android"); + + if (!surface) { + LOG_CRITICAL(Frontend, "surface is nullptr"); + return; + } + + Network::Init(); + + host_window = surface; + + if (egl_display = eglGetDisplay(EGL_DEFAULT_DISPLAY); egl_display == EGL_NO_DISPLAY) { + LOG_CRITICAL(Frontend, "eglGetDisplay() failed"); + return; + } + if (eglInitialize(egl_display, 0, 0) != EGL_TRUE) { + LOG_CRITICAL(Frontend, "eglInitialize() failed"); + return; + } + if (EGLint egl_num_configs{}; eglChooseConfig(egl_display, egl_attribs.data(), &egl_config, 1, + &egl_num_configs) != EGL_TRUE) { + LOG_CRITICAL(Frontend, "eglChooseConfig() failed"); + return; + } + + CreateWindowSurface(); + + if (eglQuerySurface(egl_display, egl_surface, EGL_WIDTH, &window_width) != EGL_TRUE) { + return; + } + if (eglQuerySurface(egl_display, egl_surface, EGL_HEIGHT, &window_height) != EGL_TRUE) { + return; + } + + if (egl_context = eglCreateContext(egl_display, egl_config, 0, egl_context_attribs.data()); + egl_context == EGL_NO_CONTEXT) { + LOG_CRITICAL(Frontend, "eglCreateContext() failed"); + return; + } + if (eglSurfaceAttrib(egl_display, egl_surface, EGL_SWAP_BEHAVIOR, EGL_BUFFER_DESTROYED) != + EGL_TRUE) { + LOG_CRITICAL(Frontend, "eglSurfaceAttrib() failed"); + return; + } + if (core_context = CreateSharedContext(); !core_context) { + LOG_CRITICAL(Frontend, "CreateSharedContext() failed"); + return; + } + if (eglMakeCurrent(egl_display, egl_surface, egl_surface, egl_context) != EGL_TRUE) { + LOG_CRITICAL(Frontend, "eglMakeCurrent() failed"); + return; + } + if (!gladLoadGLES2Loader((GLADloadproc)eglGetProcAddress)) { + LOG_CRITICAL(Frontend, "gladLoadGLES2Loader() failed"); + return; + } + if (!eglSwapInterval(egl_display, Settings::values.use_vsync_new ? 1 : 0)) { + LOG_CRITICAL(Frontend, "eglSwapInterval() failed"); + return; + } + + OnFramebufferSizeChanged(); +} + +bool EmuWindow_Android::CreateWindowSurface() { + if (!host_window) { + return true; + } + + EGLint format{}; + eglGetConfigAttrib(egl_display, egl_config, EGL_NATIVE_VISUAL_ID, &format); + ANativeWindow_setBuffersGeometry(host_window, 0, 0, format); + + if (egl_surface = eglCreateWindowSurface(egl_display, egl_config, host_window, 0); + egl_surface == EGL_NO_SURFACE) { + return {}; + } + + return !!egl_surface; +} + +void EmuWindow_Android::DestroyWindowSurface() { + if (!egl_surface) { + return; + } + if (eglGetCurrentSurface(EGL_DRAW) == egl_surface) { + eglMakeCurrent(egl_display, EGL_NO_SURFACE, EGL_NO_SURFACE, EGL_NO_CONTEXT); + } + if (!eglDestroySurface(egl_display, egl_surface)) { + LOG_CRITICAL(Frontend, "eglDestroySurface() failed"); + } + egl_surface = EGL_NO_SURFACE; +} + +void EmuWindow_Android::DestroyContext() { + if (!egl_context) { + return; + } + if (eglGetCurrentContext() == egl_context) { + eglMakeCurrent(egl_display, EGL_NO_SURFACE, EGL_NO_SURFACE, EGL_NO_CONTEXT); + } + if (!eglDestroyContext(egl_display, egl_context)) { + LOG_CRITICAL(Frontend, "eglDestroySurface() failed"); + } + if (!eglTerminate(egl_display)) { + LOG_CRITICAL(Frontend, "eglTerminate() failed"); + } + egl_context = EGL_NO_CONTEXT; + egl_display = EGL_NO_DISPLAY; +} + +EmuWindow_Android::~EmuWindow_Android() { + DestroyWindowSurface(); + DestroyContext(); +} + +std::unique_ptr EmuWindow_Android::CreateSharedContext() const { + return std::make_unique(egl_display, egl_config, egl_context); +} + +void EmuWindow_Android::StopPresenting() { + if (presenting_state == PresentingState::Running) { + eglMakeCurrent(egl_display, EGL_NO_SURFACE, EGL_NO_SURFACE, EGL_NO_CONTEXT); + } + presenting_state = PresentingState::Stopped; +} + +void EmuWindow_Android::TryPresenting() { + if (presenting_state != PresentingState::Running) { + if (presenting_state == PresentingState::Initial) { + eglMakeCurrent(egl_display, egl_surface, egl_surface, egl_context); + glBindFramebuffer(GL_DRAW_FRAMEBUFFER, 0); + presenting_state = PresentingState::Running; + } else { + return; + } + } + eglSwapInterval(egl_display, Settings::values.use_vsync_new ? 1 : 0); + if (VideoCore::g_renderer) { + VideoCore::g_renderer->TryPresent(0); + eglSwapBuffers(egl_display, egl_surface); + } +} + +void EmuWindow_Android::PollEvents() { + if (!render_window) { + return; + } + + host_window = render_window; + render_window = nullptr; + + DestroyWindowSurface(); + CreateWindowSurface(); + OnFramebufferSizeChanged(); + presenting_state = PresentingState::Initial; +} + +void EmuWindow_Android::MakeCurrent() { + core_context->MakeCurrent(); +} + +void EmuWindow_Android::DoneCurrent() { + core_context->DoneCurrent(); +} diff --git a/src/android/app/src/main/jni/emu_window/emu_window.h b/src/android/app/src/main/jni/emu_window/emu_window.h new file mode 100644 index 000000000..10a293c96 --- /dev/null +++ b/src/android/app/src/main/jni/emu_window/emu_window.h @@ -0,0 +1,83 @@ +// Copyright 2019 Citra Emulator Project +// Licensed under GPLv2 or any later version +// Refer to the license.txt file included. + +#pragma once + +#include + +#include +#include + +#include "core/frontend/emu_window.h" + +struct ANativeWindow; + +class SharedContext_Android : public Frontend::GraphicsContext { +public: + SharedContext_Android(EGLDisplay egl_display, EGLConfig egl_config, + EGLContext egl_share_context); + + ~SharedContext_Android() override; + + void MakeCurrent() override; + + void DoneCurrent() override; + +private: + EGLDisplay egl_display{}; + EGLSurface egl_surface{}; + EGLContext egl_context{}; +}; + +class EmuWindow_Android : public Frontend::EmuWindow { +public: + EmuWindow_Android(ANativeWindow* surface); + ~EmuWindow_Android(); + + void Present(); + + /// Called by the onSurfaceChanges() method to change the surface + void OnSurfaceChanged(ANativeWindow* surface); + + /// Handles touch event that occur.(Touched or released) + bool OnTouchEvent(int x, int y, bool pressed); + + /// Handles movement of touch pointer + void OnTouchMoved(int x, int y); + + void PollEvents() override; + void MakeCurrent() override; + void DoneCurrent() override; + + void TryPresenting(); + void StopPresenting(); + + std::unique_ptr CreateSharedContext() const override; + +private: + void OnFramebufferSizeChanged(); + bool CreateWindowSurface(); + void DestroyWindowSurface(); + void DestroyContext(); + + ANativeWindow* render_window{}; + ANativeWindow* host_window{}; + + int window_width{}; + int window_height{}; + + EGLConfig egl_config; + EGLSurface egl_surface{}; + EGLContext egl_context{}; + EGLDisplay egl_display{}; + + std::unique_ptr core_context; + + enum class PresentingState { + Initial, + Running, + Stopped, + }; + PresentingState presenting_state{}; +}; diff --git a/src/android/app/src/main/jni/game_info.cpp b/src/android/app/src/main/jni/game_info.cpp new file mode 100644 index 000000000..80c0379d6 --- /dev/null +++ b/src/android/app/src/main/jni/game_info.cpp @@ -0,0 +1,150 @@ +// Copyright 2017 Citra Emulator Project +// Licensed under GPLv2 or any later version +// Refer to the license.txt file included. + +#include +#include +#include +#include + +#include "common/string_util.h" +#include "core/hle/service/am/am.h" +#include "core/hle/service/fs/archive.h" +#include "core/loader/loader.h" +#include "core/loader/smdh.h" +#include "jni/game_info.h" + +namespace GameInfo { + +std::vector GetSMDHData(std::string physical_name) { + std::unique_ptr loader = Loader::GetLoader(physical_name); + if (!loader) { + return {}; + } + + u64 program_id = 0; + loader->ReadProgramId(program_id); + + std::vector smdh = [program_id, &loader]() -> std::vector { + std::vector original_smdh; + loader->ReadIcon(original_smdh); + + if (program_id < 0x00040000'00000000 || program_id > 0x00040000'FFFFFFFF) + return original_smdh; + + std::string update_path = Service::AM::GetTitleContentPath( + Service::FS::MediaType::SDMC, program_id + 0x0000000E'00000000); + + if (!FileUtil::Exists(update_path)) + return original_smdh; + + std::unique_ptr update_loader = Loader::GetLoader(update_path); + + if (!update_loader) + return original_smdh; + + std::vector update_smdh; + update_loader->ReadIcon(update_smdh); + return update_smdh; + }(); + + return smdh; +} + +std::u16string GetTitle(std::string physical_name) { + Loader::SMDH::TitleLanguage language = Loader::SMDH::TitleLanguage::English; + std::vector smdh_data = GetSMDHData(physical_name); + + if (!Loader::IsValidSMDH(smdh_data)) { + // SMDH is not valid, return null + return {}; + } + + Loader::SMDH smdh; + memcpy(&smdh, smdh_data.data(), sizeof(Loader::SMDH)); + + // Get the title from SMDH in UTF-16 format + std::u16string title{ + reinterpret_cast(smdh.titles[static_cast(language)].long_title.data())}; + + return title; +} + +std::u16string GetPublisher(std::string physical_name) { + Loader::SMDH::TitleLanguage language = Loader::SMDH::TitleLanguage::English; + std::vector smdh_data = GetSMDHData(physical_name); + + if (!Loader::IsValidSMDH(smdh_data)) { + // SMDH is not valid, return null + return {}; + } + + Loader::SMDH smdh; + memcpy(&smdh, smdh_data.data(), sizeof(Loader::SMDH)); + + // Get the Publisher's name from SMDH in UTF-16 format + char16_t* publisher; + publisher = + reinterpret_cast(smdh.titles[static_cast(language)].publisher.data()); + + return publisher; +} + +std::string GetRegions(std::string physical_name) { + std::vector smdh_data = GetSMDHData(physical_name); + + if (!Loader::IsValidSMDH(smdh_data)) { + // SMDH is not valid, return "Invalid region" + return "Invalid region"; + } + + Loader::SMDH smdh; + memcpy(&smdh, smdh_data.data(), sizeof(Loader::SMDH)); + + using GameRegion = Loader::SMDH::GameRegion; + static const std::map regions_map = { + {GameRegion::Japan, "Japan"}, {GameRegion::NorthAmerica, "North America"}, + {GameRegion::Europe, "Europe"}, {GameRegion::Australia, "Australia"}, + {GameRegion::China, "China"}, {GameRegion::Korea, "Korea"}, + {GameRegion::Taiwan, "Taiwan"}}; + std::vector regions = smdh.GetRegions(); + + if (regions.empty()) { + return "Invalid region"; + } + + const bool region_free = + std::all_of(regions_map.begin(), regions_map.end(), [®ions](const auto& it) { + return std::find(regions.begin(), regions.end(), it.first) != regions.end(); + }); + + if (region_free) { + return "Region free"; + } + + const std::string separator = ", "; + std::string result = regions_map.at(regions.front()); + for (auto region = ++regions.begin(); region != regions.end(); ++region) { + result += separator + regions_map.at(*region); + } + + return result; +} + +std::vector GetIcon(std::string physical_name) { + std::vector smdh_data = GetSMDHData(physical_name); + + if (!Loader::IsValidSMDH(smdh_data)) { + // SMDH is not valid, return null + return std::vector(0, 0); + } + + Loader::SMDH smdh; + memcpy(&smdh, smdh_data.data(), sizeof(Loader::SMDH)); + + // Always get a 48x48(large) icon + std::vector icon_data = smdh.GetIcon(true); + return icon_data; +} + +} // namespace GameInfo diff --git a/src/android/app/src/main/jni/game_info.h b/src/android/app/src/main/jni/game_info.h new file mode 100644 index 000000000..ad3254aab --- /dev/null +++ b/src/android/app/src/main/jni/game_info.h @@ -0,0 +1,20 @@ +// Copyright 2017 Citra Emulator Project +// Licensed under GPLv2 or any later version +// Refer to the license.txt file included. + +#include +#include + +#include "common/common_types.h" + +namespace GameInfo { +std::vector GetSMDHData(std::string physical_name); + +std::u16string GetTitle(std::string physical_name); + +std::u16string GetPublisher(std::string physical_name); + +std::string GetRegions(std::string physical_name); + +std::vector GetIcon(std::string physical_name); +} // namespace GameInfo diff --git a/src/android/app/src/main/jni/game_settings.cpp b/src/android/app/src/main/jni/game_settings.cpp new file mode 100644 index 000000000..06cefc91f --- /dev/null +++ b/src/android/app/src/main/jni/game_settings.cpp @@ -0,0 +1,81 @@ +// Copyright 2019 Citra Emulator Project +// Licensed under GPLv2 or any later version +// Refer to the license.txt file included. + +#include "core/settings.h" + +namespace GameSettings { + +void LoadOverrides(u64 program_id) { + Settings::values.gpu_timing_mode_submit_list = Settings::GpuTimingMode::Asynch_1ms; + Settings::values.gpu_timing_mode_swap_buffers = Settings::GpuTimingMode::Asynch_8ms; + Settings::values.gpu_timing_mode_memory_fill = Settings::GpuTimingMode::Asynch_2ms; + Settings::values.gpu_timing_mode_display_transfer = Settings::GpuTimingMode::Synch; + Settings::values.gpu_timing_mode_flush = Settings::GpuTimingMode::Skip; + Settings::values.gpu_timing_mode_flush_and_invalidate = Settings::GpuTimingMode::Asynch; + Settings::values.gpu_timing_mode_invalidate = Settings::GpuTimingMode::Synch; + + switch (program_id) { + // JAP / Dragon Quest VII: Fragments of the Forgotten Past + case 0x0004000000065E00: + // USA / Dragon Quest VII: Fragments of the Forgotten Past + case 0x000400000018EF00: + // EUR / Dragon Quest VII: Fragments of the Forgotten Past + case 0x000400000018F000: + // This game is currently broken with asynchronous GPU + Settings::values.use_asynchronous_gpu_emulation = false; + break; + + // JAP / The Legend of Zelda: Ocarina of Time 3D + case 0x0004000000033400: + // USA / The Legend of Zelda: Ocarina of Time 3D + case 0x0004000000033500: + // EUR / The Legend of Zelda: Ocarina of Time 3D + case 0x0004000000033600: + // KOR / The Legend of Zelda: Ocarina of Time 3D + case 0x000400000008F800: + // CHI / The Legend of Zelda: Ocarina of Time 3D + case 0x000400000008F900: + // This game requires accurate multiplication to render properly + Settings::values.shaders_accurate_mul = true; + Settings::values.gpu_timing_mode_submit_list = Settings::GpuTimingMode::Asynch_1ms; + Settings::values.gpu_timing_mode_swap_buffers = Settings::GpuTimingMode::Asynch_4ms; + Settings::values.gpu_timing_mode_memory_fill = Settings::GpuTimingMode::Asynch; + Settings::values.gpu_timing_mode_display_transfer = Settings::GpuTimingMode::Asynch; + Settings::values.gpu_timing_mode_flush = Settings::GpuTimingMode::Skip; + Settings::values.gpu_timing_mode_flush_and_invalidate = Settings::GpuTimingMode::Skip; + break; + + // JAP / Super Mario 3D Land + case 0x0004000000054100: + // USA / Super Mario 3D Land + case 0x0004000000054000: + // EUR / Super Mario 3D Land + case 0x0004000000053F00: + // KOR / Super Mario 3D Land + case 0x0004000000089D00: + // This game has very sensitive timings with asynchronous GPU + Settings::values.gpu_timing_mode_submit_list = Settings::GpuTimingMode::Synch; + break; + + // USA / Mario & Luigi: Superstar Saga + Bowsers Minions + case 0x00040000001B8F00: + // EUR / Mario & Luigi: Superstar Saga + Bowsers Minions + case 0x00040000001B9000: + // JAP / Mario & Luigi: Superstar Saga + Bowsers Minions + case 0x0004000000194B00: + // This game requires accurate multiplication to render properly + Settings::values.shaders_accurate_mul = true; + break; + + // USA / Mario & Luigi: Bowsers Inside Story + Bowser Jrs Journey + case 0x00040000001D1400: + // EUR / Mario & Luigi: Bowsers Inside Story + Bowser Jrs Journey + case 0x00040000001D1500: + // This game requires accurate multiplication to render properly + Settings::values.shaders_accurate_mul = true; + break; + } +} + +} // namespace GameSettings diff --git a/src/android/app/src/main/jni/game_settings.h b/src/android/app/src/main/jni/game_settings.h new file mode 100644 index 000000000..b034e1865 --- /dev/null +++ b/src/android/app/src/main/jni/game_settings.h @@ -0,0 +1,11 @@ +// Copyright 2020 Citra Emulator Project +// Licensed under GPLv2 or any later version +// Refer to the license.txt file included. + +#include "common/common_types.h" + +namespace GameSettings { + +void LoadOverrides(u64 program_id); + +} // namespace GameSettings diff --git a/src/android/app/src/main/jni/id_cache.cpp b/src/android/app/src/main/jni/id_cache.cpp new file mode 100644 index 000000000..cf1c24437 --- /dev/null +++ b/src/android/app/src/main/jni/id_cache.cpp @@ -0,0 +1,235 @@ +// Copyright 2019 Citra Emulator Project +// Licensed under GPLv2 or any later version +// Refer to the license.txt file included. + +#include "common/common_paths.h" +#include "common/logging/backend.h" +#include "common/logging/filter.h" +#include "common/logging/log.h" +#include "core/settings.h" +#include "jni/applets/mii_selector.h" +#include "jni/applets/swkbd.h" +#include "jni/camera/still_image_camera.h" +#include "jni/id_cache.h" + +#include + +static constexpr jint JNI_VERSION = JNI_VERSION_1_6; + +static JavaVM* s_java_vm; + +static jclass s_native_library_class; +static jclass s_core_error_class; +static jclass s_savestate_info_class; +static jclass s_disk_cache_progress_class; +static jclass s_load_callback_stage_class; +static jmethodID s_on_core_error; +static jmethodID s_display_alert_msg; +static jmethodID s_display_alert_prompt; +static jmethodID s_alert_prompt_button; +static jmethodID s_is_portrait_mode; +static jmethodID s_landscape_screen_layout; +static jmethodID s_exit_emulation_activity; +static jmethodID s_request_camera_permission; +static jmethodID s_request_mic_permission; +static jmethodID s_disk_cache_load_progress; + +static std::unordered_map s_java_load_callback_stages; + +namespace IDCache { + +JNIEnv* GetEnvForThread() { + thread_local static struct OwnedEnv { + OwnedEnv() { + status = s_java_vm->GetEnv(reinterpret_cast(&env), JNI_VERSION_1_6); + if (status == JNI_EDETACHED) + s_java_vm->AttachCurrentThread(&env, nullptr); + } + + ~OwnedEnv() { + if (status == JNI_EDETACHED) + s_java_vm->DetachCurrentThread(); + } + + int status; + JNIEnv* env = nullptr; + } owned; + return owned.env; +} + +jclass GetNativeLibraryClass() { + return s_native_library_class; +} + +jclass GetCoreErrorClass() { + return s_core_error_class; +} + +jclass GetSavestateInfoClass() { + return s_savestate_info_class; +} + +jclass GetDiskCacheProgressClass() { + return s_disk_cache_progress_class; +} + +jclass GetDiskCacheLoadCallbackStageClass() { + return s_load_callback_stage_class; +} + +jmethodID GetOnCoreError() { + return s_on_core_error; +} + +jmethodID GetDisplayAlertMsg() { + return s_display_alert_msg; +} + +jmethodID GetDisplayAlertPrompt() { + return s_display_alert_prompt; +} + +jmethodID GetAlertPromptButton() { + return s_alert_prompt_button; +} + +jmethodID GetIsPortraitMode() { + return s_is_portrait_mode; +} + +jmethodID GetLandscapeScreenLayout() { + return s_landscape_screen_layout; +} + +jmethodID GetExitEmulationActivity() { + return s_exit_emulation_activity; +} + +jmethodID GetRequestCameraPermission() { + return s_request_camera_permission; +} + +jmethodID GetRequestMicPermission() { + return s_request_mic_permission; +} + +jmethodID GetDiskCacheLoadProgress() { + return s_disk_cache_load_progress; +} + +jobject GetJavaLoadCallbackStage(VideoCore::LoadCallbackStage stage) { + const auto it = s_java_load_callback_stages.find(stage); + ASSERT_MSG(it != s_java_load_callback_stages.end(), "Invalid LoadCallbackStage: {}", stage); + + return it->second; +} + +} // namespace IDCache + +#ifdef __cplusplus +extern "C" { +#endif + +jint JNI_OnLoad(JavaVM* vm, void* reserved) { + s_java_vm = vm; + + JNIEnv* env; + if (vm->GetEnv(reinterpret_cast(&env), JNI_VERSION) != JNI_OK) + return JNI_ERR; + + // Initialize Logger + Log::Filter log_filter; + log_filter.ParseFilterString(Settings::values.log_filter); + Log::SetGlobalFilter(log_filter); + Log::AddBackend(std::make_unique()); + FileUtil::CreateFullPath(FileUtil::GetUserPath(FileUtil::UserPath::LogDir)); + Log::AddBackend(std::make_unique( + FileUtil::GetUserPath(FileUtil::UserPath::LogDir) + LOG_FILE)); + LOG_INFO(Frontend, "Logging backend initialised"); + + // Initialize Java classes + const jclass native_library_class = env->FindClass("org/citra/citra_emu/NativeLibrary"); + s_native_library_class = reinterpret_cast(env->NewGlobalRef(native_library_class)); + s_savestate_info_class = reinterpret_cast( + env->NewGlobalRef(env->FindClass("org/citra/citra_emu/NativeLibrary$SavestateInfo"))); + s_core_error_class = reinterpret_cast( + env->NewGlobalRef(env->FindClass("org/citra/citra_emu/NativeLibrary$CoreError"))); + s_disk_cache_progress_class = reinterpret_cast(env->NewGlobalRef( + env->FindClass("org/citra/citra_emu/disk_shader_cache/DiskShaderCacheProgress"))); + s_load_callback_stage_class = reinterpret_cast(env->NewGlobalRef(env->FindClass( + "org/citra/citra_emu/disk_shader_cache/DiskShaderCacheProgress$LoadCallbackStage"))); + + // Initialize Java methods + s_on_core_error = env->GetStaticMethodID( + s_native_library_class, "OnCoreError", + "(Lorg/citra/citra_emu/NativeLibrary$CoreError;Ljava/lang/String;)Z"); + s_display_alert_msg = env->GetStaticMethodID(s_native_library_class, "displayAlertMsg", + "(Ljava/lang/String;Ljava/lang/String;Z)Z"); + s_display_alert_prompt = + env->GetStaticMethodID(s_native_library_class, "displayAlertPrompt", + "(Ljava/lang/String;Ljava/lang/String;I)Ljava/lang/String;"); + s_alert_prompt_button = + env->GetStaticMethodID(s_native_library_class, "alertPromptButton", "()I"); + s_is_portrait_mode = env->GetStaticMethodID(s_native_library_class, "isPortraitMode", "()Z"); + s_landscape_screen_layout = + env->GetStaticMethodID(s_native_library_class, "landscapeScreenLayout", "()I"); + s_exit_emulation_activity = + env->GetStaticMethodID(s_native_library_class, "exitEmulationActivity", "(I)V"); + s_request_camera_permission = + env->GetStaticMethodID(s_native_library_class, "RequestCameraPermission", "()Z"); + s_request_mic_permission = + env->GetStaticMethodID(s_native_library_class, "RequestMicPermission", "()Z"); + s_disk_cache_load_progress = env->GetStaticMethodID( + s_disk_cache_progress_class, "loadProgress", + "(Lorg/citra/citra_emu/disk_shader_cache/DiskShaderCacheProgress$LoadCallbackStage;II)V"); + + // Initialize LoadCallbackStage map + const auto to_java_load_callback_stage = [env](const std::string& stage) { + jclass load_callback_stage_class = IDCache::GetDiskCacheLoadCallbackStageClass(); + return env->NewGlobalRef(env->GetStaticObjectField( + load_callback_stage_class, + env->GetStaticFieldID(load_callback_stage_class, stage.c_str(), + "Lorg/citra/citra_emu/disk_shader_cache/" + "DiskShaderCacheProgress$LoadCallbackStage;"))); + }; + + s_java_load_callback_stages.emplace(VideoCore::LoadCallbackStage::Prepare, + to_java_load_callback_stage("Prepare")); + s_java_load_callback_stages.emplace(VideoCore::LoadCallbackStage::Decompile, + to_java_load_callback_stage("Decompile")); + s_java_load_callback_stages.emplace(VideoCore::LoadCallbackStage::Build, + to_java_load_callback_stage("Build")); + s_java_load_callback_stages.emplace(VideoCore::LoadCallbackStage::Complete, + to_java_load_callback_stage("Complete")); + + MiiSelector::InitJNI(env); + SoftwareKeyboard::InitJNI(env); + Camera::StillImage::InitJNI(env); + + return JNI_VERSION; +} + +void JNI_OnUnload(JavaVM* vm, void* reserved) { + JNIEnv* env; + if (vm->GetEnv(reinterpret_cast(&env), JNI_VERSION) != JNI_OK) { + return; + } + + env->DeleteGlobalRef(s_native_library_class); + env->DeleteGlobalRef(s_savestate_info_class); + env->DeleteGlobalRef(s_core_error_class); + env->DeleteGlobalRef(s_disk_cache_progress_class); + env->DeleteGlobalRef(s_load_callback_stage_class); + + for (auto& [key, object] : s_java_load_callback_stages) { + env->DeleteGlobalRef(object); + } + + MiiSelector::CleanupJNI(env); + SoftwareKeyboard::CleanupJNI(env); + Camera::StillImage::CleanupJNI(env); +} + +#ifdef __cplusplus +} +#endif diff --git a/src/android/app/src/main/jni/id_cache.h b/src/android/app/src/main/jni/id_cache.h new file mode 100644 index 000000000..4b8c89511 --- /dev/null +++ b/src/android/app/src/main/jni/id_cache.h @@ -0,0 +1,50 @@ +// Copyright 2019 Citra Emulator Project +// Licensed under GPLv2 or any later version +// Refer to the license.txt file included. + +#pragma once + +#include +#include +#include +#include "video_core/rasterizer_interface.h" + +namespace IDCache { + +JNIEnv* GetEnvForThread(); +jclass GetNativeLibraryClass(); +jclass GetCoreErrorClass(); +jclass GetSavestateInfoClass(); +jclass GetDiskCacheProgressClass(); +jclass GetDiskCacheLoadCallbackStageClass(); +jmethodID GetOnCoreError(); +jmethodID GetDisplayAlertMsg(); +jmethodID GetDisplayAlertPrompt(); +jmethodID GetAlertPromptButton(); +jmethodID GetIsPortraitMode(); +jmethodID GetLandscapeScreenLayout(); +jmethodID GetExitEmulationActivity(); +jmethodID GetRequestCameraPermission(); +jmethodID GetRequestMicPermission(); +jmethodID GetDiskCacheLoadProgress(); + +jobject GetJavaLoadCallbackStage(VideoCore::LoadCallbackStage stage); + +} // namespace IDCache + +template +using SharedGlobalRef = std::shared_ptr>; + +struct SharedGlobalRefDeleter { + void operator()(jobject ptr) { + JNIEnv* env = IDCache::GetEnvForThread(); + env->DeleteGlobalRef(ptr); + } +}; + +template +SharedGlobalRef NewSharedGlobalRef(T object) { + JNIEnv* env = IDCache::GetEnvForThread(); + auto* global_ref = reinterpret_cast(env->NewGlobalRef(object)); + return SharedGlobalRef(global_ref, SharedGlobalRefDeleter()); +} diff --git a/src/android/app/src/main/jni/input_manager.cpp b/src/android/app/src/main/jni/input_manager.cpp new file mode 100644 index 000000000..9c58e3527 --- /dev/null +++ b/src/android/app/src/main/jni/input_manager.cpp @@ -0,0 +1,332 @@ +// Copyright 2017 Citra Emulator Project +// Licensed under GPLv2 or any later version +// Refer to the license.txt file included. + +#include +#include +#include +#include +#include +#include +#include +#include "common/logging/log.h" +#include "common/math_util.h" +#include "common/param_package.h" +#include "input_common/main.h" +#include "input_common/sdl/sdl.h" +#include "jni/input_manager.h" +#include "jni/ndk_motion.h" + +namespace InputManager { + +static std::shared_ptr button; +static std::shared_ptr analog; +static std::shared_ptr motion; + +// Button Handler +class KeyButton final : public Input::ButtonDevice { +public: + explicit KeyButton(std::shared_ptr button_list_) : button_list(button_list_) {} + + ~KeyButton(); + + bool GetStatus() const override { + return status.load(); + } + + friend class ButtonList; + +private: + std::shared_ptr button_list; + std::atomic status{false}; +}; + +struct KeyButtonPair { + int button_id; + KeyButton* key_button; +}; + +class ButtonList { +public: + void AddButton(int button_id, KeyButton* key_button) { + std::lock_guard guard(mutex); + list.push_back(KeyButtonPair{button_id, key_button}); + } + + void RemoveButton(const KeyButton* key_button) { + std::lock_guard guard(mutex); + list.remove_if( + [key_button](const KeyButtonPair& pair) { return pair.key_button == key_button; }); + } + + bool ChangeButtonStatus(int button_id, bool pressed) { + std::lock_guard guard(mutex); + bool button_found = false; + for (const KeyButtonPair& pair : list) { + if (pair.button_id == button_id) { + pair.key_button->status.store(pressed); + button_found = true; + } + } + // If we don't find the button don't consume the button press event + return button_found; + } + + void ChangeAllButtonStatus(bool pressed) { + std::lock_guard guard(mutex); + for (const KeyButtonPair& pair : list) { + pair.key_button->status.store(pressed); + } + } + +private: + std::mutex mutex; + std::list list; +}; + +KeyButton::~KeyButton() { + button_list->RemoveButton(this); +} + +// Analog Button +class AnalogButton final : public Input::ButtonDevice { +public: + explicit AnalogButton(std::shared_ptr button_list_, float threshold_, + bool trigger_if_greater_) + : button_list(button_list_), threshold(threshold_), + trigger_if_greater(trigger_if_greater_) {} + + ~AnalogButton(); + + bool GetStatus() const override { + if (trigger_if_greater) + return axis_val.load() > threshold; + return axis_val.load() < threshold; + } + + friend class AnalogButtonList; + +private: + std::shared_ptr button_list; + std::atomic axis_val{0.0f}; + float threshold; + bool trigger_if_greater; +}; + +struct AnalogButtonPair { + int axis_id; + AnalogButton* key_button; +}; + +class AnalogButtonList { +public: + void AddAnalogButton(int button_id, AnalogButton* key_button) { + std::lock_guard guard(mutex); + list.push_back(AnalogButtonPair{button_id, key_button}); + } + + void RemoveButton(const AnalogButton* key_button) { + std::lock_guard guard(mutex); + list.remove_if( + [key_button](const AnalogButtonPair& pair) { return pair.key_button == key_button; }); + } + + bool ChangeAxisValue(int axis_id, float axis) { + std::lock_guard guard(mutex); + bool button_found = false; + for (const AnalogButtonPair& pair : list) { + if (pair.axis_id == axis_id) { + pair.key_button->axis_val.store(axis); + button_found = true; + } + } + // If we don't find the button don't consume the button press event + return button_found; + } + +private: + std::mutex mutex; + std::list list; +}; + +AnalogButton::~AnalogButton() { + button_list->RemoveButton(this); +} + +// Joystick Handler +class Joystick final : public Input::AnalogDevice { +public: + explicit Joystick(std::shared_ptr analog_list_) : analog_list(analog_list_) {} + + ~Joystick(); + + std::tuple GetStatus() const override { + return std::make_tuple(x_axis.load(), y_axis.load()); + } + + friend class AnalogList; + +private: + std::shared_ptr analog_list; + std::atomic x_axis{0.0f}; + std::atomic y_axis{0.0f}; +}; + +struct AnalogPair { + int analog_id; + Joystick* key_button; +}; + +class AnalogList { +public: + void AddButton(int analog_id, Joystick* key_button) { + std::lock_guard guard(mutex); + list.push_back(AnalogPair{analog_id, key_button}); + } + + void RemoveButton(const Joystick* key_button) { + std::lock_guard guard(mutex); + list.remove_if( + [key_button](const AnalogPair& pair) { return pair.key_button == key_button; }); + } + + bool ChangeJoystickStatus(int analog_id, float x, float y) { + std::lock_guard guard(mutex); + bool button_found = false; + for (const AnalogPair& pair : list) { + if (pair.analog_id == analog_id) { + pair.key_button->x_axis.store(x); + pair.key_button->y_axis.store(y); + button_found = true; + } + } + return button_found; + } + +private: + std::mutex mutex; + std::list list; +}; + +AnalogFactory::AnalogFactory() : analog_list{std::make_shared()} {} + +Joystick::~Joystick() { + analog_list->RemoveButton(this); +} + +ButtonFactory::ButtonFactory() + : button_list{std::make_shared()}, analog_button_list{ + std::make_shared()} {} + +std::unique_ptr ButtonFactory::Create(const Common::ParamPackage& params) { + if (params.Has("axis")) { + const int axis_id = params.Get("axis", 0); + const float threshold = params.Get("threshold", 0.5f); + const std::string direction_name = params.Get("direction", ""); + bool trigger_if_greater; + if (direction_name == "+") { + trigger_if_greater = true; + } else if (direction_name == "-") { + trigger_if_greater = false; + } else { + trigger_if_greater = true; + LOG_ERROR(Input, "Unknown direction {}", direction_name); + } + std::unique_ptr analog_button = + std::make_unique(analog_button_list, threshold, trigger_if_greater); + analog_button_list->AddAnalogButton(axis_id, analog_button.get()); + return std::move(analog_button); + } + + int button_id = params.Get("code", 0); + std::unique_ptr key_button = std::make_unique(button_list); + button_list->AddButton(button_id, key_button.get()); + return std::move(key_button); +} + +bool ButtonFactory::PressKey(int button_id) { + return button_list->ChangeButtonStatus(button_id, true); +} + +bool ButtonFactory::ReleaseKey(int button_id) { + return button_list->ChangeButtonStatus(button_id, false); +} + +bool ButtonFactory::AnalogButtonEvent(int axis_id, float axis_val) { + return analog_button_list->ChangeAxisValue(axis_id, axis_val); +} + +std::unique_ptr AnalogFactory::Create(const Common::ParamPackage& params) { + int analog_id = params.Get("code", 0); + std::unique_ptr analog = std::make_unique(analog_list); + analog_list->AddButton(analog_id, analog.get()); + return std::move(analog); +} + +bool AnalogFactory::MoveJoystick(int analog_id, float x, float y) { + return analog_list->ChangeJoystickStatus(analog_id, x, y); +} + +ButtonFactory* ButtonHandler() { + return button.get(); +} + +AnalogFactory* AnalogHandler() { + return analog.get(); +} + +std::string GenerateButtonParamPackage(int button) { + Common::ParamPackage param{ + {"engine", "gamepad"}, + {"code", std::to_string(button)}, + }; + return param.Serialize(); +} + +std::string GenerateAnalogButtonParamPackage(int axis, float axis_val) { + Common::ParamPackage param{ + {"engine", "gamepad"}, + {"axis", std::to_string(axis)}, + }; + if (axis_val > 0) { + param.Set("direction", "+"); + param.Set("threshold", "0.5"); + } else { + param.Set("direction", "-"); + param.Set("threshold", "-0.5"); + } + + return param.Serialize(); +} + +std::string GenerateAnalogParamPackage(int axis_id) { + Common::ParamPackage param{ + {"engine", "gamepad"}, + {"code", std::to_string(axis_id)}, + }; + return param.Serialize(); +} + +NDKMotionFactory* NDKMotionHandler() { + return motion.get(); +} + +void Init() { + button = std::make_shared(); + analog = std::make_shared(); + motion = std::make_shared(); + Input::RegisterFactory("gamepad", button); + Input::RegisterFactory("gamepad", analog); + Input::RegisterFactory("motion_emu", motion); +} + +void Shutdown() { + Input::UnregisterFactory("gamepad"); + Input::UnregisterFactory("gamepad"); + Input::UnregisterFactory("motion_emu"); + button.reset(); + analog.reset(); + motion.reset(); +} + +} // namespace InputManager diff --git a/src/android/app/src/main/jni/input_manager.h b/src/android/app/src/main/jni/input_manager.h new file mode 100644 index 000000000..637eeb67b --- /dev/null +++ b/src/android/app/src/main/jni/input_manager.h @@ -0,0 +1,141 @@ +// Copyright 2013 Dolphin Emulator Project / 2017 Citra Emulator Project +// Licensed under GPLv2+ +// Refer to the license.txt file included. + +#pragma once + +#include +#include +#include +#include "core/frontend/input.h" +#include "jni/ndk_motion.h" + +namespace InputManager { + +enum ButtonType { + // 3DS Controls + N3DS_BUTTON_A = 700, + N3DS_BUTTON_B = 701, + N3DS_BUTTON_X = 702, + N3DS_BUTTON_Y = 703, + N3DS_BUTTON_START = 704, + N3DS_BUTTON_SELECT = 705, + N3DS_BUTTON_HOME = 706, + N3DS_BUTTON_ZL = 707, + N3DS_BUTTON_ZR = 708, + N3DS_DPAD_UP = 709, + N3DS_DPAD_DOWN = 710, + N3DS_DPAD_LEFT = 711, + N3DS_DPAD_RIGHT = 712, + N3DS_CIRCLEPAD = 713, + N3DS_CIRCLEPAD_UP = 714, + N3DS_CIRCLEPAD_DOWN = 715, + N3DS_CIRCLEPAD_LEFT = 716, + N3DS_CIRCLEPAD_RIGHT = 717, + N3DS_STICK_C = 718, + N3DS_STICK_C_UP = 719, + N3DS_STICK_C_DOWN = 720, + N3DS_STICK_C_LEFT = 771, + N3DS_STICK_C_RIGHT = 772, + N3DS_TRIGGER_L = 773, + N3DS_TRIGGER_R = 774, + N3DS_BUTTON_DEBUG = 781, + N3DS_BUTTON_GPIO14 = 782 +}; + +class ButtonList; +class AnalogButtonList; +class AnalogList; + +/** + * A button device factory representing a gamepad. It receives input events and forward them + * to all button devices it created. + */ +class ButtonFactory final : public Input::Factory { +public: + ButtonFactory(); + + /** + * Creates a button device from a gamepad button + * @param params contains parameters for creating the device: + * - "code": the code of the key to bind with the button + */ + std::unique_ptr Create(const Common::ParamPackage& params) override; + + /** + * Sets the status of all buttons bound with the key to pressed + * @param key_code the code of the key to press + * @return whether the key event is consumed or not + */ + bool PressKey(int button_id); + + /** + * Sets the status of all buttons bound with the key to released + * @param key_code the code of the key to release + * @return whether the key event is consumed or not + */ + bool ReleaseKey(int button_id); + + /** + * Sets the status of all buttons bound with the key to released + * @param axis_id the code of the axis + * @param axis_val the value of the axis + * @return whether the key event is consumed or not + */ + bool AnalogButtonEvent(int axis_id, float axis_val); + + void ReleaseAllKeys(); + +private: + std::shared_ptr button_list; + std::shared_ptr analog_button_list; +}; + +/** + * An analog device factory representing a gamepad(virtual or physical). It receives input events + * and forward them to all analog devices it created. + */ +class AnalogFactory final : public Input::Factory { +public: + AnalogFactory(); + + /** + * Creates an analog device from the gamepad joystick + * @param params contains parameters for creating the device: + * - "code": the code of the key to bind with the button + */ + std::unique_ptr Create(const Common::ParamPackage& params) override; + + /** + * Sets the status of all buttons bound with the key to pressed + * @param key_code the code of the analog stick + * @param x the x-axis value of the analog stick + * @param y the y-axis value of the analog stick + */ + bool MoveJoystick(int analog_id, float x, float y); + +private: + std::shared_ptr analog_list; +}; + +/// Initializes and registers all built-in input device factories. +void Init(); + +/// Deregisters all built-in input device factories and shuts them down. +void Shutdown(); + +/// Gets the gamepad button device factory. +ButtonFactory* ButtonHandler(); + +/// Gets the gamepad analog device factory. +AnalogFactory* AnalogHandler(); + +/// Gets the NDK Motion device factory. +NDKMotionFactory* NDKMotionHandler(); + +std::string GenerateButtonParamPackage(int type); + +std::string GenerateAnalogButtonParamPackage(int axis, float axis_val); + +std::string GenerateAnalogParamPackage(int type); +} // namespace InputManager diff --git a/src/android/app/src/main/jni/mic.cpp b/src/android/app/src/main/jni/mic.cpp new file mode 100644 index 000000000..90191fbcf --- /dev/null +++ b/src/android/app/src/main/jni/mic.cpp @@ -0,0 +1,38 @@ +// Copyright 2020 Citra Emulator Project +// Licensed under GPLv2 or any later version +// Refer to the license.txt file included. + +#include +#include "common/logging/log.h" +#include "jni/id_cache.h" +#include "jni/mic.h" + +#ifdef HAVE_CUBEB +#include "audio_core/cubeb_input.h" +#endif + +namespace Mic { + +AndroidFactory::~AndroidFactory() = default; + +std::unique_ptr AndroidFactory::Create(std::string mic_device_name) { +#ifdef HAVE_CUBEB + if (!permission_granted) { + JNIEnv* env = IDCache::GetEnvForThread(); + permission_granted = env->CallStaticBooleanMethod(IDCache::GetNativeLibraryClass(), + IDCache::GetRequestMicPermission()); + } + + if (permission_granted) { + return std::make_unique(std::move(mic_device_name)); + } else { + LOG_WARNING(Frontend, "Mic permissions denied"); + return std::make_unique(); + } +#else + LOG_WARNING(Frontend, "No cubeb support"); + return std::make_unique(); +#endif +} + +} // namespace Mic diff --git a/src/android/app/src/main/jni/mic.h b/src/android/app/src/main/jni/mic.h new file mode 100644 index 000000000..d790d52e5 --- /dev/null +++ b/src/android/app/src/main/jni/mic.h @@ -0,0 +1,21 @@ +// Copyright 2020 Citra Emulator Project +// Licensed under GPLv2 or any later version +// Refer to the license.txt file included. + +#pragma once + +#include "core/frontend/mic.h" + +namespace Mic { + +class AndroidFactory final : public Frontend::Mic::RealMicFactory { +public: + ~AndroidFactory() override; + + std::unique_ptr Create(std::string mic_device_name) override; + +private: + bool permission_granted = false; +}; + +} // namespace Mic diff --git a/src/android/app/src/main/jni/native.cpp b/src/android/app/src/main/jni/native.cpp new file mode 100644 index 000000000..9b7fb27a4 --- /dev/null +++ b/src/android/app/src/main/jni/native.cpp @@ -0,0 +1,728 @@ +// Copyright 2019 Citra Emulator Project +// Licensed under GPLv2 or any later version +// Refer to the license.txt file included. + +#include +#include +#include +#include + +#include + +#include "audio_core/dsp_interface.h" +#include "common/file_util.h" +#include "common/logging/log.h" +#include "common/microprofile.h" +#include "common/scm_rev.h" +#include "common/scope_exit.h" +#include "common/string_util.h" +#include "core/core.h" +#include "core/frontend/applets/default_applets.h" +#include "core/frontend/camera/factory.h" +#include "core/frontend/mic.h" +#include "core/frontend/scope_acquire_context.h" +#include "core/hle/service/am/am.h" +#include "core/hle/service/nfc/nfc.h" +#include "core/savestate.h" +#include "core/settings.h" +#include "jni/applets/mii_selector.h" +#include "jni/applets/swkbd.h" +#include "jni/camera/ndk_camera.h" +#include "jni/camera/still_image_camera.h" +#include "jni/config.h" +#include "jni/emu_window/emu_window.h" +#include "jni/game_info.h" +#include "jni/game_settings.h" +#include "jni/id_cache.h" +#include "jni/input_manager.h" +#include "jni/mic.h" +#include "jni/native.h" +#include "jni/ndk_motion.h" +#include "video_core/renderer_base.h" +#include "video_core/renderer_opengl/texture_filters/texture_filterer.h" + +namespace { + +ANativeWindow* s_surf; + +std::unique_ptr window; + +std::atomic stop_run{true}; +std::atomic pause_emulation{false}; + +std::mutex paused_mutex; +std::mutex running_mutex; +std::condition_variable running_cv; + +} // Anonymous namespace + +static std::string GetJString(JNIEnv* env, jstring jstr) { + if (!jstr) { + return {}; + } + + const char* s = env->GetStringUTFChars(jstr, nullptr); + std::string result = s; + env->ReleaseStringUTFChars(jstr, s); + return result; +} + +static bool DisplayAlertMessage(const char* caption, const char* text, bool yes_no) { + JNIEnv* env = IDCache::GetEnvForThread(); + + // Execute the Java method. + jboolean result = env->CallStaticBooleanMethod( + IDCache::GetNativeLibraryClass(), IDCache::GetDisplayAlertMsg(), env->NewStringUTF(caption), + env->NewStringUTF(text), yes_no ? JNI_TRUE : JNI_FALSE); + + return result != JNI_FALSE; +} + +static std::string DisplayAlertPrompt(const char* caption, const char* text, int buttonConfig) { + JNIEnv* env = IDCache::GetEnvForThread(); + + jstring value = reinterpret_cast(env->CallStaticObjectMethod( + IDCache::GetNativeLibraryClass(), IDCache::GetDisplayAlertPrompt(), + env->NewStringUTF(caption), env->NewStringUTF(text), buttonConfig)); + + return GetJString(env, value); +} + +static int AlertPromptButton() { + JNIEnv* env = IDCache::GetEnvForThread(); + + // Execute the Java method. + return static_cast(env->CallStaticIntMethod(IDCache::GetNativeLibraryClass(), + IDCache::GetAlertPromptButton())); +} + +static jobject ToJavaCoreError(Core::System::ResultStatus result) { + static const std::map CoreErrorNameMap{ + {Core::System::ResultStatus::ErrorSystemFiles, "ErrorSystemFiles"}, + {Core::System::ResultStatus::ErrorSavestate, "ErrorSavestate"}, + {Core::System::ResultStatus::ErrorUnknown, "ErrorUnknown"}, + }; + + const auto name = CoreErrorNameMap.count(result) ? CoreErrorNameMap.at(result) : "ErrorUnknown"; + + JNIEnv* env = IDCache::GetEnvForThread(); + const jclass core_error_class = IDCache::GetCoreErrorClass(); + return env->GetStaticObjectField( + core_error_class, env->GetStaticFieldID(core_error_class, name, + "Lorg/citra/citra_emu/NativeLibrary$CoreError;")); +} + +static bool HandleCoreError(Core::System::ResultStatus result, const std::string& details) { + JNIEnv* env = IDCache::GetEnvForThread(); + return env->CallStaticBooleanMethod(IDCache::GetNativeLibraryClass(), IDCache::GetOnCoreError(), + ToJavaCoreError(result), + env->NewStringUTF(details.c_str())) != JNI_FALSE; +} + +static void LoadDiskCacheProgress(VideoCore::LoadCallbackStage stage, int progress, int max) { + JNIEnv* env = IDCache::GetEnvForThread(); + env->CallStaticVoidMethod(IDCache::GetDiskCacheProgressClass(), + IDCache::GetDiskCacheLoadProgress(), + IDCache::GetJavaLoadCallbackStage(stage), static_cast(progress), + static_cast(max)); +} + +static Camera::NDK::Factory* g_ndk_factory{}; + +static void TryShutdown() { + if (!window) { + return; + } + + window->DoneCurrent(); + Core::System::GetInstance().Shutdown(); + window.reset(); + InputManager::Shutdown(); + MicroProfileShutdown(); +} + +static Core::System::ResultStatus RunCitra(const std::string& filepath) { + // Citra core only supports a single running instance + std::lock_guard lock(running_mutex); + + LOG_INFO(Frontend, "Citra is Starting"); + + MicroProfileOnThreadCreate("EmuThread"); + + if (filepath.empty()) { + LOG_CRITICAL(Frontend, "Failed to load ROM: No ROM specified"); + return Core::System::ResultStatus::ErrorLoader; + } + + window = std::make_unique(s_surf); + + Core::System& system{Core::System::GetInstance()}; + + // Forces a config reload on game boot, if the user changed settings in the UI + Config{}; + // Replace with game-specific settings + u64 program_id{}; + FileUtil::SetCurrentRomPath(filepath); + auto app_loader = Loader::GetLoader(filepath); + if (app_loader) { + app_loader->ReadProgramId(program_id); + GameSettings::LoadOverrides(program_id); + } + Settings::Apply(); + + Camera::RegisterFactory("image", std::make_unique()); + + auto ndk_factory = std::make_unique(); + g_ndk_factory = ndk_factory.get(); + Camera::RegisterFactory("ndk", std::move(ndk_factory)); + + // Register frontend applets + Frontend::RegisterDefaultApplets(); + system.RegisterMiiSelector(std::make_shared()); + system.RegisterSoftwareKeyboard(std::make_shared()); + + // Register real Mic factory + Frontend::Mic::RegisterRealMicFactory(std::make_unique()); + + InputManager::Init(); + + window->MakeCurrent(); + const Core::System::ResultStatus load_result{system.Load(*window, filepath)}; + if (load_result != Core::System::ResultStatus::Success) { + return load_result; + } + + auto& telemetry_session = Core::System::GetInstance().TelemetrySession(); + telemetry_session.AddField(Common::Telemetry::FieldType::App, "Frontend", "SDL"); + + stop_run = false; + pause_emulation = false; + + LoadDiskCacheProgress(VideoCore::LoadCallbackStage::Prepare, 0, 0); + + std::unique_ptr cpu_context; + if (Settings::values.use_asynchronous_gpu_emulation) { + cpu_context = window->CreateSharedContext(); + cpu_context->MakeCurrent(); + } + + system.Renderer().Rasterizer()->LoadDiskResources(stop_run, &LoadDiskCacheProgress); + + if (Settings::values.use_asynchronous_gpu_emulation) { + cpu_context->DoneCurrent(); + cpu_context.reset(); + } + + LoadDiskCacheProgress(VideoCore::LoadCallbackStage::Complete, 0, 0); + + SCOPE_EXIT({ TryShutdown(); }); + + // Audio stretching on Android is only useful with lower framerates, disable it when fullspeed + Core::TimingEventType* audio_stretching_event{}; + const s64 audio_stretching_ticks{msToCycles(500)}; + audio_stretching_event = + system.CoreTiming().RegisterEvent("AudioStretchingEvent", [&](u64, s64 cycles_late) { + if (Settings::values.enable_audio_stretching) { + Core::DSP().EnableStretching( + Core::System::GetInstance().GetAndResetPerfStats().emulation_speed < 0.95); + } + + system.CoreTiming().ScheduleEvent(audio_stretching_ticks - cycles_late, + audio_stretching_event); + }); + system.CoreTiming().ScheduleEvent(audio_stretching_ticks, audio_stretching_event); + + // Start running emulation + while (!stop_run) { + if (!pause_emulation) { + const auto result = system.RunLoop(); + if (result == Core::System::ResultStatus::Success) { + continue; + } + if (result == Core::System::ResultStatus::ShutdownRequested) { + return result; // This also exits the emulation activity + } else { + InputManager::NDKMotionHandler()->DisableSensors(); + if (!HandleCoreError(result, system.GetStatusDetails())) { + // Frontend requests us to abort + return result; + } + InputManager::NDKMotionHandler()->EnableSensors(); + } + } else { + // Ensure no audio bleeds out while game is paused + const float volume = Settings::values.volume; + SCOPE_EXIT({ Settings::values.volume = volume; }); + Settings::values.volume = 0; + + std::unique_lock pause_lock(paused_mutex); + running_cv.wait(pause_lock, [] { return !pause_emulation || stop_run; }); + window->PollEvents(); + } + } + + return Core::System::ResultStatus::Success; +} + +extern "C" { + +void Java_org_citra_citra_1emu_NativeLibrary_SurfaceChanged(JNIEnv* env, + [[maybe_unused]] jclass clazz, + jobject surf) { + s_surf = ANativeWindow_fromSurface(env, surf); + + if (window) { + window->OnSurfaceChanged(s_surf); + } + + LOG_INFO(Frontend, "Surface changed"); +} + +void Java_org_citra_citra_1emu_NativeLibrary_SurfaceDestroyed(JNIEnv* env, + [[maybe_unused]] jclass clazz) { + ANativeWindow_release(s_surf); + s_surf = nullptr; + if (window) { + window->OnSurfaceChanged(s_surf); + } +} + +void Java_org_citra_citra_1emu_NativeLibrary_DoFrame(JNIEnv* env, [[maybe_unused]] jclass clazz) { + if (stop_run || pause_emulation) { + return; + } + window->TryPresenting(); +} + +void Java_org_citra_citra_1emu_NativeLibrary_NotifyOrientationChange(JNIEnv* env, + [[maybe_unused]] jclass clazz, + jint layout_option, + jint rotation) { + Settings::values.layout_option = static_cast(layout_option); + if (VideoCore::g_renderer) { + VideoCore::g_renderer->UpdateCurrentFramebufferLayout(!(rotation % 2)); + } + InputManager::screen_rotation = rotation; + Camera::NDK::g_rotation = rotation; +} + +void Java_org_citra_citra_1emu_NativeLibrary_SwapScreens(JNIEnv* env, [[maybe_unused]] jclass clazz, + jboolean swap_screens, jint rotation) { + Settings::values.swap_screen = swap_screens; + if (VideoCore::g_renderer) { + VideoCore::g_renderer->UpdateCurrentFramebufferLayout(!(rotation % 2)); + } + InputManager::screen_rotation = rotation; + Camera::NDK::g_rotation = rotation; +} + +void Java_org_citra_citra_1emu_NativeLibrary_SetUserDirectory(JNIEnv* env, + [[maybe_unused]] jclass clazz, + jstring j_directory) { + FileUtil::SetCurrentDir(GetJString(env, j_directory)); +} + +jobjectArray Java_org_citra_citra_1emu_NativeLibrary_GetInstalledGamePaths( + JNIEnv* env, [[maybe_unused]] jclass clazz) { + std::vector games; + const FileUtil::DirectoryEntryCallable ScanDir = + [&games, &ScanDir](u64*, const std::string& directory, const std::string& virtual_name) { + std::string path = directory + virtual_name; + if (FileUtil::IsDirectory(path)) { + path += '/'; + FileUtil::ForeachDirectoryEntry(nullptr, path, ScanDir); + } else { + auto loader = Loader::GetLoader(path); + if (loader) { + bool executable{}; + const Loader::ResultStatus result = loader->IsExecutable(executable); + if (Loader::ResultStatus::Success == result && executable) { + games.emplace_back(path); + } + } + } + return true; + }; + ScanDir(nullptr, "", + FileUtil::GetUserPath(FileUtil::UserPath::SDMCDir) + + "Nintendo " + "3DS/00000000000000000000000000000000/" + "00000000000000000000000000000000/title/00040000"); + ScanDir(nullptr, "", + FileUtil::GetUserPath(FileUtil::UserPath::NANDDir) + + "00000000000000000000000000000000/title/00040010"); + jobjectArray jgames = env->NewObjectArray(static_cast(games.size()), + env->FindClass("java/lang/String"), nullptr); + for (jsize i = 0; i < games.size(); ++i) + env->SetObjectArrayElement(jgames, i, env->NewStringUTF(games[i].c_str())); + return jgames; +} + +// TODO(xperia64): ensure these cannot be called in an invalid state (e.g. after StopEmulation) +void Java_org_citra_citra_1emu_NativeLibrary_UnPauseEmulation(JNIEnv* env, + [[maybe_unused]] jclass clazz) { + pause_emulation = false; + running_cv.notify_all(); + InputManager::NDKMotionHandler()->EnableSensors(); +} + +void Java_org_citra_citra_1emu_NativeLibrary_PauseEmulation(JNIEnv* env, + [[maybe_unused]] jclass clazz) { + pause_emulation = true; + InputManager::NDKMotionHandler()->DisableSensors(); +} + +void Java_org_citra_citra_1emu_NativeLibrary_StopEmulation(JNIEnv* env, + [[maybe_unused]] jclass clazz) { + stop_run = true; + pause_emulation = false; + window->StopPresenting(); + running_cv.notify_all(); +} + +jboolean Java_org_citra_citra_1emu_NativeLibrary_IsRunning(JNIEnv* env, + [[maybe_unused]] jclass clazz) { + return static_cast(!stop_run); +} + +jboolean Java_org_citra_citra_1emu_NativeLibrary_onGamePadEvent(JNIEnv* env, + [[maybe_unused]] jclass clazz, + jstring j_device, jint j_button, + jint action) { + bool consumed{}; + if (action) { + consumed = InputManager::ButtonHandler()->PressKey(j_button); + } else { + consumed = InputManager::ButtonHandler()->ReleaseKey(j_button); + } + + return static_cast(consumed); +} + +jboolean Java_org_citra_citra_1emu_NativeLibrary_onGamePadMoveEvent(JNIEnv* env, + [[maybe_unused]] jclass clazz, + jstring j_device, jint axis, + jfloat x, jfloat y) { + // Clamp joystick movement to supported minimum and maximum + // Citra uses an inverted y axis sent by the frontend + x = std::clamp(x, -1.f, 1.f); + y = std::clamp(-y, -1.f, 1.f); + + // Clamp the input to a circle (while touch input is already clamped in the frontend, gamepad is + // unknown) + float r = x * x + y * y; + if (r > 1.0f) { + r = std::sqrt(r); + x /= r; + y /= r; + } + return static_cast(InputManager::AnalogHandler()->MoveJoystick(axis, x, y)); +} + +jboolean Java_org_citra_citra_1emu_NativeLibrary_onGamePadAxisEvent(JNIEnv* env, + [[maybe_unused]] jclass clazz, + jstring j_device, jint axis_id, + jfloat axis_val) { + return static_cast( + InputManager::ButtonHandler()->AnalogButtonEvent(axis_id, axis_val)); +} + +jboolean Java_org_citra_citra_1emu_NativeLibrary_onTouchEvent(JNIEnv* env, + [[maybe_unused]] jclass clazz, + jfloat x, jfloat y, + jboolean pressed) { + return static_cast( + window->OnTouchEvent(static_cast(x + 0.5), static_cast(y + 0.5), pressed)); +} + +void Java_org_citra_citra_1emu_NativeLibrary_onTouchMoved(JNIEnv* env, + [[maybe_unused]] jclass clazz, jfloat x, + jfloat y) { + window->OnTouchMoved((int)x, (int)y); +} + +jintArray Java_org_citra_citra_1emu_NativeLibrary_GetIcon(JNIEnv* env, + [[maybe_unused]] jclass clazz, + jstring j_file) { + std::string filepath = GetJString(env, j_file); + + std::vector icon_data = GameInfo::GetIcon(filepath); + if (icon_data.size() == 0) { + return 0; + } + + jintArray icon = env->NewIntArray(static_cast(icon_data.size() / 2)); + env->SetIntArrayRegion(icon, 0, env->GetArrayLength(icon), + reinterpret_cast(icon_data.data())); + + return icon; +} + +jstring Java_org_citra_citra_1emu_NativeLibrary_GetTitle(JNIEnv* env, [[maybe_unused]] jclass clazz, + jstring j_filename) { + std::string filepath = GetJString(env, j_filename); + auto Title = GameInfo::GetTitle(filepath); + return env->NewStringUTF(Common::UTF16ToUTF8(Title).data()); +} + +jstring Java_org_citra_citra_1emu_NativeLibrary_GetDescription(JNIEnv* env, + [[maybe_unused]] jclass clazz, + jstring j_filename) { + return j_filename; +} + +jstring Java_org_citra_citra_1emu_NativeLibrary_GetGameId(JNIEnv* env, + [[maybe_unused]] jclass clazz, + jstring j_filename) { + return j_filename; +} + +jstring Java_org_citra_citra_1emu_NativeLibrary_GetRegions(JNIEnv* env, + [[maybe_unused]] jclass clazz, + jstring j_filename) { + std::string filepath = GetJString(env, j_filename); + + std::string regions = GameInfo::GetRegions(filepath); + + return env->NewStringUTF(regions.c_str()); +} + +jstring Java_org_citra_citra_1emu_NativeLibrary_GetCompany(JNIEnv* env, + [[maybe_unused]] jclass clazz, + jstring j_filename) { + std::string filepath = GetJString(env, j_filename); + auto publisher = GameInfo::GetPublisher(filepath); + return env->NewStringUTF(Common::UTF16ToUTF8(publisher).data()); +} + +jstring Java_org_citra_citra_1emu_NativeLibrary_GetGitRevision(JNIEnv* env, + [[maybe_unused]] jclass clazz) { + return nullptr; +} + +void Java_org_citra_citra_1emu_NativeLibrary_CreateConfigFile(JNIEnv* env, + [[maybe_unused]] jclass clazz) { + Config{}; +} + +jint Java_org_citra_citra_1emu_NativeLibrary_DefaultCPUCore(JNIEnv* env, + [[maybe_unused]] jclass clazz) { + return 0; +} + +void Java_org_citra_citra_1emu_NativeLibrary_Run__Ljava_lang_String_2Ljava_lang_String_2Z( + JNIEnv* env, [[maybe_unused]] jclass clazz, jstring j_file, jstring j_savestate, + jboolean j_delete_savestate) {} + +void Java_org_citra_citra_1emu_NativeLibrary_ReloadSettings(JNIEnv* env, + [[maybe_unused]] jclass clazz) { + Config{}; + Core::System& system{Core::System::GetInstance()}; + + // Replace with game-specific settings + if (system.IsPoweredOn()) { + u64 program_id{}; + system.GetAppLoader().ReadProgramId(program_id); + GameSettings::LoadOverrides(program_id); + } + + Settings::Apply(); +} + +jstring Java_org_citra_citra_1emu_NativeLibrary_GetUserSetting(JNIEnv* env, + [[maybe_unused]] jclass clazz, + jstring j_game_id, jstring j_section, + jstring j_key) { + std::string_view game_id = env->GetStringUTFChars(j_game_id, 0); + std::string_view section = env->GetStringUTFChars(j_section, 0); + std::string_view key = env->GetStringUTFChars(j_key, 0); + + // TODO + + env->ReleaseStringUTFChars(j_game_id, game_id.data()); + env->ReleaseStringUTFChars(j_section, section.data()); + env->ReleaseStringUTFChars(j_key, key.data()); + + return env->NewStringUTF(""); +} + +void Java_org_citra_citra_1emu_NativeLibrary_SetUserSetting(JNIEnv* env, + [[maybe_unused]] jclass clazz, + jstring j_game_id, jstring j_section, + jstring j_key, jstring j_value) { + std::string_view game_id = env->GetStringUTFChars(j_game_id, 0); + std::string_view section = env->GetStringUTFChars(j_section, 0); + std::string_view key = env->GetStringUTFChars(j_key, 0); + std::string_view value = env->GetStringUTFChars(j_value, 0); + + // TODO + + env->ReleaseStringUTFChars(j_game_id, game_id.data()); + env->ReleaseStringUTFChars(j_section, section.data()); + env->ReleaseStringUTFChars(j_key, key.data()); + env->ReleaseStringUTFChars(j_value, value.data()); +} + +void Java_org_citra_citra_1emu_NativeLibrary_InitGameIni(JNIEnv* env, [[maybe_unused]] jclass clazz, + jstring j_game_id) { + std::string_view game_id = env->GetStringUTFChars(j_game_id, 0); + + // TODO + + env->ReleaseStringUTFChars(j_game_id, game_id.data()); +} + +jdoubleArray Java_org_citra_citra_1emu_NativeLibrary_GetPerfStats(JNIEnv* env, + [[maybe_unused]] jclass clazz) { + auto& core = Core::System::GetInstance(); + jdoubleArray j_stats = env->NewDoubleArray(4); + + if (core.IsPoweredOn()) { + auto results = core.GetAndResetPerfStats(); + + // Converting the structure into an array makes it easier to pass it to the frontend + double stats[4] = {results.system_fps, results.game_fps, results.frametime, + results.emulation_speed}; + + env->SetDoubleArrayRegion(j_stats, 0, 4, stats); + } + + return j_stats; +} + +void Java_org_citra_citra_1emu_utils_DirectoryInitialization_SetSysDirectory( + JNIEnv* env, [[maybe_unused]] jclass clazz, jstring j_path) { + std::string_view path = env->GetStringUTFChars(j_path, 0); + + env->ReleaseStringUTFChars(j_path, path.data()); +} + +void Java_org_citra_citra_1emu_NativeLibrary_Run__Ljava_lang_String_2(JNIEnv* env, + [[maybe_unused]] jclass clazz, + jstring j_path) { + const std::string path = GetJString(env, j_path); + + if (!stop_run) { + stop_run = true; + running_cv.notify_all(); + } + + const Core::System::ResultStatus result{RunCitra(path)}; + if (result != Core::System::ResultStatus::Success) { + env->CallStaticVoidMethod(IDCache::GetNativeLibraryClass(), + IDCache::GetExitEmulationActivity(), static_cast(result)); + } +} + +jobjectArray Java_org_citra_citra_1emu_NativeLibrary_GetTextureFilterNames(JNIEnv* env, + jclass clazz) { + auto names = OpenGL::TextureFilterer::GetFilterNames(); + jobjectArray ret = (jobjectArray)env->NewObjectArray(static_cast(names.size()), + env->FindClass("java/lang/String"), + env->NewStringUTF("")); + for (jsize i = 0; i < names.size(); ++i) + env->SetObjectArrayElement(ret, i, env->NewStringUTF(names[i].data())); + return ret; +} + +void Java_org_citra_citra_1emu_NativeLibrary_ReloadCameraDevices(JNIEnv* env, jclass clazz) { + if (g_ndk_factory) { + g_ndk_factory->ReloadCameraDevices(); + } +} + +jboolean Java_org_citra_citra_1emu_NativeLibrary_LoadAmiibo(JNIEnv* env, jclass clazz, + jbyteArray bytes) { + Core::System& system{Core::System::GetInstance()}; + Service::SM::ServiceManager& sm = system.ServiceManager(); + auto nfc = sm.GetService("nfc:u"); + if (nfc == nullptr || env->GetArrayLength(bytes) != sizeof(Service::NFC::AmiiboData)) { + return static_cast(false); + } + + Service::NFC::AmiiboData amiibo_data{}; + env->GetByteArrayRegion(bytes, 0, sizeof(Service::NFC::AmiiboData), + reinterpret_cast(&amiibo_data)); + + nfc->LoadAmiibo(amiibo_data); + return static_cast(true); +} + +void Java_org_citra_citra_1emu_NativeLibrary_RemoveAmiibo(JNIEnv* env, jclass clazz) { + Core::System& system{Core::System::GetInstance()}; + Service::SM::ServiceManager& sm = system.ServiceManager(); + auto nfc = sm.GetService("nfc:u"); + if (nfc == nullptr) { + return; + } + + nfc->RemoveAmiibo(); +} + +void Java_org_citra_citra_1emu_NativeLibrary_InstallCIAS(JNIEnv* env, [[maybe_unused]] jclass clazz, + jobjectArray path) { + const jsize count{env->GetArrayLength(path)}; + std::vector paths; + for (jsize idx{0}; idx < count; ++idx) { + paths.emplace_back( + GetJString(env, static_cast(env->GetObjectArrayElement(path, idx)))); + } + std::atomic idx{count}; + std::vector threads; + std::generate_n(std::back_inserter(threads), + std::min(std::thread::hardware_concurrency(), count), [&] { + return std::thread{[&idx, &paths, env] { + jsize work_idx; + while ((work_idx = --idx) >= 0) { + LOG_INFO(Frontend, "Installing CIA {}", work_idx); + Service::AM::InstallCIA(paths[work_idx]); + } + }}; + }); + for (auto& thread : threads) + thread.join(); +} + +jobjectArray Java_org_citra_citra_1emu_NativeLibrary_GetSavestateInfo( + JNIEnv* env, [[maybe_unused]] jclass clazz) { + const jclass date_class = env->FindClass("java/util/Date"); + const auto date_constructor = env->GetMethodID(date_class, "", "(J)V"); + + const jclass savestate_info_class = IDCache::GetSavestateInfoClass(); + const auto slot_field = env->GetFieldID(savestate_info_class, "slot", "I"); + const auto date_field = env->GetFieldID(savestate_info_class, "time", "Ljava/util/Date;"); + + const Core::System& system{Core::System::GetInstance()}; + if (!system.IsPoweredOn()) { + return nullptr; + } + + u64 title_id; + if (system.GetAppLoader().ReadProgramId(title_id) != Loader::ResultStatus::Success) { + return nullptr; + } + + const auto savestates = Core::ListSaveStates(title_id); + const jobjectArray array = + env->NewObjectArray(static_cast(savestates.size()), savestate_info_class, nullptr); + for (std::size_t i = 0; i < savestates.size(); ++i) { + const jobject object = env->AllocObject(savestate_info_class); + env->SetIntField(object, slot_field, static_cast(savestates[i].slot)); + env->SetObjectField(object, date_field, + env->NewObject(date_class, date_constructor, + static_cast(savestates[i].time * 1000))); + + env->SetObjectArrayElement(array, i, object); + } + return array; +} + +void Java_org_citra_citra_1emu_NativeLibrary_SaveState(JNIEnv* env, jclass clazz, jint slot) { + Core::System::GetInstance().SendSignal(Core::System::Signal::Save, slot); +} + +void Java_org_citra_citra_1emu_NativeLibrary_LoadState(JNIEnv* env, jclass clazz, jint slot) { + Core::System::GetInstance().SendSignal(Core::System::Signal::Load, slot); +} + +} // extern "C" diff --git a/src/android/app/src/main/jni/native.h b/src/android/app/src/main/jni/native.h new file mode 100644 index 000000000..f02b15b35 --- /dev/null +++ b/src/android/app/src/main/jni/native.h @@ -0,0 +1,160 @@ +// Copyright 2019 Citra Emulator Project +// Licensed under GPLv2 or any later version +// Refer to the license.txt file included. + +#pragma once + +#include + +// Function calls from the Java side +#ifdef __cplusplus +extern "C" { +#endif + +JNIEXPORT void JNICALL Java_org_citra_citra_1emu_NativeLibrary_UnPauseEmulation(JNIEnv* env, + jclass clazz); + +JNIEXPORT void JNICALL Java_org_citra_citra_1emu_NativeLibrary_PauseEmulation(JNIEnv* env, + jclass clazz); + +JNIEXPORT void JNICALL Java_org_citra_citra_1emu_NativeLibrary_StopEmulation(JNIEnv* env, + jclass clazz); + +JNIEXPORT jboolean JNICALL Java_org_citra_citra_1emu_NativeLibrary_IsRunning(JNIEnv* env, + jclass clazz); + +JNIEXPORT jboolean JNICALL Java_org_citra_citra_1emu_NativeLibrary_onGamePadEvent( + JNIEnv* env, jclass clazz, jstring j_device, jint j_button, jint action); + +JNIEXPORT jboolean JNICALL Java_org_citra_citra_1emu_NativeLibrary_onGamePadMoveEvent( + JNIEnv* env, jclass clazz, jstring j_device, jint axis, jfloat x, jfloat y); + +JNIEXPORT jboolean JNICALL Java_org_citra_citra_1emu_NativeLibrary_onGamePadAxisEvent( + JNIEnv* env, jclass clazz, jstring j_device, jint axis_id, jfloat axis_val); + +JNIEXPORT jboolean JNICALL Java_org_citra_citra_1emu_NativeLibrary_onTouchEvent(JNIEnv* env, + jclass clazz, + jfloat x, jfloat y, + jboolean pressed); + +JNIEXPORT void JNICALL Java_org_citra_citra_1emu_NativeLibrary_onTouchMoved(JNIEnv* env, + jclass clazz, jfloat x, + jfloat y); + +JNIEXPORT jintArray JNICALL Java_org_citra_citra_1emu_NativeLibrary_GetIcon(JNIEnv* env, + jclass clazz, + jstring j_file); + +JNIEXPORT jstring JNICALL Java_org_citra_citra_1emu_NativeLibrary_GetTitle(JNIEnv* env, + jclass clazz, + jstring j_filename); + +JNIEXPORT jstring JNICALL Java_org_citra_citra_1emu_NativeLibrary_GetDescription( + JNIEnv* env, jclass clazz, jstring j_filename); + +JNIEXPORT jstring JNICALL Java_org_citra_citra_1emu_NativeLibrary_GetGameId(JNIEnv* env, + jclass clazz, + jstring j_filename); + +JNIEXPORT jstring JNICALL Java_org_citra_citra_1emu_NativeLibrary_GetRegions(JNIEnv* env, + jclass clazz, + jstring j_filename); + +JNIEXPORT jstring JNICALL Java_org_citra_citra_1emu_NativeLibrary_GetCompany(JNIEnv* env, + jclass clazz, + jstring j_filename); + +JNIEXPORT jstring JNICALL Java_org_citra_citra_1emu_NativeLibrary_GetGitRevision(JNIEnv* env, + jclass clazz); + +JNIEXPORT void JNICALL Java_org_citra_citra_1emu_NativeLibrary_SetUserDirectory( + JNIEnv* env, jclass clazz, jstring j_directory); + +JNIEXPORT jobjectArray JNICALL +Java_org_citra_citra_1emu_NativeLibrary_GetInstalledGamePaths(JNIEnv* env, jclass clazz); + +JNIEXPORT void JNICALL Java_org_citra_citra_1emu_utils_DirectoryInitialization_SetSysDirectory( + JNIEnv* env, jclass clazz, jstring path_); + +JNIEXPORT void JNICALL Java_org_citra_citra_1emu_NativeLibrary_SetSysDirectory(JNIEnv* env, + jclass clazz, + jstring path); + +JNIEXPORT void JNICALL Java_org_citra_citra_1emu_NativeLibrary_CreateConfigFile(JNIEnv* env, + jclass clazz); + +JNIEXPORT jint JNICALL Java_org_citra_citra_1emu_NativeLibrary_DefaultCPUCore(JNIEnv* env, + jclass clazz); +JNIEXPORT void JNICALL Java_org_citra_citra_1emu_NativeLibrary_SetProfiling(JNIEnv* env, + jclass clazz, + jboolean enable); + +JNIEXPORT void JNICALL Java_org_citra_citra_1emu_NativeLibrary_WriteProfileResults(JNIEnv* env, + jclass clazz); + +JNIEXPORT void JNICALL Java_org_citra_citra_1emu_NativeLibrary_NotifyOrientationChange( + JNIEnv* env, jclass clazz, jint layout_option, jint rotation); + +JNIEXPORT void JNICALL Java_org_citra_citra_1emu_NativeLibrary_SwapScreens(JNIEnv* env, + jclass clazz, + jboolean swap_screens, + jint rotation); + +JNIEXPORT void JNICALL Java_org_citra_citra_1emu_NativeLibrary_Run__Ljava_lang_String_2( + JNIEnv* env, jclass clazz, jstring j_path); + +JNIEXPORT void JNICALL +Java_org_citra_citra_1emu_NativeLibrary_Run__Ljava_lang_String_2Ljava_lang_String_2Z( + JNIEnv* env, jclass clazz, jstring j_file, jstring j_savestate, jboolean j_delete_savestate); + +JNIEXPORT void JNICALL Java_org_citra_citra_1emu_NativeLibrary_SurfaceChanged(JNIEnv* env, + jclass clazz, + jobject surf); + +JNIEXPORT void JNICALL Java_org_citra_citra_1emu_NativeLibrary_SurfaceDestroyed(JNIEnv* env, + jclass clazz); + +JNIEXPORT void JNICALL Java_org_citra_citra_1emu_NativeLibrary_InitGameIni(JNIEnv* env, + jclass clazz, + jstring j_game_id); + +JNIEXPORT void JNICALL Java_org_citra_citra_1emu_NativeLibrary_ReloadSettings(JNIEnv* env, + jclass clazz); + +JNIEXPORT void JNICALL Java_org_citra_citra_1emu_NativeLibrary_SetUserSetting( + JNIEnv* env, jclass clazz, jstring j_game_id, jstring j_section, jstring j_key, + jstring j_value); + +JNIEXPORT jstring JNICALL Java_org_citra_citra_1emu_NativeLibrary_GetUserSetting( + JNIEnv* env, jclass clazz, jstring game_id, jstring section, jstring key); + +JNIEXPORT jdoubleArray JNICALL Java_org_citra_citra_1emu_NativeLibrary_GetPerfStats(JNIEnv* env, + jclass clazz); + +JNIEXPORT jobjectArray JNICALL +Java_org_citra_citra_1emu_NativeLibrary_GetTextureFilterNames(JNIEnv* env, jclass clazz); + +JNIEXPORT void JNICALL Java_org_citra_citra_1emu_NativeLibrary_ReloadCameraDevices(JNIEnv* env, + jclass clazz); + +JNIEXPORT jboolean Java_org_citra_citra_1emu_NativeLibrary_LoadAmiibo(JNIEnv* env, jclass clazz, + jbyteArray bytes); + +JNIEXPORT void Java_org_citra_citra_1emu_NativeLibrary_RemoveAmiibo(JNIEnv* env, jclass clazz); + +JNIEXPORT void JNICALL Java_org_citra_citra_1emu_NativeLibrary_InstallCIAS(JNIEnv* env, + jclass clazz, + jobjectArray path); + +JNIEXPORT jobjectArray JNICALL +Java_org_citra_citra_1emu_NativeLibrary_GetSavestateInfo(JNIEnv* env, jclass clazz); + +JNIEXPORT void JNICALL Java_org_citra_citra_1emu_NativeLibrary_SaveState(JNIEnv* env, jclass clazz, + jint slot); + +JNIEXPORT void JNICALL Java_org_citra_citra_1emu_NativeLibrary_LoadState(JNIEnv* env, jclass clazz, + jint slot); + +#ifdef __cplusplus +} +#endif diff --git a/src/android/app/src/main/jni/ndk_motion.cpp b/src/android/app/src/main/jni/ndk_motion.cpp new file mode 100644 index 000000000..0eab444a9 --- /dev/null +++ b/src/android/app/src/main/jni/ndk_motion.cpp @@ -0,0 +1,196 @@ +#include +#include + +#include + +#include "common/assert.h" +#include "common/logging/log.h" +#include "common/vector_math.h" +#include "jni/native.h" +#include "jni/ndk_motion.h" + +namespace InputManager { + +namespace { +using Common::Vec3; +} + +class NDKMotion final : public Input::MotionDevice { + std::chrono::microseconds update_period; + + ASensorManager* sensor_manager = nullptr; + ALooper* looper = nullptr; + ASensorEventQueue* event_queue; + + mutable std::atomic> acceleration{}; + mutable std::atomic> rotation{}; + static_assert(decltype(acceleration)::is_always_lock_free, "vectors are not lock free"); + std::thread poll_thread; + std::atomic stop_polling = false; + + static Vec3 TransformAxes(Vec3 in) { + // 3DS Y+ Phone Z+ + // on | laying | + // table | in | + // |_______ X- portrait |_______ X+ + // / mode / + // / / + // Z- Y- + Vec3 out; + out.y = in.z; + // rotations are 90 degrees counter-clockwise from portrait + switch (screen_rotation) { + case 0: + out.x = -in.x; + out.z = in.y; + break; + case 1: + out.x = in.y; + out.z = in.x; + break; + case 2: + out.x = in.x; + out.z = -in.y; + break; + case 3: + out.x = -in.y; + out.z = -in.x; + break; + default: + UNREACHABLE(); + } + return out; + } + + void Construct() { + sensor_manager = ASensorManager_getInstanceForPackage("org.citra.citra_emu"); + looper = ALooper_prepare(ALOOPER_PREPARE_ALLOW_NON_CALLBACKS); + if (!sensor_manager || !looper) { + LOG_CRITICAL(Input, "Could not retrieve sensor manager"); + return; + } + event_queue = ASensorManager_createEventQueue(sensor_manager, looper, 0, nullptr, nullptr); + if (!event_queue) { + LOG_ERROR(Input, "Could not create sensor event queue"); + return; + } + + EnableSensors(); + } + + void Destruct() { + ASensorManager_destroyEventQueue(sensor_manager, event_queue); + } + + void Update() const { + ALooper_pollAll(0, nullptr, nullptr, nullptr); + ASensorEvent event{}; + std::optional> new_accel{}, new_rot{}; + while (ASensorEventQueue_getEvents(event_queue, &event, 1) > 0) { + if (event.type == ASENSOR_TYPE_ACCELEROMETER) { + new_accel.emplace(event.vector.x, event.vector.y, event.vector.z); + } else if (event.type == ASENSOR_TYPE_GYROSCOPE) { + new_rot.emplace(event.vector.x, event.vector.y, event.vector.z); + } + // occasionally the queue has ASENSOR_TYPE_ADDITIONAL_INFO events + // but so far there is no reason to handle them + } + if (new_accel) { + // convert from m/(s^2) to g and invert + acceleration = TransformAxes(*new_accel) / -ASENSOR_STANDARD_GRAVITY; + } + if (new_rot) { + // convert from rad/s to deg/s + rotation = TransformAxes(*new_rot) * 180.0f / static_cast(M_PI); + } + } + +public: + NDKMotion(std::chrono::microseconds update_period_, bool asynchronous = false) + : update_period(update_period_) { + if (asynchronous) { + poll_thread = std::thread([this] { + Construct(); + auto start = std::chrono::high_resolution_clock::now(); + while (!stop_polling) { + Update(); + std::this_thread::sleep_until(start += update_period); + } + Destruct(); + }); + } else { + Construct(); + } + } + + ~NDKMotion() { + if (std::thread::id{} == poll_thread.get_id()) { + Destruct(); + } else { + stop_polling = true; + poll_thread.join(); + } + } + + std::tuple, Vec3> GetStatus() const override { + if (std::thread::id{} == poll_thread.get_id()) { + Update(); + } + return {acceleration, rotation}; + } + + void EnableSensors() { + const auto init_sensor = [this](int sensor_type) { + ASensorRef sensor = ASensorManager_getDefaultSensor(sensor_manager, sensor_type); + if (!sensor) { + LOG_ERROR(Input, "Could not find sensor of type {}", sensor_type); + return; + } + int error = ASensorEventQueue_registerSensor( + event_queue, sensor, + std::max(ASensor_getMinDelay(sensor), static_cast(update_period.count())), 0); + if (error < 0) + LOG_ERROR(Input, "Registering sensor returned error code {}", error); + }; + + LOG_TRACE(Input, "Enabling sensors.."); + init_sensor(ASENSOR_TYPE_ACCELEROMETER); + init_sensor(ASENSOR_TYPE_GYROSCOPE); + } + + void DisableSensors() { + const auto disable_sensor = [this](int sensor_type) { + ASensorRef sensor = ASensorManager_getDefaultSensor(sensor_manager, sensor_type); + if (!sensor) { + LOG_ERROR(Input, "Could not find sensor of type {}", sensor_type); + return; + } + int error = ASensorEventQueue_disableSensor(event_queue, sensor); + if (error < 0) + LOG_ERROR(Input, "Disabling sensor returned error code {}", error); + }; + + LOG_TRACE(Input, "Disabling sensors.."); + disable_sensor(ASENSOR_TYPE_ACCELEROMETER); + disable_sensor(ASENSOR_TYPE_GYROSCOPE); + } +}; + +std::unique_ptr NDKMotionFactory::Create(const Common::ParamPackage& params) { + std::chrono::milliseconds update_period{params.Get("update_period", 4)}; + std::unique_ptr ndk_motion = std::make_unique(update_period); + ndk_motion_device = ndk_motion.get(); + return std::move(ndk_motion); +} + +void NDKMotionFactory::EnableSensors() { + if (ndk_motion_device) + ndk_motion_device->EnableSensors(); +} + +void NDKMotionFactory::DisableSensors() { + if (ndk_motion_device) + ndk_motion_device->DisableSensors(); +} + +} // namespace InputManager diff --git a/src/android/app/src/main/jni/ndk_motion.h b/src/android/app/src/main/jni/ndk_motion.h new file mode 100644 index 000000000..01a8f8d9c --- /dev/null +++ b/src/android/app/src/main/jni/ndk_motion.h @@ -0,0 +1,28 @@ +// Copyright 2020 Citra Emulator Project +// Licensed under GPLv2+ +// Refer to the license.txt file included. + +#pragma once + +#include "core/frontend/input.h" + +namespace InputManager { + +inline std::atomic screen_rotation; + +class NDKMotion; + +class NDKMotionFactory final : public Input::Factory { +public: + /** + * Creates a motion device that obtains data from device sensors + */ + std::unique_ptr Create(const Common::ParamPackage& params) override; + + void EnableSensors(); + void DisableSensors(); + +private: + NDKMotion* ndk_motion_device; +}; +} // namespace InputManager diff --git a/src/android/app/src/main/res/animator/settings_enter.xml b/src/android/app/src/main/res/animator/settings_enter.xml new file mode 100644 index 000000000..3c216a054 --- /dev/null +++ b/src/android/app/src/main/res/animator/settings_enter.xml @@ -0,0 +1,28 @@ + + + + + + + + + + \ No newline at end of file diff --git a/src/android/app/src/main/res/animator/settings_exit.xml b/src/android/app/src/main/res/animator/settings_exit.xml new file mode 100644 index 000000000..a233b6757 --- /dev/null +++ b/src/android/app/src/main/res/animator/settings_exit.xml @@ -0,0 +1,28 @@ + + + + + + + + + + \ No newline at end of file diff --git a/src/android/app/src/main/res/animator/settings_pop_enter.xml b/src/android/app/src/main/res/animator/settings_pop_enter.xml new file mode 100644 index 000000000..080bc27c4 --- /dev/null +++ b/src/android/app/src/main/res/animator/settings_pop_enter.xml @@ -0,0 +1,28 @@ + + + + + + + + + + \ No newline at end of file diff --git a/src/android/app/src/main/res/animator/setttings_pop_exit.xml b/src/android/app/src/main/res/animator/setttings_pop_exit.xml new file mode 100644 index 000000000..4fccbcca2 --- /dev/null +++ b/src/android/app/src/main/res/animator/setttings_pop_exit.xml @@ -0,0 +1,27 @@ + + + + + + + + + + \ No newline at end of file diff --git a/src/android/app/src/main/res/drawable-hdpi/button_a.png b/src/android/app/src/main/res/drawable-hdpi/button_a.png new file mode 100644 index 0000000000000000000000000000000000000000..f96a2061ef3f909b32fed8adda5494e290ad0af6 GIT binary patch literal 10674 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 literal 0 HcmV?d00001 diff --git a/src/android/app/src/main/res/drawable-hdpi/button_a_pressed.png b/src/android/app/src/main/res/drawable-hdpi/button_a_pressed.png new file mode 100644 index 0000000000000000000000000000000000000000..785a258ee54a7fc735d9dd18cdacae127bd9ef8e GIT binary patch literal 10738 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 literal 0 HcmV?d00001 diff --git a/src/android/app/src/main/res/drawable-hdpi/button_b_pressed.png b/src/android/app/src/main/res/drawable-hdpi/button_b_pressed.png new file mode 100644 index 0000000000000000000000000000000000000000..b11d5fcee19bfac7cb811ab0906bf5d65fb6291f GIT binary patch literal 9555 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 HRxke_Y5P>P literal 0 HcmV?d00001 diff --git a/src/android/app/src/main/res/drawable-hdpi/button_l.png b/src/android/app/src/main/res/drawable-hdpi/button_l.png new file mode 100644 index 0000000000000000000000000000000000000000..e19469a7b8b5bb40a2807bc4186134ac571dd7d1 GIT binary patch literal 2738 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 literal 0 HcmV?d00001 diff --git a/src/android/app/src/main/res/drawable-hdpi/button_l_pressed.png b/src/android/app/src/main/res/drawable-hdpi/button_l_pressed.png new file mode 100644 index 0000000000000000000000000000000000000000..280857f642e4dd2ffbd1df75ee30bb6de349deda GIT binary patch literal 2795 zcmbVOhgZ|d6aOZG1Q4WoAVtW91Wts6&_a+dEp#cNDJ3BwEwo6JV4~nJ911ASL#b9o zK;)37B%XMvG*3Yxh(^={Lkog{5a8nd?%f}7^R~_G>}Pgn-@KhXFApafDOD)|0AvWx z_THkI^Sw(zMWgqdI2ZtcT%&yhXaVkS=H!HUba+GpiGog#PZaF~fQ5B>VmLXLLW7ei zQPEUO#9}ua0gsNbMEIMy8@MMPq8y8M&P=BGWP13LGh@m42!yqjltsF^2q2z93x}u2 z$5B(v(=8EyyBGXWLNWzzf;QDBV~q{rI6N9_YJfL1 z)`J@wU~w1&90qHoZ-6y7Ff}*A!~Y?Kl@#0}IU>^B+urdXVl$72i(F@}cvA`ShN3@R-=U7wnw^&R5>81|GDa&mMcEjob;|Be|>N;pol zL?AHVjbQ$-fP!NJ7=?q8XKNa$-ATTuiw}%Qj5W6x&&Yn{N zxp3AKsfT%a@#Bh^R$AoerYS+{hoK0Is-=~c4dGSdT1P{-RolCE{sjL(5t4A>KeP&D zadB}a`VdA9?8pocQ!{{`9oa#TzIz8PnQeBp0XfeO6Sisx2@Dhukq9*d38O4E^{C;s z8;^gwqj>Q)y9!8^XIi?53FVf8mH5NaTdnw_QO$3-a=543*V9TCMcdWg$2`qq32$6ph3W^^-7+w&Gt{5iicjSe^8 z(2CQOXQEH;2Y%q~5%`5c)9aTa+1i|a9J;+=Q7bd_Ei{tpdf({D%h4ViIts;&O#p|& zLYmnN4W=BVKrRtu;6QU2dZnoX?V1{3m(L)!Kr4MJJSs1or%`tzxnM@NDG4^cm*X>FvJJxHg+Nv?%CT~*by3!Ql%s9dHlso!MN-rzqXWQo4 za=Fu&HoNd3ZN{*i%o|l~`xR^l_W1>5C*RDWYI;b&>t4>@_ti76#LT4CLBHqS@<=Hh z;^->n=Z=q$Kkn@8%)h_6_JmPud17_$*sSlfT7BQXedzLjNT}bDLaO8) z9cEwNLcI^ov$M;+>&_joMqk~8%7batT4DnQ$fz+f0dO5#7hB%h%0pp(I zq_G~}_OU<8eo5hH29}*iN)9rsDC4Tt&qry7V+-IOcQ-$}%OF^B=>sHvV;PELs z;Wee<)LrSU!oA}UavoUny@N{uPtXZQ>)3EJ`rZ$c0x|51O=yco;YeFhC9wG3C6q1F z%53yt++f)@wPQgekf2|Hcc?NY>;Ih#`N|@qIK><-PPBCP*CHa4qr)srqI4?MN5z?j zEkX(uQnHSmv9XLYlDw1OQ8x?54nA~j&K!zV;HmYp7O%Ny7mi?Gt959KFZA`RjDBd+ z0ckUb<&7*FS8v`p>Iu%uGvg1F!8iNjjX@en>LHqHgB2g5Mqun&*Gr0WsK>-1K^i(# zU3&QG>f)|fnUGGmv#V7ToT#f!?Qg@jC6bu^(xzFXPOpjq%2Yw-%Q1mpb)Y9$9Z|5| z8hk{le!i&`*nb}INb?HqB6?ZduLzI)*2Ug<-lo9A-oJmC9@i)~=J}?Vq^f8`k7*Q3 zFPQ<|YOB}to;a!xI>TysfaaO>@X7wJ3>f1Qv(vQ9A*Q3m&mZju>_=s^>K25A8kqk7*eh zovB|wKFx33URYXMs_iewU?_oQqO|R~wa-|A2N)F0(pT>jiFEGLgUVOVjQw?d@)o-v zMX(dyUzOW3Y*%Yjah!JTh zxNw!&@YP*b&K`Ug)Sc8e-BdP>CzHuq&G)}N3wA2h*djdWZ`BulUJau$@!8qg8F6v9 z-!yIAJ7kE*XB2fj{+#Qf>==7MDgU!jD10$6Fd#iY-xzxqa<<&%+OM8NU@Z>q{LSqW zrgXPWcaZ2+o_$JAT3eXJ(MUTPRWEfO?woWWjpC+vR*HzLOR`-h&J1xkK&Ga|Y}c=i zwy5L9B^?|6*F24jyr=lh-Zyq3j@wCH)=~QHuIg3W;;Wolj-lx(lK}6U3a}2NoiSgj zUpQil$F3f){X=3~8H?iPCYnej*G+Cll0U9FkWdn8k5t9ZL3Z*S!I#0?VsqlRDs@Xo zp!k-R;r+a}KRd12aK{{{SvA7ePg>~hO!>F?Z}SL&4=EAvW@rny}!@<7rf{5IWu$SJagZ3Z`XA_=dqFDl_Tsz>;Qlx*RET?q5A-+s1v;H9o(G!5qF$iaGt8- zE42;c2%Mv;xcNl`83S)ECs*9nAYUhwAVX7!AU6lBqqw>ny9z-WGT`ClZ;v2&xO@63 z6I8|jV^Iu%X$M)196}L`l2wqw%3+WQ zIT=|+w2UHJR$f|0R#`?tSssh{?;)R#y&Q zl$qnuHR9n_?bZ+7lgT`BCvOk>I2#*}{@X$roHwFfyES(PC&9fDu|9T9bPqZwJ~$-j z{&_k^R#K|K53+8Cj9_d$Lz09+ZnnJCN}pv3db^NuhEBHQ-10g<)RND&FO4B9>gAfLa98ja8Uo&k-_QW4EJFpFw+#JvKd64@+YE)}L zjUDiACc$`^Nu^==KKgt>3b;qtEzZI|i>X`Bwr8bzy&Wo7mf@ogRh?X`HC<{w0>@di0*nboIYa5L^-=##cBuS z%q_iJzQE`Llw+h5_wT*Hm|C@bNy6_+j_Ijt0dK8=$(w@>C%|V!#JCEvY_p5wQ#qD$ z4i<8Bt;h(zva|mD7~ch;PE@9**}y4I;DBZ9GV7tc=e++UB zqrQ~93~xFQTE+aL1Dnr}u!1mnAgxPlgx}TPM@W$qT%*FdnKk5zW~7Zzu^}Wg3I9Y0%nf0w~EvjV}GyD*~HQcenxhQbb z+nJnS62Tag{fyLndA0<&=Hr5l3!c0(E_lru#fHsv7Tu@B*w(;w1@Q7*C3)4T!-Ds1o2`AnBP@C4M*$QO){AdZV zh{?7vYtHJ4{f?ru_F=BDfSTduwTb3fzx4F<-_lkUf5LY9GSzA!haBMB`1rVPdns~; zeXXc=Hyt^GTVpd>kYD0^(VLJ|978cImtL><%sVN;@DVB`6WBK$f6amyH zH2k=4b=*a_0qwQzy2aqp-H`}YRn?PTb-!C0pt#RPMMVicKc-JD5Prc}B0w2s{2q@L zGL}U%+99FDr|9V{K|v@eD9l_^R_+bgcxih3_U*&6w@=F%^zr?0A4t)c2u-@0OaBzf zVc&-tZnTrBbnVG@$M?N1T8wF(lpQFt`5EwMuE)%(!hQSBjT>F+6%`fv;z?JH`Y?uq z>CfQU-Vbb)QP^J?@pf19H6$w(SssqOy}uF`c93t7hN}GV;Yq04?H^E&lJhMMPiC23 zIA3kusR}h|z{KarQKzpYAh)->!tPsnd9Cz%E4}b=b8COn?!-@O&eO}wF0!gz?rlpx zm+C(HasM$R3)f!v%GR!4-oFccZ(OZ~95XKq`iknYmae-Gd~H{zXmP9laa2yfXHJ9t z+m>5dU5yP`_*M`Gj8J^+mu+bLO)?KnKEoUhp{(jRjNU$~$p1}ib8U(N;8%M&f% z+qKZ4h0pWPqipL02JrQ2X&p5&&DpmKO!=S+Ljx+q`A>oAlMuDy<~y>tF+v`3x;Y+d znKwdr=3k92&Cdt^Ze%&761MYaUWfK{UAmn&Tm!Max85~+GO<+{8c&}h`hXRQ;W@`2 z7(s;MP`2H|@x?Ue?4}W$d~#bAoP{M-;o`*2mq5@$ru=7 z^}9o2x~Hq_)f2JJZ}Ley`*giCyaku=3#K`Rg?W#a2VAY$r+O2c03A+QOWW4PK#1!o zCwLHbM0i42(KGJz9oaB^Jp`z4pt0KD--l6)!YU#S6WOr_l}vW$rZ8UxTfws^*H}O#sP%##s-?t}=+Mn<%s_9G1KhLKlJ2*JF zMpM)6lRzvoV8IQ0c(E0nf+47gHkBf8K;!p)>7Ka}K5Mb2h>0P*H-=xz7!19Tly@+t z?r5AQ+Q@HYa}v*&A~~Q@3|pIOYjJ2zkiP5T(P5^DPl${Ad$Y*;`NG0N%=CKTib%#n z$W$C+pAp>X`ph8*@~IdDevP05`o7zp_ZHtX2;86>)A7|&ZX;kcG$2eyK%~u4ZW*i6 zzpWQ3g7P^vMS3j!2|QzHl6eA6wIlMl+jeKb$Mwhg`S~C01#&X8RGDh(LU%V40l{Lg zx&Z1ICW?*Xnm8x%S})$_uuT}LY8&57xUYyOdHeaT&++)CwmVtZ5#CQHT@l3wj)rcf zUpvDq2B#RDMqCn%hVAhapU!{eVH{Kb6Ep2%>;Lp#S6^OO5PGC79*ad2Zn~1J z0^dc5sO``A+uB_&iN0Xfo{GK!s8AvjXqxghnKu>EHtN?qFSXweUMepSh6v}0zC?ZH z@V%cT`Ntzge`;7*Sbk;(&OBFaSdB#Q1vxtAnz1&)DGB1^rQea%V+Hg>P} zNPFq$<>6XII77H`p0STjny#6dRA$$krlux(czC!G1gqKHYJcr~vW!;C%gf{6+SDp| zpyOGgWd7OMxX8yISu>jvyj<>*8M6a=6qq5@6F7s<@(C{uv=5HVX7=q{>Upssrsx<_wg@t!pCVj%hlU(P1{Sw*R ztZdky>i6E_8{u~s8-JwHyWO~`H4`p0D zh&1)3*0)JXM{jFsX$3;qc(Aci9JW7fB>5z^`HqM6IseY{Bq@CrPD?)Ww`^Aq2_W%i z=TpN?Xu8Apez%5Ix^!jK1Gzk7+;n$$x44&1k^nG0{m+X1l1GEvdyetyy51EgF zPG%2u>}!7Z$etVvWMQP{WrH)kBkQwW(VZEpKYhnPMZ#@pDGU4~A!?bTiLI)K)vd$z zRZ)aON5Pn z^Mm=a%zbySGrTyLbr%C8u@gV*StwzX${Zi1pMh??4UG8Cs*)>EB?C!(zXL;pmYhVj zTd*;;kiV-FvzcM^`{bZYy;LjRkb28bwV`*T;+2L;$8C;D@= zaE5te0UE=Yf5h)w9y2oQ|LR;;6rwgt|HOe7`Cb>eUJX@F@n+?gR1Aa8KYFzRD7VUE4ON00&u+=VCmBc^T@heBrY151^o^x)k=a{hUY!JClPMwVD) z`B8J!KvcuvJ1^lvZw%0@yfZ5v~*JJ99ZR5I%LAD$M7n8EOnL z58U2`R>wfvrn0v7(nn~kkmQ!C!Og@lO{de1yu7^1@^Q?^Bko245<>|mC3}GdqWLFn zjzjVB@$*GRMHX_;|CnvDKw@dGX8HcX{?-ZDYZ-7i#)NaBkbVPB;rn4CB^59d=<>M~ zSsoe0Ms6Rccrpwc$s0B z@vh!c-@uKY!xA4UF#Xck(~~r}yqs`|k$6>&K1`13g}|`&v{5A7$XWGeKI^W)Ns&WY z0YNE{9LCdZBJy#zL+x1ow(xG7 zOk7X>1L=0n>({RzBJa`!gwGNQ9EDgcSOS9pPWiwp_Es~?s4{SUrV-lZaJNqWe$&Ft z9MRaDcRlq}G}p;n*|=K+mQP~uYBFo6PQ4i476dg#9RCrUInnF8`t?^J5ggq#K2^Up z@-x%$6(jM5h{Gv%FdeTrGRK7A)3FENj&t0Tb+u(CW=lSGvV;`!Da_V_I4(u~p4<8v8*d5Bg1^TyP`VhG4+jNOo)+KC;^H-JIkTYu#xzuIAEg*3d?(`lw79rYqp)NYBR@w%De?!xKbuq>-^Rq;Oe zyLa`PY$qEQ>^X?gcrZlSf2H!y&;r$gOxX{2L~FJzd3KMh zYaK@Ok)Ty`An(e#hdjs8bg~13H_Sq%n1LeuQzxEnBrz0}w+Wv3rdE8RQ9Jnzcmh7i z0oN=!81(p1+Ej=r$4ESW;RG@F!KhcwY4Qq^3Lae`mD}Sd{%Ef!aE)a%R6EBAyO-uf zHnCJYPT*WpJ)qz5!5z`7S3nFq(S+oY{g$UsbL_#8)?agC-CP%JE?R{9vo&!>{-iJ8 zTrhwWr2_V~NN)Mwg52a{eX3g>7<<(jrVR6Dg4h^tsVh#tfuug|ya^825%Vf9P0#*S zq<$$m^_9()?j2Q7%(N;&%<1R8X&$l*_T-6NR1G_x?suI(#Buz@2tc14WTJ6Jt1%(K z7#oNHr4G4bHT-iVC;D;frGt_8yzzLS2IlH}Uy?UDI5nNc+$Hj?!eN#V=81LT4V+`E zgvUCVo#0?qrJLY8S9P4VsPC)?qxnsmcp<;U)W!K|_f9l}5_}8~-apPz`Ufa2!&cd- z<^7?g%SH@~te7o6YJ&6$$E0&yKgio|RQkI`vOZ9{sWAih0OVha{C2Z~9cr^RZ!{Ee qTv`efFCvlec#i%*9R^(oj2o6t9O^}5F3@vca81WhyGYaS!T$ipcz37( literal 0 HcmV?d00001 diff --git a/src/android/app/src/main/res/drawable-hdpi/button_r_pressed.png b/src/android/app/src/main/res/drawable-hdpi/button_r_pressed.png new file mode 100644 index 0000000000000000000000000000000000000000..c47d342535e994d1d6af2ae1195e38558107b308 GIT binary patch literal 5784 zcmcIo2U`y%LqJEPIpFn z@MtuBj{yK6dalOie&*QQN_a01342E`2ZBVPhd1~h0F>1Nz3uVt1V5w$!P(VQ1+`Vz zghIMHs-Vo|u~JxXO@fQ-&0rtG-C%uVe6Twn(j@QDCB>d__?c~G)@g7&9MeZO)nn;QeHwq94{>=gG6H_q!pwvGIC-_87XPB zq!e0GT2@?2T1iSlNfv|r?}k!^A(ed`os^8UbpC4$yi-BB`1yG&NlFF;1V{wPN_hD= zOG;xf7)dD^Nf{Y&u!Xp9kf)!0ptz^+l~aiS#n2-7;(c7b{an2~k*ApU4qpC#DkzlX zsS(NlS^xa_t7fP+z2OT#!YePbr*9@lsn!_TcWv}{P9 z&2)TTATEbso!4hUx|E-i+$Ak)>9a0METNV9qNsma(dGOPUXC7K4JiBJmBTA6qKG(r zg?9V}($$J*R&Cx>)hX*k*cbFOH@A3c7!6;hbT-@qr-8l*k;072&3?Nd#-f{XQ$$4SP*%_mjHed?P zq7jC6y*kNYkYYj7WX&IE_}d7TBk$ldJpdm1Aw~+*Hr?vLm6~h!NH+qK1(l&F1Guv+ zAC#ZzEPD`e1&DsTOb^Ke68iVm%3fnRfPNr@<`d_4O|FQ8p&7~8zNT&?GqmuuIEx)! zTfnNS^SqM*Tr)J_1ULeIK@q82=WWG2U(p>Y6P@`;|AY@|+pY@I!y*|O>4=>Zh&E<1 z8asB1yfd{e=*!kvw<)RHi1-e&PVddF&H^;ObJlXglhcyZOnMfaf+96u%(x+Y{Q82z z7*UK8G}ZIR^x=-8`lcDxIv{hEwnzWh_b$Mb;dI?Vs$U1?Mim3V^Nrjx>k9tC6nO>23~v6{bgE# zu}aCGOI@7U4=5;ov~EU;%K2hPc_L!J!-avaUp0hiuC|KvkvGqRZy%D?m*uZmjeg!> zqkG$OJrj<5F|97F?wFXv7V(Kbhe6|S%iGDf_pzg@tiwjt{Fcy5c)KbnV4gzPOTO1j zwo4VfHx=!gO7Oxz=a0jv-R%i<_S`E3h8c=j)URpfPMO568?`6#xrKd*QcbF9LEsBq zEe=CxyB2-uwXji;ZM9n4b3NfHJrdqil^#s!5a-%NndRxruqb0~!)lMIc)`Rv0MRBd zKd&4P%i;X}3YfK_?54g*&^ETKIX{58$_~>JeaV@qlWXDY>nq2T$iT_Tc|7d$g%=i8 zpKZ`}o+V~X9hp^F+@r$7x}2^zAn&nO>$$WWbmiqO4h9B>T^br1{3{9TTekIq_w(xN zLTFKgYw?{6d;=J8cHX`!~c z0ei8Cl!oT!=IL7hH3#RxjFVcADN|e9xxgZ08Rphc)7L7Jr{0)m%vO4&Nz)J1{MbGG z5vaVmoF1}!7`oYyo>Tt2(<}M#=O5};=6-O)@J;^jvc0ggjz;uaZqI=s$UO2wpw*di zxedeE2#NS`W5Y6Yxz=x=oX1P8`}2*udlr52$xMG!9{p_VpK$)(@w&Pp*H{!+WLzvI zC-*`g-Z}|(D@?Nf=XFa|5+m2O2kX;czrN;Si8*;8kV>L8oFGLAUsPrsZW69D5c-@) zRxh0zoBUeI+<{Q$NnGEja+sJ1fSq;>nNCGoj{D2L>U}v4__#$<5O}hfto3;R?(*P1 z^(1`p^4vkkUVj=Iy*^p7#v2k6665aX=J4X&?e3Dt)$rliN>++HplTJHj3Ys$E{)20 zn3x3N@pu^!lenxXxUf8D7KIT zAu;tDy9rt%2nt4}>1ga@<96NL$>tIGfk@`yMW(1nu83$tsvy7aqvB%FwwuhGFBTRS z#gkK0YY*1HmIb#)Gyg6!cKh)0qvZQyQ3kCPT|@TSu`z#-jmZlC7#8ly-L~_0j>9Bg z$%1~L2=ilWlw!p_LW^ z%i6W!3B^faM^pIYSiaa@=x{twop}k0-=23OJf+dvcsXwMd_`C0nN_m8k)lp zVEqvyF?^7v{zKo7(sjAB=FN5nMI|L32u{usHR{A*9jcn?kRV<+xGzy1xhF~U^^CMc*zE8{Ic&83>xzmBL*Te(IU_{n<*mh> z;lid+UR}~_kEx^cca(?Wl)IuY3z5pQ@EmHl5YPzNb%ydjhuYD@Tcu9((d?tm2DST6 z_(;-i!PWxT*^wv8Qc_a0lar}dH9iEfxB7Qkr{4J9ee|AfMu;b4Fwzj{drrU!5{HI! zZ`9q;(HXJ%xSzt8S7TLbY;9dqf-4tvN_9%=ft0r(-J*{m^^Eg>4wcyGDDa8Or*={+ zV92;I{{I?3L?!)vb@8fLFB!~^k*{A7kA=S)()K;0HI$WOk+#d;x>(;LF~lqGki-4 zw9@@`ycFAkMP30}3PMvbx%(royr8(Gq-1hK;NK@&sM$odKZ^c)>l1vLgJ|afQRuuA z>&S05dCh>QP`hY;-S3qi?=pjy-i&oSl0{$j&a7y;Afh>7QIEK}xy|kt8H<8x3-qa6 zatI_`)6$%<&IVpX25P>HkH31Rle_H|zMGcG$-^_CSfK)F{T3#UWNXF@KnxK07bkCc z;V8xjz`;V@p(Z;p%HK%st2VPKOe-2ryAp`qbQyTkn-^UaaA!AGm_&^BO^pl~DbxD@WE zIwvWFRqFoMUk*Uq#N_DS@~dm&xh%uh4yKv=#;PCg_ z`1r{|r`qh{!9wE4n$W`?VqGQySD7QMoOH9zHh49^)p;O&wWzezMq}a8))|(vEInDG z8lAUe!NXJj8a25DrbjN&K~GO#Uo|oImRWy9uAjP+oA{5~ZlCPh-sVi52%}dB^6YHB@B37mxxat*=MFXlny9uB>d2+v!TBNyHSZNa-ot9KqAWvU$wC(iP6bN9D7lyTxx>~R;YkC|>fGA~^f0feOc zCkjttHowSbAGc%{f+Z#J*UGSL$o{4Z9GP4EZ=%EmKp2QHd5(|!+zkjI7SSjcwX4t=gkC*|gT}Mrq6an#kSyURU_}l)KG=58H*$qLDAac& zZam|XM&L7U@B}%wpVo(s=^EeGmsibnz-iu$aV{?2nVp^eK)~&NYmI68GC3JMf7$?a ztBEm_@mUy~o~%bFH)m%G_Cgm~EKNE(H8qu(Bb=>;I-7n^PcV7dQ3l5yr*&OOKYeAQ z!hO7%_jsP6$<4(jwx~E5AH)y33d9#%w!(PNQ<8zc>)Gle>V$bV`RlASLj{xfCuk{t zHRa9Sea`!4Qm1QGLiRrA8x`?YA+Z;x z72B?JS-zW$Yy2Scy1*55ar@T(c<7qt+|gopvXJClz+Bkyj!njZTXOryunl();6?4sjbECBbCTkl3M z6<;V}grk7XNb{#oMj)TrA)+tAqP}}I9xmPJOyq4cHZ!{@;UzTWKV!t+PW_R5rxa?C z2NWVUt0VTNHq;?f*wlhv zg$kR>%Y9dVt&Y-c2Tq&)2?j+DSd%O7FLclX7F@YL)xHUpvzyv7Sk=tLi}CH#tE2Cz zVXB!`%9nqzpE>AwdN~;=d}y#JED1;JhbBSomexn#-C@Os8j<*&5Ydew4nMw6FCK5q ze%|5H41-W3I4BzZ{zRXpzBkR+v!A~r9Cj>sB3f5gT*6O|e#e1j%Nxv&i$9IKOZa0; zN7e*GBKnA(3)>kOU#FiV`Fce+`F(oZ%s}ZG92OQw*)#IP7 z;T;G`-ZM)B@EMRAY1FgFzF&PpJFMsTyG^JYu80m@+;93D)?|+e4q8TcATEQ%Q}OvT zKdIZ1Kds*glSOs}+k4>e&kSlp%Og5MIWDaI35N-|lzflI`lkEp(?#@rGmR;wO>qIb$bF7Dr}W*+ zX;i8e_Z4X$XOT9Upadx@FyMCkzH-m5u^|1hq)R(Vl=i#~jW%!=29T{LDCgeO3pmm%0?AOKn3)Xm{+Wm7 z{x`aeoHcJJ&Iv)J)Ny>|`sxZ_l}(q!I?qc2j%T-ln=~sVz$)@4OW~XnjztW(5AZ^6 z>H@WV!JURUq8Ni`&HiJm9-6quc0SgqR{+;@8>j$OA6IYkY4D%fqA7$DBD+Qin()VE zkmL8%JWHxCltPG=e_6P20ayGlq@E>fFsy|cI8Ra26q8z~BSdwLI6%zl=FNaVb;oq2 zu4vOFt_XziCuRp|cK1=$dGhOO^o|q23mhD_are*wfP_+_B_Dm)N|ufcS@9B^J1rUr zyhwSUydftI09i~Zfv@l+?w;#;v@bZHw^JUkte9>oH$D?Fjn5PVfO#l!m+igVhnD_0 z?HLOcjNV9hdToSBdO49dr+C){cvld7MUVenz|lfxgt-%W7NdR!<*sE?;Fzt;)}Uk( zd+o2V7Sq;Ws3Q8Un$%msdxmu$65HHnG7wQz87syfkTEDngaBs9o=>Y$$|C=N{|L!l aCu%@_I${LkQ9ef+97-Cm;wYphzPjA~m!$2uPQ7 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 EAMXqA*8l(j literal 0 HcmV?d00001 diff --git a/src/android/app/src/main/res/drawable-hdpi/button_select_pressed.png b/src/android/app/src/main/res/drawable-hdpi/button_select_pressed.png new file mode 100644 index 0000000000000000000000000000000000000000..8ee4714199fb357cd42f25e5bcc3358215b9d852 GIT binary patch literal 13344 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 z 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 literal 0 HcmV?d00001 diff --git a/src/android/app/src/main/res/drawable-hdpi/button_x.png b/src/android/app/src/main/res/drawable-hdpi/button_x.png new file mode 100644 index 0000000000000000000000000000000000000000..1a0fd19245ee8ba19a3cf8aa7062b254ec116951 GIT binary patch literal 12124 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 Ve%xH_e)~|os-l)csodl6{{cXt8|ha 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 G$o~VQxM}bJ literal 0 HcmV?d00001 diff --git a/src/android/app/src/main/res/drawable-hdpi/button_zl.png b/src/android/app/src/main/res/drawable-hdpi/button_zl.png new file mode 100644 index 0000000000000000000000000000000000000000..dd5d4d5b32ff66bf52586818e5dcca337e3adea5 GIT binary patch literal 4423 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 F`Cro;_yPa` literal 0 HcmV?d00001 diff --git a/src/android/app/src/main/res/drawable-hdpi/button_zr_pressed.png b/src/android/app/src/main/res/drawable-hdpi/button_zr_pressed.png new file mode 100644 index 0000000000000000000000000000000000000000..1218776102c7b27dd4a7ca6998c4c4e3262da1fc GIT binary patch literal 6201 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 literal 0 HcmV?d00001 diff --git a/src/android/app/src/main/res/drawable-hdpi/dpad.png b/src/android/app/src/main/res/drawable-hdpi/dpad.png new file mode 100644 index 0000000000000000000000000000000000000000..921b3902d095ae1f48c827afe6792d7aecc71fa6 GIT binary patch literal 4273 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 literal 0 HcmV?d00001 diff --git a/src/android/app/src/main/res/drawable-hdpi/ic_cia_install.png b/src/android/app/src/main/res/drawable-hdpi/ic_cia_install.png new file mode 100644 index 0000000000000000000000000000000000000000..8c00d8c34106eb6e1fb045821696da60afe0841f GIT binary patch literal 514 zcmV+d0{#7oP)KqsZu0-DxFb3>J z3FBznrHHcRS+rk0Y>Gr~D^)2%Ul~(=pdyEHN8D`z|dyY|oeh9X8q*^|J~6*6GOh zj7eM0Q~DI2b1?&=5Fl|VGCi*cP)SV_C|_HaqJCr}VSG8I@AP=kXO=2d(68YWa;Pf$ z0t`i5yjo?HW!XOhqx7LxXbxD@kDu}8w!6F;F7(5^Y5P>ih!9Z~}l-{jVW?$(3~YeGaJjVPoMg*2j& zMikPBLK-H8G6No-RD>EfT;4QAXm3EobCljU5QBUTe5f0`Y~OKVPhS25IbZIu1jRY9 Zd;z`*c?FdiugL%a002ovPDHLkV1g@hY}5b% literal 0 HcmV?d00001 diff --git a/src/android/app/src/main/res/drawable-hdpi/ic_premium.png b/src/android/app/src/main/res/drawable-hdpi/ic_premium.png new file mode 100644 index 0000000000000000000000000000000000000000..7dd45a4055928d18ea4b3f8f47537f69aafce256 GIT binary patch literal 961 zcmV;y13vtTP)mRl$ONvM-ArT1)k!)GAW#1WL z7$)o3Gh^vY&(+)O-fzD7X7JS4z2Ezu_r1?O_nhaPw_N#(l?XvsUz8Ld}7tz>rvrfW5#x;F>cw9heQ&jIr)D zumD&U524P$5g@e~G6B8=J%Q7}eqd0X>kJ!#j97#k0QZ5=?-v94zzu!kl42P!Gm6l0 zz3sn-eU-EBGm|v>TF_a6`D?>7t(sO{1-gpgV=6i3v3h*iTlcZl+VLUKZWResP+a;=RfOo)c zV4WiqpWJ7ghpqx`%7D-)DY0Pyuo7tH%-jDT63_sqUsFW*H=!-Sm{O9-l1dvU$pbzb z0pEZZ-uMTgm&#I+TMv|y%oB%9{}3|Ifx!y&JYb;i15{O=tBX98D#NM?5}F9Cm&)7Q zS9j(tK3a-^725(yfF;obpt56Yr23eLz5t68BxCO0qWj4n8ALQk8q`&(o+GbidA7ZQ zERGymvYy%4QnNuPMW#+_tjSoBC@Nr6lXP5;napu421anA- zhd{H&tI>C1`yY>|^)QX<1MG{K@22!d>bt?2s{kAX_Gq6}#gI=XQ+@p(=d$8pk}x{N z#%fkuDY0Q8FxRsgsX*W5jG1~*a|xD|5b6jghm05M(*-ftPR-hoki%oPVrjMCj)dt@ zahRev^F2`Db)Q#s7_@@h0cfghybhe#{U1ogLjlZ7!I9XyPU~~5ikAw>$tj6AsR;I# j7CTln?ObPGD;z_hwA$Jo1U((Y8s^! zp$6OpO28cO1^5hHs|&LZGQEH@*r8C|6yam9#dk0i)JjN14v5G)gL{=Fbd3RTy@>RQ zNP{ub@Hv`+XL|d~z}bj@DKKvNWFLT*NX!6G(f(IJ*69oZO+c~6A|t>);2bb(Ayc(a zz(rseP^jUbjFSF`kbd*$4vQ_8jRVVVgpMRgrfNrRS@weD$4l#>22LlqJLjE*5g1B< z%$T!M18W^Y^T1)COIts1+cCD=htTC1uu))>rL1)PrDG<$;;KU}S`1A_#vL@9-c^Z-3TH?RRPm5U0HQ%aRw(nmxxS|FDgrc42^wQ?7gQjY-!Jr3g4fUe+@ z2Yw#lr$@l<07Bb5@aI#&cSiv$1JeP*_YU~wIJcAn791xp=!57xDjso?0y2)1n}D_e zLT$h@$GO>*ZVg;VZvdhF9&_{6wC@LYXhG|=?8KZ>YK0FQ5%~zLG~wx#p8|%JQiWPs zu{tIb?s;U`ofxck*V0jl0lEb=ScnL4JqF{EPc7?m(2TdhNnj(8*46=>0NyynZ}lN` z-?No?ugxcB$hEkhO0YpY6W8SDVk-UruufY~y;+}yB*z|OPwnsnxY#xgw7N8ClQn{$ z0>|~!b-@uGGi*qNR@W@cMt15##J?Swu@ET%J0mfJk-yfQ*L4ig2pj{p82k^sMemPh z^#RSMb<>thh%#{3au{bVz8M4N1TYbN9TPL2SbU?wsC8cH-2lD;U-gyV58xq?4#oTp XV;1BxGI*AY00000NkvXXu0mjf6ZTW7 literal 0 HcmV?d00001 diff --git a/src/android/app/src/main/res/drawable-hdpi/ic_stat_notification_logo.png b/src/android/app/src/main/res/drawable-hdpi/ic_stat_notification_logo.png new file mode 100644 index 0000000000000000000000000000000000000000..2282f1a3b936767a009858111f1177dad3acc260 GIT binary patch literal 2824 zcmX|@c{~&TAIE2w`$&!v)tY0@jaiN{cV=eD9dd1pWkxI(k~ve(k&sk!B;{D;rXfcc zCFPC~I*5pn{Pg{OAK%a8@%g+z@6Y@Fc)lL5_g|kBdt0oqz(D~303eLBvT)doR)04i z&)(_0_z(*KaN#LVZge+-4VoAn1otHc`;p;{ppd;f0AOg$2=OHblIajXvOk4}fqrj( z0)DlH7nz(D`u zqWA89pAk^VKP~h?4Ak_mAjFMe4>1o8B}0zEbu@@tC?rHzAFidNsgFddLy($Ux(H2O zgqF63rWRUL2d%9S`FBB$1R#c?q|;~z3(J4S_A(4KfKCrVBM=c05%36YcyOpcLQ7v? zAEAjvAdwn-9U5WhX>?zP1}#kfFXI0U3vw7SloCRx1k)gYnZAC(=ja$H6!BLC@vq9B zJ;Zu}OarSF-8-ETdL%=)qMC2;1t-Bsb)*6~%sL_C_?k+}+--)1QC zivZ1I%{j=axE!NzAo!0zJc}-XNd$Tfgy9~k+={_%7aA~{9F0}FCU#ln5A_n$Gd5XG z$A2}t4Tx=cIJy}_uvnGx^a+@{zc1>!06B6sYW z`?_VvH9|CMMh&W-(uVW-=@C6*gJKNvh1_;6@TuA&7ZG>jwhsn#vB@{e%h?20UC5lc z)GDnd$bKe6|#G+Du^ltK9;a;?bjDcmxMS5TfV zd@@)3Ql4EX7pOh$Y*7Dl=rdI^S-kl9siRw1g&o%cJX><}0W0b5{wuZ~mZuw%-j$}l zBWcbN)2T~wC3S3>h@6=n$I(fZG2LcYoklvWu+$oXJ3?;ACHr<8-E7ZPz?5~^nqF0R zI*OA$G-mE3$7`nZMxED#ys}g$04uK)z~?_=D7~BtR1uQP+{bp0YT_oJFaXQ9HW?I# zVG7q-OG(`y2_wMwt+{<{*&Inx-e)q`?N=}--QEo~+YAisZ&Yj9^5F#L-PxWWq$Lxp zFY|waQZD4{l<(uemzF#9g!~ok9m6V#uozl7% zy@U9z`^4=D>K{DYz9QKFj7)e(NIgB;2CY}#aOzovs@FQb`)O~GgVttgca5?fD@fv( z&e97Xd69StvrO-*>_sibE)Ug~xtSW|>-S?Sqgm=P-!gp57k*KWA0D0>fi*}~@*L)B z%k^tzOTBo%Ao5$A`MZj9wjg%UQ2kpdz@zz9r_0Xy8PT4YiV#?j+77+NcD*6mGVx`a z-fyoi%t9In{gXutrz??{j|r!fV}Fetif8)cz$K%XyC|Uh#hHy_$!W})Bm-h z1M~FVlpk|Aqv|QS_G&k)x;n(cxf-ipj8^F<}&#U$M9`P=Z9qC@%0zs(b^yb7W_ zAbtE{Q2V4xN_PRIJ7II?u)6x~U$WRTtc-}~k-1pMd(M#@8nwm!dG%C^_ub5S$MR{a zhC*x6?G^ON!U_qk`CcQKUO{`f*MiKntFmbfqR}K#`L=;RK7NR#w&h^D{sHM1mx3px z9Z@azPY&9qu3PUvEB-K^BjCfITej`O-&hUQuX7|nsh)FP$_B)23+T!Kk(4s^(f_F9iau~&uiOtfZYR}(PG&u2yuI*iQju# zmwPdN(ajbX6C{!7#ZmN{xkfyB2nH?7jFnS1^t(|rUkj^Kj@~DDimDVXTaO9Jg-!A< zWL$7^AgpGnoy`;ZjjRX>5sH+Gl8gSmR@7>9s3$c-NkPH7VQ4&`+6_j}7(_?Th ze1^^Tk~D6n_V-M80WP?6AO+0TPrRO-mfo_9u|-f_!}sUTjLYID30LBWM{A@6ud8>q zc^VaFTz~dvc-MGAo%+Bf?LyC4r8+15eP1cbT1X?nmm0e^T`pOxT=aOH)T61{?p?sU Xi!REX(-EbAKd`vtwiZ=pK5_p811}ST literal 0 HcmV?d00001 diff --git a/src/android/app/src/main/res/drawable-hdpi/stick_c.png b/src/android/app/src/main/res/drawable-hdpi/stick_c.png new file mode 100644 index 0000000000000000000000000000000000000000..d4c1d6c976af87d2a85cef90c27c14d756a355c8 GIT binary patch literal 14819 zcmb`ugZ&PPpkWik*w2mk<(sk~BvWB+&j_X{M%{)I0% z5CH%)K|9i6e?0{{}z-p-a*_SWu@H`caxPLiyL&F!oZ zySI|8`Y+Y^)STt5-`TzLb+y*^RoAidwYL&|%PK7elJFM8HsEOOZVB;rbZ~ML^Oj`& zpLWHt*Z+OY%L@6QTiop>S!Mt05MrRF36V#*T0>s)2yt8S3kpDlMS1vz_(TN+xgY|3 z{KC9^!o2)1xcT_S_=Ln>h(iAN#VQ4YNVvYW5rZoz{cmU3cap5{+})kUczM0Nym-7` z@E}}mdHF>}MS1xIcm)Kwv3GF0`8c^-dUHFuvHjP?|KEm!wVRczowK_g!U^(Uo0e}7 z9`2H?ti1nq!u!9yU>}e7|2!Y|&HtGpYbWfqxMH6_^RdMt0004~D9Gw~r|$>Ympaay zP9tLZ(YtjQlAE=ytqm1G#cUd=909&P4nbA~L@rj#4)#7xfnlOPRMu6<3cbq+|Iv9=nzPI2XM*FTEA9y-WD^V`{;^ z;wAHa-{C#j3c#im3+8{*{ekNL_QHwjS5DhybNfv*^Sl=nB?FxGd)-b5z(vsj_WT34 zf=)M2@5ur@(HEDHa2Xge^a=3KW;W7@Qtm0h207*jhy${?$-T0v2WyV`}N$8KBA=MOcUusugLO~?_DUwAr$ick=097>DyQsXMXrh ztNjlgnQv%KO_))0AvE7mU>I=IW*!k9K@n9^dp$k#D%BBM}D{IV`{-2 zrnq=XOE;;wc&DX&_eO2pKh*7xU+&klW;6qTxE79t!Fx7Ti#+r;fg`$&FK(?N-_8}u z4vk-Xo5=o81swUDl#MzPClsOpCJe6v#PZ|gyud|V=v~?kmWbaiT>y-zOn9>);lW61 zIUtbb1Lfm%w@Ja4)s~{v0xb{IyyBh4;(>+~>#HYN?)-qVpAPM7e z8$&f@is~`)db1y)k4MJy5>*|&iKQ}Z?9$ELfJC_(~ zZ{r%2{=R#i2au8j_A4undhgJ7Xr@16`Man>9psa0gUD1b6dbHR5mA@QU?={#_EkYk zA(ulA9Qh%a(&+M0DYYhyY=8Sa_1Ycx(8du%8pDaXD;Uv|1D25DrmH$H$pFb&@KYo6 z?C9SqepfNouP)xv)lH(aHjGr%Y6+;B^>@icv{x1H#JdhlzXtk5@OzSZ-EJ%w=>n`Q zvn*o+OjDm8roMh!k)>YflWd)(mOx{d`dK8-j;80s8qgB_sFQ*+Qg7><)s<-px&hOM z3uxY+p0eICtPA@3!0kXh?lR>MMH%qA#^|W|#Is1N5NPT@s>QlX_I|=6tf^cp znYL&*fkyG0Mq%QRzm$eh+R$|A^lrtklYQm1$ot1Ef3=ZPrc5hES^yMHI3*71l;LS& z|MZYejo--?1}g;(TSKKpc9dNzByrQa z`#Q{+#7NL5w>w$b_SHBwn*=Qg5)R0|dzZkD7R(w!HyLoLKTGV7F-)!!9D0}f^c6KH zhW{s@0$2$suj(b1(-4YYKNEj%Wfwc~m=K=Yx_)sjzrRGwulOMlaltoW5kE`z&JDAF z_y}RKhQCW|g80n-Q7fF@E;XBrGv7|OhKtrPxm6-VJ$Lf`ZRX_rt6_t=$b1@}Nez;d z3_%c#8rYy@9(Oim)rGdx3B5Wu*9L+1x*vGfgfzfGvf1MWy=!$7uYhq)PLzr-v64;D z;TXghTT-!0$d^zX*HC+!xb5om&v9`5c(AzmnjiMB>Y1pN_ZwOn;{g9Pcd@I2yu3B6 zF11T%sJ~5CvrD#qHBKY7zAX~?0g}x$xqTfQj?~N?y%3Ty_7$#E0Ya=f7m~M)HE*PY zA9|mpYJz|`xE8{R3cfDNyWcnnkhoT)a2UQU02-ln1XLS`M6-6ggtMz?CiAa~D5XB- zic6GGOLR=O9x*d9!R!y&oT#RsFx$jVYUB!guhMiluTDo;UNXk?tY#=H_dPqg+C%lf z{aNiG_bicAC4n{WL4FarYhBNwcU#(kds|JzKCl(}dGz7DJ}w|^3LWrlQTpp)bw$~j zrp6^P3ne^s?gAM~jXMD5VBxl|iSEFiwW-SGP#9PEkUNKejU5tpA+W2wq3-*ql3K9R z)6q3XL!EkM2_lXZputF7c(Jt5x7Tg^mzUnY?(U~W+wRf*ZwH zw+|mFIQrHM?z!s_y~Ep-jn0ci%G_)77E+u>+~>$T-{fjU0RctYs*(s9V2C@E3Y9Gv ztO?raelANH3?=9ntb4%v4$r@gQY-DB07y2EVARq@3W<`qM1O7k~ONX`TU+v!vx0#n(S#WJl3b`*ci-M@C_((N! zIbgXQf#{x|tNER#JK5fu9hGc_1~Z)6qzz?DaQpq`x@GE&fH=MHDp2yaopO1kI6wI;WGSaC!EIp06}pU!jN4YM zU|zEPyMYX($ZIVnvu|H4wE7)xVP8F0{z?Vok22Js{i-G&(>b|iuhMH@yAFq| zakqpf&|WSr(P3~1j%Y2P9o|#&E{|uOe-%FJ0o`Wfew7u45Ab+DQy`iO2ZtQK!886- zfNbciwXOXWP)|;s+S|U2;)p&-Pfzzh^liQKf=5%l@bp^?H7)_bp96MG$G1-r*iq;| zW@K!~ZZk7)1;QQ%rfsVjdoe|t8jag{h-@ya>lH3Wmfm#`dc%TMX*wR;o2N>;puP5U z7SV*OAxldo4{D>!Xuf}q&Z&C)= zO^16l7N(Xj^`2w36R`9mYoz_;V6nL*FE4M>LCCgdmL~Bd;;Qbb*#r%0Q}tSqnbr?x zx?s+gxS^40e^h_j#%fS0c!0dE*eW4SPZEb)S;>i0S$-JQ4#>i*1w;G!`lh-JOFPda zm-RBrC~?C-OMAJyW6CZL7F*j5xOT4mWo>J|Rbfn1we>y4>6XSAS+c`}`Q#34eSKxi zQx>)2jt;#6VX9^KQV5Ity`bUe5##Txc%L4AwvcGP)Ntr30>Uz zto&xPvZ(BABqi))KCXI4R&~5b>lBa$?iWn_qTXdkz{t1fFd- z?2MxIe^!zYD8pCUVtMj`pYov2a9|D2&3#FV^gMl)1tDPZrh=HexE=$rzTUm#Km3MO zuCrI%$Axk6@k?G82dyb|F>GxHT)!NIy4=O~4evOjhh&mu3h!R?zOD$EslrUHHp43Q zFRM5&{mP`%Pd7K6_scuX?>ftGCqT_8)j)^k=OOG0;}Ew`znO$L8TlglNF@;##;uE_ zG(Z_Cg6|dnN6R5Ja+tySWn!lm+^@kG@yv|eZEFXMe!SR=)Sfr88z)frFRI$iiz5%} zpb`M?^)JcCuVx=$l5d)8iJBez;#n~p9dVWI^q{wYIQb-T9a-;|hyxwZqc~6}cYyCm zZi3vWQrR|PenT6XGjqZ76pD7nNzN4suZqlcU;&f;{VF`+mlwjO#7?!i?*>bkstma9 zb{3nx%tXbEbQm|YQiFvZ-7v|`a}NpauZ(xrI6}-P=2CWQH&+f!D>;^~fI#Lcw z$%0IPFVV>b4qjc&79o$jgzMCut!QO{{3;255sTQJhU=kn$(8@GyVZR6Xyz$=g-+`1 z5zOm4ow>P_r!wleF$nEO7Ox78^mQ_^=3}Ops93Ui&44EYk|7Ss*YP7p0rWL9ZsY)h ze3`-U&m4l%MRVh$4Qg^w6=cFE%Ht49OhuVq$;fk5V3tJmMbn$duW_VONND9Cq+J*2 zA8wo9up3Rv#!30Fm)~B`2^R8V$Tlg{?Qirl~Oy^mcD$Pk| zE*|05a?kP@b)E>oG>d5i-^@L+SYtjEZzTSlL!$#`v*>^S{-rQ6Gq>}l4aFX5%}hbFTO-N<)j>&T%A3rp}n{8aK;W9t|1LB0>g zWku-<)y5^zfsd7YoX3fto>Jv%u6ds3sSUyTN&JrvD=&5XVgcy zQ3;Z@n@^vKYp63}M4{^%OZnc*N#_WnK4UoBLlfhO5aFcThTv4# z_pu9ypKJu0>Ibc?uC89>BbnQwI$OQn05~k%@-m~ZZ{#;!Oi!V0&7<8Wu@^4_r(@@> zn|@6;BKz>$oTmE9jt>~xo8|oohi?l=+TsJENAncTBrJ9b9*$|UvHFF*^jmIviQ-PM z(-{2&F%3YB3Z^^r>=YCo7Z=|dWp3Vo=GT+n7z|Wvq+;rjsPr1yJn>>?WNa15P@nJQ zGVPcrGkS)UJ1Ve89Qm{pI}=5qIbB8D+c~%Vyzd=DDu8Xm&Z-8WCK(&ov|u}yoN#xm z49iGsF<7UXwWwf^001ceQRE>dEB|=))@*57ffV=P&X9*`5a%W)%1JI@SqZxxzY)q% zZ{Nqd1ixcf_6b^4s2dWs`C%;iGi68Q4q-UFOlp^iw8?hT@-r`V$$`wg_FJ^^AtZ-Z z9$>^Dd(^N$?R!q9DQ6@`6KQGhUHfHqxkc7g*rDpX8Bg@8MrKAv0Di}PtJ8D$eUQcX zkp}EqRK^B3Jy@5JYyYFw;yB`2(VJM=x!8Ebt)qV7V!GgF+t8}Y!@wBXCzTZ;Oi$pW zF2Q7aWz>70SvGG(YUO6MY=oY?=RCGK#|BwL@o@vy9MOjy(W}h-z2|PFoE>#GA+eCQ z0I`g~p*Q?NJ_6q=``P7_Q3V4G4G+eQy!u5E5rKWz#yf7rn}@{h$}X7-onBS)A5S~Y zf)`?Fxt`?KmVIeFEo3ZoSOtuilPf`WC}m(DImX;5JYbsR#m_ZPTD{a!Fmd}x&Fb>jzQxz#d}JB{LRvKv+nN0VVPpRRaSO|M;jB|LyJ9*9GoXU)u$~y}ql3A74JNSnTVhSr*tWL1wg3 zn7>RLT9Qf|(x`TTEk1g@kQpdmHLfY$zDvO4=yoI^MKO3Ly$x<6a{M#+BghG@6K_Ti zY;SIGqau)<@x_rO%gfBQ5%{(d)8kJc`6sI?tKC7Iro11IlH*C9pjw+el}?dpX7=@Ot`^Nwjq>4`Dz);>N%dFk$2P#7QhcvBH7Y@9rYfDh$RqStoM9n z4UVkT9)70sh6Z9)GmEK7>_06*!bc>3TQGr$w1Wq04WY!a+3DfUn$3do{`UeZD#A#9 zxySQ9cJ35Sb*JK=9M5qY9|mbu*>?x->4qLy+-Hhi%;@4bfcr&>f|pF>r?7F1Zm0^@ zZ!@G(M89qA&|Nc<2u2F1CtONmJCqm{n4@jl`%vygNK~YgcH9zscxVvR=enokr99Xk zCi^5<{*wv)_NdxLT?zh_wlOayK2Gj0-_VIM7O^xn=GRXXy>Pq}Tk^L&IZS*=Eu03X zUl-QcVguhf!q!Euq1)1UY-~aW&k*`rgSCnwAsgjX;?9RwhgZyd!#o!C72-4P~-+kTqUFZO;HJbThO>s1v@9=%_?CpMWe*8lbxGWhfm z{})5~-W#%V9UONHg(a*-K_jgbbrbUQ*KS?r=h12TQ%gE&=co8VQCUU@VxW8bpKab9 zk{f-v@;?!hb&TnM3A=rd7iWe@Uyg6HlgXcZ*qBDmGviZq(kQk0ie=~=R4Z6+@u>eX zyw3>?6y7@Xk**vx=T=$?a+iSF{Gw-qS|e~*GT!7TKCCNwKZhTs8!D)_wl{^-hK@(uSZ!_|hMnl$fVwVUIu)%eyFT_8aGDnRcF)zuIwti#L--73)oyxk1k=CelZ}H;4t&`QGPNt9@ib8) zI@il|{iF#-@F9`?F1P<}_3MQ2x#Pz9gHa)KAKk@_{u2MT_8a4{3gs3tlVs6d>v@dr zYB%AX?|V-z7u5)NBSE(l}S-qF;v=Y*QD5X$2oyHu$(_Wr5!i{=N0h8N#| ztIZEygk+Fv@ZO59R^>kPZ%a``lk7PtZAAnWgjLDBZIOu;iBn9rcA>;S6c9Lh+YNw0 z@nw&C43mpQ)RCq|J*H`c8Ld81$9pTc;uJ)AXVUDE&$||L7JX&ot5a=39m72PIv?jt zDTk{21>)9tKf|j_yaV-f0q_B?xHV~{^|s>Uz6o_>r<1#bmfN5C;zZm7)@c`Mc}LPx zmltF46u$gFJ2v1m!z7ycI42LcV!p8d6N+22C1%OGP|$=txDAp`$ghaWZJe-o7iDW{ z@n}N&)ug9Q*Btpd{o*)|iaPYTjUCNq^`^CAByFyep`+<@DXr#;358tBr4TZLup^PB z^p{QTtu?OAHBK5G79q8`pLn9qwfy{NT*T1@8xsTJHn}HfPng`HCW~d8a)ofm@7GI0 zY&2}q*wlg@Q{qF9VeR|W#IXdHlH$}p(Qu}FbOH|I?zPs!k0LYBb-I^6qcb(rT z-PUMeqD8rTiMj6TF_IjX50NOdn8YsJJ8Ld6ZC#j>`D~mUHgQj=Kem{9yjy0$tVpGi z;H?C`ZIPEA340#Aa*v2v^QKm0nKp9b4wAk=GX%IBX74tkRaZl(qI$9|#72I7A~1Px zZ!ZB@IO|RKh-MpqnF{QkNppPc%<yaUvRURqupJ-_WZ zjBWHiB~4(?!x8TtJOh{p&zH$;YqC%)x-dnqFkqcMy6))FkFhqLzvyYeaL)MmY)hsx45%lE?{>?3U(P3(ha zfBPS_$?os&zq zhL>6I{r-JiqmSm2z4_7NW-)EB2&f|+--w{jd90>q6mP5i&2DTyOaes%m~=o z12&kOT5VS@{@qhee^CC{VJ47ww!F29Pd3IGD@sru$)AkV7yyz1ej}3QvyGh;I;txg zVWe1YQnX09y99IJ*IAj%{Vc2*p!IcU0t};@bhqs0Icz0DNJAk{!@0;k7^7lw;4s6V z;I;B~FG(2+o->!Y{g%FiA?Bh{vaqajp+4WLMRm&9WRM}73RD|e4QR{&@maOY_q;H9L&NML6s6{gdo^cZhh1*_2(d1+|tYsM_u4E@lvA+i0X`H%{{; zGVUx;Y~yT%Q^J6{8Oz#R!BGdkIEentFPmty%OZ!>TeT)t{zs>qIJpOAIE_i5&ss2R z+bfm9vtU*4<~q>b3PW}2#)oOZv!q48cvI0z`%^<7%UCF&As&}XPC)L%DFM1wW*T;h z4OKjrsP6yBFT86c9E?BwC8I`ES=*RMcVeamBUhfJIO_@joIU=w!|ZEK^@P*1IDWiF zeH8QIcAWP@<8N=A;GCBI_lZiD*MdL@J~d<|NB!h8&8q}G7v_w%S|-bU2@OJ~H#3pD z#K8r3Wy&Hmp+BdaUM+o~n*JpJ9H2X}5yYHPS&MJ?_fmuK+{abb=NzK~6<<)2g+3wo z@QvCdc#p)**HKD#Txu8uN>lf{~&}KyE@U4u9eJ&xX&O{Jy(MXA?n; zS?~{OWa^z9qdeTw@54U4>8hWXK#DszS4(Q9vgP@U{j7kwJYg36FL0sYCXop{ zW&x5~YPr(z;~ACH|>)xR6@c{oQJ<*t9c}TTD^F$Oi5Yr!{M3@)sks5pAmRk~?pH^eR-{Caw#5u!siV4N>Wb2VD4l=)L}V z$P;})*p}`lNTxhKVQH$*fSS0KH|xR~&yL6VVc83?@_#G| zDIRZBBgN3NFq6pnzFzwU*yYKVwNqsu@W*3xUiHC-O`yo8%>!&mIXE=YldXG!K; zioazc4F{y3Xz1#yq!sAR;W-cbVw5JX9z)`5v}n>vujnWp>^-kNNmT z{F-f4kPKUi)t$^wKe@5d`w+IW%=R-M8KjwfR*x-7+0i>Mb;J_|^H3H%eFAGu+d#j| z9(kf{!hLQXG}oF3+&`&JG^?Af2MqfZuZ0^PcC_!PX(3EJA~qUzD)d;4#}m^SAPxWi;YL;?@B~_jjr?3Tcnl8-+5|I*F7I}{poZ2vGoB| zS_$j3a6Hk3-I^Ibq!_4vT|DqS18)ij zzRxcp;tBbujN+n*gJME1Ep$Sx|EN*}8M`@t@%Tricun4-e_E|3LrAY}u`s^1|!te))xK zS(|DYhvUiJ)Xi?G#;591EnVx+n?C)b_us#K%jndOXCQKn*lL!B>+7D0D}Lb}sQzqi zC}x)ZCk)cklUR1odI>HZ#Dva}1Yy6#7PiXt$uF)mEK`4Fyvi4_%oyN!F=ek-n zF%rCYfDRHrV=JZ?f-A33cK-KA&4h}-oxZwntnlTmJ3)j zT8o&88Dr5fJ-%k>yGq;^U=v%FdDf8JUe1ZMj;Q9E@N8DwZNhGb^2csqli7uAC7}85 z6U>@VrnEKrbrB)Y+Z-Db9I1sxjxigmfJ60$nY%)@IUYDs?xYz zv?}YlIKFWlnDenYf8;sU&JWW3_FE$)mm_z`Cedv;=-=nod-=xW?LUvKs<{TummH>I za(`i`+&M{xuFso+^Wb53KpC%Iw34w%a(`r9HHT|eD-bobaNlW6zMNRaIQs-*s|gVrWw z;S(jCR`DNtdUvww99MLp`dv~7cbpciGc;Qp_rm6oBsQus@8oW@G_87k6EyrRA8Q6j{ zyULVG0+z3!ilq8kDHOx59c~F60DonaRf2xako!936e1}HsmfZ7E$Kh(Gh32gCiq^6 z@7{5&&4vMZg3QE@xIb@-9{V$t>#3SepAqeER?P94&Qq%(;bt^FL8d$@%Jchr>ppS0 zqlO{H#p$3b08W!ZM?CRkI)6J0e?yrI*6lA#R8mS%~YJ&K~M zoTzMC!(WjQ2g5$L-i8ggAP-7uG}5AuXoGk+qvQi5qPL&px@CSDzINXq78`PmXz%b$ zE5WJ>cS?!wxS+IS*}cc|K$wM>Rcuc24zn>&%0HVLvif=M;{}@tSfQ1U40Q4sCd_nX zk5947v`^r>bS1?-^9-Z6yy%C2(RN+i$LTq{nK!=p^Do9@)R;zSYw=C@*w5L!WAA9PsxYzo_8u8M7@SJ1$KA0~lz3GC*N`u-ID<+c?(CsWs<}!)9m$vv3zZVW)g0h>Nn(8`<(ioNAbiBk2Y(5R4CjEazrS4xL|u z2eYtg%wLo5JvK2IjMU~(yivptrv)GZK#=x*>PFP?$cVIb+?rKyXbi*xSp|^oc&q`S zgi#S;wK&8}hskqd)GO`Ff|hms zJWAx}mtwK|<+^#vnJ;5TR+g<#=Dl05LBNAjY3DE+0DuFPCV{?7!@>=RWL@tVB3URx zgZZ%0hrJb!+&g0iix4kjy;mrQu(#G|ZO}_fI!gCJuVy5$qYNG{+c_PybsM0G6T93+ ziwWtN9=e>l{7vCowvKkFpK+KnsLEdMH@u@F;bmThc^i2E;$>>+?sf0@x*^R3sf4Bha9wG7tU`(4v{56-T( z8;N)S&eF^(cZr%>alg(_uc5@c_-X@89h=658fg_n_C2k_gNAr{l1H+#vhE`(F=4Tb z9BFgpPR zIp^{@!f)%(@FvBFs7EOor161OC4lf?+>B*$zxI-G*P!X+Ls0uV#@Io~xOCdS%7o`I z9m_;u?K7TOWV7MY$=ohLp6_2ryO^lxEm3U51vrlaZ1vkFw3cYA)Bqd_jMb&*a{nRc zAQ7qq(t(<4cXYh&bIRyoV$C<5>OTYWkgqT@^`wy-`d_?!q!}zbc=*;%6X}hZX7A1eqVU^Mla$8I zcf*5f)^j7I1w#9_w@l1qhx;xkw|msX6?jWzLTO}EyGcf6dMmTD{fk&B--dtIFjFqv z%va53OZ@_?u$oqvkW954D*cdr4!QdiDQ; z^(_x>zZQbas7+)|_;mUSPyrF>8bpl*UXl8nODUGOeDmY<597}paVmIR%c_jZCR~5y z7Zw&GS{e=R_=3%wi+)lpSP%e=;_j=kBS8@796k$glLJDDS#%1Y-(=~->R#gR5{qmu zUd#>=_D1$zy1)9_Px^zY<1X&R>!$VmV&8{iMT^!-b9AxYFNgu;>eqKmI$}MA<>3-H zNJ9bPTeABH4&=TH`f)=_#&?tNKdm3*78cqf#KgsK3{ewAc+#p~UCuQl1H50Q3mzhoVDnVxGtyvSiJ zu{bh%Vbw-=OxukT-M_)v8MmiJvti1KfUg};NL)JHpEVfuOy-hF(BL{8t81<6SlOnC zY)T7${n}{R_zwi=c>B0}1iQ+k09T&DE%@K*KkEz@?Qs8~Q8e0`JB6}9_bJ16999;-G0SyzL#T2OYg26jGaeaEXKRuA8Yk zAHFg39q-1y!ClI6nFtjB!Fee(G;8fwyFPL_3Yw!#er&hsjK zc<5P!uuIw{PQMUh`0ILOcHcy+o+nY?>-962dl!En}@ly7Zs_n%OHdH^X2(;=fUPCF@vzEs*6B%LRX=3^gP;nr0)H zpSAhmP>iG>Kicht!yTXPGWQ##pjdv!-w6v);VZbVWU!cB9tCfK7ZP z|27Q^KEd+8EYYD$*?w}sul?SySY#fBeWw0x*!5a#u7~g(JUaLgX9kNDm<3DZ1J3@wG{$n=Ep3gtzJl!Pd5BSypS|Sj3|{&+hctq=^#(f^K7gOlZ^~q zeMbIPfh!NJTZ|d=!e}-Ma8a7k57$5YNX*x16vXn&wNY*q^d{$IuuIk z&DCNNWE60mkOV2b8X>7g0%uUN!*^QnJo%7=>@&1{5JqofDgTYqmr~nPsD`k8+QIIh zc_r+8pJFZW+2$r4bJ^}Skq2UAGkK+nxbX~R(P;pH_5?{tOW!N#>Y|qf&rZ~|(ZVI8 zl+9q})Pi^PaUyX!QD&ZaNBdvHJk?cU8Knt((+q+H3I%gXP&5w z*E|@%EU9izoZRvG216fXCE#&^!El+B=}G4zueayHdk0;KZcj!#tKd7+4fFfVf@&v> zSTTHATf43;-&Hf!|E=DYS@3d4Og4f2LoQHjf~?~ZrAllUWd_q`PqfMY6cCR?@HxdB z&!U}ZtEf{xbWxVzNI+sru31M}Lw}66es9&?snWjpXyDBE0e1@Bh^dK5%R9oVAWS`B z^9>dn1pqi}pQWE1ii?T{APkey{_Z*w=DH^%NNZ?uajtF>tJ;eRk5B9$sT9kFfh^&{ zj1e1zv81M%Xu^I+-w9$|KhQF1Th$uzc|=UTYTeL2gT{EZLm!@j8G7&(yh0?F<5hNd zAQ<5pk&NqOmdn*JpHgZhaGDQd~`6PGSE6pl` zO1K6Q{U?}sCPr>7uQ5Czz-FlTMNsWa!PJB9UIqn6htVO`T5&pZe#Z%M!Cw`0d{c&j zHSH6T*PRuMel6%M!0*6z)maDn8Fkfz^TXz=09Bu3e@>yaeTN?=QZ+{0(q_r)@mjDT zUSOzk+PV)o(|`al*K^L~j3xF01Mk{TS}r%P{BP=e-ni%`uZs-|=p{qP1Qj1Y3tN)m z#KE(|xwc9?>v-HS?#jpZw^fLja76#gy|2wvDBy#L`3tVo@}7p0>X|d|eN0L6F^wWm z!@Pu9nchgb-e3)uwN8ZZ*zS8s^?T>icKke=ibq=iWAHF-^{Sb@`*`JlzA@_%hy{7; z4U@;%|13e`JWR5~-ZC;YGIb7t`3sUdG8Bp(g%~>Q?V>!j3wRc*B{k~TyXY`Hg(H@9 zPrZ!ki($O#UpD98wJt4~R;2WJrrqOiVr)53gJ}Ye{W<@1H~^yssu9TJ_VufC{o-PO zESG*|g@r?}w%t9ySkFFH(@rRWep~~pB+zSMdrsqi!{tzD_b2TPlz#$@TX*Mf2)O5a zcg>zNXQO>PH>3o8!V+$O=HYBF+P1&)N6$Qd*5eX;+CjpwLU;tb*032M^Np4(pWv3a zF;*HRne&=Jw=S7r zr?g#UlbJQV#lqI!o4&LyrcfP+D>lMR1sWtV(jaY4)6+b?yPkqQZ7{X%K2Xgi9>13V zdK}*poG23KTO}(kRcTx)|EY=pck1K~Q)dLTaN|#2h3Wk{;#NUUdrw+K#)=ExB0Smp z5v`(2?W{wX1iH;ccQPt9GUzM(c)8vKA>|}d2eQB>B%P9|+cjy{d1(}{;?8_;%SF`N zAcNJy>Q4<5+5f8~&y`xpd$xvTaI^4n&f~`&jWbF5HsW&FI>`6^+XwA>4hJkwt-v#T zH8YjIO-^G^lweipnU5J)NioJicM?mV1%&e(5p<3#dYrEm=>tgQINW>Tx1QK!om1)= z_Rz;tm5Gu$P2WG`F~I=&1a<+H1T~r-MVg4>v>vf{v>m?TOEjT=60*z#&UflZ`%7fb z&AR$c=WzvgNMhHu;^G2DEd@m_hvH)2s`4~+5*+i8<+8S|*Xhp=RUYo14ACG>u$Vq9 z;Cpc~1(r+uFVc<*3l1;?D~({cvL^PAT_WnK9MREyShj^!ff7HuD%c&?!6X-TikNdR z&;t<5$O6|50%l2EBPfgQ=zD!0OnPMK=rZc-78MtZmF!+yVHr|6*p)ay$~rWNQgY8S zJW30PNA{V--x^ra$dt!PjIJ&U>4b(s{Yb3#e(;fIk#!x3MCS^U%2VUx#OGF8a$%23 zrNf^-%1eM316lGlB2Ew8LD}gR`m!)t6jA|51!T!Bu=`nH7g}KVYFtp)bXs*djV@KG zg$sqrhaVFFHZ!Q>X*MmfC#9$?lVqVrfE_FNK>RlcRVCm7l^j|I+S&(hRfQV!^*)Rx zNQ7A6ptwf2;m?V4#(?dvAR~~b0#q?yC;x$ef5fsJ5L<*{0X+CCB$H{56n;iiJHa z*}!^BgFIUg=7`c^kTK;zsRK%J{=x^`jE$Z9&YLz*1#R8_Ume3!l2Ez4FFKkN49)47AvO@ND%a}N4DN#<1b-U;bR&Ww zn2xK7xv#mNu8h5>yWo8XPdi7!KzA?j{}3dn5a@N^{-L8UtDU2>tH*8jt(FdUR#%7H z>~|&fg!Q~s99>*BgC9BG3D!5U4}NGb?ZB=ePa+p60}kNs=zE_v(A~|$M<(z#`+vuk z0YBsZS%{tWzpwZ{yv?qJJ0YvNo*}D>=Oaf}2|=WQy@~lK4o))0s_Or9GVt4Nb{Ah?FBu`BfPetO05L(& zN6tbb($dmG!lFW=q5|L>0zN?=zV`zKJbZ5A4)K4Fq3Y;k|H#$L*VWU56?e@0cAkE| zx7pc+a3>M^pR<756Z+r#1Hb(52swIyVR;1ZKaUBu1wpKkma39T;H%BH5MS%jpv&`_ z)mKdq1R1nmZ>-t%iKYlt*F1ZX2wvn9BE-Zo&r2%E9k4>g9S!&RIC<_Rh`X*o@L?~MOh0{rN#Q)C=%N{!rfR{nVgjR+qAZFr~i;9d>hCj!rR;0(!qpv_+>#KqKTY+(Q2$a(V#E)l)S3pv^*fP>FF7q}s zthez8RzmdnmBMi_h1-ho;&(S?7zf7b>3ygTYKHkn46+lBpb)4BU!Y2;nn{shg4+|m z@yENGqQv^((C65~Mv#KpZLB7WSQS6##tGyLmm)%{(1(&df#mf?&|FX=R1TBEs_$}7 zXjc46$*LVLSSO0r2_u4uy=;cPf)B$`p?OmctQJpgm#pn!)r6P_kRL>XkqM!9`#?my zy84E=6YliR0wZ%t0QJB^@txk?8|D8jgtSV7xxhA#icu@NR0AI@-o6ekaj~n0_Y&oB z5@MqN$)mp=Kb$(NO>1Au`i_`a7rxU&z=}_6WBnjEj8|Nw5#vOtkm>46k2wx<8*lZJ z2wh;%gX-bt#Qt;CD2kgeUvJ!F-f2B^o?q0jBs~5U)$->>#g-O*#}J zT`p=P(`!sUN+}%KnjC4W?1d%9JksgfecOT7@v7{#<>fn$TUEr$R?fqJ7e?^?INzeK zaCn~BOktzF?q_VZ%v*ec|AS2s7f7FPiCF(u%~JL%t9wXM+qe8^^2?Vmf0mb*gE%=k zaUZjn{f>h}Lk&{7`l;Z|dR){(2zZY-(=7yCD(PmLF_m&bId8gS7H_=rH8mqnE#s8F zH&-cQyHUd2Pm~LndV4kP92_{1Qd0CR3=HuaufKg-cE@lU4XBf4Q^kKjoFtj|<6jW| zZA^o{h7p7$qXbOIZ|+{PwJJ-;n%(Dt9{TxxtSc$`e9zW)Yv(vrFn{Rfs((urMQqon zUAbHRqUnwnTE)iY99r>3+$N@`<>kD^Y3%0((Nu5L6cKE!(db2~PH(1#puEgMr&%}T zZX~N$BrBDg(GN`yc7iCZYIu0~hmH<~M}L1ddELEx*9C=Qg|A?IP)>{j9CE@jWTdrPA46T2&rN*aGgBAPk1eAZVCR9d1 zhRTR5_z`uMRjo4~l39aJHm0T$^kiJ8CnxNs2Kf}ezP`@_e0`4=w*$o=3t2u;=TbI= zmLdibZBQ8LygA`k9m;|i&W-Oyhu%jen86&zwoR)|Z6t(*h9-ahwEh7;-zO%_&24P{ z3g--liZi6Mzj(?WUzGB9Np)kGHi5vb;+j+4b?{Cz?yV)$N@496H8G9hjyI$ssO4A5 za708xN>rF#xdA6JsiderhwQW4Z1_do?CIKUS-Se|^5mS+R0-Xk(z*INHa2aj6yh`RA?P|7dw%H0$}xm$7GO zp)}X7VV56aH};F(yupu&iRm30iXD9rQ^ftW+YY>`)UH5^JjF~sS4u}*zk)6Bwp<&` zg|fT5`|GXt)4!OqJEiK_0cqKHp=O3yRTBzYrBjK_~`}?d;gE$Em7*c@hNHC=&(IPY+3mm7dHFg@PVG ze!TYQ&#SY^twV!s!O7^=Al%ii?t=II$y&#^<>ksjLB|d`%7s+yFA(3wsKMAbOuHWh z%8doe3Fb+8+x?jdnA@E02)``gju#PTGxu^_A0;s#tH8s^LU|pX<3ilD70_?2O!)PQ zx9^K-hVUr{3iSfzm=FKXv^=bLn>04Pb0;-llVho-rlyg!1Y(sK7?Rxs@vMydi?b$k?iz-TUn`UZ-0}4fnj)J0+ByNl-d`q$cpxol3Vx6 z(dGKOu|Fk1OB%lYOYL&nvt#D;cg6dIPj)p_nYo^y2b}Q*EKMj1h`K$lfCxVj6O6p+)TG@wD|1ba%0>kL}2XQy#$GeV+GC43~9#C5);{8Xrifao5?ToCicIs;Q67U=2S7*()RnD0tS-8QE?m$*vu6Vt= zy37LpED||`^+KTwr2PS#Q>J&p=3-)GOo&xxGpgGlB_WyL4iuJ?dsbhMWRef12TLav zd0^N1;G^A4v)@GZeY|%a7r|+1X_&3Un^Xu0brIRKSVKcgI~5!fqJq1K(BtKoLT}5n z;r)@hWp$P4ER`5kg0s-lTE?SJyDMmFj0&ov`Eh1bp9-c(*>}3$z5j39;p~%Zd}cIB z&z^l!DKt!>>b#;nzaMi-)y54>IiCzw}u)dzQ z#+=OF-X7wLLG1^()!!-APdr}@zgS(5BBDG%4_5jQ=;CKbSrccV4#_gJn&vIY;M_$2 zgeMRq$ytdf*-g|{Wo6s)NApqRRkj_obQH07z|n}^KMC>hM9g?-goMc2grEDJT^x3F z$bD*Dsy64JsIe#V|1%L$Qo3&d~t7>d2&1CprEGaN>~RAH8nMBv|-+=mZM`aA46h^ zP2fVzoy+sN%g2O&#QacB?Ga>17d1$ZV1+}-oVFG+!#h$yRn&-COni4c_X3->uZvQl zwZ5#Z%)!Nln;}tMO&ReLRGFQfN7jvAFrl`+tKiP}ndUk>pDarKnQdbXnDL`4uc!bw z_cTzBLc8quqbC01;^Kp`v9ZF^yx`yF0Re~j<|O;Np?KHb_A`m7vFkr)wO05|V3h=Q z$2U=YNh5w?6azf83WrTY67v5rcohUn^PoO;rWu23QeIw8mE5zv(=W8xak0_yTvw2U z+E3q0is@)k;ldtw0g6az_Ic-}P@AEN$yLwkO}eY;SKbt*yB{GyVehr-_Nl z{BWVl5tcFxeSUhVlJWi|7tNwVqxRwB$HJ;Aaz{tU#)GMcY+6^fxKcSlg9Fzc@Mof? z^23K8K})?al(b#1>f#5BMIgDoA!I}qHGgBSGpQbwJxLAmA&ST4-493vY}L0lxbuB-^161hF-ecNwV$5^hgRnugWECT=i}jO!t?`vr*slvdILAA8mJQ0Yy3AY zK_z8lqDVF2<&5oG_;Iqo(eKf?@T7LJCplT2{RQg;Z!I%ZCUJj6ai#SqxX&}X6vzyI zgnA~BN zt@11R#|&F-hs+NiJg5%dfAGmpggu`9b59TT=;-L*T-gA@jrDcn!^6X5be!T=%Xd{w z)F8eyhOm(Ut9(U~+ zZpn_QqTo6fmsD=ga{_21ArhDze8ohMZgT;1bs~jQ;p|^x_(^H_)Q{!S3&I1Bpl;X^@VBYmOaQ;w^|7Bp&pt6y{brIM)S z&;E7USWlHpr`r}B<5NHzm~x|m)2pYUq!_Y!A*^v$Y5&GI^())&FHhb}K0c_+uj&|> zy|ur;zqYo9Y3Mk2_x1A|R2q5Dd~$l~y*A8NX;DYWXI81mO2t~l&HF-Ab*kRos56fJwV?XWO@$PC=nz3Eoq#-!i zYJNEL<=N1s9FbmoGl1@=hg-4z%bft+M7xM&uS7 zYor)>liTo{dY2RZ5p{fqH*DZGf~?YzQ@&FIQ5V3?p&_uHzpIr?-hgRg=mO=f84{6t~U6TftwM|fWiym*_iVdY%tcy+O z>s>aqUG-A~dVYJaa;j|FO)a^d-kXe`Et~a@t3&yek?zJC78cj@0)G*=p6&F56GSC@ zpB;IF*>;<*C*KZaO5tFmLU34FT7KE|Z&_aZ_Ijq#m#Vk4@CF&Y`n$xIJ+r9hstQCI zCGf&P*XQvy#l4Hut&WAfkiSjpVj(*_JBF5)@hso*VUoAVkw?BVGBVFKIjZe@ zlKQe(nJ7wekR(f!V|aFU7O!5vK(gx=hCSjMiaqnriX{{Pn?PiYDBP=5_~1O0SK=AE z$XFpOE87)c^wz8*{l||V^KrNGFc06iA;GbSOJBdn>vOm&>;Felis=c5miW~;&FKcu z_kXsw48V#bk6gyni&>!*N5^OheN}6bSTTn7QL@cXN{(eI6yG*AHT|yXVV)kIn`6-{ zHjeLeUtCPw4^yF^b$TVhMfE(DD&Eq`AuP=+^3Fempfc$xqBbtcsM4~`ot z=?Asgbgw@XA^;#16&DkLs-{Y#2FM|44${4RqQTSFlQ%s+s_Hb9A-m%xkw4Aot18NY zbbzW?*2vbaQz6YO%Ky%{!owdL8NGN6`V=ABsy$Tt;$N)7e2>D#Hj~6SD>Vg+{Ik!W z)hjJOl7w~SgNjvCSvgQ+*Bu`T5SQP=cNjYVNxh~S(F$3>SGAl~Wyln|AQRJxNen&T zu(j=Q?9ce}?%g{o=i zK|i+_ds?vH-S0UQe&Hg{3pPm8uTOE**oB1!5#3En zs_L_X(CXgdZ`KWxTMx)HzcEmcgNA9F(_eX=$l#3tGCoR*Gu%t3rb)yj^NWOj5|;I#;$e z35KM;PDfTHp!{1tTvHzGrHz+Dwl-4Y;xq&puviwFR`a?%!%wG~kl$GEf+YudNMUiY z<98MS>>stvcU9a#7a1srhI4_wL=}77!p{i{1b&YHR9ah5z}AL{vj?SlUPI~Rh0Eh1Z_wPCBnDA}S(%xc)*LyRnXEPDy4LNXO&Uft!DmO?Ho7xSADmvG;00okiplG(3NWgBHFj#pdACC{_74u!5p33=8tLcBxmNB8ii92a+y3f| zA>|enBm@WmP?4qG{L8bQ`1p9cYQt5NC=N>G(^;~5%?!UsY-o2B*Ynx0Gz3r+Xc>2b zYN2Xm0tjuT86N;$WlZ9ID0w3q0t1C}alpo;l2qiFUk*Ce{Y!rzT70EaXieasDpvHV z&o5F3E1%)B)KPQfEj8*a7pr?NdX9YEOq9s7+>nrKhWv=V|_<;F7X_yTr z1(O760>NPq)P;A}ZNYw=dn5LN)m^Pt!jG?K@NrGUClK|6dY%LZgsA4j*^rIb-`>8F zZpWgApPul0Uu@1@kb|m)%pnI=t%$q)a3;X^wz?z*eq3#0W6G=JP>c#fIXK`0a-pWCM!;Q+1FU0!U^fF~#Nzav zgBVHbknTo;A~%10BwW&dC5Fnb?euTUM$xyo_|Wn3@!IC5gunki&eo$}3G^&18Ztli z?v$mSXoT-+^kWH!%bZ|vGvO+VO0?xzZwcf9S?!M|Y;URhcBzVWW*9n;AbHg^fBiaN!5d_y>jAoEyk zl>9Apbg#wVl=CWaj4?^WbYfl}v;D(G)6e}v9nW68xU#gotYk!EYHHdH`oQnK@QqQL zov7TaOMPZmwVY_DYN@I>yOP_09;E>+Q4$EGsdtGN05Mq&6AfK=$oGo9Ws-f-n1P?RzL#_NZ?WPqZ&QtQ$>oL!hKHcPn02=Raz)KE?ql z*XE}JJUl$uLY3J0!_&H9{HX5F7z~ued|O7E6sQ=tJe$``L=(Dyb^ge}hv~elB#=#T z8w1x;fibo!mARJ$X?je3C<7Sm$MxhMP9-YVc=p-Q-9diqSyWA}=bSv1GRB*!bHS?| z=x8(FzZ;V{5$Z{h_M%n}{3cygkobm_$PpWY_hS=i1>m+|>bPh!G=TYqpwWZEUDx^nYh2LM!U)zxOwS^$I88I<%{z;_ z&k5^?<=m)qPqP7ah@yHeIq&%9H9ESMjo-g_qOhnGDtO)GGXOvaf7KG|Bm#cW<q&wcp@2u`-P|Pu|8`2tIY> zg{aZ%wEUmGe9_hj3TnE^kQg6L#T_5%v-;IBP%El<03h01;Yq6ODMPD1!EH7~B^0p_ zoJn0a2(Q0bC)L5|`~Rr>w$$7#(*Pvv{#xBCGd@6d$YJ!MytoC#N`;qo6XPFbynL6cE7{7k3}gq+#LC;Ab$6)zh1X zrq?1_|ADXRuicGF#f;%;i?w-_z`0+oT=GD7Oik0p(zVMV)JMy2)6+Q%%VZfc<>f^U z4Rk?4l_zl=S`Prdr#@Mws6a(zuAeNX4LA`RiuiTWRE$0VJFw=~RpK}*xH2L*I9Rmx z6?Rn7)|MqOkBALFPE}cukFU;$sdN=_^E|ve%SP-Dtg+BDrw@=>WO9$aUj9;&32)5B z#RZv=vzNs1_&AZ85g29O^pu47_&=c1nyuwbi8|G&@KeLgu_U&|1=Ozv1Oz_HGEvlV zXqERlD09pf(C_U)Hy~$g^MLjRkAOaZ{w(VH8fyv;Bn*#0n`yqBazhpZZHw?RwI=>X>Q~)& zS#i(~hL(G;gp-Dj&WhVnFmlpOU5W{rBqch`Nt?h%LxQ!tPcV;Q(P+oXki8eBE0?9d+aj=K3q7m!geRh}f=qDT*{>fH?s8pq`k8+T?rgCpkm6-}X8Dx%b(La4w!Ma5$Vrv!t}w-#}#4y(lh@t8rQ|ApHW>((|Kb zsaOQJsGJ6v#mv%&&sY(1L%Xfzk_fO zRK5Tj4zMe@QeB(F%Izrh3S4~zKl~XoxcG`e$q2G=OD8QlSeS8YWedijqrz^m&CuEK zjI4;gEtknUcwWEA^|FDSY;Ru5<54w7G;loLevujRz3HMJgv>%Hdft?Ss4OyoV?zTj z6XT(6H6tcG++|mzD}%A*a3Pd-m?Avp{=MuGF}M zp2c|XcrlR(QA^iBRVcWa3Wmh%1&aPyYe3Q>s%}!WF%3KVWYR6qH##Wq)_Qhruo(K_ zRGJ!XBfz?OJAF@yo(aQrzYAY9li1QvN*RH#G!OhH#A6sVaFIW9U2)8n3dRbyu@N=8 zh?|?cx6wBNYpSZG1aru8M=nVvy%|a!qlSpaSoV|FvQu>NsXF(PgmZz0>{@}XN1 z3-E7`h7eKrC&nZla|$zXI!fBiEHPL#c7RoB)l(C2``+5htIE%HxfZqq4Xs~!AJaxv zpg|`Fa{C+OGA*Kst;1Uda|VN`$D*(LB*d;Liar)0E%{3ND>gQE5e$!LmhLMKE#OaR zxVnD6_J`~p9H^x8UQz|zB)|%!i&OoC#bTvOnB90Xp^^k$eXSCt7UJZV4FKEtA+T2fgi8jmTZNt;yAb@p!uITqkX*X+*HYuM zB~XzDJQ_$X{ayU_E5C{goBuK~GgHo3)`F3dlXsh%=6;=9f}S}A59$&KC%Jwpf~Z15 zLSC7_W3Bkk%gyCmS4JR=?RS`XowO`!{Z0=SL z;tXn_=UkzXI5OeoBK=T7G zpk1&UC8(}%-w%C(%@OK6J2?qnT3rQVBhK#wqbg|AN*~ew-W67Nc}o=6DxPEi2(~dO zt${PAe&FfSrDgm97?=TgMe*;(YNG6vHJsRfb;*#0TNuI&Z)B_L#4A90jV}MArK+~pz zTX~Icyp}^-jQ-3|go3e7k!7<{P(i7FE(zqOrEp*uw+ot@ zf@oh#m_MilIQbC_H+=w9*QDMuAS~FjpTZQqsFMkJh=f0l&{GKJTps`m{Q@bSApULU zaBbpkInPv;?F;toN`Tn>8t^RJHTt=Pq5Mj|b7y1(lFJ`p-TC7&7WBsIS?(ln> z9vBsn3cG526E$Q+L?Y7p?lQPu0f;R-o1xOY1`ee4XewR=9H;LZt>r5yVgFoyowNzB zhf7g9#jdYBXay|HK0=Yz6`6Ak8fauB+zlv~884CMByK+&ujrRjgKhcXBMG?5?fUw9 zk+t#TE0~>2=f`V%ZUn=4D8z}=b3ZSy;qc!-%C?J&*csWPfyfC!BWpCO>j^o6FbYxx z9oP-9c^D9@|nq56S zKF43}@p-ke)^oi-NqRv9aB)Xq1~9nQXw{ z=+SJW`?gVP@za~14>qT7Xu>D_*5Kc1&j+5MwPc&6?z}9TuUbw;XSvl%_gC-ME ztBmXyXClaf?UlT51yq6(czMY|Z8nT-_&@+}1U6RU7w@~o%*jN6vB^Gp@42?ZgJ^=Oby7!)ygNz2Hv17<2cJv{_j0$~;Cw+5c+^l}P3`lyQ+>2PR0hR#L`m`1m#lr_Z}V!$ZhZQn`fm+V2YZI8YW zy9Vs}I92$60fzbG)qI8Ib;>56h)o6Q>`kPj6=YPcPJ92i0~ZMfr?bpb${(S6K@I^L zj);Ka{2so$?*<;FlF`C}P|*eE@7vrQCG?@T_IuDgCZZjT*n#rg!ClO&xh_;}okP0y z58hD5O0SH(yZv|tmls=?VewST00Rldvjd3Je(>@Aa)B1%ZX7EjaIG*F81seYyuh~u zJ+62ah?U}*Y6atzH&8~O10H>=w??oc=2<8B3sy;`fc~y<^o8%ebtRCxjI~FxSS8?x zN1*LoUZh+ofSYB>vVX=;zupvq^GMAOw*)>}PO2Pa@WvtKiK%Zj$#Odgu*uB+W%LgXNnZW|xh?K=?QYDYi~X_0c<7AT%_mfUSins}Cm5J@Iw?8} zBX^IuAsyi8c>w|vvj2Ou8;cUY5~r%EqJoF7go$Nwavz;WB^~c7T>AV3Ho)5YIt=>w z?ww%x)@&P{ZSZ<=D)e)B>x=;PBLC80b<0Ulko2GwYK7OM3j^?&poLO}^Yv{_juc)1 z&tU~P1AOOYhnw3gi#Kj_?KkpIf36PC%#bT11Ox@^lb=0P%@111O2(*PtW&i4K!Mj! ztZq8%2|7b)o<>?l&P)sOQN5hhK8Hq-jA;U#dCE(QUpocg)YKbzBlf^SecCN5bBRGQ z1GTaf=LZ3v4y*v656*7vTe5`wsW}9O&H1qHo-vdb;Yiz>y-^QDdWafJTTTDYM(Li8 zt?gXFj7Nj})Q3Jvd3k07j;o&*x96WQdSDnmTVZN_>nPN70+5IZJ6mMwauCIC9pXV% z@81uF1BKI|4LJ0rB5mvT1f+@biDU+ko35@XLsNvYPSr9=!7(3>fYOd-^k^*f1xblx zpfm%Z(1&ZN_wFSELvl#Thuoq5%&dZv3M*kn_gp=Y2cA$_=rg z>0qx09zR@FhajDF8$8;PQCXL1eAdyaDVbnkrt#NJx|OK1vk|~y-+%rjYne%Utx?y` z;PIUE0vIt@tr|SKV@T-~5k@*XI=i5G{+^z@IJhw3EmjV%cnvSWulzpkb!u0~Qx>)NrjJg=1lh z=)7Z<=PpKTchlD|;Qgt3#Aj%DNzlP(gwZ*V0M> zGz-LkC_va^;p}+V=etW(8Bo7N{tc^8;tYZ!?oJ0$Z@}o^<)8m?W@!V?a4F`M&21Xt zmP-!wuB0@j)oLXEZ}qk>NE2t0?a??(VB=8%SlX2~7caz6peQ!`TKP4C26`Y2(S z0sP(G$A>eqvCP2;;LHOg3gi|)KfmK4h0C*b+p}MEERiv?`zM(s_4*v}z^l^M+qv<_ zREkXe9rijW&evpOH({)?lq`P_jzj+fp(*|7{34Aj60~)YbSi9Xdz_T*QLv4{qnwW* zVpjC@6aw{7Dya*=g&o_V<#bZ86%FQy5{`5m)W+bn^vA@tCM!$YS(GqH7s4N4LD-%6 z6s*Z^wT=Lla@nFI>~S3M=AIU5fW2D=^9j)mq3g#!Mj0VFT;|S84gimF$N* zwjrAz-{EYstqAE4!OME$ys$I63H{EX`|bFUa5#nth@^b3HHe@Fec{wFXo99 z0x8{0#${D+pz6Xn(E(Vyi`~zmBoK=Ek^w44#s1a11>eU+;L-Je`C<*kjAgLZIJK^l z6GpvhYP$Y#{9X6A*BZAT4l+7Wg7a>LU!FDswF`GDQ`53;y9J!gW($hD&*h%Mr7wNu z;)Y`&+-<9ova)&FV6|Yqd7uF@sphq1#4?r8m(al|nB^uM>n3%9+qKiZ=xve0F}ih_ zIyGg93s!-WiJhNs%}motNo17#)iQT32-fZJ=qLe%!}x$pTMx;f{?Qnc+Z`|x&Y2@Q z_oXA?SChw|CtgA&ET#ju7(#QP#X#a<@|1WjK@q~-xE=gKmN|LE%A=`R+td^!E#DY& zt6B@v{cT*N@M4O^d0QTTQN+8r?hG7rVUR)tu^O17055OtH5wZ8{Lq~~%CP+k+gyCB zrSCq05jrg`CXj+EZGzR{lNeSAorsu0yevS`SQ?C&T`&@z0x9Q0U=RkYQtF0C7 zY4+RD2Hs0*-y0^9n5UC&I813|Ynu%G-M%h*vI|Laa`M2X7aIR2hr(!qM*u({RIswT zYQ@LP%LELA2de??ySXYLQb>IM!6~s{_VNzO?=~F`NQyvKH`j=Ei4l8`;jFo`Z@A<4 z{R`n*U@_g}2GQTiR}YeAnjnr`0%^sEjX*@d3(Vre_wR*@%6WlS zic1s%z6iYP_pLi5v%woxOtYPxQB;wDINk@y6<2bEMMSo1?6vv$_;Nwm^7w3bD4=!k zyN)wf{!Sa7p`Zq#Aw|ZYBeCkbP&$6ndk{3uauSYJb~(?Stn7}+wW2KpQRM#uVIX{9 z0+^XM0BQONHptN0nk=>};^4r)b^9|TE}X*}zssEc^*T_N0N410t4R|RPYt=FL7Ec+ zh9p4KE0df43-j2hHryVLD=cJFn0TvjFO6vZa@^mS9DWpz{XR=4o}dIljE|Y|t4TnJ zh}id~3TEIIsNz);xXRD?u4yH^=-an%fk2eGstgpQRvRHVBqNXso&q>eL`1=4ZcOS5 zm`Wqaic|;fI+@(P3zYB&H(1KczXLw?@c#Y6D!|A0a0vYI(Z2dCRBtaJ{ek?<`% zFEUJr9kZyc*!>!W;-UfMMo^)6qietk4}L(PrpuMO|E}e)WjnCmWI%M087MDAQP?!( zO&|k-MTzqDrKzf_l6tg+0A}_JZGrf$9s7w*e{o4kdtfj&UYu+!><5bgmaWJNDI>Ux ze=KgB11rTH6b)=!$e}+jAhiA_tpr0`F9k9$eCr)TPzBi6#l4WJQ$X7^v1a?mLXgejrDy}fy0q66-t77}tA z`Be-k9WDs^VYoS`xB20oU8nf=JpJzu+5+e-qeeLb?)~$h806bgU*yuVs3e^8i zM;wU;Y6Td+PLPuT!Ar2>xP^p3CJ5+sh!|y1=Pk9RmZg$_&jUo$8j!=-2Gj5wtj{%B zuX#)Xf4{eNP!G`rY7u5d8c5{ExOkQbuX7L~RkX)Lw_w`S_;SgigX@~8mXT=F3bSh< zLeW$Nk}Gcj;ZsAffhBYegcLy^UJ(L-187uiK*W?Ay4f~Q*fE#+W9 zyiR+NI}2E$KztD{w_}LI*w`o{B4CY+QP7qQbfss>V2X`8mga4S;a7jwaX1ftpDYx1Ty|NK+5 z9<>q(o^;S>kz)gSyjX)=8HsNI=%0YtNm41F2q~(f7XR+pw(E%x58NtQ8sDr=>`_eq zR-{82*yw~%KCDi!2cy2P8x2)kuo0uDHvRvf2LhTvSWked#~Xlp5PAS<#d!Yy)S_Yk z5^p9V<=&n=>A&Fyh9K3A6O0rN$f{%bHZ7>|zXIvYzvUi~Y+8%BAFxts9_;VO805>} zaPjnHQSke1!kVS~;G?;Farz!H%yKJmX zV%5Z_9%tkzBiO)mC*aE5kUqe%p~H_@49Wv`s`_gq5s&}_ywCpp{CokJhA}P8&B`h& zDp#tx>0Vxt>8^+LzFDkTAAgCiTKh}%kAb$PO5vK05yWr}@{b(lSjIR-^X*g06Ki$E z;&YLZV3xe3Dsh4ij(+_5^{W-=?V1Okpeuzcx0RPX` zQYs$Ue86@CTM?iQ@EA%a)Aj3G&p;L$2)Vz2i@0shpP}1;hsqs&meupORGA=0Bw=K0 z20VvSE!LdDp<@9tj6)NI1;l^CBs7E>oo~8?MRAcxoXeiw}55c<2f)y@Ll=(VrzCON1>6s*w4YeQjtIh2tpAZpLDD^K6{{XhWG?$Lp7F+dPvp?Id>z_fbWMib1R!L~K6OiHr z4NkK9hjtzjSwab?)81vj4!F%9O%YUI3GaI%;+(*S&bkk)CUY};OSpUeXJeWrYlNTN z6bU^}nu(ieda{WJOJwALeqyTBm9F(eolyt_%sXljyqwBeM1X<5@lIt)okr Y4Z`$9zn%|2*R3 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 literal 0 HcmV?d00001 diff --git a/src/android/app/src/main/res/drawable-hdpi/stick_main.png b/src/android/app/src/main/res/drawable-hdpi/stick_main.png new file mode 100644 index 0000000000000000000000000000000000000000..ae6d025a5caadda387625488432ca3e10ae430b5 GIT binary patch literal 12828 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

Vh@maJ|Xj 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 literal 0 HcmV?d00001 diff --git a/src/android/app/src/main/res/drawable-hdpi/stick_main_pressed.png b/src/android/app/src/main/res/drawable-hdpi/stick_main_pressed.png new file mode 100644 index 0000000000000000000000000000000000000000..ca469c6a7c7f17b11ebc33ce33cd240185512ab2 GIT binary patch literal 8244 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 LQ?Xp$;?@5FtG<`< literal 0 HcmV?d00001 diff --git a/src/android/app/src/main/res/drawable-hdpi/stick_main_range.png b/src/android/app/src/main/res/drawable-hdpi/stick_main_range.png new file mode 100644 index 0000000000000000000000000000000000000000..9b5445edcf72a1f0d7660ab3d396e0833649e500 GIT binary patch literal 32592 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

EdgFuW6azMpZ`6kKb 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 DPrjT< literal 0 HcmV?d00001 diff --git a/src/android/app/src/main/res/drawable-mdpi/ic_cia_install.png b/src/android/app/src/main/res/drawable-mdpi/ic_cia_install.png new file mode 100644 index 0000000000000000000000000000000000000000..c6dc232b44e3d1f2aee1efaaea1ca15fc431fc33 GIT binary patch literal 364 zcmV-y0h9iTP)!UKp& z7gW?l7G_~s9yt5*()h!`%w+y=c8j+mLaV?t@B*yG7_DjmGl^rXX(?jCr^-JTv0$q5 zpG7Q4rT@9$5O@IU5u6?19yqcL&s6NIeogfcRKFT{{?ties3m|J(%TMZPpwyO2F5Z_ zQuQXV9?Z0?aIZ6Eo&W>jTfT=OFjBv_W8q%s!6~Of?V_6&?$t_w`smLK_qs@cUs}xt zV8bxiQSd9nykoAo2Gb32YnZDG^U)PwQVa}6t9t&n?x}bc(!3HF|Hk`EvQgc0B978O6-(I!lVlot9yRf~x zzISTIQ%0N4@DECHhiBi2%6e#+!xAX6{fg7Z0H$b8rx;JgHwVI5+A38VS=b^Tb}94a z@0{{_V%OFK#!9Sh_k|?Sy>S1QZ{W<{%WrGBDScyGLQJ>!ygKR{rf*u{ z&%2^g>W8p`w}m~ogR$ZTt^<0C8~BeKACt+wb1MA9bS~q=^&byBVQqZsYc^MSWgyU@ N44$rjF6*2UngF(pO?ChP literal 0 HcmV?d00001 diff --git a/src/android/app/src/main/res/drawable-mdpi/ic_premium.png b/src/android/app/src/main/res/drawable-mdpi/ic_premium.png new file mode 100644 index 0000000000000000000000000000000000000000..4dfb625961f6f7c7b125454449d7be2e456c9789 GIT binary patch literal 605 zcmV-j0;2tiP)tEYHhcmu9owL_odwqMY^{sun)i-pPVHFl&48G$IPT)Z1GZ1Sr z9YgRES8)jKN+<|=;w&bV9ReK@uozZ8w12`-+)wtpMAF6J z$FVSer-m*@k5JtU>_uDQoH9ta8DC}ao1vtBQJ%qJ-xLHpV|@j)@GkYB2`yC;q~P!I z82!Vx16y%1D$)`?ot^rV2+}ZZtRi@OG;>=VPB@BPn1>PAgFcuT7wD`BeQ&9P;9z{O z%WOB$6q(HpCDms8EAyu!)pXKd2u9;BzGb%O5%?NbM}|3G*JO*C#c))>*FTth<1%K1 zdghldP@5Bcz!bc#Krk|t@+GrfiIObBdORwA$Wb4kk74VGvLw8T2|gJzeT4z#3<}(f;d@-NCs}^NoLDzU){UX2 zYgzEA_*{t~;c1ZE&TQ$==rGP;ERKae_2PUqcwZ>)=ebHHDwiew8BL3Inuq1tetI_2 rUQ$`|`%NU(5EM8agH_E?{sMjgYyxm5Sn*(S00000NkvXXu0mjftwt2> literal 0 HcmV?d00001 diff --git a/src/android/app/src/main/res/drawable-night-hdpi/ic_cia_install.png b/src/android/app/src/main/res/drawable-night-hdpi/ic_cia_install.png new file mode 100644 index 0000000000000000000000000000000000000000..cc986c8ac9865062c63f5c1d78c195e8246daff9 GIT binary patch literal 556 zcmV+{0@MA8P)9dv~5!)izFSAv$pwS;>SV_0P+AbGQ}f+ zVE_fwlyMsx0386@m3|k1v`s==AP2yk)-Tl(sN$*vl~Wz4oc|>4DyL90 zV+s@%DiVw-ke_|JvL?ArfkfL5fDz|RyxKs1_8G&tK>Z}wNG_9Xv9xd3V0=o}77Trm z_Y+sEhDUZz^4f4_)|L9%B!FJ!NuobzO<4N~@&`!m{T- u0weSyW@rY$iu`J!UV_z>_|DV>VBr%0;-TvT!dD{z00005t(aoJW|Pg% z=F999`4 zs1>|t3XI%Sm%gaeMx?+7xIA}65Of5F0z->s|qK zffex(Y7ZO&(uyDx;2Y2tI0@_p`p3D>upY>cMW`-t2PmJwriORGRej<_u>_bFMd+yB z_Fu!kN{;)?6b=3lGKTs7Kq@fuFF*7GkgM!62h>*bGzNO={+3Iq?Oz~~2dq{$UXQTp z3{2JYe-pA8dIHocK{A%oGl7rZc)Bw4y*FMF_!Rs}(XXU18ki_DDGG13u~l z`M@)8`~%QUW$Bk&_Z5@OLx)W75He4J0SffzKtJ6FsH8eq6L~02hLw^eG!|GZmAALA z;>=lmG!+3Wwgr*^OQO3#1;^G%^)L^aR4+)9jJbQ0?#Fv%5YaqoP)DVDp1iimv+WLa z2r_J`=f-$(STAH46|yGKpbXW$T-D7wz>^UB?0}Hz!;mBh1?`7DqsDI);sTXPLZs z9HdnM&E_)e>9%f!!)V~uqR@^lhPZh?>c9$EU+KgrG3&ALq3_w>g)eFmlXw*gyA7J zRGpXa%|k1|%Oc%$UKz!04SB5>XQ2>tmIipR1RclAn~S zSCLx)lxJYDv9BmdOwLX%QAkQn&&;z`dcS+Wl0s&Rtx~wDuYqrYb81GWM^#a3aFt(3 za#eP+Wr~u$9hXgo70`g()RIJnirk#MVyg;UC9t_xKsHENUr7P1q$Jx`$q{6sLWFOC zf^&XRs)DJWnQpS7iIIZ2rJkXgfu)g&j)IYap}D?+xxS&Xu7RPIfti)Dr2-Tv*>Ne@ z6s4qD1-ZCEEd%mwl`=|73as??%gf94%8m8%i_-NCEiEne4UF`SjC6r2bc-wVN)jt{ z^NN*0MnKGPNi9w;$}A|!%+FH*nVFcBUs__Tq@)kBL?3Dk(0lrD{{cDh5K7Gh21^mp z|MO%L-ZL;TeeiT~42fvnJHy{2)KTPE{rjbo5*;1_UV@xc|2AhO&ivbIu&8BI?v@}|n*cKa4(qIa23{w!kty92n5oWM>iPKuwJQ!#RK0kvZK&_&2-C)f>mQ zb*`LnC13JM>yo>Z&Ur|E?>L$0bji~5wn}N_A7`JXR=84{d$9ZB;d@kEN>6%5-#48K-KcB%Zp1aX(la_1y zLhiqljN}YGUw{5^#%q;Xa*_8o?QOjWwC>FBmRuk$QO0#h#VwiJu{_FAow>97pk{H+ zX1P_YZjGA`%njkWCRm%$Snqw~tEw3D2IZd#TveVtB z%gqgp)sJSVi``dWWPS6x<=SmN;U#B%0jqWTjmsOQ<^JzDZvHGo{>YwoNsVX!FDUn~-yRTj seXox0I)PBGuC+21d@@Q}XPQ1rJ4x-znjevE3@SK0UHx3vIVCg!0Ft@Vr2qf` literal 0 HcmV?d00001 diff --git a/src/android/app/src/main/res/drawable-night-mdpi/ic_cia_install.png b/src/android/app/src/main/res/drawable-night-mdpi/ic_cia_install.png new file mode 100644 index 0000000000000000000000000000000000000000..f61d84961525c9e2ebe234ab1af54b2f401b153c GIT binary patch literal 405 zcmV;G0c!qLZ84!O9c@HNwCx|t(}lU5EMm05DbW|m6h07X=CFf_yA(; z#J`v$D;pSZe(oeDjRSMb!1}!Gz$`EZi~w_9P&)$e zCVuOMK-I)wy%6Zg{-?k?a0}$y;8_H2fI{6#=!1k?TQz4nv%hBcmlBv?e2psDF!33X zi}8oquf+EPaBlXCo(h6*CT=w)Y1FJIC5~6lJ^Yxu_Hfl4us%7f>s=$ z3rUxbynN)m3yaUVC^?1{5OPj1BSc#;N*lD8(zVHeQi@^WL6ag~VITN9-`hm$r$Bc{Iy5B3>dwo0T{C!BfL?E%AmvI)Ch`F~BDl zZGpC#C9uJ$5U{EX6<;ze4IE1Y?!X=RCqPxOze=E65a=baE(m<*Z#uyT9&pGRbYp2g ddCrRyroS`LbonQ*OvL~I002ovPDHLkV1lmpSy=!8 literal 0 HcmV?d00001 diff --git a/src/android/app/src/main/res/drawable-night-mdpi/ic_premium.png b/src/android/app/src/main/res/drawable-night-mdpi/ic_premium.png new file mode 100644 index 0000000000000000000000000000000000000000..87bac27dfa30bf09c36b3bb6d80cdaf8105103d8 GIT binary patch literal 595 zcmV-Z0<8UsP)i7#9>}G5q>%EU7!rw;BHlbm@}Q7gDJ7(MkXtD)Vls>g zNfIJS?$^n^%{sN6e0*R2b=qgIz4rR=wf0(Tcly-vQHCX$h2i*y8#snNnND9U$7Bq| z3tYy2oKr$U&=qGfrmPTX3xiEKfyN4YTd_J96a?)USz%Lwr|9($orJa6loK>#cNH6J zK?>vJq~93}|HIHloWw0OLWy+&8RAkUyCsGj_?c!`I;cu67v>J!`tM+sTv4o#CQ|k<9~A){vPSR z9%FGHqwBD(O5>@Bo?v5U{4n-n0p?-@w#QmJbaP$g_qr+w_Qkj&lU+ss2-}RP`uc2r zao#FYOvn9&U>I)WYbJXZhFh@|J4$_0h|Q;9jNV5kec}mN4qUkYj3a=X@n_4sD6VXwLAmLGv zT+d|bF*<-V7=a@pPj`_DD_!ue$he>TDut*Vmh>1+ig~Js)G-UBwvpCSmL5P)^GyCWEX51Xy2Lrcn?!EVYyF0^svq%axPD^?#>4T)f zPBzxp#*$$*ychc3MF9PVXKBn6iUEqxfSfl1*MJeAFOx@xitj+AuB=*HlFz848l6n>*&*pm#OI)oYIGoS zy##n9Cc6$G~0>0=j_-V1;9@oaUTGz~vabc@j^6JsD!e z!K|lA$DL2h{RdeDi~*-&=E_#Y?i}Q|+B?50X8sazJ2grJ?c0E3Vb<_n($2d7-b-1; zn8zw~`@aW{`R8_SgQV$%I9EeA_2(0kf0DFT(iz9xkfbh2uM_-l zHp(aOX~19tiIEtCWE#b-ygZr_V8%rcMJx01DHM~TCj?|ii%nyz|{HcJPFvBr76jXvOTu1Z+w=Q9mn4D9*@GS9%KCienxDw z?Q@}`;Sx}?qh$q{HSn$gE@_x?eY%RB`Cq`-C7{!u7PJI9TIqdv z!3gMDe6%uSwGr^DMaa4^Won`Izzv|seofcnh)z`&^F>Eaj?(fW4g-Yh0Z5x4X2 zqL!SJj(EZ&__1sR{m+<$uf$aS66 z6Hm>Kf4IMAimCuJKda6g28n4Kn_U(J2E0{&uy4UF`xEXp46j)2l9^>1Rh)T$UXEcf zP2fG#AR3pzAMj{an^LB{Ts5YW|H| literal 0 HcmV?d00001 diff --git a/src/android/app/src/main/res/drawable-night-xhdpi/ic_premium.png b/src/android/app/src/main/res/drawable-night-xhdpi/ic_premium.png new file mode 100644 index 0000000000000000000000000000000000000000..23a5cec5135b940f18327604b3d6a1edf43fb001 GIT binary patch literal 1281 zcmV+c1^)VpP)dcLCgU& z^k$$9Xeu+tdSC%C2lyePb15(rI5dY%F9UOdH*)9(9heL}01VGFfWz;=wZNlJHV(KS zIIhC64D*0l<&@G6Tn*e;#bh3~60?C5fY*V>8pc|z4;qDc;B4T98jVlzFfaw!y`Zt$ zV~vReHc=n2a{&|91CxN~L*pjPJLi9Fyx~D$hfqVKQswl)x2YoR7269X#eOXttqA<6 z-v-%a_2B?uh#T8J^3x#)j{lF0eic}z=Sra8wIz{Zb>nnkB5)$GZ@SjlCSDF4Gl+&; zrn?h(r-D9BT7kEKUf*C2tdeK-#v0%%;JL^=yU5T1t;Sz@>?sXW{C}u0Sdo%X5H~sr z7!B+v`M1DVq7@cqU&aQu73fjPuNOW5T7k`O{8n+TQ&MyGXa$aRGAmS10=EIHLJnBD zKDSQBTiA>N);gKR|8)`l?G-u$fwtdNkr#QPh0puN+Wap}Od0=dhVh6I49RG-{?oj$ zQ888z*s{Ot#=TekD1=vlGk|rX=ci`yGGn`^C4Ukw^eJ$7flh1%4sbOT>LTQmdF?7|@AJ zp$h^jt`haQFqxXySo`r@Ok$VETsY(Ziy7%=t`xv2nTbErHawCC-+T5!% z`fbc&qMciD8rOqdr$!?Q`iggcaqe^cAWRm0+yX{XTsFarjPmP@c+I z2Kouu19(KTr5PWgJI`6*;@Fi&1kJkpOz>hv&zze9T?qt*$!TnA2B%5m68FDP_fBb8&hM1Wa{c3y zm2|nAtjvv(IqV)bdOMwkyLHoC4(-n2l5%`YppT7pPh>2UUlWnftkwaPp>8On(=V#9 zQU6Elc)52#ce&VThc@!?;Zqle1Gx6p~WYGxKbf-tXS8q>!0ns}yePYv5bpoSKp8QB{;0T;&&% zT$P<{nWAKG$7NGt1vDTxwIorYA~z?m*s8)-32d$vkPQ;nS5g2gDap1~as*kZ5aAo3 z;GAESs$i;TrkiYNVx(Yhsb^?rU}!BPbD z|2&z5_Y4dy?4B-;AsLNlXT^4ehKd}o|6b%SyY*x98J#&FjYXz*yiwHZ@XC-gaeJXy ztLeqgVjs}4Xu%6tAUdwzT_w+Ioo$sB&X*p^#6K_2 z*)EdVBRD^4{}Mk>c9p-v3j5^bJ*qq|o#xwp)@<&!+eIUN^`0SNx0{Rn_Xo$Y$^a^Z^Oo93=R86j4&uHUOF z_L7$8Wvc@)^HA-2Q|I&^MgWks*Pizfeb)>$2e}7E4+V%L}FIM4F5wnkmZuhiX zb)ey4#}lQTDk|Le-O7RX)dL?i#KLZ46fu-_8&_G5ht#SwF;Ah+lTP zHnYdN;kH5R(r1nZA`wzAZH_Yhn;t7}sD593hTc~5^&5O9nS@_*JfHL_hS@b|_wxR@ zndf%so(^=Wo3Fl8#a2qO&X?i8mURE=ll+W+Ys$?nlY<%F2MA6-eep13pUO*P&;Ao7 zTO!xZT5@%g9q*GjT9;mUUHQ!{{OMo{5A*#G_jR4vpEb;oJ~2J(#YQ{bj&~am%*|4p zH^p`N+og44%T8u>-q@Jt;9&i1@?ZI!&Rs`KA9&+$*-dghyL6PvX(f>CDO z{1d{O4=&9(!FjxNZG9ZW;sb5ZvN?~1Jvjb4E%&Bw@Qkhkhh?G`R}Z`_vU*r?Ix#&r zJf=0LyY<6QtJy0j&6{*ZUg3|o=iN!mu70$6{7~D1L8x#sXXO4R)w*SCC;j`vlhD`t zSZ}7{`ZcFZ`#Wb Y@y85OmXvM@N&uCop00i_>zopr07r*qhyVZp literal 0 HcmV?d00001 diff --git a/src/android/app/src/main/res/drawable-night-xxhdpi/ic_cia_install.png b/src/android/app/src/main/res/drawable-night-xxhdpi/ic_cia_install.png new file mode 100644 index 0000000000000000000000000000000000000000..fc3c434b0802be5af58f6ad39ae560ef6077ffa7 GIT binary patch literal 1168 zcmV;B1aJF^P)YfJs*n>Mb>JDO`6$hScR z+5x-`dH;c&W5?h985xLLP<~9+T zEwJ@U$g_rsGg9$DhJy(O8WWM33VVBepEo4L9=6;!P5bEtVYM50%aY@M(${E+K+7D; zyc}61vw!xwLx+5w?=y!8^tod>BhtYD`@W0;?>LTDW79_p?`R z{9I9{DS3#@i1JF6m=h79J(P}&Jv4^i#nmS>&N>7fhY{GZ}XMsn7FX}ejVtYgeN;nXDt+{?-n;adAj+PWm;#GfL#hFe!R3ciZu*F5?Kx*pgB{G-XGnF#gUCX+G4$}D&8 zQXRh26z%`3`NJaeXWxqWgoxZ-<4V8k+8`nm1*`JEL}W`OAMO{C&-yY3CL^#3 zlC*(IT`Z5};K~K55+ly$NOhZraIQpyr-pQApa|19)R{-F;#Wx78 zzhS0u#reL~{8#w*Fv&gL@J`Qw@r?NQi~s#~FN7xW?U?%bmh}OP4HF*Ea-X);e#R+F zza0#FSo5Cmc{lNhSc!auPC?uH1I!6~4@gFJ>ApxjXw0)D`Qp~5=NVc|vHAyP1Yi1E z1y1oYzYspDF>jgh(d-227nTc8cZYquELHgOqwo)=H75Ja`W)vsO3TVT+46(0h9z#9 z{;TzC4&T3&S;Q*Al-BtCYvY>*8J~D&sJu;@f9YR7`_Zfa7HnT|t*TL-@5;Rn=B?%r z9GaN7ZhsFXIr&s9CV;pUFa#R4md@LdFmwB&ZM!yo5w6L87d|cT(S~PcN*Ah+XTEg4 z(cRses}up?!NTdH$kf6dwxFCKL$UBU^mWxf-b;Bz~JfX=d#Wzp$Pzm Ct^54| literal 0 HcmV?d00001 diff --git a/src/android/app/src/main/res/drawable-night-xxhdpi/ic_premium.png b/src/android/app/src/main/res/drawable-night-xxhdpi/ic_premium.png new file mode 100644 index 0000000000000000000000000000000000000000..2a0f1568fa4085becbe422c2a9c3a1b94750cc63 GIT binary patch literal 2049 zcmV+c2>$npP)% zcZ?QA7>6Ga6%Pap#tI^KV>z)v>xe(cE(0RHe?wQX|+a8jAaya^ZxH0AA>B%rnR zMRqI8^cLqc;6&gZ=Ssb{#Of6q^KD=+;IBNLd;&71`z)||S*N!+&C+LY0Q&(A!15Iy za{|y;3O$I{u|{oyQB@F*u`F;0a4c|R6@+7S2k!BF??mD&=vL{6|2sp0v+@ea%<02R zfp8*hTR)T4$X#lKDn6y!;zC*KR3ZWO*Zy3Z*abKwR6u=~GT}t@&uU6z(>I6!0(QbOuuvl>VP%mx@-gN zm9xw}#Qllr}?R?Ywg!8^zwOB7JIB}6#3LT&)=RBELt zGZgJVEdh1cYMbY~pZP)WYw6W07Lp7Bt}PO5mP(r%*FWC?M+5I=w6hhkCeTHCC-QHa zl*F@y+Mh)x&?aeV)c}@g>z9&|TtWJyw-jx?ES8UNC1ktjD-wJVw#CLuv)2-j$%#wS zHOB*I0NWOrv*n>41+G@wB^C1(zOFIhSgPgl1mT$V`2e^#ML6S>yWUn=%s3q+VAH+V zWMvUr=UHx5!2FuyfVrNb1}ec;pD~Te5>jKv3bE~YfpSEfCN*lUN!0=~^<-yw=6E-7 zW#AlLJyaLaelsQQ_D&LzN%^-L5YV6mk9L^Sv!VRtwEHozPbWE^J>wUmd{9G3WLrTR zHM#iKx=be_S^OqJ4hKGtS>_G3ZBGq2u9_x;H8n1vQ_|e+DsUt)CN|7IAqg$u7hn(I z!;E$t$i#QfX!oL$`wNXkliMFccMCy>?TC4~Vl zyQldj4zs0ykZF%n#`B#v(dXSIJd^?nQ75K{+Q!d^Zj+L#7Vmq;=@mG3vtzB6&nU#O zijf zfb8k^_k4+R@lVX+P(VP&0VGg>zu03?y1HK+KwkU+iG)Paz4iB=uEB1%Pc-l zSE{54P0AijiuJuDz#!ZntIDlcvg=X(y}j~Hk^8WUtXSG>71MQ;Z7JHa2?)LDGCXIn z88K4*<2()=n9=usJ)o=#`VF))vT898(<#qF$|)d}FmFi6$)sVv%bq%QaOtF+a#n_M ziq6{KlphtXnAK#x4$?|XDsG4vEGzvV_}y})~o(&+_S z(Z>b$vs0Aw;{PmFN&9$C!C~?Tq=X|etFdS#Hw)WLY4Jxt4TJq`RJ~s*ue?cXX(K# zkYe@;X}V&|p;={pl@<_k^BV%JQJlC5cWI@!5s%P2CS3#W*DQr^=VA|qzDrvT0U^^r zJi(MF@szTKS+r9r-gYXA@1Rg(u2#o%)lrWP3`rKDS^|o=QMv9cf?rpvG?h})Nt_cP zpo?lnIJCeDis-MZG51(zt_r2@Z;1&d(NY3J^*`oNt}I=#Z{REARi)Zn%*7I87WdeZ fv00*;6Ar+?6yC-joZ~%a00000NkvXXu0mjfZu9Dg literal 0 HcmV?d00001 diff --git a/src/android/app/src/main/res/drawable-night-xxhdpi/ic_settings_core.png b/src/android/app/src/main/res/drawable-night-xxhdpi/ic_settings_core.png new file mode 100644 index 0000000000000000000000000000000000000000..23706188b6beaafec4fd6c2f604cdfe653995ef1 GIT binary patch literal 2125 zcmX|DdpHy98{TH-5Q>x>TQi3oHbc%s5vGQmLddWfGm9;AD8pCC;c{Mb_*RY2AzC?9 z3@gc5k}?!>N+G3EWc8cx*Y&;E^*rzMyzhP8_jNyiyw{uV;$$x=t{@Ho037zu;^3!#LgVMliapQwB zqD)Oqk$U<_eSKX4LN_{=M8VN?Nztl16#wV2#YYE45y%umBni61i3^ORQqV9Maz_OD zM@3){`JX>Q^WTKv=wdKf zeKV>ijjdA+&v^p5uDAEHor9Pn-$mU>dh^iD-emQwdougjw`C*Pwr>4mqw0!{?{1^{ z-*Ih>vE{b!D{ap#*Zik>s!#Gw(AIu=oCqiV_{j^^@OpEpikNrO}6~mi$dz z(g97vEy7Dwk*zMOTCpQ|Nn(ZtXv?-<>uHC(rUR(J4}7v;(23G24Gq|e+_T$!1O z0LHD4=aYXL=PR_iY z`^|_X*B3Ol4M=hhS4Ye9+wVPL5q;uiM?G&IbQA` zkGX|+PQ0ITNv0J(m}lteda=CBKuwoS3~E$bo206vm1qY`ezoe$d+k06-l8S`ByEE& zcCA3l!Py(b%95Px@Oc^L4XzHeEcLU^WktGipBP-YO7Yc~pBBY7>1A9~UWr!$D|Yxz z%kp!XAl9B2#oVF3?4n~H8jaliOVk#dl ztxR@#&RMD_fF z*;PqsLYf?T?sB_f;3}p-t?GI38i(eDr zfVZE&?%A?KnNi5n^`os7 zOX+ohK(`W)gJ2x~!VSu^sy7phzR~+74sope8N2kuVn|smH@Y*si*WKUJaD_VWqT>B zZZkp4+1E?Lw_L~w(8*rUJMe843@y6}jMzbG|Z*r+zRPKrspgd~dhL}s@Owc{=zewFOi-YlBs63M6 zMM(26pk07X0?ZP)C4NA5$-U{WM9G3iIr6-6SNY9vV3C#AdV^+uJ$CEKm5~<9x??SYlVfTa@nJoYVwj^}YY}Pf5&$j?4;;r#LY_o_B-KO8#`tQ(nuk`D<5TUuyGrores;poOv;I~~b$2Ji6Iv(N4jct*-Ocl>csU|z#p;)Rx~>#wH>~{XWeqC1|;z{IET4~ ty!RjMq*gfLC714l%!fWvPne5-I%qQ6lix-gFW&hDV2(T4)*lN<{vWu>#l-*s literal 0 HcmV?d00001 diff --git a/src/android/app/src/main/res/drawable-night-xxxhdpi/ic_cia_install.png b/src/android/app/src/main/res/drawable-night-xxxhdpi/ic_cia_install.png new file mode 100644 index 0000000000000000000000000000000000000000..b4d1b92b754f4874ae4a465328da0893c0e8104b GIT binary patch literal 1433 zcmbW1X*k;l0LK53Af&V*)LPL;kW^`DT4&~%#MPE!i5|{6>%JzX6@rq4HUx90st2V9 z-CRwTIEJ~+MrpKKXBbK}O}1e6eV_I`zxRDVyV{yiQCZ3U{xQ>US~)^SaUAvnGwF8H{Rs)Iux7s^>%>*YvTydPmF|K`4SLxXxY+!} zbq1&c@wABUD%)TYlv|}5XrVZ(D~HpDv>f5aY4EE;QJpe?EZ{kXo>2svyH(MeT(Hh> z&YSX!p1S2JKUP!T`EB5BsGyv)L#-t>&{a@UpV4&Dy|*?x5YwZ%y$nONOA~?uSRRLq zrQ3fgG|=RRrHXlxh49oZfBsybk4iLq(jQiIh-*9C#%+xPtEtp$7R2)weUx+ew5c;M zWgILrIZV-OZtM6tqe>Ih)=c)o8({a2k7nmTK8$ zjg6W`GTROgwp+2F83Md8M`eilM8JwRon}M_6P(_TjG=8!OmLMftG-W+{8-CbQ|b^4 zb-Lt4AnYCGxv|7wU@GF1C2&UUR9PzQBvf+eZAui}c{>9q+*U9gna(sv8 zLbH0iaxsXIrt7B1`d8DKF>#N)lrtO4a}KBmA?FsC8{EWQlH#X!ih6TFBKVi3tO4X0 z*%EuT)U?YWjKnbP$0Jwf$w8h5IgPXn@V~Hm*#g$bPrSNU{>~)jp4eDRtQV4k;CcbW zP@fy+n53UjlM8(N7PJGyaM&L|#S-jNwRorZloHttPj*hJI**e|dob|gDt?&d<3dAX zePoR7uh=JdbRHS)ilP;5a*EFNbX)M3N=GB7Ohv#(jsCOUG7mF4-QL4$XX)_!niw#A z%{u_ocNYEyw*G*zW9l*7FoitBV!bJ&FWyp;ms7^9jixeQEOWXj}ydW&WDmQ;zyTVcrzQSFeJ35Me~bbbX@tsP;}Q zqH74SoRfTY)K@wDD0_0?MR?q=2D~bcKx2VZ{kRNB${TY^9%iqt43-}hPHt#OJzLR_ z8I5PA!1BiPozKkk>tKQJ!J*Nau}7hXLzmfy$}((lkJHxn{cW?j z0fi-zUa7F=q~kZi>pShYjHM@JkNZpg%eWz&$iFTUPS`2A8z(4KRdzK;lDZcQXs&AK zw_MVjv(^o*NW=R+2=zW{-WhEDHKsQ_|8qz*rmr=Dk01jnAi{Lhy#Pvl$i8v`M_XsY J3mf0Ge*i6Kna}_L literal 0 HcmV?d00001 diff --git a/src/android/app/src/main/res/drawable-night-xxxhdpi/ic_folder.png b/src/android/app/src/main/res/drawable-night-xxxhdpi/ic_folder.png new file mode 100644 index 0000000000000000000000000000000000000000..166bd052df4b1a63528452577279b1a565dbb003 GIT binary patch literal 657 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 YA4=f~i5K>1qW}N^07*qoM6N<$f>n3_dH?_b literal 0 HcmV?d00001 diff --git a/src/android/app/src/main/res/drawable-night-xxxhdpi/ic_settings_core.png b/src/android/app/src/main/res/drawable-night-xxxhdpi/ic_settings_core.png new file mode 100644 index 0000000000000000000000000000000000000000..32eb4faff6531285cac44352ce1a6203a4f74772 GIT binary patch literal 2587 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 literal 0 HcmV?d00001 diff --git a/src/android/app/src/main/res/drawable-v24/ic_launcher_foreground.xml b/src/android/app/src/main/res/drawable-v24/ic_launcher_foreground.xml deleted file mode 100644 index c7bd21dbd..000000000 --- a/src/android/app/src/main/res/drawable-v24/ic_launcher_foreground.xml +++ /dev/null @@ -1,34 +0,0 @@ - - - - - - - - - - - diff --git a/src/android/app/src/main/res/drawable-xhdpi/button_a.png b/src/android/app/src/main/res/drawable-xhdpi/button_a.png new file mode 100644 index 0000000000000000000000000000000000000000..4e20f2b0ed79a750e8750278d5dc9d6e2d1f4220 GIT binary patch literal 14645 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 literal 0 HcmV?d00001 diff --git a/src/android/app/src/main/res/drawable-xhdpi/button_b.png b/src/android/app/src/main/res/drawable-xhdpi/button_b.png new file mode 100644 index 0000000000000000000000000000000000000000..deb83a09d4bb77d4c982e37a6539bfc97feb85a7 GIT binary patch literal 13040 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 literal 0 HcmV?d00001 diff --git a/src/android/app/src/main/res/drawable-xhdpi/button_l.png b/src/android/app/src/main/res/drawable-xhdpi/button_l.png new file mode 100644 index 0000000000000000000000000000000000000000..d24039fbffde2e72625e6b6cfb723fb5246d65ae GIT binary patch literal 3461 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 LzV3~?B2WGYo1`T$ literal 0 HcmV?d00001 diff --git a/src/android/app/src/main/res/drawable-xhdpi/button_l_pressed.png b/src/android/app/src/main/res/drawable-xhdpi/button_l_pressed.png new file mode 100644 index 0000000000000000000000000000000000000000..378ac87518eac3f14e157e18364ce7dd317f943e GIT binary patch literal 3471 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 literal 0 HcmV?d00001 diff --git a/src/android/app/src/main/res/drawable-xhdpi/button_r.png b/src/android/app/src/main/res/drawable-xhdpi/button_r.png new file mode 100644 index 0000000000000000000000000000000000000000..7b01c043e3149c1445c54ac308db1398b6e53b4f GIT binary patch literal 7603 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 literal 0 HcmV?d00001 diff --git a/src/android/app/src/main/res/drawable-xhdpi/button_r_pressed.png b/src/android/app/src/main/res/drawable-xhdpi/button_r_pressed.png new file mode 100644 index 0000000000000000000000000000000000000000..9b3e3e75a54a87ad6dccd596f3fc7b096c2ce75c GIT binary patch literal 7595 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 literal 0 HcmV?d00001 diff --git a/src/android/app/src/main/res/drawable-xhdpi/button_select_pressed.png b/src/android/app/src/main/res/drawable-xhdpi/button_select_pressed.png new file mode 100644 index 0000000000000000000000000000000000000000..29eda72af678e18bbeed4fe10fddb3c8d6ee6660 GIT binary patch literal 17648 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�VsKYXXgiK{SXipl>y_{fVQ8F3ytDt@3t*~ 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 literal 0 HcmV?d00001 diff --git a/src/android/app/src/main/res/drawable-xhdpi/button_start.png b/src/android/app/src/main/res/drawable-xhdpi/button_start.png new file mode 100644 index 0000000000000000000000000000000000000000..f9cf0d6678e78dc042ccd98757bb5017ba1a6b19 GIT binary patch literal 19588 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 LNkvXXu0mjf<1iD; literal 0 HcmV?d00001 diff --git a/src/android/app/src/main/res/drawable-xhdpi/button_x.png b/src/android/app/src/main/res/drawable-xhdpi/button_x.png new file mode 100644 index 0000000000000000000000000000000000000000..93a2ee9976dedde9a429cb318a61a9feab3948a6 GIT binary patch literal 16315 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 z%0D20NuSZ?t5437pR`Qm<>{RDNmbc$0cOY1uEaSZ>lOR; zGXXzOac)d&Yv2qUU<6#?0j?CED zRbe~lf@00B#})yT4inA5qge#LY$&cLGgS>lXGABNMDqnsWvm{a-l=TF}2R5gx7 zYB097otZWPG$BA{ohK(^RqO}Zy<%T^t4Iho!ik5zaBIE`o5N`9nO1W?B( zQ$K%dA@wD>Vczf~E>Y&MW}*-zd8K{d%u2}GmH|Ia?Lp0?yB=_6OQ-_$Hwb`*U072y zs>_|-CR5EO`TQPXQL@=}+(Q)qR4eWc6oeYDguMGOrg;t`<#keceeA()sEdZ7uS zIG(7B8%3paB|u-%pCZC%&(N+&Idg~)o`%M|=yzmL(Z2D-{boR0B43{k13t2-h!xDc zf>{WVt5b>J#t!Sy;_~Q5e@>YDcu16?_TR{;CFDo%jO6QhkNw=I6lRZJl(f$pU%?Wz zccY}Fv($|IBTXArFir&e+~<$Xw%FkRG;Y#s7(svV{_!Mm++^U#D)fp_K@!+{bV#7< z4VHl>dbB`w7C2m_Dta9MQ}GZyLBh&8Kb0Pc1iXOMA?bdkAYLwo#+A%2w#*v`@Wlf?ss7wYr70 z=e@IK3Rz>7@XO_~`aPsDp6zg%tAcs`qBHvt6Xujamzes>5_ASXU)|eK7e@lZUyK^S zNPz9rkh{iOUGlVh=40N;O>2LV2Yl zaeqk8-m_3j@Q#X!>)0{6R?AU~I-lFxiO0GVMfF6X*H{URb|`w#sy*}?NOgllCKr6^*w=jz_VOYy$J#89IUxf_@-(;^HtQ3EU0wuVv#PNy7PvJw=%+ zzf?hRuZ%Gi+}82)L)qGe_S8i7Y)0@Oho=mcpOLnUQo`o(XyF-S zX&7zrP9E7MGuFe@Qjdwz84f{Tpd*S@ia)5H_{@|6ZHZO2eq)clV8`FGq2@TnnKI&J1$qct`yoyHnQthDFq)$r#o$~X&`R=|@k|aok>)fW zx)ulC_%nn*htDff8nhFvb2AgFp`vGyMGNQDCFx_}8q36n&{>8aBmfg)QgYafA&w4H zG}vQKW|96M85t-5WcCl| zlE@;xNmw0gmTyh^YtoD0{kA-e2T{z72VOc&CTU-TZeaal)uWfLe8$v8U!eJWgt0jX zq-qDVWsn@+m9H6A3P@}~5VQ!(!MEXnZuRuje=1aYX~uC3oklj*3T4*g6=0lf^ zr+!PoD6jZaL0~xu%*j2+R79R*>gdJQ)N8^Sq8KFlw-DBkiwVyL0Z}AOQsP~~f9NT1 zUJfq|jUmJ9iIcz{8Ii-w@!nCllapdELL0!s=P~3QIg;>_Bp*h#D~S+0Wzo_0x6Y`W zlw)LrSVBc=wQqSy^+6B(cUSGR{(24-3NpqMWB=&FsP4YTcM;yipCn~Z$i0dug>3S| zhEWsG=mgSn#DBsnUX?@GbxK5Ytc_hCGvq+Q*+}t2YMkU&t>s$E3+R2=?IKxmQ=#R(h*o6aD`H6!(

j(XP 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 JmTBAG{U6BG3)lbv literal 0 HcmV?d00001 diff --git a/src/android/app/src/main/res/drawable-xxhdpi/button_start.png b/src/android/app/src/main/res/drawable-xxhdpi/button_start.png new file mode 100644 index 0000000000000000000000000000000000000000..4e9585bb4fa8a830931b484b50b77757e9fc6622 GIT binary patch literal 30505 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 literal 0 HcmV?d00001 diff --git a/src/android/app/src/main/res/drawable-xxhdpi/button_start_pressed.png b/src/android/app/src/main/res/drawable-xxhdpi/button_start_pressed.png new file mode 100644 index 0000000000000000000000000000000000000000..8c089e2375e42dfe35cc2de38586ab04838e4596 GIT binary patch literal 30785 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 Hk}TUpu3POB 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 literal 0 HcmV?d00001 diff --git a/src/android/app/src/main/res/drawable-xxhdpi/button_x.png b/src/android/app/src/main/res/drawable-xxhdpi/button_x.png new file mode 100644 index 0000000000000000000000000000000000000000..0500f964f10848f857e88e608c4ad315cacd6c3a GIT binary patch literal 27021 zcmX`T2RxPk`#*jk^Vo`VjI0VFTV@@9z7oKjQia8>vg@Z>$&cp=xAM|B4;8;5QOTwn(|EqLE-R!&?NAc?2h-1 z@Ru77dPeR>ni|qJ&JP5vY@My`1iT-(!1obER^Hpi%I2P(JG-@=y@S(L&Xu}GPId>| ztDJ`7nnIc`N_KZ0)O=m-Zux5I+4$bGk+S8Kmm`<;mWB&FuyeO!_kM8S$xYh(D(8RK zm4^Sve_4=|{l6b^zju{W0sn#QMw&Y8O3to!?BW7fF53u;iLgsZ2?$>ik`fW)XBQC? zmJk$@5EK@@EF>%~bVXWJiv558amtai%eva$k-n*{`o9l@zg^|L>+bF%Ehy;azL!)lTV9tck=??G{@9U!qxsg~oWjNN z<%XRDsrkB!h6Xv>R&*1piMolTiK@x)_z!B5V3J>c9?3*j31|`TJ+~K)axC6^?+exk zxp4RQHe?YhZ26&2;h`xB_VuA@!6AD@vg+GyGFoLu5{FKIgkbhs+2MCmcD>_#MJC@f zecy^^GsM}WJ!h?6Gzzj)?S9v(o~T({pZ|EM)3s8R5UamuL=Z<3H@YIMb8KFC$ip(b zN81{wNPwl3IHNS76A;24{m5+3jeACY;z@JD?s5AVk39K-e?a~;g+8IGx0 zw{7e(D_z%w4dUK;PKgXljg`kqW@D7QV~zI2iG=URA+!crSf*BAsIj9~{WH+`w-v~V$Owcl2$2)eb>Ijx&-9Ibr_7}4 zb6ydYHx%Ahp{$jV>#>Z{Zw+AMdwh>OTgXLCH^24lKFVEz{F5hAFS(B)6>jH1vBwY* z_xZcAkVFSy`oeqJ313T-5N2_a7;f4Ai;X&J%bZdyBx-yR7dS#>dzeY#npnmx@<)R< zoR|z*yDo`(m&leu@GYd7{>Fnw(wd853}MahjF_`0@36O7Qe-dQm7qR%fg2upDw7CF zMQXY-h!zID6iSvU;u;Q)j<(*_mQo+o#n5+32Gt+>oE5oKM%bsnX{ht^)I;O~qD(BG zeQ(~jb0B~)d+~Khvwnklz>$^;x^(uo-T62CVk)?Yd(IjQ(nLv|0KL<4l8Z4jx)Em9O)R-B?X3`p^QR2zV zNU2qs46m>{+<{ptVo8!6J3+HBUhu((S4D+r?Yf?+a?E-QiLpx+anp^shlJMjSOTH- zhXhIFlct?ftY`Y#ZZ$Rg_0qQft~lA6eoPb18%BRkbs= z3dQrd!aL%1-gA|ippV<`ox4pL$VU_tPLz`ah4CRmzJ!P!o}wi2xRIGI6SAe}Nle{o zhGHMl`iP$N=)Cs~!vTxWlFWW|kf*?O%tB%!g4pgp`E7T?6)4v!sUVn5`;oFxjP+C; z@m)^#r>lE{+~nqEJ4N6OQ<;WiqF-8`i#%M!i6 zH=EDu7A3{WplEC#8Vlky9LzH(Rf9pz_brBmKyipf7)~KQ_JE+L>EnLZz@wS*5s)9xt4`ekvGli6jsCz*2G2 zK<%*W5%-&0RW5&A4ea=&0#~VdZ4E|1Lec=|PDP2eu z8LR-~H%xb-0)fuCQDhFgzgLe;#hrPnF0TEQJq(3fU~*Ne4f93GQYM zOuEIrVQ`Bp3UJ+_ZEY^djwb15n?P1Ewoy@K2>gT#w$|@XVq;0v;Q1D9+6;}h%X*hW z9uf43D^m(zK$Lo~BPBsB%}Kb;om+D93M`BX_g^En9)~7K0F|YMxVGcF*9Hefs;90{ zmhAJTouZ0ctV+3?uq`tww`~~B*YS(!dqV8>XSd=+p9T_26{kz8t06J0g18f^ zN&e0=CkRhVID2vKP3+mnruVNBGG6!zyM6x5Y22IXTgWlBtI-Y0nMLl1-?<`wnXFA$ zkQ0=pvwrVgB1Hn1nMWjjvo?xMflN(Wv;(gznDfK`WgcK=B-N*cI8c(09w7~AsVIM> zBAiBl!taPYHR9Hfiewoj^bjn)=tz*yQL`emL zS@JhmGRdd3Lp+g;FZ@VG_{YwvOst^758edNKB~B#zrCoBx9a-~{CQk_?$USiXPgke zvck4!usf!7)eliDR2((NISjXQurqvXUL)M)#a)VfJbqe@ABs)KIJ=F*MD0+plln~~ z0afZA`U1i>D~SYB3^fJ{=9fjXt8%i4=)OTqdA_IayQuu|@ew;}S13<$ZpV+K`WeC) z7=$U{iCZ2q@AQ))n6yB->#wCcl8ZP6e<51c?2OE%nOWhE_>P1ZGyI}37IdM*(G~fs ziW8CHW|)vc#cftLl zkQ)o?1i5dS-yZ8Pkh2;3<--wuQV^%am7hVQ5EURfbNAobW`xJrf_=vOznR19s2;h4 z<-$eP5U&~0;kb|uc5ZKd*F)Hi)?Xp0Z|n>~c}fD5{`yznSl!_#Ym!7H6l(+bu@6$o zg5s`Vu>xrA&@Z&)`dd+9&&oLwI*ya_fKEN3zcbfqp-+G9l~XfWqw1Vo&9~=AH(gMh zws^p)8qOj3vs`#+$%)HiN2y6#e#)EJ%``vX5(9aha&3 zgU5?B`VK0IXi~a!qMXeZ|4ms;Hu{~-i@IRdB1B9n*JDTl9ysE>%}LWLQIxgUx4ZN> zgU-Mt=9z5{^wghU6X(RpT)8I;|1ugk-KE0`&2-5lxA*9X9{$s-2 z{Q{z(HqF*-DFZhcVPh5O^=$!Zh|zsl#&VfpGDz%r3G-!x8^w;c=E?u{+#l%)NySL= zVyFn3*yne&Nbt8^7S^T3PBKY=WE3qgP*S~7K#tG4-up@TcS(sh#6!=QbW5>^_LbQ{ zB_n}qEn-Sl(EfdW5dTPJ&!0ja9y%lTa4Rv<&-f8hlqqU2_S=6?_WQMnHapE^Hxg62 zyufnxygs6ZS`CCxofCEqqzPhI2^IiBf)jUz>qfr7JrRv-YmbSI? z+T%^EHwQ(V>L~x?XLn@Nkdn~ibxkWutyKZT)-XXO$js6eZHxrv=lmv`ZHf1#grc(2+i+yeCLlEX`b zuno6^33(LSFP<>i64oT!UqEAJaDoJ#3Ud=NA#Pk~>wm8iHKnT8C*-P4ERSzXdn1q)v3>Cg292Xpz|20aP22hhN64dC8*NP+TV!jEr5`OkiQ zyDe1Jp+Jr$c(HyRu9nj$$V2n$-|7721w9LdB`y%neYXNG^@feO@9S6;)7^7s4}xV# zT}iPeY(ebp`Si8hgh^x$G~sEEXe^;^ zQTANquSZ~h4Z+v$@5KoFB8DU@c zIpEV5g*tyq5XPlH+y5=Q>q3qrY?_Vx?wq`IgO-S+;6jU}@E6qY-(sH_2r)ELBZ&l! zL<+RQE^3Bw^0dzN1XGhnBLYOk0c1h!)FgzNiShv?IDbiMX;T81ONby&jAs?D^H50A zmfwN8!r+Mrp1F3JfNCj&Uk;g-wN> z(IsS_Ac?4EKd%YSLhJ7q_V_zJh)a+@X}LNgiwNKjiNzvg6kru^TVYt9dz9;w>R$Gp zpg_b>zevds4Tw3y+%jFLaXN7O_kwZL`jIJqR# zN*RsnsVN&-%39wN8f*O|rdi^^WFMtlyFyzzaWc>QnG0o|xS>Ik%b7URL z+j)3+Fm}G4YVojmVqN~HYkosZUw`4m_#9A*zeLC_)JO3b&T>BpCWGm5Q?!kO4>2#O z0?Vtb2gSXXM~4avIcd@KR4rwrmf1Hi9n5@=pOzSPX)&oW?Roa~j=qZSU2c~sG)E@S z(+FkGg^8nOFFLls!?o$4X3J-8P74z+-2{AneLrR#Z|3a;EZwshN$#Crsx1*6Ce|Y+ zbmfqsXgb>&Iu{W?hacP-U@xXO+z5eD|)Jr>EzBoF-YgDbFZ!cC}rneocoQ$Iv7d$L)w4mDlHp z|NQHpXWen<`B>S#!N%kF%L#_&ufC0sr}G}nU6v^+EX=B_8>x2r{Ygsn&X+%o5>BRt zuwdG%(|?3D<9%dV&mq#%(gG1}*3F;exvzPcl}6FAxJu4{5~581Y-?I%SQ@aNe6Pf( zw6RfM`C(e&t&n#`^EPN=OP=UWu}&+J1&#oVDYOo~%I3~a-Bs4uwQou^M*^pxP+o|? zp4amGo78-+J`G0*Mn2$CMNtu7h3)6(Lx@K8$b+QZ>oU!6GN*QS_8t+QY-*pl|9ulH z=j-d|=XVp$0XOjUS} zJv}^#lT%XSPxdlS_V^kn1hc;9hg(aDE998H%RBUbz%%ZiZ}8V%ar>~B`nTWdYh*T* zxegUj#r13L%oZo3^Kv^*_V)JQ{!Wu~B(?k&O4Z8q={V<=Ix#kO?(W^Yos`#TeZ`lt{0}~T{rZ)$MTlSYIMwYLlw+vk<1zo8vECSF2`6@@XkV%M7e}{b zc;Z-J(y`a^vxq7^v>E2`KasX=;MFB`=~0no^+M^e1?>K&T3T8vUtV^~7$}nJ7c(|7 zF)4)Y5P@^kjr#LiCts~3vn5=ZB(@`dzdG=s`cmWJtf2PW4*~qL>658%ii*0ujE^4U%!&>IyhWE zIh>c5A9AXu$m=gKSs=HLYF^n%H1}P|S&NR2E?DT#bMBqrU@eM~Nd6|K>EP(7?mSX; z`EV!jWGCa6e!||-aZo}XkBV+<%sH7)w{kUx4*tA}J+A(GXSzVI>v~B>a;So@>3Gm) zEsMC)LtRb2!0gczrZ=XaFHNm^PexiCPQ6TVs$J0b+gaZFoLAiaS4cBniiP?zJ^7iJ zf);WcV_p*vN=i$69g|hNKgTu;Q7&)!-ayp5UtUfb7#PrJc%tlDTVmpPNcSWp#jT{& zqVag=F_wK|Vqzsnu^~AW)rmq|e%odh@9?$K#HH>gAjARpPWROCB&a{N!o-~6Gq^83 z9VP0yGFl^QyYV#!dn!! zXW5f-KQI3M+b84sFW=CXpfu%A#LPXG!&I z3&-MH#W*FKn1$$=m(rbG??#0iXoM-z9JG;bhy8il6B}tOkLLH3Ie){JmiL{x5Mn8i zSVWH|dW!G4_KgS2b(*hrc;wK zps>(hgi&Vi=o%%L?bO#-l3@;!9j=el0Q?SBCL5fHQ_q|JsqLv4x0m!7Fyyyz}#TleS9)Lr5x)TDddqP_BK zo~LSg{hmEi%Z(?;(ah#=Pog>oMWjTNzs%PYsrTYMJwvki=K_#>+&hi+ulao`Ak+G;%jE;#=oO)69Z9o15On)L)Ww zKbzdXeG|U7yja?J{M5RmMvwYk0Rn?HCGk&CcXPX2ha_xsH$9NJbii$2U-no3xf=P9Ra zP3leFgwdT*x8B@a+E?G#LF=-t9O8f99%faxy}kXI!Q9(w9r~hI)z>@S!%N$RQKiLK zl5;O@ZEd}(o(QP(S?J4QQ007<+Q0Cl`1X-#d!_@^%JMRGPlo(Stf865fM0eddLX_P^{?>LcT2){Fnc4+Y_*3nPi7|b>Uu3hVJ ztFNzbur9w_*~fzkYYuL<u8&Qw&m0?%GDRD}5xo|jQ9mkM^M2K`Z2K8X!O(|G{7x1eMHs>%8bqCPzGihau6crhXD3jvSxVx~_xzn7x3tIVtlOUE zLDR1{;vX(9CLi!f3s-zCYok%K_0vR9J+D7Thexks7-JAw@jh`bC z(;czew-@&DZ49cKnVFexajyB zIX*sE$*6MZ&)u%At)00msxuo@dK$4=n`*1HDNkxFFaKT|Iq~Qws42i zh7C}C(&)FvZyQI5G#;A7f6nGR{Uj>6n4N=&Ughz~l9v4LWN=0RevYLJS$)DKbm-By zjlREUxSAcWHSD!gzawXpoO?B+x9G>B{f{>a!}I+vNlyDM9w?BtOgkU->prwO%@!(b za0yeP{YoT92Hm3TXcfyWg^YgHdfdBJZq$0l(6n5$U+my6+JGtS zwb+#_x#Q4gY8OlDmU;8~KYuiL{@zub;Vrw|bEonUkN*QT)1==^Fh!HVV>4=WS_!XU ztD=sLsCPJJ3l4|NO{(QpEu)?&zHZX&cb|CJaW17-YChF$q}rM0wiGsZ^wh0)Kql~j ztuo-`U_zTbRMDYdEa92y#g8y3%K<%806-4@?IL;4F2$aM2qx4Hzj1}_#>GU_iZ`;8 zZG|nT-m6?>?j&ZcJW{5fS9DjXVi~{|od~1mO<}Uu0PH+oZJ{~onctX&@gQqZ!l~Im z!y21siwUc>Y!12sL`LTH6WeQl|KZe|6MN@xlmP1a(g93qrmE^n5p(^kw6wIx6apV6 zOV6DDm4htIk*VOs_}TM zRD0XEKF4({->!tcal&G_>Ve5dQxkH4$HyfO$(}$V)!c~5IE?)L{e1z4c>od&Jn_lv zzXUXGoLAwN{y>!K8`kg^-NQD)fHjK;4;~B|@z3R;1Z_@}Fjo6BWW-UqOEOF=cZ%4! zo#Sstq+H0Y()p>MnY;K4cXnP=B}j+dMR{jw%jw5>w6 zQbj0(ffrFBFZqpKtvH{p4h#;O7_7Eo=zvJRggM{^v$ZlW-PciDmNgGPmoBWC`gO)1 zlKpIoKI)<4$0UtW3iK+%-370^2x(+j51!C*tK$2X8!q}cD z^KYflTvSB2OPyp+F0OU3$$$QfKTB}X4lQ;+F^ty&dpJq`Y^#`a)1j60+Y_5lL_)vg z%{Q-0==0%xb(T+(RCMW2MXUP1ef##wK#`$*!e`qT`1$1OQLrfO?Bt|{$6IeHaCPuy772$D?>|?d3WEi4p`lq$DJF zs|0lkzEKac{fT?@9C@cyg#+uV1rzqzTb8w9F8SVg-S05wWBgQj@9S|X1bge&tvO&w z8NK_nf`L9adFY=O{XJDJ!)Bn-A2P8bm}RJ?_@0cK^{xx#dr`acvd}3mdH%cv4;71bWT>Q9gs>-IjL_{hlwU zQ7>zPplJYlURm?rG=Yhfm7bn%X=av|V=UJ3AG9V109LcoaFBa-t(A^jJ4uMcY1Y!q zY%l>JTa%{5*k+&jpy`H_bQ(3TcJuV~S_lC$jQu)+Rx?xr9<_gT{0ZRq z6_|)yz;)l!qs#_c*UmJW5jC%KdhnP8RYq#%ln(Y3AJgoc7t4KW!Ep#Y3rfO0xdopU3~71vusEa;UH; ziMkt}dYC{=)|7M&jcQL)1J*$?O=zSq_lJ4|JcoM& zk2m6ZjTPSOjb<-O3)Tg+ehQ@!RL{AY?jm{L_@}m%#ZkP6Zgc z^D*kWMpxzTSRQtmWyW_oD>9rxVQbHkhZ6M8x;D2(GBj?&#kbSO>by*bg?hv^=Ui*V z;8>pJH*#?RV*83)HvxAuLzr;$ zW>xoxHY)9Vm!mqSQI2aGEJ$!M%0*##J=irrB|?FO=3T50l`x4ey$YxZGV`Wp^}bvE zK-VL8wziC=vF$>XKSxJX7nYYxOv)^qRZ=&eLuLI8;!{I6!?@c2Dlu{23>Lmv?ZR^p z>9k~hWBDlIf55@qhwKs`m;v=-+t~YftzS%i?*erw?%#}y4z=BA3OfZE&q4Su`bx^z zs5a~L=~#KWD!>8ua0vc|DmFXKMj5v!-F0@3J(&+Yo_~>XIK!P+Gq$Yp{;hepbv1|Q>90Dk(o$FyOCW8`s4_j?+3X;}DO$Zb;%bGe^%Hb>tqwPKJ3-*_ z;Yq84kS3lqpTLpX`|2F9krFsu@8{JdMA^ohavwwDCduNNf06VcBl!CtHNlY^cr<9{^_7|=_+k;D+^pfDA;#L}+C}rd zc8P|yJJM;}qU{=x8ld~e5!pOUy*<-RgtIC;;8tKct)lw{a7uOWJYTU{-L^yBnE4l5 z5o$g&g8bEM z1N`~w)vL$A1sY^lKDvn_7gN6W;TWb|@=ec2llrY>c9xeGvY%F+w}U&8dBQttltb ze19+|CT1R((V{q|QhApo8Anq0EN`gd>%*n$2|2%!ss~hn`9)3ZgFhiSljMfcVdU+c3^FN+Olh{Pvj4O(`fH_%Q~p& zTG~DSbxdr5uVJBA8oqcUr#KkwkqoUNv+-XKQirWPE-j;q;S`mOGW-{jalJBALl**lXgZ z{%CAE%kV0bl6?xz!|eM^D=&Crw_RdVwz{E!~5}!Wzo!Q%tPVA>Cd&M0$-n=Bb_$|fB>>eqhH(8GumlBbFappClWP&wq9y20T={3;g!V(A@BScUi66uwyN;PGu#dIEFiZ$i{;QZ!@l%gY+K`G(}L zcL-r&m#aP{83X==1y!#fO$W zD}g&nJe+E60P^raOtb%`dd@$C*r^Mu;*=HngTzC#dxX>26P|)JiWf=1`c@rxb;Xp1yQ9n+GVGsGcJ$G44H`1J3|B`cS9%TQ{-AXFT!V1E8D? zL*ywm)puEwH$c0H|13!Y9Tl%EJN9K?FNaNkBaqQ5e6s-U`5PBhM(7+Tt#d#+g}GFH zc@nB<@cZ|*sV}cYt4*Y^VZtQ+Vm>!++}ICgFi-l3FQIeP*V>mn+4^ny`^8R?hpvZN z@oda}t-Fw>RR?X-)gUJYfID7cDXm+sH7u!_OTN6|J}l^1up%z}T$p|7C|u<6HUlDq zQ`-x@fV2v~2A-^Tfdxe3-6nu<3+~bs-|zmor|+0gOQ4l^3zYj#kRh&$TKLQ+JOnY& z{~hYLYcm71=poSiQV+g}_NEH?tlM^TJ-P&{F^K%yQnN2gKq8RMaY*J%`8s@Q^#-4p%v<}}t_1D2>4%1L8P#r1n%_%G7G>$lXVr6_ z+Z-S6G1ylci_@a-UYjNt(Ts-@!CmHwp2Nd)kfn% z=hEWhhLQfa3n93#cSO%WQwxBF5S4Hqmz4uQfyL>Y0UDLqZTG>nZ zgj1>=u|=xezhC9&#qRwqZXEXvG5k=RIL87-=YZnufb zBmmgi(VYmTR zJpR$g4SIV$IAdNBmI9H=oS(t)vKxgJ=;5pOsVbbj0rQbt5<1i`_*%MM)TN>O1{ViG zWX8mi$&;^Iq4MA1axbE-7(swLIy!p%O4QyHzws%cM_e29=&lU|ZSuB>30{SA!1qRb z*B&?4*lQDk3_1e4T@J~)Jt-2-TA-zbwOHLq?t(ck^2+@TIkD_&6CpD%p*hcDIEI91 zhPsKOX7U7!JVID9&mmUAQNn*}W5Clf{^0Wa2HvFmc}~VNgtwPUToIjL=vam4?jXE5 zFkiW!^l#@tzLT6+Uhto%pA%H_{Kws?$aokPN$)uSbYp_8FvZY@ufmW@Ecv+J_29Fu z$X$&4$f*{B;CE}DFQ$<*C^U8%xqC*@NXzaEcwv8oLDa8%`SRs)z2DC5D)K9o!QhX4 z9CKp8vyV17cMWP6ZhjMsPRacYr)Pg}J|m;daiDM`IXPJ*)$In?BRJ)iVCBd^7=C94 z6v|sJqxXP3G)S?8%^FjH#*xAiLF*t%7%n}1aS#U{(Q#?0jYG5RopY5+@1Etq=dZ(? z@B$?DO*kS_%XOgV?}0*>rj@sfcdhQ@%k@^li;?*aJT+~I*CXAAejm_M%Ypi>l zHnCSdttDBO0jw;n_^~hAihLyJ9I5&yeZ;x(s0MVZrRx_?qjO^{W6mmPg`I7ZemMtuexs!Qxl0-05EslQ}uuXsiV>cJ6vS*TrJBMxt!y zJ5cD4+uPe`4ptf)oq*kWtF^r zZfNMCNM4cDk~IZB>|8?hQFQtW|FQG>fX2oT_%?@7@)cQmn9T!QUw~Za#y;T*xQ`|UuoV=kYl3@PbUH^287O0ZYLUv+gmc7@W@|FDh38?;^ zV}j{*6ji9A3UvGmmnMn{z=x|KhxsjaTO6;OywYg5NZ-5H_8UFrA|z}?b$>oi1?8zj zh3Kk)ItbtG!O#^My!GV;y%uyVe}k`|-cnjr^U@X-7XDdY-cED*L^g)6Oat_9m@8tF zq4~rboo2Y(rx0Q>Qe3{s>^^dGDKE7T=FyHEXuN55y7}7$=T1G%N&*{#x~JwChW23t z;H-&}k;T_9w6jR^>4P7>@IqMCPUOu}mG!Nn6#B&g@DKoH8Oy*cQjNp?{nJI;KIh0% z-K>&x``{PNK61=b55w3p(U=mGn%p zY-nT);dG>KPkIFp;x_kXuNxS?#V@#lQa#>F?`xlzPss@L?RYhu8A`AOREdhm>(?UT z>C&(I5#XI?SMkc{uv+hzD>&QvDQ^;CuK9>iD*WJ_y<~kX+9UY}G^&+=T=+#@{<8zO zAHLNi`3Pp5-B_&$Gr->GvnWB^!zZ`fk;#z>Vr4)5EG}V6!o5f1et1)Qe-8wYv7VkD zA;&+ycno10c(f&G;lDKy2z`KqX;m?bmWZ?_FoG%EO#q-LORj@7D|tx^?RCB0t0;XAWzf&U>UuPmZiTuXvH*IXD zvEYPIdj-E=4-p(#@=OGvR=9+C3nW(Rc5w@TqGfrv&#j8ibpQnfgG2#`$`}|KVTQ&` z%-1d%z@mr_Y5A=vo#y#9O=f2uoSmP8gZ6J7`7~(_6oe7$R`w7bMQ~kVP3Z6*z{aRk zH5i4339jd1e7I_ZB=7_vyIjYe%2~*pC(y_vLC+a_rW@ zkxz?Ip(_>4As8e~%*>)dml`MGswo&i8(~&1r%~3~SOV-1Ss*Z_gC^kLzEX)iYxV*7 z$U~3;7aSQ+$iu9Jpvn9Y`x?-%De?75$MiM;ulw(NBiX4LYIU9@Ls}uDH}M!G6RBB? z<5`OyP;)h1d+ucocm1Cj767&~H@`*0BM6Zgmkt)CaE1Pi7!D`G#>-7v|ZhJb!dKrDl?2Xfow|WN2{hXEveF=$K1xA zdg?|WD14IkgC%Ajc;Kzs?^qa^V1@azxOEm5PYQ6e6kaz0(_pSp{|%NloPrF|t^Bp* z*}u3&eYo2pFSk_Q!7B5i015mAZlc%$pcqucEgho%*e zu)@fmev)1NVB}{R@X1K<{{XC=4VRfeQKMDN%*nZU1lfr6y=k_SUA@MM3?2P5FU~0c z;AO#{xP;5GWNqu50v-_Dw)Y5>2rMV|2Q4{{k~GusKm$z>C$&XIMKxq9kT>q$ubDWv;bRXrlT$XM z76(z~(EU4-ECQpj)s-ikdGhZewQ&(E^B}9rk_CHKgarGHH_H*t0bViDylgdyd5nVf zn|-bLS^t(d-#W@zx@=5{@+`zWfM~9P32^Wn{8ftZ7O5_BPDiwx@~-}q@6ogb0FdFn zhd(@=CIilphSzJXqFxykAD{Ves->%4;D2!Oa!3U_h&*oyfo zsOj&ks;X{3U;m6zDmT(QI5-%?W5l^@tUfam)ZuTEG`KD^&l(k+CduT7WW*F?HKLR` zrOXB$zN_d_5ce(H^LilUJS12>6bI3N0j;Bn6aOi^Pv-`5%`Is92E}n;D1w)Aln4f~ zMZ;!}VEy3uII9VaPKt7)FK-=^t$%Cbs;jDU@g~FJJU{*x_wG{Q->&r%Pb<8^9#UFrZffoa_M% z-*2{}TVSNtZN4W?U%`rlNOHa%#7{c;>#B8DpL!LNhV($dr;WftQ ztV@tt8wpVcL-K+OYlTOv5XSia?c2Aw_gUYWZ8RWC0t6!O%^RByM*Gz7V*p<@^ZKtK zk3hoJh6Cd6>|8q7WrhQlaPKJK!RO}}8IGX;6hMW)8A2(G=cBO=oCsGZl`wVZ)Wo4jY5OSJ(^*&HcQ`$rJ&-v7NGuMbrVE{lhgDS98@Xa7Lb zCtW+|<`uKSGwn$ixw9OS``{Kq?xwyBo5jfyau%{Q7YJH~ZazdYBI{jQDv_p053jrf z&Qu|!?FB`{&6UQJfL&(@Uo=AL<5{gq!a8HL>Q&hKU3@Ca5MpI}pyEuYQnVXgyw!09 zm~+pdMc~zSm{T!DrKQy~rd>kNGwav8_?DV2h5VX{8SV=vs0;LqU4DCmJwk*4$Bbod zqDVN0BT*;57>4Q>d(|=h9aV;J4~?R5fx%`+v5mH;HMg!kd6}EH@E% z>V=a*)Gw?6`zJ-PeNx>(Eq#nf55*mhWop!Eymn>WB!faK~gnA9l= z6YlX7W@hu>eiuO~Nr$5eW>g>&o8 zMM$vmaQ$tY_4k}b>FHE=Tp2wBZV4GL{D<6RZ_zf2a7gCIP|m>|!$(|a!I{*zu*i7d zwRH>d6WGz_;IO#e%F`NShDUvx#Zu9Lg=}e>mJCvsz-K7Oj3%l8ysTAZs(>rL0dd$G zU^Icla7SE_l0o%IjfICK2z7>J(6d()-r1u_rdBml%;{)s`Q3?+ANJ!#86Obut`}7V z0I-KKxAygw=zP5i@R@{1aw||N8Qu^0o?5qC3&WeNsg?LM&Fb-cKSqL-*f9I zMgvT(db1%9eOK}A_kS5vzP8gnX|*byp=zOpt*eBnt2~_7#iON>Y7+x?5(KOSP-^#} zDT+^kM!?|G6A8ufypc-5vW#Rh_#A>-hMaAckK7oX4a~MKK_uN3- zcRCf!fpfoa2-Mh);8CM`f!;bM>|yKP7F2I!8^M1!f{z5j^1WV^t}euW5z}1utP@Z9 z%7sq^Jp?&E6ZDk_p=zgXlGU02sE_UtqSTbgk?8OXVe|l;_VLrMfRxqS@-~>5xApZ~ zvQ(X+1^EJk_r+UQ`uc6(t9%7kF2sGdJ;X^-=WVu!K2`3xFIvxJCX_(|UQb3goYH@O}Bgof&Bi84qqM9Q*i=X_7OSae&n z-y7%-{C7WH+T(8nG$i||b5)D;*e+u0E8#7#1uYs5rN9$X=ZY8Ls|*4GtiIlV5~TjE zAK<_R%8kvs=3Kh?0;7n@j@DLu+5}7M5JwS#A%M;R^YE6wxP0L8VI-V|zCQ3~%Av_4 zkdLZ_XiFg83as0kOR?ylbya8)aw%?)cN4%P^^Y4pBlS>33_IXd@+GKWDGK@okQHu6 zh4Yyyta&J?c)s^QZn@nrb`xctKZ#iL2yXH*yrgC)zl6M-y%0mDuOB+G!nXTaJ3wR> zp9)!ke(S&&dj?vtd8q^#qdQk0RF6c19&(F*Hp#03qK6wkIXXPvFE5*HcYwd!I599V zTj?5=o$COgZw9zBA#6e8FELF~7HX3!H_mnz-s}$2rtpp9cu=MuMnND9G@ruCO3@0K zwB3gRjet>~8hmMftFimEV|qE~Mxs-?h@HAN1R7Q*7Uzw0^#@om7?`E-$ZiyjbhP<|8f39XnscFr+XGqu zyp%1Lav9p9l!TECg6ZcV0Sb@$GRli6J2Lm?syOsfL)RM9Oe6mF*Ph>n+P@g_pG^WS zyabAGL=fyc-w@g_g~ge!Es}5Xa^QTLm-z<>XFqASbir{&oa(?{B;=u3SVDp37m<*W zU4yiqvPtHGED$)%B_`F&#W2kn@-)HIchG+$@qc!rA(&mI=Josd)==y?remJ)Mvu4V zzZC18FG=NYaI&oU2;aeUfTq`cz8^GCSv^__4CI=Zop+bkRHwQabNY

kH!7puKpV(J_F=C5rkHJ-V4Fah1AU*&C?&PwSOLqh?sW1Cmi@pB|ZUwLkld1ju zR#R#PA8^)jB>@QAS%eNNpRN9FK!xQjWD1u&t*S>V!P-k*1M}mYMalO28ShlL?*NcI zrPD(3xszGXy00*Jm|`CJ{O3ONCwBXQX=pBe@UPNqWvH^lxq9UCh!2{>2%4-+n${OQ z4F#z$5DrqZC#qF9Q<1z0T(7}aAcicc+7do+mW~cLdbN$-I}U8Z9c$DK51uBp!$3%V zItFmY1G)KBw_5A+q=~1~EaV_>0l6h1czpQu3?E3wuMDcAfBxUQ8J;WSW+#wIwm*xs zEO{;hayq5sKv2D+G+_#f=VJ>$R4Tdg84X&t$dbj6c=eJ0><~laZd>CJnD8HRa@s12 z*;2mVSst&K5%S;PG?U-|9(x57_WR4M>tCIjLpBb@L63v$+-dK)6Vz+2-2deQNg_d` zdI~Zkf>6A}N(VAJNv?KA19)HF7@Hu~>!&ktWKyIbh$bC6ZP^gEG1MlOBq%M@3|SLS z$|b8Fc{{YUtpTlu7?K-T}&2@F@*-B5yr&U09BE9-DdgnQ>??yG2N9AA!{3;j;zgGcF?d;LmMw{b-E1UYP$Dc9}qK z63Y;WvLwJ=>0HhvT06yCk^wegEs#X{#IJYEfSXGd8Js{=7*w4mNHSMX{|;vh=o6y! z0`)|{PM66>gPxqY<43_QKfIuWC!`Is*Dz)Ina_p8z?yorHDK5Qv-PmpxUz~NQYFzL zx#bzLN|c6Vw%>^gl13``kUed7<(4$h+9_yY0*N;a^~Lco$qcQ0+|V*{b91{r=us5a zC?zB`x#=ytSFv~vPO_o6sXXaTR<2&KWF~-eru0fqM_q;FJlgmpg(YwzJbee3aWUv? zii9?xs!RQ13jr6YL&=AZDtExW_UvEgYfK{l6cL+Q$P0P4DKLKa{tJ@Wi;0Wd6?g4g zMUjEQ39ZJjIfyt=7S2u`1oAq%f=bUr`U#&xHZQIIuVuuSEJ8H4;>Q_V3<(7kn!EH; zGQhGnfU;CX1TUAGB2L9p_0^x8LP>rjChF9CEsA`=4q;mZU{WwKG4`97Wup>Y_B4{1hpE3T?a&XC1ao&Mi`h2aclsBM+rWbp8+!DG+x~4QmFw; z4qlh30{;9BRO#K6#=Vrcif9O{Prd(O!Wni3W!#@YvPy3oJs2+e<4gqwmf#%)W&?H@ z@@M9Q9;0}{gzGd}AlNAFg#;Jig2x}HmG>Yy*9TsU zIUa>x_Cr6N{mw!S1;;nQ-23?VakNinxaFnVR(5uZ3VHLbSWpfvHou%nnvPl2;h#si z`sO;)F7#jg9ArZgP)V-Nzp_u4vicN4M#e{VBWLm+RJ0(zdH5BYt$Jj?n5Xv!!Erg= zZ`tRi@EyQEbqS5Z|LGX;3RKR;8!t^i0tVi%t(ERpPR0nMJB^%nUYoBz^lKf9JJT%Q zxXxLuFz9g+BrywkNri0U2=dIwXz-?*o3k-%ryYrw`lmhlf z#^#AyB0%z4>0f8gRu4ex)whSCYPSIMG7e`0f=fp`o9P~?@J(j4GWK#~UTL$vdaG>x z=^u7RhGJ<8h;iPS`26>yP>wB)>MMXZACIVW@Uh}{vD9k0Z>^sI{lM)CcSql_SaBkkmF+2=DFF%>c!(f@3@lt zf4^#LC|5LOV#*bL&e*1oXBt@fn>ZF^ykFg|BA!IU>>j;**Td6(?9wBXYwkh4_am-- zm-;*X`_AhZ!a+}O9656)$$&!y8!)u>e07gQID?UGX2VEP(DW}1WVm(Y7acg6vK(I* zJ09LSyV_y*X zfj*f9SdCX=gmSH2?zT3K1y zP`0MKT1Y_PJs=%#!ZD+5iF@yO2Y7f8-}_YDgya=5+w1H;^cl+f zDi_TwH(M;YKV%u{J`ZFx8JR7;w>|sZMH2^sqBy?jy7=w&Q;mb}bq>f6mo56Cmq;RV zD;i~Ylqg$K*g6kqn=C_}&+mqsj2tv2LQ0|1%?6iSVPk%N{v(6vu{QszL};bX`1wsR z07@E$Gj5gVaOF;w|2M3V(n9niI#)m&d6aY1Ls4hUXcCZ6@oE zAiLjshbWqDt_s3ecL7EEiS0>q?FSS}JGjrU+-1+ceF@>fMs8+{4i&O(q8v%-8Ylk6 zVqm~D7MsP*Ws|fCz|Y25aPK~Rtf;8fG$(L>w_Y1NgA9PrLW96BNT`jvpDre2$s4)t zl%{Td+K8Cl8&Qk>kp8cMj||`UXWIT*A8_be=4~3K)v-j{D*u%o~v7=5PRA z&WX?qulZAz!3YBc>iIJR&wsUluJ8@7uC8855)6f31(?T57Mhu#R|I6vK6fp(0*B+* zHH^3|m;Rpyuch&c<_MJ>io~U*ZB&cGBK6v1Pc%_ExRShmJF*HhLFG62?%zw$TucI% z1VXwQ8heASEHAG<)4Xooepn-M6WcQk8L<|+mS!N-9(A93GqLx?Ui%(MTd$!guN`4C ztsPSfEjOY~eT*B|c5^ttW8pmcP(HCx0UvSL<;_REL#f_UAUR@P+x+0};&eslur_e? z7fB?QTrN+jY>ytjKieV`cxDJR&+Z8c3AN2)GOxXo-|9{;T<8T-WvK7V7wPTKE*t1(qr6y~uiM9R>dG6q9Z^pF3{nrd;PfWg zn*us@n;r;&S_=Tf*AG3B?wvRUHOE0!Ih%alp{}lH10XeplUytdn@q!5+$%-d>NC(J z!!Xc2V6hozZ|wB}FbawYCZy%tWb^9l>u)_Qrt%$(U=0UqHcj%ay>0oE@z$7+$=#q) z^Nm|^WN{?{c>xh|hn?SFew`!R<0#5j;2SgzpUDaY7$T4@JKYSZY*`lkDjc@0BG+o* zyQO28UlSMr4c~$7ZLmDEk2{V%-|o@B-^8+Bi`stp8)35MRGiLeOW#X2Hd@3mPiner z_aVBVH7@c6hPr9A=psOkX#maf0SvWJ?Av}%Tz@-0=fD~h@MlKdiC0%}Ajt)7L-9|3 zQLEHj?LMHCcB=r{w$Lmv-iuISPw8LSO6=Bq4=@BSjz&+8UHzU1&E;v(30!&d_vwFW z#QfM8-Y>YIy`F1di>dWUhWV74sBq~PDAPnhkUrA`lHNfP-pf~#&d&EihEG-AQUOWN zEW+f$*Zs=hifE~w8mZn#4ydL%DP9Vg>MM=%?R+rQJ2dobM;+FhM5=|J8Q`D>VCI^3 zW!q?6Y>vH4A-;Kf!mDIsTJ*&^d5WOe)3HeVlGk3_rHq8R`S}z_p?A=io=qSVXG?*lW5S54X({X_ z0P?>x3n&GzhuxD&M@yYvlx|Xw7wB1Gjk+`|;QQ>;Ja2*sbNZjVEj)HpaohlIqqI0AoNC zSnxgrA@AM;0qiM|Px==Q|KDe7RPnh4Ov+0Y0M?ZB2)Hk$D)WGx$O&|k>=>has_W7E z&6|R7j}kd(AN0)q)gKvm9}Snu%KW>cP*){ zjdWK}Pld73QAjQS=hTdcWr#F)ZMG zefP$Ad#u`GN^xB4)&JDEIk4rRO+UWE{GP1E4|AiW5fm)bG%c9m2`%(k=h^C`?E%bh z*IseX7bzUMlgFl_+C8)hW^mBo`d3Lm;0>-HIt5oDl)|?}LVn4Iy}jkq$O8G#!|IFs zF@{;QlF8%vH61cx;tqxJ!5aYWT4>hU8MSfzLDU^6FqmuWCvvS#_XRNjKtI)35jxq` z=cngNf>{PZ{#DD|VMq>(rt|dOQBZ;e1O?H3Le=+^NT>dczW)tqc`pNSnrbWoEJ~+f zX=SASVx2Vn%ADLK-U%WVBpuy z1F2pvT53+((v~)7K1BT!N{U5h9A88|(pCOt7dU2+5j6V8|d(;TgKbL!}4O!QTq=ND^k{Q+f?UxTeCu4dzHk&`Nx+={(D zJ^UJpsY~E@2^s&GyD$Gxj%j1(yB7@qsv>YTt%Df88vONt&s(KV1Et~gU~L?XG62`q z0(sOaYZyfRI`{R}4YuLjF`>_18SI*-p%Zk+jJ9-F0ET^`bbnZ+oxFt7pWDCHcs7u&iqd8ckB|Hb9* zoSEMj8sTyZpK%ByY2H#$n<%zDTkZEuUeh7)tFkE`OT5FOZjb5#U3ivqs21|r8K4r> z6-}EsHr_E4uM}L7n&=-sm$@Giuydw026pf5NhBZ-epB#5JI;Q7Hul3q`|dLr%_B;_ zEGTV&Mf?j6*qVhL-Z@sL`YJhv|FT6P zw6jM+`uPVK-}$BJSC;>-os8@zdNZ-K7uTY5uRS6o1>TVZRE1kyRZ8Bf4kS`hX{lV7 z-d46FHgyIIhL-IIXJ@9>z5zA^{S)9$$h1Skg>42&C5uop1ZfgsE z&WSd43HD6xoL50Pwh{wh;LDQ@svhwfObx7V^B~GXN zXyZLzNA3V)y^Aern+2g9(*%t9NoReW4tX7sfE^GH*JXsU11_kNLd0^juLxWGSy|gs z+?xoekHv23OF&rkBRvIcTiR7Q(xa>P+|_U6MVaW zRVySRisg^9-bY%1B*3xP_$^x>W=kUN3}mWnLYZQdp9fYWK<_a>Iesj*TIkuw*ggcU)wE9c!596fI{lhU&D>j{YI9$4! zm`{(;d66a7mZRBLP*^w_1u)*Y={obf0U%TYw2{!P$EO@@ZId;e7yj-Aoc$b&@Esbl zk1&z7>&sJ}PryTz4Rw>4#k)6tGT_5_2FP9`SQ#@w4Z#JiS(Z#orbXb&D#mZ^{L4o( zGcy*^^5h+t*M#hH4KZ$F+jtc(i3ui%f|ckdSjE>vz@>2ru#@JLLiy`&{(BBx1suA8 z1t`T=JHG!e_~>`L_#*$Efx!$Y+@hvRtDp2Y$FfR5L$B_d)X?ys+L!#Ci_)uKJ~f4{ zj%B#7$3RmGjHnFbxA+Z|_gMucVRL5%Euq|c%7_SVdU-=Ld}30wLzRtg(izc-?$UMd)0zbI!KT?3KA zn{64D1$TmXsI}!C??c=VL&L(jKwWZbE9(0yJe5g)uo=5a{~uyBsIE z8hyY7*zYJ=zH|fb2PlN26FbRPZOw+&i$ZKo6n^>iGVo^_0G)*&KHPo3R=^#T+bw)% z&soY{fQFZRL6teY29-?RaeJ`?8~Sh_g zVO)RveQ+xO9kiW8XT#xsh5$xWOxl%%1aF8Vw~v2%rg<9HumjkT*OHnp^t6Mj0%jFt zbDS`CZX-E%>!`uDP=v@@IHsT)n&W##y!RONjmS-w)!DR9h|#`Yr2=$e_TF>qkE&(4Yb8zMvg{2 zzt2mV6g*3W%Hoeuc;bRps%4qU{N}LCp&=@_+Zd1LMa+C))`0dbt8|An}D zlFkkZtlr8j=IPsao3|UIERG=VP&b4}Erfa#f!oI6xc(d1(A9>llRY<@1()|l&RGoGzh zON_bq>HyVg!`UEVk0c#(@EQjBdIWtQznmzC>WF+VF`^Id>$F(kXqr3CIk!pexSO62 z|I0Fp>%CyObdr!;$uviA6W3n*a3FE9NjDbJFwQ`B>x1pF86D(|tb>+D3RQeluM@#>Yu zCK!h(kKNDl7`tlQ!|4`i0zbrMWIn0jCghPs+9a-2m~&h$t}=WJ2O|G;UyLt`w;sDk z@GP;@qr2wg^}gzlCNZMZyF6B6i88M(M(RT%f9ZTcq_CglOZ`HB1%twC=8bEd)g>Ps7^WQgZf!UthbgcOY@L~A@S{Ukz=ggJ+Jf=;PzF;Zc?U@?4w$?{`FeU`@IO9?sTQP{bK&DU? z6f&c?Ch3H!NKXW1C=^h~YT!{K^EM)6&3Qh45wG3Sx?7ICTkT^5%Wq5=abZ@q=>Ja5 zNWLa$kdDyzEQnbf&YHOz!Bnm9&cU6hf4^v+RPLaJm>7Osgv4Icf$)Y_6&QCEHOo~_ z?QKgGJV+kVtbd4eWD5%T;nvZgei$J?-8UGtQ0pE7do0t6F)fa&A`Sg##zyl8u?Veh zq~%k0V%P)B+-ug^u#t8V#cp2={^NWT;~`8-Lz_lg6X#auMbc2NhJsK!&Ew6 z5UKp>h7-glm46eVYVO%dj>X*4SqyH;KZZj@U;L^><$->I|G)e$K6w2cVkK@bWY*pd z7DOn!cu8~Ow%j%$?1WUg2NnhlbJr+s}p3ZVk^2^IPUga;qEJ%^uek(}ON*2}@R z%o=NMgy!&c-soLwDzC>LCY4)A$2@J*MW)(|!MwQ+FqCPmoTj^wzwBFcvW^osR&Q#N zVzXfEF*7D+qr!>AEBR&>$XiB~RHQsbHxqqRd*bfZue}*;+fri9i|X>VgC8j~c(hwu z4v@ce^u*T*H=Kb_x~XuH_56})c&Y+oAJVaX_ zjQRgdx#O!cXd07k>GDy17aXWVEAGTe>idxxnBwL<=aoxnnoD3^oDonXjYZn2g2r4w zhw*baPqYv=P_tsW9e*xm)n*(v=@o(9h5yB|_2(t?1Veb_lDbJd_{z!$HaF8C3U~>GQOTp)**Ngv*`Rtlr-%$wIFbx_~hMhCh0jJTsqIfx)L_-S>W2!QgjXdn&Bk7Zs3p+ud&y9Gi68I9-&efW|G>M&(YYH8(df7jy^hQ&#y$T^iQxHz z9>v6)j}0{A=28ls9W4zxZ|5|VyNE3D9;Z6K(1G{xJKwqwm{5=@S6+04<$Zh;jv#MF zj>W=F$fiN^iY_+X1Jl+ zW+_P~pRDR5Pp&{S9NLm%99M{qmk6GhbL0N3xzR68$(_-4x4{)Y2ujZsFTo3xqz#rxA9)Zk9q(*fQ77b&U749|?T?YtY% zC5!xt$9KA8v%kDaWWS{s)!=AYw8QSbA6LWv4@C*4b34t`9vZ6kR>)K)UlHfQqrb=a zcsZQoie#5Vnmgmjr0wFBTu!(PrShD4QAO+IFx?=eoq-*(q+6WBsc}!}D%c2=TmP5S zHHO(b|A1o-ZV%3-4@|1o)bIX<8}riL==yjT#>s>c6(W;np_Wx{C`FjjR{vwhfEC z!B9<(;XQQ7&G@myE5t&@vwCko?5KOBi>zm5v2)HSK-EoB1}BKd#u#xDiDj6f4a(-f z&S3;ON^0gElSO-~eT8Wo=4kFthUj+w5$c<7wbX%MViPyXw#uHCUA`+$bXp+3)K(6& zFg~j{+tnWd8zZnA6D>s(Ko*2a-A94XPm~DHCvMazu)i-?d2WiEyhvMHYLmc|TZOqu z{4r8Qxe0;$ulHx`=O?%{&5I>-_#gQOIk=lDy)I;)Cg9X!h#Vy(VKy-nj@x(o-SFTR z7mj|!NhD1XF$x%7Zjp#ma<=WL zsWGwsql#U4hmd*U16|eQlDfk143Zq_DIIt^_r1>o6p5RpIXUyHE+N-X#9hoG>iJxA z@d+;zGmhkVj^YcXz{n?*?$c-8Ph+Kyw12AysG8H7B{ z>G8iAlncU3M9N<2$_UMEOX(%DYShcej?R2qqrO-tkez}&pBJ@Y$TysDbxJi7G)KE2 zJK_t4w5Wm+NBb>Z#o?ONo}24*-{pLw(b{2xQS?=kksz9Oz*0T5`Dh2}_aJhiE9Qlp zV(1vd`EVsm)9FuAWLZP%TJm|4`WS@^|vqo<)iG;iEnx1Gt*UoC+ddp zx}2M|e2ler!j8v>*D<|Y;NHg^PJw?oYQ1U;zo*U$)`hfxY-6sk%yu=k9!k8q!s3*$ zC6+QA?iQQ<005JLkqtmn~!FzphF>=N!*>ocEy0$QeEveR-U|Oe@PT zp6^M27jux}GtEOkV;YxYei7+)%g0=h@l=VMMJ|OOiIH=PXqV(th*YSr2OOOMg3%rN zgOx!Z>8C@rWg7^EY0X^+kGhA-b;N8VR)h;EZ7vh=7=5A|@`57iedIGU_FX4^d%aEz Q6TzR=UYk8nEIi`>2e#cFZ~y=R literal 0 HcmV?d00001 diff --git a/src/android/app/src/main/res/drawable-xxhdpi/button_x_pressed.png b/src/android/app/src/main/res/drawable-xxhdpi/button_x_pressed.png new file mode 100644 index 0000000000000000000000000000000000000000..56db5843d117cc58472ba3dafb5b285f5e43beb0 GIT binary patch literal 27645 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 z%0D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 literal 0 HcmV?d00001 diff --git a/src/android/app/src/main/res/drawable-xxhdpi/button_zl.png b/src/android/app/src/main/res/drawable-xxhdpi/button_zl.png new file mode 100644 index 0000000000000000000000000000000000000000..f8ce9a0c620e175d8aa3557a718ad14f4f1769ad GIT binary patch literal 8675 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 literal 0 HcmV?d00001 diff --git a/src/android/app/src/main/res/drawable-xxhdpi/button_zl_pressed.png b/src/android/app/src/main/res/drawable-xxhdpi/button_zl_pressed.png new file mode 100644 index 0000000000000000000000000000000000000000..981c8b0c82d5b297ae10d8043dd8d6d0726020e4 GIT binary patch literal 8675 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 aY91bwy$r|@ufG7OK_mCP!w-SG<{(J%8RANjT( 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 literal 0 HcmV?d00001 diff --git a/src/android/app/src/main/res/drawable-xxhdpi/button_zr_pressed.png b/src/android/app/src/main/res/drawable-xxhdpi/button_zr_pressed.png new file mode 100644 index 0000000000000000000000000000000000000000..b30b2e799a687b65789e85a4d22548cbb0afe8eb GIT binary patch literal 13182 zcmeHtX*`tg+x{p;LP#1r6Ov>PV=axc@3QYZS+ZxX$Sz;XzC|G;gpfUikaeRJ@r*pB&=MW`7EqmEp7OGo!#K~2!xcZubYLHlZ_{vrH!3~i!^Gj zt_j8FU@eW(yQwOm>UPJ*-a*07-A3C_O~=a5$qH?al9eHo@|A!EoNYWU*nFKIxOhnT zN~8W=R{~xWKITWU{d-c7@Og{4bHrpV( z-nSW$Jcj3dL51QVjnc8dbm_Z)kq)M`&fecux}oyYl2*0p1`ocsg6Wi48$qKLGUyw>{xg3R zAlrAB_+Q)o-?#tm1aKG5Ka;DJ>Q%>hMA}nQ*F-852bskTco89PIU{wy{}Q6ki+mdr z@jcSsK3M%Fe)GhRW?%#3iKHGY3jXId=6k_MeFQ>$ofef4@#j3|C1-9iW{Zh>WoqQ& zju*+N$UnR&iRU~GM;z2PZwGfhu*5_NgbK^k2o$eG`NXsY zOrohQEJ{(oubbPY|EU@C;hzZ8(x9~v5{e3{fi?^+TW+S#war&QNf0TuVahwqm~R-& zbZ!F{?LSSFaR+lxJ8z!<;^H9!fopcNlTl0@l%XD|!vrt=?BmL{(J9;$mYcbN5XdC2 zUeH7ts$qm9j_D9rwQPvd%G?LA@x2V57k(Tl35Q)q3+x0PIkn$0EM=0w<5YK;5kXnd zg>ZY`e*l~Ja$t4*-oe>j%{9h^TT9#n2NYV$iBM zmFPB9<%bXAUM5#@A`is`PO%eTi;~NC&??gxLEn2u*G>nk(OSj)+VI`~D%>aKd9=T6 zm!y;@SEm1s3c+fVmcQ;RwYsyj(~MJ>Jt|o6Obd|7zBJ2*yiSThI>khUwpqqAFfdHa zx*PD&MRT@LzhSjNhAnLF8FyL>^&u|~g=JGyIzJVBig>*7DXJ~k1$o!j%}pS?$F>_u zvde8UqMF{rHNUx+QL^M4ZT^)VVQ#ErB+REslWddv+KZ9iDn_q~YhUXXrTNQqaGdOL zkc+gZ5dV3}Ma>?np{x5VLs;b`v@8sPNa0YyiJ<4p+bqjS*~weB)R9)Ch{uX8Ki%|o zbStMk`lL(WXcZ=muT)XXA=;_(pS1W=mGgQiCh)2i;LKwNJk!p0@o>NBd`ZzNfS!N7 zUnkhEfD?ILSy}mWql0z&ZwTw5c}4du85Y|GS9C1a5>X)p_&5}EEz7=yQmJUt-o-g_ z3iQpo+o<9^36Y*Vs#LI-ITP>FLRutn(@0RKyn6J0ip0 z8y1&$%sdRD1xsunM@H=P)vvek zGrNCbrw9xTEHqTUB}Yml*ZG+I&{Y4mtQ1KD!I1wwU64u2eMGOmSv6UJ8vmJSkJ=6k;%Qw2NNTbd{ zL$9kFTen)fWR1$jpft5-)OD^Mjjni)S(d#`HVfK&4fma@z%lq{NkU0hz(s(9*8C;X z>YWY`{a%1f5KdLBSo~MS6+@rZ3Hlc{HTmskq_=BJ(uM7M$(<)YZd8V|2JNcGbzG#8 zLvkN|@|8m%VxIrQ5qW`vf`ZSa)^l}ns36Heh zMZBX7zmuirqabke6)~{@SvhYvc=)`hgfpY)1Mx~@zT}IMm?_J$Z(9}C5HtrzqIHul zdw;=lCzfUUTuhW=3$-pPuk)w{=#rKOIq;VMrr%*u{FnlTh3isFr)>*5W&%$|` z@N?2c1{7->d6|ewvBc?W(#}R*FY(RQ;HEwGUis7d=-wD zA|r5T?0lc>$>D3CmG74b##vPNDkAmRSsrWlnGUR;|L#;8*zQ=l&qPVWW&SDj4gwKC zZjhAcE0yJ0H(4UN`frGJC&t3j=S_4-L3WX^gKm2Z^9AH_hvHs9c_=)4VRc4)DJms zb4SUg{5|*L%qfI9aa69thOgAn=qR#wHp%F|b;X!xjz+)JjU!|jJNQ0MfPCiZdA{95 zhqRWZZHb4U&Z}_2tzL-dh}2WZcge1QI$a=-qMlxztkb?;Of^XIb(iZnE#&L)EI2zm zH(xdjczB>HHo296TOe0T!04}^c|nn%OQds-T_MTF!Q7lp2IAyParKnnAfyi9>V_}xc$M=~wPEqiqYP5^&>mau(@!3+bzLtF@PuE~J#99} z`HmdnO<%EvQsq04u@mbCUxJ^iIAZE^s<^L<+voO;uE-8s~3# znmzF;B0Gu9USsbu8+GdVo&`_Cj?Ga1c4VJzMV@<&vAwwJ~dkwFr$p{py&As~g z9$V#9m3%32@szcd6;;>qsvE~UIocl(QW1Byo`|P8w@iJ6 z)C=(txLnpz1qH^|0PbBFNsfiPOtLXZut}wm?G+#&6j6m*_p;mO&WM-AebQEe7_Gvs zc(UI0)ZPS+Ye7xZG?AE$Rv(HC4aYs2>NYC)DCHgI#UM_STnHHMnn zr^eW&Zj$djIg1JpDdMfukb&$Q2gASq(+5*goXSZ|^;R9vC;dk%@Eszm5BqPE+>|=n z!WoIWOzc9vTPSEatJ(qeIPc7Py3ps4YxZhO3M$4Pu&1gdDd#1WIHUGbRDZ;Us6gR~c1<05gzBj+U`vIrsv;gKT0AQ2v z5Jn}pJQQL#q;-Mun1LvEefvqgX}5?fU^73i7uUF6bXxKyUq>@h?xk2gNB^1d=sWuQ z^vrqN57pHdJiWbFEn*72>rC1{jGns^@kI$^@b2{ETF&lr2!wLc^w?D}FwVvx3GT0P z*g1=$m5MG}-d!TI>UwGY-_DYf5)22;h8~IhRZOK`FSf#C*X^|Ia4?@$Oqks%!SFvL2f+44kbEs6Hs1vlnriM!ggnYktQ)BM)(%oba?L^MNX%!9e92^A|_03m=%ds1=QN8a;5o}e&NWm7`g*u%ACQ6|hH!d&3b zXr+_hV(n6i|LRKh^z$`vlJp+i^Lbi|-~{cBXWw%w{(=PJU1PjcRV6x2eUFJ67I~dc zz@b9^JIk*ukcMF1T7BL{EcUs+(oBZ1yylyg@oGG?-=CZtvPTQ*P2~Z5e_8D+43xbl ziRH|h*b%QvbmqJ7sY`8q-b*(1Tey7o>{*(O5m8!EDVP4i!Cyu9B%f>`u%KqCQL#?qFtuXTUV-K6C((R2D;BQkc^Ym;DhR5$(^ck z7k^XTA%)`XGfYU|>Kqq9Z}2BLzU1zplOue#E-#&OBnH*z^uS9*RT%2k5Rjav?PAv> z3A$*TmY?f7l2h^L*j3~;Y1{St=QnHa_MfJFDa<|R7 zvmsS(;>(obt+$(|*H+fn`X;?bOiEb-w+0yb>XysRBs0})dNa_sRdG9L#w3qkY+m&) z0bS%h+MK)DHnXAgpZl!H;UgCl&v%#`E;hoetE#Hz{EKNr8i$@($yl|=gs~p4hX?Nx zkcA!~aauW*y!Mkdfp(dJmWc+sr>O}Xn%uPRq9P&~q}Aeu;N8~wIP_eKzl5Y@_*_r= z$or8X3~LTIS=`;%^hHCC4f~5lO}8+HUN0n&S4j~mJ6KK%2YY+&pq(*0)}ZDymzgS^ zMoO9u=fCJ(4xqnrcjyy_#`Ft?d&Ot|xpP7K17QcrG~Lnlg&(nD4p1H)fY6Th_y2$z zD5-vfE_&8b?|?>^K^ze3Y)15XzK=gf3U!n~yKy1cKWW5g|Z z))W?YR+I{*awzgI*1YOO}QS*P2;72l6mn3XbAi$Rfq?;^*+e~=pBui$ zKw>8KiVJJqKh|5eMWGWo3}F9wkLOfK64<9Vl?r?CxYAZxuWb3p+c~QE!6+Kndh; zRNStYNnIwp!{n3rZN#S!P)ul|+Y%~ld&s69&1YV{`l6Enl;KGhrW-7fC??7}@p;eV zy?NQRzWG>i$-8U8Cs-R{5^8$cy-sygJzDww6jSNziArH3OO;GOW^bc}sNT<Q7jB1a^s7HjQ{t^uq3!F$RCOQ%Gb$P{1~l`Ib+ zAg9MCCz%06Bn7Up>+mI0pmO&%=ffj-jGWEmUX_I-9y=)FMB>#7Ue9L-9}8a1^8M8^ zH8u5-x4V8g%cf9A$hI$w*>|OK#QU8|-Hv?G5W`Cwdb`QzPc4x7pfz}VdvjI0OiKLN z+!`v3NUYgz4U@zY1)a}nNA_{ z37J?l{RVY>SlU#^GQo!%9eq%c@K&$K{-}<4 zdCYxHeWGXjXm*l7*Em5)(9*pmJ)mwcjsSIOOhi?4($OzFE}7%p+P1hHEXS@$!-_;k zFbAwRtBOte&O|{z8ul{zX1ISXQHk)#pw%3Lli(Rq<+YP8l8Xb`3^)@=k{ z0W7|>P0MFjygB*4xgZpbbUT3~OM!y`RT;%xj2$Ws6TwO<#nMWx0#Ir>v-{?a!106$ z&EVtkUxBot-IUH@^x8n=}O-u`*MJ2M5oRjW#VFTxDQnWR4N+ z6o`qd&uI;5ixC_i8cIZ=G?xr1c0Jd*T3=r6E@z7Cn7POF5Hk+R7N4ijODC+V{q6g~ zh}Yx;2ZxP(t-@ufGAGyDQvl?T3(lY5iqsBX8W|ea4>9yBMDpn9CPqXwK-LMte0G#h zrP)?h`bXijk{yz1<@?4Q;m1MJl zG4KK|fE%6!iNqHG{M(PEbwWUX0383STWgfOg<Bj&w-8Pe0 ze&1^AN|bO7(%Hgv6kC-DKDqA3`u|)6E+zG0@B4huk%EzxESCRdjPcd6O{QLJr%UA9AD{D@Nz^lD<qfQL9kYByW@kpnCp zN+n>q&2fN;rLPCS9rtf zzg*_so{}hVU^fAQ-Sso00)(E$+N}D$x%9YfF;`O$b@je~h8&9>nlEc|BGS^*PRSmO z^&KB>W}h6YmX0vCPi(5Ild^-#1_eJHg2E5ZC;Od48tAfjC!&BXU16g1C)8$qmGk&8 zK|Lk?xj}H%aKUyEU_9HRE^YEd)ec4iHtXl!iM^KGeOFuiMO{IG-4BAqqm*P*4XphA zk0qQ%Onff4k`zl{T7K#@_)PMAU-tCq*cg4X&EA#lILJL5G!HM4J^NMbwG^a|iOS_h z9x~s%iBCaroi<2%1dx4j4KEpVIK!H)%T22UK-?_z?ng6N&82$$m!|~tJh0JLI3)T= zOd9rlWB+b|95`H7m^ae9KSJiSJbKa5l9G~mg@n(t69;0d+M^Fd+vYdV+%Gjf z8r@kL$3uQ1&7XSCKSA{AWi#6DnOrkR?!?LQ+DVDMiwot>*4AgI%)jVE27nwtNq|JD zrvm|71TjjEbXjWeoIpE>9=+&f;Z&6%H#fIF(5xO1FrQc>LFt(S+^GWz?9Db33LW4C z3jT(zLCK}zV*i1kZp1pe^8O;dZX^h8Ij>UWwN#azOs`>s==;TnUSCU0>dpeIbDUhd zH{xXl?7SIrgY@)XuTPc^ZJSf|_>jcZT&iIE+xBYL-P?(I4RRWVIy9*&TvlnekgjG4 z8U1j3#H>jQ2qXwHHNa3cCr|B%T&9+bAOusUWVHn-PXnbv+eNZ78ROu=6yq*20JT-l z!8sls9o>Ov?j@+EALMd0_-M%ti?81WxeDA`URO5=fch~PfPaYYE88D`L<_b9eg%;Q zR8P%V;eybTCFt;=1|t>hVhTYwdZMj{wi(cC+8^q>VOqcY%2Oh9yfM&UN0YV@pIf@9 zR`fLDPyd|@&Wpe}Gd%|tWyc_uZ~;&6-&H4vd-BWh0D+N{9kT<OLyL(9TZ5#!Hofsq+@OuXG zvnxcZ_rca9#k>{oB z_VV_oq%55{T5pz=Bh6W=r6+r43|t+*I}_Jb<~W4CM{@RTSG)oTD)iIGHDaiLZ}PdL z>h1cna;mDT*7vuU)L9r9y2$ZDP74i;VHRgYZj)H4?6-?GZrIlt4_}E_n9N$&okS14 zA74>YR*t?$S~l&>kF??lWdmzkmf3G@Z_h%fK@G#vEyP%b_wY0kyCfff7}PYmv|S4Y z_%G-X$8BL0jK^$>3DPu?p(?mJmlp+Sm`&ZY<-;?h-PTaAJEInA`LqgkwjhZc_{?K}cd^^Z;JVqjh&)vu6i86^8&HU@JbKM=5f9Rboi z2k$QwNLIN{%iO|LX>fo0g1)@%hrdY=EhQ~1-!8)g@b3DfopE(Vt`~)%{jsz?<-bBp zhPF1y2N_iwDDifC``z?>hnuc+B(JZ8QbF;&U!>~?>l5(IbG-;|PQ}3(xW*3bLEie- z>-)8s)4cVM6~jGxK`n}m`0Bq}Gfyk8$qPZbV8|HEPHezShend0Ep0m9pPvfY?7<&_ zM+lIM9BO})|PspoRnR^|4#f}MMcF)YlZTTjqg7d;LCqOYyI$VKj*x6 zowRkC{%;9Wkb)Lpsj~9I~{s^5)j>7wSPC zoe7*vzyfNoLb8l_ySny;i{TW4>r6Y6K8zhS?0!PjuzGwI^uQJcI2{!=9h9ZU#3SZg;+pgQ8(53r;DhTxltdU*Gak*QW=rq=elZWE^fU3Ht~oz=k4B6jK|Gbo zj+=%6zRDD|`?EMRGqY@fcNe+`?YBvoY5jghUafiul=D(}E46LRIVN5iZ){y;T8_q- zr48S-RnP_IUFtX5?VwQ}kiapZkPV=S^F`-Vs@#B?STPoU#RL%%5uLYQlCI+G&`{1n zS`k_@%aC*=t$WgLc5H8NQ!LiH41ebajM`9BGbRZVe%;ofa_}7tc6{aj!}^(B0rJ-O z(0J&cbv&HHH{zG`Rnw;&pab$!DUVtikj4hcv%f(@wS8w?<9@qPrwfJPq67zw;qBJq zN$i3UTgvpAdW5w=?!(?W!%xg`BF{i_tTpDtL!ayzlmj>eorIim*QTRT zklICjfET~J@1!b>0|7NHe+-&uzR)l@{=43K;bd%P1M_~+(-IIFD4DL%)m&vg`g6}U zRE~Wl+>V%{LZ4R)z^C8BVBU@B%luiXY6TTY@+_n;&LS5^7N(j2ptthX{>l9p1jpoG z23Ltq6}IyO;l#4&ezBiil1(zu;Kjh#)sd)BDi9XgQA^NrJyHS!0qvG?h4Fg=?fNp= zBLM7YK3`PNP{r7=6F>Do1=(%_0183CGc6rCehv2pTvR8jV`gtaWzSQbDXPcT!_;d? zR~>{g_NM7L^z6m2BC5DqcXYM$IGz8`XO|^FkMJ^!1Lec^Y03cGNE^6Ojde?+Cr5SNsc6c)=U*0}%WN?iQ{^tE)*MRZ*M z0BMB>tN-2p3a2Yl(a277eEQ%u!AQU|HE zWx;cGsloza7~WT^>e>0rqGaskD&x$-FdQNVJQVU$C+NEM2dj1J!y>8>*R{OeuX&CH z+J6%!Av&RlvA!3;eWZdKszVsTOhG_*(v5+|2e0DWiQa;Yi{VJ(Gm&@^0r=+a43~KT zVLZgG*8swwJ}kb5Ah%J3w?6q-Vm#j%N(CZ2felQ8Mpk+_C)PB!h(EX^M|wK*q!XYp zS15Pm_OOwrDf*84=MLz`|EYB$)DBewVP-apN6e5CA!eS%Lk&uOA4;+MLTRgNRfds1Oq_eZ=;eY==@I3 z&fC2pr5j1xvt-W`1dkMLUEQd=uL~jf^+QHiQ!2o{{!R*>K}|}$oZ+#T8_nnU;Nw=v zwd@yZ^6bfpd*`LK4WJPtdHJtC`zTO&_PYU4CddNbFZNpJ{`lFL3-9oE@}4XU|bDB0CN^i zuPiDma{XvA$_iscwDKT!KS_t)daCTnUZ3RYC%0ZZq&*e9f0;SCu)ZqC@9Uebk*4FD zY2C9TP@gW7or#qZ=?17Ll&Vsgm)BP3_ERnxLLftMj*aOunvV+M_UU17szVwGwUi~M z4Sr+iu4cID+u7MQwOP^+IZlUAN_;sWQ2aiC(kFYuD0jdwB189D&AZAUP!OMT!HEX9bn6%={@CO`!Is$(6G_i?-z!6eEPW{m;CF2C#@G` z>lX+cO^}edtfJON?;t)A z>1KXU=0t5a9;`}sJ63iTMe(t#R=g*&mH~tMp*e;Mu1)&*Fx#gvHAH;{v`Mv`1 zrAu6!s@g!52vX8Ch@ZD%{DRrx=kDx;K&Sh*`mhHyV-*NlF zj`;Dokn+1?TK)n?2Mg>gr4ieD`B&wL>G++*G1Y@*Dr+Hn=jNwpa`N-JTyr!&HQt&* z$i8y>M4o(OM|1v}gwD~`oJPPB(l8qE2N+Wge?I^Kc3QGA=&K27lWMY@6cx*oBE)~> z-`-=OWXi{4C#I%YR{s1^fax6S)30jz|KUTEj+;_Lx0Z5QZ~iI4wZ@fV?e@ zpYT|_9)&8zO8k0h4w4aQ(#&4pG=*Vy0o?OtL96+$HO%fk7Q7P52F=Ke@mt@t)mPY1 zK(d8mHKt+e1G=9R7U9fv2DP3JRsdbP%8fS{A0nkyPCq+cQX3u{$t-zKeZ&jugnI3T z{;4%+B+P|N_WL&-`}X!~=??9{6jt6E)b?1Q+WQHe)(_t-G^FL918;qyCQ-Ou2;&6R z#(az!9xW>6WlzA<^1tUI0Sw>990S<>LFw@l8(TFEgFEzAbKHzFtso9Ye3>2`v=mg; zK5#>jH#Nfi(Zk*jPGXop1YCK8A(m3=aJ@Cy1ll~QFsGn>&v4SDfn`blvdLB)42=0Y z!5~Zs3`UuHamI?f>oO_koEM=;a?`%y2p&FfVNTWtKMXFY?K2zI$yz z3{cqXU}q)L?C{s+(z(sOL4|Q!;H-X9EOuVmLGlUhjV)S}3>iAQUQ*B(Ut{v@zfGj8 zTd2>w>g0NL7^V=jBz;Ow2uHD0dmJxGFD{_ZO zzHwkU_2ZLJ~@*`VFwb%B#CXERWdq{r_^_rimtvLIEDCj z4gBm@Cd~2ue}DN4^Os_QRfy8ipRF z_166=+%Ybl4V4%%m=WO@p@4e%1jbsM*MDcbs9}uWYMm{=xOxf(j)g-am@qo1+$ML_ z;?-Pl)L-g$BKTO6mD>4A?&x~)Cob&EC(EHQU7Ye<1?8@p7dwsFsy5Uhp?2oV<-$&& z*x-QjFK8Y)vgOXd71}xQx&DNeGgl4enA4SlfO9inyr|=VGm7{ljq-c28@$YnID@K9 zk4V6Xr1Mmt2RQV&(CH(y>y=z_YUfuKu z=4{CE{mpE}M4^*n%**cww|QyFVz;alBYL@VgWq)haC;h2u5<3xU43Dg6(1uX*`wEG z2;$d$`r{1t0LOrTXU*oYMb&{qHC6iFohC+U$Af Tx3i^Ogew*0)i5P;=1>0%?^akJ literal 0 HcmV?d00001 diff --git a/src/android/app/src/main/res/drawable-xxhdpi/dpad.png b/src/android/app/src/main/res/drawable-xxhdpi/dpad.png new file mode 100644 index 0000000000000000000000000000000000000000..36b7ea18323070137e5efe68f1a6803a445dd48b GIT binary patch literal 7816 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 literal 0 HcmV?d00001 diff --git a/src/android/app/src/main/res/drawable-xxhdpi/dpad_pressed_one_direction.png b/src/android/app/src/main/res/drawable-xxhdpi/dpad_pressed_one_direction.png new file mode 100644 index 0000000000000000000000000000000000000000..3715e1c11dc280a1d71e972bea817866cfaaa702 GIT binary patch literal 6977 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 literal 0 HcmV?d00001 diff --git a/src/android/app/src/main/res/drawable-xxhdpi/ic_cia_install.png b/src/android/app/src/main/res/drawable-xxhdpi/ic_cia_install.png new file mode 100644 index 0000000000000000000000000000000000000000..e6812f0d48724cae80aa63a67070b5ee5f5f14b0 GIT binary patch literal 967 zcmV;&133JNP)w_2cdY?oAlzvgLtVY&r-4K z$?c#X)Z&VQbP<;d)>?^X;PKv@WHK`^$$QNQey0hUU%r!Xl1XOpgvG!$;63mOxCylS zlALRn0Uv;ok{ATGjBaWEbE|?lQ9Sk`L6^)1-YEq70jzeJ;26gOjRP7q*C$%crwrEu z{RV~=*N0^pXSf!q;Q0PpTnpqqK_Cr5APqqv4M89cK_Cr5APqqv4M89cK_Cr5APqqv z4M89cSp_P{JsTh2$_sL@DN}A)1lk950^Pt>U{#hxa;62i4BVCn0LSEmv_^Z(7U>DY z1m?(-jJPe=pTIi9I(GtpD%5qwmN;7#4H9wMpsu_H+6xRR>N}jGy~bS92qfZU!bK6{B$L%*2NKvS3UQ=8uj-FW(iC%CY&s@o5onizINw~H^)~}A4MaLyp^mfy z>1M0q=mR!c(4!&?fj1d?QW}Bw8}yt3pv{#y5sM7%Ry=T<3bfnMRx8~|QjV$J&d3_X zp!rcz?ia9LmNl`}fJkZZQ;e>UG*=nPol9bbEXt%5(dgEH(M9^Wnm`odAffasB5zkWK zMHR(yx(LjRM#IHq(h#;B(7;adzvgCtJml)^0UD zTbW{Nx4O1f97*lg=gXPfH2G54X7P|sx0tkPtFiJyYzJnRUKG21pNkT^XK{#9l`91;bdDY|&Or6iGd86=Ge#e zAJtDD>T2D)$U~Fc%&BYd+D}Y-*y9?uiYrJ5ojMezxin%zZ$#9lg-`5d=dSLV`8y!( z*@K_g*3Udz^8B8EdfK}rKiT=xjLRAv7qC_^#d+;{x4SjjnkU zooAi!$o%0JX7O{|4P)v*Rs1`ZZ9uV8WafhK-a9xn?@$VUZ_7dp_>Q;WY@=9U7TD7hrH(`^+ ziwhR=YIh{gOM9G;Ik2+Zp;q+In*Z0{HLg2UAAVvb=M2+;x@5Lf>n}SfF+csDqcE}2 zg-uA(BZV?XNXP$@(p0Sq(WhbZ1?z7kAE@G zmb9Y12U-K~slN%A){6`KdthGSy|8luZ9z5sBGayz7zlr#(Dr`Car>I}A`Y(}e-2Jy gjp*IIk+Fi+=}@5zOG=tHFajAoUHx3vIVCg!02Hyv+5i9m literal 0 HcmV?d00001 diff --git a/src/android/app/src/main/res/drawable-xxhdpi/ic_premium.png b/src/android/app/src/main/res/drawable-xxhdpi/ic_premium.png new file mode 100644 index 0000000000000000000000000000000000000000..63f162e529bf138d38907d4b3b4d0ef6bdbdcd2a GIT binary patch literal 2096 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 literal 0 HcmV?d00001 diff --git a/src/android/app/src/main/res/drawable-xhdpi/button_zr.png b/src/android/app/src/main/res/drawable-xhdpi/button_zr.png new file mode 100644 index 0000000000000000000000000000000000000000..a76658351ac9514584f4c902b7830343aa03dd81 GIT binary patch literal 8283 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 QWzVlePa6TR(R7IYe+|`!;Q#;t literal 0 HcmV?d00001 diff --git a/src/android/app/src/main/res/drawable-xhdpi/button_zr_pressed.png b/src/android/app/src/main/res/drawable-xhdpi/button_zr_pressed.png new file mode 100644 index 0000000000000000000000000000000000000000..bbe4e64ce18da132f3e51683a555310f30c10486 GIT binary patch literal 8330 zcmc(Ec|4Tw+x8GrDr-zAnuIjg#+oGz*+V8vwv2rnG4{0-V@n8S&AyW*zIMJcLP%n= z)5O?E_T77Vp5N#B=Y2o#zt8+L%YDzaoY#3C$8jEags#rR%NN-%LLiXK>S{=R2!sNB zq=3-UfHzb3LR;`f)4{+9Yox6ugT}ZBJ+sDG*$DZ#xPj{sh^&H-+cUJ24VK%=#?HZ2 z4n}Tlg>gGr%fSrAwMDeulx^%C)co9S9{cGSp#7ZC($+8q`HQkXGGG7~8|*V~9~Wm= z4;ddh*nf>H13sVqEDYoRuUoKAaxlfS3Av55b-9%>?l#=wLK1>#QG^(`q_mKzgov~l z0?sWaA}T2?A}K6-Pf$cuMnpp9o;3G=UNHHK+_LW0wlexi)&EQezRAJtu~;`5VPS7? zZz1n{LKt^DVNq#mX<-pDVKFg5aEG9WuPgSMkD#l^t+OHidkmzF2io1i4eNk$f!sJyM=Bclq^(Z+x;>q% zS6C;>MeX#B!KI(?Q1NA{r(A#E8#_lMq-`?t?kV?+Z+X-`OeSJB4vSb5evx-Kzvogb zIeg4@d#aHTPxrdEMug`@w5A60Cp5u$;Y!IyNnTe=ONK9b5~?lLS6jt zT&8)&#e6xR7Kyy;@QH-UY5y2v&Se?EX#eT4f*P_nVqs$AycrUEh4K2Wtpf=0`mJnN z*nu$2ofe6`$T({67RDf_(6-0>ea5X#9ob9GZo1Svs1SY*BGPgJ@oV1hBI4H}o9eC~ z#PZeELIjnife8~NBqfWHk=fo&9fA%H8T%K9Lr>7_b}&F7j!;U-gUiYgNZ~VD2t@o6 z1>|GcO$g+t$Rg2#GDn5s)$>XPWrC+cLa{zA1XVb(-Z8rlVZ7?FF4R{!hQp@z&10oF z^Q|gz*9%ZI6dx~MjZ%s6=ofC@`mwK5FjQLX_`IfKar!1LC9}%l`j}J2bs4V}qkpX` zq0%I@_}dswFercKz;bahE0@pAi)uct_abpPCWJ(t6CKj}X|vxpv8=4D3(gw#yhfN- zo)*k-;pKy9QLmL>l@t{Or?sUejW?b95Ii(h#?w(xk0nvpIbYz})sKg`TbrHg5We$Gg*~U1p75pM9IBAW4uCddde^<9XB>RP_AT>PaRX931|e`vI;s73wT1H|yAP3XR@&g8(pLxJJ|E3uYHy$#F8 z1Q0od^*mRo;9QIZ&*ic@^D5WL2Al9J*OyARl*|bALyL%rZ2ofN>UqgD4|799J3Z9Z zvet_?AqH6+@281>rAoM+=E17s)N&73st4qWXA^#^uDhq z`ZDf2k=YXB;?z??hpXi(QLHYtCS^k4#==^4Ep8p87cBDGHHNTG=q(jJEDCiPd@z(5 zbO(CrprN7R;I4R(_7Jvi+~qbbXn!tQ;Sn;sV^##rFG&S~CUMj1%if?bGjI0mo=di9 zSy`X$kgI|la!QEdzmj(kC7ge)>pM9u>$Ogkm6t4z86Y2FdMvNicz%#K_m^%2ZVhfG zbX#W|!Iu*8$C25E_iVov1`}f>r~GGLoIkOu8$TB<>U?zV90O!V8H#>4KoU12JdRa3 z*`xOK^n5dmKTgSC3~HUu=Z~zi?Mop=e6_9~waz_3pQD5X(4w{2p-|egr*&&Tg##Bg zqpn<+VG(1Gx%xO*k>UOL>Q1Re>&fXGPHCp%iVE+N;>fAs=m(Gx`nNplm%=;#;_>){ zzEsIz(HpT{2B@-MscaXiJrA}PUre8#?2=_SzTUz}rT24_IEg2sR1}aYK3Yl}u@5jt zn@qo@BDy}?>N`vkxdM47#l=hQmfzzv^2C-$%EtSl)h2M(%8NUKZG0gR2$`4`)om?S z6LfrV>W#lCX}?jy{!_y+(-BNrHtp&&oEMkf4T2?tqW#kcvyU)p*+Zh@Gtb1#4B!E$ zXs3QpY!Og)-Q08;17*BQC_@NrB>dQ1qv1T`%6T5OH0d%Q+d5@ zIDe#0&LF>iikDKe0yb##g9;JDRK`+Hmx_Xy_+KBLx zm1np_!+}D{WldQyP~|VnfW39%a4TMo==pCS$}L6gi%LrFNpoIF=(D{ildcomX%z>` zQIIu?ClbcU_?Sgyz_z+mi#G?EGiWM%V*u;vnKw2zM)UixPc%(boRRE}SnYV8w8tV; zln-JOc+@YxR+`=4Bt2?eE^q8#TwT3PpM0M!O6Ba76KX*T+jYIUj`5exh~OLByM}(( zJ7)k&k?UyY{M{tMrxM-dU5)_x%;7or4_dqliVUwdbhnA@LbqVQ)0V-RPESsz2kcII zqZ_@+YXP8gP6vPdaF51m$!Au)5yi(b&e(oT;f>6GtH!fYZz}XT`1FK>^z8$)y^|B2 z;nHzbXSTe<4<17}YcE1v+{J)JWyeQ$=MMe^-sH-Y^ z;@bYLupe)C4zg;WMjDqQ*dA2DqX6vNSC48%i{44p$g}X7eO;@aDzQ3MZTBb~fM-&_ zX+P;%4+03K3Cz()7u@$vCn9eF3LQ7RIteMz3nBgYa6-G7?QD~^#I z!N&Dpeq||#A3QEHD6OlLOxGz$w5lwm*Cy;M1TJ{I>)M-(P*l;YQR9hUTv)(?!``(O z`|#T)*{s%ncWsg|8GL%o1}fEnpN0J`Pf>pLOv=f;(+7C3{-Z~a7HWocQUd{sW(-eG zPTq~Q>b#O=1a}-Nc$B$LZiX-SjPJc3v+ zzP18Yx@jDsfTo~)a9LoQDBN4s1hyT;qH-s9Xi+IoCO8jIcEDg1cKR?uo3}&TXA*3D zzx4P!q~wn~ON7FEtu!??Ex>Vs^bdf=>GoX1anmZ9nWYbscgJ}jWvryhcowJPzJRK- z26y#T!IQ$N>rKmljf{BtfSMTET^Zfn?u=r?yiv`$5Zkp`WP?CoI9m&Al&Rjkg?#PQ z7Fjet`U0Tfbehmvu*a9<=@XI)AYXQQ4a&9WYK^v!gNMn9TINY`<;-QlEVJxh8+7HmWwGo>Xhhc z^?07zni_0>hMa#7pd|mrVpK^`#sEo>CiKPdSQGa=#4(yjT_4W6EC&KOZx(#KUEuBI z6&6;qUgE%xvA3t4@EDM*SR1V_7$$8}s}}zSBI{HlRXeiNYCkC{iGeY$cdn{&(lxn@ z_}stQypFK!=`VYuZhW=8+6X?swzl>SggG_IsiJvj|F&k*ku`wNMm`WnZ<+M@tO90^ z7}cVjoE)dQo6IBSizQ%C^$lHT2%#Tdp1F!&bmii`lG6ry_ z>HHN=DQwqu?RTS_G3~cV0bJrfLvgyqvR9Lj$f?jF}zu^c|kN*y^#op1;(Wu^iPJPr_Vt+vJ z{O7FNmT`7o^>~)pE@d_|?BMUuPJ|5iKVRdX_4+^W_vL0NJni>x+3dMbZW@~1Jv>G~ zZ#E@(PTC{H!aGFgX2ZFHjsbStYE$gqZA#;bvgcQLxbOp%bGuwV< zv2r`V_5r|U@%OmRHP?K&XE!1#DaqAzxYl@T{n?}o>nm(V@LhCP@+IP9Fk*Q71$RDl z^wo>6kD7cpkK%cZJ?bak(_#52DJ;{_(Rx|B-x1oHuA^0Rl(AjJrNzZ-(DEjb6qO8d zCdDgvL3D{m=8uq4k`^!BiwA8I&wnEy@+RmxE=nj- zg*?|`pekx@Rlv?A8fLh+Q?tQkunW2aZo7N;@Lx%r`>rkf^T~i08o-e@qeZtXLY|gA zkp^-I{AT6VIBArj%bzGu0JPIi+Wa6z690UYmco+rZt`x5$g`KhoAZ4ZD`Ya6tGvmu zs0uUlnP5JC`dyj6dEQOxCE}kcd7*c_yFP%i=l4ihGZIaxVvP};DQ1n)`PLP%WhSZ@ zRin;v9vOif-F(6|CS^%eQ&WFHB#(kxQ#St6aZz+N+GSFCDUhchzcXYhRK-nf`AV9vFDj#_8C5A&XgAIha zV|zZYr=>mpzW18{(cdm_P(3p~oaX_cGRHmJ_|x5=)vitOTyv9(o^_L&93D;t8>A`D zdIkZ5-J+$`%+sfa>DRi9d&Tibx&ujS*f8`6g=)^qYX1Nz!O$Xb+e?vQg*U-r0<|NU zDBG)(DL>h4+5Xbf!os3fcBo=mM)HFe{`heBA&ZLoQ#h+bQ{X8VHHh78S~XT?(tq5g zF8#CfXjT5s&Q2t?JPv1V%$lZCun9Vvz?+;`x{iZ_C#9Ni>2PO%0h}}P$E(q-$e>s^ zgPDKQ1m3jwJL)>}OV}DqDK#yGs8(M^Cdu#CJM03yst5ZKn~3)U$GSdhmpOT+##`pR z8bdQ}ZKfS>g4((go&)mDyH~L8=pmeygP*|6Z}(tzbv294+$U?;S>ir^=nJX!EVUU_ z;x1ph^d~|s_+YU>`1e^)ev+p9%%icm*bj|Hn@MrLG4r1EY)#&l8cQTj;&NF~>Lgyz9E% z_SRN_sc!|oiz_&Q(4T&P*H<=!S!ns#SRj+_<8p&JKg*WJIQAMk*C8dN&laUUw1G6R zjJ_t^dbDAqa5PIlkdAPOF9BrsG@d8U{?p%q47tXv#>V@#e%ni@SE>zRadVBRK2hqMx8#w(dO6|0ni_+?fB6w&dzNo6%dnVjOeh0SZiLt&i;u zCySs`0O)8eZ20V z9)O{n(>#RK|^hbAxzCd#VEfYb()1x7I-mss?hz2U z+N@EX?v=WrT>|Q$OencG5YWTAVBN&VH=t;D7~=9kjVi?7?k{GfY=fc%$ca@ZW%HS* zM(pOQ2psFH}Fmp}_cr0uNWw^Qkn7 z#*EcCpg?^b59T~1Cb9=Rl#~D|;=4NbdB70J-#QY>Yic+$rf4 zP++4USO*8VT=nD;m4Gq?s;n{B+yInKq)oD^dw0BY_!Uoj?^p#=8erYyx=F9`opV5m zZ5$pabmGy~G=rj*k5vWmM zU?3pU$v+k+8_E7H8;KRN%iDg}ZL5ui2I$#=1O+Y)w)=K6Tx#>%J<=EA-#xcRUMI!A zAR_t#I=X7Kv`2ctd9qO6Y$=FQZsK5#X@g0%sqcxv_V;lsLVGMD#Uv%HQphh=m@B<)_LqTB(9(hR_}_8z{JHOj^mwR4nC)O+wvdrt?FRAF%oZowacF*TI0O}F-|lDK+iCjl3NBN>GDPQUc%s+Y1* zvZjQjWH{JN(Ge#)nkfQ#CXzhqSmEo1#VH(pPS*uNT-87r)Og&HxtQ_VRV!Gwk8DPn z!KW$%LjTp+F6J{)grQb+gT~;W8;XA{ilE@;)A%a476072Qx{{jK{z84lhJk8kM%@<=t*@pVN2*nrHpROCcbBsiNpG zyOX2+smVrfZ|QU$!!qX-m=dH=0GJu_nPmU<_VdE>i@6D5f@BqhRFsPdGq$`eoK;FsLEZtJS`wMH_YN1aLa7ROtj2*$XPiHV6u$KhgW!_!l(zYC{P2ImTWb z*aKxWc*rI4*1_Js(EoP?pU~IKBfG^$Q%?MVh_r{c04tT^jX@8&|Fh`v97w$a{m$~i z239>5Fjrq(d3kwIc*iph9wuKrR20vju0vvj8|h*yjaGmX0RG2@y%|ZZgU9l!Wwaj1 z-@yG|3v&^ho_AsW{r!=1%>vDjfGv+gnGMwx2NV_;$Lr_jd8OCI}N@^}a_w|6PZ!(4W`w3?SW4w$|r z7}@P>?VJy`XNfk~injvSHHQ7}&fd=JkeB~^sIX=N?6B27$>|jb7nc~V4`Q9bI7$~P zI0T8@40!VbsNKyQ@&QtdyN52sx!rX=FlD%HrI9tvT|z?Q$)x*KD|n~^G+6KQ_889o zmmFj+jFpxO^na7Ld#l=@=!S9+<0LcrOw30X4xI%*aN#B>^3(Nj13`P9>r%F0Sp z{j{RuV&k$W(}t}F!>{Y6gAR52>sMd3{DQuK=-#GM6nWJ#yYk}P`8PaF5yff4r@0yl zm?FU2uWzfzhmU?&i{}wlWH9pZ@F>j6x|s?xGFtSBU$Fb>$?-Geq}R;ppjUpb9`CGh zI680=H0DsyHKm3u|z*71Vz5P#{G$}6( z;Y<`%c!prVJl7$w(0!!kfQUa#IIG9Sw*cq`vk3>Y^YV?{!AbTqgNJJdY{AM=N_u9HQ za!V4HqK*`}$qa#Fu{jz(y$&Ty=Py986om6X*3+I zF}QrjL3!Ai!2wh>bHMwELx?;39`36mQkwk|)q8F#s6Q2Z+Nvb;AcXN43R|79qEFsNyahd_^JFaKlFu&oE!xo7(_@^Z+hgPtwmi$ L2U)IU`SSk&eVeQ&F8jPiE4@xqjRI=~;SP}_YQr0XDSqH;dCSyFtnn*nqAySC!O^C^) z(n3boBr`*4>_e83_4n<0p6guKxz4$+bIx!6neYAie(vpa-}mc&f4*twY)%pL$B;3EX!<^=!T!Yh2if|bAH#fXd6XLWth!HQm&(cUP<=-^QBJpkw%MTdI% z1fn7k-Y7r+5CdseYr8bU|FVJf1r2Lu>rhkF6@QD^aFj!=jiXO&ppVXFX(K}({b*gV zfnZdG7a}@1CFSC*~;!l@|Km%#xUmYSYTAxFhqQg-L4Mj}_9~E^~ zgqDt?il(xTs`^QUsQBjIfYKrJ^KP43%9UUcQRV7tb1<*qQ6B82Q6|E40k@?lcUu~G7Fh1e_ zp%MP*5X7%Gy}Z$p5eCxIO20Z$`nwl!dP@J8A6WQDgis-1Si-^i7ajCu0e~>V(#+T~ zx?p|`ol$Vw>&+6Yds!bB^;~cBD)Uoj|DOC;*6;+*hn6x2v;>3gi%Tj*&)cV;7)Y(G zl>Vr-m~PQ#%uRB<7;wT&`tx%_z8OBj;?e!eg_7L&zTGxGKJW zz8Izsmpp6^ulwx|G?U{J%tMi6mTd=Q3|Uj|31$)^DUhcFLOE1Ha|1niX<|E9kvz#v zFpa!)z0aDGNG#p1BC{Utm`aK>{3xo6Vw4XLbB{>}5K6;fiz=RQZBy}$_Yy}a&=UNP z$S3!Zu!&+o{Cbwa(G7g2?ymX9;TzC+`*7#`p!NCPgeHjG$I32*P{-C=kB&15eA!UX z^#$q2xYnCp^?BMI(|ykycY3P3(JKOL7Hto|H8|!Um<)C2$`IE4 z`S$KDVXXPinGx6{RTw37o-@6Hw?1u>Qq#a|hXQNon?OQU!aeWLnK;0b%&rZ9WwMorA^67Nk9yjYN2T}>_ zLoD(LDR5Y5e1|x@8oDo|P(LR8no6fUccm>vfU7ldxF$*FbY{1t;nj5oVPWAUmGAs7 zAuO`9i_00>auK_rd8t#vc6fF*c*_3Edk4U=fKBWE@Ij*pzcF3KBC}~mLFxw_EN^}b zgdy!jMpjlLW+mwBoj#ju^SBs19$!UzI%6xJnGY?V=u?jb{VuI{h=l~J9~iA|-`Th~ z8T0)6H*_v)VSVXqtI_5N^*N6IJZ@KAQ`0G;)!ka;!X2>UP1z-+Z^jbIrFx#MH7hw- zi17^w2&nI$mYv7qq^%w3^E1hv=gT5$n`zzcwSxh#5mi8sj+&-su4~{}aTRAn%>Nk2 z{~YQ6;DHcIH2mHrZfYmei9;v5$+qxKjTeV4RyzfL(ecAkw_F=B5Gw$%^oN)wjTXAH$wt8`*@3xlI*F-$cdA0PP-z8LQ( z4|DAPT#X|0QkCs@w)h{oYA5-)?|FVT5>iqumq5Azv`444t*u}z?2RP-=RmpP>X>h% z&U}Gd=hWHa_h-o-O09h7*Hjqul>Nm|iX26f3iI=4&RSb5U|Yw!KaX_5yX(ulC0?`sBb}YzI9KHX?+1}ce{U+NH@FvLc)J$JEag^vs zk*7GDG@tO~Fuiiky5j}&4dohhv*h{$PY{958FHBKMJM<5R%Bs33D4oiX(KpeUbx%W z*hZUf;%LRuFSuSUoR32h*VY{vIt=>7@}eOL$Q*2eqXs5Q;LPvVm6A*|w~~zafh+R| zap3ppa~{-Vp9+Lg3MnaY=Ed?}Wvk1LKghL`M8Pd12;F1*cZ@9r&%1u?9GA-#j^ww# zLq^e5;qMEEpEp_P)k}37ZmXP(tb|(>>6tC*^VtHL56C=Qf?oDg(FQ;O1J#?vHDZ4$y+5kBhhV5&?0J1;okvskch@!MSy|lUUCV zp`uIex0I*LNATGJYQ+96Ns6^-b5UJqZ6rQhdu4OegV!yg##t;a?eN)k>M9f95doy@ zm60~+y-3se>~(F#;Ny0S0zSrXfV7|kkZN`of)G-H5iDMTe*YiC=+qM9ZaN#i<5k}| zrI{+!)CZ;DvQ&~~E!$LlKkN<4cp={CMO~vgR1Lb_l%?U?eY4hRKGmzvxh*u-YL8B1 zUER5^m`IzrX+7+9*1Hy8qtJN+S(tKDO5iPH1Uq=`1l# z32A0M-!$aAA#2I};y@V8sq;u$i7#`iYEie|j$H=GUPV$85}57&1e@|(hqOZ(MO8J= zDwoo1uTJQ7b#;v@y)&}Wgs}`T7|aJWe);aO;Ua}&6LPC;nn&iUp?R%B{>zkobZtXJ zTHI7gN|A@NbKd^JO;b3eceeW{NXL3HMzTbRwzEi*GkUM50NNY6NV;^TI`X=C>DtyZ zl?7=dt^Iyf2!)v;RWCGB4RIO__QII!CG=kZJ2z#+PG=p`ur*j6P%>KSHKmsM&-~Dr z8kuo(zD2+W1XS`yEbBK(NVcTB*6{=A@+qA=VGaHL{gQ#f9wMhYu26R`$(w@k3lDE_ z?ZDk`+Q$gbi!q{~NOT;X{PFYlpwtsVi@!LRBMOi)p@PTl@-V>d*PRkDyDy5jsqM$o z?KdXgUVy}^ZT5(NC7iSrYWkSc>zeNzCDU6u%(p=URx}R{{#wT=!Rh*NaMkiKHMwQ} z;{~o5o!E=9uH)`@BL1yoim2c2KL#w=^P}wd2^?H=^*(Q~W&WSX3m!HPO1%Q4-Xo>H z=on{1y4dviU0&K|{u=P=H4fdzCb6Hh$wnL9eum3;-(*U*s#@NhwBrJA@Z;x3+v9il z0bn@%1@6R>cWzS#kr+pGKs72Pq~_;anXI2B)yB4%zfajAfhIiD13G@9U|lHBJ;Xp0c}xZ7swzIHcCc-J`}LCk7rlj1G;N zAIm{ysOVwmt{emfNcE+y2{H5ka9Kv+=1?lo!T2_e&gTmT z!)VZg<41r3%+W4YEj_)_c`t; z)JrmAN3ANpSQ!e?P&eQ1tsS0q@XxQoId9ahjG~K}oj5AD-frNTRw?AJ6n!3RH5>PA z!vNAcXHG&OH4j9kz(%zxae= z>B$E&@oWI44dx-MUr?NpBAxnnDvvg-!g~;g=L<63_fF)IE>{o?&vUSzjMj&pErlCr ziw7N9`Dqg`MQIl{hqiK4ErhdY-X)AtvIynltJjf-*13v#yCE_-lgiW#Gf0r!%4+_RA@)n{On>x*(pk@A_Pq z*=gbA2ljUlQdrO?p{Ezcj_py*l~Z4Er|bf@Lb>(dge<^x=5-sNK2HH;fzv~wNjs;W zSDR1Y32R(w{<3^rdruouTcI~*CJ94qDVM2O-j@XRjNZu`maG2O@qnngp@b59Pzg$t zWg#zVU#oYMpSqt4C_3tSfc4Knl->9v8gqCj;ictj6+6l1py9JpSeSlgdx<^3cRLqQ zDw+vR{eN9|f=je}?2ZGh$R+o)5w;X=ZRXir6dsGkCXmpMGZ(gB*B_U*_iKCWhO0R>@QY_Lm$72M2eb46V-f$;rw3oSd9)96I;*?GIc=>o3H9k>{2} zxlQokmEsK%;5WZ&6c+n*Y4PR0-HpV3hU;9&H!ibNlB;C))2IMO!e^$@?$6Ppt3Te= z(&E@-O5hPiYjhrioj40Q7xwk**Hcx42X^~zKVPYlwREZ>uYFdFDQeeb_e;Qm8?tF2 zCO+k48SSiFv%g@dDv>)gzeY?NY8ssn0!eeHpujDxCl8~Cjjy;Qk_2-)DksOQZhR0H z_x88pd)-$31N;pTs;MJNF{47nP^B8T;Sl$yDh;%smlF<1svXtT)sB_w7;Mj9UW zOH81TSqjB(tW3MC2i_N`(1syj$FQtH>IVfq7XK!KuoM~&(o{p72ORG~5m2%NA)#}Z zwz+eVFli16=TovP#uo}OJsDY9 zVrpt?@>R7^H``p)>ybvkK=3;M$Zz~BWxH*x`y{N#864^2XUGVsfwH63S~r~NGRR8n ze=m%XuUGw+m-VHhovALfBnjocJcM-l^bX+l++2_rb$R(HlI3;SzliB{_*@+LYBqAi zd-Q4Wm~jo4#m!fw(Rr8h{&yn4U^!6HOsk{wHSmjjv}22hf086BCjNO(B4s(rhf`HJ znFSvQ31Pi2jpb{G)7+~D&m^3*?)P35{@v-)kvp>Rn4;07q@?^q`$W0Gpz1Jz1~!=$ zcUmfL<)drXA%kb5;{EQkB(fgFn!LNs+NE`OcTY_Bmp5fTsZ$LHN2t~rIy3O7dXvpE z+R3TCI>`Xl2rW<6GNgKS$VJP*fXwG5+j~X5Go)oQ_mjw5dfO&os5!mP)1{QA^aK^4MZ%n)PZHv)GKErJQw?4NSWGA|3x{->OWKpGM| zWlZ*<=a)@OWKLBvfeaOqQ(kTCKfe4#nSrY@MV(^T@QY88?BiTGMgH5&{hy)l*&N|K z_S!*0Qu_QtXk@~JIg=o7&fYk9vIR&61rb0@29}Q!yZ;{K$?6GR{$_D_$zGHNSc(+6 zxF=vrbQJBx`6R&yM9wc4jeT1JcZ``0=wz9JkuY_r_z4(g(cqMJJ_;pvS=f@hv<#i& zexuR>;G+vNaFiUPYj{^DkBR%XT*<;^kUFJH8XeOV8xg3)ae_Rdk#fOG(Mkj~e}wL2 zhK98ACQ)2?Oppf{Ud48QeOoEK2gJip0>c757!4Ki8H&)%Wx@48hS{Sd>8XeKHDhm4 z;waU`hc95BN$a_Aey{sziNnASuXbwYmdr!o7Mzwfr}<@3y(Zz-2(;ytCigYOGgIMdVOMleQ2~i MWn)%j;`#gk0of~ui~s-t literal 0 HcmV?d00001 diff --git a/src/android/app/src/main/res/drawable-xhdpi/dpad_pressed_one_direction.png b/src/android/app/src/main/res/drawable-xhdpi/dpad_pressed_one_direction.png new file mode 100644 index 0000000000000000000000000000000000000000..d6ccb2c4f88b9eb86264414f58a5341c8eb0342d GIT binary patch literal 4781 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 literal 0 HcmV?d00001 diff --git a/src/android/app/src/main/res/drawable-xhdpi/dpad_pressed_two_directions.png b/src/android/app/src/main/res/drawable-xhdpi/dpad_pressed_two_directions.png new file mode 100644 index 0000000000000000000000000000000000000000..2bba7749e2f68586819f9621c7415c73851be33a GIT binary patch literal 7857 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 RA6A;Lnclek$=KoX{{RfeREq!r literal 0 HcmV?d00001 diff --git a/src/android/app/src/main/res/drawable-xhdpi/ic_cia_install.png b/src/android/app/src/main/res/drawable-xhdpi/ic_cia_install.png new file mode 100644 index 0000000000000000000000000000000000000000..83986940130f8813dc1a43d78d04da476367de8e GIT binary patch literal 656 zcmV;B0&o3^P)A!638V;Wz$T5AK~WGzkYGSWNS7*qfSA}?S%?T)ND3iEibO*~K;b|xpcWDc zSeQbzi69o~Ed2mK^NCUKk}xt8j?H^>d&xVuyRZ*TGrRM?zu(T>?mKe?Q7* z;u^RF6oDz=R6xz$z&P+2=+_F`7b(ihw$DdNDCXwtj5!A^N5%|j7?>BtY}#3=MWY7J z0;|H9_w~fZSwd|>UkmU8xEN!6Jx&8JfezumR)zTgr!o3uT>A%H5XQuv0rPwM<%xe) z!+_z2C&?e6cMk?m0^dDxN3_H{Zh4aZ270RQovCBsIPldIZ&X{n@&a>;DqZKw6%;&G^muQSQT?tDQ0z1x#4zgKO#@c?6?jnC46PS z%o=nEv-+7DwaHPXq-I0Xt`zH#uxndt6^^|tibvsP#aNqm169p>elCh)z`)4k>Eaj?(fW3#Js+c^NW1-R zuBp-*a~u{4_P&U5h;dK~3|yfS)#|70)yll$i`P`Ar3(sp1fQtxUic+FeZJ?t>3h=3 z)4zW|d&Vr^$Yv#D?gFM0U$x&WpMTzHdf{h6OwyNzY9~`~>l)L89}0ahi9}cmOpsct zT2Q2-aJ5`Eu5O=kK*5h**#gEx^7j-cPh{S7KrDh`_K#(!MGGRC7l{fqCMgxqwflPD z@&iNX`>bC3xKnDxcl^?8;LJ#7x;3N0Ol?6gI+Mlzo6c6w<`v~H-!gR^c*x&Wb2{*t zsm)tIZ`0(D8`~c)7y9#c$|ly5#-b9Z%HNycD&3Cdv-oyECW6U^;nJT^em|48`T>K7 N!PC{xWt~$(69D}tg?9h| literal 0 HcmV?d00001 diff --git a/src/android/app/src/main/res/drawable-xhdpi/ic_premium.png b/src/android/app/src/main/res/drawable-xhdpi/ic_premium.png new file mode 100644 index 0000000000000000000000000000000000000000..ac4b19ff4221bfb6e731b04453457fcf8e898f2c GIT binary patch literal 1334 zcmV-61hP=Qz!HIbBAAQkk$GP4PC znkcO)(ZC+Y4COSvpHyo0P}2!T3mYd^{3mwXz0W=O&Yj60F6W$m*4}%qv)5khU;CEz z8!(U*j0DaHjsdEH(ZFutC*TXD<^n%PWUdBo29C<0)9b(kz^V+gK?9}(j{zgH4B+5*;1=L%r)>i8 zC~!i7V;SZFv+@a5ROE8*^Nqm53|~D2`x55?gMgL5$-rv4N-?Mfjs})wHNYl+w#dm` z)B$6Fdy4!JE^0K^t1*GZh4uqB=ap%>;t7AhNUHTqt! z%oqZE34G#r$jSH1iyylr_*uX0(#i6}p+KcG_zd9rkO3$CPfD)=ycwdD~Vd( zI188xoB|x==Nj9@ZNPDTsQAmkg9@=(F<2|`4$$EnuwIt+HZ}q`053-786riywHkkA z(I?kO{{NxeV6E3aS={JU#ruQR{vGhOXob1iSFwR@1=^MJdkbrn-2QOJuM^ig-J7#r zD=^7v+X*ZN?giF|3}^-}=q2UNZN>qcoHq0STO;!QveqyctUhyAGHmXE7hg+ul5bFYPh#tmUahzGSgU#1xBa{A;l^q(n8T`T#Gy1!iaX()>kIVk(s}l@!xlyVTC+ZL_h8<~4bWWZP6vIfT{hJ7{iD9SCqdr$y-Qa}N5Z30S z($^_R6oT=N><@kc;^2GW5s%7P1o{OS4m_o{Whoz_HA^jUMeIl;f-0ToBzPqvXU5$G zT;{ZOE573-zwIdoG-oYlruj5B4=!4hCOky<*Y&sKu3I*U60QrSE*x? zHF{p93H<}(6U8jwmaA=%%dFJ<`M_0y@#iNioA3XD7%W2Fo=2urRAGmn$H<@q0VaY~OGlDvX!0_9mH5rLNT1|%Ft%x%w37e6FVuxxtX8>rc8bhc z@tYNT?o_2VT>tv`*s49|kGWa@JrfrMz^koG zY5?NyucdIGkO2uSLLDoAA13$MB<1%w%=J+!0}yX%5sz^(JHuWn8l^MG)rRGFg$LK`p56T-#O=ZE`Cp)R_i(6=lh)B|2%I;RF#k-BI|($ zU^wu@{JS6U7HCq{BSGzjbU;L=0c|mAGgS3fD4Q9=%2ErR`j7@gJ5UoyC#(Y^k}o19 z7OG<{bSg!pFvi|E5h=6sKvnx(z(U{&&<&gcYWmRq2&ly>$+3Sta2EIlbOEbl`Nfc5 znS;Q_fAp$=CQI@P90n#t*!mQq+vw#$ALRe86Xxrj0)9J?&tB(&`M~ZNy#^--3^7gF zS{cRlzdRr!#lRb&kaWpUpiEUi#6_V&DI^b&2Mo4~LO@Fje?nJX?m)Q-WodGt+BFKT zN)h?(zIk9@0;BJNduDYez&W2JkySey>jn-2wLt$YoFZT@upjvBh&eNf1Fa5*T7a<@ zrAY;F&H?v|ZzisCFtR6(cm)0~2mDFa4gmSUFyN>qc(W_{EL$fnZ5%f_Kq51-h)guK z&s1PCPz(&PNG@H#2vzOz?BMc%cg9|vd;vOu2f%&cqN-j4s55EWCqnG>J^ie&uq8o+ z+63@80l>Hb4vb7t&3??75a%N=RrOiY0!LNfm_ziD?-`)SbMvEsg_ex8n|Eyx-|j$4VE@qO=UdTrI?%Ta5Bq0$k#dG z*ZP*zPaKRiIFMiOfZLv=A6Vd++Ajl(f&2)pJab_$Ibts9i(_8QEuZ5U73P`sT14&u zFS6qN6mz#+We(8nJlq9Vq^PN1<2qU_HR(Mq4*Uj2MRCoQg?E`ml@<}xA;$lNOedDM zp;pe`IO+>1@Rf8*kL_%9c?wUz(RHlS5CeG1lmc%Pka}k@j`@}=afz%k2jI3Woq@nw z;D!V7o4`6?NEXiKI9tvR7~r*LWT=MZtQ>kpz&A?=%5z{$H$~(xa}OKi_*uQwi%11f zs;akR^qyOEY8|Rt9{0=&bgOEI&8vsaTp59aUg(DwcSTpQ9dBBo+l00000NkvXXu0mjf1w6>+ literal 0 HcmV?d00001 diff --git a/src/android/app/src/main/res/drawable-xhdpi/ic_stat_notification_logo.png b/src/android/app/src/main/res/drawable-xhdpi/ic_stat_notification_logo.png new file mode 100644 index 0000000000000000000000000000000000000000..5e2787ba36b293bb89958c547475af1afc93405d GIT binary patch literal 4026 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 aPed{S4=#Srw6p(Xxly{tIu*AtQU3>{W>bj( literal 0 HcmV?d00001 diff --git a/src/android/app/src/main/res/drawable-xhdpi/stick_c.png b/src/android/app/src/main/res/drawable-xhdpi/stick_c.png new file mode 100644 index 0000000000000000000000000000000000000000..7819f220a819dad38e42e9242f12d66300bd20eb GIT binary patch literal 23215 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 literal 0 HcmV?d00001 diff --git a/src/android/app/src/main/res/drawable-xhdpi/stick_c_pressed.png b/src/android/app/src/main/res/drawable-xhdpi/stick_c_pressed.png new file mode 100644 index 0000000000000000000000000000000000000000..a111c2ac782333d521d6d3347468b128399a8ca5 GIT binary patch literal 20594 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 GiGKr1P^t(3 literal 0 HcmV?d00001 diff --git a/src/android/app/src/main/res/drawable-xhdpi/stick_c_range.png b/src/android/app/src/main/res/drawable-xhdpi/stick_c_range.png new file mode 100644 index 0000000000000000000000000000000000000000..774c54292e048a4e05dffc5d3aac5506949e6822 GIT binary patch literal 18277 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%0DY__yMS74<0w4i>n zw*aJ7T41{J%@ze6me3jCM&A6j`EV=g_?L0m8{p#9q~Hu&xg35GQuhXeTGmak1K2JD zHL2k0Yc;gMQ!mfb;~(tpG23MfOaqAtiGnzj&BV~Ry8^OWm4bFT#(O9sJ5;=FDM~ynTXPT z{}l)z-CUTExw+ik56g2bERK2-_ulo5z;|9J5oRCd-XE-R%f3#CWqC`~7Kg|NOQ(tn z$U(R{3cf?q-NM4cGx4Un3Ct{LF&C@iLLs3+eW^D8edE(Rr;CX+E;nP%Sid!~RRSG% zbWbkYc)B%CbwtkKkWyuEz^7ytE6B>8+5ZJJm~lhJsej$%-jtiNS2SvDO;}@$K*|C( zt&JRD#3&S}&F*#MI$PBM?b6^&sce^h6mCJqkP386*A&E~n`~KRy21KbdnPw@mTti3 zNAm-398O8}FD$Z1C*3ux*CmoyTlQq2V$wNdLM2k1_9dXP5EQWGa{H70Q;Dc(W8_9}XL!+$A;0<%#=) zL^_oNWs&x~pfW4ET%3~o& z6PbSdoR6>ny^X^2Ma9CaPBiP#Lx6L~0;PFzd1tz%Z+VOJR!WK^xH>mb&Lq?Hmj3;F zd-5jtVDe4lRM17EU?cJw}s}4-vE-a312y zGBPH+`)xaFi#N@kfte3&{fM$(Gu_o1Sf~A!S5M~DkLMPEiLa^4*L-~S3=f?z@L@bV@GJP6EK?>IT`X>M+DkA3vW32a6|385zZ zP1cxGt2%J}1CK^VZu?QadnfR#cU=R03LYVKY+`fmqN?7S@qS zJ7vOWz+L@n+nGLa0S0APuu;bePrt#RA{6%z27kHb-me{oL*zx#4EP_|4uVq<4#afvXZKTW?zIL1D@w=TO!fW348YYYg1yFRY0*IFoJQiqp&7Z3S5K#c zx23jJ$AqE7%e%t)3c$;GF+mpMS5;Mw+1S`1D7FLdLv`z+pZo2=z(Jr74Iky{5NV5Z zJ_|WJJI?~Sb#KKTxWno@wrqq>x$sKsG_Iz()X0v;TTnYgSWb8H8*UYdi=lOAj}x1Q zE`;SkV1fqq`Sa&pkXlBvecShvR(6IobveIIco`FHT!TX2Y zMuz>-(on{o0IL8HbuY_wVMX7+tdujT*!uQvs%xL>1tFSDik|=Y-Thk}h;WZ~hd`Ewl zhwFX;1x_Ps!C^}<+ugrgT@S=Q;D(G=toigzI1Vt33``7N*48%q_J=>&bKfmjwIsUTe@FQI*`P4? z%Xs$;m0Ew`AXn&@9>0H(x3{qdY(_m#Vd;H>?Eh-kz+JO^D)sLJToIi8R!@5sxa(*! z4qJ|++rW^W2R6p^X3kFQMqJB!7$B**v`~81@1Mj^NP$L+5RK^5*kn53}7xoVr@QUfD{=&Y}DzU~LNNU|qGPg-$8R$qAWhO~qQkWb+ZzV>bj z5wbd`1})&%$UXX3vK;=eknhf=EAn%g^*`bdRe1Gr6p}20y7URpfJX%^X@K&xlTP0h zT3KId$i>A)r|2OzvpDwPn17f5h3m6bbuP)P5M-x#+)Z23DpfwxakB z9p;Ep)DwVGVvD<0mLO}oegTEn0(NXL1aWG|7Ga6|d$88JNyf|sOw>B?I~an{qWir3 zD=^Lx?)#F^F(bi*#jbF+LKs%F$AMoaG@f1dc%P`FCjk;~eV{+9epkW5Z6@{B?Nf)$ zKG=sIppm!?hN(1>>Fob&l<$p;d%Cp6c?HvYkNoAzx{4eqU|<|70+;|jzm*LvB}tJ{ zTkAxw9~KD7n-D|_fEr;RBba!6EUO8&!1xtO%o_v@DJRc48ukA%$?X3ryn9+qfbk;@ zn7~Z*Vo+#-({t6mS}ZN)hZ=wda&Th3Y3^hC1)E}kBo%=Gl&!=b8QHPZ3~QxQ`=o!j zo9<$K+Ia}VUc@s+w%9TFaAd{bkxS^As|VH!9@QX)!+M!l;_xWbLjz%EYZ;DVCNRrzIMT^fed;g>c5`z-0<#&MjInnE zc=ONgVDoQbmQRiIy>4&9G?8r~ed)bB?K^E4Ti_s=Fj3m$XRD=e=pk zVqacb;SYmwF(hAz3uaKD`w+&};wb#=h8eIRgdOf~>^di@UaAS)S<5M1T*NAIe=mG? z!#vq_&|sJ!fL>IjY3ZvkUq0_1M&QG`&fZQ~pM1CZ>(ri_Dog_g5ga&l-Z0E0?pz@( z+&-k+MXsODfk4?U&?N1&j6xJu0Amh~4bo`?cY%X`34o7$)t11Wl^-pQJG)#MVb#Z) zV6b8YBZD>fZ0#h}E%Ykd$&Hs}1>k?#v9fYlu4C7r7CiIN+ zLAlsAkD=h~E-z*XpTvH^-*o%y@KZwfr4?WeI31q>9b53??~E%sz`=X4HENFmI!XHt z;ezXe&$2+}`bGQ2FjSCfP@x~Fa&sAHyQ~|1@67+tTup80fhES?KEHTbPbz!MD!rcL z5fe5;ospkDti7v%d%Ttd%<@1uq3&3iH`R<*UcN5P`*&mItzc^FRDi=9@R|psn-q^TSB7s=Qc%s+EqQc&zQHQynKIVZM>51*dZ0JXH6)IY|!U zgFWeT0`kIZ_ivsjMBtu~?)YbV04!1yqN1Xj#h#x4bH+wb^&}{CKXOswt=N)W_kYEn zpl!^P>wXI6pOyi8=mQ1{{J;#=kZM~SrI*z=pn9G*Edf#v&uR#_4-t5FSO{N;%T$@u zMLOto4u=~0j*ll4;3zINTs=6oEI#?}qFpO0CK^f2#Or;zCOo_k7&($z0KnB6J)2ba z4U9AaJI6C++3${od1WJ(ud9a18-FH)YqH zW0xk;2FRs`V?}{#E9M;xhevZ}1i%5-jk8rf(m`8cAko0o#;1&n1E1Ap7BMal%mxFrx}=&isE z45Ge4;b{{#VdM$tg`P=8yy)jPjx+=<1_{m>8h4uI?04RcqEBpjHx{~ zTsJo0Qa0UH$oqQ)9nqTHolna)$W>Fz@EipPYR4l@fja<>mzt%Hn$3}CWwNOM zxp?{9C)YQ}A^9YEdM!~%*vbuP{ifswmp}-jY&-qC0IXffu9@KKMRc7o&Hd4zA3T^Z z`;du#^72^K#&U`0+3CzDnDhn4UqH(|azsJb1fyf#&sqy+4qGSp`hhsVD``}m8JfD| z;e(Oxajwk*g6T!IQY!#B{Zy}6f0~!^39SAg}XE^71SnfBSj8Gu^Pz z6EPoBcvrmq7z`s{Lt^*OSR`ECz`YjM#cb%T>>m2$Ae{3O&cvaLgW8J0QUT7vbD)OC z;ab^@h08!no*evPr7O&wmVP?Y1opPL3trZA=)pUnzR;hJ+9n?zTk1D z!5)2#zNLwDPRO^zypjKpf9qDte2#A)htRcTOBs}m?vyaO`85CX_9M+7}6GUS9MF%_q8f z|D7o{7UJ|WfReao(5xSC<_ z$V#+P*@2p92$#sBPq}fbxIxai7k;9hA@Ns7)vLtT*n+0g<^?At!utmIu6djjLXcJxW>ZnNbnSz$ zsa5Wom7Rc!`8(pym(7S^ALZT0Ckjn{(n@ri(3b&@UD2o4iN=!SRCYQQk?|3fvuDv~ z11y>0d|j$^BrEcpox}?xhLyt6(C1tr9FHQN+y21>Bgi-L`0Z{(Ic3sQhnd-M~zPZ4d`}@n_D}4}LD5t><{t&pA zRbGl4TIn9Jp>c0Ul8X0e)cNw2Y(+Hz!P{Uz+?NP zSYd~3tVDzWEFQ<}k6(c|77c(;D(b0!9tSrJ9X!#fgEzIDZwv2oWv;Ok@b{V@JZmq5 z8+Q)CVepdONdUu(ewPz;2uH^JpQ$_;&WMS zaX8cK+Yhz=Q0fm0+=ZX2KTd!r^M=5MPOwA>0azYP)F02+KaYWnLJN4)Q5*QE^C)3Fu)Dn pE@Rff^AiPdqc5H1I)W9#{||j1cBjSqkwO3f002ovPDHLkV1ix)lkorm literal 0 HcmV?d00001 diff --git a/src/android/app/src/main/res/drawable-xhdpi/stick_main.png b/src/android/app/src/main/res/drawable-xhdpi/stick_main.png new file mode 100644 index 0000000000000000000000000000000000000000..3f80cdf6c2c4b3fda6f66019409ad786f32be7d6 GIT binary patch literal 19086 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 P?HVbXyAP$_H8ksAt`02y literal 0 HcmV?d00001 diff --git a/src/android/app/src/main/res/drawable-xhdpi/stick_main_pressed.png b/src/android/app/src/main/res/drawable-xhdpi/stick_main_pressed.png new file mode 100644 index 0000000000000000000000000000000000000000..2a7675ef78460a239bc7f5a38d29b2f806a05ff4 GIT binary patch literal 11657 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"s)fFZ9)5@f0(O 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 aIc~e3MS>*TtQ2;FT17!qzC_ma+5ZCrv@PKP literal 0 HcmV?d00001 diff --git a/src/android/app/src/main/res/drawable-xhdpi/stick_main_range.png b/src/android/app/src/main/res/drawable-xhdpi/stick_main_range.png new file mode 100644 index 0000000000000000000000000000000000000000..ca1672caf039db8d9019fb19b37b18b41816c053 GIT binary patch literal 53646 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�yft!EpT|x1-@bK_ZPqWjx8U{pG9;(z5z;g;> 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 P00000NkvXXu0mjfSHG7t literal 0 HcmV?d00001 diff --git a/src/android/app/src/main/res/drawable-xxhdpi/button_b_pressed.png b/src/android/app/src/main/res/drawable-xxhdpi/button_b_pressed.png new file mode 100644 index 0000000000000000000000000000000000000000..86f5d535e2f00126e93d62ac953d1d1db9d64952 GIT binary patch literal 20591 zcmX_o1z40_wDp-8U}zALE(=Kk=^n5L2?^F)Z^eE0sBM;`=+c~9)K_S$Rh<5L~2>vYr{)Bpgwn>ViL0)W7g{!&uF?|f(~t%qM| zIO!XC8)@EBuyuF6Xnoh+#_pn@s|Wl!07|NU9@e(bcHVq8b`DN%%4e3V>(B5x-Bmtg zD6J{3>2cZ4(dkBjr=4DamcDI(v#tEyGpZ`oN`4CP4P5QKt@-?1UEI7B{FKl9_r417 z-=uGgo#FfMCEm`;XVgd!^WdQiV%`0m9erXFM{?E;R`>P%- zS86OPk0>kWez5KgCu2fBql8Tiyr` zdtUa9h2-GQ>}@hU%a-BYyntvEOJLiy8bPtZ0#1NGU4_58noKYeH4+nVlR^w$^Gv>B z?~q^LUVj@#ahzQ58|s5)*sr)wjd{26TIetZ`JC)I1$k5@#hFH-XDECv|4d6LniwEwxL5~#_#(K z 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 h-u29LFS0U);6Gj`7Z4P%Is5|C3#kiWvWJ_|n zElfA%-h`AbrJ1jYELpN;o8RO9?(6$Ue9!ASuh(-v=X2hl^I6Y%oopvZ8*x#2Q2+qM zL0d8v01%9wE-VOBSRGAm@W3wA**(_X!QM207NK({kmetxlNb>N&jY{_QexDZfbgJL zW&fby&`5KYxhHKZ%AtYgDsG1zbRD9O1%-s#UWg7lb-~d&;6iwSNuUbJLi9+YDGU%1 z6njQFG2&cgjA^2|%0IZK@c#~(prZT_OKiBgiq(!lWp@WB-hWg4x z6CFJxT@!snEoFUOJt9GuNYFFT*3~oBH8M3YQU157Scobgi4Ht#N+nzWD-0f)tAxbH zMwt=_2?+^02?jc}=wO1LiHQk8SD&D-uMKl($DEIhJ(H*%8Kb%b@&6d)pqPN@(5To@ zTBPz0<{5ulT&%f@3SmbG;a@4RdW8S#2M_*hp`b|EEYYz3gNa2DoF8i{kJPgX9J#bLOkrlGe6KrAFZago}D4q)_=7%zn0?bUc7BlHK^n1f=Z1#;6)_IBb{HC-t=b90!iH)R;|GVK5+*ma$pov?1x{UE36CSzK4w zdeTtzoGRwIFN*8iv+D-%2nx$dy%ExXVxq(NangmT)Cw?-<`|2(a@S#DircIW!3Y9Awv3n97l(Diu{&q z^+*geih2mV8Efv>cf8CLVi${J=z|@MdMWxKy>S@3nNGMmojtJid^7&ynxz&}HhbXt z_?PihxIKRZx^~(kw}iIOHwjfI%%USvD_DH_FO@RJC&VN)u~x0ls|t1|)P}+=YpxBa zIZGsfR<~qnmX_2L&vWF(S3Ygb2pR8@LbRDWd^%G?rF$vAZZqJ_VcZ0j0+5s9UTG(g ztCHhoUF5fI*SMxfZQfCevP%~9=WUAV?=eoR8dA%f>98F&7dmep7(lTt1jW`NS63B^ zRc6*5RSP2<4*G3MozQnx>-m|=0d@@3!m9Rt=ML44Q&W#v*BpH8ymd*W!VE{|@Ixz` zNY;HzJ(9KC8mKl_lf1I&MVg=@vek_*9@lMra(iZ9^%nRDi1MAO8vD(I*B zP#ZI3fr)#?^=bX~2QH3MI)oiF#ahPX0!;ObeAlo$iVyl!*-5N+$+umccr54Dh|s1= zllF(tJ#z`Kxwnof)|x>9eZNZweo7ySQi+2FAw5{t_4%$fmLl6?)$rc76T&Rd53C?+lmkQ@dOd zg7&~*JV9!+8LK(v{ijTuyt78(Uk|mOBrc3DzJ2R798#T{nrg96L7|4lju2}i3$g?s zR_{Y8suzW{0#9?s6>FcvY(f71{$D=?GgEjOvOXTwJU7O^G}ZPuCYf>f&v+E&3vJxFZIkD-IvidQ25kEM8j66wT5(+8e z0*l1YiK_dRln4Q&>z;q1oeTtySUuV%sf2As{#7aN<>TYXhz$)rRO_s9<@d4oO|kNJ z(`S&v2?(z8U7NOy+Eg%wg9dz&trYvO>wwo5v`!|eGaSg(d`Z2hF-6xX#` zs5X%q{H27mOLP1TmPLP_6^$gd*^!p8xSnlhJE$e5_u-45PA{7)}qy zAgM=kdPU+tWAb21jW33Co8!g^X!nm4q=PB-N*E5dJ^qRfmP9JZ=B}JM@+bgyWJyLsi z1GvlJs>Lsura$+E25Mxn9NpeUF8SPNi=hwi^I4z!azuC_Pp0xaZN8WlH`Rom7j9_n zk-9MV3D2%xqDqUV|V12}LQvFLaRok!n3~b@q;A0a+F2F^9Wq6$1vZJ1gi$Nxe4GG-(b7!r0 zvl=6vGr-lj;JrQq4x zre%O4GPT_Os}}ISPzSXFcX0X=rbZgGDtu;u#%j`=VOz z;o|JoF`RS`s^w`TF3$N0mJ`pLCU-ns!;cmz^7yoC>n26*P;5&_Bsoc2(MscKz+H`PAzSa>4XutbC zINM<)0=7|cNSx)ifS*u4Ftb+3(s}n99fg|LjZ&jCYcl5WpyzE@HAX%11xKI;W*!W6 zK^j}eZY#dv5kPPD9uZ|kD_LvdbYyRmEo4-+=lRb@PAv!AL8|MYK|3K84|s0JuT!Y9 z;qh=94B3foJX(QQ)|86)U6WfSrQ4aqpy6kc#^_JvzU`6GlhEVSjTjCvFRAyHJKTm_ zW}L+{dXPz3{T4f$l?ZV~uI+_GXxbOLKsLZ|to)Rs6wOlc>|jGxMDkVlsq>1kH=POOn0DgJSpw8|-3S79Be3oFnMHIQyQ7AP z5JM(l?Od?bPZ~0jA-C@FN)rI5z-bU50?m@07IJVb*wm^c z6jY3om>v^9@SwL}Edoxw_48>%Td=s>12=%(NHa#xbYdNjol|o-i(ATlJarGZ+|q<& z)N&AhGG=rqFi6@|i?=-}{GJDBH};%n8POxE<1ZSh!PKTKXHVLHt9lD+Nf(`p_o(F?s!FA6BXHVWi3N{bdAndeLWr>8XX-S z85TB0z1MT+WO{mfVFEWL;TM?j=lr~GA?4*=dhwGZ2r=w_&aRTCJ6A#ISIQk|$y2iH zp;lL(BlEI+)cIX>`4Ud85}rM;BeBSA?~~yN!Z(yWqUIrmUxwt;02T*o&D{dVHbnKcD_I6EBlVau@tDnfz)4CXtXLd z#(`1Miri_wtwX*Le3R_R%R^kJJzE}-6o?FT2}UwaQ_EG!Yu)>axj@@G7;@*`cK{sbN)W~R9g?ISg66EI^AH+;IO%|?| z4*59HRim(|r_78fn!EgBQ5b}-1$h+R4Lv(Qm)ehhQ2du@XNv%<&lz^E|&;Zo4-&_44<|OTIXU2Vd%0J11E%G_jU~n=YyRvrk2@u`2({TIWmr z?Uv#mIy%Tl@Q=>yd7A5WoI~r6!xia{-o93HI3C+TW2mO%*c;lCL7R=7ADZSB`QuCi z2CNYKlvVa8)Hhp{^{@v$-_hPma0`ju;@{@XVauLBS(II+SVE6aWVjFgP~(~SU!1!< z@DTClByTmVGu!;c?05@VRd)fhT$z*h7 zUA=Uj^Uth~9XUN&NQ%yvPW+=+oo0xze50Er-EvbdJ{D?`-ur2CmmTCOxmW7%)T>*RECj`Vt*=7KXWX}DTn*95bpxeIORP4oHY>GRLessUMxJt>?m zPU|MOk$m(ZR=xbeN_Q|gWwTdrRR4hWYA(iZxd+KdZ0?T=dq(&?gPy-WDDWNlj@~V~ zAKOXJ4!LS8sOh~wu~3=K42rX%pttlYUotWH6(t0J_tUmsVz>*ks=2U5-uN2VQIg~w z_v7brmA%eU(WR_y*OA6%a{CJb|HGG>)A(w?M?W2^A%@$){Moj`X4ygb-zAF;j&Qz%O8S}x8UfmRI!cDd zn%V|h#yWb(lytPT4Y68=SZ!SmEo~Dm0~1|irT->nbABb$OMw?m@HTe;4aP-g${{f^ zQ6^X{iA2&Q>1sw^3dU+18yjP_bg())8e9vF%kdF0=gAromsNhd_>T{ppvwW5h*2@b z$Oxt1KF<>(V`I#em9f8rVE-G1OAq@$eq8WBg@PiuvRvZwFOlB2L-*=N`3CM;8zNb9xm^W|Rn7=+~_sqSo zq$HSGb1(Spvx?P#gw-AP8fgzm!Tg^-Zl-^Abve=(teOk>wVw4%2>b8b&-++oC}bt{ zsAW_98Av=!k8T(qKTkWEEbYggtT;S5XME?S@1H!nY9>Wny^ z0{SEOhx&RhMQY4~E7}P?gX-J&!KPolQ_Gnx%N?rW`1FRM7}O(_bc!MLBW1y`=FXBl z)U2w$*bi%#J#rDVHQOeuonCzF5n55>{<8kb*rgzJ4FZE-rbP&~ z%%Im?)zu}6iF&BpoNCe`Do;DID{>MP1gu)23s51n12@15Wz?jcsf4a-lhae7Ph&rM z%vOv!q*FVh%j)9z$>JN-I4TV6ckZ`&{|#6S=+3MsP(?MiY|B1&Y@wb=B@nd&CxUbt zv|Ct-36%SHy^r5&uZMh93~P!L+gbI@ND|9e^|k+!7|-if@hZ>hhPmx+0XBN6dRNwc z+YVKl|IWs+N1Mf`?Vlju``S;{Yh$JRt=CEdP9u-Tt`v8*mW69XUoDc{x6r6kqc@Oj zN;zC*^NQKaZsQrh(Q8sAsOe*)dW2(_MqPJ>gCS!U)o_b|QewVInXs|g)h@%*9iLB2 zr&auYB=m`ZZrl(1&NGMjlaZ#*PY-O+SKB{YvDjY_a_D(wbo9EIRZ{j;pQkbso|hxO ztP)-QhFnawDPI&vTbk#jRTr-VjbioWcZ}pIWL|ZCLoD`)E3YtugG~In%zQ2oQrnhs zcx&O%h50~@oqC(*;DjF@zf`N#3gu(4i*j|DA4deCSM}HTGujICU+LP$%y}!_O1{3~ zBL8zp2=^}6mN3Xvf!96GF#`a>tR1)*-cI9@KN2NOuKFH2JCyg_Q*zupMFrl=Dy*X4 z-)$~FywxaC#R=ngmlsjbety-{aOnWcoJA}^y+&Im-{y8SiL$@6Qq;$^MogFd%-RK0 zDe=zc4`W~y#YTAqUI|xQOk$xJ)1yIz?HghG5!X0slxCHK57L=JY?V`upMSlHAne;k zG5Ejolr=;eX3~5M)Yf=f#5Ph8AAMY57m2IvA#u(|4S`!V_C9W_O7uA2e!xe^O7KNu z+Glr;>7vTuTF*Mu2X8Tuu5Z(b^lKE29ppRx%fj*35*3wXF9-*oJLZ75&=B+KZ4rWc znk2~i`Jd|fT2I8RzVvtKD?Kc>N;HgWL)2b1L{OF1rkd=3Ee+K@IoZboJwo#pYAwUR zI+t~F4why7h$W=Q^0?37WD@()@L&;O&hPE=w7LZz-Zjmm7OR8T9|$|{2MRBv7Kwz^ z9%EKe87r7`M=BYNKgDY&1g+&jnff(Hwd)_IWW0=#tiT`f^!2T-dHQsKf+21vJ6M+~*jwv-Kup9f&R1gcER#y*BuWk{l&W3K! z-o#b(h3LtYa~rCF6dLg&`q2bF<8!W=z2L7yHcu=@nys44FyN!1nXaCm9GE&CSi9xeezMBOAPm6Q?U5?yd{?ZM^Pxb#;}<#dYpG_13d%uu*y=h}Fh0AHK{0 zBAcj&6>R(d96hIgyYjkA8;jq*t}~N4RqzcjZdV?vJ@VFEC@Cx~eDdky6RD)w48)?d zB4EDP8&!mv>^d6_xu0__DK7TG_5Z56tLEbC;pth~C;^i0E0Q{ z2h2rk4LTm$uw^~j4MAL?5V%}i#XyK&pTXN}4&4iPo8JI@yeS`mw`s4b8dDV7>u3M$ zR4}Ki+zCib51DHzb-;fUN&rj&HnR77e{<-=PCsrzC~zA|_B>DUJ}BIuvk8$q+n*?NE9R0YOF z*fP;llf+}Y6uo_jD8;&aBk}%H8FUPyQv{+OT>E7#)D^IlM{ATc1{9D<*+!3-klabo zY;zjLy4yW-rf32S&KwUbbKD;9_q~p6 zz9%vN@b2DCHWxF$SCPkr*``taAzAe8JX%WjLu4~AxhQ|yIJMtQm3VGh9FSxUrFV=n z;WO=&=i%{tAs0lWxNZ_xlmSFMAGD5CRJoPh*NOp0^rjHC8TrfcB_4Cfr`FZMChaMn z)zkjsWC=s^UD_R)zkf4bCerDc*jJ@!cokNG&oL5{w|7)4JJ8xdH6khX@K(Lxq!|uB zFXRRa*-ri*KzO_l zl!4&3qYM!gZ;D~z_UPu5W#C9E5o~Gx;z{|qVGtBm6@ZJ3?G;GC^Vj<%=_IS;3 zePEu)F2z<50N+(q?SX|^&Sk3$(V3JS*K>QhjQU|?Id(2>bQlMWTF-6}xw2det4Bns zL{Baln=ZIhE``@47JdDZq@5hv=!hfWmNJrd&w@fL;^yVh!hm#343?1B+Q{1XfxeI`smb(Dd0V@zz3_*N~w+1lg z6vH_dz@cL#-{m6xbMiU#+W`Q@&B&b}y3Tlom9AcnrO@P>@#pD6`(L$j!(~IEeeV@4X}UfH=*_miv4d5Jtov z+r|4~KzuuSX`DamLR{PnyQCy3SxX%=v#U-GUK&F)t9JBAd)aeX;803o+AC%byLFNF z+UW9R7h9e*8ol$wg0t!3#@z-K#sC_z;Lh#aZtiE#PP>>cG3ZpYgg7FBP&T}<-S=it z0NP064Rk&di6>Gv;C?=Mn=XH2M32Er%xW+ zMTNBiFK>iI4@9A}2Be7v+(Qn&((O_|p9AF|7!cR}gxOeb;B77xBVC)9&spGsSFuwlFh(nB@H~V?bV8KMlvY z8OfXWs`B-k3yz|B1{o*5WA*-OyEKRw$xZ9km44Jn&`M(;pd(0`X${X(c6%AwQAVJjB@YgoLRpiV=>K0iU3< zhd+2q<2J>zxaTjKS%zp9O&Ltl9`}J)7JGCd7nBQ1_oY=4MzY(eZhpqrgCn|8gOY|q zqmEfpZk1WxUfNabc2yb@fIL~Uux61M2DHtR{EL6 z&cpNrmhc-yEq`L}evJ}kDIt5x@@Vv)tSh!eE@((CG*dAXeeWj)Yw5^VL$PS zmdF;*&#W{})weH;O3iLk}$LZ{9XaM_`IFvLZ@G)cN4G8xSt zvGemN$#@hArk3yFbv(xA*1*dQSdWa>Isgt|Y_`Ptzu%+_K6GP0a(niLv!#C#Oj_B}P$ zBjG?X7#N;ry3EdRzGd9g3?GRAEcb2yNZ~|`bveP9=xWOuDe-poELxSrIfawyXOnS) zYrA{vdPg2$bai#*TUs8BKvd-m{BufD2fZ=K`&N6b;y{YQpU=)3KCy8s#!OF>AUbkv zbowqy1<*MODe~SyC8X2gqrJ8<*$rnptIqo$wwF0urNPe0C-|wph*nT-{`5ig2FH{2 zcN_$OQD@V6Ht}+w`tTZqxL1eP}e!t|I=F^?*3Li&Oy|y WwITgEe5Ze3P=dD3Hq|Hmul);${FNpE literal 0 HcmV?d00001 diff --git a/src/android/app/src/main/res/drawable-xxhdpi/button_r.png b/src/android/app/src/main/res/drawable-xxhdpi/button_r.png new file mode 100644 index 0000000000000000000000000000000000000000..abbcadede116fbd0d2ac6de817ebb88ef11a7197 GIT binary patch literal 11960 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 ToW>IloZq>juU(^Q8}okvE_YLs literal 0 HcmV?d00001 diff --git a/src/android/app/src/main/res/drawable-xxhdpi/button_r_pressed.png b/src/android/app/src/main/res/drawable-xxhdpi/button_r_pressed.png new file mode 100644 index 0000000000000000000000000000000000000000..07421767fdf0575e98ab96d9a8f966f5edcd3074 GIT binary patch literal 11969 zcmeHt_dnI)-~V+SdmU0aBr7AbH<6h=PBP03*&{0?j_iaaNwQbSO2}T> z>wEd!_xJww{s->&H(g1w*zzyYyzBZq;1*dZ;;FS$-n@vcHY*key%QVUNU}i z?Ei@?1AjmJvmiU`f4<`FEXS^R_CQt>9Sp0oyQdwixPSz|jj)&qtE9Amu!NAbh!`KM zh>)!{8@5b_Z{74;ewhhYueL zJQNjh_p}!jmX?+l6cP~>5#fj5;P>)(^S1Wmck{Y(7UI8RsMvYgcshD`JG#5Ep2f7j z=kDVz$IdQz_7K7UehQqP;Q!1Ie)yjivU7vW;tA)U!DO`t04vZ?Q8e&-y)y3aVP>2z zxV~2B?7ryscCe&1jj4e%uBKS`o;sK_~u6J;Rjb z)sK(u9%fF;b*w!E?EiQDZ!3TcRuM@pp5M3&DhW)?j&Be&6Iy|urTxz;1#Acd5VhES z@7Ee=Mot;I>u%eVDAXOi(%(K5!4hEaZ5N&HX>QLM1gnWTGx$i&JzZRp1+IVq6Z;W+ zAmoo>kur@O=E6N|j{X{aw5EG<@~3R`yd*vMM0Z#1*xuChq6rc3wXmtfcx|`oV*ae) z6A@MJtcm5^!L^a8elv+1tb39xZ|;IZ`=ZznlWW$`P#i(-+28`x z*DL}RYK4o7qKOD00xNXku%g&Xmjnm{W>iz2`0R{x18H@H+r%uViflN&qlsd@jDN@N zh?zfD*~&!EXbkj5(7Pt6Li&VAa?&6S8X*L-P}~H>p~&=i@5w+4K`pbwbu1fDTW@m@ zh}-B7l;{=ed;5&#q)3j*7}jx3hHOh?yuWVB8dM@mUye<-xT0n~#dRrB5TD5l9g1 zkz%C`BrC%Xv^nT{7h*G`hzD9zLg=n7AEgnCzx=aHNsM43E^j*Ua#QWb-A{i@h<&JJ zzHgs3p)SL40G< zkuP`j9C=gCl;SqI3$T9um(vf^Qg@hrV}=CLKwb4Te(v2Jf@YFzu16>(b7_xnkq&NK zp@^&--4X-q35Lgap5U(kB`QZXGvh6qcJr_FzLqcrwHKQ+6=N?YH_yIS*-Ds9W67MM z30veO#ao;{0A+~35sN$q6M<-)Ggm#XiL^Nu6DwbK6g^kA;pKngaqFVfM?D3iCw5?h zpsEj#;-y(8D!;_Ui+is-jQk7MrSZ>Nt?_PbwEWsZ)S-x^hPg>IymgK;upsC`CN-#f zg)vh{>Ybz`rY_=_zsy+8=vDT_cF*l!>E0^?8 ziXd*Eu9xL{-K&gDdkg^$Q8{^YD;QGbj6JA|bGRrY4LHD&w1K1m2{B;D{oLaPLBiL` z29t}!7a1Dz0!~S#{AG(?GXXd3)2YW(Jt$h8Sj*#qGQ&S4p?R1XO#v*U$alrr%b3tu z6u69WK55J13Vb!IrDA{YNGKuGHkpVfl##I>-FyyT_vA$NH7m~yve^hPFh(QwPg$kE zZH-}1Sw#jri%ICZ>_tZ1 zk88>dY1%R+Y~IJTDAVGJcqj>daw1!%0d`j*w&OxGP*4%o3tgn$%PZsuO9(Rp!<4^h zDKW8?e;!f|=bMu-=E9{XY&oh7md{EFt71$6cSHmwp3t!77Pr*o-)Rp&q`{lnbrfyq z#h@pq2&cF#vSu!DDJvo@PHc5x4kgD#?M~c7G`MmPu;z?>aZfzT&PHQ9KylceiY}b8 zy&@{I#aMyA_1*#rJ1+Jsck+HwL^7h5K;fE!c%PDuuB%&r%k=u)?59!}K5YcE(qR zqGI5)%|f)!hL?WAf|Tkh7frLF#7AEwvpDV!P$F#-r^ict%$V00_K_R*$tzHAd+=td zzR$-zc+L29Zf%F~XybHWMLBqahq(yR<83}n+2YsVDKFo>g}#i>INEj154cNRl`yCb zR*@;Oy5F0li9_xSn-5oc)-7Ko5BIDyE3GZP{!wwaY1nmaDD+d7^_VX!W9(>2Nr|rz zx{^I1YOt^GUbqrlOSNl@5apF~(SIYXqZC-J9B}!uO*nd`<}F!MzKhqwl|FUMZ|S}> z;iICWN{Wbx&}?aG*`Ju02oy-^nD?y9nfDj?N)%xwgeHw_NzQltjM9$Xdzee~sVPd1 zKwKkG&cG-16gxVQp&NR5)a6-U>YSw6%78|z=Z2RyEu~BZ|*Dt20t@nJTm?V%PSXxSAs(vw_79p{IF>&+Z@cd_M8#)7ri6HD{pO^V? zkpZuTIF0m(OSP+Z;hXElyv8NG$m4M+FNplSx?Ob2+BzcB|XZs?ZqgB!H;`Nr2lqzJov|Z;TwK?Wh9`!lwzzp7IW2> zm;iC*JUN3Bsg1XH<$9$2(ezIwO18(VTW+^uXncH}q}j#M(XqmH%$F&Wf(Flg6zeDk zVzNbIf)P{Gsu=?=EkG#75UJqXi4$+P&wT8A2{6eA$(A{evd9t77#)c9?a?yp^oNx$ zeXiik&CBC-FijR05qZ(LJMrkzYQt7nL8kv)YA7zB=+51{Gs{$%%llro!g$|RM<5Tj zhyh*}%a1Y76G4Of7uX0Prlk|q!>V1!s&z@($ituHF4aqE5wZDbcU3M!w_uCqWIa+a@OLz~+x~C*raf-p388chbTeLa z;RH^;Zp#6EaD!sXHTHV?NC*OZU)x9g#SIymJIkx9t0e}!NrI0TwAKRFKardsE)Evm zJvcm!*Wd}42znOdaNvLmnIau<%8p0Yl2O!NHY*R75|4v9Bt+@z=O;BhKK^+5`?WIJ z`GtbalONl|mcbUm!KVrL-kDg_WXaHCIwsq)Dx%857pcB5`s>GjMvV~swx=>qiT?P& zi>a-fBUxW_!GGdX%|`s?roO)}8a%hmKlAP^k9hH&CwG)T-S0jj~yUy)W5~yRf4eOB z`0L5Z$>;dsqZxV_eZKa$mr8%lfR;%`{*6=4Cmb)+IC=Evj?- zv^PHJpZ$l2Ypau0&c>E%YHD}It)E>B!&_*BP)t&SJdvUGzfTbvy_8n$Kl$dkpOjcM z*88-@U1kxbRKCQ-#JATXQ84450rQ${dw17sT2X#{kh` z^pEL{whfZQwoa07`fvXz*qO+HA3Hlc-{5YHP9Cp5EPFisVWLVVN%JN#35nWS!bDjA zwHJ{!5J=7+#H{!o$or~Ktgj+g2J^fj3_t%!??k}%y=WE8LE+^mAZg_53 zp3GWWR0eD>?&PY)$3f7&C|$bEc(H=7V|ihL;aBa0nF_(+{f@Q0WqbL<4$Rf_LX@Ff z2m^Owtn7e(?=C3MUL@_*GP4ub)8NUYQF@in1N@T1dwowScW!{!g=Y8-lVlHsB_3aN|E_1K9Q*!bM2?C6bjh*Yve7WVOq;UDspFVwRaKz2ge_Ri*LE>%SkBEeV zP8wvPY*!Fi1LY;}3U0Gd0x|wVISRdgF$i;7cUM=}ro+__nIC>Xy>?;=FSpt6NhPzM zBdPbuoJNL+Q$9{dTpDtjXz=%!Nb9UPE?{`0+)2hn>>)m9O=AVJ9OtFtoY4`~>Rv$Jk)gAAQt;M&^=+u`EAAKwuqWu2Q z$EV6|yuPXk!qtR3icz5@dOFJ)aa8j)qwC)kN%UeNE`je#g8E{SX29ax#~sQ1 z&ZTp7+M1eVJb8e%#$}}9JoXlEl35oK2I+t)3XKDM0DJAyBN_X61a`5@$6Sz!`YvcF z3!J@n-P@c#LH$dqk4_T}0c0ND?VKrmZZNAJpraVSg^il!qng!#i^KB5>&wIdN2{;t zIOhBB(WLWOR!wJ?);U6sOa1DnU4~k*i&mDWiUFm??PfiQ!$1rX<6jo zI_n;nFaU?I>O75*2(FFQ2-bMbciCiPz9~>CODmBYNaiX+Ofq4%$g5;i@Lk$?jp;$) z=C)p^4Y#=y-MwYYaqgYja7n|_W=9+3IZlmF%Swq~Kp3*M2zeV3=b5SiDe|cjaPsEU zya*>mt4-mU!Xo%}e7GAw)p-HW9Z>pDRu5JLteq)i(UU&D9K=;cDw1)+!Aq~`(7-`; zKk*|HiLBGi`>oCSw!_Dqfs)u~teUFZh6H>60@BH_2aRpQj+(m+*?_E6F2vu#$KmOs zso&C*%@?BcGZ9v31<^TmGDl+IMCfX3`$qrj`Co6jyx%d2b$Y_0e<^$C+^az}z_Y<_ zHD6ykAXYLbMuDj@Ek*zRQv1FuXy2Q%ricM|%H35I_R)C-l)O#f!FXCEM6A8Uo0qiP|2> znh(Q8mk>oz0uxF@DL12gAdA89a!U$7Kfhu}1!dXSSy@P%arurU)J$juYf*=WG=uj0 zRANK1RVTc3h-oB5$TJ#(L1N3L#l@!-Y)*`)Df*wQT`vRQwFx;wkngx?Myc}tHI|WB z6S>EM^@6Z+{|XdDRY}<(ry|0>3pze{IV0s38(UlHdiNny+gRhH-3I{DkdF@?1%$E) zu!QT5;Bu^7y8KrtyIwhgs{*DK9F>m!`K@(kU5c(PQjp&re@nQM3Q138zN2bmcaj5R zDmXw8f+M{jIUK?;1%&l^Tt_PG9AVG84XHw1Y4GjaiN~<8UtU>S>bRNP%c`Z=!(;>g z644N?Gk}Dz8F8QCAeBhjzJC4s9sE&~Kj@7Gwi0Rl!?lD40_QiOW_fpqF&KiB?;-{Bbzi>YsZbQN z808g?JX6H7 zv}?fLbmT5HMt4^R9u;Nef(f!IS1MV0Vo)f^Mi@q;%9Y3vIC(fxvl?;9 zP3p8KTbZGwf@|d@AY&d*8i4uI532!W*!wsxx@L#cesCVa6v@lDo2;5adTab|ed+G@ zHWlBU%Bu&R?m=4zkma0@Y1NEvkvD--Y3q1*a`O16O}r1(*Id-c{j$~o9rB$H?y}z% zU8vU=Rfm0YAsyilyLviBBEN@u^ytynbW3D^Rq^z$tX_3xW!RgSn;n)Xn>OGXWK1!M zO=9tTv+SciS^EHPny(TmI>MTonmUe@?J3j;DEYwIB;(T28h1;}5<^+J?nEdkH`ao7 zKQsl;rP}Y*R91?;-zf0^Cdl%b2Yb!_pcP{Kjw6oi&C8q`*Z^oq4Ve9=LiB$5&BW3- zo*XPa#uhG!jtGCBt@vQu{=!dBPj77=QqxH7{%51rC0;A?oyr6X47|6NReyNo3n76H zMdO_kR|kiy*M)>U{(YtpbO~O3TX3V%XKBdiaCc4KsN`6Fp*i@ifhS$GiWHiX_{K)G z-jO$CRB2GI#mz{GZakzB$5OK*2bqJzMn-V6_x$1v!=7J_7R zd1b7|y%F}AGD<>%`*53uK}GVlV5l)n`0jHjwhxWDeOM{D?z{XGMwTgDI;lH|oD)SB zdj72gC+C}yqT4xQ@rK4@q)izoV$UAg7p3xg(II88`2rq?B!?Egk~fTKCqQ|F4jt79j8dwIK?u4gOnm zt&qQrZ^CYJywn95Rvgq6i>s?QR{b;VO^tLo)3owlT#8m%=G02A42G;d=xFG!`?0AM zlWtgx^?Uudwf1{@3Sz?!7%k-#1uCM)RTF~WfRLUcw@m_+OyH}ks;aEEEAj%Fk0HCa zxf)cxkbjp$CgppwKVM_v-Fx$LnuM#<-4DL5yv*^E7s$guLr_MNhb!G2_OV8PeG?12 zDlEDh9On`Ycn1&8Xn8_+;GC%Zuo(a7z`%Li89j>UO}u{tK?=ezKSS^<5JK&T5A${O zHSJWDHC{{WG*}Ows3ZB!hqvLDP*PLR zK@xj-oXr&+dul5<%ky_}QIjxKajAOD?Xdmw!(SUFQcP~Ks=0`^2S4}vl{i2xhyZ3N zD@lX0ECDo_V>|smDn$8stlD*ns->sPo2v2UxijsR!I#ouk&VGqqEPY4nw%tq#7#p~ zqv13j=EeaT+)$YaC23YQoMi#L^|1Z6p4_(OhF`-KG$qdE$T37T%ZP}d$b%nyil3+G zm4*J$bN%nik<@lwb5et3mJ1{_Y+*fORDJy zw<{zcHpqeYL7Hw!cWb`l!6H3#62krudBdPp$ggxDEl ziK&@oU)4dP8oaySf?|36Cqa!mrDIm<>Uk%4k%Q+hN71@kNDSh6q$c$kQ5E5%Q6Yda zSLdE?dmNJa5?9m(;^=`%qd({y^+)MPZgt>o^$1{I8q4d{JCXduvh52O`rHA8*) zI^Pj8cEZ9bKaL)9%du8rSFKHRt9uiR#=XvNY;Y>^{PFB;xsbf z@yQl}O2KS55nt%2`bolq%+*d&eN6_)Q?$8m|NQv)@bQ%^SBUz>_y;f)-`qoIHfm{O zRnIotaes5R*RaTlGg-iVwBB#yHyTJwNxfoWV)|jcbmEXmM9;$s^AWa)M?1?4=8XY9 zW6<|GY3@0x+9$%YFG))ABjkM&sfLcQB+#-mk# z&cya-fYipRbt+H>@L!Bcoqz46`{ztxZBFcd+-<0Vv9yMZP5XV1_BMLqpa*=+(_CaN zHTPBBt#(((+foEAGissZB=5hFmlBj)P+(u4n|r0*E*nnUoui4c`NFFR3vgCI{WA(2 zaq4;c{5Cc=M)vmh%@1DlkO0US-kEsA+B6Hv1Y;l!5*IvwebV1;WwdIg=9g#3O_;r7 z14Ba>$D4vrt?JBn_&RWvk^m&zEy&5qA)&vwvezmYw9%_2Q1_<`!psHI%X0Foy^dt~ z3yLYopNOjTKMXS*>$1j|jUPg#Y&M*}Nrj~(4psH?^1{R1<4o1A784h5wRpTem<{{V z>2hIF>A`Lr^COqZ&DoCYX*gUlwEYGvD%40rtb`nv$7;%g;qc5)kD$p@5I1A{v^A$g z!#am7R;iQ7MRp7+40^(jbgUbk-Z2AG;?Vnd@7^uW%gdW-rMFyeI#?_^J$AM{9KDjB zo?Zg!E%bV;EIv_yoTjGWb=V3T?=20L%u}OKs3&V$IsLR4o70=Xc$%+9bCx7F|A!#T z6&n(<7#)jc2ZxkVE(=QDBj5~-iQbx9<2X9FR zdrh7h1oJ6;rZ1p+&EE&mrCh3q7FLJ*PI1Pk(4JA1gWGXYtO2X;94dds-I_ zKdT*nc0A?v0s>OYQRq`~C#b9RFZ}y9c|1NTcQIN;36|fC`9ZPs9CwFzfAD2o$SOl)t%~SK4*H@1CjN=HfGz7}Z z%KM#Zl7b)p^=VzF2v^Fupd8Kh68ZcKg8-QwycdGp#m$YnzI5q$M*d_bF~a&4)Ukzj zN+$nBv?Ht?B*(q`WdLLm7;8#a8BT;arNI+T%Ct?Aa0E6#J>L=HMW^XtuxzIh>byvZ z9ObGT!w;BhFjoyq8+S&NdL6`Gb>8ooddiy9-wSNBxSo9I`qQq`|NQ}zAai^q+@B5k z(=GW^tFdbSyyCaC&|HKalK#x-Yux)ClTu%L_iO5)5c?g{qdpoLY)AfqEwL4aH!Xbi zg7fTM08kjS_*`!t`fiUJAt2wpecN7aCt}hsCM+Rg1ii`nIh=DB0+XuA;G9FG9?6S( zN37t@t7i-QjfeSgOzXXAW6Q@?r*-og*I#JnvB%8}7_3>6!sh;(LZCKlT<96*t-ly`W8^3^Fp}1 z`VO@!eu4lc_pj#@EJzM;y$!BC(^V%83A|zH=So&yg1h1)kv08RySjl$ZL@ z_NT-8K}(w&LG#I~2mekJ{{wc7?WN%wA8&8Mt^L4gJGLk;4)6@&pcYF63p>8FFtO&q zxvbGwHnaPBh(gw!t2%5sVUohAamzh1+B*K3DR>tkH8P z$A@jOy-VFQH7dDq<0dSmlr23HuA>8F%`+CCR1*8L&b1gRBt6Uc_v!4Gf1jtz({&59 zu0LE|hTv7@x7k-BJs)#ZO_S$8_6&e^ti>PXknL+&$ADto@+V4QV61<}*60-M=DX6{ z#C3}NNx#9vE8e7rD(B(+vwCB|3tbrpPv!xk9$Y)~H=y7%Z&}&2GwO_Nz4y+{SwE$8 z34Q6(H6LH!2;*Xt-bJZ6iXkHQ!kY+Q?q=LyMfiw^8T0ArzBx!SRXY_^ zys;BWy(h*Yjup2O;DS1?9F>7}d50}YqQ>ry8>8mF0;153LW zu+kvSY2V)m2;j^eK+~&DlWfNT^%ctv=;fP~T>1i>r16l|L{MECMMT}%y}){BiUUh- zp#PHxb{6e~YS&BQO4&z!T7uhmlJj)(zCuOD3tjHk7`~2*_al5u1hhI`&C%9bf8H{~ z17T4mO|r3S9pJaw&W%F!KcJ)ixZH6YkEH1XNFUY z5Fv0q+jPjyq|ua&c;Rg2(#PD0&8)Y&s2wRKz@{~!s|OVpr* z@{X1{YeL5?FIbOz*kB_K%I?tPC+4-phBff*Q(jqIVW*`3ZEC?Ceij>hA^7xgk_Cd& zs3f*_Myhm1YGST4EyX0+4vIx`CsJmWFp&ZM9!Y)@SY{b!xWf=07I1xYUnwC4!f0}H zbMt09QradqlWQuIJM5ApxC(U`oRn&p{#-w^D-08xis3Q911kpyhac4|xO1Ojo?hVy^^dTGgb8#LK#l@AC{G=XqUEkM*^86NrC0v+VNHIR0VdhNFL;tNx;Q6(% z9>EXG6|I9dgS)oTbEqaMGruE2D8^Mac%XgwEbxZ>&Sr-o3yL^2-`GYAYTvUAaQRg$ zoTSe28}c8!IV6paCh|G5htR6M{UJ>!-ie201v-iHf9l;hX-G|~hKLv$8F`CM-*Z(# zMOm%?_NBc!YmNpP-XG9$8anJ8DbAARf{xffBbBni?miLSpo-E8 z?UAYy8rjUmnip2=37NvBfu|j&*Ke%Wmp*H~mk>&VijzI~n|t_s!>`B3+`Xcyt@iFGAcHC_dEHnTitKV(``$Z zU0K0q3(yg9UW!g5B!*4bqt-ZXgEz5iMz1pTl3`EMmywa zNQ2+-%(H?$RXd2e(8BxTvTC;sG$`S*0s}KM^V^fcq0=j53h+cjxJ9UP1P#FUZjvS^ zH>7u2UH-glio?|_7+GfbP1*RW5Qyh&PsBO!5jADH1MW-1w;|v=4As@uL!y55&d*TI8IsoXO9>J+Kfm= zrP5<>A3Olo@J*YXaAk0nfRw<&2C%ZaTl7ODwXS`5O*q-Q+thALL{K={rsB* z3wtVUF99sYDwXBx`07c!vs?VU!G-_Cxv4~iJ@=olvS(Klp#Kxkj}U83#fQ*QseJwl zW2hMKgh`qvG^oKwMa>DK6hI;CuUk~S=gRrSXnT*iv&lc@A)Yw^ats112S>KA6Us<1 z8o4OaLyPBBR8bKN)&LR%&rhAPPl=DG2IXmcm1uwmQ*)345mp(q1tid*YkLeK&e@^={2`5m4;#RtFCPy>S$Luk0L`dDD^5!1UWObhF zj){s|{FZqn4rC=xsO7;C{eZ0p>1z^JcAVbXTX(+7v8PR+PyoJCra&i!Qcw}I^aJdJ zYr+1T=`%5(jxX}k5JI%k_L|M7>}dc$a)s`86q*IZ0Y6%Wb55VnCSEFHFf)moqAv(& zZlBF!3A@8}o+R|_mRY5e{dmM43ZHl4?&%58VBHyS0VuxE(ss(7#979GBl6~J1&^lQ zN`(27HZy}2D?x0OL+J+K3uo**9Z^Ba8Uj41{cs>|ajdDL@;)uhsVqfFXKx}}!^mfG z+GEe4iG}DnVqF6GSi#geyhR9dhcGJYK1|wAy7U8Ff)A&}t_A7ZRRDlzu%&Bm z#k44LdW6%^-nv4D-#8&1DDPfF1kyP%1a~@-0c;`5Ekt?U!RNX~V`?%uJ-)I4Ek(n< zBOWY^0#(1BMhOCd9Rew0tIGx%3e3D$J=CM3@FzzR^2Awm3M|-Dim4G%xhVqzkR=iC z&!9kp701Y7UAC_w5wyMkwo)DvXTSKsfsI52(ii?{VW4Zb-PF!}bOE~rDgpXSv^5)6 zSy@HJUODcN5&Ek$ikuI}Q9i;!LtR_|D4cK3ROqDolI=^s#r^cyF8B2{xcRS|UeaM= zTwL(iPQXB6#xRhLTfD#8KkI_T3L>WT!6m>KQmA|@f}E5HpQm|_l2Ap3yFbg1swin8WN&tYh_%O>WPZc498DyUE-$=erBt9&qt zV3b=3|K2nje|umpbB8W<4hUr+#N~Ua#UJ!iUYI7>4p3yzkyiNqg|r<#pt5=kzdVjh ktd07=>wjGV-IY`1JVLLh;mwETvp3H*ZtAL(Dp@`Gf5N5k$N&HU literal 0 HcmV?d00001 diff --git a/src/android/app/src/main/res/drawable-xxhdpi/button_select.png b/src/android/app/src/main/res/drawable-xxhdpi/button_select.png new file mode 100644 index 0000000000000000000000000000000000000000..42c3b7c43c258a25f4633454edf69ceb5b5beed6 GIT binary patch literal 27251 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 literal 0 HcmV?d00001 diff --git a/src/android/app/src/main/res/drawable-xxhdpi/button_select_pressed.png b/src/android/app/src/main/res/drawable-xxhdpi/button_select_pressed.png new file mode 100644 index 0000000000000000000000000000000000000000..0d1e56f6ae46558613b6a4a184e771452b8835f1 GIT binary patch literal 27436 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