From 6e49adb508c009c5f7998a38d47e1d0d174990d0 Mon Sep 17 00:00:00 2001 From: Connor McLaughlin <stenzek@gmail.com> Date: Tue, 8 Jun 2021 16:34:27 +1000 Subject: [PATCH] Remove Android app This repository exists solely for the desktop version now. --- android/.gitignore | 14 - android/.idea/.name | 1 - android/.idea/codeStyles/Project.xml | 116 - android/.idea/codeStyles/codeStyleConfig.xml | 5 - android/.idea/compiler.xml | 6 - android/.idea/gradle.xml | 21 - android/.idea/jarRepositories.xml | 30 - android/.idea/misc.xml | 9 - android/.idea/runConfigurations.xml | 13 - android/.idea/vcs.xml | 6 - android/app/.gitignore | 1 - android/app/build.gradle | 90 - android/app/proguard-rules.pro | 21 - .../duckstation/ExampleInstrumentedTest.java | 27 - android/app/src/cpp/CMakeLists.txt | 25 - .../src/cpp/android_controller_interface.cpp | 249 -- .../src/cpp/android_controller_interface.h | 73 - .../app/src/cpp/android_host_interface.cpp | 2198 ----------------- android/app/src/cpp/android_host_interface.h | 171 -- .../app/src/cpp/android_http_downloader.cpp | 167 -- android/app/src/cpp/android_http_downloader.h | 45 - .../app/src/cpp/android_progress_callback.cpp | 113 - .../app/src/cpp/android_progress_callback.h | 38 - .../src/cpp/android_settings_interface.cpp | 425 ---- .../app/src/cpp/android_settings_interface.h | 54 - android/app/src/cpp/opensles_audio_stream.cpp | 210 -- android/app/src/cpp/opensles_audio_stream.h | 48 - android/app/src/main/AndroidManifest.xml | 80 - android/app/src/main/ic_launcher-web.png | Bin 38012 -> 0 bytes .../stenzek/duckstation/Achievement.java | 76 - .../duckstation/AchievementListFragment.java | 193 -- .../AchievementSettingsFragment.java | 266 -- .../duckstation/AndroidHostInterface.java | 211 -- .../duckstation/AndroidProgressCallback.java | 141 -- .../stenzek/duckstation/ConsoleRegion.java | 8 - .../duckstation/ControllerAutoMapper.java | 295 --- .../duckstation/ControllerBindingDialog.java | 170 -- .../ControllerBindingPreference.java | 268 -- .../ControllerSettingsActivity.java | 132 - .../ControllerSettingsCollectionFragment.java | 459 ---- .../stenzek/duckstation/DiscRegion.java | 8 - .../duckstation/EmptyGameListFragment.java | 36 - .../duckstation/EmulationActivity.java | 988 -------- .../duckstation/EmulationSurfaceView.java | 302 --- .../stenzek/duckstation/EmulationThread.java | 67 - .../stenzek/duckstation/FileHelper.java | 613 ----- .../duckstation/GameDirectoriesActivity.java | 348 --- .../stenzek/duckstation/GameGridFragment.java | 139 -- .../github/stenzek/duckstation/GameList.java | 84 - .../stenzek/duckstation/GameListEntry.java | 99 - .../stenzek/duckstation/GameListFragment.java | 204 -- .../duckstation/GamePropertiesActivity.java | 253 -- .../duckstation/GameSettingPreference.java | 83 - .../duckstation/GameTraitPreference.java | 34 - .../duckstation/GenerateCoverTask.java | 64 - .../duckstation/GridAutofitLayoutManager.java | 73 - .../stenzek/duckstation/HotkeyInfo.java | 29 - .../stenzek/duckstation/ImageLoadTask.java | 32 - .../stenzek/duckstation/MainActivity.java | 556 ----- .../duckstation/MemoryCardEditorActivity.java | 524 ---- .../duckstation/MemoryCardFileInfo.java | 64 - .../stenzek/duckstation/MemoryCardImage.java | 204 -- .../github/stenzek/duckstation/PatchCode.java | 40 - .../duckstation/PreferenceHelpers.java | 85 - .../duckstation/PropertyListAdapter.java | 84 - .../stenzek/duckstation/RatioPreference.java | 198 -- .../stenzek/duckstation/SaveStateInfo.java | 151 -- .../stenzek/duckstation/SettingsActivity.java | 38 - .../SettingsCollectionFragment.java | 90 - .../TouchscreenControllerAxisView.java | 191 -- .../TouchscreenControllerButtonView.java | 204 -- .../TouchscreenControllerDPadView.java | 178 -- .../TouchscreenControllerView.java | 858 ------- .../stenzek/duckstation/URLDownloader.java | 96 - .../stenzek/duckstation/UpdateNotes.java | 54 - .../drawable-v24/ic_launcher_foreground.xml | 34 - .../main/res/drawable/cover_placeholder.png | Bin 214262 -> 0 bytes android/app/src/main/res/drawable/duck.png | Bin 48659 -> 0 bytes android/app/src/main/res/drawable/flag_eu.xml | 71 - android/app/src/main/res/drawable/flag_jp.xml | 50 - android/app/src/main/res/drawable/flag_us.xml | 539 ---- .../res/drawable/ic_baseline_album_24.xml | 10 - .../drawable/ic_baseline_arrow_back_24.xml | 11 - .../res/drawable/ic_baseline_category_24.xml | 16 - .../res/drawable/ic_baseline_close_24.xml | 10 - .../ic_baseline_create_new_folder_24.xml | 10 - .../res/drawable/ic_baseline_delete_24.xml | 10 - .../drawable/ic_baseline_delete_sweep_24.xml | 10 - .../drawable/ic_baseline_exit_to_app_24.xml | 11 - .../drawable/ic_baseline_fast_forward_24.xml | 10 - .../drawable/ic_baseline_fast_rewind_24.xml | 10 - .../res/drawable/ic_baseline_folder_24.xml | 10 - .../drawable/ic_baseline_folder_open_24.xml | 10 - .../res/drawable/ic_baseline_gamepad_24.xml | 10 - .../res/drawable/ic_baseline_grid_view_24.xml | 10 - .../main/res/drawable/ic_baseline_help_24.xml | 10 - .../ic_baseline_import_contacts_24.xml | 10 - .../ic_baseline_insert_drive_file_24.xml | 11 - .../drawable/ic_baseline_library_music_24.xml | 10 - .../main/res/drawable/ic_baseline_lock_24.xml | 10 - .../res/drawable/ic_baseline_lock_open_24.xml | 10 - .../main/res/drawable/ic_baseline_menu_24.xml | 10 - .../ic_baseline_not_interested_60.xml | 5 - .../drawable/ic_baseline_play_arrow_24.xml | 10 - .../drawable/ic_baseline_playlist_play_24.xml | 10 - .../ic_baseline_radio_button_checked_24.xml | 10 - .../ic_baseline_radio_button_unchecked_24.xml | 10 - .../drawable/ic_baseline_restart_alt_24.xml | 13 - .../main/res/drawable/ic_baseline_save_24.xml | 10 - .../res/drawable/ic_baseline_sd_card_24.xml | 10 - .../res/drawable/ic_baseline_settings_24.xml | 10 - .../ic_baseline_tips_and_updates_24.xml | 10 - .../res/drawable/ic_baseline_touch_app_24.xml | 10 - .../res/drawable/ic_baseline_trophy_24.xml | 10 - .../res/drawable/ic_baseline_vibration_24.xml | 10 - .../res/drawable/ic_baseline_view_list_24.xml | 10 - .../res/drawable/ic_controller_a_button.xml | 17 - .../ic_controller_a_button_pressed.xml | 16 - .../drawable/ic_controller_analog_base.xml | 21 - .../drawable/ic_controller_analog_button.xml | 17 - .../ic_controller_analog_button_pressed.xml | 17 - .../ic_controller_analog_stick_pressed.xml | 11 - .../ic_controller_analog_stick_unpressed.xml | 11 - .../res/drawable/ic_controller_b_button.xml | 17 - .../ic_controller_b_button_pressed.xml | 16 - .../drawable/ic_controller_circle_button.xml | 19 - .../ic_controller_circle_button_pressed.xml | 19 - .../drawable/ic_controller_cross_button.xml | 27 - .../ic_controller_cross_button_pressed.xml | 27 - .../drawable/ic_controller_down_button.xml | 14 - .../ic_controller_down_button_pressed.xml | 14 - .../drawable/ic_controller_fast_forward.xml | 17 - .../ic_controller_fast_forward_pressed.xml | 17 - .../res/drawable/ic_controller_l1_button.xml | 28 - .../ic_controller_l1_button_pressed.xml | 28 - .../res/drawable/ic_controller_l2_button.xml | 28 - .../ic_controller_l2_button_pressed.xml | 28 - .../drawable/ic_controller_left_button.xml | 14 - .../ic_controller_left_button_pressed.xml | 14 - .../drawable/ic_controller_pause_button.xml | 9 - .../ic_controller_quick_load_button.xml | 9 - .../ic_controller_quick_save_button.xml | 9 - .../res/drawable/ic_controller_r1_button.xml | 28 - .../ic_controller_r1_button_pressed.xml | 28 - .../res/drawable/ic_controller_r2_button.xml | 28 - .../ic_controller_r2_button_pressed.xml | 28 - .../drawable/ic_controller_right_button.xml | 14 - .../ic_controller_right_button_pressed.xml | 14 - .../drawable/ic_controller_select_button.xml | 14 - .../ic_controller_select_button_pressed.xml | 14 - .../drawable/ic_controller_square_button.xml | 20 - .../ic_controller_square_button_pressed.xml | 20 - .../drawable/ic_controller_start_button.xml | 14 - .../ic_controller_start_button_pressed.xml | 14 - .../res/drawable/ic_controller_t1_button.xml | 20 - .../ic_controller_t1_button_pressed.xml | 19 - .../res/drawable/ic_controller_t2_button.xml | 20 - .../ic_controller_t2_button_pressed.xml | 19 - .../res/drawable/ic_controller_t3_button.xml | 20 - .../ic_controller_t3_button_pressed.xml | 19 - .../res/drawable/ic_controller_t4_button.xml | 20 - .../ic_controller_t4_button_pressed.xml | 19 - .../ic_controller_triangle_button.xml | 19 - .../ic_controller_triangle_button_pressed.xml | 19 - .../res/drawable/ic_controller_up_button.xml | 14 - .../ic_controller_up_button_pressed.xml | 14 - .../main/res/drawable/ic_emblem_system.xml | 45 - .../res/drawable/ic_launcher_background.xml | 170 -- .../src/main/res/drawable/ic_media_cdrom.xml | 97 - .../app/src/main/res/drawable/ic_star_0.png | Bin 5534 -> 0 bytes .../app/src/main/res/drawable/ic_star_1.png | Bin 6116 -> 0 bytes .../app/src/main/res/drawable/ic_star_2.png | Bin 6367 -> 0 bytes .../app/src/main/res/drawable/ic_star_3.png | Bin 6526 -> 0 bytes .../app/src/main/res/drawable/ic_star_4.png | Bin 6312 -> 0 bytes .../app/src/main/res/drawable/ic_star_5.png | Bin 5990 -> 0 bytes .../layout/activity_controller_mapping.xml | 9 - .../main/res/layout/activity_emulation.xml | 20 - .../res/layout/activity_game_directories.xml | 47 - .../app/src/main/res/layout/activity_main.xml | 53 - .../layout/activity_memory_card_editor.xml | 65 - .../res/layout/fragment_achievement_list.xml | 74 - .../layout/fragment_achievements_login.xml | 133 - .../layout/fragment_controller_settings.xml | 22 - .../res/layout/fragment_empty_game_list.xml | 44 - .../fragment_emulation_activity_overlay.xml | 113 - .../main/res/layout/fragment_game_grid.xml | 18 - .../main/res/layout/fragment_game_list.xml | 17 - .../res/layout/fragment_memory_card_file.xml | 14 - .../layout/fragment_settings_collection.xml | 22 - .../res/layout/layout_achievement_entry.xml | 79 - .../layout_controller_binding_preference.xml | 39 - .../layout/layout_game_directory_entry.xml | 53 - .../res/layout/layout_game_grid_entry.xml | 17 - .../res/layout/layout_game_list_entry.xml | 76 - .../res/layout/layout_game_property_entry.xml | 26 - .../res/layout/layout_memory_card_save.xml | 82 - .../res/layout/layout_ratio_preference.xml | 26 - ...ut_touchscreen_controller_analog_stick.xml | 255 -- ...t_touchscreen_controller_analog_sticks.xml | 277 --- .../layout_touchscreen_controller_digital.xml | 239 -- .../layout_touchscreen_controller_edit.xml | 18 - ...layout_touchscreen_controller_lightgun.xml | 138 -- .../main/res/layout/save_state_view_entry.xml | 66 - .../src/main/res/layout/settings_activity.xml | 9 - .../main/res/menu/menu_controller_mapping.xml | 20 - .../res/menu/menu_edit_game_directories.xml | 15 - .../main/res/menu/menu_game_list_entry.xml | 16 - android/app/src/main/res/menu/menu_main.xml | 67 - .../main/res/menu/menu_memory_card_editor.xml | 24 - .../res/mipmap-anydpi-v26/ic_launcher.xml | 5 - .../mipmap-anydpi-v26/ic_launcher_round.xml | 5 - .../src/main/res/mipmap-hdpi/ic_launcher.png | Bin 2817 -> 0 bytes .../mipmap-hdpi/ic_launcher_foreground.png | Bin 5163 -> 0 bytes .../res/mipmap-hdpi/ic_launcher_round.png | Bin 5004 -> 0 bytes .../src/main/res/mipmap-mdpi/ic_launcher.png | Bin 1741 -> 0 bytes .../mipmap-mdpi/ic_launcher_foreground.png | Bin 2917 -> 0 bytes .../res/mipmap-mdpi/ic_launcher_round.png | Bin 2993 -> 0 bytes .../src/main/res/mipmap-xhdpi/ic_launcher.png | Bin 4088 -> 0 bytes .../mipmap-xhdpi/ic_launcher_foreground.png | Bin 7937 -> 0 bytes .../res/mipmap-xhdpi/ic_launcher_round.png | Bin 7370 -> 0 bytes .../main/res/mipmap-xxhdpi/ic_launcher.png | Bin 7155 -> 0 bytes .../mipmap-xxhdpi/ic_launcher_foreground.png | Bin 14699 -> 0 bytes .../res/mipmap-xxhdpi/ic_launcher_round.png | Bin 12470 -> 0 bytes .../main/res/mipmap-xxxhdpi/ic_launcher.png | Bin 10680 -> 0 bytes .../mipmap-xxxhdpi/ic_launcher_foreground.png | Bin 18599 -> 0 bytes .../res/mipmap-xxxhdpi/ic_launcher_round.png | Bin 18804 -> 0 bytes android/app/src/main/res/values-es/arrays.xml | 220 -- .../app/src/main/res/values-es/strings.xml | 346 --- android/app/src/main/res/values-it/arrays.xml | 206 -- .../app/src/main/res/values-it/strings.xml | 16 - .../app/src/main/res/values-night/colors.xml | 12 - android/app/src/main/res/values-nl/arrays.xml | 206 -- .../app/src/main/res/values-nl/strings.xml | 152 -- .../app/src/main/res/values-pt-rBR/arrays.xml | 264 -- .../src/main/res/values-pt-rBR/strings.xml | 368 --- android/app/src/main/res/values-ru/arrays.xml | 277 --- .../app/src/main/res/values-ru/strings.xml | 368 --- android/app/src/main/res/values/arrays.xml | 525 ---- android/app/src/main/res/values/attrs.xml | 12 - ...trs_touchscreen_controller_button_view.xml | 6 - android/app/src/main/res/values/colors.xml | 12 - android/app/src/main/res/values/dimens.xml | 3 - .../res/values/ic_launcher_background.xml | 4 - android/app/src/main/res/values/strings.xml | 368 --- android/app/src/main/res/values/styles.xml | 45 - .../main/res/xml/achievement_preferences.xml | 59 - .../src/main/res/xml/advanced_preferences.xml | 256 -- .../src/main/res/xml/audio_preferences.xml | 51 - .../main/res/xml/controllers_preferences.xml | 93 - .../src/main/res/xml/display_preferences.xml | 129 - .../main/res/xml/enhancements_preferences.xml | 154 -- .../src/main/res/xml/general_preferences.xml | 83 - .../main/res/xml/network_security_config.xml | 6 - .../stenzek/duckstation/ExampleUnitTest.java | 17 - android/build.gradle | 25 - android/gradle.properties | 20 - android/gradle/wrapper/gradle-wrapper.jar | Bin 54329 -> 0 bytes .../gradle/wrapper/gradle-wrapper.properties | 6 - android/gradlew | 172 -- android/gradlew.bat | 84 - android/settings.gradle | 2 - 261 files changed, 22601 deletions(-) delete mode 100644 android/.gitignore delete mode 100644 android/.idea/.name delete mode 100644 android/.idea/codeStyles/Project.xml delete mode 100644 android/.idea/codeStyles/codeStyleConfig.xml delete mode 100644 android/.idea/compiler.xml delete mode 100644 android/.idea/gradle.xml delete mode 100644 android/.idea/jarRepositories.xml delete mode 100644 android/.idea/misc.xml delete mode 100644 android/.idea/runConfigurations.xml delete mode 100644 android/.idea/vcs.xml delete mode 100644 android/app/.gitignore delete mode 100644 android/app/build.gradle delete mode 100644 android/app/proguard-rules.pro delete mode 100644 android/app/src/androidTest/java/com/github/stenzek/duckstation/ExampleInstrumentedTest.java delete mode 100644 android/app/src/cpp/CMakeLists.txt delete mode 100644 android/app/src/cpp/android_controller_interface.cpp delete mode 100644 android/app/src/cpp/android_controller_interface.h delete mode 100644 android/app/src/cpp/android_host_interface.cpp delete mode 100644 android/app/src/cpp/android_host_interface.h delete mode 100644 android/app/src/cpp/android_http_downloader.cpp delete mode 100644 android/app/src/cpp/android_http_downloader.h delete mode 100644 android/app/src/cpp/android_progress_callback.cpp delete mode 100644 android/app/src/cpp/android_progress_callback.h delete mode 100644 android/app/src/cpp/android_settings_interface.cpp delete mode 100644 android/app/src/cpp/android_settings_interface.h delete mode 100644 android/app/src/cpp/opensles_audio_stream.cpp delete mode 100644 android/app/src/cpp/opensles_audio_stream.h delete mode 100644 android/app/src/main/AndroidManifest.xml delete mode 100644 android/app/src/main/ic_launcher-web.png delete mode 100644 android/app/src/main/java/com/github/stenzek/duckstation/Achievement.java delete mode 100644 android/app/src/main/java/com/github/stenzek/duckstation/AchievementListFragment.java delete mode 100644 android/app/src/main/java/com/github/stenzek/duckstation/AchievementSettingsFragment.java delete mode 100644 android/app/src/main/java/com/github/stenzek/duckstation/AndroidHostInterface.java delete mode 100644 android/app/src/main/java/com/github/stenzek/duckstation/AndroidProgressCallback.java delete mode 100644 android/app/src/main/java/com/github/stenzek/duckstation/ConsoleRegion.java delete mode 100644 android/app/src/main/java/com/github/stenzek/duckstation/ControllerAutoMapper.java delete mode 100644 android/app/src/main/java/com/github/stenzek/duckstation/ControllerBindingDialog.java delete mode 100644 android/app/src/main/java/com/github/stenzek/duckstation/ControllerBindingPreference.java delete mode 100644 android/app/src/main/java/com/github/stenzek/duckstation/ControllerSettingsActivity.java delete mode 100644 android/app/src/main/java/com/github/stenzek/duckstation/ControllerSettingsCollectionFragment.java delete mode 100644 android/app/src/main/java/com/github/stenzek/duckstation/DiscRegion.java delete mode 100644 android/app/src/main/java/com/github/stenzek/duckstation/EmptyGameListFragment.java delete mode 100644 android/app/src/main/java/com/github/stenzek/duckstation/EmulationActivity.java delete mode 100644 android/app/src/main/java/com/github/stenzek/duckstation/EmulationSurfaceView.java delete mode 100644 android/app/src/main/java/com/github/stenzek/duckstation/EmulationThread.java delete mode 100644 android/app/src/main/java/com/github/stenzek/duckstation/FileHelper.java delete mode 100644 android/app/src/main/java/com/github/stenzek/duckstation/GameDirectoriesActivity.java delete mode 100644 android/app/src/main/java/com/github/stenzek/duckstation/GameGridFragment.java delete mode 100644 android/app/src/main/java/com/github/stenzek/duckstation/GameList.java delete mode 100644 android/app/src/main/java/com/github/stenzek/duckstation/GameListEntry.java delete mode 100644 android/app/src/main/java/com/github/stenzek/duckstation/GameListFragment.java delete mode 100644 android/app/src/main/java/com/github/stenzek/duckstation/GamePropertiesActivity.java delete mode 100644 android/app/src/main/java/com/github/stenzek/duckstation/GameSettingPreference.java delete mode 100644 android/app/src/main/java/com/github/stenzek/duckstation/GameTraitPreference.java delete mode 100644 android/app/src/main/java/com/github/stenzek/duckstation/GenerateCoverTask.java delete mode 100644 android/app/src/main/java/com/github/stenzek/duckstation/GridAutofitLayoutManager.java delete mode 100644 android/app/src/main/java/com/github/stenzek/duckstation/HotkeyInfo.java delete mode 100644 android/app/src/main/java/com/github/stenzek/duckstation/ImageLoadTask.java delete mode 100644 android/app/src/main/java/com/github/stenzek/duckstation/MainActivity.java delete mode 100644 android/app/src/main/java/com/github/stenzek/duckstation/MemoryCardEditorActivity.java delete mode 100644 android/app/src/main/java/com/github/stenzek/duckstation/MemoryCardFileInfo.java delete mode 100644 android/app/src/main/java/com/github/stenzek/duckstation/MemoryCardImage.java delete mode 100644 android/app/src/main/java/com/github/stenzek/duckstation/PatchCode.java delete mode 100644 android/app/src/main/java/com/github/stenzek/duckstation/PreferenceHelpers.java delete mode 100644 android/app/src/main/java/com/github/stenzek/duckstation/PropertyListAdapter.java delete mode 100644 android/app/src/main/java/com/github/stenzek/duckstation/RatioPreference.java delete mode 100644 android/app/src/main/java/com/github/stenzek/duckstation/SaveStateInfo.java delete mode 100644 android/app/src/main/java/com/github/stenzek/duckstation/SettingsActivity.java delete mode 100644 android/app/src/main/java/com/github/stenzek/duckstation/SettingsCollectionFragment.java delete mode 100644 android/app/src/main/java/com/github/stenzek/duckstation/TouchscreenControllerAxisView.java delete mode 100644 android/app/src/main/java/com/github/stenzek/duckstation/TouchscreenControllerButtonView.java delete mode 100644 android/app/src/main/java/com/github/stenzek/duckstation/TouchscreenControllerDPadView.java delete mode 100644 android/app/src/main/java/com/github/stenzek/duckstation/TouchscreenControllerView.java delete mode 100644 android/app/src/main/java/com/github/stenzek/duckstation/URLDownloader.java delete mode 100644 android/app/src/main/java/com/github/stenzek/duckstation/UpdateNotes.java delete mode 100644 android/app/src/main/res/drawable-v24/ic_launcher_foreground.xml delete mode 100644 android/app/src/main/res/drawable/cover_placeholder.png delete mode 100644 android/app/src/main/res/drawable/duck.png delete mode 100644 android/app/src/main/res/drawable/flag_eu.xml delete mode 100644 android/app/src/main/res/drawable/flag_jp.xml delete mode 100644 android/app/src/main/res/drawable/flag_us.xml delete mode 100644 android/app/src/main/res/drawable/ic_baseline_album_24.xml delete mode 100644 android/app/src/main/res/drawable/ic_baseline_arrow_back_24.xml delete mode 100644 android/app/src/main/res/drawable/ic_baseline_category_24.xml delete mode 100644 android/app/src/main/res/drawable/ic_baseline_close_24.xml delete mode 100644 android/app/src/main/res/drawable/ic_baseline_create_new_folder_24.xml delete mode 100644 android/app/src/main/res/drawable/ic_baseline_delete_24.xml delete mode 100644 android/app/src/main/res/drawable/ic_baseline_delete_sweep_24.xml delete mode 100644 android/app/src/main/res/drawable/ic_baseline_exit_to_app_24.xml delete mode 100644 android/app/src/main/res/drawable/ic_baseline_fast_forward_24.xml delete mode 100644 android/app/src/main/res/drawable/ic_baseline_fast_rewind_24.xml delete mode 100644 android/app/src/main/res/drawable/ic_baseline_folder_24.xml delete mode 100644 android/app/src/main/res/drawable/ic_baseline_folder_open_24.xml delete mode 100644 android/app/src/main/res/drawable/ic_baseline_gamepad_24.xml delete mode 100644 android/app/src/main/res/drawable/ic_baseline_grid_view_24.xml delete mode 100644 android/app/src/main/res/drawable/ic_baseline_help_24.xml delete mode 100644 android/app/src/main/res/drawable/ic_baseline_import_contacts_24.xml delete mode 100644 android/app/src/main/res/drawable/ic_baseline_insert_drive_file_24.xml delete mode 100644 android/app/src/main/res/drawable/ic_baseline_library_music_24.xml delete mode 100644 android/app/src/main/res/drawable/ic_baseline_lock_24.xml delete mode 100644 android/app/src/main/res/drawable/ic_baseline_lock_open_24.xml delete mode 100644 android/app/src/main/res/drawable/ic_baseline_menu_24.xml delete mode 100644 android/app/src/main/res/drawable/ic_baseline_not_interested_60.xml delete mode 100644 android/app/src/main/res/drawable/ic_baseline_play_arrow_24.xml delete mode 100644 android/app/src/main/res/drawable/ic_baseline_playlist_play_24.xml delete mode 100644 android/app/src/main/res/drawable/ic_baseline_radio_button_checked_24.xml delete mode 100644 android/app/src/main/res/drawable/ic_baseline_radio_button_unchecked_24.xml delete mode 100644 android/app/src/main/res/drawable/ic_baseline_restart_alt_24.xml delete mode 100644 android/app/src/main/res/drawable/ic_baseline_save_24.xml delete mode 100644 android/app/src/main/res/drawable/ic_baseline_sd_card_24.xml delete mode 100644 android/app/src/main/res/drawable/ic_baseline_settings_24.xml delete mode 100644 android/app/src/main/res/drawable/ic_baseline_tips_and_updates_24.xml delete mode 100644 android/app/src/main/res/drawable/ic_baseline_touch_app_24.xml delete mode 100644 android/app/src/main/res/drawable/ic_baseline_trophy_24.xml delete mode 100644 android/app/src/main/res/drawable/ic_baseline_vibration_24.xml delete mode 100644 android/app/src/main/res/drawable/ic_baseline_view_list_24.xml delete mode 100644 android/app/src/main/res/drawable/ic_controller_a_button.xml delete mode 100644 android/app/src/main/res/drawable/ic_controller_a_button_pressed.xml delete mode 100644 android/app/src/main/res/drawable/ic_controller_analog_base.xml delete mode 100644 android/app/src/main/res/drawable/ic_controller_analog_button.xml delete mode 100644 android/app/src/main/res/drawable/ic_controller_analog_button_pressed.xml delete mode 100644 android/app/src/main/res/drawable/ic_controller_analog_stick_pressed.xml delete mode 100644 android/app/src/main/res/drawable/ic_controller_analog_stick_unpressed.xml delete mode 100644 android/app/src/main/res/drawable/ic_controller_b_button.xml delete mode 100644 android/app/src/main/res/drawable/ic_controller_b_button_pressed.xml delete mode 100644 android/app/src/main/res/drawable/ic_controller_circle_button.xml delete mode 100644 android/app/src/main/res/drawable/ic_controller_circle_button_pressed.xml delete mode 100644 android/app/src/main/res/drawable/ic_controller_cross_button.xml delete mode 100644 android/app/src/main/res/drawable/ic_controller_cross_button_pressed.xml delete mode 100644 android/app/src/main/res/drawable/ic_controller_down_button.xml delete mode 100644 android/app/src/main/res/drawable/ic_controller_down_button_pressed.xml delete mode 100644 android/app/src/main/res/drawable/ic_controller_fast_forward.xml delete mode 100644 android/app/src/main/res/drawable/ic_controller_fast_forward_pressed.xml delete mode 100644 android/app/src/main/res/drawable/ic_controller_l1_button.xml delete mode 100644 android/app/src/main/res/drawable/ic_controller_l1_button_pressed.xml delete mode 100644 android/app/src/main/res/drawable/ic_controller_l2_button.xml delete mode 100644 android/app/src/main/res/drawable/ic_controller_l2_button_pressed.xml delete mode 100644 android/app/src/main/res/drawable/ic_controller_left_button.xml delete mode 100644 android/app/src/main/res/drawable/ic_controller_left_button_pressed.xml delete mode 100644 android/app/src/main/res/drawable/ic_controller_pause_button.xml delete mode 100644 android/app/src/main/res/drawable/ic_controller_quick_load_button.xml delete mode 100644 android/app/src/main/res/drawable/ic_controller_quick_save_button.xml delete mode 100644 android/app/src/main/res/drawable/ic_controller_r1_button.xml delete mode 100644 android/app/src/main/res/drawable/ic_controller_r1_button_pressed.xml delete mode 100644 android/app/src/main/res/drawable/ic_controller_r2_button.xml delete mode 100644 android/app/src/main/res/drawable/ic_controller_r2_button_pressed.xml delete mode 100644 android/app/src/main/res/drawable/ic_controller_right_button.xml delete mode 100644 android/app/src/main/res/drawable/ic_controller_right_button_pressed.xml delete mode 100644 android/app/src/main/res/drawable/ic_controller_select_button.xml delete mode 100644 android/app/src/main/res/drawable/ic_controller_select_button_pressed.xml delete mode 100644 android/app/src/main/res/drawable/ic_controller_square_button.xml delete mode 100644 android/app/src/main/res/drawable/ic_controller_square_button_pressed.xml delete mode 100644 android/app/src/main/res/drawable/ic_controller_start_button.xml delete mode 100644 android/app/src/main/res/drawable/ic_controller_start_button_pressed.xml delete mode 100644 android/app/src/main/res/drawable/ic_controller_t1_button.xml delete mode 100644 android/app/src/main/res/drawable/ic_controller_t1_button_pressed.xml delete mode 100644 android/app/src/main/res/drawable/ic_controller_t2_button.xml delete mode 100644 android/app/src/main/res/drawable/ic_controller_t2_button_pressed.xml delete mode 100644 android/app/src/main/res/drawable/ic_controller_t3_button.xml delete mode 100644 android/app/src/main/res/drawable/ic_controller_t3_button_pressed.xml delete mode 100644 android/app/src/main/res/drawable/ic_controller_t4_button.xml delete mode 100644 android/app/src/main/res/drawable/ic_controller_t4_button_pressed.xml delete mode 100644 android/app/src/main/res/drawable/ic_controller_triangle_button.xml delete mode 100644 android/app/src/main/res/drawable/ic_controller_triangle_button_pressed.xml delete mode 100644 android/app/src/main/res/drawable/ic_controller_up_button.xml delete mode 100644 android/app/src/main/res/drawable/ic_controller_up_button_pressed.xml delete mode 100644 android/app/src/main/res/drawable/ic_emblem_system.xml delete mode 100644 android/app/src/main/res/drawable/ic_launcher_background.xml delete mode 100644 android/app/src/main/res/drawable/ic_media_cdrom.xml delete mode 100644 android/app/src/main/res/drawable/ic_star_0.png delete mode 100644 android/app/src/main/res/drawable/ic_star_1.png delete mode 100644 android/app/src/main/res/drawable/ic_star_2.png delete mode 100644 android/app/src/main/res/drawable/ic_star_3.png delete mode 100644 android/app/src/main/res/drawable/ic_star_4.png delete mode 100644 android/app/src/main/res/drawable/ic_star_5.png delete mode 100644 android/app/src/main/res/layout/activity_controller_mapping.xml delete mode 100644 android/app/src/main/res/layout/activity_emulation.xml delete mode 100644 android/app/src/main/res/layout/activity_game_directories.xml delete mode 100644 android/app/src/main/res/layout/activity_main.xml delete mode 100644 android/app/src/main/res/layout/activity_memory_card_editor.xml delete mode 100644 android/app/src/main/res/layout/fragment_achievement_list.xml delete mode 100644 android/app/src/main/res/layout/fragment_achievements_login.xml delete mode 100644 android/app/src/main/res/layout/fragment_controller_settings.xml delete mode 100644 android/app/src/main/res/layout/fragment_empty_game_list.xml delete mode 100644 android/app/src/main/res/layout/fragment_emulation_activity_overlay.xml delete mode 100644 android/app/src/main/res/layout/fragment_game_grid.xml delete mode 100644 android/app/src/main/res/layout/fragment_game_list.xml delete mode 100644 android/app/src/main/res/layout/fragment_memory_card_file.xml delete mode 100644 android/app/src/main/res/layout/fragment_settings_collection.xml delete mode 100644 android/app/src/main/res/layout/layout_achievement_entry.xml delete mode 100644 android/app/src/main/res/layout/layout_controller_binding_preference.xml delete mode 100644 android/app/src/main/res/layout/layout_game_directory_entry.xml delete mode 100644 android/app/src/main/res/layout/layout_game_grid_entry.xml delete mode 100644 android/app/src/main/res/layout/layout_game_list_entry.xml delete mode 100644 android/app/src/main/res/layout/layout_game_property_entry.xml delete mode 100644 android/app/src/main/res/layout/layout_memory_card_save.xml delete mode 100644 android/app/src/main/res/layout/layout_ratio_preference.xml delete mode 100644 android/app/src/main/res/layout/layout_touchscreen_controller_analog_stick.xml delete mode 100644 android/app/src/main/res/layout/layout_touchscreen_controller_analog_sticks.xml delete mode 100644 android/app/src/main/res/layout/layout_touchscreen_controller_digital.xml delete mode 100644 android/app/src/main/res/layout/layout_touchscreen_controller_edit.xml delete mode 100644 android/app/src/main/res/layout/layout_touchscreen_controller_lightgun.xml delete mode 100644 android/app/src/main/res/layout/save_state_view_entry.xml delete mode 100644 android/app/src/main/res/layout/settings_activity.xml delete mode 100644 android/app/src/main/res/menu/menu_controller_mapping.xml delete mode 100644 android/app/src/main/res/menu/menu_edit_game_directories.xml delete mode 100644 android/app/src/main/res/menu/menu_game_list_entry.xml delete mode 100644 android/app/src/main/res/menu/menu_main.xml delete mode 100644 android/app/src/main/res/menu/menu_memory_card_editor.xml delete mode 100644 android/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml delete mode 100644 android/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml delete mode 100644 android/app/src/main/res/mipmap-hdpi/ic_launcher.png delete mode 100644 android/app/src/main/res/mipmap-hdpi/ic_launcher_foreground.png delete mode 100644 android/app/src/main/res/mipmap-hdpi/ic_launcher_round.png delete mode 100644 android/app/src/main/res/mipmap-mdpi/ic_launcher.png delete mode 100644 android/app/src/main/res/mipmap-mdpi/ic_launcher_foreground.png delete mode 100644 android/app/src/main/res/mipmap-mdpi/ic_launcher_round.png delete mode 100644 android/app/src/main/res/mipmap-xhdpi/ic_launcher.png delete mode 100644 android/app/src/main/res/mipmap-xhdpi/ic_launcher_foreground.png delete mode 100644 android/app/src/main/res/mipmap-xhdpi/ic_launcher_round.png delete mode 100644 android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png delete mode 100644 android/app/src/main/res/mipmap-xxhdpi/ic_launcher_foreground.png delete mode 100644 android/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.png delete mode 100644 android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png delete mode 100644 android/app/src/main/res/mipmap-xxxhdpi/ic_launcher_foreground.png delete mode 100644 android/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png delete mode 100644 android/app/src/main/res/values-es/arrays.xml delete mode 100644 android/app/src/main/res/values-es/strings.xml delete mode 100644 android/app/src/main/res/values-it/arrays.xml delete mode 100644 android/app/src/main/res/values-it/strings.xml delete mode 100644 android/app/src/main/res/values-night/colors.xml delete mode 100644 android/app/src/main/res/values-nl/arrays.xml delete mode 100644 android/app/src/main/res/values-nl/strings.xml delete mode 100644 android/app/src/main/res/values-pt-rBR/arrays.xml delete mode 100644 android/app/src/main/res/values-pt-rBR/strings.xml delete mode 100644 android/app/src/main/res/values-ru/arrays.xml delete mode 100644 android/app/src/main/res/values-ru/strings.xml delete mode 100644 android/app/src/main/res/values/arrays.xml delete mode 100644 android/app/src/main/res/values/attrs.xml delete mode 100644 android/app/src/main/res/values/attrs_touchscreen_controller_button_view.xml delete mode 100644 android/app/src/main/res/values/colors.xml delete mode 100644 android/app/src/main/res/values/dimens.xml delete mode 100644 android/app/src/main/res/values/ic_launcher_background.xml delete mode 100644 android/app/src/main/res/values/strings.xml delete mode 100644 android/app/src/main/res/values/styles.xml delete mode 100644 android/app/src/main/res/xml/achievement_preferences.xml delete mode 100644 android/app/src/main/res/xml/advanced_preferences.xml delete mode 100644 android/app/src/main/res/xml/audio_preferences.xml delete mode 100644 android/app/src/main/res/xml/controllers_preferences.xml delete mode 100644 android/app/src/main/res/xml/display_preferences.xml delete mode 100644 android/app/src/main/res/xml/enhancements_preferences.xml delete mode 100644 android/app/src/main/res/xml/general_preferences.xml delete mode 100644 android/app/src/main/res/xml/network_security_config.xml delete mode 100644 android/app/src/test/java/com/github/stenzek/duckstation/ExampleUnitTest.java delete mode 100644 android/build.gradle delete mode 100644 android/gradle.properties delete mode 100644 android/gradle/wrapper/gradle-wrapper.jar delete mode 100644 android/gradle/wrapper/gradle-wrapper.properties delete mode 100755 android/gradlew delete mode 100644 android/gradlew.bat delete mode 100644 android/settings.gradle diff --git a/android/.gitignore b/android/.gitignore deleted file mode 100644 index 603b14077..000000000 --- a/android/.gitignore +++ /dev/null @@ -1,14 +0,0 @@ -*.iml -.gradle -/local.properties -/.idea/caches -/.idea/libraries -/.idea/modules.xml -/.idea/workspace.xml -/.idea/navEditor.xml -/.idea/assetWizardSettings.xml -.DS_Store -/build -/captures -.externalNativeBuild -.cxx diff --git a/android/.idea/.name b/android/.idea/.name deleted file mode 100644 index eea1d2e85..000000000 --- a/android/.idea/.name +++ /dev/null @@ -1 +0,0 @@ -DuckStation \ No newline at end of file diff --git a/android/.idea/codeStyles/Project.xml b/android/.idea/codeStyles/Project.xml deleted file mode 100644 index 681f41ae2..000000000 --- a/android/.idea/codeStyles/Project.xml +++ /dev/null @@ -1,116 +0,0 @@ -<component name="ProjectCodeStyleConfiguration"> - <code_scheme name="Project" version="173"> - <codeStyleSettings language="XML"> - <indentOptions> - <option name="CONTINUATION_INDENT_SIZE" value="4" /> - </indentOptions> - <arrangement> - <rules> - <section> - <rule> - <match> - <AND> - <NAME>xmlns:android</NAME> - <XML_ATTRIBUTE /> - <XML_NAMESPACE>^$</XML_NAMESPACE> - </AND> - </match> - </rule> - </section> - <section> - <rule> - <match> - <AND> - <NAME>xmlns:.*</NAME> - <XML_ATTRIBUTE /> - <XML_NAMESPACE>^$</XML_NAMESPACE> - </AND> - </match> - <order>BY_NAME</order> - </rule> - </section> - <section> - <rule> - <match> - <AND> - <NAME>.*:id</NAME> - <XML_ATTRIBUTE /> - <XML_NAMESPACE>http://schemas.android.com/apk/res/android</XML_NAMESPACE> - </AND> - </match> - </rule> - </section> - <section> - <rule> - <match> - <AND> - <NAME>.*:name</NAME> - <XML_ATTRIBUTE /> - <XML_NAMESPACE>http://schemas.android.com/apk/res/android</XML_NAMESPACE> - </AND> - </match> - </rule> - </section> - <section> - <rule> - <match> - <AND> - <NAME>name</NAME> - <XML_ATTRIBUTE /> - <XML_NAMESPACE>^$</XML_NAMESPACE> - </AND> - </match> - </rule> - </section> - <section> - <rule> - <match> - <AND> - <NAME>style</NAME> - <XML_ATTRIBUTE /> - <XML_NAMESPACE>^$</XML_NAMESPACE> - </AND> - </match> - </rule> - </section> - <section> - <rule> - <match> - <AND> - <NAME>.*</NAME> - <XML_ATTRIBUTE /> - <XML_NAMESPACE>^$</XML_NAMESPACE> - </AND> - </match> - <order>BY_NAME</order> - </rule> - </section> - <section> - <rule> - <match> - <AND> - <NAME>.*</NAME> - <XML_ATTRIBUTE /> - <XML_NAMESPACE>http://schemas.android.com/apk/res/android</XML_NAMESPACE> - </AND> - </match> - <order>ANDROID_ATTRIBUTE_ORDER</order> - </rule> - </section> - <section> - <rule> - <match> - <AND> - <NAME>.*</NAME> - <XML_ATTRIBUTE /> - <XML_NAMESPACE>.*</XML_NAMESPACE> - </AND> - </match> - <order>BY_NAME</order> - </rule> - </section> - </rules> - </arrangement> - </codeStyleSettings> - </code_scheme> -</component> \ No newline at end of file diff --git a/android/.idea/codeStyles/codeStyleConfig.xml b/android/.idea/codeStyles/codeStyleConfig.xml deleted file mode 100644 index a55e7a179..000000000 --- a/android/.idea/codeStyles/codeStyleConfig.xml +++ /dev/null @@ -1,5 +0,0 @@ -<component name="ProjectCodeStyleConfiguration"> - <state> - <option name="PREFERRED_PROJECT_CODE_STYLE" value="Default" /> - </state> -</component> \ No newline at end of file diff --git a/android/.idea/compiler.xml b/android/.idea/compiler.xml deleted file mode 100644 index fb7f4a8a4..000000000 --- a/android/.idea/compiler.xml +++ /dev/null @@ -1,6 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<project version="4"> - <component name="CompilerConfiguration"> - <bytecodeTargetLevel target="11" /> - </component> -</project> \ No newline at end of file diff --git a/android/.idea/gradle.xml b/android/.idea/gradle.xml deleted file mode 100644 index 9bba60dad..000000000 --- a/android/.idea/gradle.xml +++ /dev/null @@ -1,21 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<project version="4"> - <component name="GradleMigrationSettings" migrationVersion="1" /> - <component name="GradleSettings"> - <option name="linkedExternalProjectsSettings"> - <GradleProjectSettings> - <option name="testRunner" value="PLATFORM" /> - <option name="distributionType" value="DEFAULT_WRAPPED" /> - <option name="externalProjectPath" value="$PROJECT_DIR$" /> - <option name="modules"> - <set> - <option value="$PROJECT_DIR$" /> - <option value="$PROJECT_DIR$/app" /> - </set> - </option> - <option name="resolveModulePerSourceSet" value="false" /> - <option name="useQualifiedModuleNames" value="true" /> - </GradleProjectSettings> - </option> - </component> -</project> \ No newline at end of file diff --git a/android/.idea/jarRepositories.xml b/android/.idea/jarRepositories.xml deleted file mode 100644 index e34606ccd..000000000 --- a/android/.idea/jarRepositories.xml +++ /dev/null @@ -1,30 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<project version="4"> - <component name="RemoteRepositoriesConfiguration"> - <remote-repository> - <option name="id" value="central" /> - <option name="name" value="Maven Central repository" /> - <option name="url" value="https://repo1.maven.org/maven2" /> - </remote-repository> - <remote-repository> - <option name="id" value="jboss.community" /> - <option name="name" value="JBoss Community repository" /> - <option name="url" value="https://repository.jboss.org/nexus/content/repositories/public/" /> - </remote-repository> - <remote-repository> - <option name="id" value="BintrayJCenter" /> - <option name="name" value="BintrayJCenter" /> - <option name="url" value="https://jcenter.bintray.com/" /> - </remote-repository> - <remote-repository> - <option name="id" value="Google" /> - <option name="name" value="Google" /> - <option name="url" value="https://dl.google.com/dl/android/maven2/" /> - </remote-repository> - <remote-repository> - <option name="id" value="MavenRepo" /> - <option name="name" value="MavenRepo" /> - <option name="url" value="https://repo.maven.apache.org/maven2/" /> - </remote-repository> - </component> -</project> \ No newline at end of file diff --git a/android/.idea/misc.xml b/android/.idea/misc.xml deleted file mode 100644 index 860da66a5..000000000 --- a/android/.idea/misc.xml +++ /dev/null @@ -1,9 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<project version="4"> - <component name="ProjectRootManager" version="2" languageLevel="JDK_11" default="true" project-jdk-name="1.8" project-jdk-type="JavaSDK"> - <output url="file://$PROJECT_DIR$/build/classes" /> - </component> - <component name="ProjectType"> - <option name="id" value="Android" /> - </component> -</project> \ No newline at end of file diff --git a/android/.idea/runConfigurations.xml b/android/.idea/runConfigurations.xml deleted file mode 100644 index e497da999..000000000 --- a/android/.idea/runConfigurations.xml +++ /dev/null @@ -1,13 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<project version="4"> - <component name="RunConfigurationProducerService"> - <option name="ignoredProducers"> - <set> - <option value="com.android.tools.idea.compose.preview.runconfiguration.ComposePreviewRunConfigurationProducer" /> - <option value="org.jetbrains.plugins.gradle.execution.test.runner.AllInPackageGradleConfigurationProducer" /> - <option value="org.jetbrains.plugins.gradle.execution.test.runner.TestClassGradleConfigurationProducer" /> - <option value="org.jetbrains.plugins.gradle.execution.test.runner.TestMethodGradleConfigurationProducer" /> - </set> - </option> - </component> -</project> \ No newline at end of file diff --git a/android/.idea/vcs.xml b/android/.idea/vcs.xml deleted file mode 100644 index 6c0b86358..000000000 --- a/android/.idea/vcs.xml +++ /dev/null @@ -1,6 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<project version="4"> - <component name="VcsDirectoryMappings"> - <mapping directory="$PROJECT_DIR$/.." vcs="Git" /> - </component> -</project> \ No newline at end of file diff --git a/android/app/.gitignore b/android/app/.gitignore deleted file mode 100644 index 796b96d1c..000000000 --- a/android/app/.gitignore +++ /dev/null @@ -1 +0,0 @@ -/build diff --git a/android/app/build.gradle b/android/app/build.gradle deleted file mode 100644 index 38ec9c8df..000000000 --- a/android/app/build.gradle +++ /dev/null @@ -1,90 +0,0 @@ -apply plugin: 'com.android.application' - -android { - compileSdkVersion 29 - buildToolsVersion "30.0.2" - defaultConfig { - applicationId "com.github.stenzek.duckstation" - minSdkVersion 23 - targetSdkVersion 29 - versionCode(getBuildVersionCode()) - versionName "${getVersion()}" - } - buildTypes { - release { - minifyEnabled false - proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro' - - ndk { - debugSymbolLevel "FULL" - } - } - } - - externalNativeBuild { - cmake { - path "../../CMakeLists.txt" - version "3.10.2" - } - } - compileOptions { - sourceCompatibility JavaVersion.VERSION_1_8 - targetCompatibility JavaVersion.VERSION_1_8 - } - defaultConfig { - externalNativeBuild { - cmake { - arguments "-DCMAKE_BUILD_TYPE=Release" - abiFilters "arm64-v8a", "armeabi-v7a", "x86_64" - } - } - } - sourceSets { - main.assets.srcDirs += "../../data" - } - - // Blocked on R21 until CMake is updated to 3.19 or later. - ndkVersion '21.4.7075529' -} - -dependencies { - implementation fileTree(dir: 'libs', include: ['*.jar']) - implementation 'androidx.appcompat:appcompat:1.3.0' - implementation 'androidx.constraintlayout:constraintlayout:2.0.4' - implementation 'com.google.android.material:material:1.3.0' - implementation 'androidx.preference:preference:1.1.1' - implementation 'androidx.legacy:legacy-support-v4:1.0.0' - implementation "androidx.viewpager2:viewpager2:1.0.0" - testImplementation 'junit:junit:4.13.2' - androidTestImplementation 'androidx.test.ext:junit:1.1.2' - androidTestImplementation 'androidx.test.espresso:espresso-core:3.3.0' -} - -// Adapted from Dolphin. - -def getVersion() { - def versionNumber = '0.0-unknown' - - try { - versionNumber = 'git describe --tags --exclude latest --exclude preview'.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 1; -} diff --git a/android/app/proguard-rules.pro b/android/app/proguard-rules.pro deleted file mode 100644 index f1b424510..000000000 --- a/android/app/proguard-rules.pro +++ /dev/null @@ -1,21 +0,0 @@ -# Add project specific ProGuard rules here. -# You can control the set of applied configuration files using the -# proguardFiles setting in build.gradle. -# -# For more details, see -# http://developer.android.com/guide/developing/tools/proguard.html - -# If your project uses WebView with JS, uncomment the following -# and specify the fully qualified class name to the JavaScript interface -# class: -#-keepclassmembers class fqcn.of.javascript.interface.for.webview { -# public *; -#} - -# Uncomment this to preserve the line number information for -# debugging stack traces. -#-keepattributes SourceFile,LineNumberTable - -# If you keep the line number information, uncomment this to -# hide the original source file name. -#-renamesourcefileattribute SourceFile diff --git a/android/app/src/androidTest/java/com/github/stenzek/duckstation/ExampleInstrumentedTest.java b/android/app/src/androidTest/java/com/github/stenzek/duckstation/ExampleInstrumentedTest.java deleted file mode 100644 index 71cc603ed..000000000 --- a/android/app/src/androidTest/java/com/github/stenzek/duckstation/ExampleInstrumentedTest.java +++ /dev/null @@ -1,27 +0,0 @@ -package com.github.stenzek.duckstation; - -import android.content.Context; - -import androidx.test.platform.app.InstrumentationRegistry; -import androidx.test.ext.junit.runners.AndroidJUnit4; - -import org.junit.Test; -import org.junit.runner.RunWith; - -import static org.junit.Assert.*; - -/** - * Instrumented test, which will execute on an Android device. - * - * @see <a href="http://d.android.com/tools/testing">Testing documentation</a> - */ -@RunWith(AndroidJUnit4.class) -public class ExampleInstrumentedTest { - @Test - public void useAppContext() { - // Context of the app under test. - Context appContext = InstrumentationRegistry.getInstrumentation().getTargetContext(); - - assertEquals("com.github.stenzek.duckstation", appContext.getPackageName()); - } -} diff --git a/android/app/src/cpp/CMakeLists.txt b/android/app/src/cpp/CMakeLists.txt deleted file mode 100644 index 2e3fb11ed..000000000 --- a/android/app/src/cpp/CMakeLists.txt +++ /dev/null @@ -1,25 +0,0 @@ -set(SRCS - android_controller_interface.cpp - android_controller_interface.h - android_host_interface.cpp - android_host_interface.h - android_http_downloader.cpp - android_http_downloader.h - android_progress_callback.cpp - android_progress_callback.h - android_settings_interface.cpp - android_settings_interface.h -) - -add_library(duckstation-native SHARED ${SRCS}) -target_link_libraries(duckstation-native PRIVATE android frontend-common core common glad imgui) - -find_package(OpenSLES) -if(OPENSLES_FOUND) - message("Enabling OpenSL ES audio stream") - target_sources(duckstation-native PRIVATE - opensles_audio_stream.cpp - opensles_audio_stream.h) - target_link_libraries(duckstation-native PRIVATE OpenSLES::OpenSLES) - target_compile_definitions(duckstation-native PRIVATE "-DUSE_OPENSLES=1") -endif() diff --git a/android/app/src/cpp/android_controller_interface.cpp b/android/app/src/cpp/android_controller_interface.cpp deleted file mode 100644 index 7fea10ecd..000000000 --- a/android/app/src/cpp/android_controller_interface.cpp +++ /dev/null @@ -1,249 +0,0 @@ -#include "android_controller_interface.h" -#include "android_host_interface.h" -#include "common/assert.h" -#include "common/file_system.h" -#include "common/log.h" -#include "core/controller.h" -#include "core/host_interface.h" -#include "core/system.h" -#include <cmath> -Log_SetChannel(AndroidControllerInterface); - -AndroidControllerInterface::AndroidControllerInterface() = default; - -AndroidControllerInterface::~AndroidControllerInterface() = default; - -ControllerInterface::Backend AndroidControllerInterface::GetBackend() const -{ - return ControllerInterface::Backend::Android; -} - -bool AndroidControllerInterface::Initialize(CommonHostInterface* host_interface) -{ - if (!ControllerInterface::Initialize(host_interface)) - return false; - - return true; -} - -void AndroidControllerInterface::Shutdown() -{ - ControllerInterface::Shutdown(); -} - -void AndroidControllerInterface::PollEvents() {} - -void AndroidControllerInterface::ClearBindings() -{ - std::unique_lock<std::mutex> lock(m_controllers_mutex); - for (ControllerData& cd : m_controllers) - { - cd.axis_mapping.clear(); - cd.button_mapping.clear(); - cd.axis_button_mapping.clear(); - cd.button_axis_mapping.clear(); - } -} - -std::optional<int> AndroidControllerInterface::GetControllerIndex(const std::string_view& device) -{ - std::unique_lock<std::mutex> lock(m_controllers_mutex); - for (u32 i = 0; i < static_cast<u32>(m_device_names.size()); i++) - { - if (device == m_device_names[i]) - return static_cast<int>(i); - } - - return std::nullopt; -} - -bool AndroidControllerInterface::BindControllerAxis(int controller_index, int axis_number, AxisSide axis_side, - AxisCallback callback) -{ - std::unique_lock<std::mutex> lock(m_controllers_mutex); - if (static_cast<u32>(controller_index) >= m_controllers.size()) - return false; - - m_controllers[controller_index].axis_mapping[axis_number][axis_side] = std::move(callback); - Log_DevPrintf("Bound controller %d axis %d side %u", controller_index, axis_number, static_cast<unsigned>(axis_side)); - return true; -} - -bool AndroidControllerInterface::BindControllerButton(int controller_index, int button_number, ButtonCallback callback) -{ - std::unique_lock<std::mutex> lock(m_controllers_mutex); - if (static_cast<u32>(controller_index) >= m_controllers.size()) - return false; - - m_controllers[controller_index].button_mapping[button_number] = std::move(callback); - Log_DevPrintf("Bound controller %d button %d", controller_index, button_number); - return true; -} - -bool AndroidControllerInterface::BindControllerAxisToButton(int controller_index, int axis_number, bool direction, - ButtonCallback callback) -{ - std::unique_lock<std::mutex> lock(m_controllers_mutex); - if (static_cast<u32>(controller_index) >= m_controllers.size()) - return false; - - m_controllers[controller_index].axis_button_mapping[axis_number][BoolToUInt8(direction)] = std::move(callback); - Log_DevPrintf("Bound controller %d axis %d to button", controller_index, axis_number); - return true; -} - -bool AndroidControllerInterface::BindControllerHatToButton(int controller_index, int hat_number, - std::string_view hat_position, ButtonCallback callback) -{ - return false; -} - -bool AndroidControllerInterface::BindControllerButtonToAxis(int controller_index, int button_number, - AxisCallback callback) -{ - std::unique_lock<std::mutex> lock(m_controllers_mutex); - if (static_cast<u32>(controller_index) >= m_controllers.size()) - return false; - - m_controllers[controller_index].button_axis_mapping[button_number] = std::move(callback); - Log_DevPrintf("Bound controller %d button %d to axis", controller_index, button_number); - return true; -} - -void AndroidControllerInterface::SetDeviceNames(std::vector<std::string> device_names) -{ - std::unique_lock<std::mutex> lock(m_controllers_mutex); - m_device_names = std::move(device_names); - m_controllers.resize(m_device_names.size()); - - for (u32 i = 0; i < static_cast<u32>(m_device_names.size()); i++) - Log_DevPrintf("Controller %u: %s", i, m_device_names[i].c_str()); -} - -void AndroidControllerInterface::SetDeviceRumble(u32 index, bool has_vibrator) -{ - std::unique_lock<std::mutex> lock(m_controllers_mutex); - if (index >= m_controllers.size()) - return; - - m_controllers[index].has_rumble = has_vibrator; -} - -void AndroidControllerInterface::HandleAxisEvent(u32 index, u32 axis, float value) -{ - std::unique_lock<std::mutex> lock(m_controllers_mutex); - if (index >= m_controllers.size()) - return; - - Log_DevPrintf("controller %u axis %u %f", index, axis, value); - if (DoEventHook(Hook::Type::Axis, index, axis, value)) - return; - - const ControllerData& cd = m_controllers[index]; - const auto am_iter = cd.axis_mapping.find(axis); - if (am_iter != cd.axis_mapping.end()) - { - const AxisCallback& cb = am_iter->second[AxisSide::Full]; - if (cb) - { - cb(value); - return; - } - } - - // set the other direction to false so large movements don't leave the opposite on - const bool outside_deadzone = (std::abs(value) >= cd.deadzone); - const bool positive = (value >= 0.0f); - const auto bm_iter = cd.axis_button_mapping.find(axis); - if (bm_iter != cd.axis_button_mapping.end()) - { - const ButtonCallback& other_button_cb = bm_iter->second[BoolToUInt8(!positive)]; - const ButtonCallback& button_cb = bm_iter->second[BoolToUInt8(positive)]; - if (button_cb) - { - button_cb(outside_deadzone); - if (other_button_cb) - other_button_cb(false); - return; - } - else if (other_button_cb) - { - other_button_cb(false); - return; - } - } -} - -void AndroidControllerInterface::HandleButtonEvent(u32 index, u32 button, bool pressed) -{ - Log_DevPrintf("controller %u button %u %s", index, button, pressed ? "pressed" : "released"); - - std::unique_lock<std::mutex> lock(m_controllers_mutex); - if (index >= m_controllers.size()) - return; - - if (DoEventHook(Hook::Type::Button, index, button, pressed ? 1.0f : 0.0f)) - return; - - const ControllerData& cd = m_controllers[index]; - const auto button_iter = cd.button_mapping.find(button); - if (button_iter != cd.button_mapping.end() && button_iter->second) - { - button_iter->second(pressed); - return; - } - - const auto axis_iter = cd.button_axis_mapping.find(button); - if (axis_iter != cd.button_axis_mapping.end() && axis_iter->second) - { - axis_iter->second(pressed ? 1.0f : -1.0f); - return; - } - - Log_DevPrintf("controller %u button %u has no binding", index, button); -} - -bool AndroidControllerInterface::HasButtonBinding(u32 index, u32 button) -{ - std::unique_lock<std::mutex> lock(m_controllers_mutex); - if (index >= m_controllers.size()) - return false; - - const ControllerData& cd = m_controllers[index]; - return (cd.button_mapping.find(button) != cd.button_mapping.end() || - cd.button_axis_mapping.find(button) != cd.button_axis_mapping.end()); -} - -u32 AndroidControllerInterface::GetControllerRumbleMotorCount(int controller_index) -{ - std::unique_lock<std::mutex> lock(m_controllers_mutex); - if (static_cast<u32>(controller_index) >= m_controllers.size()) - return false; - - return m_controllers[static_cast<u32>(controller_index)].has_rumble ? NUM_RUMBLE_MOTORS : 0; -} - -void AndroidControllerInterface::SetControllerRumbleStrength(int controller_index, const float* strengths, - u32 num_motors) -{ - std::unique_lock<std::mutex> lock(m_controllers_mutex); - if (static_cast<u32>(controller_index) >= m_controllers.size()) - return; - - const float small_motor = strengths[0]; - const float large_motor = strengths[1]; - static_cast<AndroidHostInterface*>(m_host_interface) - ->SetControllerVibration(static_cast<u32>(controller_index), small_motor, large_motor); -} - -bool AndroidControllerInterface::SetControllerDeadzone(int controller_index, float size /* = 0.25f */) -{ - std::unique_lock<std::mutex> lock(m_controllers_mutex); - if (static_cast<u32>(controller_index) >= m_controllers.size()) - return false; - - m_controllers[static_cast<u32>(controller_index)].deadzone = std::clamp(std::abs(size), 0.01f, 0.99f); - Log_InfoPrintf("Controller %d deadzone size set to %f", controller_index, - m_controllers[static_cast<u32>(controller_index)].deadzone); - return true; -} diff --git a/android/app/src/cpp/android_controller_interface.h b/android/app/src/cpp/android_controller_interface.h deleted file mode 100644 index a22b81f50..000000000 --- a/android/app/src/cpp/android_controller_interface.h +++ /dev/null @@ -1,73 +0,0 @@ -#pragma once -#include "core/types.h" -#include "frontend-common/controller_interface.h" -#include <array> -#include <functional> -#include <map> -#include <mutex> -#include <vector> - -class AndroidControllerInterface final : public ControllerInterface -{ -public: - AndroidControllerInterface(); - ~AndroidControllerInterface() override; - - ALWAYS_INLINE u32 GetControllerCount() const { return static_cast<u32>(m_controllers.size()); } - - Backend GetBackend() const override; - bool Initialize(CommonHostInterface* host_interface) override; - void Shutdown() override; - - // Removes all bindings. Call before setting new bindings. - void ClearBindings() override; - - // Binding to events. If a binding for this axis/button already exists, returns false. - std::optional<int> GetControllerIndex(const std::string_view& device) override; - bool BindControllerAxis(int controller_index, int axis_number, AxisSide axis_side, AxisCallback callback) override; - bool BindControllerButton(int controller_index, int button_number, ButtonCallback callback) override; - bool BindControllerAxisToButton(int controller_index, int axis_number, bool direction, - ButtonCallback callback) override; - bool BindControllerHatToButton(int controller_index, int hat_number, std::string_view hat_position, - ButtonCallback callback) override; - bool BindControllerButtonToAxis(int controller_index, int button_number, AxisCallback callback) override; - - // Changing rumble strength. - u32 GetControllerRumbleMotorCount(int controller_index) override; - void SetControllerRumbleStrength(int controller_index, const float* strengths, u32 num_motors) override; - - // Set deadzone that will be applied on axis-to-button mappings - bool SetControllerDeadzone(int controller_index, float size = 0.25f) override; - - void PollEvents() override; - - void SetDeviceNames(std::vector<std::string> device_names); - void SetDeviceRumble(u32 index, bool has_vibrator); - void HandleAxisEvent(u32 index, u32 axis, float value); - void HandleButtonEvent(u32 index, u32 button, bool pressed); - bool HasButtonBinding(u32 index, u32 button); - -private: - enum : u32 - { - NUM_RUMBLE_MOTORS = 2 - }; - - struct ControllerData - { - float deadzone = 0.25f; - - std::map<u32, std::array<AxisCallback, 3>> axis_mapping; - std::map<u32, ButtonCallback> button_mapping; - std::map<u32, std::array<ButtonCallback, 2>> axis_button_mapping; - std::map<u32, AxisCallback> button_axis_mapping; - bool has_rumble = false; - }; - - std::vector<std::string> m_device_names; - std::vector<ControllerData> m_controllers; - std::mutex m_controllers_mutex; - - std::mutex m_event_intercept_mutex; - Hook::Callback m_event_intercept_callback; -}; diff --git a/android/app/src/cpp/android_host_interface.cpp b/android/app/src/cpp/android_host_interface.cpp deleted file mode 100644 index ea4ec3dd0..000000000 --- a/android/app/src/cpp/android_host_interface.cpp +++ /dev/null @@ -1,2198 +0,0 @@ -#include "android_host_interface.h" -#include "android_controller_interface.h" -#include "android_progress_callback.h" -#include "common/assert.h" -#include "common/audio_stream.h" -#include "common/file_system.h" -#include "common/log.h" -#include "common/string.h" -#include "common/string_util.h" -#include "common/timer.h" -#include "common/timestamp.h" -#include "core/bios.h" -#include "core/cheats.h" -#include "core/controller.h" -#include "core/gpu.h" -#include "core/host_display.h" -#include "core/memory_card_image.h" -#include "core/system.h" -#include "frontend-common/cheevos.h" -#include "frontend-common/game_list.h" -#include "frontend-common/imgui_fullscreen.h" -#include "frontend-common/imgui_styles.h" -#include "frontend-common/opengl_host_display.h" -#include "frontend-common/vulkan_host_display.h" -#include "scmversion/scmversion.h" -#include <android/native_window_jni.h> -#include <cmath> -#include <imgui.h> -#include <sched.h> -#include <unistd.h> -Log_SetChannel(AndroidHostInterface); - -#ifdef USE_OPENSLES -#include "opensles_audio_stream.h" -#endif - -static JavaVM* s_jvm; -static jclass s_String_class; -static jclass s_AndroidHostInterface_class; -static jmethodID s_AndroidHostInterface_constructor; -static jfieldID s_AndroidHostInterface_field_mNativePointer; -static jfieldID s_AndroidHostInterface_field_mEmulationActivity; -static jmethodID s_AndroidHostInterface_method_reportError; -static jmethodID s_AndroidHostInterface_method_reportMessage; -static jmethodID s_AndroidHostInterface_method_openAssetStream; -static jclass s_EmulationActivity_class; -static jmethodID s_EmulationActivity_method_reportError; -static jmethodID s_EmulationActivity_method_onEmulationStarted; -static jmethodID s_EmulationActivity_method_onEmulationStopped; -static jmethodID s_EmulationActivity_method_onRunningGameChanged; -static jmethodID s_EmulationActivity_method_setVibration; -static jmethodID s_EmulationActivity_method_getRefreshRate; -static jmethodID s_EmulationActivity_method_openPauseMenu; -static jmethodID s_EmulationActivity_method_getInputDeviceNames; -static jmethodID s_EmulationActivity_method_hasInputDeviceVibration; -static jmethodID s_EmulationActivity_method_setInputDeviceVibration; -static jclass s_PatchCode_class; -static jmethodID s_PatchCode_constructor; -static jclass s_GameListEntry_class; -static jmethodID s_GameListEntry_constructor; -static jclass s_SaveStateInfo_class; -static jmethodID s_SaveStateInfo_constructor; -static jclass s_Achievement_class; -static jmethodID s_Achievement_constructor; -static jclass s_MemoryCardFileInfo_class; -static jmethodID s_MemoryCardFileInfo_constructor; - -namespace AndroidHelpers { -JavaVM* GetJavaVM() -{ - return s_jvm; -} - -// helper for retrieving the current per-thread jni environment -JNIEnv* GetJNIEnv() -{ - JNIEnv* env; - if (s_jvm->GetEnv(reinterpret_cast<void**>(&env), JNI_VERSION_1_6) != JNI_OK) - return nullptr; - else - return env; -} - -AndroidHostInterface* GetNativeClass(JNIEnv* env, jobject obj) -{ - return reinterpret_cast<AndroidHostInterface*>( - static_cast<uintptr_t>(env->GetLongField(obj, s_AndroidHostInterface_field_mNativePointer))); -} - -std::string JStringToString(JNIEnv* env, jstring str) -{ - if (str == nullptr) - return {}; - - jsize length = env->GetStringUTFLength(str); - if (length == 0) - return {}; - - const char* data = env->GetStringUTFChars(str, nullptr); - Assert(data != nullptr); - - std::string ret(data, length); - env->ReleaseStringUTFChars(str, data); - - return ret; -} - -jclass GetStringClass() -{ - return s_String_class; -} - -std::unique_ptr<GrowableMemoryByteStream> ReadInputStreamToMemory(JNIEnv* env, jobject obj, u32 chunk_size /* = 65536*/) -{ - std::unique_ptr<GrowableMemoryByteStream> bs = std::make_unique<GrowableMemoryByteStream>(nullptr, 0); - u32 position = 0; - - jclass cls = env->GetObjectClass(obj); - jmethodID read_method = env->GetMethodID(cls, "read", "([B)I"); - Assert(read_method); - - jbyteArray temp = env->NewByteArray(chunk_size); - for (;;) - { - int bytes_read = env->CallIntMethod(obj, read_method, temp); - if (bytes_read <= 0) - break; - - if ((position + static_cast<u32>(bytes_read)) > bs->GetMemorySize()) - { - const u32 new_size = std::max<u32>(bs->GetMemorySize() * 2, position + static_cast<u32>(bytes_read)); - bs->ResizeMemory(new_size); - } - - env->GetByteArrayRegion(temp, 0, bytes_read, reinterpret_cast<jbyte*>(bs->GetMemoryPointer() + position)); - position += static_cast<u32>(bytes_read); - } - - bs->Resize(position); - env->DeleteLocalRef(temp); - env->DeleteLocalRef(cls); - return bs; -} - -std::vector<u8> ByteArrayToVector(JNIEnv* env, jbyteArray obj) -{ - std::vector<u8> ret; - const jsize size = obj ? env->GetArrayLength(obj) : 0; - if (size > 0) - { - jbyte* data = env->GetByteArrayElements(obj, nullptr); - ret.resize(static_cast<size_t>(size)); - std::memcpy(ret.data(), data, ret.size()); - env->ReleaseByteArrayElements(obj, data, 0); - } - - return ret; -} - -jbyteArray NewByteArray(JNIEnv* env, const void* data, size_t size) -{ - if (!data || size == 0) - return nullptr; - - jbyteArray obj = env->NewByteArray(static_cast<jsize>(size)); - jbyte* obj_data = env->GetByteArrayElements(obj, nullptr); - std::memcpy(obj_data, data, static_cast<size_t>(static_cast<jsize>(size))); - env->ReleaseByteArrayElements(obj, obj_data, 0); - return obj; -} - -jbyteArray VectorToByteArray(JNIEnv* env, const std::vector<u8>& data) -{ - if (data.empty()) - return nullptr; - - return NewByteArray(env, data.data(), data.size()); -} - -jobjectArray CreateObjectArray(JNIEnv* env, jclass object_class, const jobject* objects, size_t num_objects, - bool release_refs /* = false*/) -{ - if (!objects || num_objects == 0) - return nullptr; - - jobjectArray arr = env->NewObjectArray(static_cast<jsize>(num_objects), object_class, nullptr); - for (jsize i = 0; i < static_cast<jsize>(num_objects); i++) - { - env->SetObjectArrayElement(arr, i, objects[i]); - if (release_refs && objects[i]) - env->DeleteLocalRef(objects[i]); - } - - return arr; -} -} // namespace AndroidHelpers - -AndroidHostInterface::AndroidHostInterface(jobject java_object, jobject context_object, std::string user_directory) - : m_java_object(java_object) -{ - m_user_directory = std::move(user_directory); - m_settings_interface = std::make_unique<AndroidSettingsInterface>(context_object); -} - -AndroidHostInterface::~AndroidHostInterface() -{ - ImGui::DestroyContext(); - AndroidHelpers::GetJNIEnv()->DeleteGlobalRef(m_java_object); -} - -bool AndroidHostInterface::Initialize() -{ - if (!CommonHostInterface::Initialize()) - return false; - - return true; -} - -void AndroidHostInterface::Shutdown() -{ - HostInterface::Shutdown(); -} - -const char* AndroidHostInterface::GetFrontendName() const -{ - return "DuckStation Android"; -} - -void AndroidHostInterface::RequestExit() -{ - ReportError("Ignoring RequestExit()"); -} - -void AndroidHostInterface::ReportError(const char* message) -{ - CommonHostInterface::ReportError(message); - - JNIEnv* env = AndroidHelpers::GetJNIEnv(); - jstring message_jstr = env->NewStringUTF(message); - if (m_emulation_activity_object) - env->CallVoidMethod(m_emulation_activity_object, s_EmulationActivity_method_reportError, message_jstr); - else - env->CallVoidMethod(m_java_object, s_AndroidHostInterface_method_reportError, message_jstr); - env->DeleteLocalRef(message_jstr); -} - -void AndroidHostInterface::ReportMessage(const char* message) -{ - CommonHostInterface::ReportMessage(message); - - if (IsOnEmulationThread()) - { - // The toasts are not visible when the emulation activity is running anyway. - AddOSDMessage(message, 5.0f); - } - else - { - JNIEnv* env = AndroidHelpers::GetJNIEnv(); - LocalRefHolder<jstring> message_jstr(env, env->NewStringUTF(message)); - env->CallVoidMethod(m_java_object, s_AndroidHostInterface_method_reportMessage, message_jstr.Get()); - } -} - -std::unique_ptr<ByteStream> AndroidHostInterface::OpenPackageFile(const char* path, u32 flags) -{ - Log_DevPrintf("OpenPackageFile(%s, %x)", path, flags); - if (flags & (BYTESTREAM_OPEN_CREATE | BYTESTREAM_OPEN_WRITE)) - return {}; - - JNIEnv* env = AndroidHelpers::GetJNIEnv(); - jobject stream = - env->CallObjectMethod(m_java_object, s_AndroidHostInterface_method_openAssetStream, env->NewStringUTF(path)); - if (!stream) - { - Log_ErrorPrintf("Package file '%s' not found", path); - return {}; - } - - std::unique_ptr<ByteStream> ret(AndroidHelpers::ReadInputStreamToMemory(env, stream, 65536)); - env->DeleteLocalRef(stream); - return ret; -} - -void AndroidHostInterface::RegisterHotkeys() -{ - RegisterHotkey(StaticString(TRANSLATABLE("Hotkeys", "General")), StaticString("OpenPauseMenu"), - StaticString(TRANSLATABLE("Hotkeys", "Open Pause Menu")), [this](bool pressed) { - if (pressed) - { - AndroidHelpers::GetJNIEnv()->CallVoidMethod(m_emulation_activity_object, - s_EmulationActivity_method_openPauseMenu); - } - }); - - CommonHostInterface::RegisterHotkeys(); -} - -float AndroidHostInterface::GetRefreshRate() const -{ - if (!m_emulation_activity_object) - return 0.0f; - - const float value = AndroidHelpers::GetJNIEnv()->CallFloatMethod(m_emulation_activity_object, - s_EmulationActivity_method_getRefreshRate); - return (value > 0.0f) ? value : 0.0f; -} - -float AndroidHostInterface::GetSurfaceScale(int width, int height) const -{ - if (width <= 0 || height <= 0) - return 1.0f; - - // TODO: Really need a better way of determining this. - return (width > height) ? (static_cast<float>(width) / 1280.0f) : (static_cast<float>(height) / 1280.0f); -} - -void AndroidHostInterface::SetUserDirectory() -{ - // Already set in constructor. - Assert(!m_user_directory.empty()); -} - -void AndroidHostInterface::LoadSettings(SettingsInterface& si) -{ - const GPURenderer old_renderer = g_settings.gpu_renderer; - CommonHostInterface::LoadSettings(si); - - const std::string msaa_str = si.GetStringValue("GPU", "MSAA", "1"); - g_settings.gpu_multisamples = std::max<u32>(StringUtil::FromChars<u32>(msaa_str).value_or(1), 1); - g_settings.gpu_per_sample_shading = StringUtil::EndsWith(msaa_str, "-ssaa"); - - // turn percentage into fraction for overclock - const u32 overclock_percent = static_cast<u32>(std::max(si.GetIntValue("CPU", "Overclock", 100), 1)); - Settings::CPUOverclockPercentToFraction(overclock_percent, &g_settings.cpu_overclock_numerator, - &g_settings.cpu_overclock_denominator); - g_settings.cpu_overclock_enable = (overclock_percent != 100); - g_settings.UpdateOverclockActive(); - - m_vibration_enabled = si.GetBoolValue("Controller1", "Vibration", false); - - // Defer renderer changes, the app really doesn't like it. - if (System::IsValid() && g_settings.gpu_renderer != old_renderer) - { - AddFormattedOSDMessage(5.0f, - TranslateString("OSDMessage", "Change to %s GPU renderer will take effect on restart."), - Settings::GetRendererName(g_settings.gpu_renderer)); - g_settings.gpu_renderer = old_renderer; - } -} - -void AndroidHostInterface::UpdateInputMap(SettingsInterface& si) -{ - if (m_emulation_activity_object) - { - JNIEnv* env = AndroidHelpers::GetJNIEnv(); - DebugAssert(env); - - std::vector<std::string> device_names; - - jobjectArray const java_names = reinterpret_cast<jobjectArray>( - env->CallObjectMethod(m_emulation_activity_object, s_EmulationActivity_method_getInputDeviceNames)); - if (java_names) - { - const u32 count = static_cast<u32>(env->GetArrayLength(java_names)); - for (u32 i = 0; i < count; i++) - { - device_names.push_back( - AndroidHelpers::JStringToString(env, reinterpret_cast<jstring>(env->GetObjectArrayElement(java_names, i)))); - } - - env->DeleteLocalRef(java_names); - } - - if (m_controller_interface) - { - AndroidControllerInterface* ci = static_cast<AndroidControllerInterface*>(m_controller_interface.get()); - if (ci) - { - ci->SetDeviceNames(std::move(device_names)); - for (u32 i = 0; i < ci->GetControllerCount(); i++) - { - const bool has_vibration = env->CallBooleanMethod( - m_emulation_activity_object, s_EmulationActivity_method_hasInputDeviceVibration, static_cast<jint>(i)); - ci->SetDeviceRumble(i, has_vibration); - } - } - } - } - - CommonHostInterface::UpdateInputMap(si); -} - -bool AndroidHostInterface::IsEmulationThreadPaused() const -{ - return System::IsValid() && System::IsPaused(); -} - -void AndroidHostInterface::PauseEmulationThread(bool paused) -{ - Assert(IsEmulationThreadRunning()); - RunOnEmulationThread([this, paused]() { PauseSystem(paused); }); -} - -void AndroidHostInterface::StopEmulationThreadLoop() -{ - if (!IsEmulationThreadRunning()) - return; - - std::unique_lock<std::mutex> lock(m_mutex); - m_emulation_thread_stop_request.store(true); - m_sleep_cv.notify_one(); -} - -bool AndroidHostInterface::IsOnEmulationThread() const -{ - return std::this_thread::get_id() == m_emulation_thread_id; -} - -void AndroidHostInterface::RunOnEmulationThread(std::function<void()> function, bool blocking) -{ - if (!IsEmulationThreadRunning()) - { - function(); - return; - } - - m_mutex.lock(); - m_callback_queue.push_back(std::move(function)); - m_callbacks_outstanding.store(true); - m_sleep_cv.notify_one(); - - if (blocking) - { - // TODO: Don't spin - for (;;) - { - if (!m_callbacks_outstanding.load()) - break; - - m_mutex.unlock(); - m_mutex.lock(); - } - } - - m_mutex.unlock(); -} - -void AndroidHostInterface::RunLater(std::function<void()> func) -{ - std::unique_lock<std::mutex> lock(m_mutex); - m_callback_queue.push_back(std::move(func)); - m_callbacks_outstanding.store(true); -} - -void AndroidHostInterface::EmulationThreadEntryPoint(JNIEnv* env, jobject emulation_activity, - SystemBootParameters boot_params, bool resume_state) -{ - if (!m_surface) - { - Log_ErrorPrint("Emulation thread started without surface set."); - env->CallVoidMethod(emulation_activity, s_EmulationActivity_method_onEmulationStopped); - return; - } - - emulation_activity = env->NewGlobalRef(emulation_activity); - Assert(emulation_activity != nullptr); - - { - std::unique_lock<std::mutex> lock(m_mutex); - m_emulation_thread_running.store(true); - m_emulation_activity_object = emulation_activity; - m_emulation_thread_id = std::this_thread::get_id(); - env->SetObjectField(m_java_object, s_AndroidHostInterface_field_mEmulationActivity, emulation_activity); - } - - ApplySettings(true); - - // Boot system. - bool boot_result = false; - if (resume_state && boot_params.filename.empty()) - boot_result = ResumeSystemFromMostRecentState(); - else if (resume_state && CanResumeSystemFromFile(boot_params.filename.c_str())) - boot_result = ResumeSystemFromState(boot_params.filename.c_str(), true); - else - boot_result = BootSystem(boot_params); - - if (boot_result) - { - // System is ready to go. - EmulationThreadLoop(env); - PowerOffSystem(ShouldSaveResumeState()); - } - - // Drain any callbacks so we don't leave things in a screwed-up state for next boot. - { - std::unique_lock<std::mutex> lock(m_mutex); - while (!m_callback_queue.empty()) - { - auto callback = std::move(m_callback_queue.front()); - m_callback_queue.pop_front(); - lock.unlock(); - callback(); - lock.lock(); - } - env->SetObjectField(m_java_object, s_AndroidHostInterface_field_mEmulationActivity, nullptr); - m_emulation_thread_running.store(false); - m_emulation_thread_id = {}; - m_emulation_activity_object = {}; - m_callbacks_outstanding.store(false); - } - - env->CallVoidMethod(emulation_activity, s_EmulationActivity_method_onEmulationStopped); - env->DeleteGlobalRef(emulation_activity); -} - -void AndroidHostInterface::EmulationThreadLoop(JNIEnv* env) -{ - env->CallVoidMethod(m_emulation_activity_object, s_EmulationActivity_method_onEmulationStarted); - - for (;;) - { - // run any events - { - std::unique_lock<std::mutex> lock(m_mutex); - for (;;) - { - if (!m_callback_queue.empty()) - { - do - { - auto callback = std::move(m_callback_queue.front()); - m_callback_queue.pop_front(); - lock.unlock(); - callback(); - lock.lock(); - } while (!m_callback_queue.empty()); - m_callbacks_outstanding.store(false); - } - - if (m_emulation_thread_stop_request.load()) - { - m_emulation_thread_stop_request.store(false); - return; - } - - if (System::IsPaused()) - { - // paused, wait for us to resume - m_sleep_cv.wait(lock); - } - else - { - // done with callbacks, run the frame - break; - } - } - } - - // we don't do a full PollAndUpdate() here - if (Cheevos::IsActive()) - Cheevos::Update(); - - // simulate the system if not paused - if (System::IsRunning()) - { - if (m_throttler_enabled) - System::RunFrames(); - else - System::RunFrame(); - - UpdateControllerMetaState(); - if (m_vibration_enabled) - UpdateVibration(); - } - - // rendering - { - ImGui::NewFrame(); - DrawImGuiWindows(); - - m_display->Render(); - ImGui::EndFrame(); - - if (System::IsRunning()) - { - System::UpdatePerformanceCounters(); - - if (m_throttler_enabled) - System::Throttle(); - } - } - } -} - -bool AndroidHostInterface::AcquireHostDisplay() -{ - WindowInfo wi; - wi.type = WindowInfo::Type::Android; - wi.window_handle = m_surface; - wi.surface_width = ANativeWindow_getWidth(m_surface); - wi.surface_height = ANativeWindow_getHeight(m_surface); - wi.surface_refresh_rate = GetRefreshRate(); - wi.surface_scale = GetSurfaceScale(wi.surface_width, wi.surface_height); - - switch (g_settings.gpu_renderer) - { - case GPURenderer::HardwareVulkan: - m_display = std::make_unique<FrontendCommon::VulkanHostDisplay>(); - break; - - case GPURenderer::HardwareOpenGL: - default: - m_display = std::make_unique<FrontendCommon::OpenGLHostDisplay>(); - break; - } - - if (!m_display->CreateRenderDevice(wi, {}, g_settings.gpu_use_debug_device, g_settings.gpu_threaded_presentation) || - !m_display->InitializeRenderDevice(GetShaderCacheBasePath(), g_settings.gpu_use_debug_device, - g_settings.gpu_threaded_presentation)) - { - m_display->DestroyRenderDevice(); - m_display.reset(); - return false; - } - - // The alignment was set prior to booting. - m_display->SetDisplayAlignment(m_display_alignment); - - if (!CreateHostDisplayResources()) - { - ReportError("Failed to create host display resources"); - ReleaseHostDisplay(); - return false; - } - - return true; -} - -void AndroidHostInterface::ReleaseHostDisplay() -{ - ReleaseHostDisplayResources(); - if (m_display) - { - m_display->DestroyRenderDevice(); - m_display.reset(); - } -} - -std::unique_ptr<AudioStream> AndroidHostInterface::CreateAudioStream(AudioBackend backend) -{ -#ifdef USE_OPENSLES - if (backend == AudioBackend::OpenSLES) - return OpenSLESAudioStream::Create(); -#endif - - return CommonHostInterface::CreateAudioStream(backend); -} - -void AndroidHostInterface::UpdateControllerInterface() -{ - if (m_controller_interface) - { - m_controller_interface->Shutdown(); - m_controller_interface.reset(); - } - - m_controller_interface = std::make_unique<AndroidControllerInterface>(); - if (!m_controller_interface || !m_controller_interface->Initialize(this)) - { - Log_WarningPrintf("Failed to initialize controller interface, bindings are not possible."); - if (m_controller_interface) - { - m_controller_interface->Shutdown(); - m_controller_interface.reset(); - } - } -} - -void AndroidHostInterface::OnSystemPaused(bool paused) -{ - CommonHostInterface::OnSystemPaused(paused); - - if (m_vibration_enabled) - SetVibration(false); -} - -void AndroidHostInterface::OnSystemDestroyed() -{ - CommonHostInterface::OnSystemDestroyed(); - ClearOSDMessages(); - - if (m_vibration_enabled) - SetVibration(false); -} - -void AndroidHostInterface::OnRunningGameChanged(const std::string& path, CDImage* image, const std::string& game_code, - const std::string& game_title) -{ - CommonHostInterface::OnRunningGameChanged(path, image, game_code, game_title); - - if (m_emulation_activity_object) - { - JNIEnv* env = AndroidHelpers::GetJNIEnv(); - - jstring path_string = env->NewStringUTF(path.c_str()); - jstring code_string = env->NewStringUTF(game_code.c_str()); - jstring title_string = env->NewStringUTF(game_title.c_str()); - - const GameListEntry* game_list_entry = m_game_list->GetEntryForPath(path.c_str()); - std::string cover_path_str; - if (game_list_entry) - cover_path_str = m_game_list->GetCoverImagePathForEntry(game_list_entry); - else - cover_path_str = m_game_list->GetCoverImagePath(path, game_code, game_title); - - jstring cover_path = nullptr; - if (!cover_path_str.empty()) - cover_path = env->NewStringUTF(cover_path_str.c_str()); - - env->CallVoidMethod(m_emulation_activity_object, s_EmulationActivity_method_onRunningGameChanged, path_string, - code_string, title_string, cover_path); - - if (cover_path) - env->DeleteLocalRef(cover_path); - env->DeleteLocalRef(title_string); - env->DeleteLocalRef(code_string); - env->DeleteLocalRef(path_string); - } -} - -void AndroidHostInterface::SurfaceChanged(ANativeWindow* surface, int format, int width, int height) -{ - Log_InfoPrintf("SurfaceChanged %p %d %d %d", surface, format, width, height); - if (m_surface == surface) - { - if (m_display && (width != m_display->GetWindowWidth() || height != m_display->GetWindowHeight())) - { - m_display->ResizeRenderWindow(width, height); - OnHostDisplayResized(); - } - - return; - } - - m_surface = surface; - - if (m_display) - { - WindowInfo wi; - wi.type = surface ? WindowInfo::Type::Android : WindowInfo::Type::Surfaceless; - wi.window_handle = surface; - wi.surface_width = width; - wi.surface_height = height; - wi.surface_refresh_rate = GetRefreshRate(); - wi.surface_scale = GetSurfaceScale(width, height); - - const bool surface_valid = m_display->ChangeRenderWindow(wi) && surface; - if (surface_valid) - OnHostDisplayResized(); - - if (surface_valid && System::GetState() == System::State::Paused) - PauseSystem(false); - else if (!surface_valid && System::IsRunning()) - PauseSystem(true); - } -} - -void AndroidHostInterface::SetDisplayAlignment(HostDisplay::Alignment alignment) -{ - m_display_alignment = alignment; - if (m_display) - m_display->SetDisplayAlignment(alignment); -} - -void AndroidHostInterface::SetControllerButtonState(u32 index, s32 button_code, bool pressed) -{ - if (!IsEmulationThreadRunning()) - return; - - RunOnEmulationThread( - [index, button_code, pressed]() { - Controller* controller = System::GetController(index); - if (!controller) - return; - - controller->SetButtonState(button_code, pressed); - }, - false); -} - -void AndroidHostInterface::SetControllerAxisState(u32 index, s32 button_code, float value) -{ - if (!IsEmulationThreadRunning()) - return; - - RunOnEmulationThread( - [index, button_code, value]() { - Controller* controller = System::GetController(index); - if (!controller) - return; - - controller->SetAxisState(button_code, value); - }, - false); -} - -void AndroidHostInterface::HandleControllerButtonEvent(u32 controller_index, u32 button_index, bool pressed) -{ - if (!IsEmulationThreadRunning()) - return; - - RunOnEmulationThread([this, controller_index, button_index, pressed]() { - AndroidControllerInterface* ci = static_cast<AndroidControllerInterface*>(m_controller_interface.get()); - if (ci) - ci->HandleButtonEvent(controller_index, button_index, pressed); - }); -} - -void AndroidHostInterface::HandleControllerAxisEvent(u32 controller_index, u32 axis_index, float value) -{ - if (!IsEmulationThreadRunning()) - return; - - RunOnEmulationThread([this, controller_index, axis_index, value]() { - AndroidControllerInterface* ci = static_cast<AndroidControllerInterface*>(m_controller_interface.get()); - if (ci) - ci->HandleAxisEvent(controller_index, axis_index, value); - }); -} - -bool AndroidHostInterface::HasControllerButtonBinding(u32 controller_index, u32 button) -{ - AndroidControllerInterface* ci = static_cast<AndroidControllerInterface*>(m_controller_interface.get()); - if (!ci) - return false; - - return ci->HasButtonBinding(controller_index, button); -} - -void AndroidHostInterface::SetControllerVibration(u32 controller_index, float small_motor, float large_motor) -{ - if (!m_emulation_activity_object) - return; - - JNIEnv* env = AndroidHelpers::GetJNIEnv(); - DebugAssert(env); - - env->CallVoidMethod(m_emulation_activity_object, s_EmulationActivity_method_setInputDeviceVibration, - static_cast<jint>(controller_index), static_cast<jfloat>(small_motor), - static_cast<jfloat>(large_motor)); -} - -void AndroidHostInterface::SetFastForwardEnabled(bool enabled) -{ - m_fast_forward_enabled = enabled; - UpdateSpeedLimiterState(); -} - -void AndroidHostInterface::RefreshGameList(bool invalidate_cache, bool invalidate_database, - ProgressCallback* progress_callback) -{ - m_game_list->SetSearchDirectoriesFromSettings(*m_settings_interface); - m_game_list->Refresh(invalidate_cache, invalidate_database, progress_callback); -} - -bool AndroidHostInterface::ImportPatchCodesFromString(const std::string& str) -{ - CheatList* cl = new CheatList(); - if (!cl->LoadFromString(str, CheatList::Format::Autodetect) || cl->GetCodeCount() == 0) - return false; - - RunOnEmulationThread([this, cl]() { - u32 imported_count; - if (!System::HasCheatList()) - { - imported_count = cl->GetCodeCount(); - System::SetCheatList(std::unique_ptr<CheatList>(cl)); - } - else - { - const u32 old_count = System::GetCheatList()->GetCodeCount(); - System::GetCheatList()->MergeList(*cl); - imported_count = System::GetCheatList()->GetCodeCount() - old_count; - delete cl; - } - - AddFormattedOSDMessage(20.0f, "Imported %u patch codes.", imported_count); - CommonHostInterface::SaveCheatList(); - }); - - return true; -} - -void AndroidHostInterface::SetVibration(bool enabled) -{ - const u64 current_time = Common::Timer::GetValue(); - if (Common::Timer::ConvertValueToSeconds(current_time - m_last_vibration_update_time) < 0.1f && - m_last_vibration_state == enabled) - { - return; - } - - m_last_vibration_state = enabled; - m_last_vibration_update_time = current_time; - - JNIEnv* env = AndroidHelpers::GetJNIEnv(); - if (m_emulation_activity_object) - { - env->CallVoidMethod(m_emulation_activity_object, s_EmulationActivity_method_setVibration, - static_cast<jboolean>(enabled)); - } -} - -void AndroidHostInterface::UpdateVibration() -{ - static constexpr float THRESHOLD = 0.5f; - - bool vibration_state = false; - - for (u32 i = 0; i < NUM_CONTROLLER_AND_CARD_PORTS; i++) - { - Controller* controller = System::GetController(i); - if (!controller) - continue; - - const u32 motors = controller->GetVibrationMotorCount(); - for (u32 j = 0; j < motors; j++) - { - if (controller->GetVibrationMotorStrength(j) >= THRESHOLD) - { - vibration_state = true; - break; - } - } - } - - SetVibration(vibration_state); -} - -jobjectArray AndroidHostInterface::GetInputProfileNames(JNIEnv* env) const -{ - const InputProfileList profile_list(GetInputProfileList()); - if (profile_list.empty()) - return nullptr; - - jobjectArray name_array = env->NewObjectArray(static_cast<u32>(profile_list.size()), s_String_class, nullptr); - u32 name_array_index = 0; - Assert(name_array != nullptr); - for (const InputProfileEntry& e : profile_list) - { - jstring axis_name_jstr = env->NewStringUTF(e.name.c_str()); - env->SetObjectArrayElement(name_array, name_array_index++, axis_name_jstr); - env->DeleteLocalRef(axis_name_jstr); - } - - return name_array; -} - -extern "C" jint JNI_OnLoad(JavaVM* vm, void* reserved) -{ - Log::SetDebugOutputParams(true, nullptr, LOGLEVEL_DEV); - s_jvm = vm; - - // Create global reference so it doesn't get cleaned up. - JNIEnv* env = AndroidHelpers::GetJNIEnv(); - jclass string_class, host_interface_class, patch_code_class, game_list_entry_class, save_state_info_class, - achievement_class, memory_card_file_info_class; - if ((string_class = env->FindClass("java/lang/String")) == nullptr || - (s_String_class = static_cast<jclass>(env->NewGlobalRef(string_class))) == nullptr || - (host_interface_class = env->FindClass("com/github/stenzek/duckstation/AndroidHostInterface")) == nullptr || - (s_AndroidHostInterface_class = static_cast<jclass>(env->NewGlobalRef(host_interface_class))) == nullptr || - (patch_code_class = env->FindClass("com/github/stenzek/duckstation/PatchCode")) == nullptr || - (s_PatchCode_class = static_cast<jclass>(env->NewGlobalRef(patch_code_class))) == nullptr || - (game_list_entry_class = env->FindClass("com/github/stenzek/duckstation/GameListEntry")) == nullptr || - (s_GameListEntry_class = static_cast<jclass>(env->NewGlobalRef(game_list_entry_class))) == nullptr || - (save_state_info_class = env->FindClass("com/github/stenzek/duckstation/SaveStateInfo")) == nullptr || - (s_SaveStateInfo_class = static_cast<jclass>(env->NewGlobalRef(save_state_info_class))) == nullptr || - (achievement_class = env->FindClass("com/github/stenzek/duckstation/Achievement")) == nullptr || - (s_Achievement_class = static_cast<jclass>(env->NewGlobalRef(achievement_class))) == nullptr || - (memory_card_file_info_class = env->FindClass("com/github/stenzek/duckstation/MemoryCardFileInfo")) == nullptr || - (s_MemoryCardFileInfo_class = static_cast<jclass>(env->NewGlobalRef(memory_card_file_info_class))) == nullptr) - { - Log_ErrorPrint("AndroidHostInterface class lookup failed"); - return -1; - } - - env->DeleteLocalRef(string_class); - env->DeleteLocalRef(host_interface_class); - env->DeleteLocalRef(patch_code_class); - env->DeleteLocalRef(game_list_entry_class); - env->DeleteLocalRef(achievement_class); - env->DeleteLocalRef(memory_card_file_info_class); - - jclass emulation_activity_class; - if ((s_AndroidHostInterface_constructor = - env->GetMethodID(s_AndroidHostInterface_class, "<init>", - "(Landroid/content/Context;Lcom/github/stenzek/duckstation/FileHelper;)V")) == nullptr || - (s_AndroidHostInterface_field_mNativePointer = - env->GetFieldID(s_AndroidHostInterface_class, "mNativePointer", "J")) == nullptr || - (s_AndroidHostInterface_field_mEmulationActivity = - env->GetFieldID(s_AndroidHostInterface_class, "mEmulationActivity", - "Lcom/github/stenzek/duckstation/EmulationActivity;")) == nullptr || - (s_AndroidHostInterface_method_reportError = - env->GetMethodID(s_AndroidHostInterface_class, "reportError", "(Ljava/lang/String;)V")) == nullptr || - (s_AndroidHostInterface_method_reportMessage = - env->GetMethodID(s_AndroidHostInterface_class, "reportMessage", "(Ljava/lang/String;)V")) == nullptr || - (s_AndroidHostInterface_method_openAssetStream = env->GetMethodID( - s_AndroidHostInterface_class, "openAssetStream", "(Ljava/lang/String;)Ljava/io/InputStream;")) == nullptr || - (emulation_activity_class = env->FindClass("com/github/stenzek/duckstation/EmulationActivity")) == nullptr || - (s_EmulationActivity_class = static_cast<jclass>(env->NewGlobalRef(emulation_activity_class))) == nullptr || - (s_EmulationActivity_method_reportError = - env->GetMethodID(s_EmulationActivity_class, "reportError", "(Ljava/lang/String;)V")) == nullptr || - (s_EmulationActivity_method_onEmulationStarted = - env->GetMethodID(s_EmulationActivity_class, "onEmulationStarted", "()V")) == nullptr || - (s_EmulationActivity_method_onEmulationStopped = - env->GetMethodID(s_EmulationActivity_class, "onEmulationStopped", "()V")) == nullptr || - (s_EmulationActivity_method_onRunningGameChanged = - env->GetMethodID(s_EmulationActivity_class, "onRunningGameChanged", - "(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)V")) == nullptr || - (s_EmulationActivity_method_setVibration = env->GetMethodID(emulation_activity_class, "setVibration", "(Z)V")) == - nullptr || - (s_EmulationActivity_method_getRefreshRate = - env->GetMethodID(emulation_activity_class, "getRefreshRate", "()F")) == nullptr || - (s_EmulationActivity_method_openPauseMenu = env->GetMethodID(emulation_activity_class, "openPauseMenu", "()V")) == - nullptr || - (s_EmulationActivity_method_getInputDeviceNames = - env->GetMethodID(s_EmulationActivity_class, "getInputDeviceNames", "()[Ljava/lang/String;")) == nullptr || - (s_EmulationActivity_method_hasInputDeviceVibration = - env->GetMethodID(s_EmulationActivity_class, "hasInputDeviceVibration", "(I)Z")) == nullptr || - (s_EmulationActivity_method_setInputDeviceVibration = - env->GetMethodID(s_EmulationActivity_class, "setInputDeviceVibration", "(IFF)V")) == nullptr || - (s_PatchCode_constructor = - env->GetMethodID(s_PatchCode_class, "<init>", "(ILjava/lang/String;Ljava/lang/String;Z)V")) == nullptr || - (s_GameListEntry_constructor = - env->GetMethodID(s_GameListEntry_class, "<init>", - "(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;JLjava/lang/String;Ljava/lang/" - "String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)V")) == nullptr || - (s_SaveStateInfo_constructor = env->GetMethodID( - s_SaveStateInfo_class, "<init>", - "(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;IZII[B)V")) == - nullptr || - (s_Achievement_constructor = env->GetMethodID( - s_Achievement_class, "<init>", - "(ILjava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;IZ)V")) == nullptr || - (s_MemoryCardFileInfo_constructor = env->GetMethodID(s_MemoryCardFileInfo_class, "<init>", - "(Ljava/lang/String;Ljava/lang/String;III[[B)V")) == nullptr) - { - Log_ErrorPrint("AndroidHostInterface lookups failed"); - return -1; - } - - env->DeleteLocalRef(emulation_activity_class); - - return JNI_VERSION_1_6; -} - -#define DEFINE_JNI_METHOD(return_type, name) \ - extern "C" JNIEXPORT return_type JNICALL Java_com_github_stenzek_duckstation_##name(JNIEnv* env) - -#define DEFINE_JNI_ARGS_METHOD(return_type, name, ...) \ - extern "C" JNIEXPORT return_type JNICALL Java_com_github_stenzek_duckstation_##name(JNIEnv* env, __VA_ARGS__) - -DEFINE_JNI_ARGS_METHOD(jstring, AndroidHostInterface_getScmVersion, jobject unused) -{ - return env->NewStringUTF(g_scm_tag_str); -} - -DEFINE_JNI_ARGS_METHOD(jstring, AndroidHostInterface_getFullScmVersion, jobject unused) -{ - return env->NewStringUTF(SmallString::FromFormat("DuckStation for Android %s (%s)\nBuilt %s %s", g_scm_tag_str, - g_scm_branch_str, __DATE__, __TIME__)); -} - -DEFINE_JNI_ARGS_METHOD(void, AndroidHostInterface_setThreadAffinity, jobject unused, jintArray cores) -{ - // https://github.com/googlearchive/android-audio-high-performance/blob/c232c21bf35d3bfea16537b781c526b8abdcc3cf/SimpleSynth/app/src/main/cpp/audio_player.cc - int length = env->GetArrayLength(cores); - int* p_cores = env->GetIntArrayElements(cores, nullptr); - - pid_t current_thread_id = gettid(); - cpu_set_t cpu_set; - CPU_ZERO(&cpu_set); - for (int i = 0; i < length; i++) - { - Log_InfoPrintf("Binding to CPU %d", p_cores[i]); - CPU_SET(p_cores[i], &cpu_set); - } - - int result = sched_setaffinity(current_thread_id, sizeof(cpu_set_t), &cpu_set); - if (result != 0) - Log_InfoPrintf("Thread affinity set."); - else - Log_ErrorPrintf("Error setting thread affinity: %d", result); - - env->ReleaseIntArrayElements(cores, p_cores, 0); -} - -DEFINE_JNI_ARGS_METHOD(jobject, AndroidHostInterface_create, jobject unused, jobject context_object, - jobject file_helper_object, jstring user_directory) -{ - Log::SetDebugOutputParams(true, nullptr, LOGLEVEL_DEBUG); - - // initialize the java side - jobject java_obj = env->NewObject(s_AndroidHostInterface_class, s_AndroidHostInterface_constructor, context_object, - file_helper_object); - if (!java_obj) - { - Log_ErrorPrint("Failed to create Java AndroidHostInterface"); - return nullptr; - } - - jobject java_obj_ref = env->NewGlobalRef(java_obj); - Assert(java_obj_ref != nullptr); - - // initialize the C++ side - std::string user_directory_str = AndroidHelpers::JStringToString(env, user_directory); - AndroidHostInterface* cpp_obj = new AndroidHostInterface(java_obj_ref, context_object, std::move(user_directory_str)); - if (!cpp_obj->Initialize()) - { - // TODO: Do we need to release the original java object reference? - Log_ErrorPrint("Failed to create C++ AndroidHostInterface"); - env->DeleteGlobalRef(java_obj_ref); - return nullptr; - } - - env->SetLongField(java_obj, s_AndroidHostInterface_field_mNativePointer, - static_cast<long>(reinterpret_cast<uintptr_t>(cpp_obj))); - - FileSystem::SetAndroidFileHelper(s_jvm, env, file_helper_object); - return java_obj; -} - -DEFINE_JNI_ARGS_METHOD(jboolean, AndroidHostInterface_isEmulationThreadRunning, jobject obj) -{ - return AndroidHelpers::GetNativeClass(env, obj)->IsEmulationThreadRunning(); -} - -DEFINE_JNI_ARGS_METHOD(void, AndroidHostInterface_runEmulationThread, jobject obj, jobject emulationActivity, - jstring filename, jboolean resume_state, jstring state_filename) -{ - std::string state_filename_str = AndroidHelpers::JStringToString(env, state_filename); - - SystemBootParameters boot_params; - boot_params.filename = AndroidHelpers::JStringToString(env, filename); - - AndroidHelpers::GetNativeClass(env, obj)->EmulationThreadEntryPoint(env, emulationActivity, std::move(boot_params), - resume_state); -} - -DEFINE_JNI_ARGS_METHOD(void, AndroidHostInterface_stopEmulationThreadLoop, jobject obj) -{ - AndroidHelpers::GetNativeClass(env, obj)->StopEmulationThreadLoop(); -} - -DEFINE_JNI_ARGS_METHOD(void, AndroidHostInterface_surfaceChanged, jobject obj, jobject surface, jint format, jint width, - jint height) -{ - ANativeWindow* native_surface = surface ? ANativeWindow_fromSurface(env, surface) : nullptr; - if (surface && !native_surface) - Log_ErrorPrint("ANativeWindow_fromSurface() returned null"); - - if (!surface && System::GetState() == System::State::Starting) - { - // User switched away from the app while it was compiling shaders. - Log_ErrorPrintf("Surface destroyed while starting, cancelling"); - System::CancelPendingStartup(); - } - - // We should wait for the emu to finish if the surface is being destroyed or changed. - AndroidHostInterface* hi = AndroidHelpers::GetNativeClass(env, obj); - const bool block = (!native_surface || native_surface != hi->GetSurface()); - hi->RunOnEmulationThread( - [hi, native_surface, format, width, height]() { hi->SurfaceChanged(native_surface, format, width, height); }, - block); -} - -DEFINE_JNI_ARGS_METHOD(void, AndroidHostInterface_setMousePosition, jobject obj, jint positionX, jint positionY) -{ - HostDisplay* display = AndroidHelpers::GetNativeClass(env, obj)->GetDisplay(); - if (!display) - return; - - // Technically a race, but shouldn't cause any issues. - display->SetMousePosition(positionX, positionY); -} - -DEFINE_JNI_ARGS_METHOD(void, AndroidHostInterface_setControllerButtonState, jobject obj, jint index, jint button_code, - jboolean pressed) -{ - AndroidHelpers::GetNativeClass(env, obj)->SetControllerButtonState(index, button_code, pressed); -} - -DEFINE_JNI_ARGS_METHOD(void, AndroidHostInterface_setControllerAutoFireState, jobject obj, jint controller_index, - jint autofire_index, jboolean active) -{ - AndroidHostInterface* hi = AndroidHelpers::GetNativeClass(env, obj); - if (!hi->IsEmulationThreadRunning()) - return; - - hi->RunOnEmulationThread([hi, controller_index, autofire_index, active]() { - hi->SetControllerAutoFireSlotState(controller_index, autofire_index, active); - }); -} - -DEFINE_JNI_ARGS_METHOD(jint, AndroidHostInterface_getControllerButtonCode, jobject unused, jstring controller_type, - jstring button_name) -{ - std::optional<ControllerType> type = - Settings::ParseControllerTypeName(AndroidHelpers::JStringToString(env, controller_type).c_str()); - if (!type) - return -1; - - std::optional<s32> code = - Controller::GetButtonCodeByName(type.value(), AndroidHelpers::JStringToString(env, button_name)); - return code.value_or(-1); -} - -DEFINE_JNI_ARGS_METHOD(void, AndroidHostInterface_setControllerAxisState, jobject obj, jint index, jint button_code, - jfloat value) -{ - AndroidHelpers::GetNativeClass(env, obj)->SetControllerAxisState(index, button_code, value); -} - -DEFINE_JNI_ARGS_METHOD(jint, AndroidHostInterface_getControllerAxisCode, jobject unused, jstring controller_type, - jstring axis_name) -{ - std::optional<ControllerType> type = - Settings::ParseControllerTypeName(AndroidHelpers::JStringToString(env, controller_type).c_str()); - if (!type) - return -1; - - std::optional<s32> code = - Controller::GetAxisCodeByName(type.value(), AndroidHelpers::JStringToString(env, axis_name)); - return code.value_or(-1); -} - -DEFINE_JNI_ARGS_METHOD(jint, AndroidHostInterface_getControllerAxisType, jobject unused, jstring controller_type, - jstring axis_name) -{ - std::optional<ControllerType> type = - Settings::ParseControllerTypeName(AndroidHelpers::JStringToString(env, controller_type).c_str()); - if (!type) - return -1; - - const std::string axis_name_str(AndroidHelpers::JStringToString(env, axis_name)); - for (const auto& [name, code, type] : Controller::GetAxisNames(type.value())) - { - if (name == axis_name_str) - return static_cast<jint>(type); - } - - return -1; -} - -DEFINE_JNI_ARGS_METHOD(jobjectArray, AndroidHostInterface_getControllerButtonNames, jobject unused, - jstring controller_type) -{ - std::optional<ControllerType> type = - Settings::ParseControllerTypeName(AndroidHelpers::JStringToString(env, controller_type).c_str()); - if (!type) - return nullptr; - - const Controller::ButtonList buttons(Controller::GetButtonNames(type.value())); - if (buttons.empty()) - return nullptr; - - jobjectArray name_array = env->NewObjectArray(static_cast<u32>(buttons.size()), s_String_class, nullptr); - u32 name_array_index = 0; - Assert(name_array != nullptr); - for (const auto& [button_name, button_code] : buttons) - { - jstring button_name_jstr = env->NewStringUTF(button_name.c_str()); - env->SetObjectArrayElement(name_array, name_array_index++, button_name_jstr); - env->DeleteLocalRef(button_name_jstr); - } - - return name_array; -} - -DEFINE_JNI_ARGS_METHOD(jobjectArray, AndroidHostInterface_getControllerAxisNames, jobject unused, - jstring controller_type) -{ - std::optional<ControllerType> type = - Settings::ParseControllerTypeName(AndroidHelpers::JStringToString(env, controller_type).c_str()); - if (!type) - return nullptr; - - const Controller::AxisList axes(Controller::GetAxisNames(type.value())); - if (axes.empty()) - return nullptr; - - jobjectArray name_array = env->NewObjectArray(static_cast<u32>(axes.size()), s_String_class, nullptr); - u32 name_array_index = 0; - Assert(name_array != nullptr); - for (const auto& [axis_name, axis_code, axis_type] : axes) - { - jstring axis_name_jstr = env->NewStringUTF(axis_name.c_str()); - env->SetObjectArrayElement(name_array, name_array_index++, axis_name_jstr); - env->DeleteLocalRef(axis_name_jstr); - } - - return name_array; -} - -DEFINE_JNI_ARGS_METHOD(jint, AndroidHostInterface_getControllerVibrationMotorCount, jobject unused, - jstring controller_type) -{ - std::optional<ControllerType> type = - Settings::ParseControllerTypeName(AndroidHelpers::JStringToString(env, controller_type).c_str()); - if (!type) - return 0; - - return static_cast<jint>(Controller::GetVibrationMotorCount(type.value())); -} - -DEFINE_JNI_ARGS_METHOD(void, AndroidHostInterface_handleControllerButtonEvent, jobject obj, jint controller_index, - jint button_index, jboolean pressed) -{ - AndroidHelpers::GetNativeClass(env, obj)->HandleControllerButtonEvent(static_cast<u32>(controller_index), - static_cast<u32>(button_index), pressed); -} - -DEFINE_JNI_ARGS_METHOD(void, AndroidHostInterface_handleControllerAxisEvent, jobject obj, jint controller_index, - jint axis_index, jfloat value) -{ - AndroidHelpers::GetNativeClass(env, obj)->HandleControllerAxisEvent(static_cast<u32>(controller_index), - static_cast<u32>(axis_index), value); -} - -DEFINE_JNI_ARGS_METHOD(jboolean, AndroidHostInterface_hasControllerButtonBinding, jobject obj, jint controller_index, - jint button_index) -{ - return AndroidHelpers::GetNativeClass(env, obj)->HasControllerButtonBinding(static_cast<u32>(controller_index), - static_cast<u32>(button_index)); -} - -DEFINE_JNI_ARGS_METHOD(jobjectArray, AndroidHostInterface_getInputProfileNames, jobject obj) -{ - AndroidHostInterface* hi = AndroidHelpers::GetNativeClass(env, obj); - return hi->GetInputProfileNames(env); -} - -DEFINE_JNI_ARGS_METHOD(jboolean, AndroidHostInterface_loadInputProfile, jobject obj, jstring name) -{ - AndroidHostInterface* hi = AndroidHelpers::GetNativeClass(env, obj); - const std::string profile_name(AndroidHelpers::JStringToString(env, name)); - if (profile_name.empty()) - return false; - - const std::string profile_path(hi->GetInputProfilePath(profile_name.c_str())); - if (profile_path.empty()) - return false; - - return hi->ApplyInputProfile(profile_path.c_str()); -} - -DEFINE_JNI_ARGS_METHOD(jboolean, AndroidHostInterface_saveInputProfile, jobject obj, jstring name) -{ - AndroidHostInterface* hi = AndroidHelpers::GetNativeClass(env, obj); - const std::string profile_name(AndroidHelpers::JStringToString(env, name)); - if (profile_name.empty()) - return false; - - const std::string profile_path(hi->GetSavePathForInputProfile(profile_name.c_str())); - if (profile_path.empty()) - return false; - - return hi->SaveInputProfile(profile_path.c_str()); -} - -DEFINE_JNI_ARGS_METHOD(void, AndroidHostInterface_refreshGameList, jobject obj, jboolean invalidate_cache, - jboolean invalidate_database, jobject progress_callback) -{ - AndroidProgressCallback cb(env, progress_callback); - AndroidHelpers::GetNativeClass(env, obj)->RefreshGameList(invalidate_cache, invalidate_database, &cb); -} - -static const char* DiscRegionToString(DiscRegion region) -{ - static std::array<const char*, 4> names = {{"NTSC_J", "NTSC_U", "PAL", "Other"}}; - return names[static_cast<int>(region)]; -} - -static jobject CreateGameListEntry(JNIEnv* env, AndroidHostInterface* hi, const GameListEntry& entry) -{ - const Timestamp modified_ts( - Timestamp::FromUnixTimestamp(static_cast<Timestamp::UnixTimestampValue>(entry.last_modified_time))); - const std::string cover_path_str(hi->GetGameList()->GetCoverImagePathForEntry(&entry)); - - jstring path = env->NewStringUTF(entry.path.c_str()); - jstring code = env->NewStringUTF(entry.code.c_str()); - jstring title = env->NewStringUTF(entry.title.c_str()); - jstring region = env->NewStringUTF(DiscRegionToString(entry.region)); - jstring type = env->NewStringUTF(GameList::EntryTypeToString(entry.type)); - jstring compatibility_rating = - env->NewStringUTF(GameList::EntryCompatibilityRatingToString(entry.compatibility_rating)); - jstring cover_path = (cover_path_str.empty()) ? nullptr : env->NewStringUTF(cover_path_str.c_str()); - jstring modified_time = env->NewStringUTF(modified_ts.ToString("%Y/%m/%d, %H:%M:%S")); - jlong size = entry.total_size; - - jobject entry_jobject = env->NewObject(s_GameListEntry_class, s_GameListEntry_constructor, path, code, title, size, - modified_time, region, type, compatibility_rating, cover_path); - - env->DeleteLocalRef(modified_time); - if (cover_path) - env->DeleteLocalRef(cover_path); - env->DeleteLocalRef(compatibility_rating); - env->DeleteLocalRef(type); - env->DeleteLocalRef(region); - env->DeleteLocalRef(title); - env->DeleteLocalRef(code); - env->DeleteLocalRef(path); - - return entry_jobject; -} - -DEFINE_JNI_ARGS_METHOD(jarray, AndroidHostInterface_getGameListEntries, jobject obj) -{ - AndroidHostInterface* hi = AndroidHelpers::GetNativeClass(env, obj); - jobjectArray entry_array = env->NewObjectArray(hi->GetGameList()->GetEntryCount(), s_GameListEntry_class, nullptr); - Assert(entry_array != nullptr); - - u32 counter = 0; - for (const GameListEntry& entry : hi->GetGameList()->GetEntries()) - { - jobject entry_jobject = CreateGameListEntry(env, hi, entry); - env->SetObjectArrayElement(entry_array, counter++, entry_jobject); - env->DeleteLocalRef(entry_jobject); - } - - return entry_array; -} - -DEFINE_JNI_ARGS_METHOD(jobject, AndroidHostInterface_getGameListEntry, jobject obj, jstring path) -{ - AndroidHostInterface* hi = AndroidHelpers::GetNativeClass(env, obj); - const std::string path_str(AndroidHelpers::JStringToString(env, path)); - const GameListEntry* entry = hi->GetGameList()->GetEntryForPath(path_str.c_str()); - if (!entry) - return nullptr; - - return CreateGameListEntry(env, hi, *entry); -} - -DEFINE_JNI_ARGS_METHOD(jstring, AndroidHostInterface_getGameSettingValue, jobject obj, jstring path, jstring key) -{ - AndroidHostInterface* hi = AndroidHelpers::GetNativeClass(env, obj); - const std::string path_str(AndroidHelpers::JStringToString(env, path)); - const std::string key_str(AndroidHelpers::JStringToString(env, key)); - - const GameListEntry* entry = hi->GetGameList()->GetEntryForPath(path_str.c_str()); - if (!entry) - return nullptr; - - std::optional<std::string> value = entry->settings.GetValueForKey(key_str); - if (!value.has_value()) - return nullptr; - else - return env->NewStringUTF(value->c_str()); -} - -DEFINE_JNI_ARGS_METHOD(void, AndroidHostInterface_setGameSettingValue, jobject obj, jstring path, jstring key, - jstring value) -{ - AndroidHostInterface* hi = AndroidHelpers::GetNativeClass(env, obj); - const std::string path_str(AndroidHelpers::JStringToString(env, path)); - const std::string key_str(AndroidHelpers::JStringToString(env, key)); - - const GameListEntry* entry = hi->GetGameList()->GetEntryForPath(path_str.c_str()); - if (!entry) - return; - - GameSettings::Entry new_entry(entry->settings); - - std::optional<std::string> value_str; - if (value) - value_str = AndroidHelpers::JStringToString(env, value); - - new_entry.SetValueForKey(key_str, value_str); - hi->GetGameList()->UpdateGameSettings(path_str, entry->code, entry->title, new_entry, true); -} - -DEFINE_JNI_ARGS_METHOD(jobjectArray, AndroidHostInterface_getHotkeyInfoList, jobject obj) -{ - jclass entry_class = env->FindClass("com/github/stenzek/duckstation/HotkeyInfo"); - Assert(entry_class != nullptr); - - jmethodID entry_constructor = - env->GetMethodID(entry_class, "<init>", "(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)V"); - Assert(entry_constructor != nullptr); - - AndroidHostInterface* hi = AndroidHelpers::GetNativeClass(env, obj); - const CommonHostInterface::HotkeyInfoList& hotkeys = hi->GetHotkeyInfoList(); - if (hotkeys.empty()) - return nullptr; - - jobjectArray entry_array = env->NewObjectArray(static_cast<jsize>(hotkeys.size()), entry_class, nullptr); - Assert(entry_array != nullptr); - - u32 counter = 0; - for (const CommonHostInterface::HotkeyInfo& hk : hotkeys) - { - jstring category = env->NewStringUTF(hk.category.GetCharArray()); - jstring name = env->NewStringUTF(hk.name.GetCharArray()); - jstring display_name = env->NewStringUTF(hk.display_name.GetCharArray()); - - jobject entry_jobject = env->NewObject(entry_class, entry_constructor, category, name, display_name); - - env->SetObjectArrayElement(entry_array, counter++, entry_jobject); - env->DeleteLocalRef(entry_jobject); - env->DeleteLocalRef(display_name); - env->DeleteLocalRef(name); - env->DeleteLocalRef(category); - } - - return entry_array; -} - -DEFINE_JNI_ARGS_METHOD(void, AndroidHostInterface_applySettings, jobject obj) -{ - AndroidHostInterface* hi = AndroidHelpers::GetNativeClass(env, obj); - if (hi->IsEmulationThreadRunning()) - { - hi->RunOnEmulationThread([hi]() { hi->ApplySettings(false); }); - } - else - { - hi->ApplySettings(false); - } -} - -DEFINE_JNI_ARGS_METHOD(void, AndroidHostInterface_updateInputMap, jobject obj) -{ - AndroidHostInterface* hi = AndroidHelpers::GetNativeClass(env, obj); - if (hi->IsEmulationThreadRunning()) - { - hi->RunOnEmulationThread([hi]() { hi->UpdateInputMap(); }); - } - else - { - hi->UpdateInputMap(); - } -} - -DEFINE_JNI_ARGS_METHOD(void, AndroidHostInterface_resetSystem, jobject obj, jboolean global, jint slot) -{ - AndroidHostInterface* hi = AndroidHelpers::GetNativeClass(env, obj); - hi->RunOnEmulationThread([hi]() { hi->ResetSystem(); }); -} - -DEFINE_JNI_ARGS_METHOD(void, AndroidHostInterface_loadState, jobject obj, jboolean global, jint slot) -{ - AndroidHostInterface* hi = AndroidHelpers::GetNativeClass(env, obj); - hi->RunOnEmulationThread([hi, global, slot]() { hi->LoadState(global, slot); }); -} - -DEFINE_JNI_ARGS_METHOD(void, AndroidHostInterface_saveState, jobject obj, jboolean global, jint slot) -{ - AndroidHostInterface* hi = AndroidHelpers::GetNativeClass(env, obj); - hi->RunOnEmulationThread([hi, global, slot]() { hi->SaveState(global, slot); }); -} - -DEFINE_JNI_ARGS_METHOD(void, AndroidHostInterface_saveResumeState, jobject obj, jboolean wait_for_completion) -{ - if (!System::IsValid() || System::GetState() == System::State::Starting) - { - // This gets called when the surface is destroyed, which can happen while starting. - return; - } - - AndroidHostInterface* hi = AndroidHelpers::GetNativeClass(env, obj); - hi->RunOnEmulationThread([hi]() { hi->SaveResumeSaveState(); }, wait_for_completion); -} - -DEFINE_JNI_ARGS_METHOD(void, AndroidHostInterface_setDisplayAlignment, jobject obj, jint alignment) -{ - AndroidHostInterface* hi = AndroidHelpers::GetNativeClass(env, obj); - hi->RunOnEmulationThread( - [hi, alignment]() { hi->SetDisplayAlignment(static_cast<HostDisplay::Alignment>(alignment)); }, false); -} - -DEFINE_JNI_ARGS_METHOD(bool, AndroidHostInterface_hasSurface, jobject obj) -{ - AndroidHostInterface* hi = AndroidHelpers::GetNativeClass(env, obj); - HostDisplay* display = hi->GetDisplay(); - if (display) - return display->HasRenderSurface(); - else - return false; -} - -DEFINE_JNI_ARGS_METHOD(bool, AndroidHostInterface_isEmulationThreadPaused, jobject obj) -{ - AndroidHostInterface* hi = AndroidHelpers::GetNativeClass(env, obj); - return hi->IsEmulationThreadPaused(); -} - -DEFINE_JNI_ARGS_METHOD(void, AndroidHostInterface_pauseEmulationThread, jobject obj, jboolean paused) -{ - AndroidHostInterface* hi = AndroidHelpers::GetNativeClass(env, obj); - hi->PauseEmulationThread(paused); -} - -DEFINE_JNI_ARGS_METHOD(jobject, AndroidHostInterface_getPatchCodeList, jobject obj) -{ - if (!System::IsValid()) - return nullptr; - - AndroidHostInterface* hi = AndroidHelpers::GetNativeClass(env, obj); - if (!System::HasCheatList()) - { - // Hopefully this won't deadlock... - hi->RunOnEmulationThread( - [hi]() { - if (!hi->LoadCheatListFromGameTitle()) - hi->LoadCheatListFromDatabase(); - }, - true); - } - - if (!System::HasCheatList()) - return nullptr; - - CheatList* cl = System::GetCheatList(); - const u32 count = cl->GetCodeCount(); - - jobjectArray arr = env->NewObjectArray(count, s_PatchCode_class, nullptr); - for (u32 i = 0; i < count; i++) - { - const CheatCode& cc = cl->GetCode(i); - - jstring group_str = cc.group.empty() ? nullptr : env->NewStringUTF(cc.group.c_str()); - jstring desc_str = env->NewStringUTF(cc.description.c_str()); - jobject java_cc = - env->NewObject(s_PatchCode_class, s_PatchCode_constructor, static_cast<jint>(i), group_str, desc_str, cc.enabled); - env->SetObjectArrayElement(arr, i, java_cc); - env->DeleteLocalRef(java_cc); - env->DeleteLocalRef(desc_str); - env->DeleteLocalRef(group_str); - } - - return arr; -} - -DEFINE_JNI_ARGS_METHOD(jboolean, AndroidHostInterface_importPatchCodesFromString, jobject obj, jstring str) -{ - if (!System::IsValid()) - return false; - - AndroidHostInterface* hi = AndroidHelpers::GetNativeClass(env, obj); - return hi->ImportPatchCodesFromString(AndroidHelpers::JStringToString(env, str)); -} - -DEFINE_JNI_ARGS_METHOD(void, AndroidHostInterface_setPatchCodeEnabled, jobject obj, jint index, jboolean enabled) -{ - if (!System::IsValid() || !System::HasCheatList()) - return; - - AndroidHostInterface* hi = AndroidHelpers::GetNativeClass(env, obj); - hi->RunOnEmulationThread([index, enabled, hi]() { hi->SetCheatCodeState(static_cast<u32>(index), enabled, true); }); -} - -DEFINE_JNI_ARGS_METHOD(void, AndroidHostInterface_addOSDMessage, jobject obj, jstring message, jfloat duration) -{ - AndroidHostInterface* hi = AndroidHelpers::GetNativeClass(env, obj); - hi->AddOSDMessage(AndroidHelpers::JStringToString(env, message), duration); -} - -DEFINE_JNI_ARGS_METHOD(jboolean, AndroidHostInterface_hasAnyBIOSImages, jobject obj) -{ - AndroidHostInterface* hi = AndroidHelpers::GetNativeClass(env, obj); - return hi->HasAnyBIOSImages(); -} - -DEFINE_JNI_ARGS_METHOD(jboolean, AndroidHostInterface_isFastForwardEnabled, jobject obj) -{ - return AndroidHelpers::GetNativeClass(env, obj)->IsRunningAtNonStandardSpeed(); -} - -DEFINE_JNI_ARGS_METHOD(void, AndroidHostInterface_setFastForwardEnabled, jobject obj, jboolean enabled) -{ - if (!System::IsValid()) - return; - - AndroidHostInterface* hi = AndroidHelpers::GetNativeClass(env, obj); - hi->RunOnEmulationThread([enabled, hi]() { hi->SetFastForwardEnabled(enabled); }); -} - -DEFINE_JNI_ARGS_METHOD(jstring, AndroidHostInterface_importBIOSImage, jobject obj, jbyteArray data) -{ - AndroidHostInterface* hi = AndroidHelpers::GetNativeClass(env, obj); - - const jsize len = env->GetArrayLength(data); - if (len != BIOS::BIOS_SIZE) - return nullptr; - - BIOS::Image image; - image.resize(static_cast<size_t>(len)); - env->GetByteArrayRegion(data, 0, len, reinterpret_cast<jbyte*>(image.data())); - - const BIOS::Hash hash = BIOS::GetHash(image); - const BIOS::ImageInfo* ii = BIOS::GetImageInfoForHash(hash); - - const std::string dest_path(hi->GetUserDirectoryRelativePath("bios/%s.bin", hash.ToString().c_str())); - if (FileSystem::FileExists(dest_path.c_str()) || - !FileSystem::WriteBinaryFile(dest_path.c_str(), image.data(), image.size())) - { - return nullptr; - } - - if (ii) - return env->NewStringUTF(ii->description); - else - return env->NewStringUTF(hash.ToString().c_str()); -} - -DEFINE_JNI_ARGS_METHOD(jboolean, AndroidHostInterface_hasMediaSubImages, jobject obj) -{ - if (!System::IsValid()) - return false; - - return System::HasMediaSubImages(); -} - -DEFINE_JNI_ARGS_METHOD(jobjectArray, AndroidHostInterface_getMediaSubImageTitles, jobject obj) -{ - if (!System::IsValid()) - return nullptr; - - const u32 count = System::GetMediaSubImageCount(); - if (count == 0) - return nullptr; - - jobjectArray arr = env->NewObjectArray(static_cast<jsize>(count), s_String_class, nullptr); - for (u32 i = 0; i < count; i++) - { - jstring str = env->NewStringUTF(System::GetMediaSubImageTitle(i).c_str()); - env->SetObjectArrayElement(arr, static_cast<jsize>(i), str); - env->DeleteLocalRef(str); - } - - return arr; -} - -DEFINE_JNI_ARGS_METHOD(jint, AndroidHostInterface_getMediaSubImageIndex, jobject obj) -{ - if (!System::IsValid()) - return -1; - - return System::GetMediaSubImageIndex(); -} - -DEFINE_JNI_ARGS_METHOD(jboolean, AndroidHostInterface_switchMediaSubImage, jobject obj, jint index) -{ - if (!System::IsValid() || index < 0 || static_cast<u32>(index) >= System::GetMediaSubImageCount()) - return false; - - AndroidHostInterface* hi = AndroidHelpers::GetNativeClass(env, obj); - hi->RunOnEmulationThread([index, hi]() { - if (System::IsValid()) - { - if (!System::SwitchMediaSubImage(static_cast<u32>(index))) - hi->AddOSDMessage("Disc switch failed. Please make sure the file exists."); - } - }); - - return true; -} - -DEFINE_JNI_ARGS_METHOD(jboolean, AndroidHostInterface_setMediaFilename, jstring obj, jstring filename) -{ - if (!System::IsValid() || !filename) - return false; - - std::string filename_str(AndroidHelpers::JStringToString(env, filename)); - AndroidHostInterface* hi = AndroidHelpers::GetNativeClass(env, obj); - hi->RunOnEmulationThread([filename_str, hi]() { - if (System::IsValid()) - { - if (!System::InsertMedia(filename_str.c_str())) - hi->AddOSDMessage("Disc switch failed. Please make sure the file exists and is a supported disc image."); - } - }); - - return true; -} - -static jobject CreateSaveStateInfo(JNIEnv* env, const CommonHostInterface::ExtendedSaveStateInfo& ssi) -{ - LocalRefHolder<jstring> path(env, env->NewStringUTF(ssi.path.c_str())); - LocalRefHolder<jstring> title(env, env->NewStringUTF(ssi.title.c_str())); - LocalRefHolder<jstring> code(env, env->NewStringUTF(ssi.game_code.c_str())); - LocalRefHolder<jstring> media_path(env, env->NewStringUTF(ssi.media_path.c_str())); - LocalRefHolder<jstring> timestamp(env, env->NewStringUTF(Timestamp::FromUnixTimestamp(ssi.timestamp).ToString("%c"))); - LocalRefHolder<jbyteArray> screenshot_data; - if (!ssi.screenshot_data.empty()) - { - const jsize data_size = static_cast<jsize>(ssi.screenshot_data.size() * sizeof(u32)); - screenshot_data = LocalRefHolder<jbyteArray>(env, env->NewByteArray(data_size)); - env->SetByteArrayRegion(screenshot_data.Get(), 0, data_size, - reinterpret_cast<const jbyte*>(ssi.screenshot_data.data())); - } - - return env->NewObject(s_SaveStateInfo_class, s_SaveStateInfo_constructor, path.Get(), title.Get(), code.Get(), - media_path.Get(), timestamp.Get(), static_cast<jint>(ssi.slot), - static_cast<jboolean>(ssi.global), static_cast<jint>(ssi.screenshot_width), - static_cast<jint>(ssi.screenshot_height), screenshot_data.Get()); -} - -static jobject CreateEmptySaveStateInfo(JNIEnv* env, s32 slot, bool global) -{ - return env->NewObject(s_SaveStateInfo_class, s_SaveStateInfo_constructor, nullptr, nullptr, nullptr, nullptr, nullptr, - static_cast<jint>(slot), static_cast<jboolean>(global), static_cast<jint>(0), - static_cast<jint>(0), nullptr); -} - -DEFINE_JNI_ARGS_METHOD(jobjectArray, AndroidHostInterface_getSaveStateInfo, jobject obj, jboolean includeEmpty) -{ - if (!System::IsValid()) - return nullptr; - - AndroidHostInterface* hi = AndroidHelpers::GetNativeClass(env, obj); - std::vector<jobject> infos; - - // +1 for the quick save only in android. - infos.reserve(1 + CommonHostInterface::PER_GAME_SAVE_STATE_SLOTS + CommonHostInterface::GLOBAL_SAVE_STATE_SLOTS); - - const std::string& game_code = System::GetRunningCode(); - if (!game_code.empty()) - { - for (u32 i = 0; i <= CommonHostInterface::PER_GAME_SAVE_STATE_SLOTS; i++) - { - std::optional<CommonHostInterface::ExtendedSaveStateInfo> esi = - hi->GetExtendedSaveStateInfo(game_code.c_str(), static_cast<s32>(i)); - if (esi.has_value()) - { - jobject obj = CreateSaveStateInfo(env, esi.value()); - if (obj) - infos.push_back(obj); - } - else if (includeEmpty) - { - jobject obj = CreateEmptySaveStateInfo(env, static_cast<s32>(i), false); - if (obj) - infos.push_back(obj); - } - } - } - - for (u32 i = 1; i <= CommonHostInterface::GLOBAL_SAVE_STATE_SLOTS; i++) - { - std::optional<CommonHostInterface::ExtendedSaveStateInfo> esi = - hi->GetExtendedSaveStateInfo(nullptr, static_cast<s32>(i)); - if (esi.has_value()) - { - jobject obj = CreateSaveStateInfo(env, esi.value()); - if (obj) - infos.push_back(obj); - } - else if (includeEmpty) - { - jobject obj = CreateEmptySaveStateInfo(env, static_cast<s32>(i), true); - if (obj) - infos.push_back(obj); - } - } - - if (infos.empty()) - return nullptr; - - jobjectArray ret = env->NewObjectArray(static_cast<jsize>(infos.size()), s_SaveStateInfo_class, nullptr); - for (size_t i = 0; i < infos.size(); i++) - { - env->SetObjectArrayElement(ret, static_cast<jsize>(i), infos[i]); - env->DeleteLocalRef(infos[i]); - } - - return ret; -} - -DEFINE_JNI_ARGS_METHOD(void, AndroidHostInterface_toggleControllerAnalogMode, jobject obj) -{ - // hacky way to toggle analog mode - for (u32 i = 0; i < NUM_CONTROLLER_AND_CARD_PORTS; i++) - { - Controller* ctrl = System::GetController(i); - if (!ctrl) - continue; - - std::optional<s32> code = Controller::GetButtonCodeByName(ctrl->GetType(), "Analog"); - if (!code.has_value()) - continue; - - ctrl->SetButtonState(code.value(), true); - ctrl->SetButtonState(code.value(), false); - } -} - -DEFINE_JNI_ARGS_METHOD(void, AndroidHostInterface_setFullscreenUINotificationVerticalPosition, jobject obj, - jfloat position, jfloat direction) -{ - AndroidHostInterface* hi = AndroidHelpers::GetNativeClass(env, obj); - hi->RunOnEmulationThread( - [position, direction]() { ImGuiFullscreen::SetNotificationVerticalPosition(position, direction); }); -} - -DEFINE_JNI_ARGS_METHOD(jboolean, AndroidHostInterface_isCheevosActive, jobject obj) -{ - return Cheevos::IsActive(); -} - -DEFINE_JNI_ARGS_METHOD(jboolean, AndroidHostInterface_isCheevosChallengeModeActive, jobject obj) -{ - return Cheevos::IsChallengeModeActive(); -} - -DEFINE_JNI_ARGS_METHOD(jobjectArray, AndroidHostInterface_getCheevoList, jobject obj) -{ - if (!Cheevos::IsActive()) - return nullptr; - - std::vector<jobject> cheevos; - Cheevos::EnumerateAchievements([env, &cheevos](const Cheevos::Achievement& cheevo) { - jstring title = env->NewStringUTF(cheevo.title.c_str()); - jstring description = env->NewStringUTF(cheevo.description.c_str()); - jstring locked_badge_path = - cheevo.locked_badge_path.empty() ? nullptr : env->NewStringUTF(cheevo.locked_badge_path.c_str()); - jstring unlocked_badge_path = - cheevo.unlocked_badge_path.empty() ? nullptr : env->NewStringUTF(cheevo.unlocked_badge_path.c_str()); - - jobject object = env->NewObject(s_Achievement_class, s_Achievement_constructor, static_cast<jint>(cheevo.id), title, - description, locked_badge_path, unlocked_badge_path, - static_cast<jint>(cheevo.points), static_cast<jboolean>(cheevo.locked)); - cheevos.push_back(object); - - if (unlocked_badge_path) - env->DeleteLocalRef(unlocked_badge_path); - if (locked_badge_path) - env->DeleteLocalRef(locked_badge_path); - env->DeleteLocalRef(description); - env->DeleteLocalRef(title); - return true; - }); - - if (cheevos.empty()) - return nullptr; - - jobjectArray ret = env->NewObjectArray(static_cast<jsize>(cheevos.size()), s_Achievement_class, nullptr); - for (size_t i = 0; i < cheevos.size(); i++) - { - env->SetObjectArrayElement(ret, static_cast<jsize>(i), cheevos[i]); - env->DeleteLocalRef(cheevos[i]); - } - - return ret; -} - -DEFINE_JNI_ARGS_METHOD(jint, AndroidHostInterface_getCheevoCount, jobject obj) -{ - return Cheevos::GetAchievementCount(); -} - -DEFINE_JNI_ARGS_METHOD(jint, AndroidHostInterface_getUnlockedCheevoCount, jobject obj) -{ - return Cheevos::GetUnlockedAchiementCount(); -} - -DEFINE_JNI_ARGS_METHOD(jint, AndroidHostInterface_getCheevoPointsForGame, jobject obj) -{ - return Cheevos::GetCurrentPointsForGame(); -} - -DEFINE_JNI_ARGS_METHOD(jint, AndroidHostInterface_getCheevoMaximumPointsForGame, jobject obj) -{ - return Cheevos::GetMaximumPointsForGame(); -} - -DEFINE_JNI_ARGS_METHOD(jstring, AndroidHostInterface_getCheevoGameTitle, jobject obj) -{ - const std::string& title = Cheevos::GetGameTitle(); - return title.empty() ? nullptr : env->NewStringUTF(title.c_str()); -} - -DEFINE_JNI_ARGS_METHOD(jstring, AndroidHostInterface_getCheevoGameIconPath, jobject obj) -{ - const std::string& path = Cheevos::GetGameIcon(); - return path.empty() ? nullptr : env->NewStringUTF(path.c_str()); -} - -DEFINE_JNI_ARGS_METHOD(jboolean, AndroidHostInterface_cheevosLogin, jobject obj, jstring username, jstring password) -{ - const std::string username_str(AndroidHelpers::JStringToString(env, username)); - const std::string password_str(AndroidHelpers::JStringToString(env, password)); - return Cheevos::Login(username_str.c_str(), password_str.c_str()); -} - -DEFINE_JNI_ARGS_METHOD(void, AndroidHostInterface_cheevosLogout, jobject obj) -{ - return Cheevos::Logout(); -} - -static_assert(sizeof(MemoryCardImage::DataArray) == MemoryCardImage::DATA_SIZE); - -static MemoryCardImage::DataArray* GetMemoryCardData(JNIEnv* env, jbyteArray obj) -{ - if (!obj || env->GetArrayLength(obj) != MemoryCardImage::DATA_SIZE) - return nullptr; - - return reinterpret_cast<MemoryCardImage::DataArray*>(env->GetByteArrayElements(obj, nullptr)); -} - -static void ReleaseMemoryCardData(JNIEnv* env, jbyteArray obj, MemoryCardImage::DataArray* data) -{ - env->ReleaseByteArrayElements(obj, reinterpret_cast<jbyte*>(data), 0); -} - -DEFINE_JNI_ARGS_METHOD(jboolean, MemoryCardImage_isValid, jclass clazz, jbyteArray obj) -{ - MemoryCardImage::DataArray* data = GetMemoryCardData(env, obj); - if (!data) - return false; - - const bool res = MemoryCardImage::IsValid(*data); - ReleaseMemoryCardData(env, obj, data); - return res; -} - -DEFINE_JNI_ARGS_METHOD(void, MemoryCardImage_format, jclass clazz, jbyteArray obj) -{ - MemoryCardImage::DataArray* data = GetMemoryCardData(env, obj); - if (!data) - return; - - MemoryCardImage::Format(data); - ReleaseMemoryCardData(env, obj, data); -} - -DEFINE_JNI_ARGS_METHOD(jint, MemoryCardImage_getFreeBlocks, jclass clazz, jbyteArray obj) -{ - MemoryCardImage::DataArray* data = GetMemoryCardData(env, obj); - if (!data) - return 0; - - const u32 free_blocks = MemoryCardImage::GetFreeBlockCount(*data); - ReleaseMemoryCardData(env, obj, data); - return free_blocks; -} - -DEFINE_JNI_ARGS_METHOD(jobjectArray, MemoryCardImage_getFiles, jclass clazz, jbyteArray obj) -{ - MemoryCardImage::DataArray* data = GetMemoryCardData(env, obj); - if (!data) - return nullptr; - - const std::vector<MemoryCardImage::FileInfo> files(MemoryCardImage::EnumerateFiles(*data)); - - std::vector<jobject> file_objects; - file_objects.reserve(files.size()); - - jclass byteArrayClass = env->FindClass("[B"); - - for (const MemoryCardImage::FileInfo& file : files) - { - jobject filename = env->NewStringUTF(file.filename.c_str()); - jobject title = env->NewStringUTF(file.title.c_str()); - jobjectArray frames = nullptr; - if (!file.icon_frames.empty()) - { - frames = env->NewObjectArray(static_cast<jint>(file.icon_frames.size()), byteArrayClass, nullptr); - for (jsize i = 0; i < static_cast<jsize>(file.icon_frames.size()); i++) - { - static constexpr jsize frame_size = MemoryCardImage::ICON_WIDTH * MemoryCardImage::ICON_HEIGHT * sizeof(u32); - jbyteArray frame_data = env->NewByteArray(frame_size); - jbyte* frame_data_ptr = env->GetByteArrayElements(frame_data, nullptr); - std::memcpy(frame_data_ptr, file.icon_frames[i].pixels, frame_size); - env->ReleaseByteArrayElements(frame_data, frame_data_ptr, 0); - env->SetObjectArrayElement(frames, i, frame_data); - env->DeleteLocalRef(frame_data); - } - } - - file_objects.push_back(env->NewObject(s_MemoryCardFileInfo_class, s_MemoryCardFileInfo_constructor, filename, title, - static_cast<jint>(file.size), static_cast<jint>(file.first_block), - static_cast<int>(file.num_blocks), frames)); - - env->DeleteLocalRef(frames); - env->DeleteLocalRef(title); - env->DeleteLocalRef(filename); - } - - jobjectArray file_object_array = - AndroidHelpers::CreateObjectArray(env, s_MemoryCardFileInfo_class, file_objects.data(), file_objects.size(), true); - ReleaseMemoryCardData(env, obj, data); - return file_object_array; -} - -DEFINE_JNI_ARGS_METHOD(jboolean, MemoryCardImage_hasFile, jclass clazz, jbyteArray obj, jstring filename) -{ - MemoryCardImage::DataArray* data = GetMemoryCardData(env, obj); - if (!data) - return false; - - const std::string filename_str(AndroidHelpers::JStringToString(env, filename)); - bool result = false; - if (!filename_str.empty()) - { - const std::vector<MemoryCardImage::FileInfo> files(MemoryCardImage::EnumerateFiles(*data)); - result = std::any_of(files.begin(), files.end(), - [&filename_str](const MemoryCardImage::FileInfo& fi) { return fi.filename == filename_str; }); - } - - ReleaseMemoryCardData(env, obj, data); - return result; -} - -DEFINE_JNI_ARGS_METHOD(jbyteArray, MemoryCardImage_readFile, jclass clazz, jbyteArray obj, jstring filename) -{ - MemoryCardImage::DataArray* data = GetMemoryCardData(env, obj); - if (!data) - return nullptr; - - const std::string filename_str(AndroidHelpers::JStringToString(env, filename)); - jbyteArray ret = nullptr; - if (!filename_str.empty()) - { - const std::vector<MemoryCardImage::FileInfo> files(MemoryCardImage::EnumerateFiles(*data)); - auto iter = std::find_if(files.begin(), files.end(), [&filename_str](const MemoryCardImage::FileInfo& fi) { - return fi.filename == filename_str; - }); - if (iter != files.end()) - { - std::vector<u8> file_data; - if (MemoryCardImage::ReadFile(*data, *iter, &file_data)) - ret = AndroidHelpers::VectorToByteArray(env, file_data); - } - } - - ReleaseMemoryCardData(env, obj, data); - return ret; -} - -DEFINE_JNI_ARGS_METHOD(jboolean, MemoryCardImage_writeFile, jclass clazz, jbyteArray obj, jstring filename, - jbyteArray file_data) -{ - MemoryCardImage::DataArray* data = GetMemoryCardData(env, obj); - if (!data) - return false; - - const std::string filename_str(AndroidHelpers::JStringToString(env, filename)); - const std::vector<u8> file_data_vec(AndroidHelpers::ByteArrayToVector(env, file_data)); - bool ret = false; - if (!filename_str.empty()) - ret = MemoryCardImage::WriteFile(data, filename_str, file_data_vec); - - ReleaseMemoryCardData(env, obj, data); - return ret; -} - -DEFINE_JNI_ARGS_METHOD(jboolean, MemoryCardImage_deleteFile, jclass clazz, jbyteArray obj, jstring filename) -{ - MemoryCardImage::DataArray* data = GetMemoryCardData(env, obj); - if (!data) - return false; - - const std::string filename_str(AndroidHelpers::JStringToString(env, filename)); - bool ret = false; - - if (!filename_str.empty()) - { - const std::vector<MemoryCardImage::FileInfo> files(MemoryCardImage::EnumerateFiles(*data)); - auto iter = std::find_if(files.begin(), files.end(), [&filename_str](const MemoryCardImage::FileInfo& fi) { - return fi.filename == filename_str; - }); - - if (iter != files.end()) - ret = MemoryCardImage::DeleteFile(data, *iter); - } - - ReleaseMemoryCardData(env, obj, data); - return ret; -} - -DEFINE_JNI_ARGS_METHOD(jboolean, MemoryCardImage_importCard, jclass clazz, jbyteArray obj, jstring filename, - jbyteArray import_data) -{ - MemoryCardImage::DataArray* data = GetMemoryCardData(env, obj); - if (!data) - return false; - - const std::string filename_str(AndroidHelpers::JStringToString(env, filename)); - std::vector<u8> import_data_vec(AndroidHelpers::ByteArrayToVector(env, import_data)); - bool ret = false; - if (!filename_str.empty() && !import_data_vec.empty()) - ret = MemoryCardImage::ImportCard(data, filename_str.c_str(), std::move(import_data_vec)); - - ReleaseMemoryCardData(env, obj, data); - return ret; -} \ No newline at end of file diff --git a/android/app/src/cpp/android_host_interface.h b/android/app/src/cpp/android_host_interface.h deleted file mode 100644 index 99f91b5f2..000000000 --- a/android/app/src/cpp/android_host_interface.h +++ /dev/null @@ -1,171 +0,0 @@ -#pragma once -#include "android_settings_interface.h" -#include "common/byte_stream.h" -#include "common/event.h" -#include "common/progress_callback.h" -#include "core/host_display.h" -#include "frontend-common/common_host_interface.h" -#include <array> -#include <atomic> -#include <condition_variable> -#include <functional> -#include <jni.h> -#include <memory> -#include <string> -#include <thread> - -struct ANativeWindow; - -class Controller; - -class AndroidHostInterface final : public CommonHostInterface -{ -public: - using CommonHostInterface::UpdateInputMap; - - AndroidHostInterface(jobject java_object, jobject context_object, std::string user_directory); - ~AndroidHostInterface() override; - - ALWAYS_INLINE ANativeWindow* GetSurface() const { return m_surface; } - - bool Initialize() override; - void Shutdown() override; - - const char* GetFrontendName() const override; - void RequestExit() override; - void RunLater(std::function<void()> func) override; - - void ReportError(const char* message) override; - void ReportMessage(const char* message) override; - - std::unique_ptr<ByteStream> OpenPackageFile(const char* path, u32 flags) override; - - bool IsEmulationThreadRunning() const { return m_emulation_thread_running.load(); } - bool IsEmulationThreadPaused() const; - bool IsOnEmulationThread() const; - void RunOnEmulationThread(std::function<void()> function, bool blocking = false); - void PauseEmulationThread(bool paused); - void StopEmulationThreadLoop(); - - void EmulationThreadEntryPoint(JNIEnv* env, jobject emulation_activity, SystemBootParameters boot_params, - bool resume_state); - - void SurfaceChanged(ANativeWindow* surface, int format, int width, int height); - void SetDisplayAlignment(HostDisplay::Alignment alignment); - - void SetControllerButtonState(u32 index, s32 button_code, bool pressed); - void SetControllerAxisState(u32 index, s32 button_code, float value); - void HandleControllerButtonEvent(u32 controller_index, u32 button_index, bool pressed); - void HandleControllerAxisEvent(u32 controller_index, u32 axis_index, float value); - bool HasControllerButtonBinding(u32 controller_index, u32 button); - void SetControllerVibration(u32 controller_index, float small_motor, float large_motor); - void SetFastForwardEnabled(bool enabled); - - void RefreshGameList(bool invalidate_cache, bool invalidate_database, ProgressCallback* progress_callback); - - bool ImportPatchCodesFromString(const std::string& str); - - jobjectArray GetInputProfileNames(JNIEnv* env) const; - -protected: - void SetUserDirectory() override; - void RegisterHotkeys() override; - - bool AcquireHostDisplay() override; - void ReleaseHostDisplay() override; - std::unique_ptr<AudioStream> CreateAudioStream(AudioBackend backend) override; - void UpdateControllerInterface() override; - - void OnSystemPaused(bool paused) override; - void OnSystemDestroyed() override; - void OnRunningGameChanged(const std::string& path, CDImage* image, const std::string& game_code, - const std::string& game_title) override; - -private: - void EmulationThreadLoop(JNIEnv* env); - - void LoadSettings(SettingsInterface& si) override; - void UpdateInputMap(SettingsInterface& si) override; - void SetVibration(bool enabled); - void UpdateVibration(); - float GetRefreshRate() const; - float GetSurfaceScale(int width, int height) const; - - jobject m_java_object = {}; - jobject m_emulation_activity_object = {}; - - ANativeWindow* m_surface = nullptr; - - std::mutex m_mutex; - std::condition_variable m_sleep_cv; - std::deque<std::function<void()>> m_callback_queue; - std::atomic_bool m_callbacks_outstanding{false}; - - std::atomic_bool m_emulation_thread_stop_request{false}; - std::atomic_bool m_emulation_thread_running{false}; - std::thread::id m_emulation_thread_id{}; - - HostDisplay::Alignment m_display_alignment = HostDisplay::Alignment::Center; - - u64 m_last_vibration_update_time = 0; - bool m_last_vibration_state = false; - bool m_vibration_enabled = false; -}; - -namespace AndroidHelpers { - -JavaVM* GetJavaVM(); -JNIEnv* GetJNIEnv(); -AndroidHostInterface* GetNativeClass(JNIEnv* env, jobject obj); -std::string JStringToString(JNIEnv* env, jstring str); -std::unique_ptr<GrowableMemoryByteStream> ReadInputStreamToMemory(JNIEnv* env, jobject obj, u32 chunk_size = 65536); -jclass GetStringClass(); -std::vector<u8> ByteArrayToVector(JNIEnv* env, jbyteArray obj); -jbyteArray NewByteArray(JNIEnv* env, const void* data, size_t size); -jbyteArray VectorToByteArray(JNIEnv* env, const std::vector<u8>& data); -jobjectArray CreateObjectArray(JNIEnv* env, jclass object_class, const jobject* objects, size_t num_objects, - bool release_refs = false); -} // namespace AndroidHelpers - -template<typename T> -class LocalRefHolder -{ -public: - LocalRefHolder() : m_env(nullptr), m_object(nullptr) {} - - LocalRefHolder(JNIEnv* env, T object) : m_env(env), m_object(object) {} - - LocalRefHolder(const LocalRefHolder<T>&) = delete; - LocalRefHolder(LocalRefHolder&& move) : m_env(move.m_env), m_object(move.m_object) - { - move.m_env = nullptr; - move.m_object = {}; - } - - ~LocalRefHolder() - { - if (m_object) - m_env->DeleteLocalRef(m_object); - } - - operator T() const { return m_object; } - T operator*() const { return m_object; } - - LocalRefHolder& operator=(const LocalRefHolder&) = delete; - LocalRefHolder& operator=(LocalRefHolder&& move) - { - if (m_object) - m_env->DeleteLocalRef(m_object); - m_env = move.m_env; - m_object = move.m_object; - move.m_env = nullptr; - move.m_object = {}; - return *this; - } - - T Get() const { return m_object; } - -private: - JNIEnv* m_env; - T m_object; -}; diff --git a/android/app/src/cpp/android_http_downloader.cpp b/android/app/src/cpp/android_http_downloader.cpp deleted file mode 100644 index d1f462641..000000000 --- a/android/app/src/cpp/android_http_downloader.cpp +++ /dev/null @@ -1,167 +0,0 @@ -#include "android_http_downloader.h" -#include "android_host_interface.h" -#include "common/assert.h" -#include "common/log.h" -#include "common/string_util.h" -#include "common/timer.h" -#include <algorithm> -#include <functional> -Log_SetChannel(AndroidHTTPDownloader); - -namespace FrontendCommon { - -AndroidHTTPDownloader::AndroidHTTPDownloader() : HTTPDownloader() {} - -AndroidHTTPDownloader::~AndroidHTTPDownloader() -{ - JNIEnv* env = AndroidHelpers::GetJNIEnv(); - if (m_URLDownloader_class) - env->DeleteGlobalRef(m_URLDownloader_class); -} - -std::unique_ptr<HTTPDownloader> HTTPDownloader::Create(const char* user_agent) -{ - std::unique_ptr<AndroidHTTPDownloader> instance(std::make_unique<AndroidHTTPDownloader>()); - if (!instance->Initialize(user_agent)) - return {}; - - return instance; -} - -bool AndroidHTTPDownloader::Initialize(const char* user_agent) -{ - JNIEnv* env = AndroidHelpers::GetJNIEnv(); - jclass klass = env->FindClass("com/github/stenzek/duckstation/URLDownloader"); - if (!klass) - return false; - - m_URLDownloader_class = static_cast<jclass>(env->NewGlobalRef(klass)); - if (!m_URLDownloader_class) - return false; - - m_URLDownloader_constructor = env->GetMethodID(klass, "<init>", "(Ljava/lang/String;)V"); - m_URLDownloader_get = env->GetMethodID(klass, "get", "(Ljava/lang/String;)Z"); - m_URLDownloader_post = env->GetMethodID(klass, "post", "(Ljava/lang/String;[B)Z"); - m_URLDownloader_getStatusCode = env->GetMethodID(klass, "getStatusCode", "()I"); - m_URLDownloader_getData = env->GetMethodID(klass, "getData", "()[B"); - if (!m_URLDownloader_constructor || !m_URLDownloader_get || !m_URLDownloader_post || !m_URLDownloader_getStatusCode || - !m_URLDownloader_getData) - { - return false; - } - - m_user_agent = user_agent; - m_thread_pool = std::make_unique<cb::ThreadPool>(m_max_active_requests); - return true; -} - -void AndroidHTTPDownloader::ProcessRequest(Request* req) -{ - std::unique_lock<std::mutex> cancel_lock(m_cancel_mutex); - if (req->closed.load()) - return; - - cancel_lock.unlock(); - req->status_code = -1; - req->start_time = Common::Timer::GetValue(); - - // TODO: Move to Java side... - JNIEnv* env; - if (AndroidHelpers::GetJavaVM()->AttachCurrentThread(&env, nullptr) == JNI_OK) - { - jstring url_string = env->NewStringUTF(req->url.c_str()); - jstring user_agent_string = env->NewStringUTF(m_user_agent.c_str()); - - jobject obj = env->NewObject(m_URLDownloader_class, m_URLDownloader_constructor, user_agent_string); - jboolean result; - if (req->post_data.empty()) - { - result = env->CallBooleanMethod(obj, m_URLDownloader_get, url_string); - } - else - { - jbyteArray post_data = env->NewByteArray(static_cast<jsize>(req->post_data.size())); - env->SetByteArrayRegion(post_data, 0, static_cast<jsize>(req->post_data.size()), - reinterpret_cast<const jbyte*>(req->post_data.data())); - result = env->CallBooleanMethod(obj, m_URLDownloader_post, url_string, post_data); - env->DeleteLocalRef(post_data); - } - - env->DeleteLocalRef(url_string); - env->DeleteLocalRef(user_agent_string); - - if (result) - { - req->status_code = env->CallIntMethod(obj, m_URLDownloader_getStatusCode); - - jbyteArray data = reinterpret_cast<jbyteArray>(env->CallObjectMethod(obj, m_URLDownloader_getData)); - if (data) - { - const u32 size = static_cast<u32>(env->GetArrayLength(data)); - req->data.resize(size); - if (size > 0) - { - jbyte* data_ptr = env->GetByteArrayElements(data, nullptr); - std::memcpy(req->data.data(), data_ptr, size); - env->ReleaseByteArrayElements(data, data_ptr, 0); - } - - env->DeleteLocalRef(data); - } - - Log_DevPrintf("Request for '%s' returned status code %d and %zu bytes", req->url.c_str(), req->status_code, - req->data.size()); - } - else - { - Log_ErrorPrintf("Request for '%s' failed", req->url.c_str()); - } - - env->DeleteLocalRef(obj); - AndroidHelpers::GetJavaVM()->DetachCurrentThread(); - } - else - { - Log_ErrorPrintf("AttachCurrentThread() failed"); - } - - cancel_lock.lock(); - req->state = Request::State::Complete; - if (req->closed.load()) - delete req; - else - req->closed.store(true); -} - -HTTPDownloader::Request* AndroidHTTPDownloader::InternalCreateRequest() -{ - Request* req = new Request(); - return req; -} - -void AndroidHTTPDownloader::InternalPollRequests() -{ - // noop - uses thread pool -} - -bool AndroidHTTPDownloader::StartRequest(HTTPDownloader::Request* request) -{ - Request* req = static_cast<Request*>(request); - Log_DevPrintf("Started HTTP request for '%s'", req->url.c_str()); - req->state = Request::State::Started; - req->start_time = Common::Timer::GetValue(); - m_thread_pool->Schedule(std::bind(&AndroidHTTPDownloader::ProcessRequest, this, req)); - return true; -} - -void AndroidHTTPDownloader::CloseRequest(HTTPDownloader::Request* request) -{ - std::unique_lock<std::mutex> cancel_lock(m_cancel_mutex); - Request* req = static_cast<Request*>(request); - if (req->closed.load()) - delete req; - else - req->closed.store(true); -} - -} // namespace FrontendCommon diff --git a/android/app/src/cpp/android_http_downloader.h b/android/app/src/cpp/android_http_downloader.h deleted file mode 100644 index b5774846b..000000000 --- a/android/app/src/cpp/android_http_downloader.h +++ /dev/null @@ -1,45 +0,0 @@ -#pragma once -#include "common/thirdparty/thread_pool.h" -#include "frontend-common/http_downloader.h" -#include <atomic> -#include <jni.h> -#include <memory> -#include <mutex> - -namespace FrontendCommon { - -class AndroidHTTPDownloader final : public HTTPDownloader -{ -public: - AndroidHTTPDownloader(); - ~AndroidHTTPDownloader() override; - - bool Initialize(const char* user_agent); - -protected: - Request* InternalCreateRequest() override; - void InternalPollRequests() override; - bool StartRequest(HTTPDownloader::Request* request) override; - void CloseRequest(HTTPDownloader::Request* request) override; - -private: - struct Request : HTTPDownloader::Request - { - std::atomic_bool closed{false}; - }; - - void ProcessRequest(Request* req); - - std::string m_user_agent; - std::unique_ptr<cb::ThreadPool> m_thread_pool; - std::mutex m_cancel_mutex; - - jclass m_URLDownloader_class = nullptr; - jmethodID m_URLDownloader_constructor = nullptr; - jmethodID m_URLDownloader_get = nullptr; - jmethodID m_URLDownloader_post = nullptr; - jmethodID m_URLDownloader_getStatusCode = nullptr; - jmethodID m_URLDownloader_getData = nullptr; -}; - -} // namespace FrontendCommon diff --git a/android/app/src/cpp/android_progress_callback.cpp b/android/app/src/cpp/android_progress_callback.cpp deleted file mode 100644 index a25d02624..000000000 --- a/android/app/src/cpp/android_progress_callback.cpp +++ /dev/null @@ -1,113 +0,0 @@ -#include "android_progress_callback.h" -#include "android_host_interface.h" -#include "common/assert.h" -#include "common/log.h" -Log_SetChannel(AndroidProgressCallback); - -AndroidProgressCallback::AndroidProgressCallback(JNIEnv* env, jobject java_object) : m_java_object(java_object) -{ - jclass cls = env->GetObjectClass(java_object); - m_set_title_method = env->GetMethodID(cls, "setTitle", "(Ljava/lang/String;)V"); - m_set_status_text_method = env->GetMethodID(cls, "setStatusText", "(Ljava/lang/String;)V"); - m_set_progress_range_method = env->GetMethodID(cls, "setProgressRange", "(I)V"); - m_set_progress_value_method = env->GetMethodID(cls, "setProgressValue", "(I)V"); - m_modal_error_method = env->GetMethodID(cls, "modalError", "(Ljava/lang/String;)V"); - m_modal_information_method = env->GetMethodID(cls, "modalInformation", "(Ljava/lang/String;)V"); - m_modal_confirmation_method = env->GetMethodID(cls, "modalConfirmation", "(Ljava/lang/String;)Z"); - Assert(m_set_status_text_method && m_set_progress_range_method && m_set_progress_value_method && - m_modal_error_method && m_modal_information_method && m_modal_confirmation_method); -} - -AndroidProgressCallback::~AndroidProgressCallback() = default; - -bool AndroidProgressCallback::IsCancelled() const -{ - return false; -} - -void AndroidProgressCallback::SetCancellable(bool cancellable) -{ - if (m_cancellable == cancellable) - return; - - BaseProgressCallback::SetCancellable(cancellable); -} - -void AndroidProgressCallback::SetTitle(const char* title) -{ - Assert(title); - JNIEnv* env = AndroidHelpers::GetJNIEnv(); - LocalRefHolder<jstring> text_jstr(env, env->NewStringUTF(title)); - env->CallVoidMethod(m_java_object, m_set_title_method, text_jstr.Get()); -} - -void AndroidProgressCallback::SetStatusText(const char* text) -{ - Assert(text); - JNIEnv* env = AndroidHelpers::GetJNIEnv(); - LocalRefHolder<jstring> text_jstr(env, env->NewStringUTF(text)); - env->CallVoidMethod(m_java_object, m_set_status_text_method, text_jstr.Get()); -} - -void AndroidProgressCallback::SetProgressRange(u32 range) -{ - BaseProgressCallback::SetProgressRange(range); - - JNIEnv* env = AndroidHelpers::GetJNIEnv(); - env->CallVoidMethod(m_java_object, m_set_progress_range_method, static_cast<jint>(range)); -} - -void AndroidProgressCallback::SetProgressValue(u32 value) -{ - const u32 old_value = m_progress_value; - BaseProgressCallback::SetProgressValue(value); - if (old_value == m_progress_value) - return; - - JNIEnv* env = AndroidHelpers::GetJNIEnv(); - env->CallVoidMethod(m_java_object, m_set_progress_value_method, static_cast<jint>(value)); -} - -void AndroidProgressCallback::DisplayError(const char* message) -{ - Log_ErrorPrintf("%s", message); -} - -void AndroidProgressCallback::DisplayWarning(const char* message) -{ - Log_WarningPrintf("%s", message); -} - -void AndroidProgressCallback::DisplayInformation(const char* message) -{ - Log_InfoPrintf("%s", message); -} - -void AndroidProgressCallback::DisplayDebugMessage(const char* message) -{ - Log_DevPrintf("%s", message); -} - -void AndroidProgressCallback::ModalError(const char* message) -{ - Assert(message); - JNIEnv* env = AndroidHelpers::GetJNIEnv(); - LocalRefHolder<jstring> message_jstr(env, env->NewStringUTF(message)); - env->CallVoidMethod(m_java_object, m_modal_error_method, message_jstr.Get()); -} - -bool AndroidProgressCallback::ModalConfirmation(const char* message) -{ - Assert(message); - JNIEnv* env = AndroidHelpers::GetJNIEnv(); - LocalRefHolder<jstring> message_jstr(env, env->NewStringUTF(message)); - return env->CallBooleanMethod(m_java_object, m_modal_confirmation_method, message_jstr.Get()); -} - -void AndroidProgressCallback::ModalInformation(const char* message) -{ - Assert(message); - JNIEnv* env = AndroidHelpers::GetJNIEnv(); - LocalRefHolder<jstring> message_jstr(env, env->NewStringUTF(message)); - env->CallVoidMethod(m_java_object, m_modal_information_method, message_jstr.Get()); -} diff --git a/android/app/src/cpp/android_progress_callback.h b/android/app/src/cpp/android_progress_callback.h deleted file mode 100644 index 8b15bca18..000000000 --- a/android/app/src/cpp/android_progress_callback.h +++ /dev/null @@ -1,38 +0,0 @@ -#pragma once -#include "common/progress_callback.h" -#include <jni.h> - -class AndroidProgressCallback final : public BaseProgressCallback -{ -public: - AndroidProgressCallback(JNIEnv* env, jobject java_object); - ~AndroidProgressCallback(); - - bool IsCancelled() const override; - - void SetCancellable(bool cancellable) override; - void SetTitle(const char* title) override; - void SetStatusText(const char* text) override; - void SetProgressRange(u32 range) override; - void SetProgressValue(u32 value) override; - - void DisplayError(const char* message) override; - void DisplayWarning(const char* message) override; - void DisplayInformation(const char* message) override; - void DisplayDebugMessage(const char* message) override; - - void ModalError(const char* message) override; - bool ModalConfirmation(const char* message) override; - void ModalInformation(const char* message) override; - -private: - jobject m_java_object; - - jmethodID m_set_title_method; - jmethodID m_set_status_text_method; - jmethodID m_set_progress_range_method; - jmethodID m_set_progress_value_method; - jmethodID m_modal_error_method; - jmethodID m_modal_confirmation_method; - jmethodID m_modal_information_method; -}; diff --git a/android/app/src/cpp/android_settings_interface.cpp b/android/app/src/cpp/android_settings_interface.cpp deleted file mode 100644 index 52af477c8..000000000 --- a/android/app/src/cpp/android_settings_interface.cpp +++ /dev/null @@ -1,425 +0,0 @@ -#include "android_settings_interface.h" -#include "android_host_interface.h" -#include "common/assert.h" -#include "common/log.h" -#include "common/string.h" -#include "common/string_util.h" -#include <algorithm> -Log_SetChannel(AndroidSettingsInterface); - -ALWAYS_INLINE TinyString GetSettingKey(const char* section, const char* key) -{ - return TinyString::FromFormat("%s/%s", section, key); -} - -AndroidSettingsInterface::AndroidSettingsInterface(jobject java_context) -{ - JNIEnv* env = AndroidHelpers::GetJNIEnv(); - jclass c_preference_manager = env->FindClass("androidx/preference/PreferenceManager"); - jclass c_preference_editor = env->FindClass("android/content/SharedPreferences$Editor"); - jclass c_set = env->FindClass("java/util/Set"); - jclass c_helper = env->FindClass("com/github/stenzek/duckstation/PreferenceHelpers"); - jmethodID m_get_default_shared_preferences = - env->GetStaticMethodID(c_preference_manager, "getDefaultSharedPreferences", - "(Landroid/content/Context;)Landroid/content/SharedPreferences;"); - Assert(c_preference_manager && c_preference_editor && c_set && c_helper && m_get_default_shared_preferences); - m_set_class = reinterpret_cast<jclass>(env->NewGlobalRef(c_set)); - m_shared_preferences_editor_class = reinterpret_cast<jclass>(env->NewGlobalRef(c_preference_editor)); - m_helper_class = reinterpret_cast<jclass>(env->NewGlobalRef(c_helper)); - Assert(m_set_class && m_shared_preferences_editor_class && m_helper_class); - - env->DeleteLocalRef(c_set); - env->DeleteLocalRef(c_preference_editor); - env->DeleteLocalRef(c_helper); - - jobject shared_preferences = - env->CallStaticObjectMethod(c_preference_manager, m_get_default_shared_preferences, java_context); - Assert(shared_preferences); - m_java_shared_preferences = env->NewGlobalRef(shared_preferences); - Assert(m_java_shared_preferences); - env->DeleteLocalRef(c_preference_manager); - env->DeleteLocalRef(shared_preferences); - - jclass c_shared_preferences = env->GetObjectClass(m_java_shared_preferences); - m_shared_preferences_class = reinterpret_cast<jclass>(env->NewGlobalRef(c_shared_preferences)); - Assert(m_shared_preferences_class); - env->DeleteLocalRef(c_shared_preferences); - - m_get_boolean = env->GetMethodID(m_shared_preferences_class, "getBoolean", "(Ljava/lang/String;Z)Z"); - m_get_int = env->GetMethodID(m_shared_preferences_class, "getInt", "(Ljava/lang/String;I)I"); - m_get_float = env->GetMethodID(m_shared_preferences_class, "getFloat", "(Ljava/lang/String;F)F"); - m_get_string = env->GetMethodID(m_shared_preferences_class, "getString", - "(Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String;"); - m_get_string_set = - env->GetMethodID(m_shared_preferences_class, "getStringSet", "(Ljava/lang/String;Ljava/util/Set;)Ljava/util/Set;"); - m_set_to_array = env->GetMethodID(m_set_class, "toArray", "()[Ljava/lang/Object;"); - Assert(m_get_boolean && m_get_int && m_get_float && m_get_string && m_get_string_set && m_set_to_array); - - m_edit = env->GetMethodID(m_shared_preferences_class, "edit", "()Landroid/content/SharedPreferences$Editor;"); - m_edit_set_string = - env->GetMethodID(m_shared_preferences_editor_class, "putString", - "(Ljava/lang/String;Ljava/lang/String;)Landroid/content/SharedPreferences$Editor;"); - m_edit_commit = env->GetMethodID(m_shared_preferences_editor_class, "commit", "()Z"); - m_edit_remove = env->GetMethodID(m_shared_preferences_editor_class, "remove", - "(Ljava/lang/String;)Landroid/content/SharedPreferences$Editor;"); - Assert(m_edit && m_edit_set_string && m_edit_commit && m_edit_remove); - - m_helper_clear_section = - env->GetStaticMethodID(m_helper_class, "clearSection", "(Landroid/content/SharedPreferences;Ljava/lang/String;)V"); - m_helper_add_to_string_list = env->GetStaticMethodID( - m_helper_class, "addToStringList", "(Landroid/content/SharedPreferences;Ljava/lang/String;Ljava/lang/String;)Z"); - m_helper_remove_from_string_list = - env->GetStaticMethodID(m_helper_class, "removeFromStringList", - "(Landroid/content/SharedPreferences;Ljava/lang/String;Ljava/lang/String;)Z"); - m_helper_set_string_list = env->GetStaticMethodID( - m_helper_class, "setStringList", "(Landroid/content/SharedPreferences;Ljava/lang/String;[Ljava/lang/String;)V"); - Assert(m_helper_clear_section && m_helper_add_to_string_list && m_helper_remove_from_string_list && - m_helper_set_string_list); -} - -AndroidSettingsInterface::~AndroidSettingsInterface() -{ - JNIEnv* env = AndroidHelpers::GetJNIEnv(); - if (m_java_shared_preferences) - env->DeleteGlobalRef(m_java_shared_preferences); - if (m_shared_preferences_editor_class) - env->DeleteGlobalRef(m_shared_preferences_editor_class); - if (m_shared_preferences_class) - env->DeleteGlobalRef(m_shared_preferences_class); - if (m_set_class) - env->DeleteGlobalRef(m_set_class); - if (m_helper_class) - env->DeleteGlobalRef(m_helper_class); -} - -bool AndroidSettingsInterface::Save() -{ - return true; -} - -void AndroidSettingsInterface::Clear() -{ - Log_ErrorPrint("Not implemented"); -} - -int AndroidSettingsInterface::GetIntValue(const char* section, const char* key, int default_value /*= 0*/) -{ - // Some of these settings are string lists... - JNIEnv* env = AndroidHelpers::GetJNIEnv(); - LocalRefHolder<jstring> key_string(env, env->NewStringUTF(GetSettingKey(section, key))); - LocalRefHolder<jstring> default_value_string(env, env->NewStringUTF(TinyString::FromFormat("%d", default_value))); - LocalRefHolder<jstring> string_object( - env, reinterpret_cast<jstring>(env->CallObjectMethod(m_java_shared_preferences, m_get_string, key_string.Get(), - default_value_string.Get()))); - if (env->ExceptionCheck()) - { - env->ExceptionClear(); - - // it might actually be an int (e.g. seek bar preference) - const int int_value = - static_cast<int>(env->CallIntMethod(m_java_shared_preferences, m_get_int, key_string.Get(), default_value)); - if (env->ExceptionCheck()) - { - env->ExceptionClear(); - Log_DevPrintf("GetIntValue(%s, %s) -> %d (exception)", section, key, default_value); - return default_value; - } - - Log_DevPrintf("GetIntValue(%s, %s) -> %d (int)", section, key, int_value); - return int_value; - } - - if (!string_object) - return default_value; - - const char* data = env->GetStringUTFChars(string_object, nullptr); - Assert(data != nullptr); - Log_DevPrintf("GetIntValue(%s, %s) -> %s", section, key, data); - - std::optional<int> value = StringUtil::FromChars<int>(data); - env->ReleaseStringUTFChars(string_object, data); - return value.value_or(default_value); -} - -float AndroidSettingsInterface::GetFloatValue(const char* section, const char* key, float default_value /*= 0.0f*/) -{ - JNIEnv* env = AndroidHelpers::GetJNIEnv(); - LocalRefHolder<jstring> key_string(env, env->NewStringUTF(GetSettingKey(section, key))); - LocalRefHolder<jstring> default_value_string(env, env->NewStringUTF(TinyString::FromFormat("%f", default_value))); - LocalRefHolder<jstring> string_object( - env, reinterpret_cast<jstring>(env->CallObjectMethod(m_java_shared_preferences, m_get_string, key_string.Get(), - default_value_string.Get()))); - if (env->ExceptionCheck()) - { - env->ExceptionClear(); - Log_DevPrintf("GetFloatValue(%s, %s) -> %f (exception)", section, key, default_value); - return default_value; - } - - if (!string_object) - { - Log_DevPrintf("GetFloatValue(%s, %s) -> %f (null)", section, key, default_value); - return default_value; - } - - const char* data = env->GetStringUTFChars(string_object, nullptr); - Assert(data != nullptr); - Log_DevPrintf("GetFloatValue(%s, %s) -> %s", section, key, data); - - std::optional<float> value = StringUtil::FromChars<float>(data); - env->ReleaseStringUTFChars(string_object, data); - return value.value_or(default_value); -} - -bool AndroidSettingsInterface::GetBoolValue(const char* section, const char* key, bool default_value /*= false*/) -{ - JNIEnv* env = AndroidHelpers::GetJNIEnv(); - LocalRefHolder<jstring> key_string(env, env->NewStringUTF(GetSettingKey(section, key))); - jboolean bool_value = static_cast<bool>( - env->CallBooleanMethod(m_java_shared_preferences, m_get_boolean, key_string.Get(), default_value)); - if (env->ExceptionCheck()) - { - Log_DevPrintf("GetBoolValue(%s, %s) -> %u (exception)", section, key, static_cast<unsigned>(default_value)); - env->ExceptionClear(); - return default_value; - } - - Log_DevPrintf("GetBoolValue(%s, %s) -> %u", section, key, static_cast<unsigned>(bool_value)); - return bool_value; -} - -std::string AndroidSettingsInterface::GetStringValue(const char* section, const char* key, - const char* default_value /*= ""*/) -{ - JNIEnv* env = AndroidHelpers::GetJNIEnv(); - LocalRefHolder<jstring> key_string(env, env->NewStringUTF(GetSettingKey(section, key))); - LocalRefHolder<jstring> default_value_string(env, env->NewStringUTF(default_value)); - LocalRefHolder<jstring> string_object( - env, reinterpret_cast<jstring>(env->CallObjectMethod(m_java_shared_preferences, m_get_string, key_string.Get(), - default_value_string.Get()))); - - if (env->ExceptionCheck()) - { - env->ExceptionClear(); - Log_DevPrintf("GetStringValue(%s, %s) -> %s (exception)", section, key, default_value); - return default_value; - } - - if (!string_object) - { - Log_DevPrintf("GetStringValue(%s, %s) -> %s (null)", section, key, default_value); - return default_value; - } - - const std::string ret(AndroidHelpers::JStringToString(env, string_object)); - Log_DevPrintf("GetStringValue(%s, %s) -> %s", section, key, ret.c_str()); - return ret; -} - -jobject AndroidSettingsInterface::GetPreferencesEditor(JNIEnv* env) -{ - return env->CallObjectMethod(m_java_shared_preferences, m_edit); -} - -void AndroidSettingsInterface::CheckForException(JNIEnv* env, const char* task) -{ - if (!env->ExceptionCheck()) - return; - - Log_ErrorPrintf("JNI exception during %s", task); - env->ExceptionClear(); -} - -void AndroidSettingsInterface::SetIntValue(const char* section, const char* key, int value) -{ - Log_DevPrintf("SetIntValue(\"%s\", \"%s\", %d)", section, key, value); - - JNIEnv* env = AndroidHelpers::GetJNIEnv(); - LocalRefHolder<jobject> editor(env, GetPreferencesEditor(env)); - LocalRefHolder<jstring> key_string(env, env->NewStringUTF(GetSettingKey(section, key))); - LocalRefHolder<jstring> str_value(env, env->NewStringUTF(TinyString::FromFormat("%d", value))); - - LocalRefHolder<jobject> dummy(env, - env->CallObjectMethod(editor, m_edit_set_string, key_string.Get(), str_value.Get())); - env->CallBooleanMethod(editor, m_edit_commit); - - CheckForException(env, "SetIntValue"); -} - -void AndroidSettingsInterface::SetFloatValue(const char* section, const char* key, float value) -{ - Log_DevPrintf("SetFloatValue(\"%s\", \"%s\", %f)", section, key, value); - - JNIEnv* env = AndroidHelpers::GetJNIEnv(); - LocalRefHolder<jobject> editor(env, GetPreferencesEditor(env)); - LocalRefHolder<jstring> key_string(env, env->NewStringUTF(GetSettingKey(section, key))); - LocalRefHolder<jstring> str_value(env, env->NewStringUTF(TinyString::FromFormat("%f", value))); - - LocalRefHolder<jobject> dummy(env, - env->CallObjectMethod(editor, m_edit_set_string, key_string.Get(), str_value.Get())); - env->CallBooleanMethod(editor, m_edit_commit); - - CheckForException(env, "SetFloatValue"); -} - -void AndroidSettingsInterface::SetBoolValue(const char* section, const char* key, bool value) -{ - Log_DevPrintf("SetBoolValue(\"%s\", \"%s\", %u)", section, key, static_cast<unsigned>(value)); - - JNIEnv* env = AndroidHelpers::GetJNIEnv(); - LocalRefHolder<jobject> editor(env, GetPreferencesEditor(env)); - LocalRefHolder<jstring> key_string(env, env->NewStringUTF(GetSettingKey(section, key))); - LocalRefHolder<jstring> str_value(env, env->NewStringUTF(value ? "true" : "false")); - - LocalRefHolder<jobject> dummy(env, - env->CallObjectMethod(editor, m_edit_set_string, key_string.Get(), str_value.Get())); - env->CallBooleanMethod(editor, m_edit_commit); - - CheckForException(env, "SetBoolValue"); -} - -void AndroidSettingsInterface::SetStringValue(const char* section, const char* key, const char* value) -{ - Log_DevPrintf("SetStringValue(\"%s\", \"%s\", \"%s\")", section, key, value); - - JNIEnv* env = AndroidHelpers::GetJNIEnv(); - LocalRefHolder<jobject> editor(env, GetPreferencesEditor(env)); - LocalRefHolder<jstring> key_string(env, env->NewStringUTF(GetSettingKey(section, key))); - LocalRefHolder<jstring> str_value(env, env->NewStringUTF(value)); - - LocalRefHolder<jobject> dummy(env, - env->CallObjectMethod(editor, m_edit_set_string, key_string.Get(), str_value.Get())); - env->CallBooleanMethod(editor, m_edit_commit); - - CheckForException(env, "SetStringValue"); -} - -void AndroidSettingsInterface::DeleteValue(const char* section, const char* key) -{ - Log_DevPrintf("DeleteValue(\"%s\", \"%s\")", section, key); - - JNIEnv* env = AndroidHelpers::GetJNIEnv(); - LocalRefHolder<jobject> editor(env, GetPreferencesEditor(env)); - LocalRefHolder<jstring> key_string(env, env->NewStringUTF(GetSettingKey(section, key))); - LocalRefHolder<jobject> dummy(env, env->CallObjectMethod(editor, m_edit_remove, key_string.Get())); - env->CallBooleanMethod(editor, m_edit_commit); - - CheckForException(env, "DeleteValue"); -} - -void AndroidSettingsInterface::ClearSection(const char* section) -{ - Log_DevPrintf("ClearSection(\"%s\")", section); - - JNIEnv* env = AndroidHelpers::GetJNIEnv(); - LocalRefHolder<jstring> str_section(env, env->NewStringUTF(section)); - env->CallStaticVoidMethod(m_helper_class, m_helper_clear_section, m_java_shared_preferences, str_section.Get()); - - CheckForException(env, "ClearSection"); -} - -std::vector<std::string> AndroidSettingsInterface::GetStringList(const char* section, const char* key) -{ - JNIEnv* env = AndroidHelpers::GetJNIEnv(); - LocalRefHolder<jstring> key_string(env, env->NewStringUTF(GetSettingKey(section, key))); - LocalRefHolder<jobject> values_set( - env, env->CallObjectMethod(m_java_shared_preferences, m_get_string_set, key_string.Get(), nullptr)); - if (env->ExceptionCheck()) - { - env->ExceptionClear(); - - // this might just be a string, not a string set - LocalRefHolder<jstring> string_object(env, reinterpret_cast<jstring>(env->CallObjectMethod( - m_java_shared_preferences, m_get_string, key_string.Get(), nullptr))); - - if (!env->ExceptionCheck()) - { - std::vector<std::string> ret; - if (string_object) - ret.push_back(AndroidHelpers::JStringToString(env, string_object)); - - return ret; - } - - env->ExceptionClear(); - return {}; - } - - if (!values_set) - return {}; - - LocalRefHolder<jobjectArray> values_array( - env, reinterpret_cast<jobjectArray>(env->CallObjectMethod(values_set, m_set_to_array))); - if (env->ExceptionCheck()) - { - env->ExceptionClear(); - return {}; - } - - if (!values_array) - return {}; - - jsize size = env->GetArrayLength(values_array); - std::vector<std::string> values; - values.reserve(size); - for (jsize i = 0; i < size; i++) - { - jstring str = reinterpret_cast<jstring>(env->GetObjectArrayElement(values_array, i)); - values.push_back(AndroidHelpers::JStringToString(env, str)); - env->DeleteLocalRef(str); - } - - return values; -} - -void AndroidSettingsInterface::SetStringList(const char* section, const char* key, - const std::vector<std::string>& items) -{ - Log_DevPrintf("SetStringList(\"%s\", \"%s\")", section, key); - if (items.empty()) - { - DeleteValue(section, key); - return; - } - - JNIEnv* env = AndroidHelpers::GetJNIEnv(); - LocalRefHolder<jobjectArray> items_array( - env, env->NewObjectArray(static_cast<jsize>(items.size()), AndroidHelpers::GetStringClass(), nullptr)); - for (size_t i = 0; i < items.size(); i++) - { - LocalRefHolder<jstring> item_jstr(env, env->NewStringUTF(items[i].c_str())); - env->SetObjectArrayElement(items_array, static_cast<jsize>(i), item_jstr); - } - - LocalRefHolder<jstring> key_string(env, env->NewStringUTF(GetSettingKey(section, key))); - env->CallStaticVoidMethod(m_helper_class, m_helper_set_string_list, m_java_shared_preferences, key_string.Get(), - items_array.Get()); - - CheckForException(env, "SetStringList"); -} - -bool AndroidSettingsInterface::RemoveFromStringList(const char* section, const char* key, const char* item) -{ - Log_DevPrintf("RemoveFromStringList(\"%s\", \"%s\", \"%s\")", section, key, item); - - JNIEnv* env = AndroidHelpers::GetJNIEnv(); - LocalRefHolder<jstring> key_string(env, env->NewStringUTF(GetSettingKey(section, key))); - LocalRefHolder<jstring> item_string(env, env->NewStringUTF(item)); - const bool result = env->CallStaticBooleanMethod(m_helper_class, m_helper_remove_from_string_list, - m_java_shared_preferences, key_string.Get(), item_string.Get()); - CheckForException(env, "RemoveFromStringList"); - return result; -} - -bool AndroidSettingsInterface::AddToStringList(const char* section, const char* key, const char* item) -{ - Log_DevPrintf("AddToStringList(\"%s\", \"%s\", \"%s\")", section, key, item); - - JNIEnv* env = AndroidHelpers::GetJNIEnv(); - LocalRefHolder<jstring> key_string(env, env->NewStringUTF(GetSettingKey(section, key))); - LocalRefHolder<jstring> item_string(env, env->NewStringUTF(item)); - const bool result = env->CallStaticBooleanMethod(m_helper_class, m_helper_add_to_string_list, - m_java_shared_preferences, key_string.Get(), item_string.Get()); - CheckForException(env, "AddToStringList"); - return result; -} diff --git a/android/app/src/cpp/android_settings_interface.h b/android/app/src/cpp/android_settings_interface.h deleted file mode 100644 index 542a2f90e..000000000 --- a/android/app/src/cpp/android_settings_interface.h +++ /dev/null @@ -1,54 +0,0 @@ -#pragma once -#include "core/settings.h" -#include <jni.h> - -class AndroidSettingsInterface : public SettingsInterface -{ -public: - AndroidSettingsInterface(jobject java_context); - ~AndroidSettingsInterface(); - - bool Save() override; - void Clear() override; - - int GetIntValue(const char* section, const char* key, int default_value = 0) override; - float GetFloatValue(const char* section, const char* key, float default_value = 0.0f) override; - bool GetBoolValue(const char* section, const char* key, bool default_value = false) override; - std::string GetStringValue(const char* section, const char* key, const char* default_value = "") override; - - void SetIntValue(const char* section, const char* key, int value) override; - void SetFloatValue(const char* section, const char* key, float value) override; - void SetBoolValue(const char* section, const char* key, bool value) override; - void SetStringValue(const char* section, const char* key, const char* value) override; - void DeleteValue(const char* section, const char* key) override; - void ClearSection(const char* section) override; - - std::vector<std::string> GetStringList(const char* section, const char* key) override; - void SetStringList(const char* section, const char* key, const std::vector<std::string>& items) override; - bool RemoveFromStringList(const char* section, const char* key, const char* item) override; - bool AddToStringList(const char* section, const char* key, const char* item) override; - -private: - jobject GetPreferencesEditor(JNIEnv* env); - void CheckForException(JNIEnv* env, const char* task); - - jclass m_set_class{}; - jclass m_shared_preferences_class{}; - jclass m_shared_preferences_editor_class{}; - jclass m_helper_class{}; - jobject m_java_shared_preferences{}; - jmethodID m_get_boolean{}; - jmethodID m_get_int{}; - jmethodID m_get_float{}; - jmethodID m_get_string{}; - jmethodID m_get_string_set{}; - jmethodID m_edit{}; - jmethodID m_edit_set_string{}; - jmethodID m_edit_commit{}; - jmethodID m_edit_remove{}; - jmethodID m_set_to_array{}; - jmethodID m_helper_clear_section{}; - jmethodID m_helper_add_to_string_list{}; - jmethodID m_helper_remove_from_string_list{}; - jmethodID m_helper_set_string_list{}; -}; diff --git a/android/app/src/cpp/opensles_audio_stream.cpp b/android/app/src/cpp/opensles_audio_stream.cpp deleted file mode 100644 index 70f2c207c..000000000 --- a/android/app/src/cpp/opensles_audio_stream.cpp +++ /dev/null @@ -1,210 +0,0 @@ -#include "opensles_audio_stream.h" -#include "common/assert.h" -#include "common/log.h" -#include <cmath> -Log_SetChannel(OpenSLESAudioStream); - -// Based off Dolphin's OpenSLESStream class. - -OpenSLESAudioStream::OpenSLESAudioStream() = default; - -OpenSLESAudioStream::~OpenSLESAudioStream() -{ - if (IsOpen()) - OpenSLESAudioStream::CloseDevice(); -} - -std::unique_ptr<AudioStream> OpenSLESAudioStream::Create() -{ - return std::make_unique<OpenSLESAudioStream>(); -} - -bool OpenSLESAudioStream::OpenDevice() -{ - DebugAssert(!IsOpen()); - - SLresult res = slCreateEngine(&m_engine, 0, nullptr, 0, nullptr, nullptr); - if (res != SL_RESULT_SUCCESS) - { - Log_ErrorPrintf("slCreateEngine failed: %d", res); - return false; - } - - res = (*m_engine)->Realize(m_engine, SL_BOOLEAN_FALSE); - if (res != SL_RESULT_SUCCESS) - { - Log_ErrorPrintf("Realize(Engine) failed: %d", res); - CloseDevice(); - return false; - } - - res = (*m_engine)->GetInterface(m_engine, SL_IID_ENGINE, &m_engine_engine); - if (res != SL_RESULT_SUCCESS) - { - Log_ErrorPrintf("GetInterface(SL_IID_ENGINE) failed: %d", res); - CloseDevice(); - return false; - } - - res = (*m_engine_engine)->CreateOutputMix(m_engine_engine, &m_output_mix, 0, 0, 0); - if (res != SL_RESULT_SUCCESS) - { - Log_ErrorPrintf("CreateOutputMix failed: %d", res); - CloseDevice(); - return false; - } - - res = (*m_output_mix)->Realize(m_output_mix, SL_BOOLEAN_FALSE); - if (res != SL_RESULT_SUCCESS) - { - Log_ErrorPrintf("Realize(OutputMix) mix failed: %d", res); - CloseDevice(); - return false; - } - - SLDataLocator_AndroidSimpleBufferQueue dloc_bq{SL_DATALOCATOR_ANDROIDSIMPLEBUFFERQUEUE, NUM_BUFFERS}; - SLDataFormat_PCM format = {SL_DATAFORMAT_PCM, - m_channels, - m_output_sample_rate * 1000u, - SL_PCMSAMPLEFORMAT_FIXED_16, - SL_PCMSAMPLEFORMAT_FIXED_16, - SL_SPEAKER_FRONT_LEFT | SL_SPEAKER_FRONT_RIGHT, - SL_BYTEORDER_LITTLEENDIAN}; - SLDataSource dsrc{&dloc_bq, &format}; - SLDataLocator_OutputMix dloc_outputmix{SL_DATALOCATOR_OUTPUTMIX, m_output_mix}; - SLDataSink dsink{&dloc_outputmix, nullptr}; - - const std::array<SLInterfaceID, 2> ap_interfaces = {{SL_IID_BUFFERQUEUE, SL_IID_VOLUME}}; - const std::array<SLboolean, 2> ap_interfaces_req = {{true, true}}; - res = (*m_engine_engine) - ->CreateAudioPlayer(m_engine_engine, &m_player, &dsrc, &dsink, static_cast<u32>(ap_interfaces.size()), - ap_interfaces.data(), ap_interfaces_req.data()); - if (res != SL_RESULT_SUCCESS) - { - Log_ErrorPrintf("CreateAudioPlayer failed: %d", res); - CloseDevice(); - return false; - } - - res = (*m_player)->Realize(m_player, SL_BOOLEAN_FALSE); - if (res != SL_RESULT_SUCCESS) - { - Log_ErrorPrintf("Realize(AudioPlayer) failed: %d", res); - CloseDevice(); - return false; - } - - res = (*m_player)->GetInterface(m_player, SL_IID_PLAY, &m_play_interface); - if (res != SL_RESULT_SUCCESS) - { - Log_ErrorPrintf("GetInterface(SL_IID_PLAY) failed: %d", res); - CloseDevice(); - return false; - } - - res = (*m_player)->GetInterface(m_player, SL_IID_BUFFERQUEUE, &m_buffer_queue_interface); - if (res != SL_RESULT_SUCCESS) - { - Log_ErrorPrintf("GetInterface(SL_IID_BUFFERQUEUE) failed: %d", res); - CloseDevice(); - return false; - } - - res = (*m_player)->GetInterface(m_player, SL_IID_VOLUME, &m_volume_interface); - if (res != SL_RESULT_SUCCESS) - { - Log_ErrorPrintf("GetInterface(SL_IID_VOLUME) failed: %d", res); - CloseDevice(); - return false; - } - - res = (*m_buffer_queue_interface)->RegisterCallback(m_buffer_queue_interface, BufferCallback, this); - if (res != SL_RESULT_SUCCESS) - { - Log_ErrorPrintf("Failed to register callback: %d", res); - CloseDevice(); - return false; - } - - for (u32 i = 0; i < NUM_BUFFERS; i++) - m_buffers[i] = std::make_unique<SampleType[]>(m_buffer_size * m_channels); - - Log_InfoPrintf("OpenSL ES device opened: %uhz, %u channels, %u buffer size, %u buffers", m_output_sample_rate, - m_channels, m_buffer_size, NUM_BUFFERS); - return true; -} - -void OpenSLESAudioStream::PauseDevice(bool paused) -{ - if (m_paused == paused) - return; - - SLresult res = - (*m_play_interface)->SetPlayState(m_play_interface, paused ? SL_PLAYSTATE_PAUSED : SL_PLAYSTATE_PLAYING); - if (res != SL_RESULT_SUCCESS) - Log_ErrorPrintf("SetPlayState failed: %d", res); - - if (!paused && !m_buffer_enqueued) - { - m_buffer_enqueued = true; - EnqueueBuffer(); - } - - m_paused = paused; -} - -void OpenSLESAudioStream::CloseDevice() -{ - m_buffers = {}; - m_current_buffer = 0; - m_paused = true; - m_buffer_enqueued = false; - - if (m_player) - { - (*m_player)->Destroy(m_player); - m_volume_interface = {}; - m_buffer_queue_interface = {}; - m_play_interface = {}; - m_player = {}; - } - if (m_output_mix) - { - (*m_output_mix)->Destroy(m_output_mix); - m_output_mix = {}; - } - (*m_engine)->Destroy(m_engine); - m_engine_engine = {}; - m_engine = {}; -} - -void OpenSLESAudioStream::SetOutputVolume(u32 volume) -{ - const SLmillibel attenuation = (volume == 0) ? - SL_MILLIBEL_MIN : - static_cast<SLmillibel>(2000.0f * std::log10(static_cast<float>(volume) / 100.0f)); - SLresult res = (*m_volume_interface)->SetVolumeLevel(m_volume_interface, attenuation); - if (res != SL_RESULT_SUCCESS) - Log_ErrorPrintf("SetVolumeLevel failed: %d", res); -} - -void OpenSLESAudioStream::EnqueueBuffer() -{ - SampleType* samples = m_buffers[m_current_buffer].get(); - ReadFrames(samples, m_buffer_size, false); - - SLresult res = (*m_buffer_queue_interface) - ->Enqueue(m_buffer_queue_interface, samples, m_buffer_size * m_channels * sizeof(SampleType)); - if (res != SL_RESULT_SUCCESS) - Log_ErrorPrintf("Enqueue buffer failed: %d", res); - - m_current_buffer = (m_current_buffer + 1) % NUM_BUFFERS; -} - -void OpenSLESAudioStream::BufferCallback(SLAndroidSimpleBufferQueueItf buffer_queue, void* context) -{ - OpenSLESAudioStream* const this_ptr = static_cast<OpenSLESAudioStream*>(context); - this_ptr->EnqueueBuffer(); -} - -void OpenSLESAudioStream::FramesAvailable() {} diff --git a/android/app/src/cpp/opensles_audio_stream.h b/android/app/src/cpp/opensles_audio_stream.h deleted file mode 100644 index 83c54aa6e..000000000 --- a/android/app/src/cpp/opensles_audio_stream.h +++ /dev/null @@ -1,48 +0,0 @@ -#pragma once -#include "common/audio_stream.h" -#include <SLES/OpenSLES.h> -#include <SLES/OpenSLES_Android.h> -#include <array> -#include <memory> - -class OpenSLESAudioStream final : public AudioStream -{ -public: - OpenSLESAudioStream(); - ~OpenSLESAudioStream(); - - static std::unique_ptr<AudioStream> Create(); - - void SetOutputVolume(u32 volume) override; - -protected: - enum : u32 - { - NUM_BUFFERS = 2 - }; - - ALWAYS_INLINE bool IsOpen() const { return (m_engine != nullptr); } - - bool OpenDevice() override; - void PauseDevice(bool paused) override; - void CloseDevice() override; - void FramesAvailable() override; - - void EnqueueBuffer(); - - static void BufferCallback(SLAndroidSimpleBufferQueueItf buffer_queue, void* context); - - SLObjectItf m_engine{}; - SLEngineItf m_engine_engine{}; - SLObjectItf m_output_mix{}; - - SLObjectItf m_player{}; - SLPlayItf m_play_interface{}; - SLAndroidSimpleBufferQueueItf m_buffer_queue_interface{}; - SLVolumeItf m_volume_interface{}; - - std::array<std::unique_ptr<SampleType[]>, NUM_BUFFERS> m_buffers; - u32 m_current_buffer = 0; - bool m_paused = true; - bool m_buffer_enqueued = false; -}; diff --git a/android/app/src/main/AndroidManifest.xml b/android/app/src/main/AndroidManifest.xml deleted file mode 100644 index d1181b437..000000000 --- a/android/app/src/main/AndroidManifest.xml +++ /dev/null @@ -1,80 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<manifest xmlns:android="http://schemas.android.com/apk/res/android" - package="com.github.stenzek.duckstation"> - - <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" /> - <uses-permission android:name="android.permission.VIBRATE" /> - <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> - <uses-permission android:name="android.permission.INTERNET" /> - - <application - android:allowBackup="true" - android:icon="@mipmap/ic_launcher" - android:label="@string/app_name" - android:networkSecurityConfig="@xml/network_security_config" - android:requestLegacyExternalStorage="true" - android:roundIcon="@mipmap/ic_launcher_round" - android:supportsRtl="true" - android:theme="@style/AppTheme" - android:usesCleartextTraffic="true"> - <activity - android:name=".MemoryCardEditorActivity" - android:label="@string/title_activity_memory_card_editor" - android:theme="@style/AppTheme.NoActionBar"></activity> - <activity - android:name=".GameDirectoriesActivity" - android:label="@string/title_activity_game_directories" - android:theme="@style/AppTheme.NoActionBar" /> - <activity - android:name=".EmulationActivity" - android:configChanges="orientation|keyboard|keyboardHidden|screenSize" - android:exported="true" - android:immersive="true" - android:label="@string/title_activity_emulation" - android:parentActivityName=".MainActivity" - android:theme="@style/Theme.AppCompat.DayNight.NoActionBar"> - <meta-data - android:name="android.support.PARENT_ACTIVITY" - android:value="com.github.stenzek.duckstation.MainActivity" /> - </activity> - <activity - android:name=".SettingsActivity" - android:configChanges="orientation|keyboard|keyboardHidden|screenSize" - android:label="@string/title_activity_settings" - android:parentActivityName=".MainActivity"> - <meta-data - android:name="android.support.PARENT_ACTIVITY" - android:value="com.github.stenzek.duckstation.MainActivity" /> - </activity> - <activity - android:name=".ControllerSettingsActivity" - android:configChanges="orientation|keyboard|keyboardHidden|screenSize" - android:label="@string/controller_mapping_activity_title" - android:parentActivityName=".MainActivity"> - <meta-data - android:name="android.support.PARENT_ACTIVITY" - android:value="com.github.stenzek.duckstation.MainActivity" /> - </activity> - <activity - android:name=".GamePropertiesActivity" - android:configChanges="orientation|keyboard|keyboardHidden|screenSize" - android:label="@string/activity_game_properties" - android:parentActivityName=".MainActivity"> - <meta-data - android:name="android.support.PARENT_ACTIVITY" - android:value="com.github.stenzek.duckstation.MainActivity" /> - </activity> - <activity - android:name=".MainActivity" - android:configChanges="orientation|keyboard|keyboardHidden|screenSize" - android:label="@string/app_name" - android:theme="@style/AppTheme.NoActionBar"> - <intent-filter> - <action android:name="android.intent.action.MAIN" /> - - <category android:name="android.intent.category.LAUNCHER" /> - </intent-filter> - </activity> - </application> - -</manifest> \ No newline at end of file diff --git a/android/app/src/main/ic_launcher-web.png b/android/app/src/main/ic_launcher-web.png deleted file mode 100644 index 353ac1fe71e8fc6bc0b90ba1004a311f77a1ccc1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 38012 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 diff --git a/android/app/src/main/java/com/github/stenzek/duckstation/Achievement.java b/android/app/src/main/java/com/github/stenzek/duckstation/Achievement.java deleted file mode 100644 index ee4477c83..000000000 --- a/android/app/src/main/java/com/github/stenzek/duckstation/Achievement.java +++ /dev/null @@ -1,76 +0,0 @@ -package com.github.stenzek.duckstation; - -import android.content.Context; -import android.content.SharedPreferences; - -import androidx.preference.PreferenceManager; - -public final class Achievement { - public static final int CATEGORY_LOCAL = 0; - public static final int CATEGORY_CORE = 3; - public static final int CATEGORY_UNOFFICIAL = 5; - - private final int id; - private final String name; - private final String description; - private final String lockedBadgePath; - private final String unlockedBadgePath; - private final int points; - private final boolean locked; - - public Achievement(int id, String name, String description, String lockedBadgePath, - String unlockedBadgePath, int points, boolean locked) { - this.id = id; - this.name = name; - this.description = description; - this.lockedBadgePath = lockedBadgePath; - this.unlockedBadgePath = unlockedBadgePath; - this.points = points; - this.locked = locked; - } - - /** - * Returns true if challenge mode will be enabled when a game is started. - * Does not depend on the emulation running. - * - * @param context context to pull settings from - * @return true if challenge mode will be used, false otherwise - */ - public static boolean willChallengeModeBeEnabled(Context context) { - final SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(context); - return prefs.getBoolean("Cheevos/Enabled", false) && - prefs.getBoolean("Cheevos/ChallengeMode", false); - } - - public int getId() { - return id; - } - - public String getName() { - return name; - } - - public String getDescription() { - return description; - } - - public String getLockedBadgePath() { - return lockedBadgePath; - } - - public String getUnlockedBadgePath() { - return unlockedBadgePath; - } - - public int getPoints() { - return points; - } - - public boolean isLocked() { - return locked; - } - - public String getBadgePath() { - return locked ? lockedBadgePath : unlockedBadgePath; - } -} diff --git a/android/app/src/main/java/com/github/stenzek/duckstation/AchievementListFragment.java b/android/app/src/main/java/com/github/stenzek/duckstation/AchievementListFragment.java deleted file mode 100644 index 04b229ad4..000000000 --- a/android/app/src/main/java/com/github/stenzek/duckstation/AchievementListFragment.java +++ /dev/null @@ -1,193 +0,0 @@ -package com.github.stenzek.duckstation; - -import android.content.Context; -import android.content.DialogInterface; -import android.content.res.Configuration; -import android.os.AsyncTask; -import android.os.Bundle; -import android.util.DisplayMetrics; -import android.view.LayoutInflater; -import android.view.View; -import android.view.ViewGroup; -import android.widget.ImageView; -import android.widget.ProgressBar; -import android.widget.TextView; - -import androidx.annotation.NonNull; -import androidx.annotation.Nullable; -import androidx.fragment.app.DialogFragment; -import androidx.recyclerview.widget.DividerItemDecoration; -import androidx.recyclerview.widget.LinearLayoutManager; -import androidx.recyclerview.widget.RecyclerView; - -import java.util.Arrays; -import java.util.Comparator; - -public class AchievementListFragment extends DialogFragment { - - private RecyclerView mRecyclerView; - private AchievementListFragment.ViewAdapter mAdapter; - private final Achievement[] mAchievements; - private DialogInterface.OnDismissListener mOnDismissListener; - - public AchievementListFragment(Achievement[] achievements) { - mAchievements = achievements; - sortAchievements(); - } - - public void setOnDismissListener(DialogInterface.OnDismissListener l) { - mOnDismissListener = l; - } - - @Override - public void onDismiss(@NonNull DialogInterface dialog) { - if (mOnDismissListener != null) - mOnDismissListener.onDismiss(dialog); - - super.onDismiss(dialog); - } - - @Override - public void onResume() { - super.onResume(); - - if (getDialog() == null) - return; - - final boolean isLandscape = (getResources().getConfiguration().orientation == Configuration.ORIENTATION_LANDSCAPE); - final float scale = (float) getContext().getResources().getDisplayMetrics().densityDpi / DisplayMetrics.DENSITY_DEFAULT; - final int width = Math.round((isLandscape ? 700.0f : 400.0f) * scale); - final int height = Math.round((isLandscape ? 400.0f : 700.0f) * scale); - getDialog().getWindow().setLayout(width, height); - } - - @Nullable - @Override - public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { - return inflater.inflate(R.layout.fragment_achievement_list, container, false); - } - - @Override - public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) { - super.onViewCreated(view, savedInstanceState); - - mAdapter = new AchievementListFragment.ViewAdapter(getContext(), mAchievements); - - mRecyclerView = view.findViewById(R.id.recyclerView); - mRecyclerView.setAdapter(mAdapter); - mRecyclerView.setLayoutManager(new LinearLayoutManager(getContext())); - mRecyclerView.addItemDecoration(new DividerItemDecoration(mRecyclerView.getContext(), - DividerItemDecoration.VERTICAL)); - - fillHeading(view); - } - - private void fillHeading(@NonNull View view) { - final AndroidHostInterface hi = AndroidHostInterface.getInstance(); - final String gameTitle = hi.getCheevoGameTitle(); - if (gameTitle != null) { - final String formattedTitle = hi.isCheevosChallengeModeActive() ? - String.format(getString(R.string.achievement_title_challenge_mode_format_string), gameTitle) : - gameTitle; - ((TextView) view.findViewById(R.id.title)).setText(formattedTitle); - } - - final int cheevoCount = hi.getCheevoCount(); - final int unlockedCheevoCount = hi.getUnlockedCheevoCount(); - final String summary = String.format(getString(R.string.achievement_summary_format_string), - unlockedCheevoCount, cheevoCount, hi.getCheevoPointsForGame(), hi.getCheevoMaximumPointsForGame()); - ((TextView) view.findViewById(R.id.summary)).setText(summary); - - ProgressBar pb = ((ProgressBar) view.findViewById(R.id.progressBar)); - pb.setMax(cheevoCount); - pb.setProgress(unlockedCheevoCount); - - final ImageView icon = ((ImageView) view.findViewById(R.id.icon)); - final String badgePath = hi.getCheevoGameIconPath(); - if (badgePath != null) { - new ImageLoadTask(icon).executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR, badgePath); - } - } - - private void sortAchievements() { - Arrays.sort(mAchievements, (o1, o2) -> { - if (o2.isLocked() && !o1.isLocked()) - return -1; - else if (o1.isLocked() && !o2.isLocked()) - return 1; - - return o1.getName().compareTo(o2.getName()); - }); - } - - private static class ViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener, View.OnLongClickListener { - private final View mItemView; - - public ViewHolder(@NonNull View itemView) { - super(itemView); - mItemView = itemView; - mItemView.setOnClickListener(this); - mItemView.setOnLongClickListener(this); - } - - public void bindToEntry(Achievement cheevo) { - ImageView icon = ((ImageView) mItemView.findViewById(R.id.icon)); - icon.setImageDrawable(mItemView.getContext().getDrawable(R.drawable.ic_baseline_lock_24)); - - final String badgePath = cheevo.getBadgePath(); - if (badgePath != null) { - new ImageLoadTask(icon).executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR, badgePath); - } - - ((TextView) mItemView.findViewById(R.id.title)).setText(cheevo.getName()); - ((TextView) mItemView.findViewById(R.id.description)).setText(cheevo.getDescription()); - - ((ImageView) mItemView.findViewById(R.id.locked_icon)).setImageDrawable( - mItemView.getContext().getDrawable(cheevo.isLocked() ? R.drawable.ic_baseline_lock_24 : R.drawable.ic_baseline_lock_open_24)); - - final String pointsString = String.format(mItemView.getContext().getString(R.string.achievement_points_format_string), cheevo.getPoints()); - ((TextView) mItemView.findViewById(R.id.points)).setText(pointsString); - } - - @Override - public void onClick(View v) { - // - } - - @Override - public boolean onLongClick(View v) { - return false; - } - } - - private static class ViewAdapter extends RecyclerView.Adapter<AchievementListFragment.ViewHolder> { - private final LayoutInflater mInflater; - private final Achievement[] mAchievements; - - public ViewAdapter(@NonNull Context context, Achievement[] achievements) { - mInflater = LayoutInflater.from(context); - mAchievements = achievements; - } - - @NonNull - @Override - public AchievementListFragment.ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) { - return new AchievementListFragment.ViewHolder(mInflater.inflate(R.layout.layout_achievement_entry, parent, false)); - } - - @Override - public void onBindViewHolder(@NonNull AchievementListFragment.ViewHolder holder, int position) { - holder.bindToEntry(mAchievements[position]); - } - - @Override - public int getItemCount() { - return (mAchievements != null) ? mAchievements.length : 0; - } - - @Override - public int getItemViewType(int position) { - return R.layout.layout_game_list_entry; - } - } -} diff --git a/android/app/src/main/java/com/github/stenzek/duckstation/AchievementSettingsFragment.java b/android/app/src/main/java/com/github/stenzek/duckstation/AchievementSettingsFragment.java deleted file mode 100644 index 0b4c1a149..000000000 --- a/android/app/src/main/java/com/github/stenzek/duckstation/AchievementSettingsFragment.java +++ /dev/null @@ -1,266 +0,0 @@ -package com.github.stenzek.duckstation; - -import android.app.Activity; -import android.app.AlertDialog; -import android.content.Intent; -import android.content.SharedPreferences; -import android.net.Uri; -import android.os.AsyncTask; -import android.os.Bundle; -import android.view.LayoutInflater; -import android.view.View; -import android.view.ViewGroup; -import android.widget.Button; -import android.widget.EditText; -import android.widget.ProgressBar; -import android.widget.TextView; - -import androidx.annotation.NonNull; -import androidx.annotation.Nullable; -import androidx.fragment.app.DialogFragment; -import androidx.preference.Preference; -import androidx.preference.PreferenceFragmentCompat; -import androidx.preference.PreferenceScreen; - -import java.net.URLEncoder; -import java.text.DateFormat; -import java.util.Date; -import java.util.Locale; - -public class AchievementSettingsFragment extends PreferenceFragmentCompat implements Preference.OnPreferenceClickListener { - private static final String REGISTER_URL = "http://retroachievements.org/createaccount.php"; - private static final String PROFILE_URL_PREFIX = "https://retroachievements.org/user/"; - - private boolean isLoggedIn = false; - private String username; - private String loginTokenTime; - - public AchievementSettingsFragment() { - } - - @Override - public void onCreatePreferences(Bundle savedInstanceState, String rootKey) { - setPreferencesFromResource(R.xml.achievement_preferences, rootKey); - updateViews(); - } - - private void updateViews() { - final SharedPreferences prefs = getPreferenceManager().getSharedPreferences(); - - username = prefs.getString("Cheevos/Username", ""); - isLoggedIn = (username != null && !username.isEmpty()); - if (isLoggedIn) { - try { - final String loginTokenTimeString = prefs.getString("Cheevos/LoginTimestamp", ""); - final long loginUnixTimestamp = Long.parseLong(loginTokenTimeString); - - // TODO: Extract to a helper function. - final Date date = new Date(loginUnixTimestamp * 1000); - final DateFormat format = DateFormat.getDateTimeInstance(DateFormat.DEFAULT, DateFormat.SHORT, Locale.getDefault()); - loginTokenTime = format.format(date); - } catch (Exception e) { - loginTokenTime = null; - } - } - - final PreferenceScreen preferenceScreen = getPreferenceScreen(); - - Preference preference = preferenceScreen.findPreference("Cheevos/ChallengeMode"); - if (preference != null) { - // toggling this is disabled while it's running to avoid the whole power off thing - preference.setEnabled(!AndroidHostInterface.getInstance().isEmulationThreadRunning()); - } - - preference = preferenceScreen.findPreference("Cheevos/Login"); - if (preference != null) - { - preference.setVisible(!isLoggedIn); - preference.setOnPreferenceClickListener(this); - } - - preference = preferenceScreen.findPreference("Cheevos/Register"); - if (preference != null) - { - preference.setVisible(!isLoggedIn); - preference.setOnPreferenceClickListener(this); - } - - preference = preferenceScreen.findPreference("Cheevos/Logout"); - if (preference != null) - { - preference.setVisible(isLoggedIn); - preference.setOnPreferenceClickListener(this); - } - - preference = preferenceScreen.findPreference("Cheevos/Username"); - if (preference != null) - { - preference.setVisible(isLoggedIn); - preference.setSummary((username != null) ? username : ""); - } - - preference = preferenceScreen.findPreference("Cheevos/LoginTokenTime"); - if (preference != null) - { - preference.setVisible(isLoggedIn); - preference.setSummary((loginTokenTime != null) ? loginTokenTime : ""); - } - - preference = preferenceScreen.findPreference("Cheevos/ViewProfile"); - if (preference != null) - { - preference.setVisible(isLoggedIn); - preference.setOnPreferenceClickListener(this); - } - } - - @Override - public boolean onPreferenceClick(Preference preference) { - final String key = preference.getKey(); - if (key == null) - return false; - - switch (key) - { - case "Cheevos/Login": - { - handleLogin(); - return true; - } - - case "Cheevos/Logout": - { - handleLogout(); - return true; - } - - case "Cheevos/Register": - { - openUrl(REGISTER_URL); - return true; - } - - case "Cheevos/ViewProfile": - { - final String profileUrl = getProfileUrl(username); - if (profileUrl != null) - openUrl(profileUrl); - - return true; - } - - default: - return false; - } - } - - private void openUrl(String url) { - final Intent browserIntent = new Intent(Intent.ACTION_VIEW, Uri.parse(url)); - startActivity(browserIntent); - } - - private void handleLogin() { - LoginDialogFragment loginDialog = new LoginDialogFragment(this); - loginDialog.show(getFragmentManager(), "fragment_achievement_login"); - } - - private void handleLogout() { - final AlertDialog.Builder builder = new AlertDialog.Builder(getContext()); - builder.setTitle(R.string.settings_achievements_confirm_logout_title); - builder.setMessage(R.string.settings_achievements_confirm_logout_message); - builder.setPositiveButton(R.string.settings_achievements_logout, (dialog, which) -> { - AndroidHostInterface.getInstance().cheevosLogout(); - updateViews(); - }); - builder.setNegativeButton(R.string.achievement_settings_login_cancel_button, (dialog, which) -> dialog.dismiss()); - builder.create().show(); - } - - private static String getProfileUrl(String username) { - try { - final String encodedUsername = URLEncoder.encode(username, "UTF-8"); - return PROFILE_URL_PREFIX + encodedUsername; - } catch (Exception e) { - e.printStackTrace(); - return null; - } - } - - public static class LoginDialogFragment extends DialogFragment { - private AchievementSettingsFragment mParent; - - public LoginDialogFragment(AchievementSettingsFragment parent) { - mParent = parent; - } - - @Nullable - @Override - public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { - return inflater.inflate(R.layout.fragment_achievements_login, container, false); - } - - @Override - public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) { - super.onViewCreated(view, savedInstanceState); - - ((Button)view.findViewById(R.id.login)).setOnClickListener((View.OnClickListener) v -> doLogin()); - ((Button)view.findViewById(R.id.cancel)).setOnClickListener((View.OnClickListener) v -> dismiss()); - } - - private static class LoginTask extends AsyncTask<Void, Void, Void> { - private LoginDialogFragment mParent; - private String mUsername; - private String mPassword; - private boolean mResult; - - public LoginTask(LoginDialogFragment parent, String username, String password) { - mParent = parent; - mUsername = username; - mPassword = password; - } - - @Override - protected Void doInBackground(Void... voids) { - final Activity activity = mParent.getActivity(); - if (activity == null) - return null; - - mResult = AndroidHostInterface.getInstance().cheevosLogin(mUsername, mPassword); - - activity.runOnUiThread(() -> { - if (!mResult) { - ((TextView) mParent.getView().findViewById(R.id.error)).setText(R.string.achievement_settings_login_failed); - mParent.enableUi(true); - return; - } - - mParent.mParent.updateViews(); - mParent.dismiss(); - }); - - return null; - } - } - - private void doLogin() { - final View rootView = getView(); - final String username = ((EditText)rootView.findViewById(R.id.username)).getText().toString(); - final String password = ((EditText)rootView.findViewById(R.id.password)).getText().toString(); - if (username == null || username.length() == 0 || password == null || password.length() == 0) - return; - - enableUi(false); - ((TextView)rootView.findViewById(R.id.error)).setText(""); - new LoginDialogFragment.LoginTask(this, username, password).executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR); - } - - private void enableUi(boolean enabled) { - final View rootView = getView(); - ((EditText)rootView.findViewById(R.id.username)).setEnabled(enabled); - ((EditText)rootView.findViewById(R.id.password)).setEnabled(enabled); - ((Button)rootView.findViewById(R.id.login)).setEnabled(enabled); - ((Button)rootView.findViewById(R.id.cancel)).setEnabled(enabled); - ((ProgressBar)rootView.findViewById(R.id.progressBar)).setVisibility(enabled ? View.GONE : View.VISIBLE); - } - } -} diff --git a/android/app/src/main/java/com/github/stenzek/duckstation/AndroidHostInterface.java b/android/app/src/main/java/com/github/stenzek/duckstation/AndroidHostInterface.java deleted file mode 100644 index 48d70f7d3..000000000 --- a/android/app/src/main/java/com/github/stenzek/duckstation/AndroidHostInterface.java +++ /dev/null @@ -1,211 +0,0 @@ -package com.github.stenzek.duckstation; - -import android.content.Context; -import android.content.SharedPreferences; -import android.content.res.AssetManager; -import android.os.Environment; -import android.os.Process; -import android.util.Log; -import android.view.Surface; -import android.widget.Toast; - -import java.io.IOException; -import java.io.InputStream; -import java.util.Locale; - -public class AndroidHostInterface { - public final static int DISPLAY_ALIGNMENT_TOP_OR_LEFT = 0; - public final static int DISPLAY_ALIGNMENT_CENTER = 1; - public final static int DISPLAY_ALIGNMENT_RIGHT_OR_BOTTOM = 2; - - public final static int CONTROLLER_AXIS_TYPE_FULL = 0; - public final static int CONTROLLER_AXIS_TYPE_HALF = 1; - - private long mNativePointer; - private Context mContext; - private FileHelper mFileHelper; - private EmulationActivity mEmulationActivity; - - public AndroidHostInterface(Context context, FileHelper fileHelper) { - this.mContext = context; - this.mFileHelper = fileHelper; - } - - public void reportError(String message) { - Toast.makeText(mContext, message, Toast.LENGTH_LONG).show(); - } - - public void reportMessage(String message) { - Toast.makeText(mContext, message, Toast.LENGTH_SHORT).show(); - } - - public InputStream openAssetStream(String path) { - try { - return mContext.getAssets().open(path, AssetManager.ACCESS_STREAMING); - } catch (IOException e) { - return null; - } - } - - public void setContext(Context context) { - mContext = context; - } - - public EmulationActivity getEmulationActivity() { return mEmulationActivity; } - - static public native String getScmVersion(); - - static public native String getFullScmVersion(); - - static public native boolean setThreadAffinity(int[] cpus); - - static public native AndroidHostInterface create(Context context, FileHelper fileHelper, String userDirectory); - - public native boolean isEmulationThreadRunning(); - - public native boolean runEmulationThread(EmulationActivity emulationActivity, String filename, boolean resumeState, String state_filename); - - public native boolean isEmulationThreadPaused(); - - public native void pauseEmulationThread(boolean paused); - - public native void stopEmulationThreadLoop(); - - public native boolean hasSurface(); - - public native void surfaceChanged(Surface surface, int format, int width, int height); - - public native void setControllerButtonState(int index, int buttonCode, boolean pressed); - - public native void setControllerAxisState(int index, int axisCode, float value); - - public native void setControllerAutoFireState(int controllerIndex, int autoFireIndex, boolean active); - - public native void setMousePosition(int positionX, int positionY); - - public static native int getControllerButtonCode(String controllerType, String buttonName); - - public static native int getControllerAxisCode(String controllerType, String axisName); - - public static native int getControllerAxisType(String controllerType, String axisName); - - public static native String[] getControllerButtonNames(String controllerType); - - public static native String[] getControllerAxisNames(String controllerType); - - public static native int getControllerVibrationMotorCount(String controllerType); - - public native void handleControllerButtonEvent(int controllerIndex, int buttonIndex, boolean pressed); - - public native void handleControllerAxisEvent(int controllerIndex, int axisIndex, float value); - - public native boolean hasControllerButtonBinding(int controllerIndex, int buttonIndex); - - public native void toggleControllerAnalogMode(); - - public native String[] getInputProfileNames(); - - public native boolean loadInputProfile(String name); - - public native boolean saveInputProfile(String name); - - public native HotkeyInfo[] getHotkeyInfoList(); - - public native void refreshGameList(boolean invalidateCache, boolean invalidateDatabase, AndroidProgressCallback progressCallback); - - public native GameListEntry[] getGameListEntries(); - - public native GameListEntry getGameListEntry(String path); - - public native String getGameSettingValue(String path, String key); - - public native void setGameSettingValue(String path, String key, String value); - - public native void resetSystem(); - - public native void loadState(boolean global, int slot); - - public native void saveState(boolean global, int slot); - - public native void saveResumeState(boolean waitForCompletion); - - public native void applySettings(); - public native void updateInputMap(); - - public native void setDisplayAlignment(int alignment); - - public native PatchCode[] getPatchCodeList(); - - public native void setPatchCodeEnabled(int index, boolean enabled); - - public native boolean importPatchCodesFromString(String str); - - public native void addOSDMessage(String message, float duration); - - public native boolean hasAnyBIOSImages(); - - public native String importBIOSImage(byte[] data); - - public native boolean isFastForwardEnabled(); - - public native void setFastForwardEnabled(boolean enabled); - - public native boolean hasMediaSubImages(); - - public native String[] getMediaSubImageTitles(); - - public native int getMediaSubImageIndex(); - - public native boolean switchMediaSubImage(int index); - - public native boolean setMediaFilename(String filename); - - public native SaveStateInfo[] getSaveStateInfo(boolean includeEmpty); - - public native void setFullscreenUINotificationVerticalPosition(float position, float direction); - - public native boolean isCheevosActive(); - public native boolean isCheevosChallengeModeActive(); - public native Achievement[] getCheevoList(); - public native int getCheevoCount(); - public native int getUnlockedCheevoCount(); - public native int getCheevoPointsForGame(); - public native int getCheevoMaximumPointsForGame(); - public native String getCheevoGameTitle(); - public native String getCheevoGameIconPath(); - public native boolean cheevosLogin(String username, String password); - public native void cheevosLogout(); - - static { - System.loadLibrary("duckstation-native"); - } - - static private AndroidHostInterface mInstance; - static private String mUserDirectory; - - static public boolean createInstance(Context context) { - // Set user path. - mUserDirectory = Environment.getExternalStorageDirectory().getAbsolutePath(); - if (mUserDirectory.isEmpty()) - mUserDirectory = "/sdcard"; - - mUserDirectory += "/duckstation"; - Log.i("AndroidHostInterface", "User directory: " + mUserDirectory); - mInstance = create(context, new FileHelper(context), mUserDirectory); - return mInstance != null; - } - - static public boolean hasInstance() { - return mInstance != null; - } - - static public AndroidHostInterface getInstance() { - return mInstance; - } - - static public String getUserDirectory() { return mUserDirectory; } - - static public boolean hasInstanceAndEmulationThreadIsRunning() { - return hasInstance() && getInstance().isEmulationThreadRunning(); - } -} diff --git a/android/app/src/main/java/com/github/stenzek/duckstation/AndroidProgressCallback.java b/android/app/src/main/java/com/github/stenzek/duckstation/AndroidProgressCallback.java deleted file mode 100644 index a77b9b3b9..000000000 --- a/android/app/src/main/java/com/github/stenzek/duckstation/AndroidProgressCallback.java +++ /dev/null @@ -1,141 +0,0 @@ -package com.github.stenzek.duckstation; - -import android.app.Activity; -import android.app.ProgressDialog; - -import androidx.appcompat.app.AlertDialog; - -public class AndroidProgressCallback { - private Activity mContext; - private ProgressDialog mDialog; - - public AndroidProgressCallback(Activity context) { - mContext = context; - mDialog = new ProgressDialog(context); - mDialog.setCancelable(false); - mDialog.setCanceledOnTouchOutside(false); - mDialog.setMessage(context.getString(R.string.android_progress_callback_please_wait)); - mDialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL); - mDialog.setIndeterminate(false); - mDialog.setMax(100); - mDialog.setProgress(0); - mDialog.show(); - } - - public void dismiss() { - mDialog.dismiss(); - } - - public void setTitle(String text) { - mContext.runOnUiThread(() -> { - mDialog.setTitle(text); - }); - } - - public void setStatusText(String text) { - mContext.runOnUiThread(() -> { - mDialog.setMessage(text); - }); - } - - public void setProgressRange(int range) { - mContext.runOnUiThread(() -> { - mDialog.setMax(range); - }); - } - - public void setProgressValue(int value) { - mContext.runOnUiThread(() -> { - mDialog.setProgress(value); - }); - } - - public void modalError(String message) { - Object lock = new Object(); - mContext.runOnUiThread(() -> { - new AlertDialog.Builder(mContext) - .setTitle("Error") - .setMessage(message) - .setPositiveButton(mContext.getString(R.string.android_progress_callback_ok), (dialog, button) -> { - dialog.dismiss(); - }) - .setOnDismissListener((dialogInterface) -> { - synchronized (lock) { - lock.notify(); - } - }) - .create() - .show(); - }); - - synchronized (lock) { - try { - lock.wait(); - } catch (InterruptedException e) { - } - } - } - - public void modalInformation(String message) { - Object lock = new Object(); - mContext.runOnUiThread(() -> { - new AlertDialog.Builder(mContext) - .setTitle(mContext.getString(R.string.android_progress_callback_information)) - .setMessage(message) - .setPositiveButton(mContext.getString(R.string.android_progress_callback_ok), (dialog, button) -> { - dialog.dismiss(); - }) - .setOnDismissListener((dialogInterface) -> { - synchronized (lock) { - lock.notify(); - } - }) - .create() - .show(); - }); - - synchronized (lock) { - try { - lock.wait(); - } catch (InterruptedException e) { - } - } - } - - private class ConfirmationResult { - public boolean result = false; - } - - public boolean modalConfirmation(String message) { - ConfirmationResult result = new ConfirmationResult(); - mContext.runOnUiThread(() -> { - new AlertDialog.Builder(mContext) - .setTitle(mContext.getString(R.string.android_progress_callback_confirmation)) - .setMessage(message) - .setPositiveButton(mContext.getString(R.string.android_progress_callback_yes), (dialog, button) -> { - result.result = true; - dialog.dismiss(); - }) - .setNegativeButton(mContext.getString(R.string.android_progress_callback_no), (dialog, button) -> { - result.result = false; - dialog.dismiss(); - }) - .setOnDismissListener((dialogInterface) -> { - synchronized (result) { - result.notify(); - } - }) - .create() - .show(); - }); - - synchronized (result) { - try { - result.wait(); - } catch (InterruptedException e) { - } - } - - return result.result; - } -} diff --git a/android/app/src/main/java/com/github/stenzek/duckstation/ConsoleRegion.java b/android/app/src/main/java/com/github/stenzek/duckstation/ConsoleRegion.java deleted file mode 100644 index 0f56417a1..000000000 --- a/android/app/src/main/java/com/github/stenzek/duckstation/ConsoleRegion.java +++ /dev/null @@ -1,8 +0,0 @@ -package com.github.stenzek.duckstation; - -public enum ConsoleRegion { - AutoDetect, - NTSC_J, - NTSC_U, - PAL -} diff --git a/android/app/src/main/java/com/github/stenzek/duckstation/ControllerAutoMapper.java b/android/app/src/main/java/com/github/stenzek/duckstation/ControllerAutoMapper.java deleted file mode 100644 index 175fb3cb3..000000000 --- a/android/app/src/main/java/com/github/stenzek/duckstation/ControllerAutoMapper.java +++ /dev/null @@ -1,295 +0,0 @@ -package com.github.stenzek.duckstation; - -import android.content.Context; -import android.content.SharedPreferences; -import android.os.Vibrator; -import android.text.InputType; -import android.view.InputDevice; -import android.view.KeyEvent; -import android.view.MotionEvent; -import android.widget.EditText; -import android.widget.TextView; - -import androidx.appcompat.app.AlertDialog; -import androidx.preference.PreferenceManager; - -import java.util.ArrayList; -import java.util.List; - -public class ControllerAutoMapper { - public interface CompleteCallback { - public void onComplete(); - } - - private final Context context; - private final int port; - private final CompleteCallback completeCallback; - - private InputDevice device; - private SharedPreferences prefs; - private SharedPreferences.Editor editor; - private StringBuilder log; - private String keyBase; - private String controllerType; - - public ControllerAutoMapper(Context context, int port, CompleteCallback completeCallback) { - this.context = context; - this.port = port; - this.completeCallback = completeCallback; - } - - private void log(String format, Object... args) { - log.append(String.format(format, args)); - log.append('\n'); - } - - private void setButtonBindingToKeyCode(String buttonName, int keyCode) { - log("Binding button '%s' to key '%s' (%d)", buttonName, KeyEvent.keyCodeToString(keyCode), keyCode); - - final String key = String.format("%sButton%s", keyBase, buttonName); - final String value = String.format("%s/Button%d", device.getDescriptor(), keyCode); - editor.putString(key, value); - } - - private void setButtonBindingToAxis(String buttonName, int axis, int direction) { - final char directionIndicator = (direction < 0) ? '-' : '+'; - log("Binding button '%s' to axis '%s' (%d) direction %c", buttonName, MotionEvent.axisToString(axis), axis, directionIndicator); - - final String key = String.format("%sButton%s", keyBase, buttonName); - final String value = String.format("%s/%cAxis%d", device.getDescriptor(), directionIndicator, axis); - editor.putString(key, value); - } - - private void setAxisBindingToAxis(String axisName, int axis) { - log("Binding axis '%s' to axis '%s' (%d)", axisName, MotionEvent.axisToString(axis), axis); - - final String key = String.format("%sAxis%s", keyBase, axisName); - final String value = String.format("%s/Axis%d", device.getDescriptor(), axis); - editor.putString(key, value); - } - - private void doAutoBindingButton(String buttonName, int[] keyCodes, int[][] axisCodes) { - // Prefer the axis codes, as it dispatches to that first. - if (axisCodes != null) { - final List<InputDevice.MotionRange> motionRangeList = device.getMotionRanges(); - for (int[] axisAndDirection : axisCodes) { - final int axis = axisAndDirection[0]; - final int direction = axisAndDirection[1]; - for (InputDevice.MotionRange range : motionRangeList) { - if (range.getAxis() == axis) { - setButtonBindingToAxis(buttonName, axis, direction); - return; - } - } - } - } - - if (keyCodes != null) { - final boolean[] keysPresent = device.hasKeys(keyCodes); - for (int i = 0; i < keysPresent.length; i++) { - if (keysPresent[i]) { - setButtonBindingToKeyCode(buttonName, keyCodes[i]); - return; - } - } - } - - log("No automatic bindings found for button '%s'", buttonName); - } - - private void doAutoBindingAxis(String axisName, int[] axisCodes) { - // Prefer the axis codes, as it dispatches to that first. - if (axisCodes != null) { - final List<InputDevice.MotionRange> motionRangeList = device.getMotionRanges(); - for (final int axis : axisCodes) { - for (InputDevice.MotionRange range : motionRangeList) { - if (range.getAxis() == axis) { - setAxisBindingToAxis(axisName, axis); - return; - } - } - } - } - - log.append(String.format("No automatic bindings found for axis '%s'\n", axisName)); - } - - public void start() { - final ArrayList<InputDevice> deviceList = new ArrayList<>(); - for (final int deviceId : InputDevice.getDeviceIds()) { - final InputDevice inputDevice = InputDevice.getDevice(deviceId); - if (inputDevice == null || !EmulationSurfaceView.isBindableDevice(inputDevice) || - !EmulationSurfaceView.isGamepadDevice(inputDevice)) { - continue; - } - - deviceList.add(inputDevice); - } - - if (deviceList.isEmpty()) { - final AlertDialog.Builder builder = new AlertDialog.Builder(context); - builder.setTitle(R.string.main_activity_error); - builder.setMessage(R.string.controller_auto_mapping_no_devices); - builder.setPositiveButton(R.string.main_activity_ok, (dialog, which) -> dialog.dismiss()); - builder.create().show(); - return; - } - - final String[] deviceNames = new String[deviceList.size()]; - for (int i = 0; i < deviceList.size(); i++) - deviceNames[i] = deviceList.get(i).getName(); - - final AlertDialog.Builder builder = new AlertDialog.Builder(context); - builder.setTitle(R.string.controller_auto_mapping_select_device); - builder.setItems(deviceNames, (dialog, which) -> { - process(deviceList.get(which)); - }); - builder.create().show(); - } - - private void process(InputDevice device) { - this.prefs = PreferenceManager.getDefaultSharedPreferences(context); - this.editor = prefs.edit(); - this.log = new StringBuilder(); - this.device = device; - - this.keyBase = String.format("Controller%d/", port); - this.controllerType = ControllerSettingsCollectionFragment.getControllerType(prefs, port); - - setButtonBindings(); - setAxisBindings(); - setVibrationBinding(); - - this.editor.commit(); - this.editor = null; - - final AlertDialog.Builder builder = new AlertDialog.Builder(context); - builder.setTitle(R.string.controller_auto_mapping_results); - - final EditText editText = new EditText(context); - editText.setText(log.toString()); - editText.setInputType(InputType.TYPE_NULL | InputType.TYPE_TEXT_FLAG_MULTI_LINE); - editText.setSingleLine(false); - builder.setView(editText); - - builder.setPositiveButton(R.string.main_activity_ok, (dialog, which) -> dialog.dismiss()); - builder.create().show(); - - if (completeCallback != null) - completeCallback.onComplete(); - } - - private void setButtonBindings() { - final String[] buttonNames = AndroidHostInterface.getInstance().getControllerButtonNames(controllerType); - if (buttonNames == null || buttonNames.length == 0) { - log("No axes to bind."); - return; - } - - for (final String buttonName : buttonNames) { - switch (buttonName) { - case "Up": - doAutoBindingButton(buttonName, new int[]{KeyEvent.KEYCODE_DPAD_UP}, new int[][]{{MotionEvent.AXIS_HAT_Y, -1}}); - break; - case "Down": - doAutoBindingButton(buttonName, new int[]{KeyEvent.KEYCODE_DPAD_DOWN}, new int[][]{{MotionEvent.AXIS_HAT_Y, 1}}); - break; - case "Left": - doAutoBindingButton(buttonName, new int[]{KeyEvent.KEYCODE_DPAD_LEFT}, new int[][]{{MotionEvent.AXIS_HAT_X, -1}}); - break; - case "Right": - doAutoBindingButton(buttonName, new int[]{KeyEvent.KEYCODE_DPAD_RIGHT}, new int[][]{{MotionEvent.AXIS_HAT_X, 1}}); - break; - case "Select": - doAutoBindingButton(buttonName, new int[]{KeyEvent.KEYCODE_BUTTON_SELECT}, null); - break; - case "Start": - doAutoBindingButton(buttonName, new int[]{KeyEvent.KEYCODE_BUTTON_START}, null); - break; - case "Triangle": - doAutoBindingButton(buttonName, new int[]{KeyEvent.KEYCODE_BUTTON_Y}, null); - break; - case "Cross": - doAutoBindingButton(buttonName, new int[]{KeyEvent.KEYCODE_BUTTON_A}, null); - break; - case "Circle": - doAutoBindingButton(buttonName, new int[]{KeyEvent.KEYCODE_BUTTON_B}, null); - break; - case "Square": - doAutoBindingButton(buttonName, new int[]{KeyEvent.KEYCODE_BUTTON_X}, null); - break; - case "L1": - doAutoBindingButton(buttonName, new int[]{KeyEvent.KEYCODE_BUTTON_L1}, null); - break; - case "L2": - doAutoBindingButton(buttonName, new int[]{KeyEvent.KEYCODE_BUTTON_L2}, new int[][]{{MotionEvent.AXIS_LTRIGGER, 1}, {MotionEvent.AXIS_Z, 1}, {MotionEvent.AXIS_BRAKE, 1}}); - break; - case "R1": - doAutoBindingButton(buttonName, new int[]{KeyEvent.KEYCODE_BUTTON_R1}, null); - break; - case "R2": - doAutoBindingButton(buttonName, new int[]{KeyEvent.KEYCODE_BUTTON_R2}, new int[][]{{MotionEvent.AXIS_RTRIGGER, 1}, {MotionEvent.AXIS_RZ, 1}, {MotionEvent.AXIS_GAS, 1}}); - break; - case "L3": - doAutoBindingButton(buttonName, new int[]{KeyEvent.KEYCODE_BUTTON_THUMBL}, null); - break; - case "R3": - doAutoBindingButton(buttonName, new int[]{KeyEvent.KEYCODE_BUTTON_THUMBR}, null); - break; - case "Analog": - doAutoBindingButton(buttonName, new int[]{KeyEvent.KEYCODE_BUTTON_MODE}, null); - break; - default: - log("Button '%s' not supported by auto mapping.", buttonName); - break; - } - } - } - - private void setAxisBindings() { - final String[] axisNames = AndroidHostInterface.getInstance().getControllerAxisNames(controllerType); - if (axisNames == null || axisNames.length == 0) { - log("No axes to bind."); - return; - } - - for (final String axisName : axisNames) { - switch (axisName) { - case "LeftX": - doAutoBindingAxis(axisName, new int[]{MotionEvent.AXIS_X}); - break; - case "LeftY": - doAutoBindingAxis(axisName, new int[]{MotionEvent.AXIS_Y}); - break; - case "RightX": - doAutoBindingAxis(axisName, new int[]{MotionEvent.AXIS_RX, MotionEvent.AXIS_Z}); - break; - case "RightY": - doAutoBindingAxis(axisName, new int[]{MotionEvent.AXIS_RY, MotionEvent.AXIS_RZ}); - break; - default: - log("Axis '%s' not supported by auto mapping.", axisName); - break; - } - } - } - - private void setVibrationBinding() { - final int motorCount = AndroidHostInterface.getInstance().getControllerVibrationMotorCount(controllerType); - if (motorCount == 0) { - log("No vibration motors to bind."); - return; - } - - final Vibrator vibrator = device.getVibrator(); - if (vibrator == null || !vibrator.hasVibrator()) { - log("Selected device has no vibrator, cannot bind vibration."); - return; - } - - log("Binding vibration to device '%s'.", device.getDescriptor()); - - final String key = String.format("%sRumble", keyBase); - editor.putString(key, device.getDescriptor()); - } -} diff --git a/android/app/src/main/java/com/github/stenzek/duckstation/ControllerBindingDialog.java b/android/app/src/main/java/com/github/stenzek/duckstation/ControllerBindingDialog.java deleted file mode 100644 index 8b6344c25..000000000 --- a/android/app/src/main/java/com/github/stenzek/duckstation/ControllerBindingDialog.java +++ /dev/null @@ -1,170 +0,0 @@ -package com.github.stenzek.duckstation; - -import android.app.AlertDialog; -import android.content.Context; -import android.content.DialogInterface; -import android.content.SharedPreferences; -import android.preference.PreferenceManager; -import android.util.ArraySet; -import android.view.InputDevice; -import android.view.KeyEvent; -import android.view.MotionEvent; -import android.widget.Toast; - -import androidx.annotation.NonNull; - -import java.util.HashMap; -import java.util.List; - -public class ControllerBindingDialog extends AlertDialog { - final static float DETECT_THRESHOLD = 0.25f; - private final ControllerBindingPreference.Type mType; - private final String mSettingKey; - private String mCurrentBinding; - private int mUpdatedAxisCode = -1; - private final HashMap<Integer, float[]> mStartingAxisValues = new HashMap<>(); - - public ControllerBindingDialog(Context context, String buttonName, String settingKey, String currentBinding, ControllerBindingPreference.Type type) { - super(context); - - mType = type; - mSettingKey = settingKey; - mCurrentBinding = currentBinding; - if (mCurrentBinding == null) - mCurrentBinding = getContext().getString(R.string.controller_binding_dialog_no_binding); - - setTitle(buttonName); - updateMessage(); - setButton(BUTTON_POSITIVE, context.getString(R.string.controller_binding_dialog_cancel), (dialogInterface, button) -> dismiss()); - setButton(BUTTON_NEGATIVE, context.getString(R.string.controller_binding_dialog_clear), (dialogInterface, button) -> { - mCurrentBinding = null; - updateBinding(); - dismiss(); - }); - - setOnKeyListener(new DialogInterface.OnKeyListener() { - @Override - public boolean onKey(DialogInterface dialog, int keyCode, KeyEvent event) { - return onKeyDown(keyCode, event); - } - }); - } - - private void updateMessage() { - setMessage(String.format(getContext().getString(R.string.controller_binding_dialog_message), mCurrentBinding)); - } - - private void updateBinding() { - SharedPreferences.Editor editor = PreferenceManager.getDefaultSharedPreferences(getContext()).edit(); - if (mCurrentBinding != null) { - ArraySet<String> values = new ArraySet<>(); - values.add(mCurrentBinding); - editor.putStringSet(mSettingKey, values); - } else { - try { - editor.remove(mSettingKey); - } catch (Exception e) { - - } - } - - editor.commit(); - } - - @Override - public boolean onKeyDown(int keyCode, KeyEvent event) { - final InputDevice device = event.getDevice(); - if (!EmulationSurfaceView.isBindableDevice(device) || !EmulationSurfaceView.isBindableKeyEvent(event)) { - return super.onKeyDown(keyCode, event); - } - - if (mType == ControllerBindingPreference.Type.BUTTON || mType == ControllerBindingPreference.Type.HALF_AXIS) { - mCurrentBinding = String.format("%s/Button%d", device.getDescriptor(), event.getKeyCode()); - } else if (mType == ControllerBindingPreference.Type.VIBRATION) { - if (device.getVibrator() == null || !device.getVibrator().hasVibrator()) { - Toast.makeText(getContext(), getContext().getString(R.string.controller_settings_vibration_unsupported), Toast.LENGTH_LONG).show(); - dismiss(); - return true; - } - - mCurrentBinding = device.getDescriptor(); - } else { - return super.onKeyDown(keyCode, event); - } - - updateMessage(); - updateBinding(); - dismiss(); - return true; - } - - private void setAxisCode(InputDevice device, int axisCode, boolean positive) { - if (mUpdatedAxisCode >= 0) - return; - - mUpdatedAxisCode = axisCode; - - final int controllerIndex = 0; - if (mType == ControllerBindingPreference.Type.AXIS || mType == ControllerBindingPreference.Type.HALF_AXIS) - mCurrentBinding = String.format("%s/Axis%d", device.getDescriptor(), axisCode); - else - mCurrentBinding = String.format("%s/%cAxis%d", device.getDescriptor(), (positive) ? '+' : '-', axisCode); - - updateBinding(); - updateMessage(); - dismiss(); - } - - private boolean doAxisDetection(MotionEvent event) { - if (!EmulationSurfaceView.isBindableDevice(event.getDevice()) || !EmulationSurfaceView.isJoystickMotionEvent(event)) - return false; - - final List<InputDevice.MotionRange> motionEventList = event.getDevice().getMotionRanges(); - if (motionEventList == null || motionEventList.isEmpty()) - return false; - - final int deviceId = event.getDeviceId(); - if (!mStartingAxisValues.containsKey(deviceId)) { - final float[] axisValues = new float[motionEventList.size()]; - for (int axisIndex = 0; axisIndex < motionEventList.size(); axisIndex++) { - final int axisCode = motionEventList.get(axisIndex).getAxis(); - - if (event.getHistorySize() > 0) - axisValues[axisIndex] = event.getHistoricalAxisValue(axisCode, 0); - else if (axisCode == MotionEvent.AXIS_HAT_X || axisCode == MotionEvent.AXIS_HAT_Y) - axisValues[axisIndex] = 0.0f; - else - axisValues[axisIndex] = event.getAxisValue(axisCode); - } - - mStartingAxisValues.put(deviceId, axisValues); - } - - final float[] axisValues = mStartingAxisValues.get(deviceId); - for (int axisIndex = 0; axisIndex < motionEventList.size(); axisIndex++) { - final int axisCode = motionEventList.get(axisIndex).getAxis(); - final float newValue = event.getAxisValue(axisCode); - final float delta = newValue - axisValues[axisIndex]; - if (Math.abs(delta) >= DETECT_THRESHOLD) { - setAxisCode(event.getDevice(), axisCode, delta >= 0.0f); - break; - } - } - - return true; - } - - @Override - public boolean onGenericMotionEvent(@NonNull MotionEvent event) { - if (mType != ControllerBindingPreference.Type.AXIS && - mType != ControllerBindingPreference.Type.HALF_AXIS && - mType != ControllerBindingPreference.Type.BUTTON) { - return false; - } - - if (doAxisDetection(event)) - return true; - - return super.onGenericMotionEvent(event); - } -} diff --git a/android/app/src/main/java/com/github/stenzek/duckstation/ControllerBindingPreference.java b/android/app/src/main/java/com/github/stenzek/duckstation/ControllerBindingPreference.java deleted file mode 100644 index 0aa4ad707..000000000 --- a/android/app/src/main/java/com/github/stenzek/duckstation/ControllerBindingPreference.java +++ /dev/null @@ -1,268 +0,0 @@ -package com.github.stenzek.duckstation; - -import android.content.Context; -import android.content.SharedPreferences; -import android.util.AttributeSet; -import android.view.InputDevice; -import android.widget.ImageView; -import android.widget.TextView; - -import androidx.core.content.ContextCompat; -import androidx.preference.Preference; -import androidx.preference.PreferenceManager; -import androidx.preference.PreferenceViewHolder; - -import java.util.Set; - -public class ControllerBindingPreference extends Preference { - public enum Type { - BUTTON, - AXIS, - HALF_AXIS, - VIBRATION - } - - private enum VisualType { - BUTTON, - AXIS, - VIBRATION, - HOTKEY - } - - private String mBindingName; - private String mDisplayName; - private String mValue; - private TextView mValueView; - private Type mType = Type.BUTTON; - private VisualType mVisualType = VisualType.BUTTON; - - private static int getIconForButton(String buttonName) { - if (buttonName.equals("Up")) { - return R.drawable.ic_controller_up_button_pressed; - } else if (buttonName.equals("Right")) { - return R.drawable.ic_controller_right_button_pressed; - } else if (buttonName.equals("Down")) { - return R.drawable.ic_controller_down_button_pressed; - } else if (buttonName.equals("Left")) { - return R.drawable.ic_controller_left_button_pressed; - } else if (buttonName.equals("Triangle")) { - return R.drawable.ic_controller_triangle_button_pressed; - } else if (buttonName.equals("Circle")) { - return R.drawable.ic_controller_circle_button_pressed; - } else if (buttonName.equals("Cross")) { - return R.drawable.ic_controller_cross_button_pressed; - } else if (buttonName.equals("Square")) { - return R.drawable.ic_controller_square_button_pressed; - } else if (buttonName.equals("Start")) { - return R.drawable.ic_controller_start_button_pressed; - } else if (buttonName.equals("Select")) { - return R.drawable.ic_controller_select_button_pressed; - } else if (buttonName.equals("L1")) { - return R.drawable.ic_controller_l1_button_pressed; - } else if (buttonName.equals("L2")) { - return R.drawable.ic_controller_l2_button_pressed; - } else if (buttonName.equals("R1")) { - return R.drawable.ic_controller_r1_button_pressed; - } else if (buttonName.equals("R2")) { - return R.drawable.ic_controller_r2_button_pressed; - } - - return R.drawable.ic_baseline_radio_button_unchecked_24; - } - - private static int getIconForAxis(String axisName) { - return R.drawable.ic_baseline_radio_button_checked_24; - } - - private static int getIconForHotkey(String hotkeyDisplayName) { - switch (hotkeyDisplayName) { - case "FastForward": - case "ToggleFastForward": - case "Turbo": - case "ToggleTurbo": - return R.drawable.ic_controller_fast_forward; - - default: - return R.drawable.ic_baseline_category_24; - } - } - - public ControllerBindingPreference(Context context, AttributeSet attrs) { - this(context, attrs, 0); - setWidgetLayoutResource(R.layout.layout_controller_binding_preference); - setIconSpaceReserved(false); - } - - public ControllerBindingPreference(Context context, AttributeSet attrs, int defStyleAttr) { - super(context, attrs, defStyleAttr); - setWidgetLayoutResource(R.layout.layout_controller_binding_preference); - setIconSpaceReserved(false); - } - - public ControllerBindingPreference(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) { - super(context, attrs, defStyleAttr, defStyleRes); - setWidgetLayoutResource(R.layout.layout_controller_binding_preference); - setIconSpaceReserved(false); - } - - @Override - public void onBindViewHolder(PreferenceViewHolder holder) { - super.onBindViewHolder(holder); - - ImageView iconView = ((ImageView) holder.findViewById(R.id.controller_binding_icon)); - TextView nameView = ((TextView) holder.findViewById(R.id.controller_binding_name)); - mValueView = ((TextView) holder.findViewById(R.id.controller_binding_value)); - - int drawableId = R.drawable.ic_baseline_radio_button_checked_24; - switch (mVisualType) { - case BUTTON: - drawableId = getIconForButton(mBindingName); - break; - case AXIS: - drawableId = getIconForAxis(mBindingName); - break; - case HOTKEY: - drawableId = getIconForHotkey(mBindingName); - break; - case VIBRATION: - drawableId = R.drawable.ic_baseline_vibration_24; - break; - } - - iconView.setImageDrawable(ContextCompat.getDrawable(getContext(), drawableId)); - nameView.setText(mDisplayName); - updateValue(); - } - - @Override - protected void onClick() { - ControllerBindingDialog dialog = new ControllerBindingDialog(getContext(), mBindingName, getKey(), mValue, mType); - dialog.setOnDismissListener((dismissedDialog) -> updateValue()); - dialog.show(); - } - - public void initButton(int controllerIndex, String buttonName) { - mBindingName = buttonName; - mDisplayName = buttonName; - mType = Type.BUTTON; - mVisualType = VisualType.BUTTON; - setKey(String.format("Controller%d/Button%s", controllerIndex, buttonName)); - updateValue(); - } - - public void initAxis(int controllerIndex, String axisName, int axisType) { - mBindingName = axisName; - mDisplayName = axisName; - mType = (axisType == AndroidHostInterface.CONTROLLER_AXIS_TYPE_HALF) ? Type.HALF_AXIS : Type.AXIS; - mVisualType = VisualType.AXIS; - setKey(String.format("Controller%d/Axis%s", controllerIndex, axisName)); - updateValue(); - } - - public void initVibration(int controllerIndex) { - mBindingName = "Rumble"; - mDisplayName = getContext().getString(R.string.controller_binding_device_for_vibration); - mType = Type.VIBRATION; - mVisualType = VisualType.VIBRATION; - setKey(String.format("Controller%d/Rumble", controllerIndex)); - updateValue(); - } - - public void initHotkey(HotkeyInfo hotkeyInfo) { - mBindingName = hotkeyInfo.getName(); - mDisplayName = hotkeyInfo.getDisplayName(); - mType = Type.BUTTON; - mVisualType = VisualType.HOTKEY; - setKey(hotkeyInfo.getBindingConfigKey()); - updateValue(); - } - - public void initAutoFireButton(int controllerIndex, int autoFireSlot) { - mBindingName = String.format("AutoFire%d", autoFireSlot); - mDisplayName = getContext().getString(R.string.controller_binding_auto_fire_n, autoFireSlot); - mType = Type.BUTTON; - mVisualType = VisualType.BUTTON; - setKey(String.format("Controller%d/AutoFire%d", controllerIndex, autoFireSlot)); - updateValue(); - } - - private String prettyPrintBinding(String value) { - final int index = value.indexOf('/'); - String device, binding; - if (index >= 0) { - device = value.substring(0, index); - binding = value.substring(index); - } else { - device = value; - binding = ""; - } - - String humanName = device; - int deviceIndex = -1; - - final int[] deviceIds = InputDevice.getDeviceIds(); - for (int i = 0; i < deviceIds.length; i++) { - final InputDevice inputDevice = InputDevice.getDevice(deviceIds[i]); - if (inputDevice == null || !inputDevice.getDescriptor().equals(device)) { - continue; - } - - humanName = inputDevice.getName(); - deviceIndex = i; - break; - } - - final int MAX_LENGTH = 40; - if (humanName.length() > MAX_LENGTH) { - final StringBuilder shortenedName = new StringBuilder(); - shortenedName.append(humanName, 0, MAX_LENGTH / 2); - shortenedName.append("..."); - shortenedName.append(humanName, humanName.length() - (MAX_LENGTH / 2), - humanName.length()); - - humanName = shortenedName.toString(); - } - - if (deviceIndex < 0) - return String.format("%s[??]%s", humanName, binding); - else - return String.format("%s[%d]%s", humanName, deviceIndex, binding); - } - - private void updateValue(String value) { - mValue = value; - if (mValueView != null) { - if (value != null) - mValueView.setText(value); - else - mValueView.setText(getContext().getString(R.string.controller_binding_dialog_no_binding)); - } - } - - public void updateValue() { - SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(getContext()); - Set<String> values = PreferenceHelpers.getStringSet(prefs, getKey()); - if (values != null) { - StringBuilder sb = new StringBuilder(); - for (String value : values) { - if (sb.length() > 0) - sb.append(", "); - sb.append(prettyPrintBinding(value)); - } - - updateValue(sb.toString()); - } else { - updateValue(null); - } - } - - public void clearBinding(SharedPreferences.Editor prefEditor) { - try { - prefEditor.remove(getKey()); - } catch (Exception e) { - - } - - updateValue(null); - } -} diff --git a/android/app/src/main/java/com/github/stenzek/duckstation/ControllerSettingsActivity.java b/android/app/src/main/java/com/github/stenzek/duckstation/ControllerSettingsActivity.java deleted file mode 100644 index 73448dbc8..000000000 --- a/android/app/src/main/java/com/github/stenzek/duckstation/ControllerSettingsActivity.java +++ /dev/null @@ -1,132 +0,0 @@ -package com.github.stenzek.duckstation; - -import android.content.SharedPreferences; -import android.os.Bundle; -import android.view.Menu; -import android.view.MenuItem; -import android.widget.EditText; -import android.widget.Toast; - -import androidx.annotation.NonNull; -import androidx.appcompat.app.ActionBar; -import androidx.appcompat.app.AlertDialog; -import androidx.appcompat.app.AppCompatActivity; -import androidx.preference.PreferenceManager; - -import java.util.ArrayList; - -public class ControllerSettingsActivity extends AppCompatActivity { - private ControllerSettingsCollectionFragment fragment; - - @Override - protected void onCreate(Bundle savedInstanceState) { - super.onCreate(null); - setContentView(R.layout.settings_activity); - - fragment = new ControllerSettingsCollectionFragment(); - fragment.setMultitapModeChangedListener(this::recreate); - - getSupportFragmentManager() - .beginTransaction() - .replace(R.id.settings, fragment) - .commit(); - ActionBar actionBar = getSupportActionBar(); - if (actionBar != null) { - actionBar.setDisplayHomeAsUpEnabled(true); - actionBar.setTitle(R.string.controller_mapping_activity_title); - } - } - - @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_controller_mapping, menu); - return true; - } - - @Override - public boolean onOptionsItemSelected(@NonNull MenuItem item) { - if (item.getItemId() == android.R.id.home) { - onBackPressed(); - return true; - } - - final int id = item.getItemId(); - - //noinspection SimplifiableIfStatement - if (id == R.id.action_load_profile) { - doLoadProfile(); - return true; - } else if (id == R.id.action_save_profile) { - doSaveProfile(); - return true; - } else if (id == R.id.action_clear_bindings) { - fragment.clearAllBindings(); - return true; - } else { - return super.onOptionsItemSelected(item); - } - } - - private void displayError(String text) { - new AlertDialog.Builder(this) - .setTitle(R.string.emulation_activity_error) - .setMessage(text) - .setNegativeButton(R.string.main_activity_ok, ((dialog, which) -> dialog.dismiss())) - .create() - .show(); - } - - private void doLoadProfile() { - final String[] profileNames = AndroidHostInterface.getInstance().getInputProfileNames(); - if (profileNames == null) { - displayError(getString(R.string.controller_mapping_activity_no_profiles_found)); - return; - } - - new AlertDialog.Builder(this) - .setTitle(R.string.controller_mapping_activity_select_input_profile) - .setItems(profileNames, (dialog, choice) -> { - doLoadProfile(profileNames[choice]); - dialog.dismiss(); - }) - .setNegativeButton(R.string.controller_mapping_activity_cancel, ((dialog, which) -> dialog.dismiss())) - .create() - .show(); - } - - private void doLoadProfile(String profileName) { - if (!AndroidHostInterface.getInstance().loadInputProfile(profileName)) { - displayError(String.format(getString(R.string.controller_mapping_activity_failed_to_load_profile), profileName)); - return; - } - - fragment.updateAllBindings(); - } - - private void doSaveProfile() { - final AlertDialog.Builder builder = new AlertDialog.Builder(this); - final EditText input = new EditText(this); - builder.setTitle(R.string.controller_mapping_activity_input_profile_name); - builder.setView(input); - builder.setPositiveButton(R.string.controller_mapping_activity_save, (dialog, which) -> { - final String name = input.getText().toString(); - if (name.isEmpty()) { - displayError(getString(R.string.controller_mapping_activity_name_must_be_provided)); - return; - } - - if (!AndroidHostInterface.getInstance().saveInputProfile(name)) { - displayError(getString(R.string.controller_mapping_activity_failed_to_save_input_profile)); - return; - } - - Toast.makeText(ControllerSettingsActivity.this, String.format(ControllerSettingsActivity.this.getString(R.string.controller_mapping_activity_input_profile_saved), name), - Toast.LENGTH_LONG).show(); - }); - builder.setNegativeButton(R.string.controller_mapping_activity_cancel, (dialog, which) -> dialog.dismiss()); - builder.create().show(); - } - - -} \ No newline at end of file diff --git a/android/app/src/main/java/com/github/stenzek/duckstation/ControllerSettingsCollectionFragment.java b/android/app/src/main/java/com/github/stenzek/duckstation/ControllerSettingsCollectionFragment.java deleted file mode 100644 index 00b86191d..000000000 --- a/android/app/src/main/java/com/github/stenzek/duckstation/ControllerSettingsCollectionFragment.java +++ /dev/null @@ -1,459 +0,0 @@ -package com.github.stenzek.duckstation; - - -import android.annotation.SuppressLint; -import android.app.Dialog; -import android.content.SharedPreferences; -import android.os.Bundle; -import android.view.LayoutInflater; -import android.view.View; -import android.view.ViewGroup; -import android.view.Window; -import android.widget.Toast; - -import androidx.annotation.NonNull; -import androidx.annotation.Nullable; -import androidx.appcompat.app.AlertDialog; -import androidx.fragment.app.DialogFragment; -import androidx.fragment.app.Fragment; -import androidx.preference.ListPreference; -import androidx.preference.Preference; -import androidx.preference.PreferenceCategory; -import androidx.preference.PreferenceFragmentCompat; -import androidx.preference.PreferenceManager; -import androidx.preference.PreferenceScreen; -import androidx.preference.SeekBarPreference; -import androidx.preference.SwitchPreferenceCompat; -import androidx.viewpager2.adapter.FragmentStateAdapter; -import androidx.viewpager2.widget.ViewPager2; - -import com.google.android.material.tabs.TabLayout; -import com.google.android.material.tabs.TabLayoutMediator; - -import java.util.ArrayList; -import java.util.HashMap; - -public class ControllerSettingsCollectionFragment extends Fragment { - public static final String MULTITAP_MODE_SETTINGS_KEY = "ControllerPorts/MultitapMode"; - private static final int NUM_MAIN_CONTROLLER_PORTS = 2; - private static final int NUM_SUB_CONTROLLER_PORTS = 4; - private static final char[] SUB_CONTROLLER_PORT_NAMES = new char[]{'A', 'B', 'C', 'D'}; - private static final int NUM_AUTO_FIRE_BUTTONS = 4; - - public interface MultitapModeChangedListener { - void onChanged(); - } - - private final ArrayList<ControllerBindingPreference> preferences = new ArrayList<>(); - private SettingsCollectionAdapter adapter; - private ViewPager2 viewPager; - private String[] controllerPortNames; - - private MultitapModeChangedListener multitapModeChangedListener; - - public ControllerSettingsCollectionFragment() { - } - - public static String getControllerTypeKey(int port) { - return String.format("Controller%d/Type", port); - } - - public static String getControllerType(SharedPreferences prefs, int port) { - final String defaultControllerType = (port == 1) ? "DigitalController" : "None"; - return prefs.getString(getControllerTypeKey(port), defaultControllerType); - } - - @Nullable - @Override - public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { - return inflater.inflate(R.layout.fragment_controller_settings, container, false); - } - - @Override - public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) { - final String multitapMode = PreferenceManager.getDefaultSharedPreferences(getContext()).getString( - MULTITAP_MODE_SETTINGS_KEY, "Disabled"); - - final ArrayList<String> portNames = new ArrayList<>(); - for (int i = 0; i < NUM_MAIN_CONTROLLER_PORTS; i++) { - final boolean isMultitap = (multitapMode.equals("BothPorts") || - (i == 0 && multitapMode.equals("Port1Only")) || - (i == 1 && multitapMode.equals("Port2Only"))); - - if (isMultitap) { - for (int j = 0; j < NUM_SUB_CONTROLLER_PORTS; j++) { - portNames.add(getContext().getString( - R.string.controller_settings_sub_port_format, - i + 1, SUB_CONTROLLER_PORT_NAMES[j])); - } - } else { - portNames.add(getContext().getString( - R.string.controller_settings_main_port_format, - i + 1)); - } - } - - controllerPortNames = new String[portNames.size()]; - portNames.toArray(controllerPortNames); - - adapter = new SettingsCollectionAdapter(this, controllerPortNames.length); - viewPager = view.findViewById(R.id.view_pager); - viewPager.setAdapter(adapter); - - TabLayout tabLayout = view.findViewById(R.id.tab_layout); - new TabLayoutMediator(tabLayout, viewPager, (tab, position) -> { - if (position == 0) - tab.setText(R.string.controller_settings_tab_settings); - else if (position <= controllerPortNames.length) - tab.setText(controllerPortNames[position - 1]); - else - tab.setText(R.string.controller_settings_tab_hotkeys); - }).attach(); - } - - public void setMultitapModeChangedListener(MultitapModeChangedListener multitapModeChangedListener) { - this.multitapModeChangedListener = multitapModeChangedListener; - } - - public void clearAllBindings() { - SharedPreferences.Editor prefEdit = PreferenceManager.getDefaultSharedPreferences(getContext()).edit(); - for (ControllerBindingPreference pref : preferences) - pref.clearBinding(prefEdit); - prefEdit.commit(); - } - - public void updateAllBindings() { - for (ControllerBindingPreference pref : preferences) - pref.updateValue(); - } - - public static class SettingsFragment extends PreferenceFragmentCompat { - private final ControllerSettingsCollectionFragment parent; - - public SettingsFragment(ControllerSettingsCollectionFragment parent) { - this.parent = parent; - } - - @Override - public void onCreatePreferences(Bundle savedInstanceState, String rootKey) { - setPreferencesFromResource(R.xml.controllers_preferences, rootKey); - - final Preference multitapModePreference = getPreferenceScreen().findPreference(MULTITAP_MODE_SETTINGS_KEY); - if (multitapModePreference != null) { - multitapModePreference.setOnPreferenceChangeListener((pref, newValue) -> { - if (parent.multitapModeChangedListener != null) - parent.multitapModeChangedListener.onChanged(); - - return true; - }); - } - } - } - - public static class ControllerPortFragment extends PreferenceFragmentCompat { - private final ControllerSettingsCollectionFragment parent; - private final int controllerIndex; - private PreferenceCategory mButtonsCategory; - private PreferenceCategory mAxisCategory; - private PreferenceCategory mSettingsCategory; - private PreferenceCategory mAutoFireCategory; - private PreferenceCategory mAutoFireBindingsCategory; - - public ControllerPortFragment(ControllerSettingsCollectionFragment parent, int controllerIndex) { - this.parent = parent; - this.controllerIndex = controllerIndex; - } - - private static void clearBindingsInCategory(SharedPreferences.Editor editor, PreferenceCategory category) { - for (int i = 0; i < category.getPreferenceCount(); i++) { - final Preference preference = category.getPreference(i); - if (preference instanceof ControllerBindingPreference) - ((ControllerBindingPreference) preference).clearBinding(editor); - } - } - - @Override - public void onCreatePreferences(Bundle savedInstanceState, String rootKey) { - final PreferenceScreen ps = getPreferenceManager().createPreferenceScreen(getContext()); - setPreferenceScreen(ps); - createPreferences(); - } - - private SwitchPreferenceCompat createTogglePreference(String key, int title, int summary, boolean defaultValue) { - final SwitchPreferenceCompat pref = new SwitchPreferenceCompat(getContext()); - pref.setKey(key); - pref.setTitle(title); - pref.setSummary(summary); - pref.setIconSpaceReserved(false); - pref.setDefaultValue(defaultValue); - return pref; - } - - private String getAutoToggleSummary(SharedPreferences sp, int slot) { - final String button = sp.getString(String.format("AutoFire%dButton", slot), null); - if (button == null || button.length() == 0) - return "Not Configured"; - - return String.format("%s every %d frames", button, sp.getInt("AutoFire%dFrequency", 2)); - } - - private void createPreferences() { - final PreferenceScreen ps = getPreferenceScreen(); - final SharedPreferences sp = getPreferenceManager().getSharedPreferences(); - final String controllerType = getControllerType(sp, controllerIndex); - final String[] controllerButtons = AndroidHostInterface.getControllerButtonNames(controllerType); - final String[] axisButtons = AndroidHostInterface.getControllerAxisNames(controllerType); - final int vibrationMotors = AndroidHostInterface.getControllerVibrationMotorCount(controllerType); - - final ListPreference typePreference = new ListPreference(getContext()); - typePreference.setEntries(R.array.settings_controller_type_entries); - typePreference.setEntryValues(R.array.settings_controller_type_values); - typePreference.setKey(getControllerTypeKey(controllerIndex)); - typePreference.setValue(controllerType); - typePreference.setTitle(R.string.settings_controller_type); - typePreference.setSummaryProvider(ListPreference.SimpleSummaryProvider.getInstance()); - typePreference.setIconSpaceReserved(false); - typePreference.setOnPreferenceChangeListener((pref, value) -> { - removePreferences(); - createPreferences(value.toString()); - return true; - }); - ps.addPreference(typePreference); - - final Preference autoBindPreference = new Preference(getContext()); - autoBindPreference.setTitle(R.string.controller_settings_automatic_mapping); - autoBindPreference.setSummary(R.string.controller_settings_summary_automatic_mapping); - autoBindPreference.setIconSpaceReserved(false); - autoBindPreference.setOnPreferenceClickListener(preference -> { - final ControllerAutoMapper mapper = new ControllerAutoMapper(getContext(), controllerIndex, () -> { - removePreferences(); - createPreferences(typePreference.getValue()); - }); - mapper.start(); - return true; - }); - ps.addPreference(autoBindPreference); - - final Preference clearBindingsPreference = new Preference(getContext()); - clearBindingsPreference.setTitle(R.string.controller_settings_clear_controller_bindings); - clearBindingsPreference.setSummary(R.string.controller_settings_summary_clear_controller_bindings); - clearBindingsPreference.setIconSpaceReserved(false); - clearBindingsPreference.setOnPreferenceClickListener(preference -> { - final AlertDialog.Builder builder = new AlertDialog.Builder(getContext()); - builder.setMessage(R.string.controller_settings_clear_controller_bindings_confirm); - builder.setPositiveButton(R.string.main_activity_yes, (dialog, which) -> { - dialog.dismiss(); - clearBindings(); - }); - builder.setNegativeButton(R.string.main_activity_no, (dialog, which) -> dialog.dismiss()); - builder.create().show(); - return true; - }); - ps.addPreference(clearBindingsPreference); - - mButtonsCategory = new PreferenceCategory(getContext()); - mButtonsCategory.setTitle(R.string.controller_settings_category_button_bindings); - mButtonsCategory.setIconSpaceReserved(false); - ps.addPreference(mButtonsCategory); - - mAxisCategory = new PreferenceCategory(getContext()); - mAxisCategory.setTitle(R.string.controller_settings_category_axis_bindings); - mAxisCategory.setIconSpaceReserved(false); - ps.addPreference(mAxisCategory); - - mSettingsCategory = new PreferenceCategory(getContext()); - mSettingsCategory.setTitle(R.string.controller_settings_category_settings); - mSettingsCategory.setIconSpaceReserved(false); - ps.addPreference(mSettingsCategory); - - mAutoFireCategory = new PreferenceCategory(getContext()); - mAutoFireCategory.setTitle(R.string.controller_settings_category_auto_fire_buttons); - mAutoFireCategory.setIconSpaceReserved(false); - ps.addPreference(mAutoFireCategory); - - mAutoFireBindingsCategory = new PreferenceCategory(getContext()); - mAutoFireBindingsCategory.setTitle(R.string.controller_settings_category_auto_fire_bindings); - mAutoFireBindingsCategory.setIconSpaceReserved(false); - ps.addPreference(mAutoFireBindingsCategory); - - createPreferences(controllerType); - } - - @SuppressLint("DefaultLocale") - private void createPreferences(String controllerType) { - final PreferenceScreen ps = getPreferenceScreen(); - final SharedPreferences sp = getPreferenceManager().getSharedPreferences(); - final String[] buttonNames = AndroidHostInterface.getControllerButtonNames(controllerType); - final String[] axisNames = AndroidHostInterface.getControllerAxisNames(controllerType); - final int vibrationMotors = AndroidHostInterface.getControllerVibrationMotorCount(controllerType); - - if (buttonNames != null) { - for (String buttonName : buttonNames) { - final ControllerBindingPreference cbp = new ControllerBindingPreference(getContext(), null); - cbp.initButton(controllerIndex, buttonName); - mButtonsCategory.addPreference(cbp); - parent.preferences.add(cbp); - } - } - - if (axisNames != null) { - for (String axisName : axisNames) { - final int axisType = AndroidHostInterface.getControllerAxisType(controllerType, axisName); - final ControllerBindingPreference cbp = new ControllerBindingPreference(getContext(), null); - cbp.initAxis(controllerIndex, axisName, axisType); - mAxisCategory.addPreference(cbp); - parent.preferences.add(cbp); - } - } - - if (vibrationMotors > 0) { - final ControllerBindingPreference cbp = new ControllerBindingPreference(getContext(), null); - cbp.initVibration(controllerIndex); - mSettingsCategory.addPreference(cbp); - parent.preferences.add(cbp); - } - - if (controllerType.equals("AnalogController")) { - mSettingsCategory.addPreference( - createTogglePreference(String.format("Controller%d/ForceAnalogOnReset", controllerIndex), - R.string.settings_enable_analog_mode_on_reset, R.string.settings_summary_enable_analog_mode_on_reset, true)); - - mSettingsCategory.addPreference( - createTogglePreference(String.format("Controller%d/AnalogDPadInDigitalMode", controllerIndex), - R.string.settings_use_analog_sticks_for_dpad, R.string.settings_summary_use_analog_sticks_for_dpad, true)); - } - - if (buttonNames != null) { - for (int autoFireSlot = 1; autoFireSlot <= NUM_AUTO_FIRE_BUTTONS; autoFireSlot++) { - final ListPreference autoFirePreference = new ListPreference(getContext()); - autoFirePreference.setEntries(buttonNames); - autoFirePreference.setEntryValues(buttonNames); - autoFirePreference.setKey(String.format("Controller%d/AutoFire%dButton", controllerIndex, autoFireSlot)); - autoFirePreference.setTitle(getContext().getString(R.string.controller_settings_auto_fire_n_button, autoFireSlot)); - autoFirePreference.setSummaryProvider(ListPreference.SimpleSummaryProvider.getInstance()); - autoFirePreference.setIconSpaceReserved(false); - mAutoFireCategory.addPreference(autoFirePreference); - - final SeekBarPreference frequencyPreference = new SeekBarPreference(getContext()); - frequencyPreference.setMin(1); - frequencyPreference.setMax(60); - frequencyPreference.setKey(String.format("Controller%d/AutoFire%dFrequency", controllerIndex, autoFireSlot)); - frequencyPreference.setDefaultValue(2); - frequencyPreference.setTitle(getContext().getString(R.string.controller_settings_auto_fire_n_frequency, autoFireSlot)); - frequencyPreference.setIconSpaceReserved(false); - frequencyPreference.setShowSeekBarValue(true); - mAutoFireCategory.addPreference(frequencyPreference); - } - - for (int autoFireSlot = 1; autoFireSlot <= NUM_AUTO_FIRE_BUTTONS; autoFireSlot++) { - final ControllerBindingPreference bindingPreference = new ControllerBindingPreference(getContext(), null); - bindingPreference.initAutoFireButton(controllerIndex, autoFireSlot); - mAutoFireBindingsCategory.addPreference(bindingPreference); - } - } - } - - private void removePreferences() { - for (int i = 0; i < mButtonsCategory.getPreferenceCount(); i++) { - parent.preferences.remove(mButtonsCategory.getPreference(i)); - } - mButtonsCategory.removeAll(); - - for (int i = 0; i < mAxisCategory.getPreferenceCount(); i++) { - parent.preferences.remove(mAxisCategory.getPreference(i)); - } - mAxisCategory.removeAll(); - - for (int i = 0; i < mSettingsCategory.getPreferenceCount(); i++) { - parent.preferences.remove(mSettingsCategory.getPreference(i)); - } - mSettingsCategory.removeAll(); - - for (int i = 0; i < mAutoFireCategory.getPreferenceCount(); i++) { - parent.preferences.remove(mAutoFireCategory.getPreference(i)); - } - mAutoFireCategory.removeAll(); - - for (int i = 0; i < mAutoFireBindingsCategory.getPreferenceCount(); i++) { - parent.preferences.remove(mAutoFireBindingsCategory.getPreference(i)); - } - mAutoFireBindingsCategory.removeAll(); - } - - private void clearBindings() { - final SharedPreferences.Editor editor = getPreferenceManager().getSharedPreferences().edit(); - clearBindingsInCategory(editor, mButtonsCategory); - clearBindingsInCategory(editor, mAxisCategory); - clearBindingsInCategory(editor, mSettingsCategory); - editor.commit(); - - Toast.makeText(parent.getContext(), parent.getString( - R.string.controller_settings_clear_controller_bindings_done, controllerIndex), - Toast.LENGTH_LONG).show(); - } - } - - public static class HotkeyFragment extends PreferenceFragmentCompat { - private final ControllerSettingsCollectionFragment parent; - private final HotkeyInfo[] mHotkeyInfo; - - public HotkeyFragment(ControllerSettingsCollectionFragment parent) { - this.parent = parent; - this.mHotkeyInfo = AndroidHostInterface.getInstance().getHotkeyInfoList(); - } - - @Override - public void onCreatePreferences(Bundle savedInstanceState, String rootKey) { - final PreferenceScreen ps = getPreferenceManager().createPreferenceScreen(getContext()); - if (mHotkeyInfo != null) { - final HashMap<String, PreferenceCategory> categoryMap = new HashMap<>(); - - for (HotkeyInfo hotkeyInfo : mHotkeyInfo) { - PreferenceCategory category = categoryMap.containsKey(hotkeyInfo.getCategory()) ? - categoryMap.get(hotkeyInfo.getCategory()) : null; - if (category == null) { - category = new PreferenceCategory(getContext()); - category.setTitle(hotkeyInfo.getCategory()); - category.setIconSpaceReserved(false); - categoryMap.put(hotkeyInfo.getCategory(), category); - ps.addPreference(category); - } - - final ControllerBindingPreference cbp = new ControllerBindingPreference(getContext(), null); - cbp.initHotkey(hotkeyInfo); - category.addPreference(cbp); - parent.preferences.add(cbp); - } - } - - setPreferenceScreen(ps); - } - } - - public static class SettingsCollectionAdapter extends FragmentStateAdapter { - private final ControllerSettingsCollectionFragment parent; - private final int controllerPorts; - - public SettingsCollectionAdapter(@NonNull ControllerSettingsCollectionFragment parent, int controllerPorts) { - super(parent); - this.parent = parent; - this.controllerPorts = controllerPorts; - } - - @NonNull - @Override - public Fragment createFragment(int position) { - if (position == 0) - return new SettingsFragment(parent); - else if (position <= controllerPorts) - return new ControllerPortFragment(parent, position); - else - return new HotkeyFragment(parent); - } - - @Override - public int getItemCount() { - return controllerPorts + 2; - } - } -} \ No newline at end of file diff --git a/android/app/src/main/java/com/github/stenzek/duckstation/DiscRegion.java b/android/app/src/main/java/com/github/stenzek/duckstation/DiscRegion.java deleted file mode 100644 index 813d9e717..000000000 --- a/android/app/src/main/java/com/github/stenzek/duckstation/DiscRegion.java +++ /dev/null @@ -1,8 +0,0 @@ -package com.github.stenzek.duckstation; - -public enum DiscRegion { - NTSC_J, - NTSC_U, - PAL, - Other -} diff --git a/android/app/src/main/java/com/github/stenzek/duckstation/EmptyGameListFragment.java b/android/app/src/main/java/com/github/stenzek/duckstation/EmptyGameListFragment.java deleted file mode 100644 index 793cf2d7d..000000000 --- a/android/app/src/main/java/com/github/stenzek/duckstation/EmptyGameListFragment.java +++ /dev/null @@ -1,36 +0,0 @@ -package com.github.stenzek.duckstation; - -import android.os.Bundle; -import android.view.View; -import android.widget.Button; -import android.widget.TextView; - -import androidx.annotation.NonNull; -import androidx.annotation.Nullable; -import androidx.fragment.app.Fragment; - -public class EmptyGameListFragment extends Fragment { - private static final String SUPPORTED_FORMATS_STRING = - ".cue (Cue Sheets)\n" + - ".iso/.img (Single Track Image)\n" + - ".ecm (Error Code Modeling Image)\n" + - ".mds (Media Descriptor Sidecar)\n" + - ".chd (Compressed Hunks of Data)\n" + - ".pbp (PlayStation Portable, Only Decrypted)"; - - private MainActivity parent; - - public EmptyGameListFragment(MainActivity parent) { - super(R.layout.fragment_empty_game_list); - this.parent = parent; - } - - @Override - public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) { - super.onViewCreated(view, savedInstanceState); - - ((TextView) view.findViewById(R.id.supported_formats)).setText( - getString(R.string.main_activity_empty_game_list_supported_formats, SUPPORTED_FORMATS_STRING)); - ((Button) view.findViewById(R.id.add_game_directory)).setOnClickListener(v -> parent.startAddGameDirectory()); - } -} diff --git a/android/app/src/main/java/com/github/stenzek/duckstation/EmulationActivity.java b/android/app/src/main/java/com/github/stenzek/duckstation/EmulationActivity.java deleted file mode 100644 index 8192df706..000000000 --- a/android/app/src/main/java/com/github/stenzek/duckstation/EmulationActivity.java +++ /dev/null @@ -1,988 +0,0 @@ -package com.github.stenzek.duckstation; - -import android.content.Context; -import android.content.DialogInterface; -import android.content.Intent; -import android.content.SharedPreferences; -import android.content.pm.ActivityInfo; -import android.content.res.Configuration; -import android.hardware.input.InputManager; -import android.net.Uri; -import android.os.AsyncTask; -import android.os.Build; -import android.os.Bundle; -import android.os.Vibrator; -import android.util.Log; -import android.view.Display; -import android.view.KeyEvent; -import android.view.LayoutInflater; -import android.view.MotionEvent; -import android.view.SurfaceHolder; -import android.view.View; -import android.view.ViewGroup; -import android.view.WindowManager; -import android.widget.FrameLayout; -import android.widget.ImageButton; -import android.widget.ImageView; -import android.widget.ListView; -import android.widget.TextView; - -import androidx.annotation.NonNull; -import androidx.annotation.Nullable; -import androidx.appcompat.app.AlertDialog; -import androidx.appcompat.app.AppCompatActivity; -import androidx.fragment.app.DialogFragment; -import androidx.fragment.app.Fragment; -import androidx.fragment.app.FragmentTransaction; -import androidx.preference.Preference; -import androidx.preference.PreferenceFragmentCompat; -import androidx.preference.PreferenceManager; - -/** - * An example full-screen activity that shows and hides the system UI (i.e. - * status bar and navigation/system bar) with user interaction. - */ -public class EmulationActivity extends AppCompatActivity implements SurfaceHolder.Callback { - /** - * Settings interfaces. - */ - private SharedPreferences mPreferences; - private boolean mWasDestroyed = false; - private boolean mStopRequested = false; - private boolean mApplySettingsOnSurfaceRestored = false; - private String mGamePath = null; - private String mGameCode = null; - private String mGameTitle = null; - private String mGameCoverPath = null; - private EmulationSurfaceView mContentView; - private MenuDialogFragment mPauseMenu; - - private boolean getBooleanSetting(String key, boolean defaultValue) { - return mPreferences.getBoolean(key, defaultValue); - } - - private void setBooleanSetting(String key, boolean value) { - SharedPreferences.Editor editor = mPreferences.edit(); - editor.putBoolean(key, value); - editor.apply(); - } - - private String getStringSetting(String key, String defaultValue) { - return mPreferences.getString(key, defaultValue); - } - - private int getIntSetting(String key, int defaultValue) { - try { - return mPreferences.getInt(key, defaultValue); - } catch (ClassCastException e) { - try { - final String stringValue = mPreferences.getString(key, Integer.toString(defaultValue)); - return Integer.parseInt(stringValue); - } catch (Exception e2) { - return defaultValue; - } - } - } - - private void setStringSetting(String key, String value) { - SharedPreferences.Editor editor = mPreferences.edit(); - editor.putString(key, value); - editor.apply(); - } - - private void reportErrorOnUIThread(String message) { - // Toast.makeText(this, message, Toast.LENGTH_LONG); - new AlertDialog.Builder(this) - .setTitle(R.string.emulation_activity_error) - .setMessage(message) - .setPositiveButton(R.string.emulation_activity_ok, (dialog, button) -> { - dialog.dismiss(); - enableFullscreenImmersive(); - }) - .create() - .show(); - } - - public void reportError(String message) { - Log.e("EmulationActivity", message); - - Object lock = new Object(); - runOnUiThread(() -> { - // Toast.makeText(this, message, Toast.LENGTH_LONG); - new AlertDialog.Builder(this) - .setTitle(R.string.emulation_activity_error) - .setMessage(message) - .setPositiveButton(R.string.emulation_activity_ok, (dialog, button) -> { - dialog.dismiss(); - enableFullscreenImmersive(); - synchronized (lock) { - lock.notify(); - } - }) - .create() - .show(); - }); - - synchronized (lock) { - try { - lock.wait(); - } catch (InterruptedException e) { - } - } - } - - private EmulationThread mEmulationThread; - - private void stopEmulationThread() { - if (mEmulationThread == null) - return; - - mEmulationThread.stopAndJoin(); - mEmulationThread = null; - } - - public void onEmulationStarted() { - runOnUiThread(() -> { - updateRequestedOrientation(); - updateOrientation(); - }); - } - - public void onEmulationStopped() { - runOnUiThread(() -> { - if (!mWasDestroyed && !mStopRequested) - finish(); - }); - } - - public void onRunningGameChanged(String path, String code, String title, String coverPath) { - runOnUiThread(() -> { - mGamePath = path; - mGameTitle = title; - mGameCode = code; - mGameCoverPath = coverPath; - }); - } - - public float getRefreshRate() { - WindowManager windowManager = getWindowManager(); - if (windowManager == null) { - windowManager = ((WindowManager) getSystemService(Context.WINDOW_SERVICE)); - if (windowManager == null) - return -1.0f; - } - - Display display = windowManager.getDefaultDisplay(); - if (display == null) - return -1.0f; - - return display.getRefreshRate(); - } - - public void openPauseMenu() { - runOnUiThread(() -> { - showPauseMenu(); - }); - } - - public String[] getInputDeviceNames() { - return (mContentView != null) ? mContentView.getInputDeviceNames() : null; - } - - public boolean hasInputDeviceVibration(int controllerIndex) { - return (mContentView != null) ? mContentView.hasInputDeviceVibration(controllerIndex) : null; - } - - public void setInputDeviceVibration(int controllerIndex, float smallMotor, float largeMotor) { - if (mContentView != null) - mContentView.setInputDeviceVibration(controllerIndex, smallMotor, largeMotor); - } - - private void doApplySettings() { - AndroidHostInterface.getInstance().applySettings(); - updateRequestedOrientation(); - updateControllers(); - updateSustainedPerformanceMode(); - updateDisplayInCutout(); - } - - private void applySettings() { - if (!AndroidHostInterface.getInstance().isEmulationThreadRunning()) - return; - - if (AndroidHostInterface.getInstance().hasSurface()) { - doApplySettings(); - } else { - mApplySettingsOnSurfaceRestored = true; - } - } - - /// Ends the activity if it was restored without properly being created. - private boolean checkActivityIsValid() { - if (!AndroidHostInterface.hasInstance() || !AndroidHostInterface.getInstance().isEmulationThreadRunning()) { - finish(); - return false; - } - - return true; - } - - @Override - public void surfaceCreated(SurfaceHolder holder) { - } - - @Override - public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) { - // Once we get a surface, we can boot. - AndroidHostInterface.getInstance().surfaceChanged(holder.getSurface(), format, width, height); - - if (mEmulationThread != null) { - updateOrientation(); - - if (mApplySettingsOnSurfaceRestored) { - mApplySettingsOnSurfaceRestored = false; - doApplySettings(); - } - - return; - } - - final String bootPath = getIntent().getStringExtra("bootPath"); - final boolean saveStateOnExit = getBooleanSetting("Main/SaveStateOnExit", true); - final boolean resumeState = getIntent().getBooleanExtra("resumeState", saveStateOnExit); - final String bootSaveStatePath = getIntent().getStringExtra("saveStatePath"); - - mEmulationThread = EmulationThread.create(this, bootPath, resumeState, bootSaveStatePath); - } - - @Override - public void surfaceDestroyed(SurfaceHolder holder) { - Log.i("EmulationActivity", "Surface destroyed"); - - if (mPauseMenu != null) - mPauseMenu.close(false); - - // Save the resume state in case we never get back again... - if (AndroidHostInterface.getInstance().isEmulationThreadRunning() && !mStopRequested) - AndroidHostInterface.getInstance().saveResumeState(true); - - AndroidHostInterface.getInstance().surfaceChanged(null, 0, 0, 0); - } - - @Override - protected void onCreate(Bundle savedInstanceState) { - mPreferences = PreferenceManager.getDefaultSharedPreferences(this); - super.onCreate(savedInstanceState); - - Log.i("EmulationActivity", "OnCreate"); - - // we might be coming from a third-party launcher if the host interface isn't setup - if (!AndroidHostInterface.hasInstance() && !AndroidHostInterface.createInstance(this)) { - finish(); - return; - } - - enableFullscreenImmersive(); - setContentView(R.layout.activity_emulation); - - mContentView = findViewById(R.id.fullscreen_content); - mContentView.getHolder().addCallback(this); - mContentView.setFocusableInTouchMode(true); - mContentView.setFocusable(true); - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { - mContentView.setFocusedByDefault(true); - } - mContentView.requestFocus(); - - // Sort out rotation. - updateOrientation(); - updateSustainedPerformanceMode(); - updateDisplayInCutout(); - - // Hook up controller input. - updateControllers(); - registerInputDeviceListener(); - } - - @Override - protected void onPostCreate(Bundle savedInstanceState) { - super.onPostCreate(savedInstanceState); - enableFullscreenImmersive(); - } - - @Override - protected void onPostResume() { - super.onPostResume(); - enableFullscreenImmersive(); - } - - @Override - protected void onDestroy() { - super.onDestroy(); - Log.i("EmulationActivity", "OnStop"); - if (mEmulationThread != null) { - mWasDestroyed = true; - stopEmulationThread(); - } - - unregisterInputDeviceListener(); - } - - @Override - protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) { - super.onActivityResult(requestCode, resultCode, data); - - if (!checkActivityIsValid()) { - // we must've got killed off in the background :( - return; - } - - if (requestCode == REQUEST_CODE_SETTINGS) { - if (AndroidHostInterface.getInstance().isEmulationThreadRunning()) { - applySettings(); - } - } else if (requestCode == REQUEST_IMPORT_PATCH_CODES) { - if (data == null || data.getData() == null) - return; - - importPatchesFromFile(data.getData()); - } else if (requestCode == REQUEST_CHANGE_DISC_FILE) { - if (data == null || data.getData() == null) - return; - - AndroidHostInterface.getInstance().setMediaFilename(data.getDataString()); - } - } - - @Override - public void onBackPressed() { - showPauseMenu(); - } - - @Override - public boolean dispatchKeyEvent(KeyEvent event) { - if (event.getAction() == KeyEvent.ACTION_DOWN) { - if (mContentView.onKeyDown(event.getKeyCode(), event)) - return true; - } else if (event.getAction() == KeyEvent.ACTION_UP) { - if (mContentView.onKeyUp(event.getKeyCode(), event)) - return true; - } - - return super.dispatchKeyEvent(event); - } - - @Override - public boolean dispatchGenericMotionEvent(MotionEvent ev) { - if (mContentView.onGenericMotionEvent(ev)) - return true; - - return super.dispatchGenericMotionEvent(ev); - } - - @Override - public void onConfigurationChanged(@NonNull Configuration newConfig) { - super.onConfigurationChanged(newConfig); - - if (checkActivityIsValid()) - updateOrientation(newConfig.orientation); - } - - private void updateRequestedOrientation() { - final String orientation = getStringSetting("Main/EmulationScreenOrientation", "unspecified"); - if (orientation.equals("portrait")) - setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_USER_PORTRAIT); - else if (orientation.equals("landscape")) - setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_USER_LANDSCAPE); - else if (orientation.equals("sensor")) - setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_SENSOR); - else - setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED); - } - - private void updateOrientation() { - final int orientation = getResources().getConfiguration().orientation; - updateOrientation(orientation); - } - - private void updateOrientation(int newOrientation) { - if (newOrientation == Configuration.ORIENTATION_PORTRAIT) - AndroidHostInterface.getInstance().setDisplayAlignment(AndroidHostInterface.DISPLAY_ALIGNMENT_TOP_OR_LEFT); - else - AndroidHostInterface.getInstance().setDisplayAlignment(AndroidHostInterface.DISPLAY_ALIGNMENT_CENTER); - - if (mTouchscreenController != null) - mTouchscreenController.updateOrientation(); - } - - private void enableFullscreenImmersive() { - getWindow().getDecorView().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_STICKY); - if (mContentView != null) - mContentView.requestFocus(); - } - - private void updateDisplayInCutout() { - if (Build.VERSION.SDK_INT < Build.VERSION_CODES.P) - return; - - final boolean shouldExpand = getBooleanSetting("Display/ExpandToCutout", false); - final boolean isExpanded = getWindow().getAttributes().layoutInDisplayCutoutMode == - WindowManager.LayoutParams.LAYOUT_IN_DISPLAY_CUTOUT_MODE_SHORT_EDGES; - - if (shouldExpand == isExpanded) - return; - - WindowManager.LayoutParams attribs = getWindow().getAttributes(); - attribs.layoutInDisplayCutoutMode = shouldExpand ? - WindowManager.LayoutParams.LAYOUT_IN_DISPLAY_CUTOUT_MODE_SHORT_EDGES : - WindowManager.LayoutParams.LAYOUT_IN_DISPLAY_CUTOUT_MODE_DEFAULT; - getWindow().setAttributes(attribs); - } - - private static final int REQUEST_CODE_SETTINGS = 0; - private static final int REQUEST_IMPORT_PATCH_CODES = 1; - private static final int REQUEST_CHANGE_DISC_FILE = 2; - - private void onMenuClosed() { - enableFullscreenImmersive(); - - if (AndroidHostInterface.getInstance().isEmulationThreadPaused()) - AndroidHostInterface.getInstance().pauseEmulationThread(false); - } - - private boolean disableDialogMenuItem(AlertDialog dialog, int index) { - final ListView listView = dialog.getListView(); - if (listView == null) - return false; - - final View childItem = listView.getChildAt(index); - if (childItem == null) - return false; - - childItem.setEnabled(false); - childItem.setClickable(false); - childItem.setOnClickListener((v) -> {}); - return true; - } - - private void showPauseMenu() { - if (!AndroidHostInterface.getInstance().isEmulationThreadPaused()) { - AndroidHostInterface.getInstance().pauseEmulationThread(true); - } - - if (mPauseMenu != null) - mPauseMenu.close(false); - - mPauseMenu = new MenuDialogFragment(this); - mPauseMenu.show(getSupportFragmentManager(), "MenuDialogFragment"); - } - - private void showSaveStateMenu(boolean saving) { - final SaveStateInfo[] infos = AndroidHostInterface.getInstance().getSaveStateInfo(true); - if (infos == null) { - onMenuClosed(); - return; - } - - final AlertDialog.Builder builder = new AlertDialog.Builder(this); - final ListView listView = new ListView(this); - listView.setAdapter(new SaveStateInfo.ListAdapter(this, infos)); - builder.setView(listView); - builder.setOnDismissListener((dialog) -> { - onMenuClosed(); - }); - - final AlertDialog dialog = builder.create(); - - listView.setOnItemClickListener((parent, view, position, id) -> { - SaveStateInfo info = infos[position]; - if (saving) { - AndroidHostInterface.getInstance().saveState(info.isGlobal(), info.getSlot()); - } else { - AndroidHostInterface.getInstance().loadState(info.isGlobal(), info.getSlot()); - } - dialog.dismiss(); - }); - - dialog.show(); - } - - private void showTouchscreenControllerMenu() { - AlertDialog.Builder builder = new AlertDialog.Builder(this); - builder.setTitle(R.string.dialog_touchscreen_controller_settings); - builder.setItems(R.array.emulation_touchscreen_menu, (dialogInterface, i) -> { - switch (i) { - case 0: // Change Type - { - final String currentValue = getStringSetting("Controller1/TouchscreenControllerView", ""); - final String[] values = getResources().getStringArray(R.array.settings_touchscreen_controller_view_values); - int currentIndex = -1; - for (int k = 0; k < values.length; k++) { - if (currentValue.equals(values[k])) { - currentIndex = k; - break; - } - } - - final AlertDialog.Builder subBuilder = new AlertDialog.Builder(this); - subBuilder.setTitle(R.string.dialog_touchscreen_controller_type); - subBuilder.setSingleChoiceItems(R.array.settings_touchscreen_controller_view_entries, currentIndex, (dialog, j) -> { - setStringSetting("Controller1/TouchscreenControllerView", values[j]); - updateControllers(); - }); - subBuilder.setNegativeButton(R.string.dialog_done, (dialog, which) -> { - dialog.dismiss(); - }); - subBuilder.setOnDismissListener(dialog -> onMenuClosed()); - subBuilder.create().show(); - } - break; - - case 1: // Change Opacity - { - if (mTouchscreenController != null) { - AlertDialog.Builder subBuilder = mTouchscreenController.createOpacityDialog(this); - subBuilder.setOnDismissListener(dialog -> onMenuClosed()); - subBuilder.create().show(); - } else { - onMenuClosed(); - } - - } - break; - - case 2: // Add/Remove Buttons - { - if (mTouchscreenController != null) { - AlertDialog.Builder subBuilder = mTouchscreenController.createAddRemoveButtonDialog(this); - subBuilder.setOnDismissListener(dialog -> onMenuClosed()); - subBuilder.create().show(); - } else { - onMenuClosed(); - } - } - break; - - case 3: // Edit Positions - case 4: // Edit Scale - { - if (mTouchscreenController != null) { - // we deliberately don't call onMenuClosed() here to keep the system paused. - // but we need to re-enable immersive mode to get proper editing. - enableFullscreenImmersive(); - mTouchscreenController.startLayoutEditing( - (i == 4) ? TouchscreenControllerView.EditMode.SCALE : - TouchscreenControllerView.EditMode.POSITION); - } else { - // no controller - onMenuClosed(); - } - } - break; - } - }); - - builder.setOnCancelListener(dialogInterface -> onMenuClosed()); - builder.create().show(); - } - - private void showPatchesMenu() { - final AlertDialog.Builder builder = new AlertDialog.Builder(this); - - final PatchCode[] codes = AndroidHostInterface.getInstance().getPatchCodeList(); - if (codes != null) { - CharSequence[] items = new CharSequence[codes.length]; - boolean[] itemsChecked = new boolean[codes.length]; - for (int i = 0; i < codes.length; i++) { - final PatchCode cc = codes[i]; - items[i] = cc.getDisplayText(); - itemsChecked[i] = cc.isEnabled(); - } - - builder.setMultiChoiceItems(items, itemsChecked, (dialogInterface, i, checked) -> { - AndroidHostInterface.getInstance().setPatchCodeEnabled(i, checked); - }); - } - - builder.setNegativeButton(R.string.emulation_activity_ok, (dialogInterface, i) -> { - dialogInterface.dismiss(); - }); - builder.setNeutralButton(R.string.emulation_activity_import_patch_codes, (dialogInterface, i) -> { - Intent intent = new Intent(Intent.ACTION_GET_CONTENT); - intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); - intent.setType("*/*"); - intent.addCategory(Intent.CATEGORY_OPENABLE); - startActivityForResult(Intent.createChooser(intent, getString(R.string.emulation_activity_choose_patch_code_file)), REQUEST_IMPORT_PATCH_CODES); - }); - - builder.setOnDismissListener(dialogInterface -> onMenuClosed()); - builder.create().show(); - } - - private void importPatchesFromFile(Uri uri) { - String str = FileHelper.readStringFromUri(this, uri, 512 * 1024); - if (str == null || !AndroidHostInterface.getInstance().importPatchCodesFromString(str)) { - reportErrorOnUIThread(getString(R.string.emulation_activity_failed_to_import_patch_codes)); - } - } - - private void startDiscChangeFromFile() { - Intent intent = new Intent(Intent.ACTION_GET_CONTENT); - intent.setType("*/*"); - intent.addCategory(Intent.CATEGORY_OPENABLE); - startActivityForResult(Intent.createChooser(intent, getString(R.string.main_activity_choose_disc_image)), REQUEST_CHANGE_DISC_FILE); - } - - private void showDiscChangeMenu() { - final AndroidHostInterface hi = AndroidHostInterface.getInstance(); - - if (!hi.hasMediaSubImages()) { - startDiscChangeFromFile(); - return; - } - - final String[] paths = AndroidHostInterface.getInstance().getMediaSubImageTitles(); - final int currentPath = AndroidHostInterface.getInstance().getMediaSubImageIndex(); - final int numPaths = (paths != null) ? paths.length : 0; - - AlertDialog.Builder builder = new AlertDialog.Builder(this); - - CharSequence[] items = new CharSequence[numPaths + 1]; - for (int i = 0; i < numPaths; i++) - items[i] = FileHelper.getFileNameForPath(paths[i]); - items[numPaths] = getString(R.string.emulation_activity_change_disc_select_new_file); - - builder.setSingleChoiceItems(items, (currentPath < numPaths) ? currentPath : -1, (dialogInterface, i) -> { - dialogInterface.dismiss(); - onMenuClosed(); - - if (i < numPaths) { - AndroidHostInterface.getInstance().switchMediaSubImage(i); - } else { - startDiscChangeFromFile(); - } - }); - builder.setOnCancelListener(dialogInterface -> onMenuClosed()); - builder.create().show(); - } - - private void showAchievementsPopup() { - final Achievement[] achievements = AndroidHostInterface.getInstance().getCheevoList(); - if (achievements == null) { - onMenuClosed(); - return; - } - - final AchievementListFragment alf = new AchievementListFragment(achievements); - alf.show(getSupportFragmentManager(), "fragment_achievement_list"); - alf.setOnDismissListener(dialog -> onMenuClosed()); - } - - /** - * Touchscreen controller overlay - */ - TouchscreenControllerView mTouchscreenController; - - public void updateControllers() { - final int touchscreenControllerIndex = getIntSetting("TouchscreenController/PortIndex", 0); - final String touchscreenControllerPrefix = String.format("Controller%d/", touchscreenControllerIndex + 1); - final String controllerType = getStringSetting(touchscreenControllerPrefix + "Type", "DigitalController"); - final String viewType = getStringSetting("Controller1/TouchscreenControllerView", "digital"); - final boolean autoHideTouchscreenController = getBooleanSetting("Controller1/AutoHideTouchscreenController", false); - final boolean touchGliding = getBooleanSetting("Controller1/TouchGliding", false); - final boolean hapticFeedback = getBooleanSetting("Controller1/HapticFeedback", false); - final boolean vibration = getBooleanSetting("Controller1/Vibration", false); - final FrameLayout activityLayout = findViewById(R.id.frameLayout); - - Log.i("EmulationActivity", "Controller type: " + controllerType); - Log.i("EmulationActivity", "View type: " + viewType); - - mContentView.updateInputDevices(); - AndroidHostInterface.getInstance().updateInputMap(); - - final boolean hasAnyControllers = mContentView.hasAnyGamePads(); - if (controllerType.equals("None") || viewType.equals("none") || (hasAnyControllers && autoHideTouchscreenController)) { - if (mTouchscreenController != null) { - activityLayout.removeView(mTouchscreenController); - mTouchscreenController = null; - } - } else { - if (mTouchscreenController == null) { - mTouchscreenController = new TouchscreenControllerView(this); - activityLayout.addView(mTouchscreenController); - } - - mTouchscreenController.init(touchscreenControllerIndex, controllerType, viewType, hapticFeedback, touchGliding); - } - - if (vibration) - mVibratorService = (Vibrator) getSystemService(VIBRATOR_SERVICE); - else - mVibratorService = null; - - // Place notifications in the middle of the screen, rather then the bottom (because touchscreen). - float notificationVerticalPosition = 1.0f; - float notificationVerticalDirection = -1.0f; - if (mTouchscreenController != null) { - notificationVerticalPosition = 0.3f; - notificationVerticalDirection = -1.0f; - } - AndroidHostInterface.getInstance().setFullscreenUINotificationVerticalPosition( - notificationVerticalPosition, notificationVerticalDirection); - } - - private InputManager.InputDeviceListener mInputDeviceListener; - - private void registerInputDeviceListener() { - if (mInputDeviceListener != null) - return; - - mInputDeviceListener = new InputManager.InputDeviceListener() { - @Override - public void onInputDeviceAdded(int i) { - Log.i("EmulationActivity", String.format("InputDeviceAdded %d", i)); - updateControllers(); - } - - @Override - public void onInputDeviceRemoved(int i) { - Log.i("EmulationActivity", String.format("InputDeviceRemoved %d", i)); - updateControllers(); - } - - @Override - public void onInputDeviceChanged(int i) { - Log.i("EmulationActivity", String.format("InputDeviceChanged %d", i)); - updateControllers(); - } - }; - - InputManager inputManager = ((InputManager) getSystemService(Context.INPUT_SERVICE)); - if (inputManager != null) - inputManager.registerInputDeviceListener(mInputDeviceListener, null); - } - - private void unregisterInputDeviceListener() { - if (mInputDeviceListener == null) - return; - - InputManager inputManager = ((InputManager) getSystemService(Context.INPUT_SERVICE)); - if (inputManager != null) - inputManager.unregisterInputDeviceListener(mInputDeviceListener); - - mInputDeviceListener = null; - } - - private Vibrator mVibratorService; - - public void setVibration(boolean enabled) { - if (mVibratorService == null) - return; - - runOnUiThread(() -> { - if (mVibratorService == null) - return; - - if (enabled) - mVibratorService.vibrate(1000); - else - mVibratorService.cancel(); - }); - } - - private boolean mSustainedPerformanceModeEnabled = false; - - private void updateSustainedPerformanceMode() { - final boolean enabled = getBooleanSetting("Main/SustainedPerformanceMode", false); - if (mSustainedPerformanceModeEnabled == enabled) - return; - - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) { - getWindow().setSustainedPerformanceMode(enabled); - Log.i("EmulationActivity", String.format("%s sustained performance mode.", enabled ? "enabling" : "disabling")); - } else { - Log.e("EmulationActivity", "Sustained performance mode not supported."); - } - mSustainedPerformanceModeEnabled = enabled; - - } - - public static class MenuDialogFragment extends DialogFragment { - private EmulationActivity emulationActivity; - private boolean settingsChanged = false; - - public MenuDialogFragment(EmulationActivity emulationActivity) { - this.emulationActivity = emulationActivity; - } - - @Override - public void onCreate(@Nullable Bundle savedInstanceState) { - super.onCreate(savedInstanceState); - setStyle(STYLE_NO_FRAME, R.style.EmulationActivityOverlay); - } - - @Nullable - @Override - public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { - return inflater.inflate(R.layout.fragment_emulation_activity_overlay, container, false); - } - - @Override - public void onViewCreated(View view, Bundle savedInstanceState) { - setContentFragment(new MenuSettingsFragment(this, emulationActivity), false); - - final ImageView coverView =((ImageView)view.findViewById(R.id.cover_image)); - if (emulationActivity.mGameCoverPath != null && !emulationActivity.mGameCoverPath.isEmpty()) { - new ImageLoadTask(coverView).executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR, - emulationActivity.mGameCoverPath); - } else if (emulationActivity.mGameTitle != null) { - new GenerateCoverTask(getContext(), coverView, emulationActivity.mGameTitle) - .executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR); - } - coverView.setOnClickListener(v -> close(true)); - - if (emulationActivity.mGameTitle != null) - ((TextView)view.findViewById(R.id.title)).setText(emulationActivity.mGameTitle); - - if (emulationActivity.mGameCode != null && emulationActivity.mGamePath != null) - { - final String subtitle = String.format("%s - %s", emulationActivity.mGameCode, - FileHelper.getFileNameForPath(emulationActivity.mGamePath)); - ((TextView)view.findViewById(R.id.subtitle)).setText(subtitle); - } - - ((ImageButton)view.findViewById(R.id.menu)).setOnClickListener(v -> onMenuClicked()); - ((ImageButton)view.findViewById(R.id.controller_settings)).setOnClickListener(v -> onControllerSettingsClicked()); - ((ImageButton)view.findViewById(R.id.settings)).setOnClickListener(v -> onSettingsClicked()); - ((ImageButton)view.findViewById(R.id.close)).setOnClickListener(v -> close(true)); - } - - @Override - public void onCancel(@NonNull DialogInterface dialog) { - onClosed(true); - } - - private void onClosed(boolean resumeGame) { - if (settingsChanged) - emulationActivity.applySettings(); - - if (resumeGame) - emulationActivity.onMenuClosed(); - - emulationActivity.mPauseMenu = null; - } - - public void close(boolean resumeGame) { - dismiss(); - onClosed(resumeGame); - } - - private void setContentFragment(Fragment fragment, boolean transition) { - FragmentTransaction transaction = getChildFragmentManager().beginTransaction(); - if (transition) - transaction.setCustomAnimations(android.R.anim.fade_in, android.R.anim.fade_out); - transaction.replace(R.id.content, fragment).commit(); - } - - private void onMenuClicked() { - setContentFragment(new MenuSettingsFragment(this, emulationActivity), true); - } - - private void onControllerSettingsClicked() { - ControllerSettingsCollectionFragment fragment = new ControllerSettingsCollectionFragment(); - setContentFragment(fragment, true); - fragment.setMultitapModeChangedListener(this::onControllerSettingsClicked); - settingsChanged = true; - } - - private void onSettingsClicked() { - setContentFragment(new SettingsCollectionFragment(), true); - settingsChanged = true; - } - } - - public static class MenuSettingsFragment extends PreferenceFragmentCompat { - private MenuDialogFragment menuDialogFragment; - private EmulationActivity emulationActivity; - - public MenuSettingsFragment(MenuDialogFragment menuDialogFragment, EmulationActivity emulationActivity) { - this.menuDialogFragment = menuDialogFragment; - this.emulationActivity = emulationActivity; - } - - @Override - public void onCreatePreferences(Bundle savedInstanceState, String rootKey) { - setPreferenceScreen(getPreferenceManager().createPreferenceScreen(getContext())); - - final boolean cheevosActive = AndroidHostInterface.getInstance().isCheevosActive(); - final boolean cheevosChallengeModeEnabled = AndroidHostInterface.getInstance().isCheevosChallengeModeActive(); - - createPreference(R.string.emulation_menu_load_state, R.drawable.ic_baseline_folder_open_24, !cheevosChallengeModeEnabled, preference -> { - menuDialogFragment.close(false); - emulationActivity.showSaveStateMenu(false); - return true; - }); - createPreference(R.string.emulation_menu_save_state, R.drawable.ic_baseline_save_24, true, preference -> { - menuDialogFragment.close(false); - emulationActivity.showSaveStateMenu(true); - return true; - }); - createPreference(R.string.emulation_menu_toggle_fast_forward, R.drawable.ic_baseline_fast_forward_24, !cheevosChallengeModeEnabled, preference -> { - AndroidHostInterface.getInstance().setFastForwardEnabled(!AndroidHostInterface.getInstance().isFastForwardEnabled()); - menuDialogFragment.close(true); - return true; - }); - createPreference(R.string.emulation_menu_achievements, R.drawable.ic_baseline_trophy_24, cheevosActive, preference -> { - menuDialogFragment.close(false); - emulationActivity.showAchievementsPopup(); - return true; - }); - createPreference(R.string.emulation_menu_exit_game, R.drawable.ic_baseline_exit_to_app_24, true, preference -> { - menuDialogFragment.close(false); - emulationActivity.mStopRequested = true; - emulationActivity.finish(); - return true; - }); - createPreference(R.string.emulation_menu_patch_codes, R.drawable.ic_baseline_tips_and_updates_24, !cheevosChallengeModeEnabled, preference -> { - menuDialogFragment.close(false); - emulationActivity.showPatchesMenu(); - return true; - }); - createPreference(R.string.emulation_menu_change_disc, R.drawable.ic_baseline_album_24, true, preference -> { - menuDialogFragment.close(false); - emulationActivity.showDiscChangeMenu(); - return true; - }); - createPreference(R.string.emulation_menu_touchscreen_controller_settings, R.drawable.ic_baseline_touch_app_24, true, preference -> { - menuDialogFragment.close(false); - emulationActivity.showTouchscreenControllerMenu(); - return true; - }); - createPreference(R.string.emulation_menu_toggle_analog_mode, R.drawable.ic_baseline_gamepad_24, true, preference -> { - AndroidHostInterface.getInstance().toggleControllerAnalogMode(); - menuDialogFragment.close(true); - return true; - }); - createPreference(R.string.emulation_menu_reset_console, R.drawable.ic_baseline_restart_alt_24, true, preference -> { - AndroidHostInterface.getInstance().resetSystem(); - menuDialogFragment.close(true); - return true; - }); - } - - private void createPreference(int titleId, int icon, boolean enabled, Preference.OnPreferenceClickListener action) { - final Preference preference = new Preference(getContext()); - preference.setTitle(titleId); - preference.setIcon(icon); - preference.setOnPreferenceClickListener(action); - preference.setEnabled(enabled); - getPreferenceScreen().addPreference(preference); - } - } -} diff --git a/android/app/src/main/java/com/github/stenzek/duckstation/EmulationSurfaceView.java b/android/app/src/main/java/com/github/stenzek/duckstation/EmulationSurfaceView.java deleted file mode 100644 index 2305caf16..000000000 --- a/android/app/src/main/java/com/github/stenzek/duckstation/EmulationSurfaceView.java +++ /dev/null @@ -1,302 +0,0 @@ -package com.github.stenzek.duckstation; - -import android.content.Context; -import android.os.Vibrator; -import android.util.AttributeSet; -import android.util.Log; -import android.view.InputDevice; -import android.view.KeyEvent; -import android.view.MotionEvent; -import android.view.SurfaceView; - -import java.util.ArrayList; -import java.util.List; - -public class EmulationSurfaceView extends SurfaceView { - public EmulationSurfaceView(Context context) { - super(context); - } - - public EmulationSurfaceView(Context context, AttributeSet attrs) { - super(context, attrs); - } - - public EmulationSurfaceView(Context context, AttributeSet attrs, int defStyle) { - super(context, attrs, defStyle); - } - - public static boolean isBindableDevice(InputDevice inputDevice) { - if (inputDevice == null) - return false; - - // Accept all devices with an axis or buttons, filter in events. - final int sources = inputDevice.getSources(); - return ((sources & InputDevice.SOURCE_CLASS_JOYSTICK) == InputDevice.SOURCE_CLASS_JOYSTICK) || - ((sources & InputDevice.SOURCE_CLASS_BUTTON) == InputDevice.SOURCE_CLASS_BUTTON); - } - - public static boolean isGamepadDevice(InputDevice inputDevice) { - final int sources = (inputDevice != null) ? inputDevice.getSources() : 0; - return ((sources & InputDevice.SOURCE_GAMEPAD) == InputDevice.SOURCE_GAMEPAD); - } - - public static boolean isJoystickMotionEvent(MotionEvent event) { - final int source = event.getSource(); - return ((source & InputDevice.SOURCE_CLASS_JOYSTICK) == InputDevice.SOURCE_CLASS_JOYSTICK); - } - - public static boolean isBindableKeyEvent(KeyEvent event) { - switch (event.getKeyCode()) { - case KeyEvent.KEYCODE_BACK: - case KeyEvent.KEYCODE_HOME: - case KeyEvent.KEYCODE_POWER: - // We're okay if we get these from a gamepad. - return isGamepadDevice(event.getDevice()); - - default: - return true; - } - } - - private static boolean isSystemKeyCode(int keyCode) { - switch (keyCode) { - case KeyEvent.KEYCODE_MENU: - case KeyEvent.KEYCODE_SOFT_RIGHT: - case KeyEvent.KEYCODE_HOME: - case KeyEvent.KEYCODE_BACK: - case KeyEvent.KEYCODE_CALL: - case KeyEvent.KEYCODE_ENDCALL: - case KeyEvent.KEYCODE_VOLUME_UP: - case KeyEvent.KEYCODE_VOLUME_DOWN: - case KeyEvent.KEYCODE_VOLUME_MUTE: - case KeyEvent.KEYCODE_MUTE: - case KeyEvent.KEYCODE_POWER: - case KeyEvent.KEYCODE_HEADSETHOOK: - case KeyEvent.KEYCODE_MEDIA_PLAY: - case KeyEvent.KEYCODE_MEDIA_PAUSE: - case KeyEvent.KEYCODE_MEDIA_PLAY_PAUSE: - case KeyEvent.KEYCODE_MEDIA_STOP: - case KeyEvent.KEYCODE_MEDIA_NEXT: - case KeyEvent.KEYCODE_MEDIA_PREVIOUS: - case KeyEvent.KEYCODE_MEDIA_REWIND: - case KeyEvent.KEYCODE_MEDIA_RECORD: - case KeyEvent.KEYCODE_MEDIA_FAST_FORWARD: - case KeyEvent.KEYCODE_CAMERA: - case KeyEvent.KEYCODE_FOCUS: - case KeyEvent.KEYCODE_SEARCH: - case KeyEvent.KEYCODE_BRIGHTNESS_DOWN: - case KeyEvent.KEYCODE_BRIGHTNESS_UP: - case KeyEvent.KEYCODE_MEDIA_AUDIO_TRACK: - case KeyEvent.KEYCODE_SYSTEM_NAVIGATION_UP: - case KeyEvent.KEYCODE_SYSTEM_NAVIGATION_DOWN: - case KeyEvent.KEYCODE_SYSTEM_NAVIGATION_LEFT: - case KeyEvent.KEYCODE_SYSTEM_NAVIGATION_RIGHT: - return true; - - default: - return false; - } - } - - private class InputDeviceData { - private int deviceId; - private String descriptor; - private int[] axes; - private float[] axisValues; - private int controllerIndex; - private Vibrator vibrator; - - public InputDeviceData(InputDevice device, int controllerIndex) { - deviceId = device.getId(); - descriptor = device.getDescriptor(); - this.controllerIndex = controllerIndex; - - List<InputDevice.MotionRange> motionRanges = device.getMotionRanges(); - if (motionRanges != null && !motionRanges.isEmpty()) { - axes = new int[motionRanges.size()]; - axisValues = new float[motionRanges.size()]; - for (int i = 0; i < motionRanges.size(); i++) - axes[i] = motionRanges.get(i).getAxis(); - } - - // device.getVibrator() always returns null, but might return a "null vibrator". - final Vibrator potentialVibrator = device.getVibrator(); - if (potentialVibrator != null && potentialVibrator.hasVibrator()) - vibrator = potentialVibrator; - } - } - - private InputDeviceData[] mInputDevices = null; - private String[] mControllerDescriptors = null; - private boolean mHasAnyGamepads = false; - - public boolean hasAnyGamePads() { - return mHasAnyGamepads; - } - - public synchronized void updateInputDevices() { - mInputDevices = null; - mControllerDescriptors = null; - mHasAnyGamepads = false; - - final ArrayList<InputDeviceData> inputDeviceIds = new ArrayList<>(); - final ArrayList<String> controllerDescriptors = new ArrayList<>(); - - for (int deviceId : InputDevice.getDeviceIds()) { - final InputDevice device = InputDevice.getDevice(deviceId); - if (device == null || !isBindableDevice(device)) { - Log.d("EmulationSurfaceView", - String.format("Skipping device %s sources %d", - (device != null) ? device.toString() : "", - (device != null) ? device.getSources() : 0)); - continue; - } - - if (isGamepadDevice(device)) - mHasAnyGamepads = true; - - // Some phones seem to have duplicate descriptors for multiple devices. - // Combine them all into one controller index if so. - final String descriptor = device.getDescriptor(); - int controllerIndex = controllerDescriptors.size(); - for (int i = 0; i < controllerDescriptors.size(); i++) { - if (controllerDescriptors.get(i).equals(descriptor)) { - controllerIndex = i; - break; - } - } - if (controllerIndex == controllerDescriptors.size()) { - controllerDescriptors.add(descriptor); - } - - Log.d("EmulationSurfaceView", String.format("Tracking device %d/%s (%s, sources %d, controller %d)", - controllerIndex, descriptor, device.getName(), device.getSources(), controllerIndex)); - inputDeviceIds.add(new InputDeviceData(device, controllerIndex)); - } - - if (inputDeviceIds.isEmpty()) - return; - - mInputDevices = new InputDeviceData[inputDeviceIds.size()]; - inputDeviceIds.toArray(mInputDevices); - - mControllerDescriptors = new String[controllerDescriptors.size()]; - controllerDescriptors.toArray(mControllerDescriptors); - } - - public synchronized String[] getInputDeviceNames() { - return mControllerDescriptors; - } - - public synchronized boolean hasInputDeviceVibration(int controllerIndex) { - if (mInputDevices == null || controllerIndex >= mInputDevices.length) - return false; - - return (mInputDevices[controllerIndex].vibrator != null); - } - - public synchronized void setInputDeviceVibration(int controllerIndex, float smallMotor, float largeMotor) { - if (mInputDevices == null || controllerIndex >= mInputDevices.length) - return; - - // shouldn't get here - final InputDeviceData data = mInputDevices[controllerIndex]; - if (data.vibrator == null) - return; - - final float MINIMUM_INTENSITY = 0.1f; - if (smallMotor >= MINIMUM_INTENSITY || largeMotor >= MINIMUM_INTENSITY) - data.vibrator.vibrate(1000); - else - data.vibrator.cancel(); - } - - public InputDeviceData getDataForDeviceId(int deviceId) { - if (mInputDevices == null) - return null; - - for (InputDeviceData data : mInputDevices) { - if (data.deviceId == deviceId) - return data; - } - - return null; - } - - public int getControllerIndexForDeviceId(int deviceId) { - final InputDeviceData data = getDataForDeviceId(deviceId); - return (data != null) ? data.controllerIndex : -1; - } - - private boolean handleKeyEvent(int deviceId, int repeatCount, int keyCode, boolean pressed) { - final int controllerIndex = getControllerIndexForDeviceId(deviceId); - Log.d("EmulationSurfaceView", String.format("Controller %d Code %d RC %d Pressed %d", - controllerIndex, keyCode, repeatCount, pressed? 1 : 0)); - - final AndroidHostInterface hi = AndroidHostInterface.getInstance(); - if (repeatCount == 0 && controllerIndex >= 0) - hi.handleControllerButtonEvent(controllerIndex, keyCode, pressed); - - // We don't want to eat external button events unless it's actually bound. - if (isSystemKeyCode(keyCode)) - return (controllerIndex >= 0 && hi.hasControllerButtonBinding(controllerIndex, keyCode)); - else - return true; - } - - @Override - public boolean onKeyDown(int keyCode, KeyEvent event) { - return handleKeyEvent(event.getDeviceId(), event.getRepeatCount(), keyCode, true); - } - - @Override - public boolean onKeyUp(int keyCode, KeyEvent event) { - return handleKeyEvent(event.getDeviceId(), 0, keyCode, false); - } - - private float clamp(float value, float min, float max) { - return (value < min) ? min : ((value > max) ? max : value); - } - - @Override - public boolean onGenericMotionEvent(MotionEvent event) { - if (!isJoystickMotionEvent(event)) - return false; - - final InputDeviceData data = getDataForDeviceId(event.getDeviceId()); - if (data == null || data.axes == null) - return false; - - for (int i = 0; i < data.axes.length; i++) { - final int axis = data.axes[i]; - final float axisValue = event.getAxisValue(axis); - float emuValue; - - switch (axis) { - case MotionEvent.AXIS_BRAKE: - case MotionEvent.AXIS_GAS: - case MotionEvent.AXIS_LTRIGGER: - case MotionEvent.AXIS_RTRIGGER: - // Scale 0..1 -> -1..1. - emuValue = (clamp(axisValue, 0.0f, 1.0f) * 2.0f) - 1.0f; - break; - - default: - // Everything else should already by -1..1 as per Android documentation. - emuValue = clamp(axisValue, -1.0f, 1.0f); - break; - } - - if (data.axisValues[i] == emuValue) - continue; - - Log.d("EmulationSurfaceView", - String.format("axis %d value %f emuvalue %f", axis, axisValue, emuValue)); - - data.axisValues[i] = emuValue; - AndroidHostInterface.getInstance().handleControllerAxisEvent(data.controllerIndex, axis, emuValue); - } - - return true; - } -} diff --git a/android/app/src/main/java/com/github/stenzek/duckstation/EmulationThread.java b/android/app/src/main/java/com/github/stenzek/duckstation/EmulationThread.java deleted file mode 100644 index 0bdcf25d9..000000000 --- a/android/app/src/main/java/com/github/stenzek/duckstation/EmulationThread.java +++ /dev/null @@ -1,67 +0,0 @@ -package com.github.stenzek.duckstation; - -import android.os.Build; -import android.os.Process; -import android.util.Log; -import android.view.Surface; - -import androidx.annotation.NonNull; - -public class EmulationThread extends Thread { - private EmulationActivity emulationActivity; - private String filename; - private boolean resumeState; - private String stateFilename; - - private EmulationThread(EmulationActivity emulationActivity, String filename, boolean resumeState, String stateFilename) { - super("EmulationThread"); - this.emulationActivity = emulationActivity; - this.filename = filename; - this.resumeState = resumeState; - this.stateFilename = stateFilename; - } - - public static EmulationThread create(EmulationActivity emulationActivity, String filename, boolean resumeState, String stateFilename) { - Log.i("EmulationThread", String.format("Starting emulation thread (%s)...", filename)); - - EmulationThread thread = new EmulationThread(emulationActivity, filename, resumeState, stateFilename); - thread.start(); - return thread; - } - - private void setExclusiveCores() { - try { - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) { - int[] cores = Process.getExclusiveCores(); - if (cores == null || cores.length == 0) - throw new Exception("Invalid return value from getExclusiveCores()"); - - AndroidHostInterface.setThreadAffinity(cores); - } - } catch (Exception e) { - Log.e("EmulationThread", "getExclusiveCores() failed"); - } - } - - @Override - public void run() { - try { - Process.setThreadPriority(Process.THREAD_PRIORITY_MORE_FAVORABLE); - setExclusiveCores(); - } catch (Exception e) { - Log.i("EmulationThread", "Failed to set priority for emulation thread: " + e.getMessage()); - } - - AndroidHostInterface.getInstance().runEmulationThread(emulationActivity, filename, resumeState, stateFilename); - Log.i("EmulationThread", "Emulation thread exiting."); - } - - public void stopAndJoin() { - AndroidHostInterface.getInstance().stopEmulationThreadLoop(); - try { - join(); - } catch (InterruptedException e) { - Log.i("EmulationThread", "join() interrupted: " + e.getMessage()); - } - } -} diff --git a/android/app/src/main/java/com/github/stenzek/duckstation/FileHelper.java b/android/app/src/main/java/com/github/stenzek/duckstation/FileHelper.java deleted file mode 100644 index 258350d0d..000000000 --- a/android/app/src/main/java/com/github/stenzek/duckstation/FileHelper.java +++ /dev/null @@ -1,613 +0,0 @@ -package com.github.stenzek.duckstation; - -import android.annotation.SuppressLint; -import android.annotation.TargetApi; -import android.content.ContentResolver; -import android.content.Context; -import android.database.Cursor; -import android.graphics.Bitmap; -import android.graphics.ImageDecoder; -import android.net.Uri; -import android.os.Build; -import android.os.ParcelFileDescriptor; -import android.os.storage.StorageManager; -import android.provider.DocumentsContract; -import android.provider.MediaStore; - -import androidx.annotation.Nullable; - -import java.io.ByteArrayOutputStream; -import java.io.File; -import java.io.FileNotFoundException; -import java.io.IOException; -import java.io.InputStream; -import java.io.InputStreamReader; -import java.io.OutputStream; -import java.lang.reflect.Array; -import java.lang.reflect.Method; -import java.nio.charset.Charset; -import java.nio.charset.StandardCharsets; -import java.util.ArrayList; -import java.util.List; - -/** - * File helper class - used to bridge native code to Java storage access framework APIs. - */ -public class FileHelper { - /** - * Native filesystem flags. - */ - public static final int FILESYSTEM_FILE_ATTRIBUTE_DIRECTORY = 1; - public static final int FILESYSTEM_FILE_ATTRIBUTE_READ_ONLY = 2; - public static final int FILESYSTEM_FILE_ATTRIBUTE_COMPRESSED = 4; - - /** - * Native filesystem find result flags. - */ - public static final int FILESYSTEM_FIND_RECURSIVE = (1 << 0); - public static final int FILESYSTEM_FIND_RELATIVE_PATHS = (1 << 1); - public static final int FILESYSTEM_FIND_HIDDEN_FILES = (1 << 2); - public static final int FILESYSTEM_FIND_FOLDERS = (1 << 3); - public static final int FILESYSTEM_FIND_FILES = (1 << 4); - public static final int FILESYSTEM_FIND_KEEP_ARRAY = (1 << 5); - - /** - * Projection used when searching for files. - */ - private static final String[] findProjection = new String[]{ - DocumentsContract.Document.COLUMN_DOCUMENT_ID, - DocumentsContract.Document.COLUMN_DISPLAY_NAME, - DocumentsContract.Document.COLUMN_MIME_TYPE, - DocumentsContract.Document.COLUMN_SIZE, - DocumentsContract.Document.COLUMN_LAST_MODIFIED - }; - - /** - * Projection used when getting the display name for a file. - */ - private static final String[] getDisplayNameProjection = new String[]{ - DocumentsContract.Document.COLUMN_DISPLAY_NAME, - }; - - /** - * Projection used when getting a relative file for a file. - */ - private static final String[] getRelativeFileProjection = new String[]{ - DocumentsContract.Document.COLUMN_DOCUMENT_ID, - DocumentsContract.Document.COLUMN_DISPLAY_NAME, - }; - - private final Context context; - private final ContentResolver contentResolver; - - /** - * File helper class - used to bridge native code to Java storage access framework APIs. - * - * @param context Context in which to perform file actions as. - */ - public FileHelper(Context context) { - this.context = context; - this.contentResolver = context.getContentResolver(); - } - - /** - * Reads the specified file as a string, under the specified context. - * - * @param context context to access file under - * @param uri uri to write data to - * @param maxSize maximum file size to read - * @return String containing the file data, otherwise null - */ - public static String readStringFromUri(final Context context, final Uri uri, int maxSize) { - InputStream stream = null; - try { - stream = context.getContentResolver().openInputStream(uri); - } catch (FileNotFoundException e) { - return null; - } - - StringBuilder os = new StringBuilder(); - try { - char[] buffer = new char[1024]; - InputStreamReader reader = new InputStreamReader(stream, Charset.forName(StandardCharsets.UTF_8.name())); - int len; - while ((len = reader.read(buffer)) > 0) { - os.append(buffer, 0, len); - if (os.length() > maxSize) - return null; - } - - stream.close(); - } catch (IOException e) { - return null; - } - - if (os.length() == 0) - return null; - - return os.toString(); - } - - /** - * Reads the specified file as a byte array, under the specified context. - * - * @param context context to access file under - * @param uri uri to write data to - * @param maxSize maximum file size to read - * @return byte array containing the file data, otherwise null - */ - public static byte[] readBytesFromUri(final Context context, final Uri uri, int maxSize) { - InputStream stream = null; - try { - stream = context.getContentResolver().openInputStream(uri); - } catch (FileNotFoundException e) { - return null; - } - - ByteArrayOutputStream os = new ByteArrayOutputStream(); - try { - byte[] buffer = new byte[512 * 1024]; - int len; - while ((len = stream.read(buffer)) > 0) { - os.write(buffer, 0, len); - if (maxSize > 0 && os.size() > maxSize) { - return null; - } - } - - stream.close(); - } catch (IOException e) { - e.printStackTrace(); - return null; - } - - if (os.size() == 0) - return null; - - return os.toByteArray(); - } - - /** - * Writes the specified data to a file referenced by the URI, as the specified context. - * - * @param context context to access file under - * @param uri uri to write data to - * @param bytes data to write file to - * @return true if write was succesful, otherwise false - */ - public static boolean writeBytesToUri(final Context context, final Uri uri, final byte[] bytes) { - OutputStream stream = null; - try { - stream = context.getContentResolver().openOutputStream(uri); - } catch (FileNotFoundException e) { - e.printStackTrace(); - return false; - } - - if (bytes != null && bytes.length > 0) { - try { - stream.write(bytes); - stream.close(); - } catch (IOException e) { - e.printStackTrace(); - return false; - } - } - - return true; - } - - /** - * Deletes the file referenced by the URI, under the specified context. - * - * @param context context to delete file under - * @param uri uri to delete - * @return - */ - public static boolean deleteFileAtUri(final Context context, final Uri uri) { - try { - if (uri.getScheme() == "file") { - final File file = new File(uri.getPath()); - if (!file.isFile()) - return false; - - return file.delete(); - } - return (context.getContentResolver().delete(uri, null, null) > 0); - } catch (Exception e) { - e.printStackTrace(); - return false; - } - } - - /** - * Returns the name of the file pointed at by a SAF URI. - * - * @param context context to access file under - * @param uri uri to retrieve file name for - * @return the name of the file, or null - */ - public static String getDocumentNameFromUri(final Context context, final Uri uri) { - Cursor cursor = null; - try { - final String[] proj = {DocumentsContract.Document.COLUMN_DISPLAY_NAME}; - cursor = context.getContentResolver().query(uri, proj, null, null, null); - final int columnIndex = cursor.getColumnIndexOrThrow(DocumentsContract.Document.COLUMN_DISPLAY_NAME); - cursor.moveToFirst(); - return cursor.getString(columnIndex); - } catch (Exception e) { - e.printStackTrace(); - return null; - } finally { - if (cursor != null) - cursor.close(); - } - } - - /** - * Loads a bitmap from the provided SAF URI. - * - * @param context context to access file under - * @param uri uri to retrieve file name for - * @return a decoded bitmap for the file, or null - */ - public static Bitmap loadBitmapFromUri(final Context context, final Uri uri) { - InputStream stream = null; - try { - if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.P) { - final ImageDecoder.Source source = ImageDecoder.createSource(context.getContentResolver(), uri); - return ImageDecoder.decodeBitmap(source); - } else { - return MediaStore.Images.Media.getBitmap(context.getContentResolver(), uri); - } - } catch (Exception e) { - e.printStackTrace(); - return null; - } - } - - /** - * Returns the file name component of a path or URI. - * - * @param path Path/URI to examine. - * @return File name component of path/URI. - */ - public static String getFileNameForPath(String path) { - if (path.startsWith("content:/") || path.startsWith("file:/")) { - try { - final Uri uri = Uri.parse(path); - final String lastPathSegment = uri.getLastPathSegment(); - if (lastPathSegment != null) - path = lastPathSegment; - } catch (Exception e) { - } - } - - int lastSlash = path.lastIndexOf('/'); - if (lastSlash > 0 && lastSlash < path.length() - 1) - return path.substring(lastSlash + 1); - else - return path; - } - - /** - * Test if the given URI represents a {@link DocumentsContract.Document} tree. - */ - public static boolean isTreeUri(Uri uri) { - final List<String> paths = uri.getPathSegments(); - return (paths.size() >= 2 && paths.get(0).equals("tree")); - } - - /** - * Retrieves a file descriptor for a content URI string. Called by native code. - * - * @param uriString string of the URI to open - * @param mode Java open mode - * @return file descriptor for URI, or -1 - */ - public int openURIAsFileDescriptor(String uriString, String mode) { - try { - final Uri uri = Uri.parse(uriString); - final ParcelFileDescriptor fd = contentResolver.openFileDescriptor(uri, mode); - if (fd == null) - return -1; - return fd.detachFd(); - } catch (Exception e) { - return -1; - } - } - - /** - * Recursively iterates documents in the specified tree, searching for files. - * - * @param treeUri Root tree in which to search for documents. - * @param documentId Document ID representing the directory to start searching. - * @param flags Native search flags. - * @param results Cumulative result array. - */ - private void doFindFiles(Uri treeUri, String documentId, int flags, ArrayList<FindResult> results) { - try { - final Uri queryUri = DocumentsContract.buildChildDocumentsUriUsingTree(treeUri, documentId); - final Cursor cursor = contentResolver.query(queryUri, findProjection, null, null, null); - final int count = cursor.getCount(); - - while (cursor.moveToNext()) { - try { - final String mimeType = cursor.getString(2); - final String childDocumentId = cursor.getString(0); - final Uri uri = DocumentsContract.buildDocumentUriUsingTree(treeUri, childDocumentId); - final long size = cursor.getLong(3); - final long lastModified = cursor.getLong(4); - - if (DocumentsContract.Document.MIME_TYPE_DIR.equals(mimeType)) { - if ((flags & FILESYSTEM_FIND_FOLDERS) != 0) { - results.add(new FindResult(childDocumentId, uri.toString(), size, lastModified, FILESYSTEM_FILE_ATTRIBUTE_DIRECTORY)); - } - - if ((flags & FILESYSTEM_FIND_RECURSIVE) != 0) - doFindFiles(treeUri, childDocumentId, flags, results); - } else { - if ((flags & FILESYSTEM_FIND_FILES) != 0) { - results.add(new FindResult(childDocumentId, uri.toString(), size, lastModified, 0)); - } - } - } catch (Exception e) { - e.printStackTrace(); - } - } - cursor.close(); - } catch (Exception e) { - e.printStackTrace(); - } - } - - /** - * Recursively iterates documents in the specified URI, searching for files. - * - * @param uriString URI containing directory to search. - * @param flags Native filter flags. - * @return Array of find results. - */ - public FindResult[] findFiles(String uriString, int flags) { - try { - final Uri fullUri = Uri.parse(uriString); - final String documentId = DocumentsContract.getTreeDocumentId(fullUri); - final ArrayList<FindResult> results = new ArrayList<>(); - doFindFiles(fullUri, documentId, flags, results); - if (results.isEmpty()) - return null; - - final FindResult[] resultsArray = new FindResult[results.size()]; - results.toArray(resultsArray); - return resultsArray; - } catch (Exception e) { - e.printStackTrace(); - return null; - } - } - - /** - * Returns the display name for the given URI. - * - * @param uriString URI to resolve display name for. - * @return display name for the URI, or null. - */ - public String getDisplayNameForURIPath(String uriString) { - try { - final Uri fullUri = Uri.parse(uriString); - final Cursor cursor = contentResolver.query(fullUri, getDisplayNameProjection, - null, null, null); - if (cursor.getCount() == 0 || !cursor.moveToNext()) - return null; - - return cursor.getString(0); - } catch (Exception e) { - e.printStackTrace(); - return null; - } - } - - /** - * Returns the path for a sibling file relative to another URI. - * - * @param uriString URI to find the file relative to. - * @param newFileName Sibling file name. - * @return URI for the sibling file name, or null. - */ - public String getRelativePathForURIPath(String uriString, String newFileName) { - try { - final Uri fullUri = Uri.parse(uriString); - - // if this is a document (expected)... - Uri treeUri; - String treeDocId; - if (DocumentsContract.isDocumentUri(context, fullUri)) { - // we need to remove the last part of the URI (the specific document ID) to get the parent - final String lastPathSegment = fullUri.getLastPathSegment(); - int lastSeparatorIndex = lastPathSegment.lastIndexOf('/'); - if (lastSeparatorIndex < 0) - lastSeparatorIndex = lastPathSegment.lastIndexOf(':'); - if (lastSeparatorIndex < 0) - return null; - - // the parent becomes the document ID - treeDocId = lastPathSegment.substring(0, lastSeparatorIndex); - - // but, we need to access it through the subtree if this was a tree URI (permissions...) - if (isTreeUri(fullUri)) { - treeUri = DocumentsContract.buildTreeDocumentUri(fullUri.getAuthority(), DocumentsContract.getTreeDocumentId(fullUri)); - } else { - treeUri = DocumentsContract.buildTreeDocumentUri(fullUri.getAuthority(), treeDocId); - } - } else { - treeDocId = DocumentsContract.getDocumentId(fullUri); - treeUri = fullUri; - } - - final Uri queryUri = DocumentsContract.buildChildDocumentsUriUsingTree(treeUri, treeDocId); - final Cursor cursor = contentResolver.query(queryUri, getRelativeFileProjection, null, null, null); - final int count = cursor.getCount(); - - while (cursor.moveToNext()) { - try { - final String displayName = cursor.getString(1); - if (!displayName.equalsIgnoreCase(newFileName)) - continue; - - final String childDocumentId = cursor.getString(0); - final Uri uri = DocumentsContract.buildDocumentUriUsingTree(treeUri, childDocumentId); - cursor.close(); - return uri.toString(); - } catch (Exception e) { - e.printStackTrace(); - } - } - - cursor.close(); - return null; - } catch (Exception e) { - e.printStackTrace(); - return null; - } - } - - private static final String PRIMARY_VOLUME_NAME = "primary"; - - @Nullable - public static String getFullPathFromTreeUri(@Nullable final Uri treeUri, Context con) { - if (treeUri == null) return null; - String volumePath = getVolumePath(getVolumeIdFromTreeUri(treeUri), con); - if (volumePath == null) return File.separator; - if (volumePath.endsWith(File.separator)) - volumePath = volumePath.substring(0, volumePath.length() - 1); - - String documentPath = getDocumentPathFromTreeUri(treeUri); - if (documentPath.endsWith(File.separator)) - documentPath = documentPath.substring(0, documentPath.length() - 1); - - if (documentPath.length() > 0) { - if (documentPath.startsWith(File.separator)) - return volumePath + documentPath; - else - return volumePath + File.separator + documentPath; - } else return volumePath; - } - - @SuppressLint("ObsoleteSdkInt") - private static String getVolumePath(final String volumeId, Context context) { - if (volumeId == null) - return null; - - if (Build.VERSION.SDK_INT < Build.VERSION_CODES.LOLLIPOP) return null; - try { - StorageManager mStorageManager = - (StorageManager) context.getSystemService(Context.STORAGE_SERVICE); - Class<?> storageVolumeClazz = Class.forName("android.os.storage.StorageVolume"); - Method getVolumeList = mStorageManager.getClass().getMethod("getVolumeList"); - Method getUuid = storageVolumeClazz.getMethod("getUuid"); - Method getPath = storageVolumeClazz.getMethod("getPath"); - Method isPrimary = storageVolumeClazz.getMethod("isPrimary"); - Object result = getVolumeList.invoke(mStorageManager); - - final int length = Array.getLength(result); - for (int i = 0; i < length; i++) { - Object storageVolumeElement = Array.get(result, i); - String uuid = (String) getUuid.invoke(storageVolumeElement); - Boolean primary = (Boolean) isPrimary.invoke(storageVolumeElement); - - // primary volume? - if (primary && PRIMARY_VOLUME_NAME.equals(volumeId)) - return (String) getPath.invoke(storageVolumeElement); - - // other volumes? - if (uuid != null && uuid.equals(volumeId)) - return (String) getPath.invoke(storageVolumeElement); - } - // not found. - return null; - } catch (Exception ex) { - return null; - } - } - - @TargetApi(Build.VERSION_CODES.LOLLIPOP) - private static String getVolumeIdFromTreeUri(final Uri treeUri) { - final String docId = DocumentsContract.getTreeDocumentId(treeUri); - final String[] split = docId.split(":"); - if (split.length > 0) return split[0]; - else return null; - } - - - @TargetApi(Build.VERSION_CODES.LOLLIPOP) - private static String getDocumentPathFromTreeUri(final Uri treeUri) { - final String docId = DocumentsContract.getTreeDocumentId(treeUri); - final String[] split = docId.split(":"); - if ((split.length >= 2) && (split[1] != null)) return split[1]; - else return File.separator; - } - - @Nullable - public static String getFullPathFromUri(@Nullable final Uri treeUri, Context con) { - if (treeUri == null) return null; - String volumePath = getVolumePath(getVolumeIdFromUri(treeUri), con); - if (volumePath == null) return File.separator; - if (volumePath.endsWith(File.separator)) - volumePath = volumePath.substring(0, volumePath.length() - 1); - - String documentPath = getDocumentPathFromUri(treeUri); - if (documentPath.endsWith(File.separator)) - documentPath = documentPath.substring(0, documentPath.length() - 1); - - if (documentPath.length() > 0) { - if (documentPath.startsWith(File.separator)) - return volumePath + documentPath; - else - return volumePath + File.separator + documentPath; - } else return volumePath; - } - - @TargetApi(Build.VERSION_CODES.LOLLIPOP) - private static String getVolumeIdFromUri(final Uri treeUri) { - try { - final String docId = DocumentsContract.getDocumentId(treeUri); - final String[] split = docId.split(":"); - if (split.length > 0) return split[0]; - else return null; - } catch (Exception e) { - return null; - } - } - - - @TargetApi(Build.VERSION_CODES.LOLLIPOP) - private static String getDocumentPathFromUri(final Uri treeUri) { - try { - final String docId = DocumentsContract.getDocumentId(treeUri); - final String[] split = docId.split(":"); - if ((split.length >= 2) && (split[1] != null)) return split[1]; - else return File.separator; - } catch (Exception e) { - return null; - } - } - - /** - * Java class containing the data for a file in a find operation. - */ - public static class FindResult { - public String name; - public String relativeName; - public long size; - public long modifiedTime; - public int flags; - - public FindResult(String relativeName, String name, long size, long modifiedTime, int flags) { - this.relativeName = relativeName; - this.name = name; - this.size = size; - this.modifiedTime = modifiedTime; - this.flags = flags; - } - } -} diff --git a/android/app/src/main/java/com/github/stenzek/duckstation/GameDirectoriesActivity.java b/android/app/src/main/java/com/github/stenzek/duckstation/GameDirectoriesActivity.java deleted file mode 100644 index 4c1bd85b2..000000000 --- a/android/app/src/main/java/com/github/stenzek/duckstation/GameDirectoriesActivity.java +++ /dev/null @@ -1,348 +0,0 @@ -package com.github.stenzek.duckstation; - -import android.app.Activity; -import android.content.Context; -import android.content.DialogInterface; -import android.content.Intent; -import android.content.SharedPreferences; -import android.net.Uri; -import android.os.Bundle; -import android.os.FileUtils; -import android.util.Log; -import android.util.Property; -import android.view.LayoutInflater; -import android.view.Menu; -import android.view.MenuItem; -import android.view.View; -import android.view.ViewGroup; -import android.widget.BaseAdapter; -import android.widget.EditText; -import android.widget.ImageButton; -import android.widget.ListAdapter; -import android.widget.TextView; -import android.widget.Toast; - -import androidx.annotation.NonNull; -import androidx.annotation.Nullable; -import androidx.appcompat.app.ActionBar; -import androidx.appcompat.app.AlertDialog; -import androidx.appcompat.app.AppCompatActivity; -import androidx.appcompat.widget.Toolbar; -import androidx.fragment.app.Fragment; -import androidx.fragment.app.ListFragment; -import androidx.preference.PreferenceFragmentCompat; -import androidx.preference.PreferenceManager; -import androidx.preference.PreferenceScreen; -import androidx.recyclerview.widget.DividerItemDecoration; -import androidx.recyclerview.widget.LinearLayoutManager; -import androidx.recyclerview.widget.RecyclerView; -import androidx.viewpager2.adapter.FragmentStateAdapter; -import androidx.viewpager2.widget.ViewPager2; - -import com.google.android.material.tabs.TabLayout; -import com.google.android.material.tabs.TabLayoutMediator; - -import java.util.ArrayList; -import java.util.Arrays; -import java.util.Comparator; -import java.util.HashSet; -import java.util.Set; - -public class GameDirectoriesActivity extends AppCompatActivity { - private static final int REQUEST_ADD_DIRECTORY_TO_GAME_LIST = 1; - private static final String FORCE_SAF_CONFIG_KEY = "GameList/ForceStorageAccessFramework"; - - private class DirectoryListAdapter extends RecyclerView.Adapter { - private class Entry { - private String mPath; - private boolean mRecursive; - - public Entry(String path, boolean recursive) { - mPath = path; - mRecursive = recursive; - } - - public String getPath() { - return mPath; - } - - public boolean isRecursive() { - return mRecursive; - } - - public void toggleRecursive() { - mRecursive = !mRecursive; - } - } - - private class EntryComparator implements Comparator<Entry> { - @Override - public int compare(Entry left, Entry right) { - return left.getPath().compareTo(right.getPath()); - } - } - - private Context mContext; - private Entry[] mEntries; - - public DirectoryListAdapter(Context context) { - mContext = context; - reload(); - } - - public void reload() { - SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(mContext); - ArrayList<Entry> entries = new ArrayList<>(); - - try { - Set<String> paths = prefs.getStringSet("GameList/Paths", null); - if (paths != null) { - for (String path : paths) - entries.add(new Entry(path, false)); - } - } catch (Exception e) { - } - - try { - Set<String> paths = prefs.getStringSet("GameList/RecursivePaths", null); - if (paths != null) { - for (String path : paths) - entries.add(new Entry(path, true)); - } - } catch (Exception e) { - } - - mEntries = new Entry[entries.size()]; - entries.toArray(mEntries); - Arrays.sort(mEntries, new EntryComparator()); - notifyDataSetChanged(); - } - - private class ViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener { - private int mPosition; - private Entry mEntry; - private TextView mPathView; - private TextView mRecursiveView; - private ImageButton mToggleRecursiveView; - private ImageButton mRemoveView; - - public ViewHolder(View rootView) { - super(rootView); - mPathView = rootView.findViewById(R.id.path); - mRecursiveView = rootView.findViewById(R.id.recursive); - mToggleRecursiveView = rootView.findViewById(R.id.toggle_recursive); - mToggleRecursiveView.setOnClickListener(this); - mRemoveView = rootView.findViewById(R.id.remove); - mRemoveView.setOnClickListener(this); - } - - public void bindData(int position, Entry entry) { - mPosition = position; - mEntry = entry; - updateText(); - } - - private void updateText() { - mPathView.setText(mEntry.getPath()); - mRecursiveView.setText(getString(mEntry.isRecursive() ? R.string.game_directories_scanning_subdirectories : R.string.game_directories_not_scanning_subdirectories)); - mToggleRecursiveView.setImageDrawable(getDrawable(mEntry.isRecursive() ? R.drawable.ic_baseline_folder_24 : R.drawable.ic_baseline_folder_open_24)); - } - - @Override - public void onClick(View v) { - if (mToggleRecursiveView == v) { - removeSearchDirectory(mContext, mEntry.getPath(), mEntry.isRecursive()); - mEntry.toggleRecursive(); - addSearchDirectory(mContext, mEntry.getPath(), mEntry.isRecursive()); - updateText(); - } else if (mRemoveView == v) { - removeSearchDirectory(mContext, mEntry.getPath(), mEntry.isRecursive()); - reload(); - } - } - } - - @NonNull - @Override - public RecyclerView.ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) { - final View view = LayoutInflater.from(parent.getContext()).inflate(viewType, parent, false); - return new ViewHolder(view); - } - - @Override - public void onBindViewHolder(@NonNull RecyclerView.ViewHolder holder, int position) { - ((ViewHolder) holder).bindData(position, mEntries[position]); - } - - @Override - public int getItemViewType(int position) { - return R.layout.layout_game_directory_entry; - } - - @Override - public long getItemId(int position) { - return mEntries[position].getPath().hashCode(); - } - - @Override - public int getItemCount() { - return mEntries.length; - } - } - - DirectoryListAdapter mDirectoryListAdapter; - RecyclerView mRecyclerView; - - @Override - protected void onCreate(Bundle savedInstanceState) { - super.onCreate(savedInstanceState); - - setContentView(R.layout.activity_game_directories); - Toolbar toolbar = findViewById(R.id.toolbar); - setSupportActionBar(toolbar); - - ActionBar actionBar = getSupportActionBar(); - if (actionBar != null) { - actionBar.setDisplayHomeAsUpEnabled(true); - } - - mDirectoryListAdapter = new DirectoryListAdapter(this); - mRecyclerView = findViewById(R.id.recycler_view); - mRecyclerView.setAdapter(mDirectoryListAdapter); - mRecyclerView.setLayoutManager(new LinearLayoutManager(this)); - mRecyclerView.addItemDecoration(new DividerItemDecoration(mRecyclerView.getContext(), - DividerItemDecoration.VERTICAL)); - - findViewById(R.id.fab).setOnClickListener((v) -> startAddGameDirectory()); - } - - @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_edit_game_directories, menu); - - menu.findItem(R.id.force_saf) - .setEnabled(android.os.Build.VERSION.SDK_INT < 30) - .setChecked(PreferenceManager.getDefaultSharedPreferences(this).getBoolean( - FORCE_SAF_CONFIG_KEY, false)) - .setOnMenuItemClickListener(item -> { - final SharedPreferences sharedPreferences = - PreferenceManager.getDefaultSharedPreferences(this); - final boolean newValue =!sharedPreferences.getBoolean( - FORCE_SAF_CONFIG_KEY, false); - sharedPreferences.edit() - .putBoolean(FORCE_SAF_CONFIG_KEY, newValue) - .commit(); - item.setChecked(newValue); - return true; - }); - - return true; - } - - @Override - public boolean onOptionsItemSelected(@NonNull MenuItem item) { - if (item.getItemId() == android.R.id.home) { - onBackPressed(); - return true; - } - - if (item.getItemId() == R.id.add_directory) { - startAddGameDirectory(); - return true; - } else if (item.getItemId() == R.id.add_path) { - startAddPath(); - return true; - } - - return super.onOptionsItemSelected(item); - } - - public static boolean useStorageAccessFramework(Context context) { - // Use legacy storage on devices older than Android 11... apparently some of them - // have broken storage access framework.... - if (android.os.Build.VERSION.SDK_INT >= 30) - return true; - - return PreferenceManager.getDefaultSharedPreferences(context).getBoolean( - "GameList/ForceStorageAccessFramework", false); - } - - public static void addSearchDirectory(Context context, String path, boolean recursive) { - final SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(context); - final String key = recursive ? "GameList/RecursivePaths" : "GameList/Paths"; - PreferenceHelpers.addToStringList(prefs, key, path); - Log.i("GameDirectoriesActivity", "Added path '" + path + "' to game list search directories"); - } - - public static void removeSearchDirectory(Context context, String path, boolean recursive) { - final SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(context); - final String key = recursive ? "GameList/RecursivePaths" : "GameList/Paths"; - PreferenceHelpers.removeFromStringList(prefs, key, path); - Log.i("GameDirectoriesActivity", "Removed path '" + path + "' from game list search directories"); - } - - private void startAddGameDirectory() { - Intent i = new Intent(Intent.ACTION_OPEN_DOCUMENT_TREE); - i.addCategory(Intent.CATEGORY_DEFAULT); - i.putExtra(Intent.EXTRA_LOCAL_ONLY, true); - i.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION); - i.addFlags(Intent.FLAG_GRANT_PERSISTABLE_URI_PERMISSION); - startActivityForResult(Intent.createChooser(i, getString(R.string.main_activity_choose_directory)), - REQUEST_ADD_DIRECTORY_TO_GAME_LIST); - } - - private void startAddPath() { - final EditText text = new EditText(this); - text.setSingleLine(); - - new AlertDialog.Builder(this) - .setTitle(R.string.edit_game_directories_add_path) - .setMessage(R.string.edit_game_directories_add_path_summary) - .setView(text) - .setPositiveButton("Add", (dialog, which) -> { - final String path = text.getText().toString(); - if (!path.isEmpty()) { - addSearchDirectory(GameDirectoriesActivity.this, path, true); - mDirectoryListAdapter.reload(); - } - }) - .setNegativeButton("Cancel", (dialog, which) -> dialog.dismiss()) - .show(); - } - - @Override - public void onActivityResult(int requestCode, int resultCode, Intent data) { - super.onActivityResult(requestCode, resultCode, data); - - switch (requestCode) { - case REQUEST_ADD_DIRECTORY_TO_GAME_LIST: { - if (resultCode != RESULT_OK || data.getData() == null) - return; - - // Use legacy storage on devices older than Android 11... apparently some of them - // have broken storage access framework.... - if (!useStorageAccessFramework(this)) { - final String path = FileHelper.getFullPathFromTreeUri(data.getData(), this); - if (path != null) { - addSearchDirectory(this, path, true); - mDirectoryListAdapter.reload(); - return; - } - } - - try { - getContentResolver().takePersistableUriPermission(data.getData(), - Intent.FLAG_GRANT_READ_URI_PERMISSION); - } catch (Exception e) { - Toast.makeText(this, "Failed to take persistable permission.", Toast.LENGTH_LONG); - e.printStackTrace(); - } - - addSearchDirectory(this, data.getDataString(), true); - mDirectoryListAdapter.reload(); - } - break; - } - } -} \ No newline at end of file diff --git a/android/app/src/main/java/com/github/stenzek/duckstation/GameGridFragment.java b/android/app/src/main/java/com/github/stenzek/duckstation/GameGridFragment.java deleted file mode 100644 index d72b80501..000000000 --- a/android/app/src/main/java/com/github/stenzek/duckstation/GameGridFragment.java +++ /dev/null @@ -1,139 +0,0 @@ -package com.github.stenzek.duckstation; - -import android.os.AsyncTask; -import android.os.Bundle; -import android.util.TypedValue; -import android.view.Gravity; -import android.view.LayoutInflater; -import android.view.MenuItem; -import android.view.View; -import android.view.ViewGroup; -import android.widget.ImageView; - -import androidx.annotation.NonNull; -import androidx.annotation.Nullable; -import androidx.appcompat.widget.PopupMenu; -import androidx.core.content.ContextCompat; -import androidx.fragment.app.Fragment; -import androidx.recyclerview.widget.RecyclerView; - -public class GameGridFragment extends Fragment implements GameList.OnRefreshListener { - private static final int SPACING_DIPS = 25; - private static final int WIDTH_DIPS = 160; - - private final MainActivity mParent; - private RecyclerView mRecyclerView; - private ViewAdapter mAdapter; - private GridAutofitLayoutManager mLayoutManager; - - public GameGridFragment(MainActivity parent) { - super(R.layout.fragment_game_grid); - this.mParent = parent; - } - - private GameList getGameList() { - return mParent.getGameList(); - } - - @Override - public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) { - super.onViewCreated(view, savedInstanceState); - - mAdapter = new ViewAdapter(mParent, getGameList()); - getGameList().addRefreshListener(this); - - mRecyclerView = view.findViewById(R.id.game_list_view); - mRecyclerView.setAdapter(mAdapter); - - final int columnWidth = Math.round(TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, - WIDTH_DIPS + SPACING_DIPS, getResources().getDisplayMetrics())); - mLayoutManager = new GridAutofitLayoutManager(getContext(), columnWidth); - mRecyclerView.setLayoutManager(mLayoutManager); - } - - @Override - public void onDestroyView() { - super.onDestroyView(); - - getGameList().removeRefreshListener(this); - } - - @Override - public void onGameListRefresh() { - mAdapter.notifyDataSetChanged(); - } - - private static class ViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener, View.OnLongClickListener { - private final MainActivity mParent; - private final ImageView mImageView; - private GameListEntry mEntry; - - public ViewHolder(@NonNull MainActivity parent, @NonNull View itemView) { - super(itemView); - mParent = parent; - mImageView = itemView.findViewById(R.id.imageView); - mImageView.setOnClickListener(this); - mImageView.setOnLongClickListener(this); - } - - public void bindToEntry(GameListEntry entry) { - mEntry = entry; - - // while it loads/generates - mImageView.setImageDrawable(ContextCompat.getDrawable(mParent, R.drawable.ic_media_cdrom)); - - final String coverPath = entry.getCoverPath(); - if (coverPath == null) { - new GenerateCoverTask(mParent, mImageView, mEntry.getTitle()).executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR); - return; - } - - new ImageLoadTask(mImageView).executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR, coverPath); - } - - @Override - public void onClick(View v) { - mParent.startEmulation(mEntry.getPath(), mParent.shouldResumeStateByDefault()); - } - - @Override - public boolean onLongClick(View v) { - mParent.openGamePopupMenu(v, mEntry); - return true; - } - } - - private static class ViewAdapter extends RecyclerView.Adapter<ViewHolder> { - private final MainActivity mParent; - private final LayoutInflater mInflater; - private final GameList mGameList; - - public ViewAdapter(@NonNull MainActivity parent, @NonNull GameList gameList) { - mParent = parent; - mInflater = LayoutInflater.from(parent); - mGameList = gameList; - } - - @NonNull - @Override - public ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) { - return new ViewHolder(mParent, mInflater.inflate(R.layout.layout_game_grid_entry, parent, false)); - } - - @Override - public void onBindViewHolder(@NonNull ViewHolder holder, int position) { - GameListEntry entry = mGameList.getEntry(position); - holder.bindToEntry(entry); - } - - @Override - public int getItemCount() { - return mGameList.getEntryCount(); - } - - @Override - public int getItemViewType(int position) { - return R.layout.layout_game_grid_entry; - } - } -} diff --git a/android/app/src/main/java/com/github/stenzek/duckstation/GameList.java b/android/app/src/main/java/com/github/stenzek/duckstation/GameList.java deleted file mode 100644 index f835dce22..000000000 --- a/android/app/src/main/java/com/github/stenzek/duckstation/GameList.java +++ /dev/null @@ -1,84 +0,0 @@ -package com.github.stenzek.duckstation; - -import android.app.Activity; -import android.os.AsyncTask; -import android.util.Log; -import android.view.LayoutInflater; -import android.view.View; -import android.view.ViewGroup; -import android.widget.BaseAdapter; - -import java.util.ArrayList; -import java.util.Arrays; -import java.util.Comparator; - -public class GameList { - public interface OnRefreshListener { - void onGameListRefresh(); - } - - private Activity mContext; - private GameListEntry[] mEntries; - private ArrayList<OnRefreshListener> mRefreshListeners = new ArrayList<>(); - - public GameList(Activity context) { - mContext = context; - mEntries = new GameListEntry[0]; - } - - public void addRefreshListener(OnRefreshListener listener) { - mRefreshListeners.add(listener); - } - public void removeRefreshListener(OnRefreshListener listener) { - mRefreshListeners.remove(listener); - } - public void fireRefreshListeners() { - for (OnRefreshListener listener : mRefreshListeners) - listener.onGameListRefresh(); - } - - private class GameListEntryComparator implements Comparator<GameListEntry> { - @Override - public int compare(GameListEntry left, GameListEntry right) { - return left.getTitle().compareTo(right.getTitle()); - } - } - - public void refresh(boolean invalidateCache, boolean invalidateDatabase, Activity parentActivity) { - // Search and get entries from native code - AndroidProgressCallback progressCallback = new AndroidProgressCallback(mContext); - AsyncTask.execute(() -> { - AndroidHostInterface.getInstance().refreshGameList(invalidateCache, invalidateDatabase, progressCallback); - GameListEntry[] newEntries = AndroidHostInterface.getInstance().getGameListEntries(); - Arrays.sort(newEntries, new GameListEntryComparator()); - - mContext.runOnUiThread(() -> { - try { - progressCallback.dismiss(); - } catch (Exception e) { - Log.e("GameList", "Exception dismissing refresh progress"); - e.printStackTrace(); - } - mEntries = newEntries; - fireRefreshListeners(); - }); - }); - } - - public int getEntryCount() { - return mEntries.length; - } - - public GameListEntry getEntry(int index) { - return mEntries[index]; - } - - public GameListEntry getEntryForPath(String path) { - for (final GameListEntry entry : mEntries) { - if (entry.getPath().equals(path)) - return entry; - } - - return null; - } -} diff --git a/android/app/src/main/java/com/github/stenzek/duckstation/GameListEntry.java b/android/app/src/main/java/com/github/stenzek/duckstation/GameListEntry.java deleted file mode 100644 index 95e5674b5..000000000 --- a/android/app/src/main/java/com/github/stenzek/duckstation/GameListEntry.java +++ /dev/null @@ -1,99 +0,0 @@ -package com.github.stenzek.duckstation; - -import android.os.AsyncTask; -import android.view.View; -import android.widget.ImageView; -import android.widget.TextView; - -import androidx.core.content.ContextCompat; - -public class GameListEntry { - public enum EntryType { - Disc, - PSExe, - Playlist, - PSF - } - - public enum CompatibilityRating { - Unknown, - DoesntBoot, - CrashesInIntro, - CrashesInGame, - GraphicalAudioIssues, - NoIssues, - } - - private String mPath; - private String mCode; - private String mTitle; - private long mSize; - private String mModifiedTime; - private DiscRegion mRegion; - private EntryType mType; - private CompatibilityRating mCompatibilityRating; - private String mCoverPath; - - public GameListEntry(String path, String code, String title, long size, String modifiedTime, String region, - String type, String compatibilityRating, String coverPath) { - mPath = path; - mCode = code; - mTitle = title; - mSize = size; - mModifiedTime = modifiedTime; - mCoverPath = coverPath; - - try { - mRegion = DiscRegion.valueOf(region); - } catch (IllegalArgumentException e) { - mRegion = DiscRegion.NTSC_U; - } - - try { - mType = EntryType.valueOf(type); - } catch (IllegalArgumentException e) { - mType = EntryType.Disc; - } - - try { - mCompatibilityRating = CompatibilityRating.valueOf(compatibilityRating); - } catch (IllegalArgumentException e) { - mCompatibilityRating = CompatibilityRating.Unknown; - } - } - - public String getPath() { - return mPath; - } - - public String getCode() { - return mCode; - } - - public String getTitle() { - return mTitle; - } - - public long getSize() { return mSize; } - - public String getModifiedTime() { - return mModifiedTime; - } - - public DiscRegion getRegion() { - return mRegion; - } - - public EntryType getType() { - return mType; - } - - public CompatibilityRating getCompatibilityRating() { - return mCompatibilityRating; - } - - public String getCoverPath() { return mCoverPath; } - - public void setCoverPath(String coverPath) { mCoverPath = coverPath; } - -} diff --git a/android/app/src/main/java/com/github/stenzek/duckstation/GameListFragment.java b/android/app/src/main/java/com/github/stenzek/duckstation/GameListFragment.java deleted file mode 100644 index 01635d7b5..000000000 --- a/android/app/src/main/java/com/github/stenzek/duckstation/GameListFragment.java +++ /dev/null @@ -1,204 +0,0 @@ -package com.github.stenzek.duckstation; - -import android.os.AsyncTask; -import android.os.Bundle; -import android.view.LayoutInflater; -import android.view.View; -import android.view.ViewGroup; -import android.widget.ImageView; -import android.widget.TextView; - -import androidx.annotation.NonNull; -import androidx.annotation.Nullable; -import androidx.core.content.ContextCompat; -import androidx.fragment.app.Fragment; -import androidx.recyclerview.widget.DividerItemDecoration; -import androidx.recyclerview.widget.LinearLayoutManager; -import androidx.recyclerview.widget.RecyclerView; - -public class GameListFragment extends Fragment implements GameList.OnRefreshListener { - private MainActivity mParent; - private RecyclerView mRecyclerView; - private GameListFragment.ViewAdapter mAdapter; - - public GameListFragment(MainActivity parent) { - super(R.layout.fragment_game_list); - this.mParent = parent; - } - - private GameList getGameList() { - return mParent.getGameList(); - } - - @Override - public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) { - super.onViewCreated(view, savedInstanceState); - - mAdapter = new GameListFragment.ViewAdapter(mParent, getGameList()); - getGameList().addRefreshListener(this); - - mRecyclerView = view.findViewById(R.id.game_list_view); - mRecyclerView.setAdapter(mAdapter); - mRecyclerView.setLayoutManager(new LinearLayoutManager(mParent)); - mRecyclerView.addItemDecoration(new DividerItemDecoration(mRecyclerView.getContext(), - DividerItemDecoration.VERTICAL)); - } - - @Override - public void onDestroyView() { - super.onDestroyView(); - - getGameList().removeRefreshListener(this); - } - - @Override - public void onGameListRefresh() { - mAdapter.notifyDataSetChanged(); - } - - private static class ViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener, View.OnLongClickListener { - private MainActivity mParent; - private View mItemView; - private GameListEntry mEntry; - - public ViewHolder(@NonNull MainActivity parent, @NonNull View itemView) { - super(itemView); - mParent = parent; - mItemView = itemView; - mItemView.setOnClickListener(this); - mItemView.setOnLongClickListener(this); - } - - private String getSubTitle() { - String fileName = FileHelper.getFileNameForPath(mEntry.getPath()); - String sizeString = String.format("%.2f MB", (double) mEntry.getSize() / 1048576.0); - return String.format("%s (%s)", fileName, sizeString); - } - - public void bindToEntry(GameListEntry entry) { - mEntry = entry; - - ((TextView) mItemView.findViewById(R.id.game_list_view_entry_title)).setText(entry.getTitle()); - ((TextView) mItemView.findViewById(R.id.game_list_view_entry_subtitle)).setText(getSubTitle()); - - int regionDrawableId; - switch (entry.getRegion()) { - case NTSC_J: - regionDrawableId = R.drawable.flag_jp; - break; - case PAL: - regionDrawableId = R.drawable.flag_eu; - break; - case Other: - regionDrawableId = R.drawable.ic_baseline_help_24; - break; - case NTSC_U: - default: - regionDrawableId = R.drawable.flag_us; - break; - } - - ((ImageView) mItemView.findViewById(R.id.game_list_view_entry_region_icon)) - .setImageDrawable(ContextCompat.getDrawable(mItemView.getContext(), regionDrawableId)); - - int typeDrawableId; - switch (entry.getType()) { - case PSExe: - typeDrawableId = R.drawable.ic_emblem_system; - break; - - case Playlist: - typeDrawableId = R.drawable.ic_baseline_playlist_play_24; - break; - - case PSF: - typeDrawableId = R.drawable.ic_baseline_library_music_24; - break; - - case Disc: - default: - typeDrawableId = R.drawable.ic_media_cdrom; - break; - } - - ImageView icon = ((ImageView) mItemView.findViewById(R.id.game_list_view_entry_type_icon)); - icon.setImageDrawable(ContextCompat.getDrawable(mItemView.getContext(), typeDrawableId)); - - final String coverPath = entry.getCoverPath(); - if (coverPath != null) { - new ImageLoadTask(icon).executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR, coverPath); - } - - int compatibilityDrawableId; - switch (entry.getCompatibilityRating()) { - case DoesntBoot: - compatibilityDrawableId = R.drawable.ic_star_1; - break; - case CrashesInIntro: - compatibilityDrawableId = R.drawable.ic_star_2; - break; - case CrashesInGame: - compatibilityDrawableId = R.drawable.ic_star_3; - break; - case GraphicalAudioIssues: - compatibilityDrawableId = R.drawable.ic_star_4; - break; - case NoIssues: - compatibilityDrawableId = R.drawable.ic_star_5; - break; - case Unknown: - default: - compatibilityDrawableId = R.drawable.ic_star_0; - break; - } - - ((ImageView) mItemView.findViewById(R.id.game_list_view_compatibility_icon)) - .setImageDrawable(ContextCompat.getDrawable(mItemView.getContext(), compatibilityDrawableId)); - } - - @Override - public void onClick(View v) { - mParent.startEmulation(mEntry.getPath(), mParent.shouldResumeStateByDefault()); - } - - @Override - public boolean onLongClick(View v) { - mParent.openGamePopupMenu(v, mEntry); - return true; - } - } - - private static class ViewAdapter extends RecyclerView.Adapter<GameListFragment.ViewHolder> { - private MainActivity mParent; - private LayoutInflater mInflater; - private GameList mGameList; - - public ViewAdapter(@NonNull MainActivity parent, @NonNull GameList gameList) { - mParent = parent; - mInflater = LayoutInflater.from(parent); - mGameList = gameList; - } - - @NonNull - @Override - public GameListFragment.ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) { - return new GameListFragment.ViewHolder(mParent, mInflater.inflate(R.layout.layout_game_list_entry, parent, false)); - } - - @Override - public void onBindViewHolder(@NonNull GameListFragment.ViewHolder holder, int position) { - GameListEntry entry = mGameList.getEntry(position); - holder.bindToEntry(entry); - } - - @Override - public int getItemCount() { - return mGameList.getEntryCount(); - } - - @Override - public int getItemViewType(int position) { - return R.layout.layout_game_list_entry; - } - } -} diff --git a/android/app/src/main/java/com/github/stenzek/duckstation/GamePropertiesActivity.java b/android/app/src/main/java/com/github/stenzek/duckstation/GamePropertiesActivity.java deleted file mode 100644 index 2ca556229..000000000 --- a/android/app/src/main/java/com/github/stenzek/duckstation/GamePropertiesActivity.java +++ /dev/null @@ -1,253 +0,0 @@ -package com.github.stenzek.duckstation; - -import android.os.Bundle; -import android.view.LayoutInflater; -import android.view.MenuItem; -import android.view.View; -import android.view.ViewGroup; -import android.widget.ListAdapter; - -import androidx.annotation.NonNull; -import androidx.annotation.Nullable; -import androidx.appcompat.app.ActionBar; -import androidx.appcompat.app.AlertDialog; -import androidx.appcompat.app.AppCompatActivity; -import androidx.fragment.app.Fragment; -import androidx.fragment.app.ListFragment; -import androidx.preference.PreferenceFragmentCompat; -import androidx.preference.PreferenceScreen; -import androidx.viewpager2.adapter.FragmentStateAdapter; -import androidx.viewpager2.widget.ViewPager2; - -import com.google.android.material.tabs.TabLayout; -import com.google.android.material.tabs.TabLayoutMediator; - -public class GamePropertiesActivity extends AppCompatActivity { - PropertyListAdapter mPropertiesListAdapter; - GameListEntry mGameListEntry; - - public ListAdapter getPropertyListAdapter() { - if (mPropertiesListAdapter != null) - return mPropertiesListAdapter; - - mPropertiesListAdapter = new PropertyListAdapter(this); - mPropertiesListAdapter.addItem("title", "Title", mGameListEntry.getTitle()); - mPropertiesListAdapter.addItem("serial", "Serial", mGameListEntry.getCode()); - mPropertiesListAdapter.addItem("type", "Type", mGameListEntry.getType().toString()); - mPropertiesListAdapter.addItem("path", "Path", mGameListEntry.getPath()); - mPropertiesListAdapter.addItem("region", "Region", mGameListEntry.getRegion().toString()); - mPropertiesListAdapter.addItem("compatibility", "Compatibility Rating", mGameListEntry.getCompatibilityRating().toString()); - return mPropertiesListAdapter; - } - - @Override - protected void onCreate(Bundle savedInstanceState) { - super.onCreate(null); - - String path = getIntent().getStringExtra("path"); - if (path == null || path.isEmpty()) { - finish(); - return; - } - - mGameListEntry = AndroidHostInterface.getInstance().getGameListEntry(path); - if (mGameListEntry == null) { - finish(); - return; - } - - setContentView(R.layout.settings_activity); - getSupportFragmentManager() - .beginTransaction() - .replace(R.id.settings, new SettingsCollectionFragment(this)) - .commit(); - ActionBar actionBar = getSupportActionBar(); - if (actionBar != null) { - actionBar.setDisplayHomeAsUpEnabled(true); - } - - setTitle(mGameListEntry.getTitle()); - } - - @Override - public boolean onOptionsItemSelected(@NonNull MenuItem item) { - if (item.getItemId() == android.R.id.home) { - onBackPressed(); - return true; - } - - return super.onOptionsItemSelected(item); - } - - private void displayError(String text) { - new AlertDialog.Builder(this) - .setTitle(R.string.emulation_activity_error) - .setMessage(text) - .setNegativeButton(R.string.main_activity_ok, ((dialog, which) -> dialog.dismiss())) - .create() - .show(); - } - - private void createBooleanGameSetting(PreferenceScreen ps, String key, int titleId) { - GameSettingPreference pref = new GameSettingPreference(ps.getContext(), mGameListEntry.getPath(), key, titleId); - ps.addPreference(pref); - } - - private void createTraitGameSetting(PreferenceScreen ps, String key, int titleId) { - GameTraitPreference pref = new GameTraitPreference(ps.getContext(), mGameListEntry.getPath(), key, titleId); - ps.addPreference(pref); - } - - private void createListGameSetting(PreferenceScreen ps, String key, int titleId, int entryId, int entryValuesId) { - GameSettingPreference pref = new GameSettingPreference(ps.getContext(), mGameListEntry.getPath(), key, titleId, entryId, entryValuesId); - ps.addPreference(pref); - } - - public static class GameSettingsFragment extends PreferenceFragmentCompat { - private GamePropertiesActivity activity; - - public GameSettingsFragment(GamePropertiesActivity activity) { - this.activity = activity; - } - - @Override - public void onCreatePreferences(Bundle savedInstanceState, String rootKey) { - final PreferenceScreen ps = getPreferenceManager().createPreferenceScreen(getContext()); - activity.createListGameSetting(ps, "CPUOverclock", R.string.settings_cpu_overclocking, R.array.settings_advanced_cpu_overclock_entries, R.array.settings_advanced_cpu_overclock_values); - activity.createListGameSetting(ps, "CDROMReadSpeedup", R.string.settings_cdrom_read_speedup, R.array.settings_cdrom_read_speedup_entries, R.array.settings_cdrom_read_speedup_values); - activity.createListGameSetting(ps, "CDROMSeekSpeedup", R.string.settings_cdrom_seek_speedup, R.array.settings_cdrom_seek_speedup_entries, R.array.settings_cdrom_seek_speedup_values); - - activity.createListGameSetting(ps, "GPURenderer", R.string.settings_gpu_renderer, R.array.gpu_renderer_entries, R.array.gpu_renderer_values); - activity.createListGameSetting(ps, "DisplayAspectRatio", R.string.settings_aspect_ratio, R.array.settings_display_aspect_ratio_names, R.array.settings_display_aspect_ratio_values); - activity.createListGameSetting(ps, "DisplayCropMode", R.string.settings_crop_mode, R.array.settings_display_crop_mode_entries, R.array.settings_display_crop_mode_values); - activity.createListGameSetting(ps, "GPUDownsampleMode", R.string.settings_downsample_mode, R.array.settings_downsample_mode_entries, R.array.settings_downsample_mode_values); - activity.createBooleanGameSetting(ps, "DisplayLinearUpscaling", R.string.settings_linear_upscaling); - activity.createBooleanGameSetting(ps, "DisplayIntegerUpscaling", R.string.settings_integer_upscaling); - activity.createBooleanGameSetting(ps, "DisplayForce4_3For24Bit", R.string.settings_force_4_3_for_24bit); - - activity.createListGameSetting(ps, "GPUResolutionScale", R.string.settings_gpu_resolution_scale, R.array.settings_gpu_resolution_scale_entries, R.array.settings_gpu_resolution_scale_values); - activity.createListGameSetting(ps, "GPUMSAA", R.string.settings_msaa, R.array.settings_gpu_msaa_entries, R.array.settings_gpu_msaa_values); - activity.createBooleanGameSetting(ps, "GPUTrueColor", R.string.settings_true_color); - activity.createBooleanGameSetting(ps, "GPUScaledDithering", R.string.settings_scaled_dithering); - activity.createListGameSetting(ps, "GPUTextureFilter", R.string.settings_texture_filtering, R.array.settings_gpu_texture_filter_names, R.array.settings_gpu_texture_filter_values); - activity.createBooleanGameSetting(ps, "GPUForceNTSCTimings", R.string.settings_force_ntsc_timings); - activity.createBooleanGameSetting(ps, "GPUWidescreenHack", R.string.settings_widescreen_hack); - activity.createBooleanGameSetting(ps, "GPUPGXP", R.string.settings_pgxp_geometry_correction); - activity.createBooleanGameSetting(ps, "PGXPPreserveProjFP", R.string.settings_pgxp_preserve_projection_precision); - activity.createBooleanGameSetting(ps, "GPUPGXPDepthBuffer", R.string.settings_pgxp_depth_buffer); - activity.createTraitGameSetting(ps, "ForceSoftwareRenderer", R.string.settings_use_software_renderer); - activity.createTraitGameSetting(ps, "ForceSoftwareRendererForReadbacks", R.string.settings_use_software_renderer_for_readbacks); - activity.createTraitGameSetting(ps, "DisableWidescreen", R.string.settings_disable_widescreen); - activity.createTraitGameSetting(ps, "ForcePGXPVertexCache", R.string.settings_pgxp_vertex_cache); - activity.createTraitGameSetting(ps, "ForcePGXPCPUMode", R.string.settings_pgxp_cpu_mode); - - setPreferenceScreen(ps); - } - } - - public static class ControllerSettingsFragment extends PreferenceFragmentCompat { - private GamePropertiesActivity activity; - - public ControllerSettingsFragment(GamePropertiesActivity activity) { - this.activity = activity; - } - - private void createInputProfileSetting(PreferenceScreen ps) { - final GameSettingPreference pref = new GameSettingPreference(ps.getContext(), activity.mGameListEntry.getPath(), "InputProfileName", R.string.settings_input_profile); - - final String[] inputProfileNames = AndroidHostInterface.getInstance().getInputProfileNames(); - pref.setEntries(inputProfileNames); - pref.setEntryValues(inputProfileNames); - ps.addPreference(pref); - } - - @Override - public void onCreatePreferences(Bundle savedInstanceState, String rootKey) { - final PreferenceScreen ps = getPreferenceManager().createPreferenceScreen(getContext()); - - activity.createListGameSetting(ps, "Controller1Type", R.string.settings_controller_type, R.array.settings_controller_type_entries, R.array.settings_controller_type_values); - activity.createListGameSetting(ps, "MemoryCard1Type", R.string.settings_memory_card_1_type, R.array.settings_memory_card_mode_entries, R.array.settings_memory_card_mode_values); - activity.createListGameSetting(ps, "MemoryCard2Type", R.string.settings_memory_card_2_type, R.array.settings_memory_card_mode_entries, R.array.settings_memory_card_mode_values); - createInputProfileSetting(ps); - - setPreferenceScreen(ps); - } - } - - public static class SettingsCollectionFragment extends Fragment { - private GamePropertiesActivity activity; - private SettingsCollectionAdapter adapter; - private ViewPager2 viewPager; - - public SettingsCollectionFragment(GamePropertiesActivity activity) { - this.activity = activity; - } - - @Nullable - @Override - public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { - return inflater.inflate(R.layout.fragment_controller_settings, container, false); - } - - @Override - public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) { - adapter = new SettingsCollectionAdapter(activity, this); - viewPager = view.findViewById(R.id.view_pager); - viewPager.setAdapter(adapter); - - TabLayout tabLayout = view.findViewById(R.id.tab_layout); - new TabLayoutMediator(tabLayout, viewPager, (tab, position) -> { - switch (position) { - case 0: - tab.setText(R.string.game_properties_tab_summary); - break; - case 1: - tab.setText(R.string.game_properties_tab_game_settings); - break; - case 2: - tab.setText(R.string.game_properties_tab_controller_settings); - break; - } - }).attach(); - } - } - - public static class SettingsCollectionAdapter extends FragmentStateAdapter { - private GamePropertiesActivity activity; - - public SettingsCollectionAdapter(@NonNull GamePropertiesActivity activity, @NonNull Fragment fragment) { - super(fragment); - this.activity = activity; - } - - @NonNull - @Override - public Fragment createFragment(int position) { - switch (position) { - case 0: { // Summary - ListFragment lf = new ListFragment(); - lf.setListAdapter(activity.getPropertyListAdapter()); - return lf; - } - - case 1: { // Game Settings - return new GameSettingsFragment(activity); - } - - case 2: { // Controller Settings - return new ControllerSettingsFragment(activity); - } - - // TODO: Memory Card Editor - - default: - return null; - } - } - - @Override - public int getItemCount() { - return 3; - } - } -} \ No newline at end of file diff --git a/android/app/src/main/java/com/github/stenzek/duckstation/GameSettingPreference.java b/android/app/src/main/java/com/github/stenzek/duckstation/GameSettingPreference.java deleted file mode 100644 index d86e8af41..000000000 --- a/android/app/src/main/java/com/github/stenzek/duckstation/GameSettingPreference.java +++ /dev/null @@ -1,83 +0,0 @@ -package com.github.stenzek.duckstation; - -import android.content.Context; -import android.util.AttributeSet; - -import androidx.preference.ListPreference; - -public class GameSettingPreference extends ListPreference { - private String mGamePath; - - /** - * Creates a boolean game property preference. - */ - public GameSettingPreference(Context context, String gamePath, String settingKey, int titleId) { - super(context); - mGamePath = gamePath; - setPersistent(false); - setTitle(titleId); - setKey(settingKey); - setIconSpaceReserved(false); - setSummaryProvider(SimpleSummaryProvider.getInstance()); - - setEntries(R.array.settings_boolean_entries); - setEntryValues(R.array.settings_boolean_values); - - updateValue(); - } - - /** - * Creates a list game property preference. - */ - public GameSettingPreference(Context context, String gamePath, String settingKey, int titleId, int entryArray, int entryValuesArray) { - super(context); - mGamePath = gamePath; - setPersistent(false); - setTitle(titleId); - setKey(settingKey); - setIconSpaceReserved(false); - setSummaryProvider(SimpleSummaryProvider.getInstance()); - - setEntries(entryArray); - setEntryValues(entryValuesArray); - - updateValue(); - } - - private void updateValue() { - final String value = AndroidHostInterface.getInstance().getGameSettingValue(mGamePath, getKey()); - if (value == null) - super.setValue("null"); - else - super.setValue(value); - } - - @Override - public void setValue(String value) { - super.setValue(value); - if (value.equals("null")) - AndroidHostInterface.getInstance().setGameSettingValue(mGamePath, getKey(), null); - else - AndroidHostInterface.getInstance().setGameSettingValue(mGamePath, getKey(), value); - } - - @Override - public void setEntries(CharSequence[] entries) { - final int length = (entries != null) ? entries.length : 0; - CharSequence[] newEntries = new CharSequence[length + 1]; - newEntries[0] = getContext().getString(R.string.game_properties_preference_use_global_setting); - if (entries != null) - System.arraycopy(entries, 0, newEntries, 1, entries.length); - super.setEntries(newEntries); - } - - @Override - public void setEntryValues(CharSequence[] entryValues) { - final int length = (entryValues != null) ? entryValues.length : 0; - CharSequence[] newEntryValues = new CharSequence[length + 1]; - newEntryValues[0] = "null"; - if (entryValues != null) - System.arraycopy(entryValues, 0, newEntryValues, 1, length); - super.setEntryValues(newEntryValues); - } -} diff --git a/android/app/src/main/java/com/github/stenzek/duckstation/GameTraitPreference.java b/android/app/src/main/java/com/github/stenzek/duckstation/GameTraitPreference.java deleted file mode 100644 index a3eb13aab..000000000 --- a/android/app/src/main/java/com/github/stenzek/duckstation/GameTraitPreference.java +++ /dev/null @@ -1,34 +0,0 @@ -package com.github.stenzek.duckstation; - -import android.content.Context; - -import androidx.preference.ListPreference; -import androidx.preference.SwitchPreference; - -public class GameTraitPreference extends SwitchPreference { - private String mGamePath; - - /** - * Creates a boolean game property preference. - */ - public GameTraitPreference(Context context, String gamePath, String settingKey, int titleId) { - super(context); - mGamePath = gamePath; - setPersistent(false); - setTitle(titleId); - setKey(settingKey); - setIconSpaceReserved(false); - updateValue(); - } - - private void updateValue() { - final String value = AndroidHostInterface.getInstance().getGameSettingValue(mGamePath, getKey()); - super.setChecked(value != null && value.equals("true")); - } - - @Override - public void setChecked(boolean checked) { - super.setChecked(checked); - AndroidHostInterface.getInstance().setGameSettingValue(mGamePath, getKey(), checked ? "true" : "false"); - } -} diff --git a/android/app/src/main/java/com/github/stenzek/duckstation/GenerateCoverTask.java b/android/app/src/main/java/com/github/stenzek/duckstation/GenerateCoverTask.java deleted file mode 100644 index f503d4e15..000000000 --- a/android/app/src/main/java/com/github/stenzek/duckstation/GenerateCoverTask.java +++ /dev/null @@ -1,64 +0,0 @@ -package com.github.stenzek.duckstation; - -import android.content.Context; -import android.graphics.Bitmap; -import android.graphics.BitmapFactory; -import android.graphics.Canvas; -import android.graphics.Color; -import android.graphics.Paint; -import android.os.AsyncTask; -import android.text.Layout; -import android.text.StaticLayout; -import android.text.TextPaint; -import android.widget.ImageView; - -import java.lang.ref.WeakReference; - -public class GenerateCoverTask extends AsyncTask<Void, Void, Bitmap> { - private final Context mContext; - private final WeakReference<ImageView> mView; - private final String mTitle; - - public GenerateCoverTask(Context context, ImageView view, String title) { - mContext = context; - mView = new WeakReference<>(view); - mTitle = title; - } - - @Override - protected Bitmap doInBackground(Void... voids) { - try { - final Bitmap background = BitmapFactory.decodeResource(mContext.getResources(), R.drawable.cover_placeholder); - if (background == null) - return null; - - final Bitmap bitmap = Bitmap.createBitmap(background.getWidth(), background.getHeight(), background.getConfig()); - final Canvas canvas = new Canvas(bitmap); - final TextPaint paint = new TextPaint(Paint.ANTI_ALIAS_FLAG); - canvas.drawBitmap(background, 0.0f, 0.0f, paint); - - paint.setColor(Color.rgb(255, 255, 255)); - paint.setTextSize(100); - paint.setShadowLayer(1.0f, 0.0f, 1.0f, Color.DKGRAY); - paint.setTextAlign(Paint.Align.CENTER); - - final StaticLayout staticLayout = new StaticLayout(mTitle, paint, - canvas.getWidth(), Layout.Alignment.ALIGN_NORMAL, 1, 0, false); - canvas.save(); - canvas.translate(canvas.getWidth() / 2, (canvas.getHeight() / 2) - (staticLayout.getHeight() / 2)); - staticLayout.draw(canvas); - canvas.restore(); - return bitmap; - } catch (Exception e) { - e.printStackTrace(); - return null; - } - } - - @Override - protected void onPostExecute(Bitmap bitmap) { - ImageView iv = mView.get(); - if (iv != null) - iv.setImageBitmap(bitmap); - } -} diff --git a/android/app/src/main/java/com/github/stenzek/duckstation/GridAutofitLayoutManager.java b/android/app/src/main/java/com/github/stenzek/duckstation/GridAutofitLayoutManager.java deleted file mode 100644 index f7e3325c2..000000000 --- a/android/app/src/main/java/com/github/stenzek/duckstation/GridAutofitLayoutManager.java +++ /dev/null @@ -1,73 +0,0 @@ -package com.github.stenzek.duckstation; - -// https://stackoverflow.com/questions/26666143/recyclerview-gridlayoutmanager-how-to-auto-detect-span-count - -import android.content.Context; -import android.util.TypedValue; - -import androidx.annotation.NonNull; -import androidx.recyclerview.widget.GridLayoutManager; -import androidx.recyclerview.widget.RecyclerView; - -public class GridAutofitLayoutManager extends GridLayoutManager -{ - private int columnWidth; - private boolean isColumnWidthChanged = true; - private int lastWidth; - private int lastHeight; - - public GridAutofitLayoutManager(@NonNull final Context context, final int columnWidth) { - /* Initially set spanCount to 1, will be changed automatically later. */ - super(context, 1); - setColumnWidth(checkedColumnWidth(context, columnWidth)); - } - - public GridAutofitLayoutManager( - @NonNull final Context context, - final int columnWidth, - final int orientation, - final boolean reverseLayout) { - - /* Initially set spanCount to 1, will be changed automatically later. */ - super(context, 1, orientation, reverseLayout); - setColumnWidth(checkedColumnWidth(context, columnWidth)); - } - - private int checkedColumnWidth(@NonNull final Context context, int columnWidth) { - if (columnWidth <= 0) { - /* Set default columnWidth value (48dp here). It is better to move this constant - to static constant on top, but we need context to convert it to dp, so can't really - do so. */ - columnWidth = (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 48, - context.getResources().getDisplayMetrics()); - } - return columnWidth; - } - - public void setColumnWidth(final int newColumnWidth) { - if (newColumnWidth > 0 && newColumnWidth != columnWidth) { - columnWidth = newColumnWidth; - isColumnWidthChanged = true; - } - } - - @Override - public void onLayoutChildren(@NonNull final RecyclerView.Recycler recycler, @NonNull final RecyclerView.State state) { - final int width = getWidth(); - final int height = getHeight(); - if (columnWidth > 0 && width > 0 && height > 0 && (isColumnWidthChanged || lastWidth != width || lastHeight != height)) { - final int totalSpace; - if (getOrientation() == VERTICAL) { - totalSpace = width - getPaddingRight() - getPaddingLeft(); - } else { - totalSpace = height - getPaddingTop() - getPaddingBottom(); - } - final int spanCount = Math.max(1, totalSpace / columnWidth); - setSpanCount(spanCount); - isColumnWidthChanged = false; - } - lastWidth = width; - lastHeight = height; - super.onLayoutChildren(recycler, state); - } -} \ No newline at end of file diff --git a/android/app/src/main/java/com/github/stenzek/duckstation/HotkeyInfo.java b/android/app/src/main/java/com/github/stenzek/duckstation/HotkeyInfo.java deleted file mode 100644 index f16ce9f15..000000000 --- a/android/app/src/main/java/com/github/stenzek/duckstation/HotkeyInfo.java +++ /dev/null @@ -1,29 +0,0 @@ -package com.github.stenzek.duckstation; - -public class HotkeyInfo { - private String mCategory; - private String mName; - private String mDisplayName; - - public HotkeyInfo(String category, String name, String displayName) { - mCategory = category; - mName = name; - mDisplayName = displayName; - } - - public String getCategory() { - return mCategory; - } - - public String getName() { - return mName; - } - - public String getDisplayName() { - return mDisplayName; - } - - public String getBindingConfigKey() { - return String.format("Hotkeys/%s", mName); - } -} diff --git a/android/app/src/main/java/com/github/stenzek/duckstation/ImageLoadTask.java b/android/app/src/main/java/com/github/stenzek/duckstation/ImageLoadTask.java deleted file mode 100644 index 447a4c87c..000000000 --- a/android/app/src/main/java/com/github/stenzek/duckstation/ImageLoadTask.java +++ /dev/null @@ -1,32 +0,0 @@ -package com.github.stenzek.duckstation; - -import android.graphics.Bitmap; -import android.graphics.BitmapFactory; -import android.os.AsyncTask; -import android.widget.ImageView; - -import java.lang.ref.WeakReference; - -public class ImageLoadTask extends AsyncTask<String, Void, Bitmap> { - private WeakReference<ImageView> mView; - - public ImageLoadTask(ImageView view) { - mView = new WeakReference<>(view); - } - - @Override - protected Bitmap doInBackground(String... strings) { - try { - return BitmapFactory.decodeFile(strings[0]); - } catch (Exception e) { - return null; - } - } - - @Override - protected void onPostExecute(Bitmap bitmap) { - ImageView iv = mView.get(); - if (iv != null) - iv.setImageBitmap(bitmap); - } -} diff --git a/android/app/src/main/java/com/github/stenzek/duckstation/MainActivity.java b/android/app/src/main/java/com/github/stenzek/duckstation/MainActivity.java deleted file mode 100644 index c849fa1d7..000000000 --- a/android/app/src/main/java/com/github/stenzek/duckstation/MainActivity.java +++ /dev/null @@ -1,556 +0,0 @@ -package com.github.stenzek.duckstation; - -import android.Manifest; -import android.content.ClipData; -import android.content.ClipboardManager; -import android.content.Intent; -import android.content.SharedPreferences; -import android.content.pm.PackageManager; -import android.content.res.Configuration; -import android.content.res.Resources; -import android.graphics.Bitmap; -import android.net.Uri; -import android.os.Build; -import android.os.Bundle; -import android.util.Log; -import android.view.Gravity; -import android.view.Menu; -import android.view.MenuItem; -import android.view.View; -import android.widget.ListView; -import android.widget.Toast; - -import androidx.annotation.NonNull; -import androidx.appcompat.app.AlertDialog; -import androidx.appcompat.app.AppCompatActivity; -import androidx.appcompat.app.AppCompatDelegate; -import androidx.appcompat.widget.Toolbar; -import androidx.core.app.ActivityCompat; -import androidx.core.content.ContextCompat; -import androidx.fragment.app.Fragment; -import androidx.preference.PreferenceManager; - -import java.io.ByteArrayOutputStream; -import java.io.File; -import java.io.FileNotFoundException; -import java.io.FileOutputStream; -import java.io.IOException; -import java.io.InputStream; -import java.io.OutputStream; -import java.util.Locale; - -public class MainActivity extends AppCompatActivity { - private static final int REQUEST_EXTERNAL_STORAGE_PERMISSIONS = 1; - private static final int REQUEST_ADD_DIRECTORY_TO_GAME_LIST = 2; - private static final int REQUEST_IMPORT_BIOS_IMAGE = 3; - private static final int REQUEST_START_FILE = 4; - private static final int REQUEST_SETTINGS = 5; - private static final int REQUEST_EDIT_GAME_DIRECTORIES = 6; - private static final int REQUEST_CHOOSE_COVER_IMAGE = 7; - - private GameList mGameList; - private ListView mGameListView; - private GameListFragment mGameListFragment; - private GameGridFragment mGameGridFragment; - private Fragment mEmptyGameListFragment; - private boolean mHasExternalStoragePermissions = false; - private boolean mIsShowingGameGrid = false; - private String mPathForChosenCoverImage = null; - - public GameList getGameList() { - return mGameList; - } - - public boolean shouldResumeStateByDefault() { - SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(this); - if (!prefs.getBoolean("Main/SaveStateOnExit", true)) - return false; - - // don't resume with challenge mode on - if (Achievement.willChallengeModeBeEnabled(this)) - return false; - - return true; - } - - private void setLanguage() { - String language = PreferenceManager.getDefaultSharedPreferences(this).getString("Main/Language", "none"); - if (language == null || language.equals("none")) { - return; - } - - String[] parts = language.split("-"); - if (parts.length < 2) - return; - - Locale locale = new Locale(parts[0], parts[1]); - Locale.setDefault(locale); - - Resources res = getResources(); - Configuration config = res.getConfiguration(); - config.setLocale(locale); - res.updateConfiguration(config, res.getDisplayMetrics()); - } - - private void setTheme() { - String theme = PreferenceManager.getDefaultSharedPreferences(this).getString("Main/Theme", "follow_system"); - if (theme == null) - return; - - if (theme.equals("follow_system")) { - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) - AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_FOLLOW_SYSTEM); - } else if (theme.equals("light")) { - AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_NO); - } else if (theme.equals("dark")) { - AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_YES); - } - } - - private void loadSettings() { - setLanguage(); - setTheme(); - - mIsShowingGameGrid = PreferenceManager.getDefaultSharedPreferences(this).getBoolean("Main/GameGridView", false); - } - - private void switchGameListView() { - mIsShowingGameGrid = !mIsShowingGameGrid; - PreferenceManager.getDefaultSharedPreferences(this) - .edit() - .putBoolean("Main/GameGridView", mIsShowingGameGrid) - .commit(); - - updateGameListFragment(true); - invalidateOptionsMenu(); - } - - private void updateGameListFragment(boolean allowEmpty) { - final Fragment listFragment = (allowEmpty && mGameList.getEntryCount() == 0) ? - mEmptyGameListFragment : - (mIsShowingGameGrid ? mGameGridFragment : mGameListFragment); - - getSupportFragmentManager() - .beginTransaction() - .setReorderingAllowed(true). - replace(R.id.content_fragment, listFragment) - .commitAllowingStateLoss(); - } - - @Override - protected void onCreate(Bundle savedInstanceState) { - loadSettings(); - setTitle(null); - - super.onCreate(null); - - setContentView(R.layout.activity_main); - Toolbar toolbar = findViewById(R.id.toolbar); - setSupportActionBar(toolbar); - - findViewById(R.id.fab_resume).setOnClickListener(new View.OnClickListener() { - @Override - public void onClick(View view) { - startEmulation(null, shouldResumeStateByDefault()); - } - }); - - // Set up game list view. - mGameList = new GameList(this); - mGameList.addRefreshListener(() -> updateGameListFragment(true)); - mGameListFragment = new GameListFragment(this); - mGameGridFragment = new GameGridFragment(this); - mEmptyGameListFragment = new EmptyGameListFragment(this); - updateGameListFragment(false); - - mHasExternalStoragePermissions = checkForExternalStoragePermissions(); - if (mHasExternalStoragePermissions) - completeStartup(); - } - - private void completeStartup() { - if (!AndroidHostInterface.hasInstance() && !AndroidHostInterface.createInstance(this)) { - Log.i("MainActivity", "Failed to create host interface"); - throw new RuntimeException("Failed to create host interface"); - } - - AndroidHostInterface.getInstance().setContext(this); - mGameList.refresh(false, false, this); - UpdateNotes.displayUpdateNotes(this); - } - - public void startAddGameDirectory() { - if (!checkForExternalStoragePermissions()) - return; - - Intent i = new Intent(Intent.ACTION_OPEN_DOCUMENT_TREE); - i.addCategory(Intent.CATEGORY_DEFAULT); - i.putExtra(Intent.EXTRA_LOCAL_ONLY, true); - i.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION); - i.addFlags(Intent.FLAG_GRANT_PERSISTABLE_URI_PERMISSION); - startActivityForResult(Intent.createChooser(i, getString(R.string.main_activity_choose_directory)), - REQUEST_ADD_DIRECTORY_TO_GAME_LIST); - } - - @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_main, menu); - - final MenuItem switchViewItem = menu.findItem(R.id.action_switch_view); - if (switchViewItem != null) { - switchViewItem.setTitle(mIsShowingGameGrid ? R.string.action_show_game_list : R.string.action_show_game_grid); - switchViewItem.setIcon(mIsShowingGameGrid ? R.drawable.ic_baseline_view_list_24 : R.drawable.ic_baseline_grid_view_24); - } - - return true; - } - - @Override - public boolean onOptionsItemSelected(MenuItem item) { - // Handle action bar item clicks here. The action bar will - // automatically handle clicks on the Home/Up button, so long - // as you specify a parent activity in AndroidManifest.xml. - int id = item.getItemId(); - - //noinspection SimplifiableIfStatement - if (id == R.id.action_start_bios) { - startEmulation(null, false); - } else if (id == R.id.action_start_file) { - startStartFile(); - } else if (id == R.id.action_edit_game_directories) { - Intent intent = new Intent(this, GameDirectoriesActivity.class); - startActivityForResult(intent, REQUEST_EDIT_GAME_DIRECTORIES); - return true; - } else if (id == R.id.action_scan_for_new_games) { - mGameList.refresh(false, false, this); - } else if (id == R.id.action_rescan_all_games) { - mGameList.refresh(true, true, this); - } else if (id == R.id.action_import_bios) { - importBIOSImage(); - } else if (id == R.id.action_settings) { - Intent intent = new Intent(this, SettingsActivity.class); - startActivityForResult(intent, REQUEST_SETTINGS); - return true; - } else if (id == R.id.action_controller_settings) { - Intent intent = new Intent(this, ControllerSettingsActivity.class); - startActivity(intent); - return true; - } else if (id == R.id.action_memory_card_editor) { - Intent intent = new Intent(this, MemoryCardEditorActivity.class); - startActivity(intent); - return true; - } else if (id == R.id.action_switch_view) { - switchGameListView(); - return true; - } else if (id == R.id.action_show_version) { - showVersion(); - return true; - } else if (id == R.id.action_github_respository) { - openGithubRepository(); - return true; - } else if (id == R.id.action_discord_server) { - openDiscordServer(); - return true; - } - - return super.onOptionsItemSelected(item); - } - - @Override - public void onActivityResult(int requestCode, int resultCode, Intent data) { - super.onActivityResult(requestCode, resultCode, data); - - switch (requestCode) { - case REQUEST_ADD_DIRECTORY_TO_GAME_LIST: { - if (resultCode != RESULT_OK || data.getData() == null) - return; - - // Use legacy storage on devices older than Android 11... apparently some of them - // have broken storage access framework.... - if (!GameDirectoriesActivity.useStorageAccessFramework(this)) { - final String path = FileHelper.getFullPathFromTreeUri(data.getData(), this); - if (path != null) { - GameDirectoriesActivity.addSearchDirectory(this, path, true); - mGameList.refresh(false, false, this); - return; - } - } - - try { - getContentResolver().takePersistableUriPermission(data.getData(), - Intent.FLAG_GRANT_READ_URI_PERMISSION); - } catch (Exception e) { - Toast.makeText(this, "Failed to take persistable permission.", Toast.LENGTH_LONG); - e.printStackTrace(); - } - - GameDirectoriesActivity.addSearchDirectory(this, data.getDataString(), true); - mGameList.refresh(false, false, this); - } - break; - - case REQUEST_IMPORT_BIOS_IMAGE: { - if (resultCode != RESULT_OK) - return; - - onImportBIOSImageResult(data.getData()); - } - break; - - case REQUEST_START_FILE: { - if (resultCode != RESULT_OK || data.getData() == null) - return; - - startEmulation(data.getDataString(), shouldResumeStateByDefault()); - } - break; - - case REQUEST_SETTINGS: { - loadSettings(); - } - break; - - case REQUEST_EDIT_GAME_DIRECTORIES: { - mGameList.refresh(false, false, this); - } - break; - - case REQUEST_CHOOSE_COVER_IMAGE: { - final String gamePath = mPathForChosenCoverImage; - mPathForChosenCoverImage = null; - if (resultCode != RESULT_OK) - return; - - finishChooseCoverImage(gamePath, data.getData()); - } - break; - } - } - - private boolean checkForExternalStoragePermissions() { - if (ContextCompat.checkSelfPermission(this, Manifest.permission.READ_EXTERNAL_STORAGE) == - PackageManager.PERMISSION_GRANTED && - ContextCompat - .checkSelfPermission(this, Manifest.permission.WRITE_EXTERNAL_STORAGE) == - PackageManager.PERMISSION_GRANTED) { - return true; - } - - ActivityCompat.requestPermissions(this, - new String[]{Manifest.permission.READ_EXTERNAL_STORAGE, - Manifest.permission.WRITE_EXTERNAL_STORAGE}, - REQUEST_EXTERNAL_STORAGE_PERMISSIONS); - return false; - } - - public void onRequestPermissionsResult(int requestCode, String[] permissions, - int[] grantResults) { - // check that all were successful - for (int i = 0; i < grantResults.length; i++) { - if (grantResults[i] == PackageManager.PERMISSION_GRANTED) { - if (!mHasExternalStoragePermissions) { - mHasExternalStoragePermissions = true; - completeStartup(); - } - } else { - Toast.makeText(this, - R.string.main_activity_external_storage_permissions_error, - Toast.LENGTH_LONG); - finish(); - } - } - } - - public boolean openGameProperties(String path) { - Intent intent = new Intent(this, GamePropertiesActivity.class); - intent.putExtra("path", path); - startActivity(intent); - return true; - } - - public void openGamePopupMenu(View anchorToView, GameListEntry entry) { - androidx.appcompat.widget.PopupMenu menu = new androidx.appcompat.widget.PopupMenu(this, anchorToView, Gravity.RIGHT | Gravity.TOP); - menu.getMenuInflater().inflate(R.menu.menu_game_list_entry, menu.getMenu()); - menu.setOnMenuItemClickListener(item -> { - int id = item.getItemId(); - if (id == R.id.game_list_entry_menu_start_game) { - startEmulation(entry.getPath(), false); - return true; - } else if (id == R.id.game_list_entry_menu_resume_game) { - startEmulation(entry.getPath(), true); - return true; - } else if (id == R.id.game_list_entry_menu_properties) { - openGameProperties(entry.getPath()); - return true; - } else if (id == R.id.game_list_entry_menu_choose_cover_image) { - startChooseCoverImage(entry.getPath()); - return true; - } - return false; - }); - - // disable resume state when challenge mode is on - if (Achievement.willChallengeModeBeEnabled(this)) { - MenuItem item = menu.getMenu().findItem(R.id.game_list_entry_menu_resume_game); - if (item != null) - item.setEnabled(false); - } - - menu.show(); - } - - public boolean startEmulation(String bootPath, boolean resumeState) { - if (!doBIOSCheck()) - return false; - - Intent intent = new Intent(this, EmulationActivity.class); - intent.putExtra("bootPath", bootPath); - intent.putExtra("resumeState", resumeState); - startActivity(intent); - return true; - } - - public void startStartFile() { - Intent intent = new Intent(Intent.ACTION_GET_CONTENT); - intent.setType("*/*"); - intent.addCategory(Intent.CATEGORY_OPENABLE); - startActivityForResult(Intent.createChooser(intent, getString(R.string.main_activity_choose_disc_image)), REQUEST_START_FILE); - } - - private void startChooseCoverImage(String gamePath) { - Intent intent = new Intent(Intent.ACTION_GET_CONTENT); - intent.setType("image/*"); - intent.addCategory(Intent.CATEGORY_OPENABLE); - mPathForChosenCoverImage = gamePath; - startActivityForResult(Intent.createChooser(intent, getString(R.string.menu_game_list_entry_choose_cover_image)), - REQUEST_CHOOSE_COVER_IMAGE); - } - - private void finishChooseCoverImage(String gamePath, Uri uri) { - final GameListEntry gameListEntry = mGameList.getEntryForPath(gamePath); - if (gameListEntry == null) - return; - - final Bitmap bitmap = FileHelper.loadBitmapFromUri(this, uri); - if (bitmap == null) { - Toast.makeText(this, "Failed to open/decode image.", Toast.LENGTH_LONG).show(); - return; - } - - final String coverFileName = String.format("%s/covers/%s.png", - AndroidHostInterface.getUserDirectory(), gameListEntry.getTitle()); - try { - final File file = new File(coverFileName); - final OutputStream outputStream = new FileOutputStream(file); - final boolean result = bitmap.compress(Bitmap.CompressFormat.PNG, 100, outputStream); - outputStream.close();; - if (!result) { - file.delete(); - throw new Exception("Failed to compress bitmap."); - } - - gameListEntry.setCoverPath(coverFileName); - mGameList.fireRefreshListeners(); - } catch (Exception e) { - e.printStackTrace(); - Toast.makeText(this, "Failed to save image.", Toast.LENGTH_LONG).show(); - } - - bitmap.recycle(); - } - - private boolean doBIOSCheck() { - if (AndroidHostInterface.getInstance().hasAnyBIOSImages()) - return true; - - new AlertDialog.Builder(this) - .setTitle(R.string.main_activity_missing_bios_image) - .setMessage(R.string.main_activity_missing_bios_image_prompt) - .setPositiveButton(R.string.main_activity_yes, (dialog, button) -> importBIOSImage()) - .setNegativeButton(R.string.main_activity_no, (dialog, button) -> { - }) - .create() - .show(); - - return false; - } - - private void importBIOSImage() { - Intent intent = new Intent(Intent.ACTION_GET_CONTENT); - intent.setType("*/*"); - intent.addCategory(Intent.CATEGORY_OPENABLE); - startActivityForResult(Intent.createChooser(intent, getString(R.string.main_activity_choose_bios_image)), REQUEST_IMPORT_BIOS_IMAGE); - } - - private void onImportBIOSImageResult(Uri uri) { - // This should really be 512K but just in case we wanted to support the other BIOSes in the future... - final int MAX_BIOS_SIZE = 2 * 1024 * 1024; - - InputStream stream = null; - try { - stream = getContentResolver().openInputStream(uri); - } catch (FileNotFoundException e) { - Toast.makeText(this, R.string.main_activity_failed_to_open_bios_image, Toast.LENGTH_LONG); - return; - } - - ByteArrayOutputStream os = new ByteArrayOutputStream(); - try { - byte[] buffer = new byte[512 * 1024]; - int len; - while ((len = stream.read(buffer)) > 0) { - os.write(buffer, 0, len); - if (os.size() > MAX_BIOS_SIZE) { - throw new IOException(getString(R.string.main_activity_bios_image_too_large)); - } - } - } catch (IOException e) { - new AlertDialog.Builder(this) - .setMessage(getString(R.string.main_activity_failed_to_read_bios_image_prefix) + e.getMessage()) - .setPositiveButton(R.string.main_activity_ok, (dialog, button) -> { - }) - .create() - .show(); - return; - } - - String importResult = AndroidHostInterface.getInstance().importBIOSImage(os.toByteArray()); - String message = (importResult == null) ? getString(R.string.main_activity_invalid_error) : ("BIOS '" + importResult + "' imported."); - - new AlertDialog.Builder(this) - .setMessage(message) - .setPositiveButton(R.string.main_activity_ok, (dialog, button) -> { - }) - .create() - .show(); - } - - private void showVersion() { - final String message = AndroidHostInterface.getFullScmVersion(); - new AlertDialog.Builder(this) - .setTitle(R.string.main_activity_show_version_title) - .setMessage(message) - .setPositiveButton(R.string.main_activity_ok, (dialog, button) -> { - }) - .setNeutralButton(R.string.main_activity_copy, (dialog, button) -> { - ClipboardManager clipboard = (ClipboardManager) getSystemService(CLIPBOARD_SERVICE); - if (clipboard != null) - clipboard.setPrimaryClip(ClipData.newPlainText(getString(R.string.main_activity_show_version_title), message)); - }) - .create() - .show(); - } - - private void openGithubRepository() { - final String url = "https://github.com/stenzek/duckstation"; - final Intent browserIntent = new Intent(Intent.ACTION_VIEW, Uri.parse(url)); - startActivity(browserIntent); - } - - private void openDiscordServer() { - final String url = "https://discord.gg/Buktv3t"; - final Intent browserIntent = new Intent(Intent.ACTION_VIEW, Uri.parse(url)); - startActivity(browserIntent); - } -} diff --git a/android/app/src/main/java/com/github/stenzek/duckstation/MemoryCardEditorActivity.java b/android/app/src/main/java/com/github/stenzek/duckstation/MemoryCardEditorActivity.java deleted file mode 100644 index dfe1323b3..000000000 --- a/android/app/src/main/java/com/github/stenzek/duckstation/MemoryCardEditorActivity.java +++ /dev/null @@ -1,524 +0,0 @@ -package com.github.stenzek.duckstation; - -import android.app.AlertDialog; -import android.content.Intent; -import android.graphics.Bitmap; -import android.net.Uri; -import android.os.Bundle; - -import com.google.android.material.tabs.TabLayout; -import com.google.android.material.tabs.TabLayoutMediator; - -import androidx.annotation.NonNull; -import androidx.annotation.Nullable; -import androidx.appcompat.app.ActionBar; -import androidx.appcompat.widget.Toolbar; -import androidx.fragment.app.Fragment; -import androidx.recyclerview.widget.DividerItemDecoration; -import androidx.recyclerview.widget.LinearLayoutManager; -import androidx.recyclerview.widget.RecyclerView; -import androidx.appcompat.app.AppCompatActivity; -import androidx.viewpager2.adapter.FragmentStateAdapter; -import androidx.viewpager2.widget.ViewPager2; - -import android.view.LayoutInflater; -import android.view.Menu; -import android.view.MenuItem; -import android.view.View; -import android.view.ViewGroup; -import android.widget.ImageView; -import android.widget.TextView; -import android.widget.Toast; - -import java.util.ArrayList; - -public class MemoryCardEditorActivity extends AppCompatActivity { - public static final int REQUEST_IMPORT_CARD = 1; - - private final ArrayList<MemoryCardImage> cards = new ArrayList<>(); - private CollectionAdapter adapter; - private ViewPager2 viewPager; - private TabLayout tabLayout; - private TabLayoutMediator tabLayoutMediator; - - @Override - protected void onCreate(Bundle savedInstanceState) { - super.onCreate(null); - setContentView(R.layout.activity_memory_card_editor); - - Toolbar toolbar = findViewById(R.id.toolbar); - setSupportActionBar(toolbar); - - ActionBar actionBar = getSupportActionBar(); - if (actionBar != null) { - actionBar.setDisplayHomeAsUpEnabled(true); - } - - adapter = new CollectionAdapter(this); - viewPager = findViewById(R.id.view_pager); - viewPager.setAdapter(adapter); - - tabLayout = findViewById(R.id.tab_layout); - tabLayoutMediator = new TabLayoutMediator(tabLayout, viewPager, adapter.getTabConfigurationStrategy()); - tabLayoutMediator.attach(); - - findViewById(R.id.open_card).setOnClickListener((v) -> openCard()); - findViewById(R.id.close_card).setOnClickListener((v) -> closeCard()); - } - - @Override - public boolean onCreateOptionsMenu(Menu menu) { - getMenuInflater().inflate(R.menu.menu_memory_card_editor, menu); - - final boolean hasCurrentCard = (getCurrentCard() != null); - menu.findItem(R.id.action_delete_card).setEnabled(hasCurrentCard); - menu.findItem(R.id.action_format_card).setEnabled(hasCurrentCard); - menu.findItem(R.id.action_import_card).setEnabled(hasCurrentCard); - - return true; - } - - @Override - public boolean onOptionsItemSelected(MenuItem item) { - switch (item.getItemId()) { - case android.R.id.home: { - onBackPressed(); - return true; - } - - case R.id.action_import_card: { - importCard(); - return true; - } - - case R.id.action_delete_card: { - deleteCard(); - return true; - } - - case R.id.action_format_card: { - formatCard(); - return true; - } - - default: { - return super.onOptionsItemSelected(item); - } - } - } - - private void openCard() { - final Uri[] uris = MemoryCardImage.getCardUris(this); - if (uris == null) { - displayMessage(getString(R.string.memory_card_editor_no_cards_found)); - return; - } - - final String[] uriTitles = new String[uris.length]; - for (int i = 0; i < uris.length; i++) - uriTitles[i] = MemoryCardImage.getTitleForUri(uris[i]); - - final AlertDialog.Builder builder = new AlertDialog.Builder(this); - builder.setTitle(R.string.memory_card_editor_select_card); - builder.setItems(uriTitles, (dialog, which) -> { - final Uri uri = uris[which]; - for (int i = 0; i < cards.size(); i++) { - if (cards.get(i).getUri().equals(uri)) { - displayError(getString(R.string.memory_card_editor_card_already_open)); - tabLayout.getTabAt(i).select(); - return; - } - } - - final MemoryCardImage card = MemoryCardImage.open(MemoryCardEditorActivity.this, uri); - if (card == null) { - displayError(getString(R.string.memory_card_editor_failed_to_open_card)); - return; - } - - cards.add(card); - refreshView(card); - }); - builder.create().show(); - } - - private void closeCard() { - final int index = tabLayout.getSelectedTabPosition(); - if (index < 0) - return; - - cards.remove(index); - refreshView(index); - } - - private void displayMessage(String message) { - Toast.makeText(this, message, Toast.LENGTH_LONG).show(); - } - - private void displayError(String message) { - final AlertDialog.Builder errorBuilder = new AlertDialog.Builder(this); - errorBuilder.setTitle(R.string.memory_card_editor_error); - errorBuilder.setMessage(message); - errorBuilder.setPositiveButton(R.string.main_activity_ok, (dialog1, which1) -> dialog1.dismiss()); - errorBuilder.create().show(); - } - - private void copySave(MemoryCardImage sourceCard, MemoryCardFileInfo sourceFile) { - if (cards.size() < 2) { - displayError(getString(R.string.memory_card_editor_must_have_at_least_two_cards_to_copy)); - return; - } - - if (cards.indexOf(sourceCard) < 0) { - // this shouldn't happen.. - return; - } - - final MemoryCardImage[] destinationCards = new MemoryCardImage[cards.size() - 1]; - final String[] cardTitles = new String[cards.size() - 1]; - for (int i = 0, d = 0; i < cards.size(); i++) { - if (cards.get(i) == sourceCard) - continue; - - destinationCards[d] = cards.get(i); - cardTitles[d] = cards.get(i).getTitle(); - d++; - } - - final AlertDialog.Builder builder = new AlertDialog.Builder(this); - builder.setTitle(getString(R.string.memory_card_editor_copy_save_to, sourceFile.getTitle())); - builder.setItems(cardTitles, (dialog, which) -> { - dialog.dismiss(); - - final MemoryCardImage destinationCard = destinationCards[which]; - - byte[] data = null; - if (destinationCard.getFreeBlocks() < sourceFile.getNumBlocks()) { - displayError(getString(R.string.memory_card_editor_copy_insufficient_blocks, sourceFile.getNumBlocks(), - destinationCard.getFreeBlocks())); - } else if (destinationCard.hasFile(sourceFile.getFilename())) { - displayError(getString(R.string.memory_card_editor_copy_already_exists, sourceFile.getFilename())); - } else if ((data = sourceCard.readFile(sourceFile.getFilename())) == null) { - displayError(getString(R.string.memory_card_editor_copy_read_failed, sourceFile.getFilename())); - } else if (!destinationCard.writeFile(sourceFile.getFilename(), data)) { - displayMessage(getString(R.string.memory_card_editor_copy_write_failed, sourceFile.getFilename())); - } else { - displayMessage(getString(R.string.memory_card_editor_copy_success, sourceFile.getFilename(), - destinationCard.getTitle())); - refreshView(destinationCard); - } - }); - builder.create().show(); - } - - private void deleteSave(MemoryCardImage card, MemoryCardFileInfo file) { - final AlertDialog.Builder builder = new AlertDialog.Builder(this); - builder.setMessage(getString(R.string.memory_card_editor_delete_confirm, file.getFilename())); - builder.setPositiveButton(R.string.main_activity_yes, (dialog, which) -> { - if (card.deleteFile(file.getFilename())) { - displayMessage(getString(R.string.memory_card_editor_delete_success, file.getFilename())); - refreshView(card); - } else { - displayError(getString(R.string.memory_card_editor_delete_failed, file.getFilename())); - } - }); - builder.setNegativeButton(R.string.main_activity_no, (dialog, which) -> dialog.dismiss()); - builder.create().show(); - } - - private void refreshView(int newSelection) { - final int oldPos = viewPager.getCurrentItem(); - tabLayoutMediator.detach(); - viewPager.setAdapter(null); - viewPager.setAdapter(adapter); - tabLayoutMediator.attach(); - - if (cards.isEmpty()) - return; - - if (newSelection < 0 || newSelection >= tabLayout.getTabCount()) { - if (oldPos < cards.size()) - tabLayout.getTabAt(oldPos).select(); - else - tabLayout.getTabAt(cards.size() - 1).select(); - } else { - tabLayout.getTabAt(newSelection).select(); - } - } - - private void refreshView(MemoryCardImage newSelectedCard) { - if (newSelectedCard == null) - refreshView(-1); - else - refreshView(cards.indexOf(newSelectedCard)); - - invalidateOptionsMenu(); - } - - private MemoryCardImage getCurrentCard() { - final int index = tabLayout.getSelectedTabPosition(); - if (index < 0 || index >= cards.size()) - return null; - - return cards.get(index); - } - - private void importCard() { - if (getCurrentCard() == null) { - displayMessage(getString(R.string.memory_card_editor_no_card_selected)); - return; - } - - Intent intent = new Intent(Intent.ACTION_GET_CONTENT); - intent.setType("*/*"); - intent.addCategory(Intent.CATEGORY_OPENABLE); - startActivityForResult(Intent.createChooser(intent, getString(R.string.main_activity_choose_disc_image)), REQUEST_IMPORT_CARD); - } - - private void importCard(Uri uri) { - final MemoryCardImage card = getCurrentCard(); - if (card == null) - return; - - final byte[] data = FileHelper.readBytesFromUri(this, uri, 16 * 1024 * 1024); - if (data == null) { - displayError(getString(R.string.memory_card_editor_import_card_read_failed, uri.toString())); - return; - } - - String importFileName = FileHelper.getDocumentNameFromUri(this, uri); - if (importFileName == null) { - importFileName = uri.getPath(); - if (importFileName == null || importFileName.isEmpty()) - importFileName = uri.toString(); - } - - final String captureImportFileName = importFileName; - final AlertDialog.Builder builder = new AlertDialog.Builder(this); - builder.setMessage(getString(R.string.memory_card_editor_import_card_confirm_message, - importFileName, card.getTitle())); - builder.setPositiveButton(R.string.main_activity_yes, (dialog, which) -> { - dialog.dismiss(); - - if (!card.importCard(captureImportFileName, data)) { - displayError(getString(R.string.memory_card_editor_import_failed)); - return; - } - - refreshView(card); - }); - builder.setNegativeButton(R.string.main_activity_no, (dialog, which) -> dialog.dismiss()); - builder.create().show(); - } - - private void formatCard() { - final MemoryCardImage card = getCurrentCard(); - if (card == null) { - displayMessage(getString(R.string.memory_card_editor_no_card_selected)); - return; - } - - final AlertDialog.Builder builder = new AlertDialog.Builder(this); - builder.setMessage(getString(R.string.memory_card_editor_format_card_confirm_message, card.getTitle())); - builder.setPositiveButton(R.string.main_activity_yes, (dialog, which) -> { - dialog.dismiss(); - - if (!card.format()) { - displayError(getString(R.string.memory_card_editor_format_card_failed, card.getUri().toString())); - return; - } - - displayMessage(getString(R.string.memory_card_editor_format_card_success, card.getUri().toString())); - refreshView(card); - }); - builder.setNegativeButton(R.string.main_activity_no, (dialog, which) -> dialog.dismiss()); - builder.create().show(); - } - - private void deleteCard() { - final MemoryCardImage card = getCurrentCard(); - if (card == null) { - displayMessage(getString(R.string.memory_card_editor_no_card_selected)); - return; - } - - final AlertDialog.Builder builder = new AlertDialog.Builder(this); - builder.setMessage(getString(R.string.memory_card_editor_delete_card_confirm_message, card.getTitle())); - builder.setPositiveButton(R.string.main_activity_yes, (dialog, which) -> { - dialog.dismiss(); - - if (!card.delete()) { - displayError(getString(R.string.memory_card_editor_delete_card_failed, card.getUri().toString())); - return; - } - - displayMessage(getString(R.string.memory_card_editor_delete_card_success, card.getUri().toString())); - cards.remove(card); - refreshView(-1); - }); - builder.setNegativeButton(R.string.main_activity_no, (dialog, which) -> dialog.dismiss()); - builder.create().show(); - } - - @Override - public void onActivityResult(int requestCode, int resultCode, Intent data) { - super.onActivityResult(requestCode, resultCode, data); - - switch (requestCode) { - case REQUEST_IMPORT_CARD: { - if (resultCode != RESULT_OK) - return; - - importCard(data.getData()); - } - break; - } - } - - private static class SaveViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener { - private MemoryCardEditorActivity mParent; - private View mItemView; - private MemoryCardImage mCard; - private MemoryCardFileInfo mFile; - - public SaveViewHolder(MemoryCardEditorActivity parent, @NonNull View itemView) { - super(itemView); - mParent = parent; - mItemView = itemView; - mItemView.setOnClickListener(this); - } - - public void bindToEntry(MemoryCardImage card, MemoryCardFileInfo file) { - mCard = card; - mFile = file; - - ((TextView) mItemView.findViewById(R.id.title)).setText(mFile.getTitle()); - ((TextView) mItemView.findViewById(R.id.filename)).setText(mFile.getFilename()); - - final String blocksText = String.format("%d Blocks", mFile.getNumBlocks()); - final String sizeText = String.format("%.1f KB", (float)mFile.getSize() / 1024.0f); - ((TextView) mItemView.findViewById(R.id.block_size)).setText(blocksText); - ((TextView) mItemView.findViewById(R.id.file_size)).setText(sizeText); - - if (mFile.getNumIconFrames() > 0) { - final Bitmap bitmap = mFile.getIconFrameBitmap(0); - if (bitmap != null) { - ((ImageView) mItemView.findViewById(R.id.icon)).setImageBitmap(bitmap); - } - } - } - - @Override - public void onClick(View v) { - final AlertDialog.Builder builder = new AlertDialog.Builder(mItemView.getContext()); - builder.setTitle(mFile.getFilename()); - builder.setItems(R.array.memory_card_editor_save_menu, ((dialog, which) -> { - switch (which) { - // Copy Save - case 0: { - dialog.dismiss(); - mParent.copySave(mCard, mFile); - } - break; - - // Delete Save - case 1: { - dialog.dismiss(); - mParent.deleteSave(mCard, mFile); - } - break; - } - })); - builder.create().show(); - } - } - - private static class SaveViewAdapter extends RecyclerView.Adapter<SaveViewHolder> { - private MemoryCardEditorActivity parent; - private MemoryCardImage card; - private MemoryCardFileInfo[] files; - - public SaveViewAdapter(MemoryCardEditorActivity parent, MemoryCardImage card) { - this.parent = parent; - this.card = card; - this.files = card.getFiles(); - } - - @NonNull - @Override - public SaveViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) { - final View rootView = LayoutInflater.from(parent.getContext()).inflate(R.layout.layout_memory_card_save, parent, false); - return new SaveViewHolder(this.parent, rootView); - } - - @Override - public void onBindViewHolder(@NonNull SaveViewHolder holder, int position) { - holder.bindToEntry(card, files[position]); - } - - @Override - public int getItemCount() { - return (files != null) ? files.length : 0; - } - - @Override - public int getItemViewType(int position) { - return R.layout.layout_memory_card_save; - } - } - - public static class MemoryCardFileFragment extends Fragment { - private MemoryCardEditorActivity parent; - private MemoryCardImage card; - private SaveViewAdapter adapter; - private RecyclerView recyclerView; - - public MemoryCardFileFragment(MemoryCardEditorActivity parent, MemoryCardImage card) { - this.parent = parent; - this.card = card; - } - - @Nullable - @Override - public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { - return inflater.inflate(R.layout.fragment_memory_card_file, container, false); - } - - @Override - public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) { - adapter = new SaveViewAdapter(parent, card); - recyclerView = view.findViewById(R.id.recyclerView); - recyclerView.setAdapter(adapter); - recyclerView.setLayoutManager(new LinearLayoutManager(recyclerView.getContext())); - recyclerView.addItemDecoration(new DividerItemDecoration(recyclerView.getContext(), - DividerItemDecoration.VERTICAL)); - } - } - - public static class CollectionAdapter extends FragmentStateAdapter { - private MemoryCardEditorActivity parent; - private final TabLayoutMediator.TabConfigurationStrategy tabConfigurationStrategy = (tab, position) -> { - tab.setText(parent.cards.get(position).getTitle()); - }; - - public CollectionAdapter(MemoryCardEditorActivity parent) { - super(parent); - this.parent = parent; - } - - public TabLayoutMediator.TabConfigurationStrategy getTabConfigurationStrategy() { - return tabConfigurationStrategy; - } - - @NonNull - @Override - public Fragment createFragment(int position) { - return new MemoryCardFileFragment(parent, parent.cards.get(position)); - } - - @Override - public int getItemCount() { - return parent.cards.size(); - } - } -} \ No newline at end of file diff --git a/android/app/src/main/java/com/github/stenzek/duckstation/MemoryCardFileInfo.java b/android/app/src/main/java/com/github/stenzek/duckstation/MemoryCardFileInfo.java deleted file mode 100644 index e520c2db5..000000000 --- a/android/app/src/main/java/com/github/stenzek/duckstation/MemoryCardFileInfo.java +++ /dev/null @@ -1,64 +0,0 @@ -package com.github.stenzek.duckstation; - -import android.graphics.Bitmap; - -import java.nio.ByteBuffer; - -public class MemoryCardFileInfo { - public static final int ICON_WIDTH = 16; - public static final int ICON_HEIGHT = 16; - - private final String filename; - private final String title; - private final int size; - private final int firstBlock; - private final int numBlocks; - private final byte[][] iconFrames; - - public MemoryCardFileInfo(String filename, String title, int size, int firstBlock, int numBlocks, byte[][] iconFrames) { - this.filename = filename; - this.title = title; - this.size = size; - this.firstBlock = firstBlock; - this.numBlocks = numBlocks; - this.iconFrames = iconFrames; - } - - public String getFilename() { - return filename; - } - - public String getTitle() { - return title; - } - - public int getSize() { - return size; - } - - public int getFirstBlock() { - return firstBlock; - } - - public int getNumBlocks() { - return numBlocks; - } - - public int getNumIconFrames() { - return (iconFrames != null) ? iconFrames.length : 0; - } - - public byte[] getIconFrame(int index) { - return iconFrames[index]; - } - - public Bitmap getIconFrameBitmap(int index) { - final byte[] data = getIconFrame(index); - if (data == null) - return null; - - final Bitmap bitmap = Bitmap.createBitmap(ICON_WIDTH, ICON_HEIGHT, Bitmap.Config.ARGB_8888); - bitmap.copyPixelsFromBuffer(ByteBuffer.wrap(data)); - return bitmap; - } -} diff --git a/android/app/src/main/java/com/github/stenzek/duckstation/MemoryCardImage.java b/android/app/src/main/java/com/github/stenzek/duckstation/MemoryCardImage.java deleted file mode 100644 index 5417ecc3d..000000000 --- a/android/app/src/main/java/com/github/stenzek/duckstation/MemoryCardImage.java +++ /dev/null @@ -1,204 +0,0 @@ -package com.github.stenzek.duckstation; - -import android.content.ContentResolver; -import android.content.Context; -import android.database.Cursor; -import android.net.Uri; -import android.provider.DocumentsContract; - -import java.io.File; -import java.util.ArrayList; -import java.util.Collections; - -public class MemoryCardImage { - public static final int DATA_SIZE = 128 * 1024; - public static final String FILE_EXTENSION = ".mcd"; - - private final Context context; - private final Uri uri; - private final byte[] data; - - private MemoryCardImage(Context context, Uri uri, byte[] data) { - this.context = context; - this.uri = uri; - this.data = data; - } - - public static String getTitleForUri(Uri uri) { - String name = uri.getLastPathSegment(); - if (name != null) { - final int lastSlash = name.lastIndexOf('/'); - if (lastSlash >= 0) - name = name.substring(lastSlash + 1); - - if (name.endsWith(FILE_EXTENSION)) - name = name.substring(0, name.length() - FILE_EXTENSION.length()); - } else { - name = uri.toString(); - } - - return name; - } - - public static MemoryCardImage open(Context context, Uri uri) { - byte[] data = FileHelper.readBytesFromUri(context, uri, DATA_SIZE); - if (data == null) - return null; - - if (!isValid(data)) - return null; - - return new MemoryCardImage(context, uri, data); - } - - public static MemoryCardImage create(Context context, Uri uri) { - byte[] data = new byte[DATA_SIZE]; - format(data); - - MemoryCardImage card = new MemoryCardImage(context, uri, data); - if (!card.save()) - return null; - - return card; - } - - public static Uri[] getCardUris(Context context) { - final String directory = String.format("%s/memcards", - AndroidHostInterface.getUserDirectory()); - final ArrayList<Uri> results = new ArrayList<>(); - - if (directory.charAt(0) == '/') { - // native path - final File directoryFile = new File(directory); - final File[] files = directoryFile.listFiles(); - for (File file : files) { - if (!file.isFile()) - continue; - - if (!file.getName().endsWith(FILE_EXTENSION)) - continue; - - results.add(Uri.fromFile(file)); - } - } else { - try { - final Uri baseUri = null; - final String[] scanProjection = new String[]{ - DocumentsContract.Document.COLUMN_DOCUMENT_ID, - DocumentsContract.Document.COLUMN_DISPLAY_NAME, - DocumentsContract.Document.COLUMN_MIME_TYPE}; - final ContentResolver resolver = context.getContentResolver(); - final String treeDocId = DocumentsContract.getTreeDocumentId(baseUri); - final Uri queryUri = DocumentsContract.buildChildDocumentsUriUsingTree(baseUri, treeDocId); - final Cursor cursor = resolver.query(queryUri, scanProjection, null, null, null); - - while (cursor.moveToNext()) { - try { - final String mimeType = cursor.getString(2); - final String documentId = cursor.getString(0); - final Uri uri = DocumentsContract.buildDocumentUriUsingTree(baseUri, documentId); - if (DocumentsContract.Document.MIME_TYPE_DIR.equals(mimeType)) { - continue; - } - - final String uriString = uri.toString(); - if (!uriString.endsWith(FILE_EXTENSION)) - continue; - - results.add(uri); - } catch (Exception e) { - e.printStackTrace(); - } - } - cursor.close(); - } catch (Exception e) { - e.printStackTrace(); - } - } - - if (results.isEmpty()) - return null; - - Collections.sort(results, (a, b) -> a.compareTo(b)); - - final Uri[] resultArray = new Uri[results.size()]; - results.toArray(resultArray); - return resultArray; - } - - private static native boolean isValid(byte[] data); - - private static native void format(byte[] data); - - private static native int getFreeBlocks(byte[] data); - - private static native MemoryCardFileInfo[] getFiles(byte[] data); - - private static native boolean hasFile(byte[] data, String filename); - - private static native byte[] readFile(byte[] data, String filename); - - private static native boolean writeFile(byte[] data, String filename, byte[] fileData); - - private static native boolean deleteFile(byte[] data, String filename); - - private static native boolean importCard(byte[] data, String filename, byte[] importData); - - public boolean save() { - return FileHelper.writeBytesToUri(context, uri, data); - } - - public boolean delete() { - return FileHelper.deleteFileAtUri(context, uri); - } - - public boolean format() { - format(data); - return save(); - } - - public Uri getUri() { - return uri; - } - - public String getTitle() { - return getTitleForUri(uri); - } - - public int getFreeBlocks() { - return getFreeBlocks(data); - } - - public MemoryCardFileInfo[] getFiles() { - return getFiles(data); - } - - public boolean hasFile(String filename) { - return hasFile(data, filename); - } - - public byte[] readFile(String filename) { - return readFile(data, filename); - } - - public boolean writeFile(String filename, byte[] fileData) { - if (!writeFile(data, filename, fileData)) - return false; - - return save(); - } - - public boolean deleteFile(String filename) { - if (!deleteFile(data, filename)) - return false; - - return save(); - } - - public boolean importCard(String filename, byte[] importData) { - if (!importCard(data, filename, importData)) - return false; - - return save(); - } -} diff --git a/android/app/src/main/java/com/github/stenzek/duckstation/PatchCode.java b/android/app/src/main/java/com/github/stenzek/duckstation/PatchCode.java deleted file mode 100644 index c8de67096..000000000 --- a/android/app/src/main/java/com/github/stenzek/duckstation/PatchCode.java +++ /dev/null @@ -1,40 +0,0 @@ -package com.github.stenzek.duckstation; - -public class PatchCode { - private static final String UNGROUPED_NAME = "Ungrouped"; - - private int mIndex; - private String mGroup; - private String mDescription; - private boolean mEnabled; - - public PatchCode(int index, String group, String description, boolean enabled) { - mIndex = index; - mGroup = group; - mDescription = description; - mEnabled = enabled; - } - - public int getIndex() { - return mIndex; - } - - public String getGroup() { - return mGroup; - } - - public String getDescription() { - return mDescription; - } - - public boolean isEnabled() { - return mEnabled; - } - - public String getDisplayText() { - if (mGroup == null || mGroup.equals(UNGROUPED_NAME)) - return mDescription; - else - return String.format("(%s) %s", mGroup, mDescription); - } -} diff --git a/android/app/src/main/java/com/github/stenzek/duckstation/PreferenceHelpers.java b/android/app/src/main/java/com/github/stenzek/duckstation/PreferenceHelpers.java deleted file mode 100644 index 99e9ad815..000000000 --- a/android/app/src/main/java/com/github/stenzek/duckstation/PreferenceHelpers.java +++ /dev/null @@ -1,85 +0,0 @@ -package com.github.stenzek.duckstation; - -import android.content.SharedPreferences; -import android.util.ArraySet; - -import java.util.Set; - -public class PreferenceHelpers { - /** - * Clears all preferences in the specified section (starting with sectionName/). - * We really don't want to have to do this with JNI... - * - * @param prefs Preferences object. - * @param sectionName Section to clear keys for. - */ - public static void clearSection(SharedPreferences prefs, String sectionName) { - String testSectionName = sectionName + "/"; - SharedPreferences.Editor editor = prefs.edit(); - for (String keyName : prefs.getAll().keySet()) { - if (keyName.startsWith(testSectionName)) { - editor.remove(keyName); - } - } - - editor.commit(); - } - - public static Set<String> getStringSet(SharedPreferences prefs, String keyName) { - Set<String> values = null; - try { - values = prefs.getStringSet(keyName, null); - } catch (Exception e) { - try { - String singleValue = prefs.getString(keyName, null); - if (singleValue != null) { - values = new ArraySet<>(); - values.add(singleValue); - } - } catch (Exception e2) { - - } - } - - return values; - } - - public static boolean addToStringList(SharedPreferences prefs, String keyName, String valueToAdd) { - Set<String> values = getStringSet(prefs, keyName); - if (values == null) { - values = new ArraySet<>(); - } else { - // We need to copy it otherwise the put doesn't save. - Set<String> valuesCopy = new ArraySet<>(); - valuesCopy.addAll(values); - values = valuesCopy; - } - - final boolean result = values.add(valueToAdd); - prefs.edit().putStringSet(keyName, values).commit(); - return result; - } - - public static boolean removeFromStringList(SharedPreferences prefs, String keyName, String valueToRemove) { - Set<String> values = getStringSet(prefs, keyName); - if (values == null) - return false; - - // We need to copy it otherwise the put doesn't save. - Set<String> valuesCopy = new ArraySet<>(); - valuesCopy.addAll(values); - values = valuesCopy; - - final boolean result = values.remove(valueToRemove); - prefs.edit().putStringSet(keyName, values).commit(); - return result; - } - - public static void setStringList(SharedPreferences prefs, String keyName, String[] values) { - Set<String> valueSet = new ArraySet<String>(); - for (String value : values) - valueSet.add(value); - - prefs.edit().putStringSet(keyName, valueSet).commit(); - } -} diff --git a/android/app/src/main/java/com/github/stenzek/duckstation/PropertyListAdapter.java b/android/app/src/main/java/com/github/stenzek/duckstation/PropertyListAdapter.java deleted file mode 100644 index 3f9a01565..000000000 --- a/android/app/src/main/java/com/github/stenzek/duckstation/PropertyListAdapter.java +++ /dev/null @@ -1,84 +0,0 @@ -package com.github.stenzek.duckstation; - -import android.content.Context; -import android.view.LayoutInflater; -import android.view.View; -import android.view.ViewGroup; -import android.widget.BaseAdapter; -import android.widget.TextView; - -import java.util.ArrayList; - -public class PropertyListAdapter extends BaseAdapter { - private class Item { - public String key; - public String title; - public String value; - - Item(String key, String title, String value) { - this.key = key; - this.title = title; - this.value = value; - } - } - - private Context mContext; - private ArrayList<Item> mItems = new ArrayList<>(); - - public PropertyListAdapter(Context context) { - mContext = context; - } - - public Item getItemByKey(String key) { - for (Item it : mItems) { - if (it.key.equals(key)) - return it; - } - - return null; - } - - public int addItem(String key, String title, String value) { - if (getItemByKey(key) != null) - return -1; - - Item it = new Item(key, title, value); - int position = mItems.size(); - mItems.add(it); - return position; - } - - public boolean removeItem(Item item) { - return mItems.remove(item); - } - - @Override - public int getCount() { - return mItems.size(); - } - - @Override - public Object getItem(int position) { - return mItems.get(position); - } - - @Override - public long getItemId(int position) { - return position; - } - - @Override - public View getView(int position, View convertView, ViewGroup parent) { - if (convertView == null) { - convertView = LayoutInflater.from(mContext) - .inflate(R.layout.layout_game_property_entry, parent, false); - } - - TextView titleView = (TextView) convertView.findViewById(R.id.property_title); - TextView valueView = (TextView) convertView.findViewById(R.id.property_value); - Item prop = mItems.get(position); - titleView.setText(prop.title); - valueView.setText(prop.value); - return convertView; - } -} diff --git a/android/app/src/main/java/com/github/stenzek/duckstation/RatioPreference.java b/android/app/src/main/java/com/github/stenzek/duckstation/RatioPreference.java deleted file mode 100644 index fe6fc5b41..000000000 --- a/android/app/src/main/java/com/github/stenzek/duckstation/RatioPreference.java +++ /dev/null @@ -1,198 +0,0 @@ -package com.github.stenzek.duckstation; - -import android.content.Context; -import android.content.SharedPreferences; -import android.content.res.Resources; -import android.util.AttributeSet; -import android.util.TypedValue; -import android.view.View; -import android.view.ViewGroup; -import android.widget.AdapterView; -import android.widget.BaseAdapter; -import android.widget.Spinner; -import android.widget.TextView; - -import androidx.annotation.Nullable; -import androidx.preference.Preference; -import androidx.preference.PreferenceDataStore; -import androidx.preference.PreferenceManager; -import androidx.preference.PreferenceViewHolder; - -public class RatioPreference extends Preference { - private String mNumeratorKey; - private String mDenominatorKey; - - private int mNumeratorValue = 1; - private int mDenominatorValue = 1; - - private int mMinimumNumerator = 1; - private int mMaximumNumerator = 50; - private int mDefaultNumerator = 1; - private int mMinimumDenominator = 1; - private int mMaximumDenominator = 50; - private int mDefaultDenominator = 1; - - private void initAttributes(AttributeSet attrs) { - for (int i = 0; i < attrs.getAttributeCount(); i++) { - final String key = attrs.getAttributeName(i); - if (key.equals("numeratorKey")) { - mNumeratorKey = attrs.getAttributeValue(i); - } else if (key.equals("minimumNumerator")) { - mMinimumNumerator = attrs.getAttributeIntValue(i, 1); - } else if (key.equals("maximumNumerator")) { - mMaximumNumerator = attrs.getAttributeIntValue(i, 1); - } else if (key.equals("defaultNumerator")) { - mDefaultNumerator = attrs.getAttributeIntValue(i, 1); - } else if(key.equals("denominatorKey")) { - mDenominatorKey = attrs.getAttributeValue(i); - } else if (key.equals("minimumDenominator")) { - mMinimumDenominator = attrs.getAttributeIntValue(i, 1); - } else if (key.equals("maximumDenominator")) { - mMaximumDenominator = attrs.getAttributeIntValue(i, 1); - } else if (key.equals("defaultDenominator")) { - mDefaultDenominator = attrs.getAttributeIntValue(i, 1); - } - } - } - - public RatioPreference(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) { - super(context, attrs, defStyleAttr, defStyleRes); - setWidgetLayoutResource(R.layout.layout_ratio_preference); - initAttributes(attrs); - } - - public RatioPreference(Context context, AttributeSet attrs, int defStyleAttr) { - super(context, attrs, defStyleAttr); - setWidgetLayoutResource(R.layout.layout_ratio_preference); - initAttributes(attrs); - } - - public RatioPreference(Context context, AttributeSet attrs) { - super(context, attrs); - setWidgetLayoutResource(R.layout.layout_ratio_preference); - initAttributes(attrs); - } - - public RatioPreference(Context context) { - super(context); - setWidgetLayoutResource(R.layout.layout_ratio_preference); - } - - private void persistValues() { - final PreferenceDataStore dataStore = getPreferenceDataStore(); - if (dataStore != null) { - if (mNumeratorKey != null) - dataStore.putInt(mNumeratorKey, mNumeratorValue); - if (mDenominatorKey != null) - dataStore.putInt(mDenominatorKey, mDenominatorValue); - } else { - SharedPreferences.Editor editor = getPreferenceManager().getSharedPreferences().edit(); - if (mNumeratorKey != null) - editor.putInt(mNumeratorKey, mNumeratorValue); - if (mDenominatorKey != null) - editor.putInt(mDenominatorKey, mDenominatorValue); - editor.commit(); - } - } - - @Override - protected void onAttachedToHierarchy(PreferenceManager preferenceManager) { - super.onAttachedToHierarchy(preferenceManager); - setInitialValue(); - } - - private void setInitialValue() { - final PreferenceDataStore dataStore = getPreferenceDataStore(); - if (dataStore != null) { - if (mNumeratorKey != null) - mNumeratorValue = dataStore.getInt(mNumeratorKey, mDefaultNumerator); - if (mDenominatorKey != null) - mDenominatorValue = dataStore.getInt(mDenominatorKey, mDefaultDenominator); - } else { - final SharedPreferences pm = getPreferenceManager().getSharedPreferences(); - if (mNumeratorKey != null) - mNumeratorValue = pm.getInt(mNumeratorKey, mDefaultNumerator); - if (mDenominatorKey != null) - mDenominatorValue = pm.getInt(mDenominatorKey, mDefaultDenominator); - } - } - - private static BaseAdapter generateDropdownItems(int min, int max) { - return new BaseAdapter() { - @Override - public int getCount() { - return (max - min) + 1; - } - - @Override - public Object getItem(int position) { - return Integer.toString(min + position); - } - - @Override - public long getItemId(int position) { - return position; - } - - @Override - public View getView(int position, View convertView, ViewGroup parent) { - TextView view; - if (convertView != null) { - view = (TextView) convertView; - } else { - view = new TextView(parent.getContext()); - - Resources r = parent.getResources(); - float px = TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 10.0f, r.getDisplayMetrics()); - view.setPadding((int) px, (int) px, (int) px, (int) px); - } - - view.setText(Integer.toString(min + position)); - return view; - } - }; - } - - @Override - public void onBindViewHolder(PreferenceViewHolder holder) { - super.onBindViewHolder(holder); - holder.itemView.setClickable(false); - - Spinner numeratorSpinner = (Spinner) holder.findViewById(R.id.numerator); - numeratorSpinner.setAdapter(generateDropdownItems(mMinimumNumerator, mMaximumNumerator)); - numeratorSpinner.setSelection(mNumeratorValue - mMinimumNumerator); - numeratorSpinner.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() { - @Override - public void onItemSelected(AdapterView<?> parent, View view, int position, long id) { - final int newValue = position + mMinimumNumerator; - if (newValue != mNumeratorValue) { - mNumeratorValue = newValue; - persistValues(); - } - } - - @Override - public void onNothingSelected(AdapterView<?> parent) { - } - }); - Spinner denominatorSpinner = (Spinner) holder.findViewById(R.id.denominator); - denominatorSpinner.setAdapter(generateDropdownItems(mMinimumDenominator, mMaximumDenominator)); - denominatorSpinner.setSelection(mDenominatorValue - mMinimumDenominator); - denominatorSpinner.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() { - @Override - public void onItemSelected(AdapterView<?> parent, View view, int position, long id) { - final int newValue = position + mMinimumDenominator; - if (newValue != mDenominatorValue) { - mDenominatorValue = newValue; - persistValues(); - } - } - - @Override - public void onNothingSelected(AdapterView<?> parent) { - } - }); - } - - -} diff --git a/android/app/src/main/java/com/github/stenzek/duckstation/SaveStateInfo.java b/android/app/src/main/java/com/github/stenzek/duckstation/SaveStateInfo.java deleted file mode 100644 index 7acd33f32..000000000 --- a/android/app/src/main/java/com/github/stenzek/duckstation/SaveStateInfo.java +++ /dev/null @@ -1,151 +0,0 @@ -package com.github.stenzek.duckstation; - -import android.content.Context; -import android.graphics.Bitmap; -import android.view.LayoutInflater; -import android.view.View; -import android.view.ViewGroup; -import android.widget.BaseAdapter; -import android.widget.ImageView; -import android.widget.TextView; - -import java.nio.ByteBuffer; - -public class SaveStateInfo { - private String mPath; - private String mGameTitle; - private String mGameCode; - private String mMediaPath; - private String mTimestamp; - private int mSlot; - private boolean mGlobal; - private Bitmap mScreenshot; - - public SaveStateInfo(String path, String gameTitle, String gameCode, String mediaPath, String timestamp, int slot, boolean global, - int screenshotWidth, int screenshotHeight, byte[] screenshotData) { - mPath = path; - mGameTitle = gameTitle; - mGameCode = gameCode; - mMediaPath = mediaPath; - mTimestamp = timestamp; - mSlot = slot; - mGlobal = global; - - if (screenshotData != null) { - try { - mScreenshot = Bitmap.createBitmap(screenshotWidth, screenshotHeight, Bitmap.Config.ARGB_8888); - mScreenshot.copyPixelsFromBuffer(ByteBuffer.wrap(screenshotData)); - } catch (Exception e) { - mScreenshot = null; - } - } - } - - public boolean exists() { - return mPath != null; - } - - public String getPath() { - return mPath; - } - - public String getGameTitle() { - return mGameTitle; - } - - public String getGameCode() { - return mGameCode; - } - - public String getMediaPath() { - return mMediaPath; - } - - public String getTimestamp() { - return mTimestamp; - } - - public int getSlot() { - return mSlot; - } - - public boolean isGlobal() { - return mGlobal; - } - - public Bitmap getScreenshot() { - return mScreenshot; - } - - private void fillView(Context context, View view) { - ImageView imageView = (ImageView) view.findViewById(R.id.image); - TextView summaryView = (TextView) view.findViewById(R.id.summary); - TextView gameView = (TextView) view.findViewById(R.id.game); - TextView pathView = (TextView) view.findViewById(R.id.path); - TextView timestampView = (TextView) view.findViewById(R.id.timestamp); - - if (mScreenshot != null) - imageView.setImageBitmap(mScreenshot); - else - imageView.setImageDrawable(context.getDrawable(R.drawable.ic_baseline_not_interested_60)); - - String summaryText; - if (mGlobal) - summaryView.setText(String.format(context.getString(R.string.save_state_info_global_save_n), mSlot)); - else if (mSlot == 0) - summaryView.setText(R.string.save_state_info_quick_save); - else - summaryView.setText(String.format(context.getString(R.string.save_state_info_game_save_n), mSlot)); - - if (exists()) { - gameView.setText(String.format("%s - %s", mGameCode, mGameTitle)); - - int lastSlashPosition = mMediaPath.lastIndexOf('/'); - if (lastSlashPosition >= 0) - pathView.setText(mMediaPath.substring(lastSlashPosition + 1)); - else - pathView.setText(mMediaPath); - - timestampView.setText(mTimestamp); - } else { - gameView.setText(R.string.save_state_info_slot_is_empty); - pathView.setText(""); - timestampView.setText(""); - } - } - - public static class ListAdapter extends BaseAdapter { - private final Context mContext; - private final SaveStateInfo[] mInfos; - - public ListAdapter(Context context, SaveStateInfo[] infos) { - mContext = context; - mInfos = infos; - } - - @Override - public int getCount() { - return mInfos.length; - } - - @Override - public Object getItem(int position) { - return mInfos[position]; - } - - @Override - public long getItemId(int position) { - return position; - } - - @Override - public View getView(int position, View convertView, ViewGroup parent) { - if (convertView == null) { - convertView = LayoutInflater.from(mContext).inflate(R.layout.save_state_view_entry, parent, false); - } - - mInfos[position].fillView(mContext, convertView); - return convertView; - } - } -} diff --git a/android/app/src/main/java/com/github/stenzek/duckstation/SettingsActivity.java b/android/app/src/main/java/com/github/stenzek/duckstation/SettingsActivity.java deleted file mode 100644 index 47a9313c9..000000000 --- a/android/app/src/main/java/com/github/stenzek/duckstation/SettingsActivity.java +++ /dev/null @@ -1,38 +0,0 @@ -package com.github.stenzek.duckstation; - -import android.os.Bundle; -import android.view.MenuItem; - -import androidx.annotation.NonNull; -import androidx.appcompat.app.ActionBar; -import androidx.appcompat.app.AppCompatActivity; -import androidx.fragment.app.Fragment; -import androidx.preference.PreferenceFragmentCompat; -import androidx.viewpager2.adapter.FragmentStateAdapter; - -public class SettingsActivity extends AppCompatActivity { - - @Override - protected void onCreate(Bundle savedInstanceState) { - super.onCreate(null); - setContentView(R.layout.settings_activity); - getSupportFragmentManager() - .beginTransaction() - .replace(R.id.settings, new SettingsCollectionFragment()) - .commit(); - ActionBar actionBar = getSupportActionBar(); - if (actionBar != null) { - actionBar.setDisplayHomeAsUpEnabled(true); - } - } - - @Override - public boolean onOptionsItemSelected(@NonNull MenuItem item) { - if (item.getItemId() == android.R.id.home) { - onBackPressed(); - return true; - } - - return super.onOptionsItemSelected(item); - } -} \ No newline at end of file diff --git a/android/app/src/main/java/com/github/stenzek/duckstation/SettingsCollectionFragment.java b/android/app/src/main/java/com/github/stenzek/duckstation/SettingsCollectionFragment.java deleted file mode 100644 index b5aa1138b..000000000 --- a/android/app/src/main/java/com/github/stenzek/duckstation/SettingsCollectionFragment.java +++ /dev/null @@ -1,90 +0,0 @@ -package com.github.stenzek.duckstation; - -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.preference.PreferenceFragmentCompat; -import androidx.viewpager2.adapter.FragmentStateAdapter; -import androidx.viewpager2.widget.ViewPager2; - -import com.google.android.material.tabs.TabLayout; -import com.google.android.material.tabs.TabLayoutMediator; - -public class SettingsCollectionFragment extends Fragment { - private SettingsCollectionAdapter adapter; - private ViewPager2 viewPager; - - @Nullable - @Override - public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { - return inflater.inflate(R.layout.fragment_settings_collection, container, false); - } - - @Override - public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) { - adapter = new SettingsCollectionAdapter(this); - viewPager = view.findViewById(R.id.view_pager); - viewPager.setAdapter(adapter); - - TabLayout tabLayout = view.findViewById(R.id.tab_layout); - new TabLayoutMediator(tabLayout, viewPager, - (tab, position) -> tab.setText(getResources().getStringArray(R.array.settings_tabs)[position]) - ).attach(); - } - - public static class SettingsFragment extends PreferenceFragmentCompat { - private final int resourceId; - - public SettingsFragment(int resourceId) { - this.resourceId = resourceId; - } - - @Override - public void onCreatePreferences(Bundle savedInstanceState, String rootKey) { - setPreferencesFromResource(resourceId, rootKey); - } - } - - public static class SettingsCollectionAdapter extends FragmentStateAdapter { - public SettingsCollectionAdapter(@NonNull Fragment fragment) { - super(fragment); - } - - @NonNull - @Override - public Fragment createFragment(int position) { - switch (position) { - case 0: // General - return new SettingsFragment(R.xml.general_preferences); - - case 1: // Display - return new SettingsFragment(R.xml.display_preferences); - - case 2: // Audio - return new SettingsFragment(R.xml.audio_preferences); - - case 3: // Enhancements - return new SettingsFragment(R.xml.enhancements_preferences); - - case 4: // Achievements - return new AchievementSettingsFragment(); - - case 5: // Advanced - return new SettingsFragment(R.xml.advanced_preferences); - - default: - return new Fragment(); - } - } - - @Override - public int getItemCount() { - return 6; - } - } -} diff --git a/android/app/src/main/java/com/github/stenzek/duckstation/TouchscreenControllerAxisView.java b/android/app/src/main/java/com/github/stenzek/duckstation/TouchscreenControllerAxisView.java deleted file mode 100644 index eca099791..000000000 --- a/android/app/src/main/java/com/github/stenzek/duckstation/TouchscreenControllerAxisView.java +++ /dev/null @@ -1,191 +0,0 @@ -package com.github.stenzek.duckstation; - -import android.content.Context; -import android.graphics.Canvas; -import android.graphics.drawable.Drawable; -import android.util.AttributeSet; -import android.view.View; - -public final class TouchscreenControllerAxisView extends View { - private Drawable mBaseDrawable; - private Drawable mStickUnpressedDrawable; - private Drawable mStickPressedDrawable; - private boolean mPressed = false; - private int mPointerId = 0; - private float mXValue = 0.0f; - private float mYValue = 0.0f; - private int mDrawXPos = 0; - private int mDrawYPos = 0; - - private String mConfigName; - private boolean mDefaultVisibility = true; - - private int mControllerIndex = -1; - private int mXAxisCode = -1; - private int mYAxisCode = -1; - private int mLeftButtonCode = -1; - private int mRightButtonCode = -1; - private int mUpButtonCode = -1; - private int mDownButtonCode = -1; - - public TouchscreenControllerAxisView(Context context) { - super(context); - init(); - } - - public TouchscreenControllerAxisView(Context context, AttributeSet attrs) { - super(context, attrs); - init(); - } - - public TouchscreenControllerAxisView(Context context, AttributeSet attrs, int defStyle) { - super(context, attrs, defStyle); - init(); - } - - private void init() { - mBaseDrawable = getContext().getDrawable(R.drawable.ic_controller_analog_base); - mBaseDrawable.setCallback(this); - mStickUnpressedDrawable = getContext().getDrawable(R.drawable.ic_controller_analog_stick_unpressed); - mStickUnpressedDrawable.setCallback(this); - mStickPressedDrawable = getContext().getDrawable(R.drawable.ic_controller_analog_stick_pressed); - mStickPressedDrawable.setCallback(this); - } - - public String getConfigName() { - return mConfigName; - } - public void setConfigName(String configName) { - mConfigName = configName; - } - - public boolean getDefaultVisibility() { return mDefaultVisibility; } - public void setDefaultVisibility(boolean visibility) { mDefaultVisibility = visibility; } - - public void setControllerAxis(int controllerIndex, int xCode, int yCode) { - mControllerIndex = controllerIndex; - mXAxisCode = xCode; - mYAxisCode = yCode; - mLeftButtonCode = -1; - mRightButtonCode = -1; - mUpButtonCode = -1; - mDownButtonCode = -1; - } - - public void setControllerButtons(int controllerIndex, int leftCode, int rightCode, int upCode, int downCode) { - mControllerIndex = controllerIndex; - mXAxisCode = -1; - mYAxisCode = -1; - mLeftButtonCode = leftCode; - mRightButtonCode = rightCode; - mUpButtonCode = upCode; - mDownButtonCode = downCode; - } - - public void setUnpressed() { - if (!mPressed && mXValue == 0.0f && mYValue == 0.0f) - return; - - mPressed = false; - mXValue = 0.0f; - mYValue = 0.0f; - mDrawXPos = 0; - mDrawYPos = 0; - invalidate(); - updateControllerState(); - } - - public void setPressed(int pointerId, float pointerX, float pointerY) { - final float dx = (pointerX / getScaleX()) - (float) (getWidth() / 2); - final float dy = (pointerY / getScaleY()) - (float) (getHeight() / 2); - // Log.i("SetPressed", String.format("px=%f,py=%f dx=%f,dy=%f", pointerX, pointerY, dx, dy)); - - final float pointerDistance = Math.max(Math.abs(dx), Math.abs(dy)); - final float angle = (float) Math.atan2((double) dy, (double) dx); - - final float maxDistance = (float) Math.min((getWidth() - getPaddingLeft() - getPaddingRight()) / 2, (getHeight() - getPaddingTop() - getPaddingBottom()) / 2); - final float length = Math.min(pointerDistance / maxDistance, 1.0f); - // Log.i("SetPressed", String.format("pointerDist=%f,angle=%f,w=%d,h=%d,maxDist=%f,length=%f", pointerDistance, angle, getWidth(), getHeight(), maxDistance, length)); - - final float xValue = (float) Math.cos((double) angle) * length; - final float yValue = (float) Math.sin((double) angle) * length; - mDrawXPos = (int) (xValue * maxDistance); - mDrawYPos = (int) (yValue * maxDistance); - - boolean doUpdate = (pointerId != mPointerId || !mPressed || (xValue != mXValue || yValue != mYValue)); - mPointerId = pointerId; - mPressed = true; - mXValue = xValue; - mYValue = yValue; - // Log.i("SetPressed", String.format("xval=%f,yval=%f,drawX=%d,drawY=%d", mXValue, mYValue, mDrawXPos, mDrawYPos)); - - if (doUpdate) { - invalidate(); - updateControllerState(); - } - } - - private void updateControllerState() { - final float BUTTON_THRESHOLD = 0.33f; - - AndroidHostInterface hostInterface = AndroidHostInterface.getInstance(); - if (mXAxisCode >= 0) - hostInterface.setControllerAxisState(mControllerIndex, mXAxisCode, mXValue); - if (mYAxisCode >= 0) - hostInterface.setControllerAxisState(mControllerIndex, mYAxisCode, mYValue); - - if (mLeftButtonCode >= 0) - hostInterface.setControllerButtonState(mControllerIndex, mLeftButtonCode, (mXValue <= -BUTTON_THRESHOLD)); - if (mRightButtonCode >= 0) - hostInterface.setControllerButtonState(mControllerIndex, mRightButtonCode, (mXValue >= BUTTON_THRESHOLD)); - if (mUpButtonCode >= 0) - hostInterface.setControllerButtonState(mControllerIndex, mUpButtonCode, (mYValue <= -BUTTON_THRESHOLD)); - if (mDownButtonCode >= 0) - hostInterface.setControllerButtonState(mControllerIndex, mDownButtonCode, (mYValue >= BUTTON_THRESHOLD)); - } - - @Override - protected void onDraw(Canvas canvas) { - super.onDraw(canvas); - - final int paddingLeft = getPaddingLeft(); - final int paddingTop = getPaddingTop(); - final int paddingRight = getPaddingRight(); - final int paddingBottom = getPaddingBottom(); - final int contentWidth = getWidth() - paddingLeft - paddingRight; - final int contentHeight = getHeight() - paddingTop - paddingBottom; - - mBaseDrawable.setBounds(paddingLeft, paddingTop, - paddingLeft + contentWidth, paddingTop + contentHeight); - mBaseDrawable.draw(canvas); - - final int stickWidth = contentWidth / 3; - final int stickHeight = contentHeight / 3; - final int halfStickWidth = stickWidth / 2; - final int halfStickHeight = stickHeight / 2; - final int centerX = getWidth() / 2; - final int centerY = getHeight() / 2; - final int drawX = centerX + mDrawXPos; - final int drawY = centerY + mDrawYPos; - - Drawable stickDrawable = mPressed ? mStickPressedDrawable : mStickUnpressedDrawable; - stickDrawable.setBounds(drawX - halfStickWidth, drawY - halfStickHeight, drawX + halfStickWidth, drawY + halfStickHeight); - stickDrawable.draw(canvas); - } - - public boolean isPressed() { - return mPressed; - } - - public boolean hasPointerId() { - return mPointerId >= 0; - } - - public int getPointerId() { - return mPointerId; - } - - public void setPointerId(int mPointerId) { - this.mPointerId = mPointerId; - } -} diff --git a/android/app/src/main/java/com/github/stenzek/duckstation/TouchscreenControllerButtonView.java b/android/app/src/main/java/com/github/stenzek/duckstation/TouchscreenControllerButtonView.java deleted file mode 100644 index b8f70a8a5..000000000 --- a/android/app/src/main/java/com/github/stenzek/duckstation/TouchscreenControllerButtonView.java +++ /dev/null @@ -1,204 +0,0 @@ -package com.github.stenzek.duckstation; - -import android.content.Context; -import android.content.res.TypedArray; -import android.graphics.Canvas; -import android.graphics.drawable.Drawable; -import android.util.AttributeSet; -import android.util.TypedValue; -import android.view.HapticFeedbackConstants; -import android.view.View; - -/** - * TODO: document your custom view class. - */ -public final class TouchscreenControllerButtonView extends View { - public enum Hotkey - { - NONE, - FAST_FORWARD, - ANALOG_TOGGLE, - OPEN_PAUSE_MENU, - QUICK_LOAD, - QUICK_SAVE - } - - private Drawable mUnpressedDrawable; - private Drawable mPressedDrawable; - private boolean mPressed = false; - private boolean mHapticFeedback = false; - private int mControllerIndex = -1; - private int mButtonCode = -1; - private int mAutoFireSlot = -1; - private Hotkey mHotkey = Hotkey.NONE; - private String mConfigName; - private boolean mDefaultVisibility = true; - private boolean mIsGlidable = true; - - public TouchscreenControllerButtonView(Context context) { - super(context); - init(context, null, 0); - } - - public TouchscreenControllerButtonView(Context context, AttributeSet attrs) { - super(context, attrs); - init(context, attrs, 0); - } - - public TouchscreenControllerButtonView(Context context, AttributeSet attrs, int defStyle) { - super(context, attrs, defStyle); - init(context, attrs, defStyle); - } - - private void init(Context context, AttributeSet attrs, int defStyle) { - // Load attributes - final TypedArray a = getContext().obtainStyledAttributes( - attrs, R.styleable.TouchscreenControllerButtonView, defStyle, 0); - - if (a.hasValue(R.styleable.TouchscreenControllerButtonView_unpressedDrawable)) { - mUnpressedDrawable = a.getDrawable(R.styleable.TouchscreenControllerButtonView_unpressedDrawable); - mUnpressedDrawable.setCallback(this); - } - - if (a.hasValue(R.styleable.TouchscreenControllerButtonView_pressedDrawable)) { - mPressedDrawable = a.getDrawable(R.styleable.TouchscreenControllerButtonView_pressedDrawable); - mPressedDrawable.setCallback(this); - } - - a.recycle(); - } - - @Override - protected void onDraw(Canvas canvas) { - super.onDraw(canvas); - - int leftBounds = 0; - int rightBounds = leftBounds + getWidth(); - int topBounds = 0; - int bottomBounds = topBounds + getHeight(); - - if (mPressed) { - final int expandSize = (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, - 10.0f, getResources().getDisplayMetrics()); - leftBounds -= expandSize; - rightBounds += expandSize; - topBounds -= expandSize; - bottomBounds += expandSize; - } - - // Draw the example drawable on top of the text. - Drawable drawable = mPressed ? mPressedDrawable : mUnpressedDrawable; - if (drawable != null) { - drawable.setBounds(leftBounds, topBounds, rightBounds, bottomBounds); - drawable.draw(canvas); - } - } - - public boolean isPressed() { - return mPressed; - } - - public void setPressed(boolean pressed) { - if (pressed == mPressed) - return; - - mPressed = pressed; - invalidate(); - updateControllerState(); - - if (mHapticFeedback) { - performHapticFeedback(pressed ? HapticFeedbackConstants.VIRTUAL_KEY : HapticFeedbackConstants.VIRTUAL_KEY_RELEASE); - } - } - - public void setButtonCode(int controllerIndex, int code) { - mControllerIndex = controllerIndex; - mButtonCode = code; - } - - public void setAutoFireSlot(int controllerIndex, int slot) { - mControllerIndex = controllerIndex; - mAutoFireSlot = slot; - } - - public void setHotkey(Hotkey hotkey) { - mHotkey = hotkey; - } - - public String getConfigName() { - return mConfigName; - } - public void setConfigName(String name) { - mConfigName = name; - } - - public boolean getIsGlidable() { return mIsGlidable; } - public void setIsGlidable(boolean isGlidable) { mIsGlidable = isGlidable; } - - public boolean getDefaultVisibility() { return mDefaultVisibility; } - public void setDefaultVisibility(boolean visibility) { mDefaultVisibility = visibility; } - - public void setHapticFeedback(boolean enabled) { - mHapticFeedback = enabled; - } - - private void updateControllerState() { - final AndroidHostInterface hi = AndroidHostInterface.getInstance(); - if (mButtonCode >= 0) - hi.setControllerButtonState(mControllerIndex, mButtonCode, mPressed); - if (mAutoFireSlot >= 0) - hi.setControllerAutoFireState(mControllerIndex, mAutoFireSlot, mPressed); - - switch (mHotkey) - { - case FAST_FORWARD: { - hi.setFastForwardEnabled(mPressed); - } - break; - - case ANALOG_TOGGLE: { - if (!mPressed) - hi.toggleControllerAnalogMode(); - } - break; - - case OPEN_PAUSE_MENU: { - if (!mPressed) - hi.getEmulationActivity().openPauseMenu(); - } - break; - - case QUICK_LOAD: { - if (!mPressed) - hi.loadState(false, 0); - } - break; - - case QUICK_SAVE: { - if (!mPressed) - hi.saveState(false, 0); - } - break; - - case NONE: - default: - break; - } - } - - public Drawable getPressedDrawable() { - return mPressedDrawable; - } - - public void setPressedDrawable(Drawable pressedDrawable) { - mPressedDrawable = pressedDrawable; - } - - public Drawable getUnpressedDrawable() { - return mUnpressedDrawable; - } - - public void setUnpressedDrawable(Drawable unpressedDrawable) { - mUnpressedDrawable = unpressedDrawable; - } -} diff --git a/android/app/src/main/java/com/github/stenzek/duckstation/TouchscreenControllerDPadView.java b/android/app/src/main/java/com/github/stenzek/duckstation/TouchscreenControllerDPadView.java deleted file mode 100644 index 797abb267..000000000 --- a/android/app/src/main/java/com/github/stenzek/duckstation/TouchscreenControllerDPadView.java +++ /dev/null @@ -1,178 +0,0 @@ -package com.github.stenzek.duckstation; - -import android.content.Context; -import android.graphics.Canvas; -import android.graphics.Rect; -import android.graphics.drawable.Drawable; -import android.util.AttributeSet; -import android.util.Log; -import android.util.TypedValue; -import android.view.View; - -public final class TouchscreenControllerDPadView extends View { - private static final int NUM_DIRECTIONS = 4; - private static final int NUM_POSITIONS = 8; - private static final int DIRECTION_UP = 0; - private static final int DIRECTION_RIGHT = 1; - private static final int DIRECTION_DOWN = 2; - private static final int DIRECTION_LEFT = 3; - - private final Drawable[] mUnpressedDrawables = new Drawable[NUM_DIRECTIONS]; - private final Drawable[] mPressedDrawables = new Drawable[NUM_DIRECTIONS]; - private final int[] mDirectionCodes = new int[] { -1, -1, -1, -1 }; - private final boolean[] mDirectionStates = new boolean[NUM_DIRECTIONS]; - - private boolean mPressed = false; - private int mPointerId = 0; - private int mPointerX = 0; - private int mPointerY = 0; - - private String mConfigName; - private boolean mDefaultVisibility = true; - - private int mControllerIndex = -1; - - private static final int[][] DRAWABLES = { - {R.drawable.ic_controller_up_button,R.drawable.ic_controller_up_button_pressed}, - {R.drawable.ic_controller_right_button,R.drawable.ic_controller_right_button_pressed}, - {R.drawable.ic_controller_down_button,R.drawable.ic_controller_down_button_pressed}, - {R.drawable.ic_controller_left_button,R.drawable.ic_controller_left_button_pressed}, - }; - - - public TouchscreenControllerDPadView(Context context) { - super(context); - init(); - } - - public TouchscreenControllerDPadView(Context context, AttributeSet attrs) { - super(context, attrs); - init(); - } - - public TouchscreenControllerDPadView(Context context, AttributeSet attrs, int defStyle) { - super(context, attrs, defStyle); - init(); - } - - private void init() { - for (int i = 0; i < NUM_DIRECTIONS; i++) { - mUnpressedDrawables[i] = getContext().getDrawable(DRAWABLES[i][0]); - mPressedDrawables[i] = getContext().getDrawable(DRAWABLES[i][1]); - } - } - - public String getConfigName() { - return mConfigName; - } - public void setConfigName(String configName) { - mConfigName = configName; - } - - public boolean getDefaultVisibility() { return mDefaultVisibility; } - public void setDefaultVisibility(boolean visibility) { mDefaultVisibility = visibility; } - - public void setControllerButtons(int controllerIndex, int leftCode, int rightCode, int upCode, int downCode) { - mControllerIndex = controllerIndex; - mDirectionCodes[DIRECTION_LEFT] = leftCode; - mDirectionCodes[DIRECTION_RIGHT] = rightCode; - mDirectionCodes[DIRECTION_UP] = upCode; - mDirectionCodes[DIRECTION_DOWN] = downCode; - } - - public void setUnpressed() { - if (!mPressed && mPointerX == 0 && mPointerY == 0) - return; - - mPressed = false; - mPointerX = 0; - mPointerY = 0; - updateControllerState(); - invalidate(); - } - - public void setPressed(int pointerId, int pointerX, int pointerY) { - final int posX = (int)(pointerX / getScaleX()); - final int posY = (int)(pointerY / getScaleY()); - - boolean doUpdate = (pointerId != mPointerId || !mPressed || (posX != mPointerX || posY != mPointerY)); - mPointerId = pointerId; - mPointerX = posX; - mPointerY = posY; - mPressed = true; - - if (doUpdate) { - updateControllerState(); - invalidate(); - } - } - - private void updateControllerState() { - final int subX = mPointerX / (getWidth() / 3); - final int subY = mPointerY / (getHeight() / 3); - - mDirectionStates[DIRECTION_UP] = (mPressed && subY == 0); - mDirectionStates[DIRECTION_RIGHT] = (mPressed && subX == 2); - mDirectionStates[DIRECTION_DOWN] = (mPressed && subY == 2); - mDirectionStates[DIRECTION_LEFT] = (mPressed && subX == 0); - - AndroidHostInterface hostInterface = AndroidHostInterface.getInstance(); - for (int i = 0; i < NUM_DIRECTIONS; i++) { - if (mDirectionCodes[i] >= 0) - hostInterface.setControllerButtonState(mControllerIndex, mDirectionCodes[i], mDirectionStates[i]); - } - } - - private void drawDirection(int direction, int subX, int subY, Canvas canvas, int buttonWidth, int buttonHeight) { - int leftBounds = subX * buttonWidth; - int rightBounds = leftBounds + buttonWidth; - int topBounds = subY * buttonHeight; - int bottomBounds = topBounds + buttonHeight; - - if (mDirectionStates[direction]) { - final int expandSize = (int)TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, - 10.0f, getResources().getDisplayMetrics()); - leftBounds -= expandSize; - rightBounds += expandSize; - topBounds -= expandSize; - bottomBounds += expandSize; - } - - final Drawable drawable = mDirectionStates[direction] ? mPressedDrawables[direction] : mUnpressedDrawables[direction]; - drawable.setBounds(leftBounds, topBounds, rightBounds, bottomBounds); - drawable.draw(canvas); - } - - @Override - protected void onDraw(Canvas canvas) { - super.onDraw(canvas); - - final int width = getWidth(); - final int height = getHeight(); - - // Divide it into thirds - draw between. - final int buttonWidth = width / 3; - final int buttonHeight = height / 3; - - drawDirection(DIRECTION_UP, 1, 0, canvas, buttonWidth, buttonHeight); - drawDirection(DIRECTION_RIGHT, 2, 1, canvas, buttonWidth, buttonHeight); - drawDirection(DIRECTION_DOWN, 1, 2, canvas, buttonWidth, buttonHeight); - drawDirection(DIRECTION_LEFT, 0, 1, canvas, buttonWidth, buttonHeight); - } - - public boolean isPressed() { - return mPressed; - } - - public boolean hasPointerId() { - return mPointerId >= 0; - } - - public int getPointerId() { - return mPointerId; - } - - public void setPointerId(int mPointerId) { - this.mPointerId = mPointerId; - } -} diff --git a/android/app/src/main/java/com/github/stenzek/duckstation/TouchscreenControllerView.java b/android/app/src/main/java/com/github/stenzek/duckstation/TouchscreenControllerView.java deleted file mode 100644 index 137e0bc75..000000000 --- a/android/app/src/main/java/com/github/stenzek/duckstation/TouchscreenControllerView.java +++ /dev/null @@ -1,858 +0,0 @@ -package com.github.stenzek.duckstation; - -import android.content.Context; -import android.content.SharedPreferences; -import android.content.res.Configuration; -import android.graphics.Rect; -import android.util.AttributeSet; -import android.util.Log; -import android.util.TypedValue; -import android.view.LayoutInflater; -import android.view.MotionEvent; -import android.view.View; -import android.view.ViewGroup; -import android.widget.Button; -import android.widget.FrameLayout; -import android.widget.SeekBar; - -import androidx.appcompat.app.AlertDialog; -import androidx.constraintlayout.widget.ConstraintLayout; -import androidx.preference.PreferenceManager; - -import java.util.ArrayList; -import java.util.Map; -import java.util.HashMap; - -/** - * TODO: document your custom view class. - */ -public class TouchscreenControllerView extends FrameLayout { - public static final int DEFAULT_OPACITY = 100; - - public static final float MIN_VIEW_SCALE = 0.25f; - public static final float MAX_VIEW_SCALE = 10.0f; - - public enum EditMode { - NONE, - POSITION, - SCALE - } - - private int mControllerIndex; - private String mControllerType; - private String mViewType; - private View mMainView; - private ArrayList<TouchscreenControllerButtonView> mButtonViews = new ArrayList<>(); - private ArrayList<TouchscreenControllerAxisView> mAxisViews = new ArrayList<>(); - private TouchscreenControllerDPadView mDPadView = null; - private int mPointerButtonCode = -1; - private int mPointerPointerId = -1; - private boolean mHapticFeedback; - private String mLayoutOrientation; - private EditMode mEditMode = EditMode.NONE; - private View mMovingView = null; - private String mMovingName = null; - private float mMovingLastX = 0.0f; - private float mMovingLastY = 0.0f; - private float mMovingLastScale = 0.0f; - private ConstraintLayout mEditLayout = null; - private int mOpacity = 100; - private Map<Integer, View> mGlidePairs = new HashMap<>(); - - public TouchscreenControllerView(Context context) { - super(context); - setFocusable(false); - setFocusableInTouchMode(false); - } - - public TouchscreenControllerView(Context context, AttributeSet attrs) { - super(context, attrs); - } - - public TouchscreenControllerView(Context context, AttributeSet attrs, int defStyle) { - super(context, attrs, defStyle); - } - - private String getConfigKeyForXTranslation(String name) { - return String.format("TouchscreenController/%s/%s%sXTranslation", mViewType, name, mLayoutOrientation); - } - - private String getConfigKeyForYTranslation(String name) { - return String.format("TouchscreenController/%s/%s%sYTranslation", mViewType, name, mLayoutOrientation); - } - - private String getConfigKeyForScale(String name) { - return String.format("TouchscreenController/%s/%s%sScale", mViewType, name, mLayoutOrientation); - } - - private String getConfigKeyForVisibility(String name) { - return String.format("TouchscreenController/%s/%s%sVisible", mViewType, name, mLayoutOrientation); - } - - private void saveSettingsForButton(String name, View view) { - final SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(getContext()); - final SharedPreferences.Editor editor = prefs.edit(); - editor.putFloat(getConfigKeyForXTranslation(name), view.getTranslationX()); - editor.putFloat(getConfigKeyForYTranslation(name), view.getTranslationY()); - editor.putFloat(getConfigKeyForScale(name), view.getScaleX()); - editor.commit(); - } - - private void saveVisibilityForButton(String name, boolean visible) { - final SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(getContext()); - final SharedPreferences.Editor editor = prefs.edit(); - editor.putBoolean(getConfigKeyForVisibility(name), visible); - editor.commit(); - } - - private void clearTranslationForAllButtons() { - final SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(getContext()); - final SharedPreferences.Editor editor = prefs.edit(); - - for (TouchscreenControllerButtonView buttonView : mButtonViews) { - editor.remove(getConfigKeyForXTranslation(buttonView.getConfigName())); - editor.remove(getConfigKeyForYTranslation(buttonView.getConfigName())); - editor.remove(getConfigKeyForScale(buttonView.getConfigName())); - buttonView.setTranslationX(0.0f); - buttonView.setTranslationY(0.0f); - buttonView.setScaleX(1.0f); - buttonView.setScaleY(1.0f); - } - - for (TouchscreenControllerAxisView axisView : mAxisViews) { - editor.remove(getConfigKeyForXTranslation(axisView.getConfigName())); - editor.remove(getConfigKeyForYTranslation(axisView.getConfigName())); - editor.remove(getConfigKeyForScale(axisView.getConfigName())); - axisView.setTranslationX(0.0f); - axisView.setTranslationY(0.0f); - axisView.setScaleX(1.0f); - axisView.setScaleY(1.0f); - } - - if (mDPadView != null) { - editor.remove(getConfigKeyForXTranslation(mDPadView.getConfigName())); - editor.remove(getConfigKeyForYTranslation(mDPadView.getConfigName())); - editor.remove(getConfigKeyForScale(mDPadView.getConfigName())); - mDPadView.setTranslationX(0.0f); - mDPadView.setTranslationY(0.0f); - mDPadView.setScaleX(1.0f); - mDPadView.setScaleY(1.0f); - } - - editor.commit(); - requestLayout(); - } - - private void reloadButtonSettings() { - final SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(getContext()); - - for (TouchscreenControllerButtonView buttonView : mButtonViews) { - try { - buttonView.setTranslationX(prefs.getFloat(getConfigKeyForXTranslation(buttonView.getConfigName()), 0.0f)); - buttonView.setTranslationY(prefs.getFloat(getConfigKeyForYTranslation(buttonView.getConfigName()), 0.0f)); - buttonView.setScaleX(prefs.getFloat(getConfigKeyForScale(buttonView.getConfigName()), 1.0f)); - buttonView.setScaleY(prefs.getFloat(getConfigKeyForScale(buttonView.getConfigName()), 1.0f)); - //Log.i("TouchscreenController", String.format("Translation for %s %f %f", buttonView.getConfigName(), - // buttonView.getTranslationX(), buttonView.getTranslationY())); - - final boolean visible = prefs.getBoolean(getConfigKeyForVisibility(buttonView.getConfigName()), buttonView.getDefaultVisibility()); - buttonView.setVisibility(visible ? VISIBLE : INVISIBLE); - } catch (ClassCastException ex) { - - } - } - - for (TouchscreenControllerAxisView axisView : mAxisViews) { - try { - axisView.setTranslationX(prefs.getFloat(getConfigKeyForXTranslation(axisView.getConfigName()), 0.0f)); - axisView.setTranslationY(prefs.getFloat(getConfigKeyForYTranslation(axisView.getConfigName()), 0.0f)); - axisView.setScaleX(prefs.getFloat(getConfigKeyForScale(axisView.getConfigName()), 1.0f)); - axisView.setScaleY(prefs.getFloat(getConfigKeyForScale(axisView.getConfigName()), 1.0f)); - - final boolean visible = prefs.getBoolean(getConfigKeyForVisibility(axisView.getConfigName()), axisView.getDefaultVisibility()); - axisView.setVisibility(visible ? VISIBLE : INVISIBLE); - } catch (ClassCastException ex) { - - } - } - - if (mDPadView != null) { - try { - mDPadView.setTranslationX(prefs.getFloat(getConfigKeyForXTranslation(mDPadView.getConfigName()), 0.0f)); - mDPadView.setTranslationY(prefs.getFloat(getConfigKeyForYTranslation(mDPadView.getConfigName()), 0.0f)); - mDPadView.setScaleX(prefs.getFloat(getConfigKeyForScale(mDPadView.getConfigName()), 1.0f)); - mDPadView.setScaleY(prefs.getFloat(getConfigKeyForScale(mDPadView.getConfigName()), 1.0f)); - - final boolean visible = prefs.getBoolean(getConfigKeyForVisibility(mDPadView.getConfigName()), mDPadView.getDefaultVisibility()); - mDPadView.setVisibility(visible ? VISIBLE : INVISIBLE); - } catch (ClassCastException ex) { - - } - } - } - - private void setOpacity(int opacity) { - final SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(getContext()); - final SharedPreferences.Editor editor = prefs.edit(); - editor.putInt("TouchscreenController/Opacity", opacity); - editor.commit(); - - updateOpacity(); - } - - private void updateOpacity() { - mOpacity = PreferenceManager.getDefaultSharedPreferences(getContext()).getInt("TouchscreenController/Opacity", DEFAULT_OPACITY); - - float alpha = (float)mOpacity / 100.0f; - alpha = (alpha < 0.0f) ? 0.0f : ((alpha > 1.0f) ? 1.0f : alpha); - - for (TouchscreenControllerButtonView buttonView : mButtonViews) { - buttonView.setAlpha(alpha); - } - for (TouchscreenControllerAxisView axisView : mAxisViews) { - axisView.setAlpha(alpha); - } - if (mDPadView != null) - mDPadView.setAlpha(alpha); - } - - private String getOrientationString() { - switch (getContext().getResources().getConfiguration().orientation) { - case Configuration.ORIENTATION_PORTRAIT: - return "Portrait"; - case Configuration.ORIENTATION_LANDSCAPE: - default: - return "Landscape"; - } - } - - /** - * Checks if the orientation of the layout has changed, and if so, reloads button translations. - */ - public void updateOrientation() { - String newOrientation = getOrientationString(); - if (mLayoutOrientation != null && mLayoutOrientation.equals(newOrientation)) - return; - - Log.i("TouchscreenController", "New orientation: " + newOrientation); - mLayoutOrientation = newOrientation; - reloadButtonSettings(); - requestLayout(); - } - - public void init(int controllerIndex, String controllerType, String viewType, boolean hapticFeedback, boolean gliding) { - mControllerIndex = controllerIndex; - mControllerType = controllerType; - mViewType = viewType; - mHapticFeedback = hapticFeedback; - mLayoutOrientation = getOrientationString(); - - if (mEditMode != EditMode.NONE) - endLayoutEditing(); - - mButtonViews.clear(); - mAxisViews.clear(); - removeAllViews(); - - LayoutInflater inflater = LayoutInflater.from(getContext()); - String pointerButtonName = null; - switch (viewType) { - case "digital": - mMainView = inflater.inflate(R.layout.layout_touchscreen_controller_digital, this, true); - break; - - case "analog_stick": - mMainView = inflater.inflate(R.layout.layout_touchscreen_controller_analog_stick, this, true); - break; - - case "analog_sticks": - mMainView = inflater.inflate(R.layout.layout_touchscreen_controller_analog_sticks, this, true); - break; - - case "lightgun": - mMainView = inflater.inflate(R.layout.layout_touchscreen_controller_lightgun, this, true); - pointerButtonName = "Trigger"; - break; - - case "none": - default: - mMainView = null; - break; - } - - if (mMainView == null) - return; - - mMainView.setOnTouchListener((view1, event) -> { - if (mEditMode != EditMode.NONE) - return handleEditingTouchEvent(event); - else - return handleTouchEvent(event); - }); - - SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(getContext()); - - linkDPadToButtons(mMainView, R.id.controller_dpad, "DPad", "", true); - linkButton(mMainView, R.id.controller_button_l1, "L1Button", "L1", true, gliding); - linkButton(mMainView, R.id.controller_button_l2, "L2Button", "L2", true, gliding); - linkButton(mMainView, R.id.controller_button_select, "SelectButton", "Select", true, gliding); - linkButton(mMainView, R.id.controller_button_start, "StartButton", "Start", true, gliding); - linkButton(mMainView, R.id.controller_button_triangle, "TriangleButton", "Triangle", true, gliding); - linkButton(mMainView, R.id.controller_button_circle, "CircleButton", "Circle", true, gliding); - linkButton(mMainView, R.id.controller_button_cross, "CrossButton", "Cross", true, gliding); - linkButton(mMainView, R.id.controller_button_square, "SquareButton", "Square", true, gliding); - linkButton(mMainView, R.id.controller_button_r1, "R1Button", "R1", true, gliding); - linkButton(mMainView, R.id.controller_button_r2, "R2Button", "R2", true, gliding); - - if (!linkAxis(mMainView, R.id.controller_axis_left, "LeftAxis", "Left", true)) - linkAxisToButtons(mMainView, R.id.controller_axis_left, "LeftAxis", ""); - - linkAxis(mMainView, R.id.controller_axis_right, "RightAxis", "Right", true); - - // GunCon - linkButton(mMainView, R.id.controller_button_a, "AButton", "A", true, true); - linkButton(mMainView, R.id.controller_button_b, "BButton", "B", true, true); - if (pointerButtonName != null) - linkPointer(pointerButtonName); - - // Turbo/autofire buttons - linkAutoFireButton(mMainView, R.id.controller_button_autofire_1, "AutoFire1", 0, false); - linkAutoFireButton(mMainView, R.id.controller_button_autofire_2, "AutoFire2", 1, false); - linkAutoFireButton(mMainView, R.id.controller_button_autofire_3, "AutoFire3", 2, false); - linkAutoFireButton(mMainView, R.id.controller_button_autofire_4, "AutoFire4", 3, false); - - // Hotkeys - linkHotkeyButton(mMainView, R.id.controller_button_fast_forward, "FastForward", - TouchscreenControllerButtonView.Hotkey.FAST_FORWARD, false); - linkHotkeyButton(mMainView, R.id.controller_button_analog, "AnalogToggle", - TouchscreenControllerButtonView.Hotkey.ANALOG_TOGGLE, false); - linkHotkeyButton(mMainView, R.id.controller_button_pause, "OpenPauseMenu", - TouchscreenControllerButtonView.Hotkey.OPEN_PAUSE_MENU, true); - linkHotkeyButton(mMainView, R.id.controller_button_quick_load, "QuickLoad", - TouchscreenControllerButtonView.Hotkey.QUICK_LOAD, false); - linkHotkeyButton(mMainView, R.id.controller_button_quick_save, "QuickSave", - TouchscreenControllerButtonView.Hotkey.QUICK_SAVE, false); - - reloadButtonSettings(); - updateOpacity(); - requestLayout(); - } - - private void linkButton(View view, int id, String configName, String buttonName, boolean defaultVisibility, boolean isGlidable) { - TouchscreenControllerButtonView buttonView = (TouchscreenControllerButtonView) view.findViewById(id); - if (buttonView == null) - return; - - buttonView.setConfigName(configName); - buttonView.setDefaultVisibility(defaultVisibility); - buttonView.setIsGlidable(isGlidable); - mButtonViews.add(buttonView); - - int code = AndroidHostInterface.getControllerButtonCode(mControllerType, buttonName); - Log.i("TouchscreenController", String.format("%s -> %d", buttonName, code)); - - if (code >= 0) { - buttonView.setButtonCode(mControllerIndex, code); - buttonView.setHapticFeedback(mHapticFeedback); - } else { - Log.e("TouchscreenController", String.format("Unknown button name '%s' " + - "for '%s'", buttonName, mControllerType)); - } - } - - private boolean linkAxis(View view, int id, String configName, String axisName, boolean defaultVisibility) { - TouchscreenControllerAxisView axisView = (TouchscreenControllerAxisView) view.findViewById(id); - if (axisView == null) - return false; - - axisView.setConfigName(configName); - axisView.setDefaultVisibility(defaultVisibility); - mAxisViews.add(axisView); - - int xCode = AndroidHostInterface.getControllerAxisCode(mControllerType, axisName + "X"); - int yCode = AndroidHostInterface.getControllerAxisCode(mControllerType, axisName + "Y"); - Log.i("TouchscreenController", String.format("%s -> %d/%d", axisName, xCode, yCode)); - if (xCode < 0 && yCode < 0) - return false; - - axisView.setControllerAxis(mControllerIndex, xCode, yCode); - return true; - } - - private boolean linkAxisToButtons(View view, int id, String configName, String buttonPrefix) { - TouchscreenControllerAxisView axisView = (TouchscreenControllerAxisView) view.findViewById(id); - if (axisView == null) - return false; - - int leftCode = AndroidHostInterface.getControllerButtonCode(mControllerType, buttonPrefix + "Left"); - int rightCode = AndroidHostInterface.getControllerButtonCode(mControllerType, buttonPrefix + "Right"); - int upCode = AndroidHostInterface.getControllerButtonCode(mControllerType, buttonPrefix + "Up"); - int downCode = AndroidHostInterface.getControllerButtonCode(mControllerType, buttonPrefix + "Down"); - Log.i("TouchscreenController", String.format("%s(ButtonAxis) -> %d,%d,%d,%d", buttonPrefix, leftCode, rightCode, upCode, downCode)); - if (leftCode < 0 && rightCode < 0 && upCode < 0 && downCode < 0) - return false; - - axisView.setControllerButtons(mControllerIndex, leftCode, rightCode, upCode, downCode); - return true; - } - - private boolean linkDPadToButtons(View view, int id, String configName, String buttonPrefix, boolean defaultVisibility) { - TouchscreenControllerDPadView dpadView = (TouchscreenControllerDPadView) view.findViewById(id); - if (dpadView == null) - return false; - - dpadView.setConfigName(configName); - dpadView.setDefaultVisibility(defaultVisibility); - mDPadView = dpadView; - - int leftCode = AndroidHostInterface.getControllerButtonCode(mControllerType, buttonPrefix + "Left"); - int rightCode = AndroidHostInterface.getControllerButtonCode(mControllerType, buttonPrefix + "Right"); - int upCode = AndroidHostInterface.getControllerButtonCode(mControllerType, buttonPrefix + "Up"); - int downCode = AndroidHostInterface.getControllerButtonCode(mControllerType, buttonPrefix + "Down"); - Log.i("TouchscreenController", String.format("%s(DPad) -> %d,%d,%d,%d", buttonPrefix, leftCode, rightCode, upCode, downCode)); - if (leftCode < 0 && rightCode < 0 && upCode < 0 && downCode < 0) - return false; - - dpadView.setControllerButtons(mControllerIndex, leftCode, rightCode, upCode, downCode); - return true; - } - - private void linkHotkeyButton(View view, int id, String configName, TouchscreenControllerButtonView.Hotkey hotkey, boolean defaultVisibility) { - TouchscreenControllerButtonView buttonView = (TouchscreenControllerButtonView) view.findViewById(id); - if (buttonView == null) - return; - - buttonView.setConfigName(configName); - buttonView.setDefaultVisibility(defaultVisibility); - buttonView.setHotkey(hotkey); - buttonView.setIsGlidable(false); - mButtonViews.add(buttonView); - } - - private void linkAutoFireButton(View view, int id, String configName, int slot, boolean defaultVisibility) { - TouchscreenControllerButtonView buttonView = (TouchscreenControllerButtonView) view.findViewById(id); - if (buttonView == null) - return; - - buttonView.setConfigName(configName); - buttonView.setDefaultVisibility(defaultVisibility); - buttonView.setAutoFireSlot(mControllerIndex, slot); - buttonView.setIsGlidable(true); - mButtonViews.add(buttonView); - } - - private boolean linkPointer(String buttonName) { - mPointerButtonCode = AndroidHostInterface.getInstance().getControllerButtonCode(mControllerType, buttonName); - Log.i("TouchscreenController", String.format("Pointer -> %s,%d", buttonName, mPointerButtonCode)); - return (mPointerButtonCode >= 0); - } - - private int dpToPixels(float dp) { - return Math.round(TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, dp, getResources().getDisplayMetrics())); - } - - public void startLayoutEditing(EditMode mode) { - if (mEditLayout == null) { - LayoutInflater inflater = LayoutInflater.from(getContext()); - mEditLayout = (ConstraintLayout) inflater.inflate(R.layout.layout_touchscreen_controller_edit, this, false); - ((Button) mEditLayout.findViewById(R.id.options)).setOnClickListener((view) -> showEditorMenu()); - addView(mEditLayout); - } - - mEditMode = mode; - } - - public void endLayoutEditing() { - if (mEditLayout != null) { - ((ViewGroup) mMainView).removeView(mEditLayout); - mEditLayout = null; - } - - mEditMode = EditMode.NONE; - mMovingView = null; - mMovingName = null; - mMovingLastX = 0.0f; - mMovingLastY = 0.0f; - - // unpause if we're paused (from the setting) - if (AndroidHostInterface.getInstance().isEmulationThreadPaused()) - AndroidHostInterface.getInstance().pauseEmulationThread(false); - } - - private float snapToValue(float pos, float value) { - return Math.round(pos / value) * value; - } - - private float snapToGrid(float pos) { - final float value = TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 20.0f, getResources().getDisplayMetrics()); - return snapToValue(pos, value); - } - - private boolean handleEditingTouchEvent(MotionEvent event) { - switch (event.getActionMasked()) { - case MotionEvent.ACTION_UP: { - if (mMovingView != null) { - // save position - saveSettingsForButton(mMovingName, mMovingView); - mMovingView = null; - mMovingName = null; - mMovingLastX = 0.0f; - mMovingLastY = 0.0f; - mMovingLastScale = 0.0f; - } - - return true; - } - - case MotionEvent.ACTION_DOWN: { - if (mMovingView != null) { - // already moving a button - return true; - } - - Rect rect = new Rect(); - final float x = event.getX(); - final float y = event.getY(); - for (TouchscreenControllerButtonView buttonView : mButtonViews) { - buttonView.getHitRect(rect); - if (rect.contains((int) x, (int) y)) { - mMovingView = buttonView; - mMovingName = buttonView.getConfigName(); - mMovingLastX = snapToGrid(x); - mMovingLastY = snapToGrid(y); - mMovingLastScale = buttonView.getScaleX(); - return true; - } - } - - for (TouchscreenControllerAxisView axisView : mAxisViews) { - axisView.getHitRect(rect); - if (rect.contains((int) x, (int) y)) { - mMovingView = axisView; - mMovingName = axisView.getConfigName(); - mMovingLastX = snapToGrid(x); - mMovingLastY = snapToGrid(y); - mMovingLastScale = axisView.getScaleX(); - return true; - } - } - - if (mDPadView != null) { - mDPadView.getHitRect(rect); - if (rect.contains((int) x, (int) y)) { - mMovingView = mDPadView; - mMovingName = mDPadView.getConfigName(); - mMovingLastX = snapToGrid(x); - mMovingLastY = snapToGrid(y); - mMovingLastScale = mDPadView.getScaleX(); - return true; - } - } - - // nothing.. - return true; - } - - case MotionEvent.ACTION_MOVE: { - if (mMovingView == null) - return true; - - final float x = snapToGrid(event.getX()); - final float y = snapToGrid(event.getY()); - if (mEditMode == EditMode.POSITION) { - final float dx = x - mMovingLastX; - final float dy = y - mMovingLastY; - mMovingLastX = x; - mMovingLastY = y; - - final float posX = mMovingView.getX() + dx; - final float posY = mMovingView.getY() + dy; - //Log.d("Position", String.format("%f %f -> (%f %f) %f %f", - // mMovingView.getX(), mMovingView.getY(), dx, dy, posX, posY)); - mMovingView.setX(posX); - mMovingView.setY(posY); - } else { - final float lastDx = mMovingLastX - mMovingView.getX(); - final float lastDy = mMovingLastY - mMovingView.getY(); - final float dx = x - mMovingView.getX(); - final float dy = y - mMovingView.getY(); - final float lastDistance = Math.max(Math.abs(lastDx), Math.abs(lastDy)); - final float distance = Math.max(Math.abs(dx), Math.abs(dy)); - final float scaler = TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 50.0f, getResources().getDisplayMetrics()); - final float scaleDiff = snapToValue((distance - lastDistance) / scaler, 0.1f); - final float scale = Math.max(Math.min(mMovingLastScale + mMovingLastScale * scaleDiff, MAX_VIEW_SCALE), MIN_VIEW_SCALE); - mMovingView.setScaleX(scale); - mMovingView.setScaleY(scale); - } - - mMovingView.invalidate(); - mMainView.requestLayout(); - return true; - } - } - - return false; - } - - private boolean updateTouchButtonsFromEvent(MotionEvent event) { - if (!AndroidHostInterface.hasInstanceAndEmulationThreadIsRunning()) - return false; - - Rect rect = new Rect(); - final int actionMasked = event.getActionMasked(); - final int pointerCount = event.getPointerCount(); - final int liftedPointerIndex = (actionMasked == MotionEvent.ACTION_POINTER_UP) ? event.getActionIndex() : -1; - for (TouchscreenControllerButtonView buttonView : mButtonViews) { - if (buttonView.getVisibility() != VISIBLE) - continue; - - buttonView.getHitRect(rect); - boolean pressed = false; - for (int i = 0; i < pointerCount; i++) { - if (i == liftedPointerIndex) - continue; - - final int x = (int) event.getX(i); - final int y = (int) event.getY(i); - if (rect.contains(x, y)) { - buttonView.setPressed(true); - final int pointerId = event.getPointerId(i); - if (!mGlidePairs.containsKey(pointerId) && !mGlidePairs.containsValue(buttonView)) { - if (buttonView.getIsGlidable()) - mGlidePairs.put(pointerId, buttonView); - else { mGlidePairs.put(pointerId, null); } - } - pressed = true; - break; - } - } - - if (!pressed && !mGlidePairs.containsValue(buttonView)) - buttonView.setPressed(pressed); - } - - for (TouchscreenControllerAxisView axisView : mAxisViews) { - if (axisView.getVisibility() != VISIBLE) - continue; - - axisView.getHitRect(rect); - boolean pressed = false; - for (int i = 0; i < pointerCount; i++) { - if (i == liftedPointerIndex) - continue; - - final int pointerId = event.getPointerId(i); - final int x = (int) event.getX(i); - final int y = (int) event.getY(i); - - if ((rect.contains(x, y) && !axisView.isPressed()) || - (axisView.isPressed() && axisView.getPointerId() == pointerId)) { - axisView.setPressed(pointerId, x - rect.left, y - rect.top); - pressed = true; - mGlidePairs.put(pointerId, null); - break; - } - } - if (!pressed) - axisView.setUnpressed(); - } - - if (mDPadView != null && mDPadView.getVisibility() == VISIBLE) { - mDPadView.getHitRect(rect); - - boolean pressed = false; - for (int i = 0; i < pointerCount; i++) { - if (i == liftedPointerIndex) - continue; - - final int x = (int) event.getX(i); - final int y = (int) event.getY(i); - if (rect.contains(x, y)) { - mDPadView.setPressed(event.getPointerId(i), x - rect.left, y - rect.top); - pressed = true; - } - } - - if (!pressed) - mDPadView.setUnpressed(); - } - - if (mPointerButtonCode >= 0) { - final int pointerIndex = event.getActionIndex(); - final int pointerId = event.getPointerId(pointerIndex); - if (mPointerPointerId < 0 && (actionMasked == MotionEvent.ACTION_DOWN || actionMasked == MotionEvent.ACTION_POINTER_DOWN)) { - if (!mGlidePairs.containsKey(pointerId)) { - AndroidHostInterface.getInstance().setControllerButtonState(mControllerIndex, - mPointerButtonCode, true); - mPointerPointerId = pointerId; - } - } else if (actionMasked == MotionEvent.ACTION_POINTER_UP) { - if (pointerId == mPointerPointerId) { - AndroidHostInterface.getInstance().setControllerButtonState(mControllerIndex, - mPointerButtonCode, false); - mPointerPointerId = -1; - } - } - - AndroidHostInterface.getInstance().setMousePosition( - (int) event.getX(pointerIndex), - (int) event.getY(pointerIndex)); - } - - return true; - } - - private boolean handleTouchEvent(MotionEvent event) { - switch (event.getActionMasked()) { - case MotionEvent.ACTION_UP: { - if (!AndroidHostInterface.hasInstanceAndEmulationThreadIsRunning()) - return false; - - mGlidePairs.clear(); - - for (TouchscreenControllerButtonView buttonView : mButtonViews) { - buttonView.setPressed(false); - } - - for (TouchscreenControllerAxisView axisView : mAxisViews) { - axisView.setUnpressed(); - } - - if (mDPadView != null) - mDPadView.setUnpressed(); - - if (mPointerPointerId >= 0) { - AndroidHostInterface.getInstance().setControllerButtonState( - mControllerIndex, mPointerButtonCode, false); - mPointerPointerId = -1; - } - - return true; - } - - case MotionEvent.ACTION_DOWN: - case MotionEvent.ACTION_POINTER_DOWN: - case MotionEvent.ACTION_POINTER_UP: { - final int pointerId = event.getPointerId(event.getActionIndex()); - if (mGlidePairs.containsKey(pointerId)) - mGlidePairs.remove(pointerId); - - return updateTouchButtonsFromEvent(event); - } - case MotionEvent.ACTION_MOVE: { - return updateTouchButtonsFromEvent(event); - } - } - - return false; - } - - public AlertDialog.Builder createAddRemoveButtonDialog(Context context) { - final AlertDialog.Builder builder = new AlertDialog.Builder(context); - final CharSequence[] items = new CharSequence[mButtonViews.size() + mAxisViews.size()]; - final boolean[] itemsChecked = new boolean[mButtonViews.size() + mAxisViews.size()]; - int itemCount = 0; - for (TouchscreenControllerButtonView buttonView : mButtonViews) { - items[itemCount] = buttonView.getConfigName(); - itemsChecked[itemCount] = buttonView.getVisibility() == VISIBLE; - itemCount++; - } - for (TouchscreenControllerAxisView axisView : mAxisViews) { - items[itemCount] = axisView.getConfigName(); - itemsChecked[itemCount] = axisView.getVisibility() == VISIBLE; - itemCount++; - } - - builder.setTitle(R.string.dialog_touchscreen_controller_buttons); - builder.setMultiChoiceItems(items, itemsChecked, (dialog, which, isChecked) -> { - if (which < mButtonViews.size()) { - TouchscreenControllerButtonView buttonView = mButtonViews.get(which); - buttonView.setVisibility(isChecked ? VISIBLE : INVISIBLE); - saveVisibilityForButton(buttonView.getConfigName(), isChecked); - } else { - TouchscreenControllerAxisView axisView = mAxisViews.get(which - mButtonViews.size()); - axisView.setVisibility(isChecked ? VISIBLE : INVISIBLE); - saveVisibilityForButton(axisView.getConfigName(), isChecked); - } - }); - builder.setNegativeButton(R.string.dialog_done, (dialog, which) -> { - dialog.dismiss(); - }); - - return builder; - } - - public AlertDialog.Builder createOpacityDialog(Context context) { - final SeekBar seekBar = new SeekBar(context); - seekBar.setMax(100); - seekBar.setProgress(mOpacity); - seekBar.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() { - @Override - public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) { - setOpacity(progress); - } - - @Override - public void onStartTrackingTouch(SeekBar seekBar) { - } - - @Override - public void onStopTrackingTouch(SeekBar seekBar) { - } - }); - - final AlertDialog.Builder builder = new AlertDialog.Builder(context); - builder.setTitle(R.string.dialog_touchscreen_controller_opacity); - builder.setView(seekBar); - builder.setNegativeButton(R.string.dialog_done, (dialog, which) -> { - dialog.dismiss(); - }); - return builder; - } - - private void showEditorMenu() { - AlertDialog.Builder builder = new AlertDialog.Builder(getContext()); - builder.setItems(R.array.touchscreen_layout_menu, (dialogInterface, i) -> { - switch (i) { - case 0: // Change Opacity - { - AlertDialog.Builder subBuilder = createOpacityDialog(getContext()); - subBuilder.create().show(); - } - break; - - case 1: // Add/Remove Buttons - { - AlertDialog.Builder subBuilder = createAddRemoveButtonDialog(getContext()); - subBuilder.create().show(); - } - break; - - case 2: // Edit Positions - { - mEditMode = EditMode.POSITION; - } - break; - - case 3: // Edit Scale - { - mEditMode = EditMode.SCALE; - } - break; - - case 4: // Reset Layout - { - clearTranslationForAllButtons(); - } - break; - - case 5: // Exit Editor - { - endLayoutEditing(); - } - break; - } - }); - builder.create().show(); - } -} diff --git a/android/app/src/main/java/com/github/stenzek/duckstation/URLDownloader.java b/android/app/src/main/java/com/github/stenzek/duckstation/URLDownloader.java deleted file mode 100644 index 6da425237..000000000 --- a/android/app/src/main/java/com/github/stenzek/duckstation/URLDownloader.java +++ /dev/null @@ -1,96 +0,0 @@ -package com.github.stenzek.duckstation; - -import java.io.BufferedInputStream; -import java.io.BufferedOutputStream; -import java.io.ByteArrayOutputStream; -import java.io.InputStream; -import java.io.OutputStream; -import java.net.HttpURLConnection; -import java.net.URL; - -/** - * Helper class for exposing HTTP downloads to native code without pulling in an external - * dependency for doing so. - */ -public class URLDownloader { - private int statusCode = -1; - private byte[] data = null; - private final String userAgent; - - public URLDownloader(String userAgent) { - this.userAgent = userAgent; - } - - private HttpURLConnection getConnection(String url) { - try { - final URL parsedUrl = new URL(url); - HttpURLConnection connection = (HttpURLConnection) parsedUrl.openConnection(); - if (connection == null) - throw new RuntimeException(String.format("openConnection(%s) returned null", url)); - - if (userAgent != null) - connection.addRequestProperty("User-Agent", userAgent); - return connection; - } catch (Exception e) { - e.printStackTrace(); - return null; - } - } - - public int getStatusCode() { - return statusCode; - } - - public byte[] getData() { - return data; - } - - private boolean download(HttpURLConnection connection) { - try { - statusCode = connection.getResponseCode(); - if (statusCode != HttpURLConnection.HTTP_OK) - return false; - - final InputStream inStream = new BufferedInputStream(connection.getInputStream()); - final ByteArrayOutputStream outputStream = new ByteArrayOutputStream(); - final int CHUNK_SIZE = 128 * 1024; - final byte[] chunk = new byte[CHUNK_SIZE]; - int len; - while ((len = inStream.read(chunk)) > 0) { - outputStream.write(chunk, 0, len); - } - - data = outputStream.toByteArray(); - return true; - } catch (Exception e) { - e.printStackTrace(); - return false; - } - } - - public boolean get(String url) { - final HttpURLConnection connection = getConnection(url); - if (connection == null) - return false; - - return download(connection); - } - - public boolean post(String url, byte[] postData) { - final HttpURLConnection connection = getConnection(url); - if (connection == null) - return false; - - try { - connection.setDoOutput(true); - connection.setChunkedStreamingMode(0); - - OutputStream postStream = new BufferedOutputStream(connection.getOutputStream()); - postStream.write(postData); - return download(connection); - } catch (Exception e) { - e.printStackTrace(); - return false; - } - } -} diff --git a/android/app/src/main/java/com/github/stenzek/duckstation/UpdateNotes.java b/android/app/src/main/java/com/github/stenzek/duckstation/UpdateNotes.java deleted file mode 100644 index 6ef63878f..000000000 --- a/android/app/src/main/java/com/github/stenzek/duckstation/UpdateNotes.java +++ /dev/null @@ -1,54 +0,0 @@ -package com.github.stenzek.duckstation; - -import android.app.AlertDialog; -import android.content.Intent; -import android.content.SharedPreferences; - -import androidx.preference.PreferenceManager; - -public class UpdateNotes { - private static final int VERSION_CONTROLLER_UPDATE = 1; - private static final int CURRENT_VERSION = VERSION_CONTROLLER_UPDATE; - - private static final String CONFIG_KEY = "Main/UpdateNotesVersion"; - - private static int getVersion(MainActivity parent) { - try { - final SharedPreferences sp = PreferenceManager.getDefaultSharedPreferences(parent); - return sp.getInt(CONFIG_KEY, 0); - } catch (Exception e) { - e.printStackTrace(); - return CURRENT_VERSION; - } - } - - public static void setVersion(MainActivity parent, int version) { - final SharedPreferences sp = PreferenceManager.getDefaultSharedPreferences(parent); - sp.edit().putInt(CONFIG_KEY, version).commit(); - } - - public static boolean displayUpdateNotes(MainActivity parent) { - final int version = getVersion(parent); - - if (version < VERSION_CONTROLLER_UPDATE ) { - displayControllerUpdateNotes(parent); - setVersion(parent, VERSION_CONTROLLER_UPDATE); - return true; - } - - return false; - } - - public static void displayControllerUpdateNotes(MainActivity parent) { - final AlertDialog.Builder builder = new AlertDialog.Builder(parent); - builder.setTitle(R.string.update_notes_title); - builder.setMessage(R.string.update_notes_message_version_controller_update); - builder.setPositiveButton(R.string.main_activity_yes, (dialog, which) -> { - dialog.dismiss(); - Intent intent = new Intent(parent, ControllerSettingsActivity.class); - parent.startActivity(intent); - }); - builder.setNegativeButton(R.string.main_activity_no, (dialog, which) -> dialog.dismiss()); - builder.create().show(); - } -} diff --git a/android/app/src/main/res/drawable-v24/ic_launcher_foreground.xml b/android/app/src/main/res/drawable-v24/ic_launcher_foreground.xml deleted file mode 100644 index 1f6bb2906..000000000 --- a/android/app/src/main/res/drawable-v24/ic_launcher_foreground.xml +++ /dev/null @@ -1,34 +0,0 @@ -<vector xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:aapt="http://schemas.android.com/aapt" - android:width="108dp" - android:height="108dp" - android:viewportWidth="108" - android:viewportHeight="108"> - <path - android:fillType="evenOdd" - android:pathData="M32,64C32,64 38.39,52.99 44.13,50.95C51.37,48.37 70.14,49.57 70.14,49.57L108.26,87.69L108,109.01L75.97,107.97L32,64Z" - android:strokeWidth="1" - android:strokeColor="#00000000"> - <aapt:attr name="android:fillColor"> - <gradient - android:endX="78.5885" - android:endY="90.9159" - android:startX="48.7653" - android:startY="61.0927" - android:type="linear"> - <item - android:color="#44000000" - android:offset="0.0" /> - <item - android:color="#00000000" - android:offset="1.0" /> - </gradient> - </aapt:attr> - </path> - <path - android:fillColor="#FFFFFF" - android:fillType="nonZero" - android:pathData="M66.94,46.02L66.94,46.02C72.44,50.07 76,56.61 76,64L32,64C32,56.61 35.56,50.11 40.98,46.06L36.18,41.19C35.45,40.45 35.45,39.3 36.18,38.56C36.91,37.81 38.05,37.81 38.78,38.56L44.25,44.05C47.18,42.57 50.48,41.71 54,41.71C57.48,41.71 60.78,42.57 63.68,44.05L69.11,38.56C69.84,37.81 70.98,37.81 71.71,38.56C72.44,39.3 72.44,40.45 71.71,41.19L66.94,46.02ZM62.94,56.92C64.08,56.92 65,56.01 65,54.88C65,53.76 64.08,52.85 62.94,52.85C61.8,52.85 60.88,53.76 60.88,54.88C60.88,56.01 61.8,56.92 62.94,56.92ZM45.06,56.92C46.2,56.92 47.13,56.01 47.13,54.88C47.13,53.76 46.2,52.85 45.06,52.85C43.92,52.85 43,53.76 43,54.88C43,56.01 43.92,56.92 45.06,56.92Z" - android:strokeWidth="1" - android:strokeColor="#00000000" /> -</vector> diff --git a/android/app/src/main/res/drawable/cover_placeholder.png b/android/app/src/main/res/drawable/cover_placeholder.png deleted file mode 100644 index 18dc446febdbae6950771d71ad21d47bd848a440..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 214262 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%0Aer}jdHV-K>Yf?w@qPml7J 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%0AeMqE=AA2N7n~{C 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 QIRF3v07*qoM6N<$g3txi6aWAK diff --git a/android/app/src/main/res/drawable/duck.png b/android/app/src/main/res/drawable/duck.png deleted file mode 100644 index f039412f225406ba4f8b5ef379a7d39c19fa5aa2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 48659 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 diff --git a/android/app/src/main/res/drawable/flag_eu.xml b/android/app/src/main/res/drawable/flag_eu.xml deleted file mode 100644 index e545a72a2..000000000 --- a/android/app/src/main/res/drawable/flag_eu.xml +++ /dev/null @@ -1,71 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?><!-- https://raw.githubusercontent.com/Shusshu/android-flags/master/flags/src/main/res/drawable/flag_us2.xml --> -<vector android:height="15dp" - android:viewportHeight="15" - android:viewportWidth="21" - android:width="21dp" - xmlns:aapt="http://schemas.android.com/aapt" - xmlns:android="http://schemas.android.com/apk/res/android"> - <path - android:fillType="evenOdd" - android:pathData="M0,0h21v15h-21z" - android:strokeColor="#00000000" - android:strokeWidth="1"> - <aapt:attr name="android:fillColor"> - <gradient - android:endX="10.5" - android:endY="15" - android:startX="10.5" - android:startY="0" - android:type="linear"> - <item - android:color="#FFFFFFFF" - android:offset="0" /> - <item - android:color="#FFF0F0F0" - android:offset="1" /> - </gradient> - </aapt:attr> - </path> - <path - android:fillType="evenOdd" - android:pathData="M0,0h21v15h-21z" - android:strokeColor="#00000000" - android:strokeWidth="1"> - <aapt:attr name="android:fillColor"> - <gradient - android:endX="10.5" - android:endY="15" - android:startX="10.5" - android:startY="0" - android:type="linear"> - <item - android:color="#FF043CAE" - android:offset="0" /> - <item - android:color="#FF00339A" - android:offset="1" /> - </gradient> - </aapt:attr> - </path> - <path - android:fillType="evenOdd" - android:pathData="M10.5,3L9.7929,3.2071L10,2.5L9.7929,1.7929L10.5,2L11.2071,1.7929L11,2.5L11.2071,3.2071L10.5,3ZM10.5,13L9.7929,13.2071L10,12.5L9.7929,11.7929L10.5,12L11.2071,11.7929L11,12.5L11.2071,13.2071L10.5,13ZM15.5,8L14.7929,8.2071L15,7.5L14.7929,6.7929L15.5,7L16.2071,6.7929L16,7.5L16.2071,8.2071L15.5,8ZM5.5,8L4.7929,8.2071L5,7.5L4.7929,6.7929L5.5,7L6.2071,6.7929L6,7.5L6.2071,8.2071L5.5,8ZM14.8301,5.5L14.123,5.7071L14.3301,5L14.123,4.2929L14.8301,4.5L15.5372,4.2929L15.3301,5L15.5372,5.7071L14.8301,5.5ZM6.1699,10.5L5.4628,10.7071L5.6699,10L5.4628,9.2929L6.1699,9.5L6.877,9.2929L6.6699,10L6.877,10.7071L6.1699,10.5ZM13,3.6699L12.2929,3.877L12.5,3.1699L12.2929,2.4628L13,2.6699L13.7071,2.4628L13.5,3.1699L13.7071,3.877L13,3.6699ZM8,12.3301L7.2929,12.5372L7.5,11.8301L7.2929,11.123L8,11.3301L8.7071,11.123L8.5,11.8301L8.7071,12.5372L8,12.3301ZM14.8301,10.5L14.123,10.7071L14.3301,10L14.123,9.2929L14.8301,9.5L15.5372,9.2929L15.3301,10L15.5372,10.7071L14.8301,10.5ZM6.1699,5.5L5.4628,5.7071L5.6699,5L5.4628,4.2929L6.1699,4.5L6.877,4.2929L6.6699,5L6.877,5.7071L6.1699,5.5ZM13,12.3301L12.2929,12.5372L12.5,11.8301L12.2929,11.123L13,11.3301L13.7071,11.123L13.5,11.8301L13.7071,12.5372L13,12.3301ZM8,3.6699L7.2929,3.877L7.5,3.1699L7.2929,2.4628L8,2.6699L8.7071,2.4628L8.5,3.1699L8.7071,3.877L8,3.6699Z" - android:strokeColor="#00000000" - android:strokeWidth="1"> - <aapt:attr name="android:fillColor"> - <gradient - android:endX="10.5" - android:endY="13.2071" - android:startX="10.5" - android:startY="1.7929" - android:type="linear"> - <item - android:color="#FFFFD429" - android:offset="0" /> - <item - android:color="#FFFFCC00" - android:offset="1" /> - </gradient> - </aapt:attr> - </path> -</vector> \ No newline at end of file diff --git a/android/app/src/main/res/drawable/flag_jp.xml b/android/app/src/main/res/drawable/flag_jp.xml deleted file mode 100644 index f7b9fe6bd..000000000 --- a/android/app/src/main/res/drawable/flag_jp.xml +++ /dev/null @@ -1,50 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?><!-- https://raw.githubusercontent.com/Shusshu/android-flags/master/flags/src/main/res/drawable/flag_hp.xml --> -<vector android:height="15dp" - android:viewportHeight="15" - android:viewportWidth="21" - android:width="21dp" - xmlns:aapt="http://schemas.android.com/aapt" - xmlns:android="http://schemas.android.com/apk/res/android"> - <path - android:fillType="evenOdd" - android:pathData="M0,0h21v15h-21z" - android:strokeColor="#00000000" - android:strokeWidth="1"> - <aapt:attr name="android:fillColor"> - <gradient - android:endX="10.5" - android:endY="15" - android:startX="10.5" - android:startY="0" - android:type="linear"> - <item - android:color="#FFFFFFFF" - android:offset="0" /> - <item - android:color="#FFF0F0F0" - android:offset="1" /> - </gradient> - </aapt:attr> - </path> - <path - android:fillType="evenOdd" - android:pathData="M10.5,7.5m-4.5,0a4.5,4.5 0,1 1,9 0a4.5,4.5 0,1 1,-9 0" - android:strokeColor="#00000000" - android:strokeWidth="1"> - <aapt:attr name="android:fillColor"> - <gradient - android:endX="10.5" - android:endY="12" - android:startX="10.5" - android:startY="3" - android:type="linear"> - <item - android:color="#FFD81441" - android:offset="0" /> - <item - android:color="#FFBB0831" - android:offset="1" /> - </gradient> - </aapt:attr> - </path> -</vector> diff --git a/android/app/src/main/res/drawable/flag_us.xml b/android/app/src/main/res/drawable/flag_us.xml deleted file mode 100644 index d83fcb9e2..000000000 --- a/android/app/src/main/res/drawable/flag_us.xml +++ /dev/null @@ -1,539 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?><!-- https://raw.githubusercontent.com/Shusshu/android-flags/master/flags/src/main/res/drawable/flag_us2.xml --> -<vector xmlns:android="http://schemas.android.com/apk/res/android" - android:width="21dp" - android:height="21dp" - android:viewportWidth="10" - android:viewportHeight="13"> - <path - android:fillColor="#bd3d44" - android:pathData="M0 0h13v1h-13Z" /> - <path - android:fillColor="#fff" - android:pathData="M0 1h13v1h-13Z" /> - <path - android:fillColor="#bd3d44" - android:pathData="M0 2h13v1h-13Z" /> - <path - android:fillColor="#fff" - android:pathData="M0 3h13v1h-13Z" /> - <path - android:fillColor="#bd3d44" - android:pathData="M0 4h13v1h-13Z" /> - <path - android:fillColor="#fff" - android:pathData="M0 5h13v1h-13Z" /> - <path - android:fillColor="#bd3d44" - android:pathData="M0 6h13v1h-13Z" /> - <path - android:fillColor="#fff" - android:pathData="M0 7h13v1h-13Z" /> - <path - android:fillColor="#bd3d44" - android:pathData="M0 8h13v1h-13Z" /> - <path - android:fillColor="#fff" - android:pathData="M0 9h13v1h-13Z" /> - <path - android:fillColor="#bd3d44" - android:pathData="M0 10h13v1h-13Z" /> - <path - android:fillColor="#fff" - android:pathData="M0 11h13v1h-13Z" /> - <path - android:fillColor="#bd3d44" - android:pathData="M0 12h13v1h-13Z" /> - <path - android:fillColor="#192f5d" - android:pathData="M0 0h5.2v7h-5.2Z" /> - - <group - android:translateX="0.2" - android:translateY="0.2" - android:scaleX="0.009" - android:scaleY="0.012"> - <path - android:fillColor="#fff" - android:pathData="M 48,54 L 31,42 15,54 21,35 6,23 25,23 32,4 40,23 58,23 42,35 z" /> - </group> - <group - android:translateX="1.0" - android:translateY="0.2" - android:scaleX="0.009" - android:scaleY="0.012"> - <path - android:fillColor="#fff" - android:pathData="M 48,54 L 31,42 15,54 21,35 6,23 25,23 32,4 40,23 58,23 42,35 z" /> - </group> - <group - android:translateX="1.8" - android:translateY="0.2" - android:scaleX="0.009" - android:scaleY="0.012"> - <path - android:fillColor="#fff" - android:pathData="M 48,54 L 31,42 15,54 21,35 6,23 25,23 32,4 40,23 58,23 42,35 z" /> - </group> - <group - android:translateX="2.6" - android:translateY="0.2" - android:scaleX="0.009" - android:scaleY="0.012"> - <path - android:fillColor="#fff" - android:pathData="M 48,54 L 31,42 15,54 21,35 6,23 25,23 32,4 40,23 58,23 42,35 z" /> - </group> - <group - android:translateX="3.4" - android:translateY="0.2" - android:scaleX="0.009" - android:scaleY="0.012"> - <path - android:fillColor="#fff" - android:pathData="M 48,54 L 31,42 15,54 21,35 6,23 25,23 32,4 40,23 58,23 42,35 z" /> - </group> - <group - android:translateX="4.2" - android:translateY="0.2" - android:scaleX="0.009" - android:scaleY="0.012"> - <path - android:fillColor="#fff" - android:pathData="M 48,54 L 31,42 15,54 21,35 6,23 25,23 32,4 40,23 58,23 42,35 z" /> - </group> - - - <group android:translateY="1.4"> - <group - android:translateX="0.2" - android:translateY="0.2" - android:scaleX="0.009" - android:scaleY="0.012"> - <path - android:fillColor="#fff" - android:pathData="M 48,54 L 31,42 15,54 21,35 6,23 25,23 32,4 40,23 58,23 42,35 z" /> - </group> - <group - android:translateX="1.0" - android:translateY="0.2" - android:scaleX="0.009" - android:scaleY="0.012"> - <path - android:fillColor="#fff" - android:pathData="M 48,54 L 31,42 15,54 21,35 6,23 25,23 32,4 40,23 58,23 42,35 z" /> - </group> - <group - android:translateX="1.8" - android:translateY="0.2" - android:scaleX="0.009" - android:scaleY="0.012"> - <path - android:fillColor="#fff" - android:pathData="M 48,54 L 31,42 15,54 21,35 6,23 25,23 32,4 40,23 58,23 42,35 z" /> - </group> - <group - android:translateX="2.6" - android:translateY="0.2" - android:scaleX="0.009" - android:scaleY="0.012"> - <path - android:fillColor="#fff" - android:pathData="M 48,54 L 31,42 15,54 21,35 6,23 25,23 32,4 40,23 58,23 42,35 z" /> - </group> - <group - android:translateX="3.4" - android:translateY="0.2" - android:scaleX="0.009" - android:scaleY="0.012"> - <path - android:fillColor="#fff" - android:pathData="M 48,54 L 31,42 15,54 21,35 6,23 25,23 32,4 40,23 58,23 42,35 z" /> - </group> - <group - android:translateX="4.2" - android:translateY="0.2" - android:scaleX="0.009" - android:scaleY="0.012"> - <path - android:fillColor="#fff" - android:pathData="M 48,54 L 31,42 15,54 21,35 6,23 25,23 32,4 40,23 58,23 42,35 z" /> - </group> - </group> - - - <group android:translateY="2.9"> - <group - android:translateX="0.2" - android:translateY="0.2" - android:scaleX="0.009" - android:scaleY="0.012"> - <path - android:fillColor="#fff" - android:pathData="M 48,54 L 31,42 15,54 21,35 6,23 25,23 32,4 40,23 58,23 42,35 z" /> - </group> - <group - android:translateX="1.0" - android:translateY="0.2" - android:scaleX="0.009" - android:scaleY="0.012"> - <path - android:fillColor="#fff" - android:pathData="M 48,54 L 31,42 15,54 21,35 6,23 25,23 32,4 40,23 58,23 42,35 z" /> - </group> - <group - android:translateX="1.8" - android:translateY="0.2" - android:scaleX="0.009" - android:scaleY="0.012"> - <path - android:fillColor="#fff" - android:pathData="M 48,54 L 31,42 15,54 21,35 6,23 25,23 32,4 40,23 58,23 42,35 z" /> - </group> - <group - android:translateX="2.6" - android:translateY="0.2" - android:scaleX="0.009" - android:scaleY="0.012"> - <path - android:fillColor="#fff" - android:pathData="M 48,54 L 31,42 15,54 21,35 6,23 25,23 32,4 40,23 58,23 42,35 z" /> - </group> - <group - android:translateX="3.4" - android:translateY="0.2" - android:scaleX="0.009" - android:scaleY="0.012"> - <path - android:fillColor="#fff" - android:pathData="M 48,54 L 31,42 15,54 21,35 6,23 25,23 32,4 40,23 58,23 42,35 z" /> - </group> - <group - android:translateX="4.2" - android:translateY="0.2" - android:scaleX="0.009" - android:scaleY="0.012"> - <path - android:fillColor="#fff" - android:pathData="M 48,54 L 31,42 15,54 21,35 6,23 25,23 32,4 40,23 58,23 42,35 z" /> - </group> - </group> - - - <group android:translateY="4.3"> - <group - android:translateX="0.2" - android:translateY="0.2" - android:scaleX="0.009" - android:scaleY="0.012"> - <path - android:fillColor="#fff" - android:pathData="M 48,54 L 31,42 15,54 21,35 6,23 25,23 32,4 40,23 58,23 42,35 z" /> - </group> - <group - android:translateX="1.0" - android:translateY="0.2" - android:scaleX="0.009" - android:scaleY="0.012"> - <path - android:fillColor="#fff" - android:pathData="M 48,54 L 31,42 15,54 21,35 6,23 25,23 32,4 40,23 58,23 42,35 z" /> - </group> - <group - android:translateX="1.8" - android:translateY="0.2" - android:scaleX="0.009" - android:scaleY="0.012"> - <path - android:fillColor="#fff" - android:pathData="M 48,54 L 31,42 15,54 21,35 6,23 25,23 32,4 40,23 58,23 42,35 z" /> - </group> - <group - android:translateX="2.6" - android:translateY="0.2" - android:scaleX="0.009" - android:scaleY="0.012"> - <path - android:fillColor="#fff" - android:pathData="M 48,54 L 31,42 15,54 21,35 6,23 25,23 32,4 40,23 58,23 42,35 z" /> - </group> - <group - android:translateX="3.4" - android:translateY="0.2" - android:scaleX="0.009" - android:scaleY="0.012"> - <path - android:fillColor="#fff" - android:pathData="M 48,54 L 31,42 15,54 21,35 6,23 25,23 32,4 40,23 58,23 42,35 z" /> - </group> - <group - android:translateX="4.2" - android:translateY="0.2" - android:scaleX="0.009" - android:scaleY="0.012"> - <path - android:fillColor="#fff" - android:pathData="M 48,54 L 31,42 15,54 21,35 6,23 25,23 32,4 40,23 58,23 42,35 z" /> - </group> - </group> - - - <group android:translateY="5.6"> - <group - android:translateX="0.2" - android:translateY="0.2" - android:scaleX="0.009" - android:scaleY="0.012"> - <path - android:fillColor="#fff" - android:pathData="M 48,54 L 31,42 15,54 21,35 6,23 25,23 32,4 40,23 58,23 42,35 z" /> - </group> - <group - android:translateX="1.0" - android:translateY="0.2" - android:scaleX="0.009" - android:scaleY="0.012"> - <path - android:fillColor="#fff" - android:pathData="M 48,54 L 31,42 15,54 21,35 6,23 25,23 32,4 40,23 58,23 42,35 z" /> - </group> - <group - android:translateX="1.8" - android:translateY="0.2" - android:scaleX="0.009" - android:scaleY="0.012"> - <path - android:fillColor="#fff" - android:pathData="M 48,54 L 31,42 15,54 21,35 6,23 25,23 32,4 40,23 58,23 42,35 z" /> - </group> - <group - android:translateX="2.6" - android:translateY="0.2" - android:scaleX="0.009" - android:scaleY="0.012"> - <path - android:fillColor="#fff" - android:pathData="M 48,54 L 31,42 15,54 21,35 6,23 25,23 32,4 40,23 58,23 42,35 z" /> - </group> - <group - android:translateX="3.4" - android:translateY="0.2" - android:scaleX="0.009" - android:scaleY="0.012"> - <path - android:fillColor="#fff" - android:pathData="M 48,54 L 31,42 15,54 21,35 6,23 25,23 32,4 40,23 58,23 42,35 z" /> - </group> - <group - android:translateX="4.2" - android:translateY="0.2" - android:scaleX="0.009" - android:scaleY="0.012"> - <path - android:fillColor="#fff" - android:pathData="M 48,54 L 31,42 15,54 21,35 6,23 25,23 32,4 40,23 58,23 42,35 z" /> - </group> - </group> - - <!-- Odd stars --> - - <group - android:translateY="0.7" - android:translateX="0.4"> - <group - android:translateX="0.2" - android:translateY="0.2" - android:scaleX="0.009" - android:scaleY="0.012"> - <path - android:fillColor="#fff" - android:pathData="M 48,54 L 31,42 15,54 21,35 6,23 25,23 32,4 40,23 58,23 42,35 z" /> - </group> - <group - android:translateX="1.0" - android:translateY="0.2" - android:scaleX="0.009" - android:scaleY="0.012"> - <path - android:fillColor="#fff" - android:pathData="M 48,54 L 31,42 15,54 21,35 6,23 25,23 32,4 40,23 58,23 42,35 z" /> - </group> - <group - android:translateX="1.8" - android:translateY="0.2" - android:scaleX="0.009" - android:scaleY="0.012"> - <path - android:fillColor="#fff" - android:pathData="M 48,54 L 31,42 15,54 21,35 6,23 25,23 32,4 40,23 58,23 42,35 z" /> - </group> - <group - android:translateX="2.6" - android:translateY="0.2" - android:scaleX="0.009" - android:scaleY="0.012"> - <path - android:fillColor="#fff" - android:pathData="M 48,54 L 31,42 15,54 21,35 6,23 25,23 32,4 40,23 58,23 42,35 z" /> - </group> - <group - android:translateX="3.4" - android:translateY="0.2" - android:scaleX="0.009" - android:scaleY="0.012"> - <path - android:fillColor="#fff" - android:pathData="M 48,54 L 31,42 15,54 21,35 6,23 25,23 32,4 40,23 58,23 42,35 z" /> - </group> - </group> - - <group - android:translateY="2.1" - android:translateX="0.4"> - <group - android:translateX="0.2" - android:translateY="0.2" - android:scaleX="0.009" - android:scaleY="0.012"> - <path - android:fillColor="#fff" - android:pathData="M 48,54 L 31,42 15,54 21,35 6,23 25,23 32,4 40,23 58,23 42,35 z" /> - </group> - <group - android:translateX="1.0" - android:translateY="0.2" - android:scaleX="0.009" - android:scaleY="0.012"> - <path - android:fillColor="#fff" - android:pathData="M 48,54 L 31,42 15,54 21,35 6,23 25,23 32,4 40,23 58,23 42,35 z" /> - </group> - <group - android:translateX="1.8" - android:translateY="0.2" - android:scaleX="0.009" - android:scaleY="0.012"> - <path - android:fillColor="#fff" - android:pathData="M 48,54 L 31,42 15,54 21,35 6,23 25,23 32,4 40,23 58,23 42,35 z" /> - </group> - <group - android:translateX="2.6" - android:translateY="0.2" - android:scaleX="0.009" - android:scaleY="0.012"> - <path - android:fillColor="#fff" - android:pathData="M 48,54 L 31,42 15,54 21,35 6,23 25,23 32,4 40,23 58,23 42,35 z" /> - </group> - <group - android:translateX="3.4" - android:translateY="0.2" - android:scaleX="0.009" - android:scaleY="0.012"> - <path - android:fillColor="#fff" - android:pathData="M 48,54 L 31,42 15,54 21,35 6,23 25,23 32,4 40,23 58,23 42,35 z" /> - </group> - </group> - - <group - android:translateY="3.6" - android:translateX="0.4"> - <group - android:translateX="0.2" - android:translateY="0.2" - android:scaleX="0.009" - android:scaleY="0.012"> - <path - android:fillColor="#fff" - android:pathData="M 48,54 L 31,42 15,54 21,35 6,23 25,23 32,4 40,23 58,23 42,35 z" /> - </group> - <group - android:translateX="1.0" - android:translateY="0.2" - android:scaleX="0.009" - android:scaleY="0.012"> - <path - android:fillColor="#fff" - android:pathData="M 48,54 L 31,42 15,54 21,35 6,23 25,23 32,4 40,23 58,23 42,35 z" /> - </group> - <group - android:translateX="1.8" - android:translateY="0.2" - android:scaleX="0.009" - android:scaleY="0.012"> - <path - android:fillColor="#fff" - android:pathData="M 48,54 L 31,42 15,54 21,35 6,23 25,23 32,4 40,23 58,23 42,35 z" /> - </group> - <group - android:translateX="2.6" - android:translateY="0.2" - android:scaleX="0.009" - android:scaleY="0.012"> - <path - android:fillColor="#fff" - android:pathData="M 48,54 L 31,42 15,54 21,35 6,23 25,23 32,4 40,23 58,23 42,35 z" /> - </group> - <group - android:translateX="3.4" - android:translateY="0.2" - android:scaleX="0.009" - android:scaleY="0.012"> - <path - android:fillColor="#fff" - android:pathData="M 48,54 L 31,42 15,54 21,35 6,23 25,23 32,4 40,23 58,23 42,35 z" /> - </group> - </group> - - <group - android:translateY="5.0" - android:translateX="0.4"> - <group - android:translateX="0.2" - android:translateY="0.2" - android:scaleX="0.009" - android:scaleY="0.012"> - <path - android:fillColor="#fff" - android:pathData="M 48,54 L 31,42 15,54 21,35 6,23 25,23 32,4 40,23 58,23 42,35 z" /> - </group> - <group - android:translateX="1.0" - android:translateY="0.2" - android:scaleX="0.009" - android:scaleY="0.012"> - <path - android:fillColor="#fff" - android:pathData="M 48,54 L 31,42 15,54 21,35 6,23 25,23 32,4 40,23 58,23 42,35 z" /> - </group> - <group - android:translateX="1.8" - android:translateY="0.2" - android:scaleX="0.009" - android:scaleY="0.012"> - <path - android:fillColor="#fff" - android:pathData="M 48,54 L 31,42 15,54 21,35 6,23 25,23 32,4 40,23 58,23 42,35 z" /> - </group> - <group - android:translateX="2.6" - android:translateY="0.2" - android:scaleX="0.009" - android:scaleY="0.012"> - <path - android:fillColor="#fff" - android:pathData="M 48,54 L 31,42 15,54 21,35 6,23 25,23 32,4 40,23 58,23 42,35 z" /> - </group> - <group - android:translateX="3.4" - android:translateY="0.2" - android:scaleX="0.009" - android:scaleY="0.012"> - <path - android:fillColor="#fff" - android:pathData="M 48,54 L 31,42 15,54 21,35 6,23 25,23 32,4 40,23 58,23 42,35 z" /> - </group> - </group> - -</vector> \ No newline at end of file diff --git a/android/app/src/main/res/drawable/ic_baseline_album_24.xml b/android/app/src/main/res/drawable/ic_baseline_album_24.xml deleted file mode 100644 index 58c0ba697..000000000 --- a/android/app/src/main/res/drawable/ic_baseline_album_24.xml +++ /dev/null @@ -1,10 +0,0 @@ -<vector xmlns:android="http://schemas.android.com/apk/res/android" - android:width="24dp" - android:height="24dp" - android:viewportWidth="24" - android:viewportHeight="24" - android:tint="?attr/colorControlNormal"> - <path - android:fillColor="@android:color/white" - android:pathData="M12,2C6.48,2 2,6.48 2,12s4.48,10 10,10 10,-4.48 10,-10S17.52,2 12,2zM12,16.5c-2.49,0 -4.5,-2.01 -4.5,-4.5S9.51,7.5 12,7.5s4.5,2.01 4.5,4.5 -2.01,4.5 -4.5,4.5zM12,11c-0.55,0 -1,0.45 -1,1s0.45,1 1,1 1,-0.45 1,-1 -0.45,-1 -1,-1z"/> -</vector> diff --git a/android/app/src/main/res/drawable/ic_baseline_arrow_back_24.xml b/android/app/src/main/res/drawable/ic_baseline_arrow_back_24.xml deleted file mode 100644 index 2a31b2ef3..000000000 --- a/android/app/src/main/res/drawable/ic_baseline_arrow_back_24.xml +++ /dev/null @@ -1,11 +0,0 @@ -<vector xmlns:android="http://schemas.android.com/apk/res/android" - android:width="24dp" - android:height="24dp" - android:viewportWidth="24" - android:viewportHeight="24" - android:tint="?attr/colorControlNormal" - android:autoMirrored="true"> - <path - android:fillColor="@android:color/white" - android:pathData="M20,11H7.83l5.59,-5.59L12,4l-8,8 8,8 1.41,-1.41L7.83,13H20v-2z"/> -</vector> diff --git a/android/app/src/main/res/drawable/ic_baseline_category_24.xml b/android/app/src/main/res/drawable/ic_baseline_category_24.xml deleted file mode 100644 index dead295df..000000000 --- a/android/app/src/main/res/drawable/ic_baseline_category_24.xml +++ /dev/null @@ -1,16 +0,0 @@ -<vector xmlns:android="http://schemas.android.com/apk/res/android" - android:width="24dp" - android:height="24dp" - android:viewportWidth="24" - android:viewportHeight="24" - android:tint="?attr/colorControlNormal"> - <path - android:fillColor="@android:color/white" - android:pathData="M12,2l-5.5,9h11z" /> - <path - android:fillColor="@android:color/white" - android:pathData="M17.5,17.5m-4.5,0a4.5,4.5 0,1 1,9 0a4.5,4.5 0,1 1,-9 0" /> - <path - android:fillColor="@android:color/white" - android:pathData="M3,13.5h8v8H3z" /> -</vector> diff --git a/android/app/src/main/res/drawable/ic_baseline_close_24.xml b/android/app/src/main/res/drawable/ic_baseline_close_24.xml deleted file mode 100644 index 16d6d37dd..000000000 --- a/android/app/src/main/res/drawable/ic_baseline_close_24.xml +++ /dev/null @@ -1,10 +0,0 @@ -<vector xmlns:android="http://schemas.android.com/apk/res/android" - android:width="24dp" - android:height="24dp" - android:viewportWidth="24" - android:viewportHeight="24" - android:tint="?attr/colorControlNormal"> - <path - android:fillColor="@android:color/white" - android:pathData="M19,6.41L17.59,5 12,10.59 6.41,5 5,6.41 10.59,12 5,17.59 6.41,19 12,13.41 17.59,19 19,17.59 13.41,12z"/> -</vector> diff --git a/android/app/src/main/res/drawable/ic_baseline_create_new_folder_24.xml b/android/app/src/main/res/drawable/ic_baseline_create_new_folder_24.xml deleted file mode 100644 index 78c162283..000000000 --- a/android/app/src/main/res/drawable/ic_baseline_create_new_folder_24.xml +++ /dev/null @@ -1,10 +0,0 @@ -<vector xmlns:android="http://schemas.android.com/apk/res/android" - android:width="24dp" - android:height="24dp" - android:viewportWidth="24" - android:viewportHeight="24" - android:tint="?attr/colorControlNormal"> - <path - android:fillColor="@android:color/white" - android:pathData="M20,6h-8l-2,-2L4,4c-1.11,0 -1.99,0.89 -1.99,2L2,18c0,1.11 0.89,2 2,2h16c1.11,0 2,-0.89 2,-2L22,8c0,-1.11 -0.89,-2 -2,-2zM19,14h-3v3h-2v-3h-3v-2h3L14,9h2v3h3v2z"/> -</vector> diff --git a/android/app/src/main/res/drawable/ic_baseline_delete_24.xml b/android/app/src/main/res/drawable/ic_baseline_delete_24.xml deleted file mode 100644 index 3c4030b03..000000000 --- a/android/app/src/main/res/drawable/ic_baseline_delete_24.xml +++ /dev/null @@ -1,10 +0,0 @@ -<vector xmlns:android="http://schemas.android.com/apk/res/android" - android:width="24dp" - android:height="24dp" - android:viewportWidth="24" - android:viewportHeight="24" - android:tint="?attr/colorControlNormal"> - <path - android:fillColor="@android:color/white" - android:pathData="M6,19c0,1.1 0.9,2 2,2h8c1.1,0 2,-0.9 2,-2V7H6v12zM19,4h-3.5l-1,-1h-5l-1,1H5v2h14V4z"/> -</vector> diff --git a/android/app/src/main/res/drawable/ic_baseline_delete_sweep_24.xml b/android/app/src/main/res/drawable/ic_baseline_delete_sweep_24.xml deleted file mode 100644 index 22560a4f9..000000000 --- a/android/app/src/main/res/drawable/ic_baseline_delete_sweep_24.xml +++ /dev/null @@ -1,10 +0,0 @@ -<vector xmlns:android="http://schemas.android.com/apk/res/android" - android:width="24dp" - android:height="24dp" - android:viewportWidth="24" - android:viewportHeight="24" - android:tint="?attr/colorControlNormal"> - <path - android:fillColor="@android:color/white" - android:pathData="M15,16h4v2h-4zM15,8h7v2h-7zM15,12h6v2h-6zM3,18c0,1.1 0.9,2 2,2h6c1.1,0 2,-0.9 2,-2L13,8L3,8v10zM14,5h-3l-1,-1L6,4L5,5L2,5v2h12z"/> -</vector> diff --git a/android/app/src/main/res/drawable/ic_baseline_exit_to_app_24.xml b/android/app/src/main/res/drawable/ic_baseline_exit_to_app_24.xml deleted file mode 100644 index ed42b700b..000000000 --- a/android/app/src/main/res/drawable/ic_baseline_exit_to_app_24.xml +++ /dev/null @@ -1,11 +0,0 @@ -<vector xmlns:android="http://schemas.android.com/apk/res/android" - android:width="24dp" - android:height="24dp" - android:viewportWidth="24" - android:viewportHeight="24" - android:tint="?attr/colorControlNormal" - android:autoMirrored="true"> - <path - android:fillColor="@android:color/white" - android:pathData="M10.09,15.59L11.5,17l5,-5 -5,-5 -1.41,1.41L12.67,11H3v2h9.67l-2.58,2.59zM19,3H5c-1.11,0 -2,0.9 -2,2v4h2V5h14v14H5v-4H3v4c0,1.1 0.89,2 2,2h14c1.1,0 2,-0.9 2,-2V5c0,-1.1 -0.9,-2 -2,-2z"/> -</vector> diff --git a/android/app/src/main/res/drawable/ic_baseline_fast_forward_24.xml b/android/app/src/main/res/drawable/ic_baseline_fast_forward_24.xml deleted file mode 100644 index e3f30c6c7..000000000 --- a/android/app/src/main/res/drawable/ic_baseline_fast_forward_24.xml +++ /dev/null @@ -1,10 +0,0 @@ -<vector xmlns:android="http://schemas.android.com/apk/res/android" - android:width="24dp" - android:height="24dp" - android:viewportWidth="24" - android:viewportHeight="24" - android:tint="?attr/colorControlNormal"> - <path - android:fillColor="@android:color/white" - android:pathData="M4,18l8.5,-6L4,6v12zM13,6v12l8.5,-6L13,6z"/> -</vector> diff --git a/android/app/src/main/res/drawable/ic_baseline_fast_rewind_24.xml b/android/app/src/main/res/drawable/ic_baseline_fast_rewind_24.xml deleted file mode 100644 index 81f79b322..000000000 --- a/android/app/src/main/res/drawable/ic_baseline_fast_rewind_24.xml +++ /dev/null @@ -1,10 +0,0 @@ -<vector xmlns:android="http://schemas.android.com/apk/res/android" - android:width="24dp" - android:height="24dp" - android:viewportWidth="24" - android:viewportHeight="24" - android:tint="?attr/colorControlNormal"> - <path - android:fillColor="@android:color/white" - android:pathData="M11,18L11,6l-8.5,6 8.5,6zM11.5,12l8.5,6L20,6l-8.5,6z"/> -</vector> diff --git a/android/app/src/main/res/drawable/ic_baseline_folder_24.xml b/android/app/src/main/res/drawable/ic_baseline_folder_24.xml deleted file mode 100644 index bbfe9c931..000000000 --- a/android/app/src/main/res/drawable/ic_baseline_folder_24.xml +++ /dev/null @@ -1,10 +0,0 @@ -<vector xmlns:android="http://schemas.android.com/apk/res/android" - android:width="24dp" - android:height="24dp" - android:viewportWidth="24" - android:viewportHeight="24" - android:tint="?attr/colorControlNormal"> - <path - android:fillColor="@android:color/white" - android:pathData="M10,4H4c-1.1,0 -1.99,0.9 -1.99,2L2,18c0,1.1 0.9,2 2,2h16c1.1,0 2,-0.9 2,-2V8c0,-1.1 -0.9,-2 -2,-2h-8l-2,-2z" /> -</vector> diff --git a/android/app/src/main/res/drawable/ic_baseline_folder_open_24.xml b/android/app/src/main/res/drawable/ic_baseline_folder_open_24.xml deleted file mode 100644 index f58b501e3..000000000 --- a/android/app/src/main/res/drawable/ic_baseline_folder_open_24.xml +++ /dev/null @@ -1,10 +0,0 @@ -<vector xmlns:android="http://schemas.android.com/apk/res/android" - android:width="24dp" - android:height="24dp" - android:viewportWidth="24" - android:viewportHeight="24" - android:tint="?attr/colorControlNormal"> - <path - android:fillColor="@android:color/white" - android:pathData="M20,6h-8l-2,-2L4,4c-1.1,0 -1.99,0.9 -1.99,2L2,18c0,1.1 0.9,2 2,2h16c1.1,0 2,-0.9 2,-2L22,8c0,-1.1 -0.9,-2 -2,-2zM20,18L4,18L4,8h16v10z"/> -</vector> diff --git a/android/app/src/main/res/drawable/ic_baseline_gamepad_24.xml b/android/app/src/main/res/drawable/ic_baseline_gamepad_24.xml deleted file mode 100644 index f4a8a8711..000000000 --- a/android/app/src/main/res/drawable/ic_baseline_gamepad_24.xml +++ /dev/null @@ -1,10 +0,0 @@ -<vector xmlns:android="http://schemas.android.com/apk/res/android" - android:width="24dp" - android:height="24dp" - android:viewportWidth="24" - android:viewportHeight="24" - android:tint="?attr/colorControlNormal"> - <path - android:fillColor="@android:color/white" - android:pathData="M15,7.5V2H9v5.5l3,3 3,-3zM7.5,9H2v6h5.5l3,-3 -3,-3zM9,16.5V22h6v-5.5l-3,-3 -3,3zM16.5,9l-3,3 3,3H22V9h-5.5z" /> -</vector> diff --git a/android/app/src/main/res/drawable/ic_baseline_grid_view_24.xml b/android/app/src/main/res/drawable/ic_baseline_grid_view_24.xml deleted file mode 100644 index 6d4f4a563..000000000 --- a/android/app/src/main/res/drawable/ic_baseline_grid_view_24.xml +++ /dev/null @@ -1,10 +0,0 @@ -<vector xmlns:android="http://schemas.android.com/apk/res/android" - android:width="24dp" - android:height="24dp" - android:viewportWidth="24" - android:viewportHeight="24" - android:tint="?attr/colorControlNormal"> - <path - android:fillColor="@android:color/white" - android:pathData="M3,3v8h8L11,3L3,3zM9,9L5,9L5,5h4v4zM3,13v8h8v-8L3,13zM9,19L5,19v-4h4v4zM13,3v8h8L21,3h-8zM19,9h-4L15,5h4v4zM13,13v8h8v-8h-8zM19,19h-4v-4h4v4z"/> -</vector> diff --git a/android/app/src/main/res/drawable/ic_baseline_help_24.xml b/android/app/src/main/res/drawable/ic_baseline_help_24.xml deleted file mode 100644 index c0c92681d..000000000 --- a/android/app/src/main/res/drawable/ic_baseline_help_24.xml +++ /dev/null @@ -1,10 +0,0 @@ -<vector xmlns:android="http://schemas.android.com/apk/res/android" - android:width="24dp" - android:height="24dp" - android:viewportWidth="24" - android:viewportHeight="24" - android:tint="?attr/colorControlNormal"> - <path - android:fillColor="@android:color/white" - android:pathData="M12,2C6.48,2 2,6.48 2,12s4.48,10 10,10 10,-4.48 10,-10S17.52,2 12,2zM13,19h-2v-2h2v2zM15.07,11.25l-0.9,0.92C13.45,12.9 13,13.5 13,15h-2v-0.5c0,-1.1 0.45,-2.1 1.17,-2.83l1.24,-1.26c0.37,-0.36 0.59,-0.86 0.59,-1.41 0,-1.1 -0.9,-2 -2,-2s-2,0.9 -2,2L8,9c0,-2.21 1.79,-4 4,-4s4,1.79 4,4c0,0.88 -0.36,1.68 -0.93,2.25z"/> -</vector> diff --git a/android/app/src/main/res/drawable/ic_baseline_import_contacts_24.xml b/android/app/src/main/res/drawable/ic_baseline_import_contacts_24.xml deleted file mode 100644 index 99a23c4db..000000000 --- a/android/app/src/main/res/drawable/ic_baseline_import_contacts_24.xml +++ /dev/null @@ -1,10 +0,0 @@ -<vector xmlns:android="http://schemas.android.com/apk/res/android" - android:width="24dp" - android:height="24dp" - android:viewportWidth="24" - android:viewportHeight="24" - android:tint="?attr/colorControlNormal"> - <path - android:fillColor="@android:color/white" - android:pathData="M17.5,4.5c-1.95,0 -4.05,0.4 -5.5,1.5c-1.45,-1.1 -3.55,-1.5 -5.5,-1.5S2.45,4.9 1,6v14.65c0,0.65 0.73,0.45 0.75,0.45C3.1,20.45 5.05,20 6.5,20c1.95,0 4.05,0.4 5.5,1.5c1.35,-0.85 3.8,-1.5 5.5,-1.5c1.65,0 3.35,0.3 4.75,1.05C22.66,21.26 23,20.86 23,20.6V6C21.51,4.88 19.37,4.5 17.5,4.5zM21,18.5c-1.1,-0.35 -2.3,-0.5 -3.5,-0.5c-1.7,0 -4.15,0.65 -5.5,1.5V8c1.35,-0.85 3.8,-1.5 5.5,-1.5c1.2,0 2.4,0.15 3.5,0.5V18.5z"/> -</vector> diff --git a/android/app/src/main/res/drawable/ic_baseline_insert_drive_file_24.xml b/android/app/src/main/res/drawable/ic_baseline_insert_drive_file_24.xml deleted file mode 100644 index 18b306228..000000000 --- a/android/app/src/main/res/drawable/ic_baseline_insert_drive_file_24.xml +++ /dev/null @@ -1,11 +0,0 @@ -<vector xmlns:android="http://schemas.android.com/apk/res/android" - android:width="24dp" - android:height="24dp" - android:viewportWidth="24" - android:viewportHeight="24" - android:tint="?attr/colorControlNormal" - android:autoMirrored="true"> - <path - android:fillColor="@android:color/white" - android:pathData="M6,2c-1.1,0 -1.99,0.9 -1.99,2L4,20c0,1.1 0.89,2 1.99,2L18,22c1.1,0 2,-0.9 2,-2L20,8l-6,-6L6,2zM13,9L13,3.5L18.5,9L13,9z"/> -</vector> diff --git a/android/app/src/main/res/drawable/ic_baseline_library_music_24.xml b/android/app/src/main/res/drawable/ic_baseline_library_music_24.xml deleted file mode 100644 index 2ba294bd7..000000000 --- a/android/app/src/main/res/drawable/ic_baseline_library_music_24.xml +++ /dev/null @@ -1,10 +0,0 @@ -<vector xmlns:android="http://schemas.android.com/apk/res/android" - android:width="24dp" - android:height="24dp" - android:viewportWidth="24" - android:viewportHeight="24" - android:tint="?attr/colorControlNormal"> - <path - android:fillColor="@android:color/white" - android:pathData="M20,2L8,2c-1.1,0 -2,0.9 -2,2v12c0,1.1 0.9,2 2,2h12c1.1,0 2,-0.9 2,-2L22,4c0,-1.1 -0.9,-2 -2,-2zM18,7h-3v5.5c0,1.38 -1.12,2.5 -2.5,2.5S10,13.88 10,12.5s1.12,-2.5 2.5,-2.5c0.57,0 1.08,0.19 1.5,0.51L14,5h4v2zM4,6L2,6v14c0,1.1 0.9,2 2,2h14v-2L4,20L4,6z"/> -</vector> diff --git a/android/app/src/main/res/drawable/ic_baseline_lock_24.xml b/android/app/src/main/res/drawable/ic_baseline_lock_24.xml deleted file mode 100644 index d6191026a..000000000 --- a/android/app/src/main/res/drawable/ic_baseline_lock_24.xml +++ /dev/null @@ -1,10 +0,0 @@ -<vector xmlns:android="http://schemas.android.com/apk/res/android" - android:width="24dp" - android:height="24dp" - android:viewportWidth="24" - android:viewportHeight="24" - android:tint="?attr/colorControlNormal"> - <path - android:fillColor="@android:color/white" - android:pathData="M18,8h-1L17,6c0,-2.76 -2.24,-5 -5,-5S7,3.24 7,6v2L6,8c-1.1,0 -2,0.9 -2,2v10c0,1.1 0.9,2 2,2h12c1.1,0 2,-0.9 2,-2L20,10c0,-1.1 -0.9,-2 -2,-2zM12,17c-1.1,0 -2,-0.9 -2,-2s0.9,-2 2,-2 2,0.9 2,2 -0.9,2 -2,2zM15.1,8L8.9,8L8.9,6c0,-1.71 1.39,-3.1 3.1,-3.1 1.71,0 3.1,1.39 3.1,3.1v2z"/> -</vector> diff --git a/android/app/src/main/res/drawable/ic_baseline_lock_open_24.xml b/android/app/src/main/res/drawable/ic_baseline_lock_open_24.xml deleted file mode 100644 index a11b70e62..000000000 --- a/android/app/src/main/res/drawable/ic_baseline_lock_open_24.xml +++ /dev/null @@ -1,10 +0,0 @@ -<vector xmlns:android="http://schemas.android.com/apk/res/android" - android:width="24dp" - android:height="24dp" - android:viewportWidth="24" - android:viewportHeight="24" - android:tint="?attr/colorControlNormal"> - <path - android:fillColor="@android:color/white" - android:pathData="M12,17c1.1,0 2,-0.9 2,-2s-0.9,-2 -2,-2 -2,0.9 -2,2 0.9,2 2,2zM18,8h-1L17,6c0,-2.76 -2.24,-5 -5,-5S7,3.24 7,6h1.9c0,-1.71 1.39,-3.1 3.1,-3.1 1.71,0 3.1,1.39 3.1,3.1v2L6,8c-1.1,0 -2,0.9 -2,2v10c0,1.1 0.9,2 2,2h12c1.1,0 2,-0.9 2,-2L20,10c0,-1.1 -0.9,-2 -2,-2zM18,20L6,20L6,10h12v10z"/> -</vector> diff --git a/android/app/src/main/res/drawable/ic_baseline_menu_24.xml b/android/app/src/main/res/drawable/ic_baseline_menu_24.xml deleted file mode 100644 index 4350ba96a..000000000 --- a/android/app/src/main/res/drawable/ic_baseline_menu_24.xml +++ /dev/null @@ -1,10 +0,0 @@ -<vector xmlns:android="http://schemas.android.com/apk/res/android" - android:width="24dp" - android:height="24dp" - android:viewportWidth="24" - android:viewportHeight="24" - android:tint="?attr/colorControlNormal"> - <path - android:fillColor="@android:color/white" - android:pathData="M3,18h18v-2L3,16v2zM3,13h18v-2L3,11v2zM3,6v2h18L21,6L3,6z"/> -</vector> diff --git a/android/app/src/main/res/drawable/ic_baseline_not_interested_60.xml b/android/app/src/main/res/drawable/ic_baseline_not_interested_60.xml deleted file mode 100644 index f5f7da3ae..000000000 --- a/android/app/src/main/res/drawable/ic_baseline_not_interested_60.xml +++ /dev/null @@ -1,5 +0,0 @@ -<vector android:height="60dp" android:tint="?attr/colorControlNormal" - android:viewportHeight="24" android:viewportWidth="24" - android:width="60dp" xmlns:android="http://schemas.android.com/apk/res/android"> - <path android:fillColor="@android:color/white" android:pathData="M12,2C6.48,2 2,6.48 2,12s4.48,10 10,10 10,-4.48 10,-10S17.52,2 12,2zM12,20c-4.42,0 -8,-3.58 -8,-8 0,-1.85 0.63,-3.55 1.69,-4.9L16.9,18.31C15.55,19.37 13.85,20 12,20zM18.31,16.9L7.1,5.69C8.45,4.63 10.15,4 12,4c4.42,0 8,3.58 8,8 0,1.85 -0.63,3.55 -1.69,4.9z"/> -</vector> diff --git a/android/app/src/main/res/drawable/ic_baseline_play_arrow_24.xml b/android/app/src/main/res/drawable/ic_baseline_play_arrow_24.xml deleted file mode 100644 index 41f4a52ed..000000000 --- a/android/app/src/main/res/drawable/ic_baseline_play_arrow_24.xml +++ /dev/null @@ -1,10 +0,0 @@ -<vector xmlns:android="http://schemas.android.com/apk/res/android" - android:width="24dp" - android:height="24dp" - android:viewportWidth="24" - android:viewportHeight="24" - android:tint="?attr/colorControlNormal"> - <path - android:fillColor="@android:color/white" - android:pathData="M8,5v14l11,-7z" /> -</vector> diff --git a/android/app/src/main/res/drawable/ic_baseline_playlist_play_24.xml b/android/app/src/main/res/drawable/ic_baseline_playlist_play_24.xml deleted file mode 100644 index 67f9b5735..000000000 --- a/android/app/src/main/res/drawable/ic_baseline_playlist_play_24.xml +++ /dev/null @@ -1,10 +0,0 @@ -<vector xmlns:android="http://schemas.android.com/apk/res/android" - android:width="24dp" - android:height="24dp" - android:viewportWidth="24" - android:viewportHeight="24" - android:tint="?attr/colorControlNormal"> - <path - android:fillColor="@android:color/white" - android:pathData="M4,10h12v2L4,12zM4,6h12v2L4,8zM4,14h8v2L4,16zM14,14v6l5,-3z" /> -</vector> diff --git a/android/app/src/main/res/drawable/ic_baseline_radio_button_checked_24.xml b/android/app/src/main/res/drawable/ic_baseline_radio_button_checked_24.xml deleted file mode 100644 index 05a669ab2..000000000 --- a/android/app/src/main/res/drawable/ic_baseline_radio_button_checked_24.xml +++ /dev/null @@ -1,10 +0,0 @@ -<vector xmlns:android="http://schemas.android.com/apk/res/android" - android:width="24dp" - android:height="24dp" - android:viewportWidth="24" - android:viewportHeight="24" - android:tint="?attr/colorControlNormal"> - <path - android:fillColor="@android:color/white" - android:pathData="M12,7c-2.76,0 -5,2.24 -5,5s2.24,5 5,5 5,-2.24 5,-5 -2.24,-5 -5,-5zM12,2C6.48,2 2,6.48 2,12s4.48,10 10,10 10,-4.48 10,-10S17.52,2 12,2zM12,20c-4.42,0 -8,-3.58 -8,-8s3.58,-8 8,-8 8,3.58 8,8 -3.58,8 -8,8z" /> -</vector> diff --git a/android/app/src/main/res/drawable/ic_baseline_radio_button_unchecked_24.xml b/android/app/src/main/res/drawable/ic_baseline_radio_button_unchecked_24.xml deleted file mode 100644 index 2d5445cbe..000000000 --- a/android/app/src/main/res/drawable/ic_baseline_radio_button_unchecked_24.xml +++ /dev/null @@ -1,10 +0,0 @@ -<vector xmlns:android="http://schemas.android.com/apk/res/android" - android:width="24dp" - android:height="24dp" - android:viewportWidth="24" - android:viewportHeight="24" - android:tint="?attr/colorControlNormal"> - <path - android:fillColor="@android:color/white" - android:pathData="M12,2C6.48,2 2,6.48 2,12s4.48,10 10,10 10,-4.48 10,-10S17.52,2 12,2zM12,20c-4.42,0 -8,-3.58 -8,-8s3.58,-8 8,-8 8,3.58 8,8 -3.58,8 -8,8z" /> -</vector> diff --git a/android/app/src/main/res/drawable/ic_baseline_restart_alt_24.xml b/android/app/src/main/res/drawable/ic_baseline_restart_alt_24.xml deleted file mode 100644 index 2f9f24ca9..000000000 --- a/android/app/src/main/res/drawable/ic_baseline_restart_alt_24.xml +++ /dev/null @@ -1,13 +0,0 @@ -<vector xmlns:android="http://schemas.android.com/apk/res/android" - android:width="24dp" - android:height="24dp" - android:viewportWidth="24" - android:viewportHeight="24" - android:tint="?attr/colorControlNormal"> - <path - android:fillColor="@android:color/white" - android:pathData="M12,5V2L8,6l4,4V7c3.31,0 6,2.69 6,6c0,2.97 -2.17,5.43 -5,5.91v2.02c3.95,-0.49 7,-3.85 7,-7.93C20,8.58 16.42,5 12,5z"/> - <path - android:fillColor="@android:color/white" - android:pathData="M6,13c0,-1.65 0.67,-3.15 1.76,-4.24L6.34,7.34C4.9,8.79 4,10.79 4,13c0,4.08 3.05,7.44 7,7.93v-2.02C8.17,18.43 6,15.97 6,13z"/> -</vector> diff --git a/android/app/src/main/res/drawable/ic_baseline_save_24.xml b/android/app/src/main/res/drawable/ic_baseline_save_24.xml deleted file mode 100644 index 955858d7d..000000000 --- a/android/app/src/main/res/drawable/ic_baseline_save_24.xml +++ /dev/null @@ -1,10 +0,0 @@ -<vector xmlns:android="http://schemas.android.com/apk/res/android" - android:width="24dp" - android:height="24dp" - android:viewportWidth="24" - android:viewportHeight="24" - android:tint="?attr/colorControlNormal"> - <path - android:fillColor="@android:color/white" - android:pathData="M17,3L5,3c-1.11,0 -2,0.9 -2,2v14c0,1.1 0.89,2 2,2h14c1.1,0 2,-0.9 2,-2L21,7l-4,-4zM12,19c-1.66,0 -3,-1.34 -3,-3s1.34,-3 3,-3 3,1.34 3,3 -1.34,3 -3,3zM15,9L5,9L5,5h10v4z" /> -</vector> diff --git a/android/app/src/main/res/drawable/ic_baseline_sd_card_24.xml b/android/app/src/main/res/drawable/ic_baseline_sd_card_24.xml deleted file mode 100644 index 84f6ea6ac..000000000 --- a/android/app/src/main/res/drawable/ic_baseline_sd_card_24.xml +++ /dev/null @@ -1,10 +0,0 @@ -<vector xmlns:android="http://schemas.android.com/apk/res/android" - android:width="24dp" - android:height="24dp" - android:viewportWidth="24" - android:viewportHeight="24" - android:tint="?attr/colorControlNormal"> - <path - android:fillColor="@android:color/white" - android:pathData="M18,2h-8L4.02,8 4,20c0,1.1 0.9,2 2,2h12c1.1,0 2,-0.9 2,-2L20,4c0,-1.1 -0.9,-2 -2,-2zM12,8h-2L10,4h2v4zM15,8h-2L13,4h2v4zM18,8h-2L16,4h2v4z"/> -</vector> diff --git a/android/app/src/main/res/drawable/ic_baseline_settings_24.xml b/android/app/src/main/res/drawable/ic_baseline_settings_24.xml deleted file mode 100644 index d99a8ae40..000000000 --- a/android/app/src/main/res/drawable/ic_baseline_settings_24.xml +++ /dev/null @@ -1,10 +0,0 @@ -<vector xmlns:android="http://schemas.android.com/apk/res/android" - android:width="24dp" - android:height="24dp" - android:viewportWidth="24" - android:viewportHeight="24" - android:tint="?attr/colorControlNormal"> - <path - android:fillColor="@android:color/white" - android:pathData="M19.14,12.94c0.04,-0.3 0.06,-0.61 0.06,-0.94c0,-0.32 -0.02,-0.64 -0.07,-0.94l2.03,-1.58c0.18,-0.14 0.23,-0.41 0.12,-0.61l-1.92,-3.32c-0.12,-0.22 -0.37,-0.29 -0.59,-0.22l-2.39,0.96c-0.5,-0.38 -1.03,-0.7 -1.62,-0.94L14.4,2.81c-0.04,-0.24 -0.24,-0.41 -0.48,-0.41h-3.84c-0.24,0 -0.43,0.17 -0.47,0.41L9.25,5.35C8.66,5.59 8.12,5.92 7.63,6.29L5.24,5.33c-0.22,-0.08 -0.47,0 -0.59,0.22L2.74,8.87C2.62,9.08 2.66,9.34 2.86,9.48l2.03,1.58C4.84,11.36 4.8,11.69 4.8,12s0.02,0.64 0.07,0.94l-2.03,1.58c-0.18,0.14 -0.23,0.41 -0.12,0.61l1.92,3.32c0.12,0.22 0.37,0.29 0.59,0.22l2.39,-0.96c0.5,0.38 1.03,0.7 1.62,0.94l0.36,2.54c0.05,0.24 0.24,0.41 0.48,0.41h3.84c0.24,0 0.44,-0.17 0.47,-0.41l0.36,-2.54c0.59,-0.24 1.13,-0.56 1.62,-0.94l2.39,0.96c0.22,0.08 0.47,0 0.59,-0.22l1.92,-3.32c0.12,-0.22 0.07,-0.47 -0.12,-0.61L19.14,12.94zM12,15.6c-1.98,0 -3.6,-1.62 -3.6,-3.6s1.62,-3.6 3.6,-3.6s3.6,1.62 3.6,3.6S13.98,15.6 12,15.6z" /> -</vector> diff --git a/android/app/src/main/res/drawable/ic_baseline_tips_and_updates_24.xml b/android/app/src/main/res/drawable/ic_baseline_tips_and_updates_24.xml deleted file mode 100644 index 93d588228..000000000 --- a/android/app/src/main/res/drawable/ic_baseline_tips_and_updates_24.xml +++ /dev/null @@ -1,10 +0,0 @@ -<vector xmlns:android="http://schemas.android.com/apk/res/android" - android:width="24dp" - android:height="24dp" - android:viewportWidth="24" - android:viewportHeight="24" - android:tint="?attr/colorControlNormal"> - <path - android:fillColor="@android:color/white" - android:pathData="M7,20h4c0,1.1 -0.9,2 -2,2S7,21.1 7,20zM5,19h8v-2H5V19zM16.5,9.5c0,3.82 -2.66,5.86 -3.77,6.5H5.27C4.16,15.36 1.5,13.32 1.5,9.5C1.5,5.36 4.86,2 9,2S16.5,5.36 16.5,9.5zM21.37,7.37L20,8l1.37,0.63L22,10l0.63,-1.37L24,8l-1.37,-0.63L22,6L21.37,7.37zM19,6l0.94,-2.06L22,3l-2.06,-0.94L19,0l-0.94,2.06L16,3l2.06,0.94L19,6z"/> -</vector> diff --git a/android/app/src/main/res/drawable/ic_baseline_touch_app_24.xml b/android/app/src/main/res/drawable/ic_baseline_touch_app_24.xml deleted file mode 100644 index 27f451658..000000000 --- a/android/app/src/main/res/drawable/ic_baseline_touch_app_24.xml +++ /dev/null @@ -1,10 +0,0 @@ -<vector xmlns:android="http://schemas.android.com/apk/res/android" - android:width="24dp" - android:height="24dp" - android:viewportWidth="24" - android:viewportHeight="24" - android:tint="?attr/colorControlNormal"> - <path - android:fillColor="@android:color/white" - android:pathData="M9,11.24V7.5C9,6.12 10.12,5 11.5,5S14,6.12 14,7.5v3.74c1.21,-0.81 2,-2.18 2,-3.74C16,5.01 13.99,3 11.5,3S7,5.01 7,7.5C7,9.06 7.79,10.43 9,11.24zM18.84,15.87l-4.54,-2.26c-0.17,-0.07 -0.35,-0.11 -0.54,-0.11H13v-6C13,6.67 12.33,6 11.5,6S10,6.67 10,7.5v10.74c-3.6,-0.76 -3.54,-0.75 -3.67,-0.75c-0.31,0 -0.59,0.13 -0.79,0.33l-0.79,0.8l4.94,4.94C9.96,23.83 10.34,24 10.75,24h6.79c0.75,0 1.33,-0.55 1.44,-1.28l0.75,-5.27c0.01,-0.07 0.02,-0.14 0.02,-0.2C19.75,16.63 19.37,16.09 18.84,15.87z"/> -</vector> diff --git a/android/app/src/main/res/drawable/ic_baseline_trophy_24.xml b/android/app/src/main/res/drawable/ic_baseline_trophy_24.xml deleted file mode 100644 index dbf6358f8..000000000 --- a/android/app/src/main/res/drawable/ic_baseline_trophy_24.xml +++ /dev/null @@ -1,10 +0,0 @@ -<vector xmlns:android="http://schemas.android.com/apk/res/android" - android:width="24dp" - android:height="24dp" - android:viewportWidth="24" - android:viewportHeight="24" - android:tint="?attr/colorControlNormal"> - <path - android:fillColor="@android:color/white" - android:pathData="M19,5h-2V3H7v2H5C3.9,5 3,5.9 3,7v1c0,2.55 1.92,4.63 4.39,4.94c0.63,1.5 1.98,2.63 3.61,2.96V19H7v2h10v-2h-4v-3.1c1.63,-0.33 2.98,-1.46 3.61,-2.96C19.08,12.63 21,10.55 21,8V7C21,5.9 20.1,5 19,5zM5,8V7h2v3.82C5.84,10.4 5,9.3 5,8zM19,8c0,1.3 -0.84,2.4 -2,2.82V7h2V8z"/> -</vector> diff --git a/android/app/src/main/res/drawable/ic_baseline_vibration_24.xml b/android/app/src/main/res/drawable/ic_baseline_vibration_24.xml deleted file mode 100644 index a9600b74e..000000000 --- a/android/app/src/main/res/drawable/ic_baseline_vibration_24.xml +++ /dev/null @@ -1,10 +0,0 @@ -<vector xmlns:android="http://schemas.android.com/apk/res/android" - android:width="24dp" - android:height="24dp" - android:viewportWidth="24" - android:viewportHeight="24" - android:tint="?attr/colorControlNormal"> - <path - android:fillColor="@android:color/white" - android:pathData="M0,15h2L2,9L0,9v6zM3,17h2L5,7L3,7v10zM22,9v6h2L24,9h-2zM19,17h2L21,7h-2v10zM16.5,3h-9C6.67,3 6,3.67 6,4.5v15c0,0.83 0.67,1.5 1.5,1.5h9c0.83,0 1.5,-0.67 1.5,-1.5v-15c0,-0.83 -0.67,-1.5 -1.5,-1.5zM16,19L8,19L8,5h8v14z"/> -</vector> diff --git a/android/app/src/main/res/drawable/ic_baseline_view_list_24.xml b/android/app/src/main/res/drawable/ic_baseline_view_list_24.xml deleted file mode 100644 index 9884aeb83..000000000 --- a/android/app/src/main/res/drawable/ic_baseline_view_list_24.xml +++ /dev/null @@ -1,10 +0,0 @@ -<vector xmlns:android="http://schemas.android.com/apk/res/android" - android:width="24dp" - android:height="24dp" - android:viewportWidth="24" - android:viewportHeight="24" - android:tint="?attr/colorControlNormal"> - <path - android:fillColor="@android:color/white" - android:pathData="M4,14h4v-4L4,10v4zM4,19h4v-4L4,15v4zM4,9h4L8,5L4,5v4zM9,14h12v-4L9,10v4zM9,19h12v-4L9,15v4zM9,5v4h12L21,5L9,5z"/> -</vector> diff --git a/android/app/src/main/res/drawable/ic_controller_a_button.xml b/android/app/src/main/res/drawable/ic_controller_a_button.xml deleted file mode 100644 index 74124b194..000000000 --- a/android/app/src/main/res/drawable/ic_controller_a_button.xml +++ /dev/null @@ -1,17 +0,0 @@ -<vector xmlns:android="http://schemas.android.com/apk/res/android" - android:width="100dp" - android:height="100dp" - android:viewportWidth="100" - android:viewportHeight="100"> - <path - android:pathData="M99.279,49.946A49.271,49.236 0,0 1,50.009 99.182,49.271 49.236,0 0,1 0.738,49.946 49.271,49.236 0,0 1,50.009 0.711,49.271 49.236,0 0,1 99.279,49.946Z" - android:strokeWidth="1.5" - android:fillColor="#000000" - android:strokeColor="#c8c8c8" - android:fillType="evenOdd" - android:fillAlpha="0"/> - <path - android:pathData="m61.587,68.222 l-4.369,-11.227h-14.376l-4.318,11.227h-4.623l14.173,-36.424h4.115l14.122,36.424zM55.846,52.931 L51.782,41.958q-0.152,-0.406 -0.508,-1.473 -0.356,-1.067 -0.711,-2.184 -0.305,-1.168 -0.508,-1.778 -0.356,1.575 -0.813,3.099 -0.457,1.473 -0.762,2.337l-4.115,10.973z" - android:fillColor="#c8c8c8" - android:strokeColor="#00000000"/> -</vector> diff --git a/android/app/src/main/res/drawable/ic_controller_a_button_pressed.xml b/android/app/src/main/res/drawable/ic_controller_a_button_pressed.xml deleted file mode 100644 index 302d83cce..000000000 --- a/android/app/src/main/res/drawable/ic_controller_a_button_pressed.xml +++ /dev/null @@ -1,16 +0,0 @@ -<vector xmlns:android="http://schemas.android.com/apk/res/android" - android:width="100dp" - android:height="100dp" - android:viewportWidth="100" - android:viewportHeight="100"> - <path - android:pathData="M99.279,49.946A49.271,49.236 0,0 1,50.009 99.182,49.271 49.236,0 0,1 0.738,49.946 49.271,49.236 0,0 1,50.009 0.711,49.271 49.236,0 0,1 99.279,49.946Z" - android:strokeWidth="1.5" - android:fillColor="#969696" - android:strokeColor="#c8c8c8" - android:fillType="evenOdd"/> - <path - android:pathData="m61.587,68.222 l-4.369,-11.227h-14.376l-4.318,11.227h-4.623l14.173,-36.424h4.115l14.122,36.424zM55.846,52.931 L51.782,41.958q-0.152,-0.406 -0.508,-1.473 -0.356,-1.067 -0.711,-2.184 -0.305,-1.168 -0.508,-1.778 -0.356,1.575 -0.813,3.099 -0.457,1.473 -0.762,2.337l-4.115,10.973z" - android:fillColor="#c8c8c8" - android:strokeColor="#00000000"/> -</vector> diff --git a/android/app/src/main/res/drawable/ic_controller_analog_base.xml b/android/app/src/main/res/drawable/ic_controller_analog_base.xml deleted file mode 100644 index 85168053b..000000000 --- a/android/app/src/main/res/drawable/ic_controller_analog_base.xml +++ /dev/null @@ -1,21 +0,0 @@ -<vector xmlns:android="http://schemas.android.com/apk/res/android" - android:width="194.89dp" - android:height="194.89dp" - android:viewportWidth="194.89" - android:viewportHeight="194.89"> - <path - android:pathData="M194.89,97.445A97.445,97.445 0,0 1,97.445 194.89,97.445 97.445,0 0,1 0,97.445 97.445,97.445 0,0 1,97.445 0,97.445 97.445,0 0,1 194.89,97.445Z" - android:strokeAlpha="0.50645" - android:fillColor="#1a1a1a" - android:fillAlpha="0.504414" /> - <path - android:pathData="M178.82,97.445A81.381,81.381 0,0 1,97.439 178.826,81.381 81.381,0 0,1 16.058,97.445 81.381,81.381 0,0 1,97.439 16.064,81.381 81.381,0 0,1 178.82,97.445Z" - android:strokeAlpha="0.50645" - android:fillColor="#333333" - android:fillAlpha="0.504414" /> - <path - android:pathData="M159.05,97.445A61.609,61.609 0,0 1,97.441 159.054,61.609 61.609,0 0,1 35.832,97.445 61.609,61.609 0,0 1,97.441 35.836,61.609 61.609,0 0,1 159.05,97.445Z" - android:strokeAlpha="0.50645" - android:fillColor="#1a1a1a" - android:fillAlpha="0.504414" /> -</vector> diff --git a/android/app/src/main/res/drawable/ic_controller_analog_button.xml b/android/app/src/main/res/drawable/ic_controller_analog_button.xml deleted file mode 100644 index fec0a0a6e..000000000 --- a/android/app/src/main/res/drawable/ic_controller_analog_button.xml +++ /dev/null @@ -1,17 +0,0 @@ -<vector xmlns:android="http://schemas.android.com/apk/res/android" - android:width="24dp" - android:height="24dp" - android:viewportWidth="24" - android:viewportHeight="24"> - <path - android:pathData="M0.6615,0.6614L23.7969,0.6614v23.0L0.6615,23.7969Z" - android:strokeAlpha="1" - android:strokeLineJoin="round" - android:strokeWidth="0.26458332" - android:fillColor="#00000000" - android:strokeColor="#e6e6e6" - android:strokeLineCap="round" /> - <path - android:fillColor="#e6e6e6" - android:pathData="M12,2C6.49,2 2,6.49 2,12s4.49,10 10,10 10,-4.49 10,-10S17.51,2 12,2zM12,20c-4.41,0 -8,-3.59 -8,-8s3.59,-8 8,-8 8,3.59 8,8 -3.59,8 -8,8zM15,12c0,1.66 -1.34,3 -3,3s-3,-1.34 -3,-3 1.34,-3 3,-3 3,1.34 3,3z"/> -</vector> diff --git a/android/app/src/main/res/drawable/ic_controller_analog_button_pressed.xml b/android/app/src/main/res/drawable/ic_controller_analog_button_pressed.xml deleted file mode 100644 index b08bd5e16..000000000 --- a/android/app/src/main/res/drawable/ic_controller_analog_button_pressed.xml +++ /dev/null @@ -1,17 +0,0 @@ -<vector xmlns:android="http://schemas.android.com/apk/res/android" - android:width="24dp" - android:height="24dp" - android:viewportWidth="24" - android:viewportHeight="24"> - <path - android:pathData="M0.6615,0.6614L23.7969,0.6614v23.0L0.6615,23.7969Z" - android:strokeAlpha="1" - android:strokeLineJoin="round" - android:strokeWidth="0.26458332" - android:fillColor="#4d4d4d" - android:strokeColor="#e6e6e6" - android:strokeLineCap="round" /> - <path - android:fillColor="#e6e6e6" - android:pathData="M12,2C6.49,2 2,6.49 2,12s4.49,10 10,10 10,-4.49 10,-10S17.51,2 12,2zM12,20c-4.41,0 -8,-3.59 -8,-8s3.59,-8 8,-8 8,3.59 8,8 -3.59,8 -8,8zM15,12c0,1.66 -1.34,3 -3,3s-3,-1.34 -3,-3 1.34,-3 3,-3 3,1.34 3,3z"/> -</vector> diff --git a/android/app/src/main/res/drawable/ic_controller_analog_stick_pressed.xml b/android/app/src/main/res/drawable/ic_controller_analog_stick_pressed.xml deleted file mode 100644 index 7304ff569..000000000 --- a/android/app/src/main/res/drawable/ic_controller_analog_stick_pressed.xml +++ /dev/null @@ -1,11 +0,0 @@ -<vector xmlns:android="http://schemas.android.com/apk/res/android" - android:width="191.756dp" - android:height="191.756dp" - android:viewportWidth="191.756" - android:viewportHeight="191.756"> - <path - android:pathData="M191.756,95.878A95.878,95.878 0,0 1,95.878 191.756,95.878 95.878,0 0,1 0,95.878 95.878,95.878 0,0 1,95.878 0,95.878 95.878,0 0,1 191.756,95.878Z" - android:strokeAlpha="0.8" - android:fillColor="#666666" - android:fillAlpha="0.796784" /> -</vector> diff --git a/android/app/src/main/res/drawable/ic_controller_analog_stick_unpressed.xml b/android/app/src/main/res/drawable/ic_controller_analog_stick_unpressed.xml deleted file mode 100644 index 121c376ba..000000000 --- a/android/app/src/main/res/drawable/ic_controller_analog_stick_unpressed.xml +++ /dev/null @@ -1,11 +0,0 @@ -<vector xmlns:android="http://schemas.android.com/apk/res/android" - android:width="191.756dp" - android:height="191.756dp" - android:viewportWidth="191.756" - android:viewportHeight="191.756"> - <path - android:pathData="M191.756,95.878A95.878,95.878 0,0 1,95.878 191.756,95.878 95.878,0 0,1 0,95.878 95.878,95.878 0,0 1,95.878 0,95.878 95.878,0 0,1 191.756,95.878Z" - android:strokeAlpha="0.50645" - android:fillColor="#666666" - android:fillAlpha="0.504414" /> -</vector> diff --git a/android/app/src/main/res/drawable/ic_controller_b_button.xml b/android/app/src/main/res/drawable/ic_controller_b_button.xml deleted file mode 100644 index 8f25810d9..000000000 --- a/android/app/src/main/res/drawable/ic_controller_b_button.xml +++ /dev/null @@ -1,17 +0,0 @@ -<vector xmlns:android="http://schemas.android.com/apk/res/android" - android:width="100dp" - android:height="100dp" - android:viewportWidth="100" - android:viewportHeight="100"> - <path - android:pathData="M99.279,49.946A49.271,49.236 0,0 1,50.009 99.182,49.271 49.236,0 0,1 0.738,49.946 49.271,49.236 0,0 1,50.009 0.711,49.271 49.236,0 0,1 99.279,49.946Z" - android:strokeWidth="1.5" - android:fillColor="#000000" - android:strokeColor="#c8c8c8" - android:fillType="evenOdd" - android:fillAlpha="0"/> - <path - android:pathData="m37.431,31.811h10.363q6.807,0 10.262,2.032 3.505,1.981 3.505,6.96 0,3.2 -1.778,5.334 -1.778,2.083 -5.131,2.692v0.254q2.286,0.356 4.115,1.321 1.88,0.965 2.946,2.743 1.067,1.778 1.067,4.623 0,4.928 -3.404,7.62 -3.353,2.692 -9.195,2.692h-12.751zM42.003,47.254h6.706q4.674,0 6.401,-1.473 1.727,-1.524 1.727,-4.47 0,-2.997 -2.134,-4.267 -2.083,-1.321 -6.706,-1.321h-5.994zM42.003,51.064v13.157h7.315q4.826,0 6.706,-1.88 1.88,-1.88 1.88,-4.928 0,-2.845 -1.981,-4.572 -1.93,-1.778 -6.96,-1.778z" - android:fillColor="#c8c8c8" - android:strokeColor="#00000000"/> -</vector> diff --git a/android/app/src/main/res/drawable/ic_controller_b_button_pressed.xml b/android/app/src/main/res/drawable/ic_controller_b_button_pressed.xml deleted file mode 100644 index 353d7e5f2..000000000 --- a/android/app/src/main/res/drawable/ic_controller_b_button_pressed.xml +++ /dev/null @@ -1,16 +0,0 @@ -<vector xmlns:android="http://schemas.android.com/apk/res/android" - android:width="100dp" - android:height="100dp" - android:viewportWidth="100" - android:viewportHeight="100"> - <path - android:pathData="M99.279,49.946A49.271,49.236 0,0 1,50.009 99.182,49.271 49.236,0 0,1 0.738,49.946 49.271,49.236 0,0 1,50.009 0.711,49.271 49.236,0 0,1 99.279,49.946Z" - android:strokeWidth="1.5" - android:fillColor="#969696" - android:strokeColor="#c8c8c8" - android:fillType="evenOdd"/> - <path - android:pathData="m37.431,31.811h10.363q6.807,0 10.262,2.032 3.505,1.981 3.505,6.96 0,3.2 -1.778,5.334 -1.778,2.083 -5.131,2.692v0.254q2.286,0.356 4.115,1.321 1.88,0.965 2.946,2.743 1.067,1.778 1.067,4.623 0,4.928 -3.404,7.62 -3.353,2.692 -9.195,2.692h-12.751zM42.003,47.254h6.706q4.674,0 6.401,-1.473 1.727,-1.524 1.727,-4.47 0,-2.997 -2.134,-4.267 -2.083,-1.321 -6.706,-1.321h-5.994zM42.003,51.064v13.157h7.315q4.826,0 6.706,-1.88 1.88,-1.88 1.88,-4.928 0,-2.845 -1.981,-4.572 -1.93,-1.778 -6.96,-1.778z" - android:fillColor="#c8c8c8" - android:strokeColor="#00000000"/> -</vector> diff --git a/android/app/src/main/res/drawable/ic_controller_circle_button.xml b/android/app/src/main/res/drawable/ic_controller_circle_button.xml deleted file mode 100644 index d9fa460c6..000000000 --- a/android/app/src/main/res/drawable/ic_controller_circle_button.xml +++ /dev/null @@ -1,19 +0,0 @@ -<vector xmlns:android="http://schemas.android.com/apk/res/android" - android:width="100dp" - android:height="100dp" - android:viewportWidth="26.458332" - android:viewportHeight="26.45833"> - <path - android:pathData="M13.2292,13.2292m-12.5677,0a12.5677,12.5677 0,1 1,25.1354 0a12.5677,12.5677 0,1 1,-25.1354 0" - android:strokeWidth="0.26458332" - android:fillColor="#00000000" - android:strokeColor="#ffffff" /> - <path - android:pathData="M13.2292,13.2292m-10.5833,0a10.5833,10.5833 0,1 1,21.1667 0a10.5833,10.5833 0,1 1,-21.1667 0" - android:strokeLineJoin="round" - android:strokeWidth="1.05833328" - android:fillColor="#00000000" - android:strokeColor="#ff0000" - android:fillAlpha="1" - android:strokeLineCap="butt" /> -</vector> diff --git a/android/app/src/main/res/drawable/ic_controller_circle_button_pressed.xml b/android/app/src/main/res/drawable/ic_controller_circle_button_pressed.xml deleted file mode 100644 index 47953d0c1..000000000 --- a/android/app/src/main/res/drawable/ic_controller_circle_button_pressed.xml +++ /dev/null @@ -1,19 +0,0 @@ -<vector xmlns:android="http://schemas.android.com/apk/res/android" - android:width="100dp" - android:height="100dp" - android:viewportWidth="26.458332" - android:viewportHeight="26.45833"> - <path - android:pathData="M13.2292,13.2292m-12.5677,0a12.5677,12.5677 0,1 1,25.1354 0a12.5677,12.5677 0,1 1,-25.1354 0" - android:strokeWidth="0.26458332" - android:fillColor="#4d4d4d" - android:strokeColor="#ffffff" /> - <path - android:pathData="M13.2292,13.2292m-10.5833,0a10.5833,10.5833 0,1 1,21.1667 0a10.5833,10.5833 0,1 1,-21.1667 0" - android:strokeLineJoin="round" - android:strokeWidth="1.05833328" - android:fillColor="#00000000" - android:strokeColor="#ff0000" - android:fillAlpha="1" - android:strokeLineCap="butt" /> -</vector> diff --git a/android/app/src/main/res/drawable/ic_controller_cross_button.xml b/android/app/src/main/res/drawable/ic_controller_cross_button.xml deleted file mode 100644 index b133bd616..000000000 --- a/android/app/src/main/res/drawable/ic_controller_cross_button.xml +++ /dev/null @@ -1,27 +0,0 @@ -<vector xmlns:android="http://schemas.android.com/apk/res/android" - android:width="100dp" - android:height="100dp" - android:viewportWidth="26.458332" - android:viewportHeight="26.45833"> - <path - android:pathData="M13.2292,13.2292m-12.5677,0a12.5677,12.5677 0,1 1,25.1354 0a12.5677,12.5677 0,1 1,-25.1354 0" - android:strokeWidth="0.26458332" - android:fillColor="#00000000" - android:strokeColor="#ffffff" /> - <path - android:pathData="m5.2917,5.2917 l15.875,15.875" - android:strokeAlpha="1" - android:strokeLineJoin="miter" - android:strokeWidth="1.05833333" - android:fillColor="#ffffff" - android:strokeColor="#008080" - android:strokeLineCap="butt" /> - <path - android:pathData="m5.2917,21.1667 l15.875,-15.875" - android:strokeAlpha="1" - android:strokeLineJoin="miter" - android:strokeWidth="1.05833333" - android:fillColor="#00000000" - android:strokeColor="#008080" - android:strokeLineCap="butt" /> -</vector> diff --git a/android/app/src/main/res/drawable/ic_controller_cross_button_pressed.xml b/android/app/src/main/res/drawable/ic_controller_cross_button_pressed.xml deleted file mode 100644 index b00988473..000000000 --- a/android/app/src/main/res/drawable/ic_controller_cross_button_pressed.xml +++ /dev/null @@ -1,27 +0,0 @@ -<vector xmlns:android="http://schemas.android.com/apk/res/android" - android:width="100dp" - android:height="100dp" - android:viewportWidth="26.458332" - android:viewportHeight="26.45833"> - <path - android:pathData="M13.2292,13.2292m-12.5677,0a12.5677,12.5677 0,1 1,25.1354 0a12.5677,12.5677 0,1 1,-25.1354 0" - android:strokeWidth="0.26458332" - android:fillColor="#4d4d4d" - android:strokeColor="#ffffff" /> - <path - android:pathData="m5.2917,5.2917 l15.875,15.875" - android:strokeAlpha="1" - android:strokeLineJoin="miter" - android:strokeWidth="1.05833333" - android:fillColor="#ffffff" - android:strokeColor="#008080" - android:strokeLineCap="butt" /> - <path - android:pathData="m5.2917,21.1667 l15.875,-15.875" - android:strokeAlpha="1" - android:strokeLineJoin="miter" - android:strokeWidth="1.05833333" - android:fillColor="#00000000" - android:strokeColor="#008080" - android:strokeLineCap="butt" /> -</vector> diff --git a/android/app/src/main/res/drawable/ic_controller_down_button.xml b/android/app/src/main/res/drawable/ic_controller_down_button.xml deleted file mode 100644 index 898f2c54f..000000000 --- a/android/app/src/main/res/drawable/ic_controller_down_button.xml +++ /dev/null @@ -1,14 +0,0 @@ -<vector xmlns:android="http://schemas.android.com/apk/res/android" - android:width="100dp" - android:height="100dp" - android:viewportWidth="26.458332" - android:viewportHeight="26.458332"> - <path - android:pathData="m5.2917,10.5833 l7.9375,-7.9375 7.9375,7.9375v14.5521L5.2917,25.1354Z" - android:strokeAlpha="1" - android:strokeLineJoin="miter" - android:strokeWidth="0.26458332" - android:fillColor="#00000000" - android:strokeColor="#e6e6e6" - android:strokeLineCap="butt" /> -</vector> diff --git a/android/app/src/main/res/drawable/ic_controller_down_button_pressed.xml b/android/app/src/main/res/drawable/ic_controller_down_button_pressed.xml deleted file mode 100644 index 4e7d5a35e..000000000 --- a/android/app/src/main/res/drawable/ic_controller_down_button_pressed.xml +++ /dev/null @@ -1,14 +0,0 @@ -<vector xmlns:android="http://schemas.android.com/apk/res/android" - android:width="100dp" - android:height="100dp" - android:viewportWidth="26.458332" - android:viewportHeight="26.458332"> - <path - android:pathData="m5.2917,10.5833 l7.9375,-7.9375 7.9375,7.9375v14.5521L5.2917,25.1354Z" - android:strokeAlpha="1" - android:strokeLineJoin="miter" - android:strokeWidth="0.26458332" - android:fillColor="#4d4d4d" - android:strokeColor="#e6e6e6" - android:strokeLineCap="butt" /> -</vector> diff --git a/android/app/src/main/res/drawable/ic_controller_fast_forward.xml b/android/app/src/main/res/drawable/ic_controller_fast_forward.xml deleted file mode 100644 index 37e89e29b..000000000 --- a/android/app/src/main/res/drawable/ic_controller_fast_forward.xml +++ /dev/null @@ -1,17 +0,0 @@ -<vector xmlns:android="http://schemas.android.com/apk/res/android" - android:width="24dp" - android:height="24dp" - android:viewportWidth="24" - android:viewportHeight="24"> - <path - android:pathData="M0.6615,0.6614L23.7969,0.6614v23.0L0.6615,23.7969Z" - android:strokeAlpha="1" - android:strokeLineJoin="round" - android:strokeWidth="0.26458332" - android:fillColor="#00000000" - android:strokeColor="#e6e6e6" - android:strokeLineCap="round" /> - <path - android:fillColor="#e6e6e6" - android:pathData="M4,18l8.5,-6L4,6v12zM13,6v12l8.5,-6L13,6z"/> -</vector> diff --git a/android/app/src/main/res/drawable/ic_controller_fast_forward_pressed.xml b/android/app/src/main/res/drawable/ic_controller_fast_forward_pressed.xml deleted file mode 100644 index 2a505aad8..000000000 --- a/android/app/src/main/res/drawable/ic_controller_fast_forward_pressed.xml +++ /dev/null @@ -1,17 +0,0 @@ -<vector xmlns:android="http://schemas.android.com/apk/res/android" - android:width="24dp" - android:height="24dp" - android:viewportWidth="24" - android:viewportHeight="24"> - <path - android:pathData="M0.6615,0.6614L23.7969,0.6614v23.0L0.6615,23.7969Z" - android:strokeAlpha="1" - android:strokeLineJoin="round" - android:strokeWidth="0.26458332" - android:fillColor="#4d4d4d" - android:strokeColor="#e6e6e6" - android:strokeLineCap="round" /> - <path - android:fillColor="#e6e6e6" - android:pathData="M4,18l8.5,-6L4,6v12zM13,6v12l8.5,-6L13,6z"/> -</vector> diff --git a/android/app/src/main/res/drawable/ic_controller_l1_button.xml b/android/app/src/main/res/drawable/ic_controller_l1_button.xml deleted file mode 100644 index 9f3ab7240..000000000 --- a/android/app/src/main/res/drawable/ic_controller_l1_button.xml +++ /dev/null @@ -1,28 +0,0 @@ -<vector xmlns:android="http://schemas.android.com/apk/res/android" - android:width="100dp" - android:height="50dp" - android:viewportWidth="26.458332" - android:viewportHeight="13.229165"> - <path - android:pathData="M0.6615,0.6614L25.7969,0.6614v11.9063L0.6615,12.5677Z" - android:strokeAlpha="1" - android:strokeLineJoin="round" - android:strokeWidth="0.26458332" - android:fillColor="#00000000" - android:strokeColor="#e6e6e6" - android:strokeLineCap="round" /> - <path - android:pathData="m9.6928,4.0428h0.6959v4.5579h2.5046v0.5857L9.6928,9.1863Z" - android:strokeAlpha="1" - android:strokeWidth="0.13229167" - android:fillColor="#000000" - android:strokeColor="#e6e6e6" - android:fillAlpha="0" /> - <path - android:pathData="m13.8028,8.6007h1.1369v-3.924l-1.2368,0.2481v-0.6339l1.2299,-0.248h0.6959v4.5579h1.1369v0.5857h-2.9628z" - android:strokeAlpha="1" - android:strokeWidth="0.13229167" - android:fillColor="#000000" - android:strokeColor="#e6e6e6" - android:fillAlpha="0" /> -</vector> diff --git a/android/app/src/main/res/drawable/ic_controller_l1_button_pressed.xml b/android/app/src/main/res/drawable/ic_controller_l1_button_pressed.xml deleted file mode 100644 index 06d625fe5..000000000 --- a/android/app/src/main/res/drawable/ic_controller_l1_button_pressed.xml +++ /dev/null @@ -1,28 +0,0 @@ -<vector xmlns:android="http://schemas.android.com/apk/res/android" - android:width="100dp" - android:height="50dp" - android:viewportWidth="26.458332" - android:viewportHeight="13.229165"> - <path - android:pathData="M0.6615,0.6614L25.7969,0.6614v11.9063L0.6615,12.5677Z" - android:strokeAlpha="1" - android:strokeLineJoin="round" - android:strokeWidth="0.26458332" - android:fillColor="#4d4d4d" - android:strokeColor="#e6e6e6" - android:strokeLineCap="round" /> - <path - android:pathData="m9.6928,4.0428h0.6959v4.5579h2.5046v0.5857L9.6928,9.1863Z" - android:strokeAlpha="1" - android:strokeWidth="0.13229167" - android:fillColor="#1a1a1a" - android:strokeColor="#000000" - android:fillAlpha="1" /> - <path - android:pathData="m13.8028,8.6007h1.1369v-3.924l-1.2368,0.2481v-0.6339l1.2299,-0.248h0.6959v4.5579h1.1369v0.5857h-2.9628z" - android:strokeAlpha="1" - android:strokeWidth="0.13229167" - android:fillColor="#1a1a1a" - android:strokeColor="#000000" - android:fillAlpha="1" /> -</vector> diff --git a/android/app/src/main/res/drawable/ic_controller_l2_button.xml b/android/app/src/main/res/drawable/ic_controller_l2_button.xml deleted file mode 100644 index 3853d103f..000000000 --- a/android/app/src/main/res/drawable/ic_controller_l2_button.xml +++ /dev/null @@ -1,28 +0,0 @@ -<vector xmlns:android="http://schemas.android.com/apk/res/android" - android:width="100dp" - android:height="50dp" - android:viewportWidth="26.458332" - android:viewportHeight="13.229165"> - <path - android:pathData="M0.6615,0.6614L25.7969,0.6614v11.9063L0.6615,12.5677Z" - android:strokeAlpha="1" - android:strokeLineJoin="round" - android:strokeWidth="0.26458332" - android:fillColor="#00000000" - android:strokeColor="#e6e6e6" - android:strokeLineCap="round" /> - <path - android:pathData="m9.6928,4.0428h0.6959v4.5579h2.5046v0.5857L9.6928,9.1863Z" - android:strokeAlpha="1" - android:strokeWidth="0.13229167" - android:fillColor="#000000" - android:strokeColor="#e6e6e6" - android:fillAlpha="0" /> - <path - android:pathData="m14.2816,8.6007h2.4288v0.5857h-3.2659v-0.5857q0.3962,-0.41 1.0783,-1.099 0.6856,-0.6925 0.8613,-0.8923 0.3342,-0.3755 0.4651,-0.6339 0.1344,-0.2618 0.1344,-0.5133 0,-0.41 -0.2894,-0.6683 -0.2859,-0.2584 -0.7476,-0.2584 -0.3273,0 -0.6925,0.1137 -0.3617,0.1137 -0.7751,0.3445v-0.7028q0.4203,-0.1688 0.7855,-0.2549 0.3652,-0.0861 0.6683,-0.0861 0.7993,0 1.2747,0.3996 0.4754,0.3996 0.4754,1.068 0,0.3169 -0.1206,0.6029 -0.1171,0.2825 -0.4306,0.6683 -0.0861,0.0999 -0.5478,0.5788 -0.4616,0.4754 -1.3022,1.3333z" - android:strokeAlpha="1" - android:strokeWidth="0.13229167" - android:fillColor="#000000" - android:strokeColor="#e6e6e6" - android:fillAlpha="0" /> -</vector> diff --git a/android/app/src/main/res/drawable/ic_controller_l2_button_pressed.xml b/android/app/src/main/res/drawable/ic_controller_l2_button_pressed.xml deleted file mode 100644 index eeaefb18b..000000000 --- a/android/app/src/main/res/drawable/ic_controller_l2_button_pressed.xml +++ /dev/null @@ -1,28 +0,0 @@ -<vector xmlns:android="http://schemas.android.com/apk/res/android" - android:width="100dp" - android:height="50dp" - android:viewportWidth="26.458332" - android:viewportHeight="13.229165"> - <path - android:pathData="M0.6615,0.6614L25.7969,0.6614v11.9063L0.6615,12.5677Z" - android:strokeAlpha="1" - android:strokeLineJoin="round" - android:strokeWidth="0.26458332" - android:fillColor="#4d4d4d" - android:strokeColor="#e6e6e6" - android:strokeLineCap="round" /> - <path - android:pathData="m9.6928,4.0428h0.6959v4.5579h2.5046v0.5857L9.6928,9.1863Z" - android:strokeAlpha="1" - android:strokeWidth="0.13229167" - android:fillColor="#1a1a1a" - android:strokeColor="#000000" - android:fillAlpha="1" /> - <path - android:pathData="m14.2816,8.6007h2.4288v0.5857h-3.2659v-0.5857q0.3962,-0.41 1.0783,-1.099 0.6856,-0.6925 0.8613,-0.8923 0.3342,-0.3755 0.4651,-0.6339 0.1344,-0.2618 0.1344,-0.5133 0,-0.41 -0.2894,-0.6683 -0.2859,-0.2584 -0.7476,-0.2584 -0.3273,0 -0.6925,0.1137 -0.3617,0.1137 -0.7751,0.3445v-0.7028q0.4203,-0.1688 0.7855,-0.2549 0.3652,-0.0861 0.6683,-0.0861 0.7993,0 1.2747,0.3996 0.4754,0.3996 0.4754,1.068 0,0.3169 -0.1206,0.6029 -0.1171,0.2825 -0.4306,0.6683 -0.0861,0.0999 -0.5478,0.5788 -0.4616,0.4754 -1.3022,1.3333z" - android:strokeAlpha="1" - android:strokeWidth="0.13229167" - android:fillColor="#1a1a1a" - android:strokeColor="#000000" - android:fillAlpha="1" /> -</vector> diff --git a/android/app/src/main/res/drawable/ic_controller_left_button.xml b/android/app/src/main/res/drawable/ic_controller_left_button.xml deleted file mode 100644 index ccd46c3cc..000000000 --- a/android/app/src/main/res/drawable/ic_controller_left_button.xml +++ /dev/null @@ -1,14 +0,0 @@ -<vector xmlns:android="http://schemas.android.com/apk/res/android" - android:width="100dp" - android:height="100dp" - android:viewportWidth="26.458332" - android:viewportHeight="26.458332"> - <path - android:pathData="m16.5365,5.9531 l7.9375,7.9375 -7.9375,7.9375L1.9844,21.8281v-15.875z" - android:strokeAlpha="1" - android:strokeLineJoin="miter" - android:strokeWidth="0.26458332" - android:fillColor="#00000000" - android:strokeColor="#e6e6e6" - android:strokeLineCap="butt" /> -</vector> diff --git a/android/app/src/main/res/drawable/ic_controller_left_button_pressed.xml b/android/app/src/main/res/drawable/ic_controller_left_button_pressed.xml deleted file mode 100644 index 39c1de9e1..000000000 --- a/android/app/src/main/res/drawable/ic_controller_left_button_pressed.xml +++ /dev/null @@ -1,14 +0,0 @@ -<vector xmlns:android="http://schemas.android.com/apk/res/android" - android:width="100dp" - android:height="100dp" - android:viewportWidth="26.458332" - android:viewportHeight="26.458332"> - <path - android:pathData="m16.5365,5.9531 l7.9375,7.9375 -7.9375,7.9375L1.9844,21.8281v-15.875z" - android:strokeAlpha="1" - android:strokeLineJoin="miter" - android:strokeWidth="0.26458332" - android:fillColor="#4d4d4d" - android:strokeColor="#e6e6e6" - android:strokeLineCap="butt" /> -</vector> diff --git a/android/app/src/main/res/drawable/ic_controller_pause_button.xml b/android/app/src/main/res/drawable/ic_controller_pause_button.xml deleted file mode 100644 index 9b64f42b0..000000000 --- a/android/app/src/main/res/drawable/ic_controller_pause_button.xml +++ /dev/null @@ -1,9 +0,0 @@ -<vector xmlns:android="http://schemas.android.com/apk/res/android" - android:width="24dp" - android:height="24dp" - android:viewportWidth="24" - android:viewportHeight="24"> - <path - android:fillColor="#4d4d4d" - android:pathData="M9,16h2L11,8L9,8v8zM12,2C6.48,2 2,6.48 2,12s4.48,10 10,10 10,-4.48 10,-10S17.52,2 12,2zM12,20c-4.41,0 -8,-3.59 -8,-8s3.59,-8 8,-8 8,3.59 8,8 -3.59,8 -8,8zM13,16h2L15,8h-2v8z"/> -</vector> diff --git a/android/app/src/main/res/drawable/ic_controller_quick_load_button.xml b/android/app/src/main/res/drawable/ic_controller_quick_load_button.xml deleted file mode 100644 index f4197876c..000000000 --- a/android/app/src/main/res/drawable/ic_controller_quick_load_button.xml +++ /dev/null @@ -1,9 +0,0 @@ -<vector xmlns:android="http://schemas.android.com/apk/res/android" - android:width="24dp" - android:height="24dp" - android:viewportWidth="24" - android:viewportHeight="24"> - <path - android:fillColor="#4d4d4d" - android:pathData="M14,12c0,-1.1 -0.9,-2 -2,-2s-2,0.9 -2,2 0.9,2 2,2 2,-0.9 2,-2zM12,3c-4.97,0 -9,4.03 -9,9L0,12l4,4 4,-4L5,12c0,-3.87 3.13,-7 7,-7s7,3.13 7,7 -3.13,7 -7,7c-1.51,0 -2.91,-0.49 -4.06,-1.3l-1.42,1.44C8.04,20.3 9.94,21 12,21c4.97,0 9,-4.03 9,-9s-4.03,-9 -9,-9z"/> -</vector> diff --git a/android/app/src/main/res/drawable/ic_controller_quick_save_button.xml b/android/app/src/main/res/drawable/ic_controller_quick_save_button.xml deleted file mode 100644 index 2a81bac25..000000000 --- a/android/app/src/main/res/drawable/ic_controller_quick_save_button.xml +++ /dev/null @@ -1,9 +0,0 @@ -<vector xmlns:android="http://schemas.android.com/apk/res/android" - android:width="24dp" - android:height="24dp" - android:viewportWidth="24" - android:viewportHeight="24"> - <path - android:fillColor="#4d4d4d" - android:pathData="M17,3L5,3c-1.11,0 -2,0.9 -2,2v14c0,1.1 0.89,2 2,2h14c1.1,0 2,-0.9 2,-2L21,7l-4,-4zM12,19c-1.66,0 -3,-1.34 -3,-3s1.34,-3 3,-3 3,1.34 3,3 -1.34,3 -3,3zM15,9L5,9L5,5h10v4z"/> -</vector> diff --git a/android/app/src/main/res/drawable/ic_controller_r1_button.xml b/android/app/src/main/res/drawable/ic_controller_r1_button.xml deleted file mode 100644 index 3130def38..000000000 --- a/android/app/src/main/res/drawable/ic_controller_r1_button.xml +++ /dev/null @@ -1,28 +0,0 @@ -<vector xmlns:android="http://schemas.android.com/apk/res/android" - android:width="100dp" - android:height="50dp" - android:viewportWidth="26.458332" - android:viewportHeight="13.229165"> - <path - android:pathData="M0.6615,0.6614L25.7969,0.6614v11.9063L0.6615,12.5677Z" - android:strokeAlpha="1" - android:strokeLineJoin="round" - android:strokeWidth="0.26458332" - android:fillColor="#00000000" - android:strokeColor="#e6e6e6" - android:strokeLineCap="round" /> - <path - android:pathData="m11.6703,6.8213q0.2239,0.0758 0.4341,0.3238 0.2136,0.248 0.4272,0.6821l0.7062,1.4056h-0.7476l-0.658,-1.3195q-0.2549,-0.5168 -0.4961,-0.6856 -0.2377,-0.1688 -0.6511,-0.1688L9.927,7.059v2.1739L9.2311,9.2329v-5.1435h1.571q0.8819,0 1.316,0.3686 0.4341,0.3686 0.4341,1.1128 0,0.4858 -0.2274,0.8062 -0.2239,0.3204 -0.6546,0.4444zM9.927,4.6612v1.8259h0.8751q0.503,0 0.7579,-0.2308 0.2584,-0.2343 0.2584,-0.6856 0,-0.4513 -0.2584,-0.6787 -0.2549,-0.2308 -0.7579,-0.2308z" - android:strokeAlpha="1" - android:strokeWidth="0.13229167" - android:fillColor="#000000" - android:strokeColor="#e6e6e6" - android:fillAlpha="0" /> - <path - android:pathData="m14.3195,8.6472h1.1369v-3.924l-1.2368,0.2481v-0.6339l1.2299,-0.248h0.6959v4.5579h1.1369v0.5857h-2.9628z" - android:strokeAlpha="1" - android:strokeWidth="0.13229167" - android:fillColor="#000000" - android:strokeColor="#e6e6e6" - android:fillAlpha="0" /> -</vector> diff --git a/android/app/src/main/res/drawable/ic_controller_r1_button_pressed.xml b/android/app/src/main/res/drawable/ic_controller_r1_button_pressed.xml deleted file mode 100644 index 352ddbc6a..000000000 --- a/android/app/src/main/res/drawable/ic_controller_r1_button_pressed.xml +++ /dev/null @@ -1,28 +0,0 @@ -<vector xmlns:android="http://schemas.android.com/apk/res/android" - android:width="100dp" - android:height="50dp" - android:viewportWidth="26.458332" - android:viewportHeight="13.229165"> - <path - android:pathData="M0.6615,0.6614L25.7969,0.6614v11.9063L0.6615,12.5677Z" - android:strokeAlpha="1" - android:strokeLineJoin="round" - android:strokeWidth="0.26458332" - android:fillColor="#4d4d4d" - android:strokeColor="#e6e6e6" - android:strokeLineCap="round" /> - <path - android:pathData="m11.6703,6.8213q0.2239,0.0758 0.4341,0.3238 0.2136,0.248 0.4272,0.6821l0.7062,1.4056h-0.7476l-0.658,-1.3195q-0.2549,-0.5168 -0.4961,-0.6856 -0.2377,-0.1688 -0.6511,-0.1688L9.927,7.059v2.1739L9.2311,9.2329v-5.1435h1.571q0.8819,0 1.316,0.3686 0.4341,0.3686 0.4341,1.1128 0,0.4858 -0.2274,0.8062 -0.2239,0.3204 -0.6546,0.4444zM9.927,4.6612v1.8259h0.8751q0.503,0 0.7579,-0.2308 0.2584,-0.2343 0.2584,-0.6856 0,-0.4513 -0.2584,-0.6787 -0.2549,-0.2308 -0.7579,-0.2308z" - android:strokeAlpha="1" - android:strokeWidth="0.13229167" - android:fillColor="#1a1a1a" - android:strokeColor="#000000" - android:fillAlpha="1" /> - <path - android:pathData="m14.3195,8.6472h1.1369v-3.924l-1.2368,0.2481v-0.6339l1.2299,-0.248h0.6959v4.5579h1.1369v0.5857h-2.9628z" - android:strokeAlpha="1" - android:strokeWidth="0.13229167" - android:fillColor="#1a1a1a" - android:strokeColor="#000000" - android:fillAlpha="1" /> -</vector> diff --git a/android/app/src/main/res/drawable/ic_controller_r2_button.xml b/android/app/src/main/res/drawable/ic_controller_r2_button.xml deleted file mode 100644 index 195fbe85d..000000000 --- a/android/app/src/main/res/drawable/ic_controller_r2_button.xml +++ /dev/null @@ -1,28 +0,0 @@ -<vector xmlns:android="http://schemas.android.com/apk/res/android" - android:width="100dp" - android:height="50dp" - android:viewportWidth="26.458332" - android:viewportHeight="13.229165"> - <path - android:pathData="M0.6615,0.6614L25.7969,0.6614v11.9063L0.6615,12.5677Z" - android:strokeAlpha="1" - android:strokeLineJoin="round" - android:strokeWidth="0.26458332" - android:fillColor="#00000000" - android:strokeColor="#e6e6e6" - android:strokeLineCap="round" /> - <path - android:pathData="m11.6703,6.8213q0.2239,0.0758 0.4341,0.3238 0.2136,0.248 0.4272,0.6821l0.7062,1.4056h-0.7476l-0.658,-1.3195q-0.2549,-0.5168 -0.4961,-0.6856 -0.2377,-0.1688 -0.6511,-0.1688L9.927,7.059v2.1739L9.2311,9.2329v-5.1435h1.571q0.8819,0 1.316,0.3686 0.4341,0.3686 0.4341,1.1128 0,0.4858 -0.2274,0.8062 -0.2239,0.3204 -0.6546,0.4444zM9.927,4.6612v1.8259h0.8751q0.503,0 0.7579,-0.2308 0.2584,-0.2343 0.2584,-0.6856 0,-0.4513 -0.2584,-0.6787 -0.2549,-0.2308 -0.7579,-0.2308z" - android:strokeAlpha="1" - android:strokeWidth="0.13229167" - android:fillColor="#000000" - android:strokeColor="#e6e6e6" - android:fillAlpha="0" /> - <path - android:pathData="m14.7984,8.6472h2.4288v0.5857h-3.2659v-0.5857q0.3962,-0.41 1.0783,-1.099 0.6856,-0.6925 0.8613,-0.8923 0.3342,-0.3755 0.4651,-0.6339 0.1344,-0.2618 0.1344,-0.5133 0,-0.41 -0.2894,-0.6683 -0.2859,-0.2584 -0.7476,-0.2584 -0.3273,0 -0.6925,0.1137 -0.3617,0.1137 -0.7751,0.3445v-0.7028q0.4203,-0.1688 0.7855,-0.2549 0.3652,-0.0861 0.6683,-0.0861 0.7993,0 1.2747,0.3996 0.4754,0.3996 0.4754,1.068 0,0.3169 -0.1206,0.6029 -0.1171,0.2825 -0.4306,0.6683 -0.0861,0.0999 -0.5478,0.5788 -0.4616,0.4754 -1.3022,1.3333z" - android:strokeAlpha="1" - android:strokeWidth="0.13229167" - android:fillColor="#000000" - android:strokeColor="#e6e6e6" - android:fillAlpha="0" /> -</vector> diff --git a/android/app/src/main/res/drawable/ic_controller_r2_button_pressed.xml b/android/app/src/main/res/drawable/ic_controller_r2_button_pressed.xml deleted file mode 100644 index 640c36863..000000000 --- a/android/app/src/main/res/drawable/ic_controller_r2_button_pressed.xml +++ /dev/null @@ -1,28 +0,0 @@ -<vector xmlns:android="http://schemas.android.com/apk/res/android" - android:width="100dp" - android:height="50dp" - android:viewportWidth="26.458332" - android:viewportHeight="13.229165"> - <path - android:pathData="M0.6615,0.6614L25.7969,0.6614v11.9063L0.6615,12.5677Z" - android:strokeAlpha="1" - android:strokeLineJoin="round" - android:strokeWidth="0.26458332" - android:fillColor="#4d4d4d" - android:strokeColor="#e6e6e6" - android:strokeLineCap="round" /> - <path - android:pathData="m11.6703,6.8213q0.2239,0.0758 0.4341,0.3238 0.2136,0.248 0.4272,0.6821l0.7062,1.4056h-0.7476l-0.658,-1.3195q-0.2549,-0.5168 -0.4961,-0.6856 -0.2377,-0.1688 -0.6511,-0.1688L9.927,7.059v2.1739L9.2311,9.2329v-5.1435h1.571q0.8819,0 1.316,0.3686 0.4341,0.3686 0.4341,1.1128 0,0.4858 -0.2274,0.8062 -0.2239,0.3204 -0.6546,0.4444zM9.927,4.6612v1.8259h0.8751q0.503,0 0.7579,-0.2308 0.2584,-0.2343 0.2584,-0.6856 0,-0.4513 -0.2584,-0.6787 -0.2549,-0.2308 -0.7579,-0.2308z" - android:strokeAlpha="1" - android:strokeWidth="0.13229167" - android:fillColor="#1a1a1a" - android:strokeColor="#000000" - android:fillAlpha="1" /> - <path - android:pathData="m14.7984,8.6472h2.4288v0.5857h-3.2659v-0.5857q0.3962,-0.41 1.0783,-1.099 0.6856,-0.6925 0.8613,-0.8923 0.3342,-0.3755 0.4651,-0.6339 0.1344,-0.2618 0.1344,-0.5133 0,-0.41 -0.2894,-0.6683 -0.2859,-0.2584 -0.7476,-0.2584 -0.3273,0 -0.6925,0.1137 -0.3617,0.1137 -0.7751,0.3445v-0.7028q0.4203,-0.1688 0.7855,-0.2549 0.3652,-0.0861 0.6683,-0.0861 0.7993,0 1.2747,0.3996 0.4754,0.3996 0.4754,1.068 0,0.3169 -0.1206,0.6029 -0.1171,0.2825 -0.4306,0.6683 -0.0861,0.0999 -0.5478,0.5788 -0.4616,0.4754 -1.3022,1.3333z" - android:strokeAlpha="1" - android:strokeWidth="0.13229167" - android:fillColor="#1a1a1a" - android:strokeColor="#000000" - android:fillAlpha="1" /> -</vector> diff --git a/android/app/src/main/res/drawable/ic_controller_right_button.xml b/android/app/src/main/res/drawable/ic_controller_right_button.xml deleted file mode 100644 index 8545a61ce..000000000 --- a/android/app/src/main/res/drawable/ic_controller_right_button.xml +++ /dev/null @@ -1,14 +0,0 @@ -<vector xmlns:android="http://schemas.android.com/apk/res/android" - android:width="100dp" - android:height="100dp" - android:viewportWidth="26.458332" - android:viewportHeight="26.458332"> - <path - android:pathData="m9.9219,21.8281 l-7.9375,-7.9375 7.9375,-7.9375L24.474,5.9531v15.875z" - android:strokeAlpha="1" - android:strokeLineJoin="miter" - android:strokeWidth="0.26458332" - android:fillColor="#00000000" - android:strokeColor="#e6e6e6" - android:strokeLineCap="butt" /> -</vector> diff --git a/android/app/src/main/res/drawable/ic_controller_right_button_pressed.xml b/android/app/src/main/res/drawable/ic_controller_right_button_pressed.xml deleted file mode 100644 index f0cff05ba..000000000 --- a/android/app/src/main/res/drawable/ic_controller_right_button_pressed.xml +++ /dev/null @@ -1,14 +0,0 @@ -<vector xmlns:android="http://schemas.android.com/apk/res/android" - android:width="100dp" - android:height="100dp" - android:viewportWidth="26.458332" - android:viewportHeight="26.458332"> - <path - android:pathData="m9.9219,21.8281 l-7.9375,-7.9375 7.9375,-7.9375L24.474,5.9531v15.875z" - android:strokeAlpha="1" - android:strokeLineJoin="miter" - android:strokeWidth="0.26458332" - android:fillColor="#4d4d4d" - android:strokeColor="#e6e6e6" - android:strokeLineCap="butt" /> -</vector> diff --git a/android/app/src/main/res/drawable/ic_controller_select_button.xml b/android/app/src/main/res/drawable/ic_controller_select_button.xml deleted file mode 100644 index bea56389c..000000000 --- a/android/app/src/main/res/drawable/ic_controller_select_button.xml +++ /dev/null @@ -1,14 +0,0 @@ -<vector xmlns:android="http://schemas.android.com/apk/res/android" - android:width="100dp" - android:height="50dp" - android:viewportWidth="26.458332" - android:viewportHeight="13.229165"> - <path - android:pathData="m0.6615,0.6614v11.9063L25.7969,12.5677v-11.9063z" - android:strokeAlpha="1" - android:strokeLineJoin="miter" - android:strokeWidth="0.26458332" - android:fillColor="#00000000" - android:strokeColor="#6e6e6f" - android:strokeLineCap="butt" /> -</vector> diff --git a/android/app/src/main/res/drawable/ic_controller_select_button_pressed.xml b/android/app/src/main/res/drawable/ic_controller_select_button_pressed.xml deleted file mode 100644 index a34a925d4..000000000 --- a/android/app/src/main/res/drawable/ic_controller_select_button_pressed.xml +++ /dev/null @@ -1,14 +0,0 @@ -<vector xmlns:android="http://schemas.android.com/apk/res/android" - android:width="100dp" - android:height="50dp" - android:viewportWidth="26.458332" - android:viewportHeight="13.229165"> - <path - android:pathData="m0.6615,0.6614v11.9063L25.7969,12.5677v-11.9063z" - android:strokeAlpha="1" - android:strokeLineJoin="miter" - android:strokeWidth="0.26458332" - android:fillColor="#4d4d4d" - android:strokeColor="#6e6e6f" - android:strokeLineCap="butt" /> -</vector> diff --git a/android/app/src/main/res/drawable/ic_controller_square_button.xml b/android/app/src/main/res/drawable/ic_controller_square_button.xml deleted file mode 100644 index 0da658c01..000000000 --- a/android/app/src/main/res/drawable/ic_controller_square_button.xml +++ /dev/null @@ -1,20 +0,0 @@ -<vector xmlns:android="http://schemas.android.com/apk/res/android" - android:width="100dp" - android:height="100dp" - android:viewportWidth="26.458332" - android:viewportHeight="26.45833"> - <path - android:pathData="M13.2292,13.2292m-12.5677,0a12.5677,12.5677 0,1 1,25.1354 0a12.5677,12.5677 0,1 1,-25.1354 0" - android:strokeWidth="0.26458332" - android:fillColor="#00000000" - android:strokeColor="#ffffff" /> - <path - android:pathData="M5.2917,5.2917L21.1667,5.2917v15.875L5.2917,21.1667v-15.875" - android:strokeAlpha="1" - android:strokeLineJoin="miter" - android:strokeWidth="1.05833333" - android:fillColor="#00000000" - android:fillAlpha="1" - android:strokeColor="#ff00ff" - android:strokeLineCap="square" /> -</vector> diff --git a/android/app/src/main/res/drawable/ic_controller_square_button_pressed.xml b/android/app/src/main/res/drawable/ic_controller_square_button_pressed.xml deleted file mode 100644 index 248a1d400..000000000 --- a/android/app/src/main/res/drawable/ic_controller_square_button_pressed.xml +++ /dev/null @@ -1,20 +0,0 @@ -<vector xmlns:android="http://schemas.android.com/apk/res/android" - android:width="100dp" - android:height="100dp" - android:viewportWidth="26.458332" - android:viewportHeight="26.45833"> - <path - android:pathData="M13.2292,13.2292m-12.5677,0a12.5677,12.5677 0,1 1,25.1354 0a12.5677,12.5677 0,1 1,-25.1354 0" - android:strokeWidth="0.26458332" - android:fillColor="#4d4d4d" - android:strokeColor="#ffffff" /> - <path - android:pathData="M5.2917,5.2917L21.1667,5.2917v15.875L5.2917,21.1667v-15.875" - android:strokeAlpha="1" - android:strokeLineJoin="miter" - android:strokeWidth="1.05833333" - android:fillColor="#00000000" - android:fillAlpha="1" - android:strokeColor="#ff00ff" - android:strokeLineCap="square" /> -</vector> diff --git a/android/app/src/main/res/drawable/ic_controller_start_button.xml b/android/app/src/main/res/drawable/ic_controller_start_button.xml deleted file mode 100644 index 7247bbcd7..000000000 --- a/android/app/src/main/res/drawable/ic_controller_start_button.xml +++ /dev/null @@ -1,14 +0,0 @@ -<vector xmlns:android="http://schemas.android.com/apk/res/android" - android:width="100dp" - android:height="50dp" - android:viewportWidth="26.458332" - android:viewportHeight="13.229165"> - <path - android:pathData="m0.6615,0.6614v11.9063l25.1354,-5.9531z" - android:strokeAlpha="0.94117647" - android:strokeLineJoin="miter" - android:strokeWidth="0.265" - android:fillColor="#00000000" - android:strokeColor="#6e6e6f" - android:strokeLineCap="butt" /> -</vector> diff --git a/android/app/src/main/res/drawable/ic_controller_start_button_pressed.xml b/android/app/src/main/res/drawable/ic_controller_start_button_pressed.xml deleted file mode 100644 index 5a8255577..000000000 --- a/android/app/src/main/res/drawable/ic_controller_start_button_pressed.xml +++ /dev/null @@ -1,14 +0,0 @@ -<vector xmlns:android="http://schemas.android.com/apk/res/android" - android:width="100dp" - android:height="50dp" - android:viewportWidth="26.458332" - android:viewportHeight="13.229165"> - <path - android:pathData="m0.6615,0.6614v11.9063l25.1354,-5.9531z" - android:strokeAlpha="0.94117647" - android:strokeLineJoin="miter" - android:strokeWidth="0.265" - android:fillColor="#4d4d4d" - android:strokeColor="#6e6e6f" - android:strokeLineCap="butt" /> -</vector> diff --git a/android/app/src/main/res/drawable/ic_controller_t1_button.xml b/android/app/src/main/res/drawable/ic_controller_t1_button.xml deleted file mode 100644 index 2f342f01c..000000000 --- a/android/app/src/main/res/drawable/ic_controller_t1_button.xml +++ /dev/null @@ -1,20 +0,0 @@ -<vector xmlns:android="http://schemas.android.com/apk/res/android" - android:width="100dp" - android:height="100dp" - android:viewportWidth="100" - android:viewportHeight="100"> - <path - android:pathData="M1.086,50.028a48.94,48.712 0,1 0,97.88 0a48.94,48.712 0,1 0,-97.88 0z" - android:strokeWidth="1.5" - android:fillColor="#000000" - android:fillAlpha="0" - android:strokeColor="#c8c8c8"/> - <path - android:pathData="M40.04,63.464H36.23V36.582H26.79V33.238H49.438v3.344h-9.398z" - android:fillColor="#ffffff" - android:strokeColor="#00000000"/> - <path - android:pathData="M64.932,63.464H61.291V42.339q0,-1.82 0.042,-2.921 0.042,-1.101 0.127,-2.286 -0.677,0.677 -1.228,1.143 -0.55,0.466 -1.397,1.185l-3.217,2.625 -1.947,-2.498 8.17,-6.35h3.09z" - android:fillColor="#ffffff" - android:strokeColor="#00000000"/> -</vector> diff --git a/android/app/src/main/res/drawable/ic_controller_t1_button_pressed.xml b/android/app/src/main/res/drawable/ic_controller_t1_button_pressed.xml deleted file mode 100644 index bf3ffaf35..000000000 --- a/android/app/src/main/res/drawable/ic_controller_t1_button_pressed.xml +++ /dev/null @@ -1,19 +0,0 @@ -<vector xmlns:android="http://schemas.android.com/apk/res/android" - android:width="100dp" - android:height="100dp" - android:viewportWidth="100" - android:viewportHeight="100"> - <path - android:pathData="M1.086,50.028a48.94,48.712 0,1 0,97.88 0a48.94,48.712 0,1 0,-97.88 0z" - android:strokeWidth="1.5" - android:fillColor="#c9c9c9" - android:strokeColor="#c8c8c8"/> - <path - android:pathData="M40.04,63.464H36.23V36.582H26.79V33.238H49.438v3.344h-9.398z" - android:fillColor="#ffffff" - android:strokeColor="#00000000"/> - <path - android:pathData="M64.932,63.464H61.291V42.339q0,-1.82 0.042,-2.921 0.042,-1.101 0.127,-2.286 -0.677,0.677 -1.228,1.143 -0.55,0.466 -1.397,1.185l-3.217,2.625 -1.947,-2.498 8.17,-6.35h3.09z" - android:fillColor="#ffffff" - android:strokeColor="#00000000"/> -</vector> diff --git a/android/app/src/main/res/drawable/ic_controller_t2_button.xml b/android/app/src/main/res/drawable/ic_controller_t2_button.xml deleted file mode 100644 index abddf7071..000000000 --- a/android/app/src/main/res/drawable/ic_controller_t2_button.xml +++ /dev/null @@ -1,20 +0,0 @@ -<vector xmlns:android="http://schemas.android.com/apk/res/android" - android:width="100dp" - android:height="100dp" - android:viewportWidth="100" - android:viewportHeight="100"> - <path - android:pathData="M1.086,50.028a48.94,48.712 0,1 0,97.88 0a48.94,48.712 0,1 0,-97.88 0z" - android:strokeWidth="1.5" - android:fillColor="#000000" - android:fillAlpha="0" - android:strokeColor="#c8c8c8"/> - <path - android:pathData="M40.04,63.464H36.23V36.582H26.79V33.238H49.438v3.344h-9.398z" - android:fillColor="#ffffff" - android:strokeColor="#00000000"/> - <path - android:pathData="M71.917,63.464H51.936v-3.09l7.916,-8.001q2.286,-2.286 3.852,-4.064 1.566,-1.778 2.371,-3.471 0.804,-1.736 0.804,-3.768 0,-2.498 -1.482,-3.768 -1.482,-1.312 -3.852,-1.312 -2.201,0 -3.895,0.762 -1.651,0.762 -3.387,2.117l-1.99,-2.498q1.778,-1.482 4.064,-2.498 2.328,-1.058 5.207,-1.058 4.233,0 6.689,2.159 2.455,2.117 2.455,5.884 0,2.371 -0.974,4.445 -0.974,2.074 -2.709,4.106 -1.736,1.99 -4.064,4.276l-6.308,6.223v0.169h15.282z" - android:fillColor="#ffffff" - android:strokeColor="#00000000"/> -</vector> diff --git a/android/app/src/main/res/drawable/ic_controller_t2_button_pressed.xml b/android/app/src/main/res/drawable/ic_controller_t2_button_pressed.xml deleted file mode 100644 index 2b07da75f..000000000 --- a/android/app/src/main/res/drawable/ic_controller_t2_button_pressed.xml +++ /dev/null @@ -1,19 +0,0 @@ -<vector xmlns:android="http://schemas.android.com/apk/res/android" - android:width="100dp" - android:height="100dp" - android:viewportWidth="100" - android:viewportHeight="100"> - <path - android:pathData="M1.086,50.028a48.94,48.712 0,1 0,97.88 0a48.94,48.712 0,1 0,-97.88 0z" - android:strokeWidth="1.5" - android:fillColor="#c9c9c9" - android:strokeColor="#c8c8c8"/> - <path - android:pathData="M40.04,63.464H36.23V36.582H26.79V33.238H49.438v3.344h-9.398z" - android:fillColor="#ffffff" - android:strokeColor="#00000000"/> - <path - android:pathData="M71.917,63.464H51.936v-3.09l7.916,-8.001q2.286,-2.286 3.852,-4.064 1.566,-1.778 2.371,-3.471 0.804,-1.736 0.804,-3.768 0,-2.498 -1.482,-3.768 -1.482,-1.312 -3.852,-1.312 -2.201,0 -3.895,0.762 -1.651,0.762 -3.387,2.117l-1.99,-2.498q1.778,-1.482 4.064,-2.498 2.328,-1.058 5.207,-1.058 4.233,0 6.689,2.159 2.455,2.117 2.455,5.884 0,2.371 -0.974,4.445 -0.974,2.074 -2.709,4.106 -1.736,1.99 -4.064,4.276l-6.308,6.223v0.169h15.282z" - android:fillColor="#ffffff" - android:strokeColor="#00000000"/> -</vector> diff --git a/android/app/src/main/res/drawable/ic_controller_t3_button.xml b/android/app/src/main/res/drawable/ic_controller_t3_button.xml deleted file mode 100644 index d9b001f00..000000000 --- a/android/app/src/main/res/drawable/ic_controller_t3_button.xml +++ /dev/null @@ -1,20 +0,0 @@ -<vector xmlns:android="http://schemas.android.com/apk/res/android" - android:width="100dp" - android:height="100dp" - android:viewportWidth="100" - android:viewportHeight="100"> - <path - android:pathData="M1.086,50.028a48.94,48.712 0,1 0,97.88 0a48.94,48.712 0,1 0,-97.88 0z" - android:strokeWidth="1.5" - android:fillColor="#000000" - android:fillAlpha="0" - android:strokeColor="#c8c8c8"/> - <path - android:pathData="M40.04,63.464H36.23V36.582H26.79V33.238H49.438v3.344h-9.398z" - android:fillColor="#ffffff" - android:strokeColor="#00000000"/> - <path - android:pathData="m70.774,40.307q0,3.048 -1.693,4.868 -1.693,1.778 -4.572,2.371v0.169q3.641,0.423 5.419,2.286 1.778,1.863 1.778,4.868 0,2.625 -1.228,4.699 -1.228,2.032 -3.81,3.175 -2.54,1.143 -6.562,1.143 -2.371,0 -4.403,-0.381 -2.032,-0.339 -3.895,-1.27v-3.471q1.905,0.931 4.106,1.482 2.201,0.508 4.233,0.508 4.064,0 5.842,-1.566 1.82,-1.609 1.82,-4.403 0,-2.836 -2.244,-4.064 -2.201,-1.27 -6.223,-1.27h-2.921v-3.175h2.963q3.725,0 5.63,-1.566 1.947,-1.566 1.947,-4.149 0,-2.201 -1.482,-3.387 -1.482,-1.228 -4.022,-1.228 -2.455,0 -4.191,0.72 -1.736,0.72 -3.429,1.82l-1.863,-2.54q1.609,-1.27 3.979,-2.201 2.413,-0.931 5.461,-0.931 4.741,0 7.027,2.117 2.328,2.117 2.328,5.376z" - android:fillColor="#ffffff" - android:strokeColor="#00000000"/> -</vector> diff --git a/android/app/src/main/res/drawable/ic_controller_t3_button_pressed.xml b/android/app/src/main/res/drawable/ic_controller_t3_button_pressed.xml deleted file mode 100644 index 78465f7fd..000000000 --- a/android/app/src/main/res/drawable/ic_controller_t3_button_pressed.xml +++ /dev/null @@ -1,19 +0,0 @@ -<vector xmlns:android="http://schemas.android.com/apk/res/android" - android:width="100dp" - android:height="100dp" - android:viewportWidth="100" - android:viewportHeight="100"> - <path - android:pathData="M1.086,50.028a48.94,48.712 0,1 0,97.88 0a48.94,48.712 0,1 0,-97.88 0z" - android:strokeWidth="1.5" - android:fillColor="#c9c9c9" - android:strokeColor="#c8c8c8"/> - <path - android:pathData="M40.04,63.464H36.23V36.582H26.79V33.238H49.438v3.344h-9.398z" - android:fillColor="#ffffff" - android:strokeColor="#00000000"/> - <path - android:pathData="m70.774,40.307q0,3.048 -1.693,4.868 -1.693,1.778 -4.572,2.371v0.169q3.641,0.423 5.419,2.286 1.778,1.863 1.778,4.868 0,2.625 -1.228,4.699 -1.228,2.032 -3.81,3.175 -2.54,1.143 -6.562,1.143 -2.371,0 -4.403,-0.381 -2.032,-0.339 -3.895,-1.27v-3.471q1.905,0.931 4.106,1.482 2.201,0.508 4.233,0.508 4.064,0 5.842,-1.566 1.82,-1.609 1.82,-4.403 0,-2.836 -2.244,-4.064 -2.201,-1.27 -6.223,-1.27h-2.921v-3.175h2.963q3.725,0 5.63,-1.566 1.947,-1.566 1.947,-4.149 0,-2.201 -1.482,-3.387 -1.482,-1.228 -4.022,-1.228 -2.455,0 -4.191,0.72 -1.736,0.72 -3.429,1.82l-1.863,-2.54q1.609,-1.27 3.979,-2.201 2.413,-0.931 5.461,-0.931 4.741,0 7.027,2.117 2.328,2.117 2.328,5.376z" - android:fillColor="#ffffff" - android:strokeColor="#00000000"/> -</vector> diff --git a/android/app/src/main/res/drawable/ic_controller_t4_button.xml b/android/app/src/main/res/drawable/ic_controller_t4_button.xml deleted file mode 100644 index 87f5e6726..000000000 --- a/android/app/src/main/res/drawable/ic_controller_t4_button.xml +++ /dev/null @@ -1,20 +0,0 @@ -<vector xmlns:android="http://schemas.android.com/apk/res/android" - android:width="100dp" - android:height="100dp" - android:viewportWidth="100" - android:viewportHeight="100"> - <path - android:pathData="M1.086,50.028a48.94,48.712 0,1 0,97.88 0a48.94,48.712 0,1 0,-97.88 0z" - android:strokeWidth="1.5" - android:fillColor="#000000" - android:fillAlpha="0" - android:strokeColor="#c8c8c8"/> - <path - android:pathData="M40.04,63.464H36.23V36.582H26.79V33.238H49.438v3.344h-9.398z" - android:fillColor="#ffffff" - android:strokeColor="#00000000"/> - <path - android:pathData="m73.272,56.606h-4.403v6.858h-3.598V56.606h-14.478v-3.175l14.224,-20.362h3.852V53.261h4.403zM65.271,43.736q0,-2.201 0.085,-3.725 0.085,-1.566 0.127,-2.963h-0.169q-0.339,0.804 -0.847,1.736 -0.508,0.931 -0.974,1.566L54.433,53.261h10.837z" - android:fillColor="#ffffff" - android:strokeColor="#00000000"/> -</vector> diff --git a/android/app/src/main/res/drawable/ic_controller_t4_button_pressed.xml b/android/app/src/main/res/drawable/ic_controller_t4_button_pressed.xml deleted file mode 100644 index b7da1f1b2..000000000 --- a/android/app/src/main/res/drawable/ic_controller_t4_button_pressed.xml +++ /dev/null @@ -1,19 +0,0 @@ -<vector xmlns:android="http://schemas.android.com/apk/res/android" - android:width="100dp" - android:height="100dp" - android:viewportWidth="100" - android:viewportHeight="100"> - <path - android:pathData="M1.086,50.028a48.94,48.712 0,1 0,97.88 0a48.94,48.712 0,1 0,-97.88 0z" - android:strokeWidth="1.5" - android:fillColor="#c9c9c9" - android:strokeColor="#c8c8c8"/> - <path - android:pathData="M40.04,63.464H36.23V36.582H26.79V33.238H49.438v3.344h-9.398z" - android:fillColor="#ffffff" - android:strokeColor="#00000000"/> - <path - android:pathData="m73.272,56.606h-4.403v6.858h-3.598V56.606h-14.478v-3.175l14.224,-20.362h3.852V53.261h4.403zM65.271,43.736q0,-2.201 0.085,-3.725 0.085,-1.566 0.127,-2.963h-0.169q-0.339,0.804 -0.847,1.736 -0.508,0.931 -0.974,1.566L54.433,53.261h10.837z" - android:fillColor="#ffffff" - android:strokeColor="#00000000"/> -</vector> diff --git a/android/app/src/main/res/drawable/ic_controller_triangle_button.xml b/android/app/src/main/res/drawable/ic_controller_triangle_button.xml deleted file mode 100644 index 9a1392988..000000000 --- a/android/app/src/main/res/drawable/ic_controller_triangle_button.xml +++ /dev/null @@ -1,19 +0,0 @@ -<vector xmlns:android="http://schemas.android.com/apk/res/android" - android:width="100dp" - android:height="100dp" - android:viewportWidth="26.458332" - android:viewportHeight="26.45833"> - <path - android:pathData="M13.2292,13.2292m-12.5677,0a12.5677,12.5677 0,1 1,25.1354 0a12.5677,12.5677 0,1 1,-25.1354 0" - android:strokeWidth="0.26458332" - android:fillColor="#00000000" - android:strokeColor="#ffffff" /> - <path - android:pathData="M5.2917,19.0398L21.1667,19.0398l-7.9375,-13.7481 -7.8548,13.6049" - android:strokeAlpha="1" - android:strokeLineJoin="round" - android:strokeWidth="1.05833328" - android:fillColor="#00000000" - android:strokeColor="#00ff00" - android:strokeLineCap="round" /> -</vector> diff --git a/android/app/src/main/res/drawable/ic_controller_triangle_button_pressed.xml b/android/app/src/main/res/drawable/ic_controller_triangle_button_pressed.xml deleted file mode 100644 index be10c7a85..000000000 --- a/android/app/src/main/res/drawable/ic_controller_triangle_button_pressed.xml +++ /dev/null @@ -1,19 +0,0 @@ -<vector xmlns:android="http://schemas.android.com/apk/res/android" - android:width="100dp" - android:height="100dp" - android:viewportWidth="26.458332" - android:viewportHeight="26.45833"> - <path - android:pathData="M13.2292,13.2292m-12.5677,0a12.5677,12.5677 0,1 1,25.1354 0a12.5677,12.5677 0,1 1,-25.1354 0" - android:strokeWidth="0.26458332" - android:fillColor="#4d4d4d" - android:strokeColor="#ffffff" /> - <path - android:pathData="M5.2917,19.0398L21.1667,19.0398l-7.9375,-13.7481 -7.8548,13.6049" - android:strokeAlpha="1" - android:strokeLineJoin="round" - android:strokeWidth="1.05833328" - android:fillColor="#00000000" - android:strokeColor="#00ff00" - android:strokeLineCap="round" /> -</vector> diff --git a/android/app/src/main/res/drawable/ic_controller_up_button.xml b/android/app/src/main/res/drawable/ic_controller_up_button.xml deleted file mode 100644 index e8b5a4064..000000000 --- a/android/app/src/main/res/drawable/ic_controller_up_button.xml +++ /dev/null @@ -1,14 +0,0 @@ -<vector xmlns:android="http://schemas.android.com/apk/res/android" - android:width="100dp" - android:height="100dp" - android:viewportWidth="26.458332" - android:viewportHeight="26.458332"> - <path - android:pathData="m21.1667,17.1979 l-7.9375,7.9375 -7.9375,-7.9375L5.2917,2.6458L21.1667,2.6458Z" - android:strokeAlpha="1" - android:strokeLineJoin="miter" - android:strokeWidth="0.26458332" - android:fillColor="#00000000" - android:strokeColor="#e6e6e6" - android:strokeLineCap="butt" /> -</vector> diff --git a/android/app/src/main/res/drawable/ic_controller_up_button_pressed.xml b/android/app/src/main/res/drawable/ic_controller_up_button_pressed.xml deleted file mode 100644 index d17013321..000000000 --- a/android/app/src/main/res/drawable/ic_controller_up_button_pressed.xml +++ /dev/null @@ -1,14 +0,0 @@ -<vector xmlns:android="http://schemas.android.com/apk/res/android" - android:width="100dp" - android:height="100dp" - android:viewportWidth="26.458332" - android:viewportHeight="26.458332"> - <path - android:pathData="m21.1667,17.1979 l-7.9375,7.9375 -7.9375,-7.9375L5.2917,2.6458L21.1667,2.6458Z" - android:strokeAlpha="1" - android:strokeLineJoin="miter" - android:strokeWidth="0.26458332" - android:fillColor="#4d4d4d" - android:strokeColor="#e6e6e6" - android:strokeLineCap="butt" /> -</vector> diff --git a/android/app/src/main/res/drawable/ic_emblem_system.xml b/android/app/src/main/res/drawable/ic_emblem_system.xml deleted file mode 100644 index 4be483cfc..000000000 --- a/android/app/src/main/res/drawable/ic_emblem_system.xml +++ /dev/null @@ -1,45 +0,0 @@ -<vector xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:aapt="http://schemas.android.com/aapt" - android:width="48dp" - android:height="48dp" - android:viewportWidth="48" - android:viewportHeight="48"> - <path - android:pathData="M44.1942,41.636A19.6222,6.1872 0,1 1,4.9497 41.636A19.6222,6.1872 0,1 1,44.1942 41.636z" - android:strokeAlpha="0.40909088" - android:strokeLineJoin="miter" - android:strokeWidth="1" - android:strokeColor="#00000000" - android:fillType="nonZero" - android:fillAlpha="0.40909088" - android:strokeLineCap="butt"></path> - <path - android:pathData="M23.25,0.4688C22.7846,0.5006 22.3322,0.5727 21.875,0.625L21.8438,0.625L20.75,6.5938C18.9673,6.9997 17.2901,7.6887 15.7813,8.625L10.875,5.0938C9.5487,6.1234 8.3418,7.3243 7.2813,8.625L10.6875,13.5938C9.6533,15.1743 8.8755,16.979 8.4375,18.875C8.4374,18.884 8.4374,18.9047 8.4375,18.9063L2.5,19.8438C2.3914,20.7304 2.3438,21.6467 2.3438,22.5625C2.3438,23.3118 2.3644,24.0511 2.4375,24.7813L8.375,25.8438C8.7973,27.9056 9.5995,29.8313 10.7188,31.5313L7.1875,36.375C8.1988,37.6305 9.3664,38.7736 10.625,39.7813L15.625,36.3438C17.3724,37.4585 19.3231,38.2401 21.4375,38.625L22.375,44.5313C23.0412,44.5919 23.7243,44.5938 24.4063,44.5938C25.3689,44.5938 26.2885,44.5573 27.2188,44.4375L28.3438,38.4063C30.3513,37.9067 32.2372,37.04 33.875,35.875L38.6875,39.375C39.9355,38.3132 41.0768,37.0927 42.0625,35.7813L38.5625,30.7188C39.5104,29.0818 40.1671,27.2756 40.5,25.3438L46.4063,24.4063C46.458,23.7899 46.4688,23.1922 46.4688,22.5625C46.4688,21.4683 46.3416,20.3954 46.1875,19.3438L40.1875,18.25C39.7173,16.5138 38.9458,14.8939 37.9688,13.4375L41.5,8.5938C40.4054,7.2551 39.1568,6.0186 37.7813,4.9688L32.6875,8.4688C31.2235,7.6029 29.648,6.9386 27.9375,6.5625L27,0.625C26.1467,0.5246 25.2864,0.4688 24.4063,0.4688C24.1684,0.4688 23.9236,0.4613 23.6875,0.4688C23.5724,0.4724 23.4585,0.4621 23.3438,0.4688C23.3127,0.4706 23.281,0.4666 23.25,0.4688zM24.0625,15.6563C24.1767,15.6505 24.2907,15.6563 24.4063,15.6563C28.1054,15.6563 31.125,18.6759 31.125,22.375C31.125,26.0741 28.1054,29.0625 24.4063,29.0625C20.7071,29.0625 17.7188,26.0741 17.7188,22.375C17.7188,18.7915 20.5233,15.8358 24.0625,15.6563z" - android:strokeAlpha="1" - android:strokeLineJoin="miter" - android:strokeWidth="1" - android:strokeColor="#808080" - android:fillType="nonZero" - android:fillAlpha="1" - android:strokeLineCap="butt"></path> - <path - android:pathData="M32.13,22.3608A7.7197,7.7197 45,1 1,16.6905 22.3608A7.7197,7.7197 135,1 1,32.13 22.3608z" - android:strokeAlpha="0.64772725" - android:strokeLineJoin="miter" - android:strokeWidth="1.64875567" - android:fillColor="#00000000" - android:strokeColor="#ffffff" - android:fillType="nonZero" - android:fillAlpha="0.64772725" - android:strokeLineCap="butt" /> - <path - android:pathData="M22.5578,1.6501L21.6796,7.4291C20.0086,7.8097 16.9349,8.9735 15.5206,9.8511L10.8486,6.3639C9.6054,7.3291 9.5201,7.3945 8.5261,8.6137L11.9041,13.6236C10.9347,15.1051 9.7703,17.7451 9.3522,19.6317C9.3522,19.6317 3.4328,20.6296 3.4328,20.6296C3.3311,21.4606 3.38,23.2394 3.4485,23.9238L9.1027,24.9423C9.4985,26.875 10.9797,29.9859 12.0289,31.5794L8.4533,36.3034C9.4012,37.4803 9.591,37.5879 10.7707,38.5324L15.5519,35.0296C17.1898,36.0745 20.4409,37.3455 22.4228,37.7063L23.2075,43.4125C23.8319,43.4693 25.557,43.6288 26.4289,43.5165L27.3071,37.5764C29.1889,37.1081 32.4403,35.7734 33.9754,34.6815L38.7515,38.1323C39.9213,37.137 39.9318,36.9871 40.8557,35.7578L37.3165,30.7271C38.205,29.1927 39.3537,26.1918 39.6657,24.381L45.4604,23.4196C45.5089,22.8419 45.5113,21.2308 45.3669,20.245L39.4631,19.2264C39.0224,17.599 37.5099,14.6665 36.5941,13.3013L40.3464,8.5773C39.3204,7.3226 38.939,7.1504 37.6496,6.1664L32.7073,9.7056C31.335,8.894 28.5987,7.6569 26.9953,7.3044L26.1223,1.6501C25.3224,1.556 23.0149,1.5978 22.5578,1.6501z" - android:strokeAlpha="0.34659088" - android:strokeLineJoin="miter" - android:strokeWidth="0.9999997" - android:fillColor="#00000000" - android:strokeColor="#ffffff" - android:fillType="nonZero" - android:fillAlpha="0.34659088" - android:strokeLineCap="butt" /> -</vector> diff --git a/android/app/src/main/res/drawable/ic_launcher_background.xml b/android/app/src/main/res/drawable/ic_launcher_background.xml deleted file mode 100644 index 0d025f9bf..000000000 --- a/android/app/src/main/res/drawable/ic_launcher_background.xml +++ /dev/null @@ -1,170 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<vector xmlns:android="http://schemas.android.com/apk/res/android" - android:width="108dp" - android:height="108dp" - android:viewportWidth="108" - android:viewportHeight="108"> - <path - android:fillColor="#008577" - android:pathData="M0,0h108v108h-108z" /> - <path - android:fillColor="#00000000" - android:pathData="M9,0L9,108" - android:strokeWidth="0.8" - android:strokeColor="#33FFFFFF" /> - <path - android:fillColor="#00000000" - android:pathData="M19,0L19,108" - android:strokeWidth="0.8" - android:strokeColor="#33FFFFFF" /> - <path - android:fillColor="#00000000" - android:pathData="M29,0L29,108" - android:strokeWidth="0.8" - android:strokeColor="#33FFFFFF" /> - <path - android:fillColor="#00000000" - android:pathData="M39,0L39,108" - android:strokeWidth="0.8" - android:strokeColor="#33FFFFFF" /> - <path - android:fillColor="#00000000" - android:pathData="M49,0L49,108" - android:strokeWidth="0.8" - android:strokeColor="#33FFFFFF" /> - <path - android:fillColor="#00000000" - android:pathData="M59,0L59,108" - android:strokeWidth="0.8" - android:strokeColor="#33FFFFFF" /> - <path - android:fillColor="#00000000" - android:pathData="M69,0L69,108" - android:strokeWidth="0.8" - android:strokeColor="#33FFFFFF" /> - <path - android:fillColor="#00000000" - android:pathData="M79,0L79,108" - android:strokeWidth="0.8" - android:strokeColor="#33FFFFFF" /> - <path - android:fillColor="#00000000" - android:pathData="M89,0L89,108" - android:strokeWidth="0.8" - android:strokeColor="#33FFFFFF" /> - <path - android:fillColor="#00000000" - android:pathData="M99,0L99,108" - android:strokeWidth="0.8" - android:strokeColor="#33FFFFFF" /> - <path - android:fillColor="#00000000" - android:pathData="M0,9L108,9" - android:strokeWidth="0.8" - android:strokeColor="#33FFFFFF" /> - <path - android:fillColor="#00000000" - android:pathData="M0,19L108,19" - android:strokeWidth="0.8" - android:strokeColor="#33FFFFFF" /> - <path - android:fillColor="#00000000" - android:pathData="M0,29L108,29" - android:strokeWidth="0.8" - android:strokeColor="#33FFFFFF" /> - <path - android:fillColor="#00000000" - android:pathData="M0,39L108,39" - android:strokeWidth="0.8" - android:strokeColor="#33FFFFFF" /> - <path - android:fillColor="#00000000" - android:pathData="M0,49L108,49" - android:strokeWidth="0.8" - android:strokeColor="#33FFFFFF" /> - <path - android:fillColor="#00000000" - android:pathData="M0,59L108,59" - android:strokeWidth="0.8" - android:strokeColor="#33FFFFFF" /> - <path - android:fillColor="#00000000" - android:pathData="M0,69L108,69" - android:strokeWidth="0.8" - android:strokeColor="#33FFFFFF" /> - <path - android:fillColor="#00000000" - android:pathData="M0,79L108,79" - android:strokeWidth="0.8" - android:strokeColor="#33FFFFFF" /> - <path - android:fillColor="#00000000" - android:pathData="M0,89L108,89" - android:strokeWidth="0.8" - android:strokeColor="#33FFFFFF" /> - <path - android:fillColor="#00000000" - android:pathData="M0,99L108,99" - android:strokeWidth="0.8" - android:strokeColor="#33FFFFFF" /> - <path - android:fillColor="#00000000" - android:pathData="M19,29L89,29" - android:strokeWidth="0.8" - android:strokeColor="#33FFFFFF" /> - <path - android:fillColor="#00000000" - android:pathData="M19,39L89,39" - android:strokeWidth="0.8" - android:strokeColor="#33FFFFFF" /> - <path - android:fillColor="#00000000" - android:pathData="M19,49L89,49" - android:strokeWidth="0.8" - android:strokeColor="#33FFFFFF" /> - <path - android:fillColor="#00000000" - android:pathData="M19,59L89,59" - android:strokeWidth="0.8" - android:strokeColor="#33FFFFFF" /> - <path - android:fillColor="#00000000" - android:pathData="M19,69L89,69" - android:strokeWidth="0.8" - android:strokeColor="#33FFFFFF" /> - <path - android:fillColor="#00000000" - android:pathData="M19,79L89,79" - android:strokeWidth="0.8" - android:strokeColor="#33FFFFFF" /> - <path - android:fillColor="#00000000" - android:pathData="M29,19L29,89" - android:strokeWidth="0.8" - android:strokeColor="#33FFFFFF" /> - <path - android:fillColor="#00000000" - android:pathData="M39,19L39,89" - android:strokeWidth="0.8" - android:strokeColor="#33FFFFFF" /> - <path - android:fillColor="#00000000" - android:pathData="M49,19L49,89" - android:strokeWidth="0.8" - android:strokeColor="#33FFFFFF" /> - <path - android:fillColor="#00000000" - android:pathData="M59,19L59,89" - android:strokeWidth="0.8" - android:strokeColor="#33FFFFFF" /> - <path - android:fillColor="#00000000" - android:pathData="M69,19L69,89" - android:strokeWidth="0.8" - android:strokeColor="#33FFFFFF" /> - <path - android:fillColor="#00000000" - android:pathData="M79,19L79,89" - android:strokeWidth="0.8" - android:strokeColor="#33FFFFFF" /> -</vector> diff --git a/android/app/src/main/res/drawable/ic_media_cdrom.xml b/android/app/src/main/res/drawable/ic_media_cdrom.xml deleted file mode 100644 index 9269ea16f..000000000 --- a/android/app/src/main/res/drawable/ic_media_cdrom.xml +++ /dev/null @@ -1,97 +0,0 @@ -<vector xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:aapt="http://schemas.android.com/aapt" - android:width="48dp" - android:height="48dp" - android:viewportWidth="48" - android:viewportHeight="48"> - <path - android:pathData="M46.9619,41.511A6.0319,22.6274 90,1 1,1.7071 41.511A6.0319,22.6274 90,1 1,46.9619 41.511z" - android:strokeAlpha="0.55" - android:strokeLineJoin="miter" - android:strokeWidth="2" - android:strokeColor="#00000000" - android:fillType="evenOdd" - android:fillAlpha="0.55" - android:strokeLineCap="butt"></path> - <path - android:pathData="M24.347,4.1667C12.7994,4.1667 3.5137,13.4524 3.5137,25C3.5137,36.5476 12.7994,45.8333 24.347,45.8333C35.8946,45.8333 45.1803,36.5476 45.1803,25C45.1803,13.4524 35.8946,4.1667 24.347,4.1667L24.347,4.1667zM24.347,30C21.6089,30 19.347,27.7381 19.347,25C19.347,22.2619 21.6089,20 24.347,20C27.0851,20 29.347,22.2619 29.347,25C29.347,27.7381 27.0851,30 24.347,30z" - android:strokeColor="#00000000" - android:fillType="nonZero"></path> - <path - android:strokeWidth="1" - android:pathData="M24.347,4.1667C12.7994,4.1667 3.5137,13.4524 3.5137,25C3.5137,36.5476 12.7994,45.8333 24.347,45.8333C35.8946,45.8333 45.1803,36.5476 45.1803,25C45.1803,13.4524 35.8946,4.1667 24.347,4.1667L24.347,4.1667zM24.347,30C21.6089,30 19.347,27.7381 19.347,25C19.347,22.2619 21.6089,20 24.347,20C27.0851,20 29.347,22.2619 29.347,25C29.347,27.7381 27.0851,30 24.347,30z" - android:strokeAlpha="1" - android:strokeColor="#808080" - android:fillType="nonZero"></path> - <path - android:fillColor="#FF000000" - android:pathData="M24.347,14.8958C18.7044,14.8958 14.2428,19.4886 14.2428,25C14.2428,30.6426 18.8356,35.1042 24.347,35.1042C29.9896,35.1042 34.4512,30.5114 34.4512,25C34.4512,19.3574 29.8584,14.8958 24.347,14.8958L24.347,14.8958zM24.347,30.5114C21.3289,30.5114 18.8356,28.0181 18.8356,25C18.8356,21.9819 21.3289,19.4886 24.347,19.4886C27.3651,19.4886 29.8584,21.9819 29.8584,25C29.8584,28.0181 27.3651,30.5114 24.347,30.5114z" - android:strokeAlpha="0.10999995" - android:strokeColor="#00000000" - android:fillType="nonZero" - android:fillAlpha="0.10999995" /> - <path - android:pathData="M29.9221,5.6692L26.3255,19.6639C27.4502,19.9634 28.3497,20.6594 28.9606,21.6224L41.3529,14.0732C38.8176,9.9434 34.7487,6.9051 29.9221,5.6692z" - android:strokeAlpha="1" - android:strokeColor="#00000000" - android:fillType="nonZero" - android:fillAlpha="1"></path> - <path - android:pathData="M17.3078,43.7661L22.0431,30.1146C20.9468,29.7236 20.1077,28.956 19.5779,27.946L6.6069,34.4506C8.7939,38.7748 12.5993,42.1375 17.3078,43.7661z" - android:strokeAlpha="1" - android:strokeColor="#00000000" - android:fillType="nonZero" - android:fillAlpha="1"></path> - <path - android:strokeWidth="1" - android:pathData="M24.347,5.2024C13.3735,5.2024 4.5494,14.0265 4.5494,25C4.5494,35.9735 13.3735,44.7976 24.347,44.7976C35.3205,44.7976 44.1446,35.9735 44.1446,25C44.1446,14.0265 35.3205,5.2024 24.347,5.2024L24.347,5.2024z" - android:strokeAlpha="0.5464481" - android:fillColor="#00000000" - android:fillType="nonZero" - android:fillAlpha="0.5464481"></path> - <path - android:pathData="M30.494,25.019A6.0988,6.0988 0,1 1,18.2964 25.019A6.0988,6.0988 0,1 1,30.494 25.019z" - android:strokeAlpha="0.6721311" - android:strokeLineJoin="miter" - android:strokeWidth="0.93053865" - android:fillColor="#00000000" - android:fillType="nonZero" - android:fillAlpha="0.21265164" - android:strokeLineCap="butt"></path> - <path - android:pathData="M24.347,4.1667C12.7994,4.1667 3.5137,13.4524 3.5137,25C3.5137,36.5476 12.7994,45.8333 24.347,45.8333C35.8946,45.8333 45.1803,36.5476 45.1803,25C45.1803,13.4524 35.8946,4.1667 24.347,4.1667L24.347,4.1667zM24.347,30C21.6089,30 19.347,27.7381 19.347,25C19.347,22.2619 21.6089,20 24.347,20C27.0851,20 29.347,22.2619 29.347,25C29.347,27.7381 27.0851,30 24.347,30z" - android:strokeAlpha="0.1142857" - android:strokeColor="#00000000" - android:fillType="nonZero" - android:fillAlpha="0.1142857"></path> - <path - android:pathData="M24.347,4.1667C12.7994,4.1667 3.5137,13.4524 3.5137,25C3.5137,36.5476 12.7994,45.8333 24.347,45.8333C35.8946,45.8333 45.1803,36.5476 45.1803,25C45.1803,13.4524 35.8946,4.1667 24.347,4.1667L24.347,4.1667zM24.347,30C21.6089,30 19.347,27.7381 19.347,25C19.347,22.2619 21.6089,20 24.347,20C27.0851,20 29.347,22.2619 29.347,25C29.347,27.7381 27.0851,30 24.347,30z" - android:strokeAlpha="0.09714284" - android:strokeColor="#00000000" - android:fillType="nonZero" - android:fillAlpha="0.09714284"></path> - <path - android:pathData="M24.347,4.1667C12.7994,4.1667 3.5137,13.4524 3.5137,25C3.5137,36.5476 12.7994,45.8333 24.347,45.8333C35.8946,45.8333 45.1803,36.5476 45.1803,25C45.1803,13.4524 35.8946,4.1667 24.347,4.1667L24.347,4.1667zM24.347,30C21.6089,30 19.347,27.7381 19.347,25C19.347,22.2619 21.6089,20 24.347,20C27.0851,20 29.347,22.2619 29.347,25C29.347,27.7381 27.0851,30 24.347,30z" - android:strokeAlpha="0.71428573" - android:strokeColor="#00000000" - android:fillType="nonZero" - android:fillAlpha="0.71428573"></path> - <path - android:pathData="M24.347,4.1667C12.7994,4.1667 3.5137,13.4524 3.5137,25C3.5137,36.5476 12.7994,45.8333 24.347,45.8333C35.8946,45.8333 45.1803,36.5476 45.1803,25C45.1803,13.4524 35.8946,4.1667 24.347,4.1667L24.347,4.1667zM24.347,30C21.6089,30 19.347,27.7381 19.347,25C19.347,22.2619 21.6089,20 24.347,20C27.0851,20 29.347,22.2619 29.347,25C29.347,27.7381 27.0851,30 24.347,30z" - android:strokeAlpha="0.62285715" - android:strokeColor="#00000000" - android:fillType="nonZero" - android:fillAlpha="0.62285715"></path> - <path - android:pathData="M24.347,4.1667C12.7994,4.1667 3.5137,13.4524 3.5137,25C3.5137,36.5476 12.7994,45.8333 24.347,45.8333C35.8946,45.8333 45.1803,36.5476 45.1803,25C45.1803,13.4524 35.8946,4.1667 24.347,4.1667L24.347,4.1667zM24.347,30C21.6089,30 19.347,27.7381 19.347,25C19.347,22.2619 21.6089,20 24.347,20C27.0851,20 29.347,22.2619 29.347,25C29.347,27.7381 27.0851,30 24.347,30z" - android:strokeAlpha="0.3714286" - android:strokeColor="#00000000" - android:fillType="nonZero" - android:fillAlpha="0.3714286"></path> - <path - android:pathData="M24.347,4.1667C12.7994,4.1667 3.5137,13.4524 3.5137,25C3.5137,36.5476 12.7994,45.8333 24.347,45.8333C35.8946,45.8333 45.1803,36.5476 45.1803,25C45.1803,13.4524 35.8946,4.1667 24.347,4.1667L24.347,4.1667zM24.347,30C21.6089,30 19.347,27.7381 19.347,25C19.347,22.2619 21.6089,20 24.347,20C27.0851,20 29.347,22.2619 29.347,25C29.347,27.7381 27.0851,30 24.347,30z" - android:strokeAlpha="0.23428573" - android:strokeColor="#00000000" - android:fillType="nonZero" - android:fillAlpha="0.23428573"></path> -</vector> diff --git a/android/app/src/main/res/drawable/ic_star_0.png b/android/app/src/main/res/drawable/ic_star_0.png deleted file mode 100644 index e5b56db70af52fbc1629cf6131d3b6d5eebdffc4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5534 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 diff --git a/android/app/src/main/res/drawable/ic_star_1.png b/android/app/src/main/res/drawable/ic_star_1.png deleted file mode 100644 index ae91a29ac507ecd360d81d06b263818b3ca398b2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6116 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 diff --git a/android/app/src/main/res/drawable/ic_star_2.png b/android/app/src/main/res/drawable/ic_star_2.png deleted file mode 100644 index f7bee9b1ddce55b82a44e402a3c4de00fef53965..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6367 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 diff --git a/android/app/src/main/res/drawable/ic_star_3.png b/android/app/src/main/res/drawable/ic_star_3.png deleted file mode 100644 index 330aefbaca17c6dab21b9e1076e6238eaa269ba3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6526 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 diff --git a/android/app/src/main/res/drawable/ic_star_4.png b/android/app/src/main/res/drawable/ic_star_4.png deleted file mode 100644 index 4e9f58dfa3fcc1b8243282b1beb14112b3f64606..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6312 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 diff --git a/android/app/src/main/res/drawable/ic_star_5.png b/android/app/src/main/res/drawable/ic_star_5.png deleted file mode 100644 index aa5707ea750c04a2e1ad86be3e45c34856301def..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5990 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 U|9n|BKmY&$07*qoM6N<$g2Ys54FCWD diff --git a/android/app/src/main/res/layout/activity_controller_mapping.xml b/android/app/src/main/res/layout/activity_controller_mapping.xml deleted file mode 100644 index de6591a20..000000000 --- a/android/app/src/main/res/layout/activity_controller_mapping.xml +++ /dev/null @@ -1,9 +0,0 @@ -<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" - android:layout_width="match_parent" - android:layout_height="match_parent"> - - <FrameLayout - android:id="@+id/settings" - android:layout_width="match_parent" - android:layout_height="match_parent" /> -</LinearLayout> \ No newline at end of file diff --git a/android/app/src/main/res/layout/activity_emulation.xml b/android/app/src/main/res/layout/activity_emulation.xml deleted file mode 100644 index 12493cbca..000000000 --- a/android/app/src/main/res/layout/activity_emulation.xml +++ /dev/null @@ -1,20 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:tools="http://schemas.android.com/tools" - android:id="@+id/frameLayout" - android:layout_width="match_parent" - android:layout_height="match_parent" - android:background="#0099cc" - tools:context=".EmulationActivity"> - - <!-- The primary full-screen view. This can be replaced with whatever view - is needed to present your content, e.g. VideoView, SurfaceView, - TextureView, etc. --> - <com.github.stenzek.duckstation.EmulationSurfaceView - android:id="@+id/fullscreen_content" - android:layout_width="match_parent" - android:layout_height="match_parent" - android:gravity="center" - android:keepScreenOn="true" /> - -</FrameLayout> \ No newline at end of file diff --git a/android/app/src/main/res/layout/activity_game_directories.xml b/android/app/src/main/res/layout/activity_game_directories.xml deleted file mode 100644 index 54bfc2181..000000000 --- a/android/app/src/main/res/layout/activity_game_directories.xml +++ /dev/null @@ -1,47 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<androidx.coordinatorlayout.widget.CoordinatorLayout xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:app="http://schemas.android.com/apk/res-auto" - xmlns:tools="http://schemas.android.com/tools" - android:layout_width="match_parent" - android:layout_height="match_parent" - tools:context=".GameDirectoriesActivity"> - - <com.google.android.material.appbar.AppBarLayout - android:layout_width="match_parent" - android:layout_height="wrap_content" - android:theme="@style/AppTheme.AppBarOverlay"> - - <androidx.appcompat.widget.Toolbar - android:id="@+id/toolbar" - android:layout_width="match_parent" - android:layout_height="?attr/actionBarSize" - android:background="?attr/colorPrimary" - app:popupTheme="@style/AppTheme.PopupOverlay" /> - - </com.google.android.material.appbar.AppBarLayout> - - <androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:app="http://schemas.android.com/apk/res-auto" - xmlns:tools="http://schemas.android.com/tools" - android:layout_width="match_parent" - android:layout_height="match_parent" - app:layout_behavior="@string/appbar_scrolling_view_behavior" - tools:context=".MainActivity" - tools:showIn="@layout/activity_main"> - - <androidx.recyclerview.widget.RecyclerView - android:id="@+id/recycler_view" - android:layout_width="match_parent" - android:layout_height="match_parent" /> - </androidx.constraintlayout.widget.ConstraintLayout> - - <com.google.android.material.floatingactionbutton.FloatingActionButton - android:id="@+id/fab" - android:layout_width="wrap_content" - android:layout_height="wrap_content" - android:layout_gravity="bottom|end" - android:layout_margin="@dimen/fab_margin" - app:backgroundTint="@color/fab_background" - app:srcCompat="@android:drawable/ic_input_add" /> - -</androidx.coordinatorlayout.widget.CoordinatorLayout> \ No newline at end of file diff --git a/android/app/src/main/res/layout/activity_main.xml b/android/app/src/main/res/layout/activity_main.xml deleted file mode 100644 index c9dc2d100..000000000 --- a/android/app/src/main/res/layout/activity_main.xml +++ /dev/null @@ -1,53 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<androidx.coordinatorlayout.widget.CoordinatorLayout xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:app="http://schemas.android.com/apk/res-auto" - xmlns:tools="http://schemas.android.com/tools" - android:layout_width="match_parent" - android:layout_height="match_parent" - tools:context=".MainActivity"> - - <com.google.android.material.appbar.AppBarLayout - android:layout_height="wrap_content" - android:layout_width="match_parent" - android:theme="@style/AppTheme.AppBarOverlay"> - - <LinearLayout - android:layout_width="match_parent" - android:layout_height="match_parent" - android:orientation="horizontal"> - - <ImageView - android:id="@+id/imageView2" - android:layout_width="32dp" - android:layout_height="match_parent" - android:layout_marginStart="16dp" - app:srcCompat="@drawable/duck" /> - - <androidx.appcompat.widget.Toolbar - android:id="@+id/toolbar" - android:layout_width="match_parent" - android:layout_height="?attr/actionBarSize" - android:background="?attr/colorPrimary" - app:popupTheme="@style/AppTheme.PopupOverlay" /> - - </LinearLayout> - - </com.google.android.material.appbar.AppBarLayout> - - <FrameLayout - android:id="@+id/content_fragment" - android:layout_width="fill_parent" - android:layout_height="fill_parent" - android:layout_weight="1" - app:layout_behavior="@string/appbar_scrolling_view_behavior" /> - - <com.google.android.material.floatingactionbutton.FloatingActionButton - android:id="@+id/fab_resume" - android:layout_width="wrap_content" - android:layout_height="wrap_content" - android:layout_gravity="bottom|end" - android:layout_margin="@dimen/fab_margin" - app:backgroundTint="@color/fab_background" - app:srcCompat="@drawable/ic_baseline_play_arrow_24" /> - -</androidx.coordinatorlayout.widget.CoordinatorLayout> \ No newline at end of file diff --git a/android/app/src/main/res/layout/activity_memory_card_editor.xml b/android/app/src/main/res/layout/activity_memory_card_editor.xml deleted file mode 100644 index fa471163a..000000000 --- a/android/app/src/main/res/layout/activity_memory_card_editor.xml +++ /dev/null @@ -1,65 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<androidx.coordinatorlayout.widget.CoordinatorLayout xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:app="http://schemas.android.com/apk/res-auto" - xmlns:tools="http://schemas.android.com/tools" - android:layout_width="match_parent" - android:layout_height="match_parent" - tools:context=".MainActivity"> - - <com.google.android.material.appbar.AppBarLayout - android:layout_width="match_parent" - android:layout_height="wrap_content" - android:theme="@style/AppTheme.AppBarOverlay"> - - <androidx.appcompat.widget.Toolbar - android:id="@+id/toolbar" - android:layout_width="match_parent" - android:layout_height="?attr/actionBarSize" - android:background="?attr/colorPrimary" - app:popupTheme="@style/AppTheme.PopupOverlay" /> - - </com.google.android.material.appbar.AppBarLayout> - - <LinearLayout - android:layout_width="match_parent" - android:layout_height="match_parent" - android:layout_weight="1" - android:orientation="vertical" - app:layout_behavior="@string/appbar_scrolling_view_behavior"> - - <com.google.android.material.tabs.TabLayout - android:id="@+id/tab_layout" - android:layout_width="match_parent" - android:layout_height="wrap_content" - app:tabTextAppearance="@style/TabTextAppearance" - app:tabMinWidth="150dp" - app:tabMode="scrollable" /> - - <androidx.viewpager2.widget.ViewPager2 - android:id="@+id/view_pager" - android:layout_width="match_parent" - android:layout_height="0dp" - android:layout_weight="1" /> - - </LinearLayout> - - <com.google.android.material.floatingactionbutton.FloatingActionButton - android:id="@+id/open_card" - android:layout_width="wrap_content" - android:layout_height="wrap_content" - android:layout_gravity="bottom|end" - android:layout_marginBottom="@dimen/fab_margin" - android:layout_marginRight="96dp" - app:backgroundTint="@color/fab_background" - app:srcCompat="@drawable/ic_baseline_folder_open_24" /> - - <com.google.android.material.floatingactionbutton.FloatingActionButton - android:id="@+id/close_card" - android:layout_width="wrap_content" - android:layout_height="wrap_content" - android:layout_gravity="bottom|end" - android:layout_margin="@dimen/fab_margin" - app:backgroundTint="@color/fab_background" - app:srcCompat="@drawable/ic_baseline_close_24" /> - -</androidx.coordinatorlayout.widget.CoordinatorLayout> \ No newline at end of file diff --git a/android/app/src/main/res/layout/fragment_achievement_list.xml b/android/app/src/main/res/layout/fragment_achievement_list.xml deleted file mode 100644 index d1a64a0de..000000000 --- a/android/app/src/main/res/layout/fragment_achievement_list.xml +++ /dev/null @@ -1,74 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:app="http://schemas.android.com/apk/res-auto" - xmlns:tools="http://schemas.android.com/tools" - android:layout_width="match_parent" - android:layout_height="match_parent"> - - <RelativeLayout - android:id="@+id/navigation_header_container" - android:layout_width="fill_parent" - android:layout_height="wrap_content" - android:padding="10dp" - android:layout_alignParentTop="true" - android:layout_alignParentStart="true"> - - <ImageView - android:id="@+id/icon" - android:layout_width="70dp" - android:layout_height="70dp" - android:foregroundGravity="center_vertical" - android:layout_alignParentTop="true" - android:layout_alignParentStart="true" - tools:srcCompat="@drawable/ic_media_cdrom" /> - - <TextView - android:id="@+id/title" - android:layout_width="0dp" - android:layout_height="wrap_content" - android:layout_marginLeft="10dp" - android:focusable="false" - android:focusableInTouchMode="false" - android:text="Game Title" - android:textAppearance="@style/TextAppearance.AppCompat.Large" - android:layout_alignParentTop="true" - android:layout_toRightOf="@+id/icon" - android:layout_alignParentEnd="true" /> - - <TextView - android:id="@+id/summary" - android:layout_width="0dp" - android:layout_height="wrap_content" - android:layout_marginLeft="10dp" - android:focusable="false" - android:focusableInTouchMode="false" - android:text="You have unlocked %d of %d achievements, earning %d of %d possible points." - android:textAppearance="@style/TextAppearance.AppCompat.Small" - android:layout_below="@+id/title" - android:layout_toRightOf="@+id/icon" - android:layout_alignParentEnd="true" /> - - <ProgressBar - android:id="@+id/progressBar" - style="?android:attr/progressBarStyleHorizontal" - android:layout_width="0dp" - android:layout_height="16dp" - android:layout_marginLeft="10dp" - android:layout_marginRight="10dp" - android:layout_below="@+id/summary" - android:layout_toRightOf="@+id/icon" - android:layout_alignParentEnd="true" /> - - </RelativeLayout> - - <androidx.recyclerview.widget.RecyclerView - android:id="@+id/recyclerView" - android:layout_width="match_parent" - android:layout_height="fill_parent" - android:scrollbars="vertical" - android:layout_below="@+id/navigation_header_container" - android:layout_alignParentBottom="true" - android:layout_alignParentLeft="true" - android:layout_alignParentEnd="true" /> - -</RelativeLayout> \ No newline at end of file diff --git a/android/app/src/main/res/layout/fragment_achievements_login.xml b/android/app/src/main/res/layout/fragment_achievements_login.xml deleted file mode 100644 index 5ab32fd3c..000000000 --- a/android/app/src/main/res/layout/fragment_achievements_login.xml +++ /dev/null @@ -1,133 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:tools="http://schemas.android.com/tools" - android:layout_width="match_parent" - android:layout_height="wrap_content" - android:minWidth="280dp" - > - <LinearLayout - android:id="@+id/panel" - android:layout_width="match_parent" - android:layout_height="wrap_content" - android:orientation="vertical" - > - - <LinearLayout - android:layout_width="match_parent" - android:layout_height="wrap_content" - android:orientation="vertical" - android:padding="20dp" - > - - <TextView - android:layout_width="match_parent" - android:layout_height="wrap_content" - android:layout_marginLeft="8dp" - android:layout_marginRight="8dp" - android:text="@string/achievement_settings_login_title" - android:textAppearance="@style/TextAppearance.AppCompat.Large" /> - - <TextView - android:id="@+id/title" - android:layout_width="match_parent" - android:layout_height="wrap_content" - android:layout_marginBottom="4dp" - android:layout_marginLeft="8dp" - android:layout_marginRight="8dp" - android:layout_marginTop="4dp" - android:text="@string/achievement_settings_login_help" - /> - <EditText - android:id="@+id/username" - android:layout_width="match_parent" - android:layout_height="wrap_content" - android:layout_marginLeft="8dp" - android:layout_marginRight="8dp" - android:inputType="textVisiblePassword" - android:nextFocusDown="@+id/password" - android:imeOptions="actionNext" - android:singleLine="true" - android:hint="@string/achievement_settings_login_username_hint" - /> - <EditText - android:id="@+id/password" - android:layout_width="match_parent" - android:layout_height="wrap_content" - android:layout_marginLeft="8dp" - android:layout_marginRight="8dp" - android:inputType="textPassword" - android:imeOptions="actionDone" - android:singleLine="true" - android:hint="@string/achievement_settings_login_password_hint" - /> - - <TextView - android:id="@+id/error" - android:layout_width="match_parent" - android:layout_height="wrap_content" - android:layout_marginLeft="8dp" - android:layout_marginTop="4dp" - android:layout_marginRight="8dp" - android:layout_marginBottom="4dp" - android:visibility="visible" /> - </LinearLayout> - <LinearLayout - android:id="@+id/buttonPanel" - android:layout_width="match_parent" - android:layout_height="wrap_content" - android:divider="?android:attr/dividerHorizontal" - android:dividerPadding="0dip" - android:minHeight="48dp" - android:orientation="vertical" - android:showDividers="beginning" - android:padding="5dp" - > - <LinearLayout - style="?android:attr/buttonBarStyle" - android:layout_width="match_parent" - android:layout_height="wrap_content" - android:layoutDirection="locale" - android:orientation="horizontal" - tools:ignore="UselessParent" - > - <Space - android:layout_width="wrap_content" - android:layout_height="wrap_content" - android:layout_weight="1" /> - - <Button - android:id="@+id/cancel" - style="?android:attr/buttonBarButtonStyle" - android:layout_width="wrap_content" - android:layout_height="wrap_content" - android:layout_gravity="end" - android:focusable="true" - android:maxLines="2" - android:minHeight="48dp" - android:text="@string/achievement_settings_login_cancel_button" - android:textSize="14sp" /> - - <Button - android:id="@+id/login" - style="?android:attr/buttonBarButtonStyle" - android:layout_width="wrap_content" - android:layout_height="wrap_content" - android:layout_gravity="end" - android:focusable="true" - android:maxLines="2" - android:minHeight="48dp" - android:text="@string/achievement_settings_login_login_button" - android:textSize="14sp" /> - </LinearLayout> - </LinearLayout> - </LinearLayout> - <ProgressBar - android:id="@+id/progressBar" - style="?android:attr/progressBarStyleLarge" - android:layout_width="match_parent" - android:layout_height="wrap_content" - android:layout_gravity="center" - android:indeterminateOnly="true" - android:visibility="gone" - /> -</FrameLayout> \ No newline at end of file diff --git a/android/app/src/main/res/layout/fragment_controller_settings.xml b/android/app/src/main/res/layout/fragment_controller_settings.xml deleted file mode 100644 index a47a49de4..000000000 --- a/android/app/src/main/res/layout/fragment_controller_settings.xml +++ /dev/null @@ -1,22 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:app="http://schemas.android.com/apk/res-auto" - android:layout_width="match_parent" - android:layout_height="match_parent" - android:orientation="vertical"> - - <com.google.android.material.tabs.TabLayout - android:id="@+id/tab_layout" - android:layout_width="match_parent" - android:layout_height="wrap_content" - app:tabTextAppearance="@style/TabTextAppearance" - app:tabMinWidth="150dp" - app:tabMode="scrollable" /> - - <androidx.viewpager2.widget.ViewPager2 - android:id="@+id/view_pager" - android:layout_width="match_parent" - android:layout_height="0dp" - android:layout_weight="1" /> - -</LinearLayout> \ No newline at end of file diff --git a/android/app/src/main/res/layout/fragment_empty_game_list.xml b/android/app/src/main/res/layout/fragment_empty_game_list.xml deleted file mode 100644 index 55f8fd607..000000000 --- a/android/app/src/main/res/layout/fragment_empty_game_list.xml +++ /dev/null @@ -1,44 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:app="http://schemas.android.com/apk/res-auto" - xmlns:tools="http://schemas.android.com/tools" - android:layout_width="match_parent" - android:layout_height="match_parent"> - - - <TextView - android:id="@+id/title" - android:layout_width="320dp" - android:layout_height="wrap_content" - android:text="@string/main_activity_empty_game_list_title" - app:layout_constraintBottom_toBottomOf="parent" - app:layout_constraintEnd_toEndOf="parent" - app:layout_constraintHorizontal_bias="0.496" - app:layout_constraintStart_toStartOf="parent" - app:layout_constraintTop_toTopOf="parent" - app:layout_constraintVertical_bias="0.171" /> - - <TextView - android:id="@+id/supported_formats" - android:layout_width="320dp" - android:layout_height="wrap_content" - android:layout_marginTop="20dp" - android:text="@string/main_activity_empty_game_list_supported_formats" - app:layout_constraintEnd_toEndOf="parent" - app:layout_constraintHorizontal_bias="0.498" - app:layout_constraintStart_toStartOf="parent" - app:layout_constraintTop_toBottomOf="@id/title" /> - - <Button - android:id="@+id/add_game_directory" - android:layout_width="wrap_content" - android:layout_height="wrap_content" - android:layout_marginTop="20dp" - android:text="@string/main_activity_empty_game_list_add_directory" - style="@style/Widget.AppCompat.Button.Borderless.Colored" - app:layout_constraintEnd_toEndOf="parent" - app:layout_constraintHorizontal_bias="0.5" - app:layout_constraintStart_toStartOf="parent" - app:layout_constraintTop_toBottomOf="@id/supported_formats" /> - -</androidx.constraintlayout.widget.ConstraintLayout> \ No newline at end of file diff --git a/android/app/src/main/res/layout/fragment_emulation_activity_overlay.xml b/android/app/src/main/res/layout/fragment_emulation_activity_overlay.xml deleted file mode 100644 index 2cdd354d2..000000000 --- a/android/app/src/main/res/layout/fragment_emulation_activity_overlay.xml +++ /dev/null @@ -1,113 +0,0 @@ -<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:app="http://schemas.android.com/apk/res-auto" - xmlns:tools="http://schemas.android.com/tools" - android:layout_width="match_parent" - android:layout_height="match_parent" - android:orientation="vertical"> - - <androidx.constraintlayout.widget.ConstraintLayout - android:layout_width="match_parent" - android:layout_height="wrap_content" - android:background="@color/colorPrimary" - android:orientation="horizontal"> - - <ImageView - android:id="@+id/cover_image" - android:layout_width="60dp" - android:layout_height="60dp" - android:background="?android:attr/selectableItemBackground" - app:layout_constraintStart_toStartOf="parent" - app:layout_constraintTop_toTopOf="parent" /> - - <TextView - android:id="@+id/title" - android:layout_width="0dp" - android:layout_height="wrap_content" - android:layout_marginStart="10dp" - android:layout_marginEnd="4dp" - android:layout_marginTop="4dp" - android:text="Title" - android:textAppearance="@style/TextAppearance.AppCompat.Large" - android:textColor="?android:textColorPrimary" - android:scrollHorizontally="true" - android:ellipsize="end" - android:maxLines="1" - app:layout_constraintEnd_toStartOf="@id/button_container" - app:layout_constraintStart_toEndOf="@id/cover_image" - app:layout_constraintTop_toTopOf="parent" /> - - <TextView - android:id="@+id/subtitle" - android:layout_width="0dp" - android:layout_height="wrap_content" - android:layout_marginStart="10dp" - android:layout_marginEnd="4dp" - android:layout_marginBottom="4dp" - android:text="Code - Path" - android:textColor="?android:textColorPrimary" - android:scrollHorizontally="true" - android:ellipsize="end" - android:maxLines="1" - android:textAppearance="@style/TextAppearance.AppCompat.Small" - app:layout_constraintEnd_toStartOf="@id/button_container" - app:layout_constraintStart_toEndOf="@id/cover_image" - app:layout_constraintTop_toBottomOf="@id/title" /> - - <LinearLayout - android:layout_width="wrap_content" - android:layout_height="wrap_content" - android:orientation="horizontal" - android:id="@+id/button_container" - app:layout_constraintBottom_toBottomOf="parent" - app:layout_constraintEnd_toEndOf="parent" - app:layout_constraintTop_toTopOf="parent"> - - <ImageButton - android:id="@+id/menu" - android:layout_width="40dp" - android:layout_height="60dp" - android:layout_marginEnd="5dp" - android:background="?android:attr/selectableItemBackground" - android:tint="?android:textColorPrimary" - android:contentDescription="Pause Menu" - android:src="@drawable/ic_baseline_menu_24" /> - - <ImageButton - android:id="@+id/controller_settings" - android:layout_width="40dp" - android:layout_height="60dp" - android:layout_marginEnd="5dp" - android:background="?android:attr/selectableItemBackground" - android:tint="?android:textColorPrimary" - android:contentDescription="Controller Settings" - android:src="@drawable/ic_baseline_gamepad_24" /> - - <ImageButton - android:id="@+id/settings" - android:layout_width="40dp" - android:layout_height="60dp" - android:layout_marginEnd="5dp" - android:background="?android:attr/selectableItemBackground" - android:tint="?android:textColorPrimary" - android:contentDescription="Settings" - android:src="@drawable/ic_baseline_settings_24" /> - - <ImageButton - android:id="@+id/close" - android:layout_width="40dp" - android:layout_height="60dp" - android:layout_marginEnd="5dp" - android:background="?android:attr/selectableItemBackground" - android:tint="?android:textColorPrimary" - android:contentDescription="Close" - android:src="@drawable/ic_baseline_close_24" /> - - </LinearLayout> - - </androidx.constraintlayout.widget.ConstraintLayout> - - <FrameLayout - android:id="@+id/content" - android:layout_width="match_parent" - android:layout_height="match_parent" /> -</LinearLayout> \ No newline at end of file diff --git a/android/app/src/main/res/layout/fragment_game_grid.xml b/android/app/src/main/res/layout/fragment_game_grid.xml deleted file mode 100644 index 26ce3e703..000000000 --- a/android/app/src/main/res/layout/fragment_game_grid.xml +++ /dev/null @@ -1,18 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<androidx.constraintlayout.widget.ConstraintLayout - xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:app="http://schemas.android.com/apk/res-auto" - android:layout_width="match_parent" - android:layout_height="match_parent"> - - <androidx.recyclerview.widget.RecyclerView - android:id="@+id/game_list_view" - android:layout_width="match_parent" - android:layout_height="match_parent" - android:scrollbars="vertical" - app:layout_constraintBottom_toBottomOf="parent" - app:layout_constraintLeft_toLeftOf="parent" - app:layout_constraintRight_toRightOf="parent" - app:layout_constraintTop_toTopOf="parent" /> - -</androidx.constraintlayout.widget.ConstraintLayout> \ No newline at end of file diff --git a/android/app/src/main/res/layout/fragment_game_list.xml b/android/app/src/main/res/layout/fragment_game_list.xml deleted file mode 100644 index 0d320dc6e..000000000 --- a/android/app/src/main/res/layout/fragment_game_list.xml +++ /dev/null @@ -1,17 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:app="http://schemas.android.com/apk/res-auto" - xmlns:tools="http://schemas.android.com/tools" - android:layout_width="match_parent" - android:layout_height="match_parent"> - - <androidx.recyclerview.widget.RecyclerView - android:id="@+id/game_list_view" - android:layout_width="match_parent" - android:layout_height="match_parent" - android:scrollbars="vertical" - app:layout_constraintBottom_toBottomOf="parent" - app:layout_constraintLeft_toLeftOf="parent" - app:layout_constraintRight_toRightOf="parent" - app:layout_constraintTop_toTopOf="parent" /> -</androidx.constraintlayout.widget.ConstraintLayout> \ No newline at end of file diff --git a/android/app/src/main/res/layout/fragment_memory_card_file.xml b/android/app/src/main/res/layout/fragment_memory_card_file.xml deleted file mode 100644 index 49d14e2e5..000000000 --- a/android/app/src/main/res/layout/fragment_memory_card_file.xml +++ /dev/null @@ -1,14 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:app="http://schemas.android.com/apk/res-auto" - xmlns:tools="http://schemas.android.com/tools" - android:layout_width="match_parent" - android:layout_height="match_parent" - android:orientation="vertical"> - - <androidx.recyclerview.widget.RecyclerView - android:id="@+id/recyclerView" - android:layout_width="match_parent" - android:layout_height="match_parent" /> - -</LinearLayout> \ No newline at end of file diff --git a/android/app/src/main/res/layout/fragment_settings_collection.xml b/android/app/src/main/res/layout/fragment_settings_collection.xml deleted file mode 100644 index 49bc94180..000000000 --- a/android/app/src/main/res/layout/fragment_settings_collection.xml +++ /dev/null @@ -1,22 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:app="http://schemas.android.com/apk/res-auto" - android:layout_width="match_parent" - android:layout_height="match_parent" - android:orientation="vertical"> - - <com.google.android.material.tabs.TabLayout - android:id="@+id/tab_layout" - android:layout_width="match_parent" - android:layout_height="wrap_content" - app:tabTextAppearance="@style/TabTextAppearance" - app:tabMinWidth="150dp" - app:tabMode="scrollable" /> - - <androidx.viewpager2.widget.ViewPager2 - android:id="@+id/view_pager" - android:layout_width="match_parent" - android:layout_height="0dp" - android:layout_weight="1" /> - -</LinearLayout> \ No newline at end of file diff --git a/android/app/src/main/res/layout/layout_achievement_entry.xml b/android/app/src/main/res/layout/layout_achievement_entry.xml deleted file mode 100644 index 861689833..000000000 --- a/android/app/src/main/res/layout/layout_achievement_entry.xml +++ /dev/null @@ -1,79 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:app="http://schemas.android.com/apk/res-auto" - xmlns:tools="http://schemas.android.com/tools" - android:id="@+id/linearLayout" - android:layout_width="fill_parent" - android:layout_height="wrap_content" - android:paddingTop="8dp" - android:paddingBottom="8dp" - android:background="?android:attr/selectableItemBackground"> - - <ImageView - android:id="@+id/icon" - android:layout_width="48dp" - android:layout_height="48dp" - android:layout_marginStart="8dp" - android:foregroundGravity="center_vertical" - app:layout_constraintStart_toStartOf="parent" - app:layout_constraintTop_toTopOf="parent" - tools:srcCompat="@drawable/ic_media_cdrom" /> - - <TextView - android:id="@+id/title" - android:layout_width="0dp" - android:layout_height="wrap_content" - android:layout_marginLeft="10dp" - android:layout_marginRight="80dp" - android:focusable="false" - android:focusableInTouchMode="false" - android:text="Achievement Title" - android:textAppearance="@style/TextAppearance.AppCompat.Large" - app:layout_constraintEnd_toEndOf="parent" - app:layout_constraintStart_toEndOf="@+id/icon" - app:layout_constraintTop_toTopOf="parent" /> - - <TextView - android:id="@+id/description" - android:layout_width="0dp" - android:layout_height="wrap_content" - android:layout_marginLeft="10dp" - android:layout_marginRight="80dp" - android:focusable="false" - android:focusableInTouchMode="false" - android:paddingBottom="8px" - android:text="Achievement Description" - android:textAppearance="@style/TextAppearance.AppCompat.Small" - app:layout_constraintEnd_toEndOf="parent" - app:layout_constraintStart_toEndOf="@+id/icon" - app:layout_constraintTop_toBottomOf="@+id/title" /> - - <ImageView - android:id="@+id/locked_icon" - android:layout_width="32dp" - android:layout_height="28dp" - android:layout_marginTop="4dp" - android:layout_marginEnd="24dp" - android:focusable="false" - android:focusableInTouchMode="false" - android:paddingBottom="8px" - app:layout_constraintEnd_toEndOf="parent" - app:layout_constraintTop_toTopOf="parent" - app:srcCompat="@drawable/ic_baseline_lock_24" /> - - <TextView - android:id="@+id/points" - android:layout_width="64dp" - android:layout_height="16dp" - android:layout_marginEnd="8dp" - android:focusable="false" - android:focusableInTouchMode="false" - android:text="5 Points" - android:textAlignment="center" - android:textAppearance="@style/TextAppearance.AppCompat.Small" - app:srcCompat="@drawable/ic_star_5" - app:layout_constraintEnd_toEndOf="parent" - app:layout_constraintTop_toBottomOf="@+id/locked_icon" /> - - -</androidx.constraintlayout.widget.ConstraintLayout> \ No newline at end of file diff --git a/android/app/src/main/res/layout/layout_controller_binding_preference.xml b/android/app/src/main/res/layout/layout_controller_binding_preference.xml deleted file mode 100644 index 6d9488150..000000000 --- a/android/app/src/main/res/layout/layout_controller_binding_preference.xml +++ /dev/null @@ -1,39 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:app="http://schemas.android.com/apk/res-auto" - xmlns:tools="http://schemas.android.com/tools" - android:id="@+id/linearLayout" - android:layout_width="match_parent" - android:layout_height="wrap_content" - android:orientation="vertical"> - - <ImageView - android:id="@+id/controller_binding_icon" - android:layout_width="48dp" - android:layout_height="48dp" - android:layout_marginTop="0dp" - android:layout_alignParentTop="true" - tools:srcCompat="@drawable/ic_media_cdrom" /> - - <TextView - android:id="@+id/controller_binding_name" - android:layout_width="match_parent" - android:layout_height="wrap_content" - android:layout_marginStart="16dp" - android:layout_marginTop="0dp" - android:text="Up" - android:textAppearance="@style/TextAppearance.AppCompat.Medium" - android:layout_alignParentTop="true" - android:layout_toRightOf="@id/controller_binding_icon" /> - - <TextView - android:id="@+id/controller_binding_value" - android:layout_width="match_parent" - android:layout_height="wrap_content" - android:layout_marginStart="16dp" - android:text="Controller0/Button0" - android:textAppearance="@style/TextAppearance.AppCompat.Small" - android:layout_toRightOf="@id/controller_binding_icon" - android:layout_below="@id/controller_binding_name" /> - -</RelativeLayout> \ No newline at end of file diff --git a/android/app/src/main/res/layout/layout_game_directory_entry.xml b/android/app/src/main/res/layout/layout_game_directory_entry.xml deleted file mode 100644 index d190b6f61..000000000 --- a/android/app/src/main/res/layout/layout_game_directory_entry.xml +++ /dev/null @@ -1,53 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:app="http://schemas.android.com/apk/res-auto" - android:layout_width="wrap_content" - android:layout_height="wrap_content"> - - <TextView - android:id="@+id/path" - android:layout_width="match_parent" - android:layout_height="wrap_content" - android:layout_alignParentStart="true" - android:layout_alignParentTop="true" - android:layout_marginStart="10dp" - android:layout_marginEnd="100dp" - android:layout_marginTop="4dp" - android:text="TextView" - android:textAppearance="?android:attr/textAppearanceMedium" /> - - <TextView - android:id="@+id/recursive" - android:layout_width="match_parent" - android:layout_height="wrap_content" - android:layout_marginStart="10dp" - android:layout_marginEnd="100dp" - android:layout_marginTop="4dp" - android:layout_marginBottom="4dp" - android:layout_below="@id/path" - android:layout_alignParentStart="true" - android:textAppearance="?android:attr/textAppearanceSmall" - android:text="TextView" /> - - <ImageButton - android:id="@+id/remove" - android:layout_width="30dp" - android:layout_height="30dp" - android:layout_alignParentEnd="true" - android:layout_alignParentTop="true" - android:layout_marginTop="15dp" - android:layout_marginEnd="15dp" - android:background="?android:selectableItemBackground" - app:srcCompat="@drawable/ic_baseline_delete_24" /> - - <ImageButton - android:id="@+id/toggle_recursive" - android:layout_width="30dp" - android:layout_height="30dp" - android:layout_alignParentTop="true" - android:layout_marginTop="15dp" - android:layout_marginEnd="15dp" - android:layout_toStartOf="@id/remove" - android:background="?android:selectableItemBackground" - app:srcCompat="@drawable/ic_baseline_folder_24" /> -</RelativeLayout> \ No newline at end of file diff --git a/android/app/src/main/res/layout/layout_game_grid_entry.xml b/android/app/src/main/res/layout/layout_game_grid_entry.xml deleted file mode 100644 index 6faa52b57..000000000 --- a/android/app/src/main/res/layout/layout_game_grid_entry.xml +++ /dev/null @@ -1,17 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:app="http://schemas.android.com/apk/res-auto" - xmlns:tools="http://schemas.android.com/tools" - android:layout_width="160dp" - android:layout_height="160dp" - android:layout_margin="25dp"> - - <ImageView - android:id="@+id/imageView" - android:layout_width="match_parent" - android:layout_height="match_parent" - android:foreground="?android:attr/selectableItemBackground" - app:srcCompat="@drawable/ic_media_cdrom" - tools:layout_editor_absoluteX="1dp" - tools:layout_editor_absoluteY="1dp" /> -</androidx.constraintlayout.widget.ConstraintLayout> \ No newline at end of file diff --git a/android/app/src/main/res/layout/layout_game_list_entry.xml b/android/app/src/main/res/layout/layout_game_list_entry.xml deleted file mode 100644 index 8c450af31..000000000 --- a/android/app/src/main/res/layout/layout_game_list_entry.xml +++ /dev/null @@ -1,76 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:app="http://schemas.android.com/apk/res-auto" - xmlns:tools="http://schemas.android.com/tools" - android:id="@+id/linearLayout" - android:layout_width="match_parent" - android:layout_height="wrap_content" - android:paddingTop="8dp" - android:paddingBottom="8dp" - android:background="?android:attr/selectableItemBackground"> - - <ImageView - android:id="@+id/game_list_view_entry_type_icon" - android:layout_width="48dp" - android:layout_height="48dp" - android:layout_marginStart="8dp" - android:foregroundGravity="center_vertical" - app:layout_constraintStart_toStartOf="parent" - app:layout_constraintTop_toTopOf="parent" - tools:srcCompat="@drawable/ic_media_cdrom" /> - - <TextView - android:id="@+id/game_list_view_entry_title" - android:layout_width="0dp" - android:layout_height="wrap_content" - android:layout_marginLeft="10dp" - android:layout_marginRight="80dp" - android:focusable="false" - android:focusableInTouchMode="false" - android:text="Game Title" - android:textAppearance="@style/TextAppearance.AppCompat.Large" - app:layout_constraintEnd_toEndOf="parent" - app:layout_constraintStart_toEndOf="@+id/game_list_view_entry_type_icon" - app:layout_constraintTop_toTopOf="parent" /> - - <TextView - android:id="@+id/game_list_view_entry_subtitle" - android:layout_width="0dp" - android:layout_height="wrap_content" - android:layout_marginLeft="10dp" - android:layout_marginRight="80dp" - android:focusable="false" - android:focusableInTouchMode="false" - android:paddingBottom="8px" - android:text="Game Path" - android:textAppearance="@style/TextAppearance.AppCompat.Small" - app:layout_constraintEnd_toEndOf="parent" - app:layout_constraintStart_toEndOf="@+id/game_list_view_entry_type_icon" - app:layout_constraintTop_toBottomOf="@+id/game_list_view_entry_title" /> - - <ImageView - android:id="@+id/game_list_view_compatibility_icon" - android:layout_width="64dp" - android:layout_height="16dp" - android:layout_marginEnd="8dp" - android:focusable="false" - android:focusableInTouchMode="false" - android:textAppearance="@style/TextAppearance.AppCompat.Small" - app:srcCompat="@drawable/ic_star_5" - app:layout_constraintEnd_toEndOf="parent" - app:layout_constraintTop_toTopOf="parent" /> - - <ImageView - android:id="@+id/game_list_view_entry_region_icon" - android:layout_width="32dp" - android:layout_height="28dp" - android:layout_marginTop="4dp" - android:layout_marginEnd="24dp" - android:focusable="false" - android:focusableInTouchMode="false" - android:paddingBottom="8px" - app:layout_constraintEnd_toEndOf="parent" - app:layout_constraintTop_toBottomOf="@+id/game_list_view_compatibility_icon" - app:srcCompat="@drawable/flag_jp" /> - -</androidx.constraintlayout.widget.ConstraintLayout> \ No newline at end of file diff --git a/android/app/src/main/res/layout/layout_game_property_entry.xml b/android/app/src/main/res/layout/layout_game_property_entry.xml deleted file mode 100644 index 47ede3ee3..000000000 --- a/android/app/src/main/res/layout/layout_game_property_entry.xml +++ /dev/null @@ -1,26 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" - android:layout_width="match_parent" - android:layout_height="match_parent"> - - <TextView - android:id="@+id/property_title" - android:layout_width="wrap_content" - android:layout_height="wrap_content" - android:layout_marginTop="4dp" - android:layout_marginStart="10dp" - android:layout_alignParentTop="true" - android:text="TextView" - android:textAppearance="?android:attr/textAppearanceMedium" /> - - <TextView - android:id="@+id/property_value" - android:layout_width="wrap_content" - android:layout_height="wrap_content" - android:layout_marginStart="10dp" - android:layout_marginTop="4dp" - android:layout_marginBottom="4dp" - android:layout_below="@id/property_title" - android:textAppearance="?android:attr/textAppearanceSmall" - android:text="TextView" /> -</RelativeLayout> \ No newline at end of file diff --git a/android/app/src/main/res/layout/layout_memory_card_save.xml b/android/app/src/main/res/layout/layout_memory_card_save.xml deleted file mode 100644 index caab01ec7..000000000 --- a/android/app/src/main/res/layout/layout_memory_card_save.xml +++ /dev/null @@ -1,82 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:app="http://schemas.android.com/apk/res-auto" - xmlns:tools="http://schemas.android.com/tools" - android:id="@+id/linearLayout" - android:layout_width="fill_parent" - android:layout_height="wrap_content" - android:paddingTop="8dp" - android:paddingBottom="8dp" - android:background="?android:attr/selectableItemBackground"> - - <ImageView - android:id="@+id/icon" - android:layout_width="48dp" - android:layout_height="48dp" - android:layout_marginStart="8dp" - android:foregroundGravity="center_vertical" - app:layout_constraintStart_toStartOf="parent" - app:layout_constraintTop_toTopOf="parent" - tools:srcCompat="@drawable/ic_media_cdrom" /> - - <TextView - android:id="@+id/title" - android:layout_width="0dp" - android:layout_height="wrap_content" - android:layout_marginLeft="10dp" - android:layout_marginRight="80dp" - android:focusable="false" - android:focusableInTouchMode="false" - android:text="Save Title" - android:textAppearance="@style/TextAppearance.AppCompat.Large" - app:layout_constraintEnd_toEndOf="parent" - app:layout_constraintStart_toEndOf="@+id/icon" - app:layout_constraintTop_toTopOf="parent" /> - - <TextView - android:id="@+id/filename" - android:layout_width="0dp" - android:layout_height="wrap_content" - android:layout_marginLeft="10dp" - android:layout_marginRight="80dp" - android:focusable="false" - android:focusableInTouchMode="false" - android:paddingBottom="8px" - android:text="Save Filename" - android:textAppearance="@style/TextAppearance.AppCompat.Small" - app:layout_constraintEnd_toEndOf="parent" - app:layout_constraintStart_toEndOf="@+id/icon" - app:layout_constraintTop_toBottomOf="@+id/title" /> - - <TextView - android:id="@+id/block_size" - android:layout_width="64dp" - android:layout_height="20dp" - android:layout_marginTop="4dp" - android:layout_marginEnd="8dp" - android:focusable="false" - android:focusableInTouchMode="false" - android:paddingBottom="8px" - android:text="1 Block" - android:textAlignment="viewEnd" - android:textAppearance="@style/TextAppearance.AppCompat.Small" - app:layout_constraintEnd_toEndOf="parent" - app:layout_constraintTop_toTopOf="parent" - app:srcCompat="@drawable/ic_baseline_lock_24" /> - - <TextView - android:id="@+id/file_size" - android:layout_width="64dp" - android:layout_height="20dp" - android:layout_marginEnd="8dp" - android:focusable="false" - android:focusableInTouchMode="false" - android:text="16KB" - android:textAlignment="viewEnd" - android:textAppearance="@style/TextAppearance.AppCompat.Small" - app:srcCompat="@drawable/ic_star_5" - app:layout_constraintEnd_toEndOf="parent" - app:layout_constraintTop_toBottomOf="@+id/block_size" /> - - -</androidx.constraintlayout.widget.ConstraintLayout> \ No newline at end of file diff --git a/android/app/src/main/res/layout/layout_ratio_preference.xml b/android/app/src/main/res/layout/layout_ratio_preference.xml deleted file mode 100644 index 1191b62f0..000000000 --- a/android/app/src/main/res/layout/layout_ratio_preference.xml +++ /dev/null @@ -1,26 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:app="http://schemas.android.com/apk/res-auto" - xmlns:tools="http://schemas.android.com/tools" - android:layout_width="wrap_content" - android:layout_height="wrap_content" - android:orientation="horizontal"> - - <Spinner - android:id="@+id/numerator" - android:layout_width="wrap_content" - android:layout_height="wrap_content" - android:layout_gravity="center_vertical" /> - - <TextView - android:layout_width="wrap_content" - android:layout_height="wrap_content" - android:layout_gravity="center_vertical" - android:text=":" /> - - <Spinner - android:id="@+id/denominator" - android:layout_width="wrap_content" - android:layout_height="wrap_content" - android:layout_gravity="center_vertical" /> -</LinearLayout> \ No newline at end of file diff --git a/android/app/src/main/res/layout/layout_touchscreen_controller_analog_stick.xml b/android/app/src/main/res/layout/layout_touchscreen_controller_analog_stick.xml deleted file mode 100644 index ac7ffb4af..000000000 --- a/android/app/src/main/res/layout/layout_touchscreen_controller_analog_stick.xml +++ /dev/null @@ -1,255 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:app="http://schemas.android.com/apk/res-auto" - xmlns:tools="http://schemas.android.com/tools" - android:id="@+id/constraintLayout" - android:layout_width="match_parent" - android:layout_height="match_parent" - android:orientation="vertical" - android:clipChildren="false"> - - <View - android:layout_width="wrap_content" - android:layout_height="wrap_content" - android:translationZ="-10px" - app:layout_constraintBottom_toBottomOf="parent" - app:layout_constraintEnd_toEndOf="parent" - app:layout_constraintStart_toStartOf="parent" - app:layout_constraintTop_toTopOf="parent" /> - - <com.github.stenzek.duckstation.TouchscreenControllerButtonView - android:id="@+id/controller_button_r2" - android:layout_width="70dp" - android:layout_height="35dp" - android:layout_marginEnd="60dp" - android:layout_marginBottom="280dp" - app:layout_constraintBottom_toBottomOf="parent" - app:layout_constraintEnd_toEndOf="parent" - app:pressedDrawable="@drawable/ic_controller_r2_button_pressed" - app:unpressedDrawable="@drawable/ic_controller_r2_button" /> - - <com.github.stenzek.duckstation.TouchscreenControllerButtonView - android:id="@+id/controller_button_r1" - android:layout_width="70dp" - android:layout_height="35dp" - android:layout_marginEnd="60dp" - android:layout_marginBottom="220dp" - app:layout_constraintBottom_toBottomOf="parent" - app:layout_constraintEnd_toEndOf="parent" - app:pressedDrawable="@drawable/ic_controller_r1_button_pressed" - app:unpressedDrawable="@drawable/ic_controller_r1_button" /> - - <com.github.stenzek.duckstation.TouchscreenControllerButtonView - android:id="@+id/controller_button_l1" - android:layout_width="70dp" - android:layout_height="35dp" - android:layout_marginStart="60dp" - android:layout_marginBottom="220dp" - app:layout_constraintBottom_toBottomOf="parent" - app:layout_constraintStart_toStartOf="parent" - app:pressedDrawable="@drawable/ic_controller_l1_button_pressed" - app:unpressedDrawable="@drawable/ic_controller_l1_button" /> - - <com.github.stenzek.duckstation.TouchscreenControllerButtonView - android:id="@+id/controller_button_l2" - android:layout_width="70dp" - android:layout_height="35dp" - android:layout_marginStart="60dp" - android:layout_marginBottom="280dp" - app:layout_constraintBottom_toBottomOf="parent" - app:layout_constraintStart_toStartOf="parent" - app:pressedDrawable="@drawable/ic_controller_l2_button_pressed" - app:unpressedDrawable="@drawable/ic_controller_l2_button" /> - - <com.github.stenzek.duckstation.TouchscreenControllerButtonView - android:id="@+id/controller_button_start" - android:layout_width="40dp" - android:layout_height="25dp" - android:layout_marginStart="70dp" - android:layout_marginBottom="8dp" - app:layout_constraintBottom_toBottomOf="parent" - app:layout_constraintEnd_toEndOf="parent" - app:layout_constraintHorizontal_bias="0.5" - app:layout_constraintStart_toStartOf="parent" - app:pressedDrawable="@drawable/ic_controller_start_button_pressed" - app:unpressedDrawable="@drawable/ic_controller_start_button" /> - - <com.github.stenzek.duckstation.TouchscreenControllerButtonView - android:id="@+id/controller_button_select" - android:layout_width="40dp" - android:layout_height="25dp" - android:layout_marginEnd="70dp" - android:layout_marginBottom="8dp" - app:layout_constraintBottom_toBottomOf="parent" - app:layout_constraintEnd_toEndOf="parent" - app:layout_constraintHorizontal_bias="0.5" - app:layout_constraintStart_toStartOf="parent" - app:pressedDrawable="@drawable/ic_controller_select_button_pressed" - app:unpressedDrawable="@drawable/ic_controller_select_button" /> - - <com.github.stenzek.duckstation.TouchscreenControllerButtonView - android:id="@+id/controller_button_cross" - android:layout_width="50dp" - android:layout_height="50dp" - android:layout_marginEnd="70dp" - android:layout_marginBottom="30dp" - app:layout_constraintBottom_toBottomOf="parent" - app:layout_constraintEnd_toEndOf="parent" - app:pressedDrawable="@drawable/ic_controller_cross_button_pressed" - app:unpressedDrawable="@drawable/ic_controller_cross_button" /> - - <com.github.stenzek.duckstation.TouchscreenControllerButtonView - android:id="@+id/controller_button_square" - android:layout_width="50dp" - android:layout_height="50dp" - android:layout_marginEnd="120dp" - android:layout_marginBottom="80dp" - app:layout_constraintBottom_toBottomOf="parent" - app:layout_constraintEnd_toEndOf="parent" - app:pressedDrawable="@drawable/ic_controller_square_button_pressed" - app:unpressedDrawable="@drawable/ic_controller_square_button" /> - - <com.github.stenzek.duckstation.TouchscreenControllerButtonView - android:id="@+id/controller_button_triangle" - android:layout_width="50dp" - android:layout_height="50dp" - android:layout_marginEnd="70dp" - android:layout_marginBottom="130dp" - app:layout_constraintBottom_toBottomOf="parent" - app:layout_constraintEnd_toEndOf="parent" - app:pressedDrawable="@drawable/ic_controller_triangle_button_pressed" - app:unpressedDrawable="@drawable/ic_controller_triangle_button" /> - - <com.github.stenzek.duckstation.TouchscreenControllerButtonView - android:id="@+id/controller_button_circle" - android:layout_width="50dp" - android:layout_height="50dp" - android:layout_marginEnd="20dp" - android:layout_marginBottom="80dp" - app:layout_constraintBottom_toBottomOf="parent" - app:layout_constraintEnd_toEndOf="parent" - app:pressedDrawable="@drawable/ic_controller_circle_button_pressed" - app:unpressedDrawable="@drawable/ic_controller_circle_button" /> - - <com.github.stenzek.duckstation.TouchscreenControllerAxisView - android:id="@+id/controller_axis_left" - android:layout_width="150dp" - android:layout_height="150dp" - android:layout_marginStart="20dp" - android:layout_marginBottom="30dp" - android:paddingTop="20dp" - android:paddingBottom="20dp" - android:paddingLeft="20dp" - android:paddingRight="20dp" - app:layout_constraintBottom_toBottomOf="parent" - app:layout_constraintStart_toStartOf="parent" /> - - <com.github.stenzek.duckstation.TouchscreenControllerButtonView - android:id="@+id/controller_button_fast_forward" - android:layout_width="35dp" - android:layout_height="35dp" - android:layout_marginBottom="50dp" - app:layout_constraintBottom_toBottomOf="parent" - app:layout_constraintEnd_toEndOf="parent" - app:layout_constraintHorizontal_bias="0.5" - app:layout_constraintStart_toStartOf="parent" - app:pressedDrawable="@drawable/ic_controller_fast_forward_pressed" - app:unpressedDrawable="@drawable/ic_controller_fast_forward" /> - - <com.github.stenzek.duckstation.TouchscreenControllerButtonView - android:id="@+id/controller_button_analog" - android:layout_width="35dp" - android:layout_height="35dp" - android:layout_marginBottom="95dp" - app:layout_constraintBottom_toBottomOf="parent" - app:layout_constraintEnd_toEndOf="parent" - app:layout_constraintHorizontal_bias="0.5" - app:layout_constraintStart_toStartOf="parent" - app:pressedDrawable="@drawable/ic_controller_analog_button_pressed" - app:unpressedDrawable="@drawable/ic_controller_analog_button" /> - - <com.github.stenzek.duckstation.TouchscreenControllerButtonView - android:id="@+id/controller_button_pause" - android:layout_width="35dp" - android:layout_height="35dp" - android:layout_marginTop="20dp" - android:layout_marginRight="20dp" - app:layout_constraintTop_toTopOf="parent" - app:layout_constraintEnd_toEndOf="parent" - app:pressedDrawable="@drawable/ic_controller_pause_button" - app:unpressedDrawable="@drawable/ic_controller_pause_button" /> - - <com.github.stenzek.duckstation.TouchscreenControllerButtonView - android:id="@+id/controller_button_quick_load" - android:layout_width="35dp" - android:layout_height="35dp" - android:layout_marginTop="20dp" - android:layout_marginLeft="20dp" - app:layout_constraintTop_toTopOf="parent" - app:layout_constraintStart_toStartOf="parent" - app:pressedDrawable="@drawable/ic_controller_quick_load_button" - app:unpressedDrawable="@drawable/ic_controller_quick_load_button" /> - - <com.github.stenzek.duckstation.TouchscreenControllerButtonView - android:id="@+id/controller_button_quick_save" - android:layout_width="35dp" - android:layout_height="35dp" - android:layout_marginTop="20dp" - android:layout_marginLeft="75dp" - app:layout_constraintTop_toTopOf="parent" - app:layout_constraintStart_toStartOf="parent" - app:pressedDrawable="@drawable/ic_controller_quick_save_button" - app:unpressedDrawable="@drawable/ic_controller_quick_save_button" /> - - <com.github.stenzek.duckstation.TouchscreenControllerButtonView - android:id="@+id/controller_button_autofire_1" - android:layout_width="35dp" - android:layout_height="35dp" - android:layout_marginEnd="60dp" - android:layout_marginBottom="220dp" - app:layout_constraintBottom_toBottomOf="parent" - app:layout_constraintEnd_toEndOf="parent" - app:layout_constraintHorizontal_bias="0.5" - app:layout_constraintStart_toStartOf="parent" - app:pressedDrawable="@drawable/ic_controller_t1_button_pressed" - app:unpressedDrawable="@drawable/ic_controller_t1_button" /> - - <com.github.stenzek.duckstation.TouchscreenControllerButtonView - android:id="@+id/controller_button_autofire_2" - android:layout_width="35dp" - android:layout_height="35dp" - android:layout_marginStart="60dp" - android:layout_marginBottom="220dp" - app:layout_constraintBottom_toBottomOf="parent" - app:layout_constraintEnd_toEndOf="parent" - app:layout_constraintHorizontal_bias="0.5" - app:layout_constraintStart_toStartOf="parent" - app:pressedDrawable="@drawable/ic_controller_t2_button_pressed" - app:unpressedDrawable="@drawable/ic_controller_t2_button" /> - - <com.github.stenzek.duckstation.TouchscreenControllerButtonView - android:id="@+id/controller_button_autofire_3" - android:layout_width="35dp" - android:layout_height="35dp" - android:layout_marginEnd="60dp" - android:layout_marginBottom="280dp" - app:layout_constraintBottom_toBottomOf="parent" - app:layout_constraintEnd_toEndOf="parent" - app:layout_constraintHorizontal_bias="0.5" - app:layout_constraintStart_toStartOf="parent" - app:pressedDrawable="@drawable/ic_controller_t3_button_pressed" - app:unpressedDrawable="@drawable/ic_controller_t3_button" /> - - <com.github.stenzek.duckstation.TouchscreenControllerButtonView - android:id="@+id/controller_button_autofire_4" - android:layout_width="35dp" - android:layout_height="35dp" - android:layout_marginStart="60dp" - android:layout_marginBottom="280dp" - app:layout_constraintBottom_toBottomOf="parent" - app:layout_constraintEnd_toEndOf="parent" - app:layout_constraintHorizontal_bias="0.5" - app:layout_constraintStart_toStartOf="parent" - app:pressedDrawable="@drawable/ic_controller_t4_button_pressed" - app:unpressedDrawable="@drawable/ic_controller_t4_button" /> -</androidx.constraintlayout.widget.ConstraintLayout> \ No newline at end of file diff --git a/android/app/src/main/res/layout/layout_touchscreen_controller_analog_sticks.xml b/android/app/src/main/res/layout/layout_touchscreen_controller_analog_sticks.xml deleted file mode 100644 index 3af81d8bf..000000000 --- a/android/app/src/main/res/layout/layout_touchscreen_controller_analog_sticks.xml +++ /dev/null @@ -1,277 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:app="http://schemas.android.com/apk/res-auto" - xmlns:tools="http://schemas.android.com/tools" - android:id="@+id/constraintLayout" - android:layout_width="match_parent" - android:layout_height="match_parent" - android:orientation="vertical" - android:clipChildren="false"> - - <View - android:layout_width="wrap_content" - android:layout_height="wrap_content" - android:translationZ="-10px" - app:layout_constraintBottom_toBottomOf="parent" - app:layout_constraintEnd_toEndOf="parent" - app:layout_constraintStart_toStartOf="parent" - app:layout_constraintTop_toTopOf="parent" /> - - <com.github.stenzek.duckstation.TouchscreenControllerButtonView - android:id="@+id/controller_button_r2" - android:layout_width="70dp" - android:layout_height="35dp" - android:layout_marginEnd="60dp" - android:layout_marginBottom="260dp" - app:layout_constraintBottom_toBottomOf="parent" - app:layout_constraintEnd_toEndOf="parent" - app:pressedDrawable="@drawable/ic_controller_r2_button_pressed" - app:unpressedDrawable="@drawable/ic_controller_r2_button" /> - - <com.github.stenzek.duckstation.TouchscreenControllerButtonView - android:id="@+id/controller_button_r1" - android:layout_width="70dp" - android:layout_height="35dp" - android:layout_marginEnd="60dp" - android:layout_marginBottom="200dp" - app:layout_constraintBottom_toBottomOf="parent" - app:layout_constraintEnd_toEndOf="parent" - app:pressedDrawable="@drawable/ic_controller_r1_button_pressed" - app:unpressedDrawable="@drawable/ic_controller_r1_button" /> - - <com.github.stenzek.duckstation.TouchscreenControllerButtonView - android:id="@+id/controller_button_l1" - android:layout_width="70dp" - android:layout_height="35dp" - android:layout_marginStart="60dp" - android:layout_marginBottom="200dp" - app:layout_constraintBottom_toBottomOf="parent" - app:layout_constraintStart_toStartOf="parent" - app:pressedDrawable="@drawable/ic_controller_l1_button_pressed" - app:unpressedDrawable="@drawable/ic_controller_l1_button" /> - - <com.github.stenzek.duckstation.TouchscreenControllerButtonView - android:id="@+id/controller_button_l2" - android:layout_width="70dp" - android:layout_height="35dp" - android:layout_marginStart="60dp" - android:layout_marginBottom="260dp" - app:layout_constraintBottom_toBottomOf="parent" - app:layout_constraintStart_toStartOf="parent" - app:pressedDrawable="@drawable/ic_controller_l2_button_pressed" - app:unpressedDrawable="@drawable/ic_controller_l2_button" /> - - <com.github.stenzek.duckstation.TouchscreenControllerButtonView - android:id="@+id/controller_button_start" - android:layout_width="40dp" - android:layout_height="25dp" - android:layout_marginStart="70dp" - android:layout_marginBottom="8dp" - app:layout_constraintBottom_toBottomOf="parent" - app:layout_constraintEnd_toEndOf="parent" - app:layout_constraintHorizontal_bias="0.5" - app:layout_constraintStart_toStartOf="parent" - app:pressedDrawable="@drawable/ic_controller_start_button_pressed" - app:unpressedDrawable="@drawable/ic_controller_start_button" /> - - <com.github.stenzek.duckstation.TouchscreenControllerButtonView - android:id="@+id/controller_button_select" - android:layout_width="40dp" - android:layout_height="25dp" - android:layout_marginEnd="70dp" - android:layout_marginBottom="8dp" - app:layout_constraintBottom_toBottomOf="parent" - app:layout_constraintEnd_toEndOf="parent" - app:layout_constraintHorizontal_bias="0.5" - app:layout_constraintStart_toStartOf="parent" - app:pressedDrawable="@drawable/ic_controller_select_button_pressed" - app:unpressedDrawable="@drawable/ic_controller_select_button" /> - - <com.github.stenzek.duckstation.TouchscreenControllerButtonView - android:id="@+id/controller_button_cross" - android:layout_width="50dp" - android:layout_height="50dp" - android:layout_marginEnd="70dp" - android:layout_marginBottom="30dp" - app:layout_constraintBottom_toBottomOf="parent" - app:layout_constraintEnd_toEndOf="parent" - app:pressedDrawable="@drawable/ic_controller_cross_button_pressed" - app:unpressedDrawable="@drawable/ic_controller_cross_button" /> - - <com.github.stenzek.duckstation.TouchscreenControllerButtonView - android:id="@+id/controller_button_square" - android:layout_width="50dp" - android:layout_height="50dp" - android:layout_marginEnd="120dp" - android:layout_marginBottom="80dp" - app:layout_constraintBottom_toBottomOf="parent" - app:layout_constraintEnd_toEndOf="parent" - app:pressedDrawable="@drawable/ic_controller_square_button_pressed" - app:unpressedDrawable="@drawable/ic_controller_square_button" /> - - <com.github.stenzek.duckstation.TouchscreenControllerButtonView - android:id="@+id/controller_button_triangle" - android:layout_width="50dp" - android:layout_height="50dp" - android:layout_marginEnd="70dp" - android:layout_marginBottom="130dp" - app:layout_constraintBottom_toBottomOf="parent" - app:layout_constraintEnd_toEndOf="parent" - app:pressedDrawable="@drawable/ic_controller_triangle_button_pressed" - app:unpressedDrawable="@drawable/ic_controller_triangle_button" /> - - <com.github.stenzek.duckstation.TouchscreenControllerButtonView - android:id="@+id/controller_button_circle" - android:layout_width="50dp" - android:layout_height="50dp" - android:layout_marginEnd="20dp" - android:layout_marginBottom="80dp" - app:layout_constraintBottom_toBottomOf="parent" - app:layout_constraintEnd_toEndOf="parent" - app:pressedDrawable="@drawable/ic_controller_circle_button_pressed" - app:unpressedDrawable="@drawable/ic_controller_circle_button" /> - - <com.github.stenzek.duckstation.TouchscreenControllerAxisView - android:id="@+id/controller_axis_left" - android:layout_width="150dp" - android:layout_height="150dp" - android:layout_marginStart="20dp" - android:layout_marginBottom="30dp" - android:paddingTop="20dp" - android:paddingBottom="20dp" - android:paddingLeft="20dp" - android:paddingRight="20dp" - app:layout_constraintBottom_toBottomOf="parent" - app:layout_constraintStart_toStartOf="parent" /> - - <com.github.stenzek.duckstation.TouchscreenControllerAxisView - android:id="@+id/controller_axis_right" - android:layout_width="150dp" - android:layout_height="150dp" - android:layout_marginEnd="20dp" - android:layout_marginBottom="300dp" - android:paddingLeft="20dp" - android:paddingTop="20dp" - android:paddingRight="20dp" - android:paddingBottom="20dp" - app:layout_constraintBottom_toBottomOf="parent" - app:layout_constraintEnd_toEndOf="parent" /> - - <com.github.stenzek.duckstation.TouchscreenControllerDPadView - android:id="@+id/controller_dpad" - android:layout_width="150dp" - android:layout_height="150dp" - android:layout_marginStart="20dp" - android:layout_marginBottom="300dp" - app:layout_constraintBottom_toBottomOf="parent" - app:layout_constraintStart_toStartOf="parent" /> - - <com.github.stenzek.duckstation.TouchscreenControllerButtonView - android:id="@+id/controller_button_fast_forward" - android:layout_width="35dp" - android:layout_height="35dp" - android:layout_marginBottom="50dp" - app:layout_constraintBottom_toBottomOf="parent" - app:layout_constraintEnd_toEndOf="parent" - app:layout_constraintHorizontal_bias="0.5" - app:layout_constraintStart_toStartOf="parent" - app:pressedDrawable="@drawable/ic_controller_fast_forward_pressed" - app:unpressedDrawable="@drawable/ic_controller_fast_forward" /> - - <com.github.stenzek.duckstation.TouchscreenControllerButtonView - android:id="@+id/controller_button_analog" - android:layout_width="35dp" - android:layout_height="35dp" - android:layout_marginBottom="95dp" - app:layout_constraintBottom_toBottomOf="parent" - app:layout_constraintEnd_toEndOf="parent" - app:layout_constraintHorizontal_bias="0.5" - app:layout_constraintStart_toStartOf="parent" - app:pressedDrawable="@drawable/ic_controller_analog_button_pressed" - app:unpressedDrawable="@drawable/ic_controller_analog_button" /> - - <com.github.stenzek.duckstation.TouchscreenControllerButtonView - android:id="@+id/controller_button_pause" - android:layout_width="35dp" - android:layout_height="35dp" - android:layout_marginTop="20dp" - android:layout_marginRight="20dp" - app:layout_constraintTop_toTopOf="parent" - app:layout_constraintEnd_toEndOf="parent" - app:pressedDrawable="@drawable/ic_controller_pause_button" - app:unpressedDrawable="@drawable/ic_controller_pause_button" /> - - <com.github.stenzek.duckstation.TouchscreenControllerButtonView - android:id="@+id/controller_button_quick_load" - android:layout_width="35dp" - android:layout_height="35dp" - android:layout_marginTop="20dp" - android:layout_marginLeft="20dp" - app:layout_constraintTop_toTopOf="parent" - app:layout_constraintStart_toStartOf="parent" - app:pressedDrawable="@drawable/ic_controller_quick_load_button" - app:unpressedDrawable="@drawable/ic_controller_quick_load_button" /> - - <com.github.stenzek.duckstation.TouchscreenControllerButtonView - android:id="@+id/controller_button_quick_save" - android:layout_width="35dp" - android:layout_height="35dp" - android:layout_marginTop="20dp" - android:layout_marginLeft="75dp" - app:layout_constraintTop_toTopOf="parent" - app:layout_constraintStart_toStartOf="parent" - app:pressedDrawable="@drawable/ic_controller_quick_save_button" - app:unpressedDrawable="@drawable/ic_controller_quick_save_button" /> - - <com.github.stenzek.duckstation.TouchscreenControllerButtonView - android:id="@+id/controller_button_autofire_1" - android:layout_width="35dp" - android:layout_height="35dp" - android:layout_marginEnd="60dp" - android:layout_marginBottom="220dp" - app:layout_constraintBottom_toBottomOf="parent" - app:layout_constraintEnd_toEndOf="parent" - app:layout_constraintHorizontal_bias="0.5" - app:layout_constraintStart_toStartOf="parent" - app:pressedDrawable="@drawable/ic_controller_t1_button_pressed" - app:unpressedDrawable="@drawable/ic_controller_t1_button" /> - - <com.github.stenzek.duckstation.TouchscreenControllerButtonView - android:id="@+id/controller_button_autofire_2" - android:layout_width="35dp" - android:layout_height="35dp" - android:layout_marginStart="60dp" - android:layout_marginBottom="220dp" - app:layout_constraintBottom_toBottomOf="parent" - app:layout_constraintEnd_toEndOf="parent" - app:layout_constraintHorizontal_bias="0.5" - app:layout_constraintStart_toStartOf="parent" - app:pressedDrawable="@drawable/ic_controller_t2_button_pressed" - app:unpressedDrawable="@drawable/ic_controller_t2_button" /> - - <com.github.stenzek.duckstation.TouchscreenControllerButtonView - android:id="@+id/controller_button_autofire_3" - android:layout_width="35dp" - android:layout_height="35dp" - android:layout_marginEnd="60dp" - android:layout_marginBottom="280dp" - app:layout_constraintBottom_toBottomOf="parent" - app:layout_constraintEnd_toEndOf="parent" - app:layout_constraintHorizontal_bias="0.5" - app:layout_constraintStart_toStartOf="parent" - app:pressedDrawable="@drawable/ic_controller_t3_button_pressed" - app:unpressedDrawable="@drawable/ic_controller_t3_button" /> - - <com.github.stenzek.duckstation.TouchscreenControllerButtonView - android:id="@+id/controller_button_autofire_4" - android:layout_width="35dp" - android:layout_height="35dp" - android:layout_marginStart="60dp" - android:layout_marginBottom="280dp" - app:layout_constraintBottom_toBottomOf="parent" - app:layout_constraintEnd_toEndOf="parent" - app:layout_constraintHorizontal_bias="0.5" - app:layout_constraintStart_toStartOf="parent" - app:pressedDrawable="@drawable/ic_controller_t4_button_pressed" - app:unpressedDrawable="@drawable/ic_controller_t4_button" /> -</androidx.constraintlayout.widget.ConstraintLayout> \ No newline at end of file diff --git a/android/app/src/main/res/layout/layout_touchscreen_controller_digital.xml b/android/app/src/main/res/layout/layout_touchscreen_controller_digital.xml deleted file mode 100644 index 163a07b4f..000000000 --- a/android/app/src/main/res/layout/layout_touchscreen_controller_digital.xml +++ /dev/null @@ -1,239 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:app="http://schemas.android.com/apk/res-auto" - xmlns:tools="http://schemas.android.com/tools" - android:id="@+id/constraintLayout" - android:layout_width="match_parent" - android:layout_height="match_parent" - android:orientation="vertical" - android:clipChildren="false"> - - <View - android:layout_width="wrap_content" - android:layout_height="wrap_content" - android:translationZ="-10px" - app:layout_constraintBottom_toBottomOf="parent" - app:layout_constraintEnd_toEndOf="parent" - app:layout_constraintStart_toStartOf="parent" - app:layout_constraintTop_toTopOf="parent" /> - - <com.github.stenzek.duckstation.TouchscreenControllerButtonView - android:id="@+id/controller_button_r2" - android:layout_width="70dp" - android:layout_height="35dp" - android:layout_marginEnd="60dp" - android:layout_marginBottom="280dp" - app:layout_constraintBottom_toBottomOf="parent" - app:layout_constraintEnd_toEndOf="parent" - app:pressedDrawable="@drawable/ic_controller_r2_button_pressed" - app:unpressedDrawable="@drawable/ic_controller_r2_button" /> - - <com.github.stenzek.duckstation.TouchscreenControllerButtonView - android:id="@+id/controller_button_r1" - android:layout_width="70dp" - android:layout_height="35dp" - android:layout_marginEnd="60dp" - android:layout_marginBottom="220dp" - app:layout_constraintBottom_toBottomOf="parent" - app:layout_constraintEnd_toEndOf="parent" - app:pressedDrawable="@drawable/ic_controller_r1_button_pressed" - app:unpressedDrawable="@drawable/ic_controller_r1_button" /> - - <com.github.stenzek.duckstation.TouchscreenControllerDPadView - android:id="@+id/controller_dpad" - android:layout_width="150dp" - android:layout_height="150dp" - android:layout_marginStart="20dp" - android:layout_marginBottom="30dp" - app:layout_constraintBottom_toBottomOf="parent" - app:layout_constraintStart_toStartOf="parent" /> - - <com.github.stenzek.duckstation.TouchscreenControllerButtonView - android:id="@+id/controller_button_l1" - android:layout_width="70dp" - android:layout_height="35dp" - android:layout_marginStart="60dp" - android:layout_marginBottom="220dp" - app:layout_constraintBottom_toBottomOf="parent" - app:layout_constraintStart_toStartOf="parent" - app:pressedDrawable="@drawable/ic_controller_l1_button_pressed" - app:unpressedDrawable="@drawable/ic_controller_l1_button" /> - - <com.github.stenzek.duckstation.TouchscreenControllerButtonView - android:id="@+id/controller_button_l2" - android:layout_width="70dp" - android:layout_height="35dp" - android:layout_marginStart="60dp" - android:layout_marginBottom="280dp" - app:layout_constraintBottom_toBottomOf="parent" - app:layout_constraintStart_toStartOf="parent" - app:pressedDrawable="@drawable/ic_controller_l2_button_pressed" - app:unpressedDrawable="@drawable/ic_controller_l2_button" /> - - <com.github.stenzek.duckstation.TouchscreenControllerButtonView - android:id="@+id/controller_button_start" - android:layout_width="40dp" - android:layout_height="25dp" - android:layout_marginStart="70dp" - android:layout_marginBottom="8dp" - app:layout_constraintBottom_toBottomOf="parent" - app:layout_constraintEnd_toEndOf="parent" - app:layout_constraintHorizontal_bias="0.5" - app:layout_constraintStart_toStartOf="parent" - app:pressedDrawable="@drawable/ic_controller_start_button_pressed" - app:unpressedDrawable="@drawable/ic_controller_start_button" /> - - <com.github.stenzek.duckstation.TouchscreenControllerButtonView - android:id="@+id/controller_button_select" - android:layout_width="40dp" - android:layout_height="25dp" - android:layout_marginEnd="70dp" - android:layout_marginBottom="8dp" - app:layout_constraintBottom_toBottomOf="parent" - app:layout_constraintEnd_toEndOf="parent" - app:layout_constraintHorizontal_bias="0.5" - app:layout_constraintStart_toStartOf="parent" - app:pressedDrawable="@drawable/ic_controller_select_button_pressed" - app:unpressedDrawable="@drawable/ic_controller_select_button" /> - - <com.github.stenzek.duckstation.TouchscreenControllerButtonView - android:id="@+id/controller_button_cross" - android:layout_width="50dp" - android:layout_height="50dp" - android:layout_marginEnd="70dp" - android:layout_marginBottom="30dp" - app:layout_constraintBottom_toBottomOf="parent" - app:layout_constraintEnd_toEndOf="parent" - app:pressedDrawable="@drawable/ic_controller_cross_button_pressed" - app:unpressedDrawable="@drawable/ic_controller_cross_button" /> - - <com.github.stenzek.duckstation.TouchscreenControllerButtonView - android:id="@+id/controller_button_square" - android:layout_width="50dp" - android:layout_height="50dp" - android:layout_marginEnd="120dp" - android:layout_marginBottom="80dp" - app:layout_constraintBottom_toBottomOf="parent" - app:layout_constraintEnd_toEndOf="parent" - app:pressedDrawable="@drawable/ic_controller_square_button_pressed" - app:unpressedDrawable="@drawable/ic_controller_square_button" /> - - <com.github.stenzek.duckstation.TouchscreenControllerButtonView - android:id="@+id/controller_button_triangle" - android:layout_width="50dp" - android:layout_height="50dp" - android:layout_marginEnd="70dp" - android:layout_marginBottom="130dp" - app:layout_constraintBottom_toBottomOf="parent" - app:layout_constraintEnd_toEndOf="parent" - app:pressedDrawable="@drawable/ic_controller_triangle_button_pressed" - app:unpressedDrawable="@drawable/ic_controller_triangle_button" /> - - <com.github.stenzek.duckstation.TouchscreenControllerButtonView - android:id="@+id/controller_button_circle" - android:layout_width="50dp" - android:layout_height="50dp" - android:layout_marginEnd="20dp" - android:layout_marginBottom="80dp" - app:layout_constraintBottom_toBottomOf="parent" - app:layout_constraintEnd_toEndOf="parent" - app:pressedDrawable="@drawable/ic_controller_circle_button_pressed" - app:unpressedDrawable="@drawable/ic_controller_circle_button" /> - - <com.github.stenzek.duckstation.TouchscreenControllerButtonView - android:id="@+id/controller_button_fast_forward" - android:layout_width="35dp" - android:layout_height="35dp" - android:layout_marginBottom="50dp" - app:layout_constraintBottom_toBottomOf="parent" - app:layout_constraintEnd_toEndOf="parent" - app:layout_constraintHorizontal_bias="0.5" - app:layout_constraintStart_toStartOf="parent" - app:pressedDrawable="@drawable/ic_controller_fast_forward_pressed" - app:unpressedDrawable="@drawable/ic_controller_fast_forward" /> - - <com.github.stenzek.duckstation.TouchscreenControllerButtonView - android:id="@+id/controller_button_pause" - android:layout_width="35dp" - android:layout_height="35dp" - android:layout_marginTop="20dp" - android:layout_marginRight="20dp" - app:layout_constraintTop_toTopOf="parent" - app:layout_constraintEnd_toEndOf="parent" - app:pressedDrawable="@drawable/ic_controller_pause_button" - app:unpressedDrawable="@drawable/ic_controller_pause_button" /> - - <com.github.stenzek.duckstation.TouchscreenControllerButtonView - android:id="@+id/controller_button_quick_load" - android:layout_width="35dp" - android:layout_height="35dp" - android:layout_marginTop="20dp" - android:layout_marginLeft="20dp" - app:layout_constraintTop_toTopOf="parent" - app:layout_constraintStart_toStartOf="parent" - app:pressedDrawable="@drawable/ic_controller_quick_load_button" - app:unpressedDrawable="@drawable/ic_controller_quick_load_button" /> - - <com.github.stenzek.duckstation.TouchscreenControllerButtonView - android:id="@+id/controller_button_quick_save" - android:layout_width="35dp" - android:layout_height="35dp" - android:layout_marginTop="20dp" - android:layout_marginLeft="75dp" - app:layout_constraintTop_toTopOf="parent" - app:layout_constraintStart_toStartOf="parent" - app:pressedDrawable="@drawable/ic_controller_quick_save_button" - app:unpressedDrawable="@drawable/ic_controller_quick_save_button" /> - - <com.github.stenzek.duckstation.TouchscreenControllerButtonView - android:id="@+id/controller_button_autofire_1" - android:layout_width="35dp" - android:layout_height="35dp" - android:layout_marginEnd="60dp" - android:layout_marginBottom="220dp" - app:layout_constraintBottom_toBottomOf="parent" - app:layout_constraintEnd_toEndOf="parent" - app:layout_constraintHorizontal_bias="0.5" - app:layout_constraintStart_toStartOf="parent" - app:pressedDrawable="@drawable/ic_controller_t1_button_pressed" - app:unpressedDrawable="@drawable/ic_controller_t1_button" /> - - <com.github.stenzek.duckstation.TouchscreenControllerButtonView - android:id="@+id/controller_button_autofire_2" - android:layout_width="35dp" - android:layout_height="35dp" - android:layout_marginStart="60dp" - android:layout_marginBottom="220dp" - app:layout_constraintBottom_toBottomOf="parent" - app:layout_constraintEnd_toEndOf="parent" - app:layout_constraintHorizontal_bias="0.5" - app:layout_constraintStart_toStartOf="parent" - app:pressedDrawable="@drawable/ic_controller_t2_button_pressed" - app:unpressedDrawable="@drawable/ic_controller_t2_button" /> - - <com.github.stenzek.duckstation.TouchscreenControllerButtonView - android:id="@+id/controller_button_autofire_3" - android:layout_width="35dp" - android:layout_height="35dp" - android:layout_marginEnd="60dp" - android:layout_marginBottom="280dp" - app:layout_constraintBottom_toBottomOf="parent" - app:layout_constraintEnd_toEndOf="parent" - app:layout_constraintHorizontal_bias="0.5" - app:layout_constraintStart_toStartOf="parent" - app:pressedDrawable="@drawable/ic_controller_t3_button_pressed" - app:unpressedDrawable="@drawable/ic_controller_t3_button" /> - - <com.github.stenzek.duckstation.TouchscreenControllerButtonView - android:id="@+id/controller_button_autofire_4" - android:layout_width="35dp" - android:layout_height="35dp" - android:layout_marginStart="60dp" - android:layout_marginBottom="280dp" - app:layout_constraintBottom_toBottomOf="parent" - app:layout_constraintEnd_toEndOf="parent" - app:layout_constraintHorizontal_bias="0.5" - app:layout_constraintStart_toStartOf="parent" - app:pressedDrawable="@drawable/ic_controller_t4_button_pressed" - app:unpressedDrawable="@drawable/ic_controller_t4_button" /> -</androidx.constraintlayout.widget.ConstraintLayout> \ No newline at end of file diff --git a/android/app/src/main/res/layout/layout_touchscreen_controller_edit.xml b/android/app/src/main/res/layout/layout_touchscreen_controller_edit.xml deleted file mode 100644 index 0dea1ecd9..000000000 --- a/android/app/src/main/res/layout/layout_touchscreen_controller_edit.xml +++ /dev/null @@ -1,18 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:app="http://schemas.android.com/apk/res-auto" - xmlns:tools="http://schemas.android.com/tools" - android:layout_width="match_parent" - android:layout_height="match_parent"> - - <Button - android:id="@+id/options" - android:layout_width="wrap_content" - android:layout_height="wrap_content" - android:layout_marginTop="16dp" - android:text="@string/touchscreen_controller_edit_menu" - app:layout_constraintEnd_toEndOf="parent" - app:layout_constraintHorizontal_bias="0.5" - app:layout_constraintStart_toStartOf="parent" - app:layout_constraintTop_toTopOf="parent" /> -</androidx.constraintlayout.widget.ConstraintLayout> \ No newline at end of file diff --git a/android/app/src/main/res/layout/layout_touchscreen_controller_lightgun.xml b/android/app/src/main/res/layout/layout_touchscreen_controller_lightgun.xml deleted file mode 100644 index bd83243d8..000000000 --- a/android/app/src/main/res/layout/layout_touchscreen_controller_lightgun.xml +++ /dev/null @@ -1,138 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:app="http://schemas.android.com/apk/res-auto" - xmlns:tools="http://schemas.android.com/tools" - android:id="@+id/constraintLayout" - android:layout_width="match_parent" - android:layout_height="match_parent" - android:orientation="vertical" - android:clipChildren="false"> - - <View - android:layout_width="wrap_content" - android:layout_height="wrap_content" - android:translationZ="-10px" - app:layout_constraintBottom_toBottomOf="parent" - app:layout_constraintEnd_toEndOf="parent" - app:layout_constraintStart_toStartOf="parent" - app:layout_constraintTop_toTopOf="parent" /> - - <com.github.stenzek.duckstation.TouchscreenControllerButtonView - android:id="@+id/controller_button_a" - android:layout_width="50dp" - android:layout_height="50dp" - android:layout_marginEnd="30dp" - android:layout_marginBottom="30dp" - app:layout_constraintBottom_toBottomOf="parent" - app:layout_constraintEnd_toEndOf="parent" - app:pressedDrawable="@drawable/ic_controller_a_button_pressed" - app:unpressedDrawable="@drawable/ic_controller_a_button" /> - - <com.github.stenzek.duckstation.TouchscreenControllerButtonView - android:id="@+id/controller_button_b" - android:layout_width="50dp" - android:layout_height="50dp" - android:layout_marginEnd="80dp" - android:layout_marginBottom="80dp" - app:layout_constraintBottom_toBottomOf="parent" - app:layout_constraintEnd_toEndOf="parent" - app:pressedDrawable="@drawable/ic_controller_b_button_pressed" - app:unpressedDrawable="@drawable/ic_controller_b_button" /> - - <com.github.stenzek.duckstation.TouchscreenControllerButtonView - android:id="@+id/controller_button_fast_forward" - android:layout_width="35dp" - android:layout_height="35dp" - android:layout_marginBottom="50dp" - app:layout_constraintBottom_toBottomOf="parent" - app:layout_constraintEnd_toEndOf="parent" - app:layout_constraintHorizontal_bias="0.5" - app:layout_constraintStart_toStartOf="parent" - app:pressedDrawable="@drawable/ic_controller_fast_forward_pressed" - app:unpressedDrawable="@drawable/ic_controller_fast_forward" /> - - <com.github.stenzek.duckstation.TouchscreenControllerButtonView - android:id="@+id/controller_button_pause" - android:layout_width="35dp" - android:layout_height="35dp" - android:layout_marginTop="20dp" - android:layout_marginRight="20dp" - app:layout_constraintTop_toTopOf="parent" - app:layout_constraintEnd_toEndOf="parent" - app:pressedDrawable="@drawable/ic_controller_pause_button" - app:unpressedDrawable="@drawable/ic_controller_pause_button" /> - - <com.github.stenzek.duckstation.TouchscreenControllerButtonView - android:id="@+id/controller_button_quick_load" - android:layout_width="35dp" - android:layout_height="35dp" - android:layout_marginTop="20dp" - android:layout_marginLeft="20dp" - app:layout_constraintTop_toTopOf="parent" - app:layout_constraintStart_toStartOf="parent" - app:pressedDrawable="@drawable/ic_controller_quick_load_button" - app:unpressedDrawable="@drawable/ic_controller_quick_load_button" /> - - <com.github.stenzek.duckstation.TouchscreenControllerButtonView - android:id="@+id/controller_button_quick_save" - android:layout_width="35dp" - android:layout_height="35dp" - android:layout_marginTop="20dp" - android:layout_marginLeft="75dp" - app:layout_constraintTop_toTopOf="parent" - app:layout_constraintStart_toStartOf="parent" - app:pressedDrawable="@drawable/ic_controller_quick_save_button" - app:unpressedDrawable="@drawable/ic_controller_quick_save_button" /> - - <com.github.stenzek.duckstation.TouchscreenControllerButtonView - android:id="@+id/controller_button_autofire_1" - android:layout_width="35dp" - android:layout_height="35dp" - android:layout_marginEnd="60dp" - android:layout_marginBottom="220dp" - app:layout_constraintBottom_toBottomOf="parent" - app:layout_constraintEnd_toEndOf="parent" - app:layout_constraintHorizontal_bias="0.5" - app:layout_constraintStart_toStartOf="parent" - app:pressedDrawable="@drawable/ic_controller_t1_button_pressed" - app:unpressedDrawable="@drawable/ic_controller_t1_button" /> - - <com.github.stenzek.duckstation.TouchscreenControllerButtonView - android:id="@+id/controller_button_autofire_2" - android:layout_width="35dp" - android:layout_height="35dp" - android:layout_marginStart="60dp" - android:layout_marginBottom="220dp" - app:layout_constraintBottom_toBottomOf="parent" - app:layout_constraintEnd_toEndOf="parent" - app:layout_constraintHorizontal_bias="0.5" - app:layout_constraintStart_toStartOf="parent" - app:pressedDrawable="@drawable/ic_controller_t2_button_pressed" - app:unpressedDrawable="@drawable/ic_controller_t2_button" /> - - <com.github.stenzek.duckstation.TouchscreenControllerButtonView - android:id="@+id/controller_button_autofire_3" - android:layout_width="35dp" - android:layout_height="35dp" - android:layout_marginEnd="60dp" - android:layout_marginBottom="280dp" - app:layout_constraintBottom_toBottomOf="parent" - app:layout_constraintEnd_toEndOf="parent" - app:layout_constraintHorizontal_bias="0.5" - app:layout_constraintStart_toStartOf="parent" - app:pressedDrawable="@drawable/ic_controller_t3_button_pressed" - app:unpressedDrawable="@drawable/ic_controller_t3_button" /> - - <com.github.stenzek.duckstation.TouchscreenControllerButtonView - android:id="@+id/controller_button_autofire_4" - android:layout_width="35dp" - android:layout_height="35dp" - android:layout_marginStart="60dp" - android:layout_marginBottom="280dp" - app:layout_constraintBottom_toBottomOf="parent" - app:layout_constraintEnd_toEndOf="parent" - app:layout_constraintHorizontal_bias="0.5" - app:layout_constraintStart_toStartOf="parent" - app:pressedDrawable="@drawable/ic_controller_t4_button_pressed" - app:unpressedDrawable="@drawable/ic_controller_t4_button" /> -</androidx.constraintlayout.widget.ConstraintLayout> \ No newline at end of file diff --git a/android/app/src/main/res/layout/save_state_view_entry.xml b/android/app/src/main/res/layout/save_state_view_entry.xml deleted file mode 100644 index eaaff4f7a..000000000 --- a/android/app/src/main/res/layout/save_state_view_entry.xml +++ /dev/null @@ -1,66 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:app="http://schemas.android.com/apk/res-auto" - xmlns:tools="http://schemas.android.com/tools" - android:id="@+id/linearLayout" - android:layout_width="match_parent" - android:layout_height="wrap_content" - android:orientation="vertical"> - - <ImageView - android:id="@+id/image" - android:layout_width="80dp" - android:layout_height="60dp" - android:layout_marginTop="20dp" - android:layout_marginBottom="4dp" - android:layout_marginLeft="15dp" - android:layout_alignParentTop="true" - android:scaleType="fitXY" - tools:srcCompat="@drawable/ic_media_cdrom" /> - - <TextView - android:id="@+id/summary" - android:layout_width="match_parent" - android:layout_height="wrap_content" - android:layout_marginStart="15dp" - android:layout_marginTop="8dp" - android:text="Game Slot 1" - android:textAppearance="@style/TextAppearance.AppCompat.Medium" - android:layout_alignParentTop="true" - android:layout_toRightOf="@id/image" /> - - <TextView - android:id="@+id/game" - android:layout_width="match_parent" - android:layout_height="wrap_content" - android:layout_marginStart="15dp" - android:layout_marginTop="0dp" - android:text="SCES-0000 - Game Name" - android:textAppearance="@style/TextAppearance.AppCompat.Small" - android:layout_below="@id/summary" - android:layout_toRightOf="@id/image" /> - - <TextView - android:id="@+id/path" - android:layout_width="match_parent" - android:layout_height="wrap_content" - android:layout_marginStart="15dp" - android:layout_marginTop="0dp" - android:text="Dump Name.chd" - android:textAppearance="@style/TextAppearance.AppCompat.Small" - android:layout_below="@id/game" - android:layout_toRightOf="@id/image" /> - - <TextView - android:id="@+id/timestamp" - android:layout_width="match_parent" - android:layout_height="wrap_content" - android:layout_marginStart="15dp" - android:layout_marginTop="0dp" - android:layout_marginBottom="14dp" - android:text="Saved at Timestamp" - android:textAppearance="@style/TextAppearance.AppCompat.Small" - android:layout_below="@id/path" - android:layout_toRightOf="@id/image" /> - -</RelativeLayout> \ No newline at end of file diff --git a/android/app/src/main/res/layout/settings_activity.xml b/android/app/src/main/res/layout/settings_activity.xml deleted file mode 100644 index de6591a20..000000000 --- a/android/app/src/main/res/layout/settings_activity.xml +++ /dev/null @@ -1,9 +0,0 @@ -<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" - android:layout_width="match_parent" - android:layout_height="match_parent"> - - <FrameLayout - android:id="@+id/settings" - android:layout_width="match_parent" - android:layout_height="match_parent" /> -</LinearLayout> \ No newline at end of file diff --git a/android/app/src/main/res/menu/menu_controller_mapping.xml b/android/app/src/main/res/menu/menu_controller_mapping.xml deleted file mode 100644 index 2521ee5e1..000000000 --- a/android/app/src/main/res/menu/menu_controller_mapping.xml +++ /dev/null @@ -1,20 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<menu xmlns:app="http://schemas.android.com/apk/res-auto" - xmlns:android="http://schemas.android.com/apk/res/android"> - - <item - android:id="@+id/action_load_profile" - android:title="Load Profile" - android:icon="@drawable/ic_baseline_folder_open_24" - app:showAsAction="ifRoom" /> - - <item - android:id="@+id/action_save_profile" - android:title="Save Profile" - android:icon="@drawable/ic_baseline_save_24" - app:showAsAction="ifRoom" /> - - <item - android:id="@+id/action_clear_bindings" - android:title="Clear Bindings" /> -</menu> \ No newline at end of file diff --git a/android/app/src/main/res/menu/menu_edit_game_directories.xml b/android/app/src/main/res/menu/menu_edit_game_directories.xml deleted file mode 100644 index 06192fbb8..000000000 --- a/android/app/src/main/res/menu/menu_edit_game_directories.xml +++ /dev/null @@ -1,15 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<menu xmlns:app="http://schemas.android.com/apk/res-auto" - xmlns:android="http://schemas.android.com/apk/res/android"> - - <item - android:id="@+id/add_directory" - android:title="@string/menu_edit_game_directories_add_directory" /> - <item - android:id="@+id/add_path" - android:title="@string/menu_edit_game_directories_add_path" /> - <item - android:id="@+id/force_saf" - android:checkable="true" - android:title="@string/menu_edit_game_directories_force_saf" /> -</menu> \ No newline at end of file diff --git a/android/app/src/main/res/menu/menu_game_list_entry.xml b/android/app/src/main/res/menu/menu_game_list_entry.xml deleted file mode 100644 index e1ce8dab3..000000000 --- a/android/app/src/main/res/menu/menu_game_list_entry.xml +++ /dev/null @@ -1,16 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<menu xmlns:app="http://schemas.android.com/apk/res-auto" - xmlns:android="http://schemas.android.com/apk/res/android"> - <item - android:id="@+id/game_list_entry_menu_start_game" - android:title="@string/menu_game_list_entry_start_game" /> - <item - android:id="@+id/game_list_entry_menu_resume_game" - android:title="@string/menu_game_list_entry_resume_game" /> - <item - android:id="@+id/game_list_entry_menu_properties" - android:title="@string/menu_game_list_entry_game_properties" /> - <item - android:id="@+id/game_list_entry_menu_choose_cover_image" - android:title="@string/menu_game_list_entry_choose_cover_image" /> -</menu> \ No newline at end of file diff --git a/android/app/src/main/res/menu/menu_main.xml b/android/app/src/main/res/menu/menu_main.xml deleted file mode 100644 index 3b82f7748..000000000 --- a/android/app/src/main/res/menu/menu_main.xml +++ /dev/null @@ -1,67 +0,0 @@ -<menu xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:app="http://schemas.android.com/apk/res-auto" - xmlns:tools="http://schemas.android.com/tools" - tools:context="com.github.stenzek.duckstation.MainActivity"> - <group android:id="@+id/start_menu"> - <item - android:id="@+id/action_start_file" - android:title="@string/menu_main_start_file" /> - <item - android:id="@+id/action_start_bios" - android:title="@string/menu_main_start_bios" /> - </group> - <group android:id="@+id/settings"> - <item - android:id="@+id/action_settings" - android:icon="@drawable/ic_baseline_settings_24" - android:orderInCategory="103" - android:title="@string/action_settings" - app:showAsAction="always" /> - <item - android:id="@+id/action_switch_view" - android:icon="@drawable/ic_baseline_settings_24" - android:orderInCategory="99" - android:title="@string/action_switch_view" - app:showAsAction="always" /> - <item - android:id="@+id/action_controller_settings" - android:icon="@drawable/ic_baseline_gamepad_24" - android:orderInCategory="102" - android:title="@string/action_controller_mapping" - app:showAsAction="always" /> - <item - android:id="@+id/action_memory_card_editor" - android:icon="@drawable/ic_baseline_sd_card_24" - android:orderInCategory="100" - android:title="@string/action_memory_card_editor" - app:showAsAction="always" /> - <item - android:id="@+id/action_edit_game_directories" - android:icon="@drawable/ic_baseline_folder_open_24" - android:title="@string/menu_main_edit_game_directories" - android:orderInCategory="101" - app:showAsAction="always"/> - <item - android:id="@+id/action_import_bios" - android:title="@string/menu_main_import_bios" /> - </group> - <group android:id="@+id/game_list"> - <item - android:id="@+id/action_scan_for_new_games" - android:title="@string/menu_main_scan_for_new_games" /> - <item - android:id="@+id/action_rescan_all_games" - android:title="@string/menu_main_rescan_all_games" /> - </group> - <group android:id="@+id/support"> - <item - android:id="@+id/action_show_version" - android:title="@string/menu_main_show_version" /> - <item - android:id="@+id/action_github_respository" - android:title="@string/menu_main_github_repository" /> - <item - android:id="@+id/action_discord_server" - android:title="@string/menu_main_discord_server" /> - </group> -</menu> diff --git a/android/app/src/main/res/menu/menu_memory_card_editor.xml b/android/app/src/main/res/menu/menu_memory_card_editor.xml deleted file mode 100644 index 9411e9cde..000000000 --- a/android/app/src/main/res/menu/menu_memory_card_editor.xml +++ /dev/null @@ -1,24 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<menu xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto"> - <item - android:id="@+id/action_new_card" - android:title="@string/action_memory_card_editor_new_card" - android:enabled="false" - android:icon="@drawable/ic_baseline_create_new_folder_24" /> - <item - android:id="@+id/action_import_card" - android:title="@string/action_memory_card_editor_import_card" - android:icon="@drawable/ic_baseline_import_contacts_24" - app:showAsAction="ifRoom" /> - <item - android:id="@+id/action_format_card" - android:title="@string/action_memory_card_editor_format_card" - android:enabled="false" - android:icon="@drawable/ic_baseline_delete_sweep_24" /> - <item - android:id="@+id/action_delete_card" - android:title="@string/action_memory_card_editor_delete_card" - android:icon="@drawable/ic_baseline_delete_24" - app:showAsAction="ifRoom" - /> -</menu> \ No newline at end of file diff --git a/android/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml b/android/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml deleted file mode 100644 index c9ad5f98f..000000000 --- a/android/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml +++ /dev/null @@ -1,5 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<adaptive-icon xmlns:android="http://schemas.android.com/apk/res/android"> - <background android:drawable="@color/ic_launcher_background" /> - <foreground android:drawable="@mipmap/ic_launcher_foreground" /> -</adaptive-icon> \ No newline at end of file diff --git a/android/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml b/android/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml deleted file mode 100644 index c9ad5f98f..000000000 --- a/android/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml +++ /dev/null @@ -1,5 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<adaptive-icon xmlns:android="http://schemas.android.com/apk/res/android"> - <background android:drawable="@color/ic_launcher_background" /> - <foreground android:drawable="@mipmap/ic_launcher_foreground" /> -</adaptive-icon> \ No newline at end of file diff --git a/android/app/src/main/res/mipmap-hdpi/ic_launcher.png b/android/app/src/main/res/mipmap-hdpi/ic_launcher.png deleted file mode 100644 index d64d768035a80618807c808114cd715909304556..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2817 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 TRf{F%00000NkvXXu0mjfs!dVn diff --git a/android/app/src/main/res/mipmap-hdpi/ic_launcher_foreground.png b/android/app/src/main/res/mipmap-hdpi/ic_launcher_foreground.png deleted file mode 100644 index 9b6b70411f6d3ee6b50f8bee2f61c8a4776f751b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5163 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 diff --git a/android/app/src/main/res/mipmap-hdpi/ic_launcher_round.png b/android/app/src/main/res/mipmap-hdpi/ic_launcher_round.png deleted file mode 100644 index 7d7817be6eab38251fb2b677eb671053f358d3dc..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5004 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 Woiz_KW%}Cy0000<MNUMnLSTY7Q@ZN_ diff --git a/android/app/src/main/res/mipmap-mdpi/ic_launcher.png b/android/app/src/main/res/mipmap-mdpi/ic_launcher.png deleted file mode 100644 index d5aa43caa6b0f02e1d64b4083b366cd0e1308aca..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1741 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 diff --git a/android/app/src/main/res/mipmap-mdpi/ic_launcher_foreground.png b/android/app/src/main/res/mipmap-mdpi/ic_launcher_foreground.png deleted file mode 100644 index 3b3c148502c9a844127d237022f0e75387bc4516..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2917 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 diff --git a/android/app/src/main/res/mipmap-mdpi/ic_launcher_round.png b/android/app/src/main/res/mipmap-mdpi/ic_launcher_round.png deleted file mode 100644 index 2dc2434af16405b6f4e82c6f0db0015964451e2c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2993 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 diff --git a/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png b/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png deleted file mode 100644 index b260a79561270f1ed3749f73687eef65b9e4deee..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4088 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 diff --git a/android/app/src/main/res/mipmap-xhdpi/ic_launcher_foreground.png b/android/app/src/main/res/mipmap-xhdpi/ic_launcher_foreground.png deleted file mode 100644 index e31c4c180e51f7865ec58c7715a47344f10e73f6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7937 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 RNtXZfswAf_TP<S_`ycDwDB}PC diff --git a/android/app/src/main/res/mipmap-xhdpi/ic_launcher_round.png b/android/app/src/main/res/mipmap-xhdpi/ic_launcher_round.png deleted file mode 100644 index 37c92a9045f924238fc68a2a2719972d7a119ca2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7370 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 diff --git a/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png b/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png deleted file mode 100644 index 633789a6c4f2fcfe72f436e38196a4c6f4a14220..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7155 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]r+p|!Z7njyYJw{lvI9u&AuIZ)R8?Fm{ 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 b-QkD2Ij;{tq{6xX%mdVwb(E?VY{LH!H)=+S diff --git a/android/app/src/main/res/mipmap-xxhdpi/ic_launcher_foreground.png b/android/app/src/main/res/mipmap-xxhdpi/ic_launcher_foreground.png deleted file mode 100644 index 9e64e9588c19a6c4eb799db9b604a7f9afb3d780..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 14699 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 AOaK4? diff --git a/android/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.png b/android/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.png deleted file mode 100644 index 9e2f73b53fba2b9cfa8abc1947f040415b20655b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 12470 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 A>Hq)$ diff --git a/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png b/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png deleted file mode 100644 index 7c9848832e52aed28975a84d2d34b41715de74d4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 10680 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 diff --git a/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher_foreground.png b/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher_foreground.png deleted file mode 100644 index 988afe5cfb041e6300f6a2e67ccb9ba9cc866c3f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 18599 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 N@9FC2vd$@?2>{(CT=)P0 diff --git a/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png b/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png deleted file mode 100644 index 9b9c6f6831df2c0e95d8c1b8058e24618578297a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 18804 zcmY&fWmFqo8%#ow;O_2T90~=3dvPi5MGB;)EiD=xid(VbQrwCbch}-j2wtE_anG0c z=l5f?CntM$H}~8-GtWG8BXwS?;9*l^0{{R#HC07D)Vb@w0}BK7skizD697<?Qd5*O z__TavfoWo3OyWRclJO;?y^mVMwmWgr%r;6*^MqU^f{&e@eOk8PByq8|wtvyK+B%X> ziI9*+j1;&}x9>LU`IPQ=y>Dj$qaa@l^;;Kbh%mE!{(5(8wdLB>B#q$QMrJJhR)Ar* z*Z2RvB<}(MkPOoC#PpPG_O>_~1>25--QGpHm$?n(P&15mHs8302u8<uX>r)+fAr|q z6s$kUyGGArSE4PKJ3UTe<m1_h#XlYyUS$~lmA<fal^(KT5546isdhCSbETa!&Bc?a z2^PaSVyNG8@^|WXs&(3Tx^==9!9NmwAx;0IlWWm+X2~aL={4=^oaa$~gN#>M`2F8f z4PPm-oa^4oRb#|`MgCB74Zo6Eep4^))HIby36GMdm-VmsA-#uK^jfpsgYKQto0>_g z@a^%biU?DUsnlj$mhGH?%MzRd1U<ePy%=EdbmA6@-4fAS*h;^yn=G8<kEL_|ON+GK zTWySR6;i=C|JNsM>hds7Un!nMvp1#p1u6;D8-~9ev~$!MVD}{$jL5U!%Rds)Ulbj) zU9d;C9f~s;vZOZ<b9~`_brdN^a3o|JNG<@e-Wq}YVPnFeQzFWTTdchJSUKPSo8(+q z%^`MRoipKE*ls2IMNqP!QP-g&)&_Nbe0QdW4-TJhH*Xww`Iybxv1mOXZvyYgr~;et z%Xkgyg>QYw{jSuy)2QDSL{$`4^lkqXvAwOV$PJ*U68Vrw(W-Jqy<_01C}3C`+_?bF z3?VP<Un$o#SfkWqFRfQZ|7n~wO*=j_)R$;B-APAzdg6jBQ7UakhT)fBKSfM-T<7yA zmxyR=xQ^(+Hxdd?QNMit)aHWWKOC7WsHb&(Cj3uYY!7o_|FSe^HyPv9&=HZEhQ%Ed z0ljX_c}`7<dDGwJF{CWJlOL``zm98<Mj3_G!}R+4XI|rL8<~-%!-7?+P-N^Bpkrw( zHA{pz7VGEru9MD$snvy#etkQ&A>9P->^rW!FXhS?xEU@!%DV;8tOVZK+W*%7Ikwn| z)Ny8KN4_FX$=a^9@07}~6dt83NKrZrtwnq5FyTuHJ>yJKcR~DgzPeLpzzaG%JM&Iw zO8~MFtl4`#cr^lixjixhUw=Cyt7u|v&CRtALfwk^p`y~pdG7L#8?hY+=TY4Z5YKah zPO9bU@UAp@<P@cY*#H5Kj*fh7k@VDt*=0cA6p(}xJM1%2m$W3B`3Mo>ox(ql{hI*v zVi+EGAeb}!g@U}iOQu>b=8d3lBXNV!)OdyI&UlbL_~|*~I0pS#9TNdE1yG2DaLBJI zBqb;Y{Yo6&S=ij%TuxKV?M0A>jaS{=_i}%~9zGn^C)!pC#6d!UvV;=Ifi8=B^obR0 z2`dgn)iuWPlLW%n2rZQX?VHf#pK`^&R3OQQh>(yF<MCj}{^aK=>N|%wK0;`n`4@@d z?|;mI-}__3mb?NrB*ErGiWhfTgco1CENVW@KTtD1x5VVPp@C67sfIYQ#;ulkf_-DL zm4mhm3k&mhg`90pHI@+bSP#;JFof}$_tIiJYnI&s7ec;squp1x>zO^VZx(KIrU!tc z^(zOV65-a%*g00{^W<RGPgVxo@dh6zwU0(mYSHu5t@iU26JFT;5djYgh|Er?wdzW# zP^YG{LeBs2KKsDmq<p%dXl-_e@aG3oLii<5g}9smBl!+p4i@59s*FQ<zR3y<zkXEL zCBU8iLCBRN%+AE>40{X^MJH7=W)i%0nQBK~8o@t@emrsCr8K^G`N5wz372f+XvbGg z_)-KmtsyW>7reI@4Q-qzx-gAC3)X1({EActZP*{syebgw+oG%$)YjJakd~H4KnbZR zW4+NmCm<z&?GyNuA#-syKUX79Uu%;3FmqPqpnnO_N4UpX10b*2`p**a6sK^XeDt*e z6c6Ypmm1i2`O!o47u1r00Rq&kefNpB$+v;fAletq%*<g%T*O$2$?@@{piYjjBj+SH z!-pzkK>kxUOXZU8Y9;0P#^Nv7pEW?%Juf>B^0~KI(`Br(2T0;ZGLri&>lbtn4_)<S z#B=YVXU~WWEd5Ed!+SVcfRAHiW186b_{X|zs=2y*1Uzqh%7-=s8J=X<$}t<2be8@B zrj(@aMZw3W1c>8SCZfjk#O|qSI6NmDp&=8J_y!v$es|{Gt_iQ^qh_2&TPb+(Az<k- zipG*7<9Pg{7Oe|X@b<pzHEVKjsGQvb%a;nXu=GNnJ$zY14AS(I*%!=qW2S#1Ofm-t z06^=lk}ym1yOqynm3FbPbBi$oBU|}{n4BCF?|8z5Kb|vw@Te8IWdJFt6LOM1iguGh z6nKX7jyR!nOElZ|RxWlrfsu`E=dM4B;?Q6OLvs2ZHE|mvm@QFS{dvhukKBiIOr6hp ztIwl^HgUaw{rWSlZI(PX!3dqu1AQUd7`XQ}3`^Wk1X-nz8+#=t<TkBusKDkRRrR2* zXZ-1==eNKe6~WP4C+PFYgl)_abOZGG_;^GlW$kQN^nR)o`sr3bKQZ4)<vLdN3xf7V zvZ3GC5c|q^;2mAoE+X(eQIsBK(3V8dRx(-;S$Dz(ftCKVVQX^3RO0LW)%20G1XHr@ z%cwH)ydS5fVGB#d&8-Z~L`F6uSaQVMRHG4s;h&ilm6R%3E1ayq>m^GKep&cEd(S>B zxPjLS{!F6`y}O=||2c(Gw_qmMjqh7S?-b7WUYr2@MC3au2>zp+EdM<ooGQfvch=!j z>#TG1r-eCNc1b^wHJf>)Xnh!*BI>S|$w><F3x7U^kErvY3FgiJ=%W6GNkruRyCT&u zN@O|4r`Nc7EtQJm5k%0AJHDa28BmXk8MFsk!Q>Z;i+yDhd<IYsR!H1~Ga%RXM^@f~ zkr2&q(*Hd6PLWk!iu*ws76}!0O^z7V-;<=_IO$#7I$xFX{rS+G59I219vCyc6<cz9 z?1{!ji+veIMMZ@<IZNWylAx;g@#CVWJyj{*$*Dwe1rTX;6I{X==Tii^%mj$}yDF1w z78>W(@TU_?QebR+lb2$($1qxsr4KIBpXeyI3as-l_?4QE&R%ECTC!-x{)-@2d)C~C zu7z|4iNfxdwi@h8a^24c{HY3W-uxZ+yT6(vR*urD9hd7VoRkc%mx#d1ecuG<6$i^G z2Ttjd6Yg>c{_&^~U{+;vt0fz{UJN{l-_dXJq$QcQGkS3vXCli6*#T}pK29IYgafuO zOUa(U<v96Q8tq*gdnG5XFZ{tD(Y43#C9A~DI}ib@?AfI!gw*}`!Nkk^28RXSS9k_& zybS`UKfEn{A3y}wVFGTGq7PV;QuZgod3`Iuww*tME>b?mw+<6;w-)8*KOiW*|Jcp@ z&OERZK<^30DfntAL7ZnqH;|I^XZZ$Q$j)HEKi9A>Ir*%n65rk6!j3ftPipQ=Tlb{< z_y)t05orb}7r4p&_d5sH8Zowgmd_V|bnV(AoVxE*?}{U^x|o1N^mz}FAN<q--97P? zwd=3s2e@f;=o_{gI*Vx~zkK`}h;*3->o^pwMk-}7M5t}ux;*%l1!XA=zHOm_C6p(C zb$8a>)ODeGI#5kb&DEtJuboK<hHuaJDx)p$YOIPl{XSB@r>`alaSC9+ppJqw6lH<c zez4^(78J>EcMkv`rm9G_0sI>>Lw-ikU1Aj-+M11mh;XGHv7gF`F)CT`)_-KMQh!SH zGah?ic;QqqCc#zI04A%l)ur72xmunZ3Eo?UdO~<1p<#&apc9AOX0<B(_snYuEIJ0m z$`SD_7N9G`DEpj5sPy8lmCU{}0ovVp^E;gPf~P$rNY{Ov3+<S2*)sVP=INfH7eddM zCj`*5hR4OlMMz32GG9_IA9SInu3i?NMj)7W!4(FuHy~11;JSd-(}N{?>ydNJSWrVk z>bauGKi#g-7Nqo0ccBz@B)Rx+&`hccbj>Il>XU$l$pbm%GL}@l9-;4!d;ZJu;okB~ zyt^t~gG>p|VVE~GG$cSk5XY{}6S{atp;x5WQlV+|mNN)Iihh;=7Q~u>Szsa5BD2G; zDM+C7$oh848_(I^O8AOX^;ffD&Zhh+dfVB^Y+E4Js36t4E+oI3DDfkHmzxUn8=FQv z<jd_2qgpWG0H%<T5Mr&}=MZAoqsODn;fGR1Kck98sXwxXGh;DMpyw;gh67a6t_TR7 z1G<mvRoXjA-FRRd!hx;NlRYfh`PyPRsFeag8C$yR#u7=VU~HYX?rlB)+q-~u8_ES= z`<00KB=gWh<A$l89dLS*IVJG(t<Mxb6((@jr;|H{kb)xh@bFM7zUJfQfuXCNx-T2= zze|zk3!-aKsGU&b?kf<X#5tuzZxk~CcrHP6fjtY5T^gr|w=TF{vNIs~o^C{8(oqvj zgvUp=W7OyLcAqTrlnkW^RO4gF4<5Qo)DUvl!Psc?CI1otv+DBn0VHU$3Gk{7fKU5d zLd5VQKsiu9LX^kGx67oyle8U)iJ|R_Lj+)e&VKM!<<#hS3w9?4&06S1fRk|)qlh=< z!Hg#XWmu<47IIK9V$ZU#Z_;eGor@XpN^B$tjF%r8>sYklAxQnu{Vo`7fIWuw#f|j8 z4mx?n$-v=*3fQ+>_3kfu`=lxsBWoW70zsUd$c70RZ?N=LI2Z<HjN!L;TBUyuu#thv zuortxGNuKf9q)bZ(rV-)g>YgQM)L&$!2TXu2o^w<UOP>IWg;ntKM|O*CFPcl0bPVg zn-q`vRCIdX+P?-=(EX7m660W3w#_&@4dFiMy7~pVR)PMINqIv+$p)O&g-a@*tak=n z4l)E(OyooR8?=P!*vBU)8H|h9tlp%nbtze*Pq>P*e`i1wZ(`97fe<$+=GB!DqGuC! zCB?kEi-HG)vh_UOAUlXHshwR(rWoOp`yaOo;Ef|mghVLZf)}oTa%NqBB{#=>cBArd z?QiOt!?=agCqKEn_^b87`c5KZINu<CWMm{EA>k>WMuY>|!Q*6(tQDU2U++>$X$@jL z(s#ZRnA3Jzz~fYkbly56;}GJ(GlT(&bzJho(`MZs*@GG2vmZIxm&2rKMmQn*jIO&< z3|9~!zq`4FOLaulw?Va~npV2Q^o;ROoMC{`o~tmo&++W((|`)#gHl93R8@5-3x!Nl zg6OudY}OdGiyzuL=Rb&e25R`i3GQDb96NDGAbLY~4%4j6U6%X5P>%$6J6w5q(9!gx zASRmn44hA<0_x6ZH-(<@vQGLN@o{TZ2aLsP!@Nw%2)t{r*NZo9W0C>#q`Br@3kzP< zHZ`j}@<G=*(msuRE&)iPxu>6+GT&DjH)Oo8(QXg{;Qntf<AtVyGkdCXZ?WVE;k%PB zI^q<)PAL=siSo%feXR$|aG0@-Y{X+WUZI;H%s=-fOm~yEaYy<|%z0YU>KAH?ac_FY z!~t9?bV-|iu8%K?Sd<N(U2}FRZx${sEio9BTrYfOSe3#ldrV?Hye5zT(L+uuvNgJ1 z_9@E>1cLEW<c77u=nCNR3{y_;4j4FN=4}-h^_L&uYFWWpcaN%YX)&e4hy1@*#gAGc z0C^=&c6JQHs98R4zNTp#-QVl#r3UonIw#dFH>8zl>YkoSvB77vggV|5!DsKee0HLk z0D~BVwqO1z&4l8<3ixM-X&|<vt|!KJ>SLrpXeL89G&3mXnk=mq3~(89aB%1z&lI0z zB6rvk<7ae2qKb~So`G4i4(U>Fu0&S<+H#+&2N&EuI{10rcDbyBD&RR!lngHfs9amO zzmUc-<~R+dApTVI7Vlv0Hr14(@Xp6i?%wX*#F4l(h!Ej)XRoLjvbk7mr!ZQ{+*kkA zK~Ana<6Y$gX(`g~W-eteX(s%<oF1#7Ijm-n5ZX_DHruXRprH&JA;@QEf$W+<2ZWN1 z%)Y25hkn}toG-7WW3Jol3Y~h`uu3{5f_3aprVCVHw`V(UA;UtGXyBuO`>P}NPaxf~ z`&3zAiCNND(Za}82=Yt=-?Hqr3F1%{5D4aaLn`^+V3-dVLMogxN$`&7+ZPL7SweU~ zyz`|68@RprV(B00gQ5ib6TfU1QUo1Dc;zIWcYl2{=(gHiD{AA}8-_RUpasy-^#84N zPRo#5K4H8OJQOz=z8Of5)I#ug4pn<?xxEr2`SpPjFes^4%1bTwGntjLSNkF^|0!ST z!Ku!aoX&bKW1O7r*WI!y{bFt^F)$~*bI>CNx+%tG|2HuW3=Bzh^7VaT-VEEo>~TzI z>#ev@bBq~2iF~K+ueSG#`bDJA&E=cfq?xQy|9@O`5a<?YKMkj^`D-jdI|6|kzoLgX zz@;cEYdqkCmge2x?RMD&p7-tG7XgjnYw@z)yqv#`_U#R&ga|buT2j*Y^tH}|-XVn! zyN?C=`9GNtg+@hh$2Bkv>z=`M58<u1sI^e3(Ma#47QM_lFOvhXZ*li+a$4l<jfeBP zGZP<jpaHE6uEtbAeJn)26spz@t)#1Ai_li180(!rYM5Wqm^~Jhve0P1rl#i281Rln zc~lXj7Tn9t!SUKL{o<a&uI!VCj`<C)0S9g1Jwfleny&!I$Z&~#ow_(khcs8$sSGQW ziU%n0Wt#~|pT8h0p@4mIRUhPd>DE=NjQ3}%L%Jg4FYbbI8a~j36p@&i*tN3aBV#j* z7(V^G^keR9uOLpQPN6aD^`B==+s1DXIk)*v@L%!J<yljhO-%jD_l+*>5&DhAcmXMj z{?)FOZw`SYjBQ`O1qaGHr?J($IN>$84CTJ$Q~8wl*6z<ti*Us^bDAoCaXyfaP;@Mn z`)V`MRJ+eLb%<futKN~E)6-Mq5sN1sFqR}XI?hjpgJ_p{p;2slzS^LmEU{ck&bf~5 zNG7*%f3S`qSE1V%$53K;iZod(pLI+oDMpJ)U~nbw-#2b~a*uaYRc>Z~mW!e?0LGfp zfSxp{latfc)zONTa5JuLu$58T8()t1GRdx&d-HE~_z%!ZN#4xSr4c0+#<wg3&yWqE zei^P3e2the00=^Cfip>44g<Z}9mLz_+<&5VhWuVJ32x8AGpIJg%Mf+L&ayC{1)B&$ zAT?v#SkQ6}*<y^AAFn4T*ea+i<X*<himdXcj>Z|N9x*^rdUiX>jY&>qgY8`qSPxkP zyzQpGsVP)e09=j<ig)n3h=3O-2)uQ(kdwMEfMrsP-8fnq(EC&?qu`u3OMQ~C&!sV? zL{Mo?<+<Fht}ah`(IG}5)p%LsDs$&RD^iODu#Q%3X!P5M#0dHE7q&s9ww+Bu$?JSf z9+|iX*+K=30IiAP8)7xd;`fkRIjovn=OukcX!S=ios}guKEI*+&Y3y%yN+dQ{3mm? zd~vf3S|C<ZeWE!G279P;7?q^d#DJV(_Kt>cD#`E!0ceRCQ$JXL!TeU@NH1-O%@r`h z=o5^KtwUXUjz*vsN(AMMD%&H7<2M79Oks;54(C-FKNpcE2e?vQEcaT)LE-*%v;zO! zu;^Ag!3y^sV7oOJh^NJ&+!Qy>&?=wca}d^Hq_UDyV0d^qO*zJ}y3~!5G?El(pXTt4 z^W^Ni7^uXgRPbH>$4TnQ+wOwU#`sPPjFHE$xst4<0w5hF&M2k8I%c>ni*knO&GIer z>FqFeo8uyM%{ykGSz7zG_pl)L7=r`4g5}#FW65@`VDEOU&e#e}j=ja;GZeUioO!}$ zxZjnS&J#I8T8j<{$*9+--r!(kPki;d)u#c5;E&BRtH-cL(Z{AjFG$A-1ei(xzO&}Z zNs$GHq#Sa3a5>AH(*h0t?AxW9cFC|les6!X5o{^Cajl)jwDrt+<8udQPNOLakUaJS zT-&M~&#K*+p^ZWk`j^~wXpv8}#j#mFMLtEHFW70HbPVl*@W&ih>sVl_I?`-o(uk}W z*+2-508RHNQ>!s6`8hx$J4YDZ@)YTa48rYqUIN%MpOYWDNPvc>4`rcooud}m!r^8; zFbb-Ak5`y?A6>9yJIp9%=2deVU;O2MF$r(;?IL!Sc*>*;TF0O9Qj7BF7R$qeE*9!; zNO>LiJu|7vC9!ET_zdv*A$qhsF4oAiw<~@GCRB~zzI&e(y(!7d@>`HPmv`iL5Pw^W z^``5RQkIhq7}AcLs39RytOoz~;gfU}+v$R;#;0HX)EV=&fz)%fxk~4|Q=Mj>H*$<! zvK40qMGHBqI;zLC)<VwV)798{8qbq=v0y$|e{Yj(qKI<)KEp$ZpjUsU3r=`6krZ+O zn}jk&<KN5Cy@P53%+~&=t)i&1m=RL(J~Plz9Tc%gFxYZnMYIVyHTab@zkbXf%03}f zV)HEc0RKv->7(1H+oDv&C4J?_y%#0$OXeO=+LXi3&<39|h5O8LQ3)q+Fe8;BWzq2z z^6CDBpohP=rcm(`2}Hw)2iNt3Z*s7IA^QoT&$CauW*cTz=kkXl^&+zPLuYU2<D2@! z+=^Ja^g&pkak9!gbfLna)hv!cQ7e<OZV#5EK>hKIsWJx**#0a8<MPdUGC(Rv_?N3} zIX<7<J-VCZ@`96W{<xgkIQyu%C?6;uS6xG+;L2%Pzw4`jdHz4Z6?-|VR5Bg}FAh>d z7?Y`;yVTYjga4F%jTh3!NH6Ehv&Kx(svJRyy(q<sY~eu>2+XGnY~(vYlA95XHd}41 z{ku=u??p8Wu$Tlmum1VeB?^YQ$a-_>ghPe+9x?F&v}~aKC1sZIh6!dv-!<&183w4g z4e9Je&ZS!Ur;9D|2m*)h%}&<ZTOt0iezvYjCO``Hk4|2j6bBK*XkJFQQfbn^AECsm z*)bRx%>U`(0U243=@dXiR@U5dPS<*+#%s!%a?vqg21t$C-CvM#(CX4~+mj~7)#k)! zq2;sVuB>~y=IBrUogx`wE}+QMqm`zufQNsBVj(tOUS5ZZ>|J#<;_eqc1mjilKmj@| zMgY&-H^XX#Vn+G&vZ@dL*k@iV!6OPr?BHC^T-cT;(4qh?2C7g5NzB#g2j>)OH}UgN zAyeiB_I~|@d3K;|Bz0^bWU%HQ$!VuUS9b2!XYEFe<NKegA#z<7%OlU^9YJWe*C*?f zuUbDI(Y$#9JyA44p(452gEI*o-J@E+X25I~U}W!23Tc_AKVx8sRRxn<r0DjWLN~*I z8z;$>(SS|E3cG>iZ-8={rXY5_Lujj5<<wzQAj6smt{KO3Im8R8hHGPb(*1`c+?&F~ z0BB|*<_&tLB5Mie>I^WAF#!GBy4V;F^NrzcbUm>mOAjUi{WmD3W#gOltd7VUC}5?p zug`<WccUDo4&&w3s=}P*iXRw1SK*#{EyHbjb}=<r?}B%q^PwnUf?=Mui%v6WA+|Bh z*vcKZ*GDvX|3owh+2IABoztWL>ytLP-rM$sy?e<)_2;3pnqW0UJP>CU&HOK)zo1Z} z5_gKAVGzAO+t9CHNs<a~8jA2z{qM^<#ug~sbq3q&UIh~b%P+#l6JsN4zbIIDV+!bq z@voD^Br&R;PX$~f>q9J(-XInTT)Jag#15tr9C#kBijo1q^P6J_YmzA@%~~|~IhwAl zR~Y7&jx8PqcWru{4T|3+-rADbq}jZZ1-(C7PI(6i|NHmvZ?X))p&VcYUFeHRt89HA zj<Fh(Bl9jMR^LN9C0<7gbqE&vU-L^g=&>Y(wK7?Lo0w<Fl839U`3R$4$w}Bm%~Owx z2&x5YBlzWVb}v#vkN@q29AWEj^oi9P<t{lo&X5k<h1i5S{Dz!Pt1##y3EE3d{r#WP zv9;irjBp*7XdVa5;>N&wEU@cH)7N-WE$mx;w%j}HZt+@DKH{z0B7=yEjiP-Fi^-7` zjV0(j0k2-nGmcDa$f~$%i0BDm?>S9#E)uTck7e%vQpqStB7=E<Z_f)NsHx9dNmYEw z9XMiI@3g_0I*K-ztXCSH4baB;Hn4B(GW*?@G&u6zftPB~{?}YqW=(Dj|M;74A7gDZ zH^gj@f2@Me95+8~9U7z=!wPtY2CNltut|25f(6vpCOC%4Q~~c-MaW^TmhIjjAfw(X z@>IY#{`W^sVc4O}i^*7wyoQt>xgjR5O<YH+&tHO^*HI2HE>AKI8;4v~&H1*|BZLt- z3Q7!UgqwLF4l&H2Vi_)2Pgb8-bR17+&Yf{r*D3Mnzm-qvacaf3d^|Fx^nNl5aqz=p zwE3W)d3m_d8Nop6pbq|2r#dIm!AmV!7L5y}iD{ARA>}HxC5@k~!I%@#Xpe;M-Ib&{ zkVUaTyG`4alV7a;=3}hML|;9M%=v{f{h<%$B2_Q`in1bg-h&uM;51QJ3LjoHb##T& zR-dY!iF>R?XNtLH;Mly%Q8ZzMA9eWMOCm7Y(y4(Ver<_^U$sa-u`@HmfB4s;-A>N? zx^^3rd+%UAx2mfv=>T^Xic@!<ym^fyG1m=hJADmEWGaqBFT5Q5BLp~6N(bh&$&O@; z6Fr=4ebBB0y0br-M@%|#$duQ7VFNtk;^V)3yj-yIA^z$tOpyhtahc=(0J%8b=(YG4 zJfjr@*u)?EBN%2;S~;Zkk9|>oUY@7pN+#3LhW#L$@bwSn76Cu3Qv%C%?P$Q!XQ>!P ziIr&(KMPUMUA`ta4srYfL-bVw9c+vC#^o1py{yx0+a?5RQZ$V~71|CHnc^M*n-)c| z#D@a|uZLXPI{|$b)LhkMFvbT%qp0G*CXW3J8(uX#q)7W<9g+`H#%?~b&TN3g%V&#W z;F}@=AXsVvQl$IZlDgkoWJoA^fgyI`rdAqOFm>OmyBSq?V*IfZCngF&K>uRMtnJf3 z#&$@T<(oKgu1v14J{vsoh>ljY_-|2s24GZ)uE>Ydq?A7{l3Tp;6Eo)^#oFd&3wW{j zgqP&8{3ECYub|tRwWooe{4`gb7?(x<7#jI>8<=~p!ibO^$gy*~eGB(6(f{p>@uW1M z0MO&h%gaNLBIl!4HhH>Q@%TWG_q8U^?j9w)uar)CG*bYe8sb4}#{}+nEXMcN$94^O zuc+MymA<*Q4LtRlLTW-iyf_zcX+aTxE27YEyi%cOPz_Ef@gF64H`dj)&T;e1z&7vn z_k@2rX?s?zLM+SxWx&qa&geQTZ-IW(LJB}H5Wu0G%?cXQN(b~T!sX0Z-?Meu#Kex# z<;RXiE}xT|>hRdS5d<$@z1M!0F`C&h4U#8}rqJE}wtwNv{7tcSv6ue%@<%W0D?ML- z0o>|6;kLc4{SJ+r^KV0Ena?YJ%i}(!i2kGYLG$u>21^$lfCA9f83lpwGbk7xh=(>% z63CD6;dAjz0LZ8e_z}iM1`KhkiP4gMu<)tIPe>WbKlm6sO%1*Y*K%A!UI_2Bq9|F^ za>aujhB@r%OgTcIx~T@M`ayQ{@kfwZwK`K-C+;~~d5<I#kJ~kW5DAh-nrN&Y;vhJ< zIOZRs{)vvBHuzYfO}I+Jt_eV?<k;U{tWaXbBlmIw@Hu#eA%!%+#V9&_I>}iQS%JY> z2;&$7f7z@FKbUaE65~(*8}7~79wH{Q*$LeUfLV^kj$C`tr7mj^5ss>I=?A1wvLp*{ z7mg@0-L@zJJn=rcXUDSfw5D3L@H#cfw}z}Fj3rmLez#mIXn`Ua$x(buv4O074|Z4Z zY|CB<Y^?(|Q)WnViHC(rd?2PJCQd{x`8K8y2b4_kX@}IHR)hOZpmRzfKplfuL2M)? z4Ir;5(Z`;rFLDzb_(p!CxI-Si$aePB^D=>Bsp>jaa0Y$T=b0_I8+<FaOVgo11(77x z0)JSVMQ4#GFjKwFWgi+erNHO__^W>kU|9-AHi4@>ThIu6*IU|F6ZWXb-v|Z*y1Ton zIv>tPUA;-V=H?9f0_Ur()*-UI-K2xSFWjPKn1jkRKww|eFD~)Lp%*A_E>nAe((mv^ zCQ$+#YZmBjEs-K<9kSG*oK|^~MJkAI!rwu`O}BvuL;yJ~kAXN(LvT7b7~J;Lv?rJd zKYq)lRFEochxf<QZDm=g;@_zCCfeo_oUS63+=XXddxb(@A%fZ%J;$ppNoV8Y>laMC zzt+gTNdUbnG%e=zy05Tu?P<(ZQo0c)kq}1q9>=e&lXU>}ApWdI^B%DHBgOpI$?(U@ z=TW=8K7JrSUFB&;I@#;)Npcw4Irh2@r;mA|OP6b6S9uiaafch`Qq@ck;`@*Yj#@44 z&cu~5{N95XCPx#f(T-^@_f_|V0=6{}vnXgc@O~~6;L-LE125#c@6+v`7OK2DHX;XM zLEZ+HZ;a*_vBMdouFi+6T!0|TOJDY-lfOvxY6g=Rr#Mu~82xOl#3SD^J4X;R5$uS$ zNvetW4LsQZR-X=q7U61Ym}@4e=`|y<I~VM2>e4nvN^Ovp7K-su7B8Ws(^T%qkR6ni zUp&wR*a+d8X05KSj;2HcdfrrgGG<}z+UTLNDQ`T(^O!yB$`juMU4T2&!2aa%UU^J~ zpT@%x>w`h-;TDMcsLLcLoe048?e~qz+bd2lONDe%hUPw+t{v7h)AgHF)ooNC1F_j3 z)kN4EgEjiB^Px`D3ZyfmBPA?+uIa!6&C@FoB!-q8TL+ahOPR?dT+<F5apDK*gD!G~ z2@hNFjwdp~G9HbAKYstsA%-v0_<sbsKbEWheBSk27S~)|0QTjD-SypOL!g8y>-B1j zrwCIqzD>G~DF<lEDV<Cx%xIx9D<k9QF9XMreKYbHPf<OPPUv2<yQI~#*5BC8(fU}s z2ArxIfwO>Ttljpf$Zf+@s#!pgYzbtk6XE(q6^%fWHLK*6od1ZSzgWhK&(6jljAM{h zr*t%FoM|DGHzC3gkQ^Ks;1^6$`*&CMJLk4&<D;htConcYOHklO6zdc$ppMS!!w`;% z!=Z3fn98`|!*cRZ3+rN;y`O`fz31uiUYsP1>gy#le22oySI(2m^*72I^3gXTFJc{r z$*gqu6S4|$0!tbL_MM%7@Is(Ti)62;;&Uj`&;_sMQc^~?W7S9yZ{NQcd9%_OLq1e_ ziBf6L>-_lNa{xLbd%}{ct4}DR0m`icM$Y-rpMj>VxXSQ?H{sq2KFEA5om<Uz0V5NW z#Vx~fBR?fddO=&o5A6^E`ys+I(A;X<XU_n8!(zc_F(%6m_awOSIFuoP!bfevqkuV0 z_zZ8%r^ETm3Myg8HU&z00c)tJAB6E}=?4cMtwb!1c$F5)!tKSb1g8)I!Nm48A<gm- z#(J?E%HmD^6bO`L6Ac8i4JTlDc^*iIDl53_<^HsZ#n+?WMC^@L3I-Jw)gBelASDKH zKn@Z2pWB_OS53|Us4PNL1E>N!u?eAV+Kc<YzE?ATv|_{+cb(VVldItX6V9Xe<XmoU zZHZGIJ^{kMfM%JA^uLft>X9H8e-(=f1JzaF+uQaMzBi}9|Ek&wR&dS0l$=ME56Tc` zP)x}kL_JZy;G2Mi(J}bcep$8#x7$h-3ko^i8X8jVTKxdDNwrxtwE{&9f?OD0e1e4t z2v^7xZ@goK|K$C`8o{+u_oav#J~iXpj~b$bfOoTA$E&(y>B6sZZJJPUEP6qO#;FMS zD!q^);;g5l8PdzcOT>=}!up-hmi64o7WApE?t1`LaAzV3loD9XE+H%1nMNS{P(xv3 zye?NGUo<rkL!-}D!Y)c$R8*8zQKNWs1wnkh*h}5!R{&u}9kPGT<u$bhJs5{MOv<x& z-!D=_V8uct(0)_K63h}Vn<ksyu&cXdC{BvJv)c2<X%kfAmY%ny<^>{~0_M67bT3m# zCx$Wt@nTUu91hT@)THZ9N4(YFv0V<g!0%%v^>?zUKEubqi?s;?qcyGt9*}w+wi4|e znU~304A0+fd-iqI$)CZa!M>mVwBSDyG~Y_!>@<(YgX_N%vh_Kr1GMK)Keo`;2f!#0 z%)bLQenY-}`}jV=cp3N~Ta`ZDY{hYfEM-gk%yX-um*}uXun~PQx3I84K?yfMLGELT z{4=1}wm8BF5A!%+{N|f=P#*%EOAbktC%AM<ozDaeE{;{zfgV33M~NSvBjVD5=6AZ_ z0HHMvhaydQDBHB3udnUer>&T^kflT;I5t~PVP2VW^>K8kcw}6htieX*biLtgJx*d9 za+t6cLLA0Z5F%k2r~JGf0xPS)Y&Qj6!&qVIYk&To^PCTzB!SZ!mCjC2B{c4G1V%49 z4b`?MlN8g8=9Spz26FHOTb}}ZG(*J(rpaHR=3*V!4IC}-+_c|g<2J=Fowe`h@ootP z(8=;7R486%;UE2~a}<35I|vC<9ygi2f6gwL&=19f)u0N9GNkz5)fQo`kXk-9P(?b{ zsJXd$39&(r(Q>~)lKF;kAGlzADL)u~z64%1GDhrv?0M*#wysm%n5bsX8+8|!B<TuH zk$y&1^V4%Y4AXxxysQ5i^fX7MB}tDAZdHQZ8%g1D-a^5foXOEtUT~5sGBpCAeFm3A zX=pqB(TqG?NsBx`x#j5HQe{ge*dur~zoW}<9lnD(qn89{A7^c*jsVbW-rrL@&8ET` zwxbaNRLv!&CFk0?gOgS2T>*Mez88OpXr;Yp2?UoDYeodjY#*&S337Le%o<#jz)qWo zhxa7+GlOL8!P$cBQSXFrval!lF^{jSFt{?yUdP7xJRQtP62Yn0CTfR|!cLzI=A)me zcXDORkGBoEPNTLbx2C3aZVszEzY;1_86Bw?AVtpsHZO8FP^%Afdv}+eDh78(WH~E7 zaXYubx8G@JN>2%mj3<iy#doF67VxQcuw_x!{s+7d{yLuEr|T~1<)}gxNXd{uhMzZ& z3xqTv0I5=-66YT!u-xco_Sy*9#LEZFj>eoVGmIL^tKYIbkBEq1*(7U@o;2`X5;>4$ z&pZq?I~Rj>HlVqiRuWe;%jt2JrPclMgus$hq&1o=BE8$-iF;9>=&pa?0xL&;FI0P8 za&U1){*;{*zSUnC9v-e0xkTpM$D;x=M~Av`m$i0-#d<Tk8*I~i3D8JOK?c#cV{Wr+ zo`Gh9U^N7I)jr*lNRG|aw!NgzsTTE*+Mi_DPM=bj?qAmNMO^s@E(BXzrCX8h#LjnD zw|brQptw1J?M=R3>EzdoTA`5ZX9oEHwXRGtP!(#mFgx8fkMFd(U%s3RD~!MwF7*R9 zFyywoso{d2Vu;gmZ<rZ^=x#&a5`RKM#cbO$-25M9ma&alyU+?=Ma)yqBmbS9efhK8 z;Of=mSfCv9O~dSoR}Ul4(BoIJmO`T3LY0Ntcs}5@ka!i~JUHaO>$3;IeZd|<egQtt zr0&wHpZ&aRa%OU*o2v@K!dW`dziR6{3&nG)=P#jI2~V9rwu%5ph><`|o>*VJplx*j zefP{J(dNfbrkzP)p%RDDugRDq-S(eMP{Gi!x1+ht(epLm9}u(52=Yse<3VNLe%0`Q zXk}Q=D7ScvJ-EW*>v989iO$hGPeczRclN9n6w2X0fxYaPC00JQ*x=Aj$qH3X;eb!w z(Gn8I@9gegG1=68KHt5><qOCz#hB~sU0cgeo9C90xDikSzF=Y#L@`z_0&^y@2QJkF zYBp53ZTzwq4|j|$it%Y=CJjzta*h02x2N`dBwIbebjBQ8kmo?*z&`nP@99ak>r$ht z7X02Y1EBfDX=i6=v)<wN8Y?P9t*4l&T-Fq`f2vH>bv~Ln#u3HAG$|=5MMA@zjP-^? z=Wq@Dy;d!4et`R1D@5^vpF7G1ReqK1m`KJ957%knvb-lb{dM&Uy6ub8ET)bvXJ;n= zR|QY*GUIE^-?hrfJ#pgZmAy|OW1ACg)@JWZ?(6eOS#5S+F}LM<pv^DBV5><w(sJDb z47T2wX;axxrwC9Kh&!pH_V!g*|C$`}n99*36U<XGXr}T{9p^Z06mKkww9mqT%RI8! z0bJWTO+hL?Wpaxi^ROL#9Ep{2;s=%bz!D-YDBIudo1dhYow&^eg51%{wiAAM!=g0J zI#!4o+Z%A_!RG)nKEF>lryI~dYqK6^*Ts4soZE9v4?;HTO0%Y7hwo-@P=my*3=~-6 z%pKo60q*@k#~x6Z6YcnO+q>ESA%_VrFloHPJ+2z@?U#`1>R&8l<;LLiN7u6zvJZ-& zwn{kw2+09{cuK2T*mPL7r$Kzh2TTND!s7DFlWB?D0(5i;$1=rFFng@ajVh^KSvwu% z;qt=*La~yHnS^M9*f+ZJwr9Eswb2Gz(ziB*|GY(2{YR<mWR;nlopYYECoAC)brnRg zy{wXg9~faqtSpnbzw{$&^H$%`q;PGPsDFOb@r!<fzzG06Y1o4ZtkO4g(ZTN<$v~a> zp!KjA3)N37#PJ3NtWP&5U2LmcX8q;x>+gZjPyr>Hi1t*h;JGrxa($y=kAz`?%I3K` z2MuQEs8*(!)=Q0o_6zPBt>rFu?JuEIPjgJWqExH|KSH9fi{kG?!K7Q*le8K(Qra?1 z@Z85o@P2S^yCq&TqN+=p7Oku~<rMZviA6iNzkkfz?#gsS6J)%;OnCa%IO5$=L`cDi z0STg`3UAd|=|Y5vsl#)Z20-wHwHi~9s~$D@kUOIsGN>4Yf)m+n;nx$mJ(ei%!s#E+ zV4bFalzJE)<@q1*^6w76l_<yU(-q-TZge0$Bar^8Hne1Ip77T?_GY*S(<KXJJ6f4J zIyLBBn_~M4?hdF{p6n0S;Uz)x>Eo?94VqUc1MID5;OH69P);nQDjofa!RyyzrEb|; zNze6TETK>yjr~gxv@<SIsAzZD%?xjXbsZgNu{g%<SGC;c!{A6i|DwyMw{PDX-2QvL zhC~mO3;*x^XsL={UB^(1GC$6_Oy?^V2#O5Hw5q7CW9gtV#{&}DD>j&x8;lDH7xh72 z7&eNOW_W7Wc(<x>18@K>ku?=fSAO3$wf7OiJ<S9OGM^yxm(1rTfW#Bn@Vu7q3g?HJ zj=INumof`Bu67~3G4fNr`N_BKZ-}$=)xhU7IkGro6OQn}er4qqav>`dUcr(HP02Lm zYLF!}dw6`@`So2pM>WlLvBrj^(IwLD^JnC1_541lnc0eCG7cCFrp?WBwn^<6k%xy% zS8n)w@iZ^0fh@ClyPBG$N3u~HKtAK?_=o9XIp{K*Ubz_E=1s3-{(@`#CNMvyOJ;qg zy}Mb4ea86i%B1;m00-8P$@cA#Gf<fN{wDjFHPo|uS-$Hq7Iy!8nbPJU(AS$qN2}f& z<eLHHKvq%NYr8{+Pv(Mdnhv06O}&ig2veOMgO?yhMa8Kv1RN08kmtLP{Y8`SSm5!v zQ3cRZ2njoGRCKf^b1`*5T)aD&5pt0mPG)}i#o7USd7z8t?)MMdzAgOD2h84=V=Es` z#CSsBAFkp~PlRBEp~q$8?c9DQeC*U_w1-Jw?pYplqcc#jk`r&#f0g!a_cjji5<iry zcePWcIRQV{cM04)l#D+#!kPJPCO7kXoT==Ya_O3oYT9Dw3=!0BvU*lq=62h!CnM~- ziCg>B^{e8XPh|UP4-Vhy>rA`BSUznnEko_JyarRvOh7E*+6wt`n+y7$lr;Ju5>VUD z*!3Q6Bj8pQM~4|AF^1VJ#~L_sn)F_gKre9E+0uwTWP%!}+oK6y({Xk1=N*MC5}P<$ z6-KW1(Nv%OL*GMJKe4;-JaK;UPv~y6G1IXdYk!vu;gU-6S0{T2Njw0P+XBqUDc#|@ zhhJgYo-u##{Hsun#Kos-yoQ6v<D{C80`~sn$KtnvUs3$<H-y7SnuB9d#Eex03)b`< zFG$}MD>)QPAl^eyAI|~LRbi>*Xs!pG3zD<dBL;&pdJ@JD5jV(z;1d-K#)|K_Jqh4E z=?W%F2P10=F7rPIiXzZg?{_Yj37;&5BMv;OukJuM!<&QGq0!Ri(DbBNrT=AA7A#a$ zRF*G(I#ilAQ2!XwZgCB8(}gbTFTRQZr4hC&tEliSVhO&k15+Zv##RY|Uf+A9%4HP* zZXb8*O;1Qpw@8RLu6|oLBerlbrQ^D;vZQSGG8|w|S52^PKM8ZcCc4!_E0P|fzUz3f zoCx#kE9||7ZOl|}qhKEe>KDKOFf|b;Wr6C@ARUwYB@&vRZsc4@@ViqZm7mN1W&_jo zZy8>1+7IQO@A6ouW6gl^0hO<MpIp2SW=kvUU*hb5iYd{zhu;#OdDER9vHM_z{3L`D z!9eeXe+6Q=RhhTqXAj2q&eKWRoOeoLFU58mb(NMf$RVVT811e3uukm4bptWq!y~}o zmB3i^s{j;IfS+ozjZ~>Mnxhl84r&|;?^aCWzkfF(-|t1o#Oz%UK(@yT7@`!CQAq7s z)%~F<QGP<R>C2ZdMfgvd*|{u&f`X29GDEmx@kk5VdoBqi85hfCd6d4e07Prs-67NT znTW*e&x;LSvTvqAzFI3+*BBBJL>ofH8~&Xx+V<mq$;u0@|8BeY@tHvviQR6jk+L9U z1vIu>i^+aoB8da8bFQtb%D8`?>;HIHO<b&F`75ZYfpUJN^0?ZSG``k9`ezJ{ID2tp zmXuf3VQ)CWd8t;<Y?(ZITq0t*IS>&p`Ph?Nd|-d^8LZQB2u8QFgwr-*#0xdauD%i^ zk9}hTSZQ+m%nxjQvx2cAUJ>dSwbvE7U(k)*sv?}}{3%JT;}4@Kn%?36O1St7Sat2C zj4&%JN|${5u@>WmX?$bt!GrO!xYN6$d$vg1(vsf1?NhDwa=mjBmPSM=#nQL;d3%GL zZAjs){0fn|+>b}gmCp6}RBai`CzL??OnhMC#+Mbw<`D2H{W9&uB}}m#`1<D}DLcU1 z$32a2XuTYGHhn24(*oJ{wIFy`JRj7|u-u&@D;tzl{<>#Pi^n<>Uy*U8!9|ev{w?iI z>;aCPM<e_`Eour%YgkZqU4t$g4cePcVd9Zk@1zI+#D^o+zeDpEh;+7hPTkhn`Ta_k zj;cGK?!pE7YG&a!qgBi!+1?y|yynx9UVW^)%%hl^%GkQ#Q)C;*x5FLqYpY5OiuE^W zG9H~^%g2MB+qIW4*X{Cn!F>LbwR+5*@0U!j-cp=truXSYX19t|eF5v_{Cu=%m}30h zPNxKKZoTf$BWoV57Vjq6CGL79qU9}a8>8362xl!YEG;TFG>xTB>8Aie#q9)KfoqJD zBPG0%)!2q;f7jYGO|ztk!U#3Sqq+Xgu`w01863=&>Z|aDuKAvi%l+3)niv}ssUq8X z&kC5^n0)`Wv>kaH7{drC==uE*jd4FS`_GYC@G6~}z%+&d32#IFOO099p{FwPK0C$c z7f2G;9=*jzzw(!?i;d1K${}p9PZRH(&*r0GEdg$)REvbi{14=be%f-D^0=JuJfRMo zc(6^p<5)T=a&eT-+z6oy%k#$77aL&rt7q%8<qBzm^@@=Wkn@{M2(q%W#?@zWZKK(O zB1jOPzsq|=7pN7wGAkMFeN|NNex^_(xUV<A>y@#iwk~`j2^sr?&Ozaa<1=45rG}s2 z_PYb`qsJPS@xoYWJYE2Fc498x`zYVE*syrol3MEQ>S`kAx##Zt9^BrS3V8c04Fa26 zR9uQbK77l{a-M&APbc+}xA1ge7aulYiT*Pv`^i^(@byS;GGWd>cQCx^u=nxVL2rRz zWBj2z4mMv_raXAa^GE2#TT#Y$<~XO>w_LQQl6$w2|6;Rh>`r7BPc|UmCq8!vPwA-o zU0`u5G*z<SIFE4(2oQedxA^&`rbpn{B59%aTRl|^vit$IbWLT7*^QwD7AaIB4_ay< zBeq+ZHUJC?7YiEw?RJ~+ijNQbwK;D$4s!ikR0Ye^72BD_C1}Q?45QupoflQ%%PN9e z78)p+eVhobygRgdEjT#pH3iN?rIc59th5i&%^qT4+$=uutTs0ner)F8`c8ifz$Wx& zwfP^RO-M~pnlpdd9cB9kSJkVR($E16!DU@r&%29#&-zpn8O;fk`_Nf58?>wq%V!7Z zbp}leI<iy3)443N<)hy_(aZx@AoRYLm_oV-+nOIk-h0hH791#yMPv{@Z<bWNXfpOn zwM;v6uLUo*BLUxDc#^xXwV(;UeH)*hpt}!$R&}%58Ibeyg&z?OzbQuBo0!^zf;iHA zIULjScAKN+hPhiPO00Y5&bKO~(G6sfj_QI!eW&qyEWM1HsCA@78lItI4mr5$&iL_J zhlY5*;qzfr+F6V?g~EM)Mif0Nv%wMmAGI+Wzc2$nKW1@y#nK`P+Wh>ODCH6YyIvo$ zrhM?P{zBfkjH;%O$oWh!Y}mBruBDuDKc$lb>pw)7odY%BsA9Ljz=}iBk94jP(2g~b zS&F0w`GnRpcolTo{eh_O>fj2^MYnk-lp$TZfGcX2U3c>M=dbV7FaGZ7l)TcCt_{Ny za0b(wOB_N@n^5R>b;mJvD2s(-JetKV&|*PGN2kToPJqgtA~9_8<$^Je6n}QgOG%G% zGw5jNRakY(XuWooeYZX2^`GNfauG_aLv8%7I3%c^bSMfpFgdApqslDcgC{MjInKoV zzQI5{aauV@s{QYVja92W;`{aQe95OhKLnz}+4mWt_u~)Cy^WWr(xRv5Jb4q(Ty%NH zFt<<~=4U!rDc#$LgUiBRdjDY<GlXqEQ_Oj$P@3(<@$oUk?d@$p4GUzJK(iFycEhPE z*+4-&kHknwvJA(pUI;w36mub7_3qdE-BYpD^7(rzowtwFe2rt}1WVP-b}GLS?5@`s z(b=-zJx#*F^k?2JBKk{M{l$g4;cu>ibDmOR1gb9>`3KO+h%16hSO%ka)_$-EBQn$H z{CvO@8uAaQB33i4$=DqNA(2sdPO9y<K9E6Dq7${(rzF36RYZ8_ARF<im5RMVG#*O` zYk$JaUC$#{ATJb)Fbu47{g3em?PtwucRzNU@)c%|;W=XDk|sVir#hQcUuphAS8y_C z``|!Q9sJ~&UubN8l4@d*sPK&xC)oad_xRyl`FHlf%*+*z`az!0n8^TcJN|@SS@p1+ zr2CETn?S-KRzg;Mt+%*65r{cCP?OJc_Yr*~3=+u{zp2Tg(LD8?JjC4s<b3U6RO%Lu z^<eOHb#W0*@j}+;YMhEZq?`Y61mkIwTVWP4`|WdJECVVj)VepB695%g&(ooFJO8F` z3Ap8oj3@EMOOzIq`_ps+rBp)u%Am7XEW3+IVO|KsABI&Wk@~K?V>Z3^gOvKeo=s4+ zgm6?*<X!Jmy{ix1?+!-El+Sx~GY@qC(!J~v9y(OqGDX~R`3=_Mg?2eIei&I2Z#St^ z2Djhc+SxG(PQ*aMn-!4IRS!ExTTL%4nq}zkmi^#tr1@(q^FLMuRV@U8@jJpy8-Hzd z$hVCl)z6|&6G;lx_)v|2pQx=$lQtL8G@>qwTJC%zBUyDL`2KD?x|m|!a#|qVNV-M5 zgUGy@LsSY3+O9Crxt))_z4VGO;1kYj&K18Rz6ThHcF<iUZq{45&!BKu3Dq$G##JvZ zD)T)PcVErL<MpK$d$X9C?e_cU2dOVzR#7&&BXFw~R%$^=_BMEae%|6gcN=A^n8gn- z^v7g?XJgcaYu_=f1t%jvDzpuftNxRTCE8@-<dJJC?il9hv)ep5AwXR(1)WTEe!|zh zatd0n;|}bUATIF)ad2=1g85zND_)UOQl@cG3kV;miE@Y1o)OzI5q$8MGkuq`G!&Zx zW5Cf!_4)jH2NgH8elD%x{q=7;c1Gt&a3?1*R-|C%-DRRCyM7Yldyap`J5(!^a|B1= zx!7G>ZkfA@3OE<9T>8Ze+u{wm$=GZrX$_+TQesQtn<%yDP-16&8k$V85-O>Un7^}4 z9_xAG_;hE}@rrTd01^CZ?e+)b{{@8zdiSqhg>Bom`St79Z#X@(I(6!}urA=HqEe?& z?J<MD7!nABW$G0sSmM+XZ))eYc=-AG<qF-T=4eo{UZ3_wp}{ST(78*OF5SrVzL4y` z$ev+6_Dripsnbw{Wsa;bgw}v;g&MMhK!S-ACyqOI?ARSzE{~R7q2YCNG$?nkuguNO z1?uD9w{KrCK9lkEZ0H%WXVr>5yE>u~UNiXhXq&KQO;NN4q<T9h)RHgL(u<@m?d<Gc z{rm5~w_!BMqpm_~8)iDx4Aim%zWN^1Mko}4DbZcCX3b7~7Cq>h(6gau#LAqF*t4sy z(c5DNzaAv8VQsNOg@_WV)<RxD9%sswDQ=#gp4Z6}J>sVenq^TLZAwkxr#T8#+uyTi zPtf@B<0sNH5cIwUzY0h*QKhFEdxmE4myiVF3Q<j_CDoD$JxzNd8lZJsxpL*IvuDpH z((EEi$S5&0M+C#@e7cvkMkn3d<HwIDE?l_qFTCfkioAY%k>shzo|U-LV+MaI%cMeH zP(vh%sHWUT91VsI8#ZF=)~$zpeSLFi@;yB?_5jU9&;#@$;Bz!LAu=)&E?l^fvth#q z&mlvGyeoKpy7%-9*s~BMPYsdYH&=SfATOxKYRUCkg`t&9CVLq}aAy_`x=ffb;Y$qB z=K}%)6x3M9h+vKgx&vQDz$cwgD>HA~w$0nk&CQ+eE!|_f*L2UB*MEUM3n%t$%zD2Z zB#}@m6-R^CPEJl89UL571R{L@{rA)M@86F+2vE}YI@DJrCPG!1fTAz(shB`T1%H2k z<<6ZuFHf5`?K=VZbZ_Y%Gp#T7`i`Q8HnZd@r&6gn8VI>TOY}_bNS87qP*mtjMA*H1 z_eGRO`5_@8Lh1CeSRPd+GHA*iOmH7lNt0TZeSCcK|NZx09|rucg505dO81uTu}JHS zy}r4`S%J}jbf+_`J~U;r=q0L52>AhdF?V-&w=G+?9KmEc_4e)CK+`aV@~JSCUs;JD zfL>UNL?Av@&hFm53un%pdGz<+e;*x>2lMzsb%*56OHA%GW%t;b-E*_ouRs!LmP>_7 zQ5_bVsT}tr%MS_>;jOpcdT;gW)f+rLJ?~$+a)qOWnMDP$M0zX&O=SVSx}Hhio^m6+ zcGcm-heMVxU;g*t!Gqt^0KN;;`7g42*@)d+p~9nC-ZX>1f}??^EUGKY57b1UFpkz) zAOh;y-ZN&*_;KsjttU>OJ{?a>a+CgLWz;9NZ&M+JHZM=tKo>&!4^20v@e;aLjD#mp z8qT15AON544U;+o@CBV;SBu;+dwnCV6v<c_uDU2cXe>koG<A+pyLRm^ELm2QVZeX^ zZ_S%G?|0O{=L9lP;+&qIu9iu32wqf^5EVfRjqiReJ~uj7`aAXHQzeH$j}j+-`}XbU z=FFM%XTN^^Mu@z<3*8I4Cl>t5eS*htECPOYc28yI3Xkc?B26L)5uqv5vu!X@?noL} zlrR%0x(pmRaKvmpHgDd1{K%0bp#cE_xiqbhn!czLl}dzK2q7GWh@olvf?LC$e33T5 zQ{<x6_9)R03=GUYdh}>0UBj$dv*zM8y~C1PHSp=0*|m3MwR}P2H_`$4X7HOZ5$do+ zj_TLcv(lQ9JOqMT9%+)HS+iyXXvlxbk|k>}I-Dg?`S|!`QCl`uO=zMH<qtIdkI5!A zH<<KzBB4Z5s@OyG^}^?{&r}~oKmt1@@f4+~DbUZ)FYDN`W1)18ix)5c%gxPgQq!hQ z2MX6AfSz5WAah!?d+-9gCw0ugulz))#_HD2Yyd})N9w3Rz#xE-ED#N@354j{xN+kF zqehK#C9k?}-MU?Pcq1u7E?l^fdinC@JOU$43ZW#E$dQ(orX~m_p0v6%$ti8ofc{Ou zCL)nuC;3A1i+0wb$U|hKD0KDe)jV%+?^FbP2z@u51D(srkt4^_xlvn)Sl-Yz(6uno zza;YZg3PJU?u8?}H)h~hav})HvQR!1M};P0GLR+~WRgbC&{^bJyESOgpfAZLcX#(G zsGR04UAlDbh7B7IkT*Vb=+I@9QFq8YqYjTk@Wx^UNxXFFQi{L7e=5qWRQlc5*EbRW z9!oRdPMkOqiln+t@7=Lu$C-^AH}0p;#LxbnzJufperG=s*t>|%%S9kBlQ-=&K;J~e z+Y9APA-OdJzX}k+vWTcqi|OA6qR7yaC5CO$gSID7p^Q*V2?CkDy?tjbq!6qt1L><y zPELK>wrxAKM~@zFBY-~`Jb3U&Z@u-_CuH<H{f+*QUPG^C&1T(1y1k1g*y+3J99Z>+ zMru3KInueZb8ac}^bOdx)hfc<TbhAi^{PhVs9>Xo40V`9XvB1~m=Nj+L6V8)y)u36 zf}XislO|2N5ilJc9lK}{L@%TF(r3_T(Pz?UGoY*I+A<w4cz7}3Uts54pIw6{=xsE- zy}7DmjtWnrf|v{rOd`}|I$0n@LnbAfvRZjdCNWwwFt%mDq>26Q89_R+L|d@V8rF%m zaCBmNy#w>+FR{;R%Raj``>vMkyPL9eX($4`Gdt%R>>4ydZ}#@)LuWF`L^*>%2q8k$ zX0oC_lNgN{7++w(Y{o#^LPQe5Ueqx0|FvZAY0f^QDf`SO>^mB;@2tztLGbVb-~~-D zGlSlIl$H$I2q8oWdnPNYGXU0PiKR0GW*r97dJM1vQ3PwqO#C<Db@kYL>#)yqW}jV? zeOGn%-S#36uMO~K(3=l~kU^6W+DKu`z-T9m7}Z21sUeCW+D!QW>Z12Kh(K<~zC#<> zwE^A?dh=0kq|hXWKn`mWNn|3jXfyF^#P78#0_bM2n-8NSL{a3B7C{zmpq3T`ax>r! ac>Eu-bh^*Y;}d)U0000<MNUMnLSTZxpOy>& diff --git a/android/app/src/main/res/values-es/arrays.xml b/android/app/src/main/res/values-es/arrays.xml deleted file mode 100644 index d74fb6b1b..000000000 --- a/android/app/src/main/res/values-es/arrays.xml +++ /dev/null @@ -1,220 +0,0 @@ -<resources> - <string-array name="settings_console_region_entries"> - <item>Auto-Detectar</item> - <item>NTSC-J (Japón)</item> - <item>NTSC-U (US)</item> - <item>PAL (Europa, Australia)</item> - </string-array> - <string-array name="settings_cpu_execution_mode_entries"> - <item>Intérprete (El más lento)</item> - <item>Intérprete en Caché (Rápido)</item> - <item>Recompilador (Más rápido)</item> - </string-array> - <string-array name="settings_cpu_fastmem_mode_entries"> - <item>Deshabilitado (El más lento)</item> - <item>MMap (Hardware, Más rápido, 64-Bit Solamente)</item> - <item>LUT (Rápido)</item> - </string-array> - <string-array name="gpu_renderer_entries"> - <item>Hardware (OpenGL)</item> - <item>Hardware (Vulkan)</item> - <item>Software</item> - </string-array> - <string-array name="settings_gpu_resolution_scale_entries"> - <item>1x</item> - <item>2x</item> - <item>3x (para 720p)</item> - <item>4x</item> - <item>5x (para 1080p)</item> - <item>6x (para 1440p)</item> - <item>7x</item> - <item>8x</item> - <item>9x (para 4K)</item> - <item>10x</item> - <item>11x</item> - <item>12x</item> - <item>13x</item> - <item>14x</item> - <item>15x</item> - <item>16x</item> - </string-array> - <string-array name="settings_display_crop_mode_entries"> - <item>Ninguno</item> - <item>Sólo área de sobreescaneo</item> - <item>Todos los bordes</item> - </string-array> - <string-array name="settings_display_aspect_ratio_names"> - <item>Auto (Nativo del juego)</item> - <item>Auto (Match Display)</item> - <item>Custom</item> - <item>4:3</item> - <item>16:9</item> - <item>19:9</item> - <item>20:9</item> - <item>PAR 1:1</item> - </string-array> - <string-array name="settings_gpu_texture_filter_names"> - <item>Nearest-Neighbor</item> - <item>Bilinear</item> - <item>Bilinear (Sin unión de bordes)</item> - <item>JINC2</item> - <item>JINC2 (Sin unión de bordes)</item> - <item>xBR</item> - <item>xBR (Sin unión de bordes)</item> - </string-array> - <string-array name="settings_controller_type_entries"> - <item>None</item> - <item>Control Digital (Mando)</item> - <item>Control Analógico (DualShock)</item> - <item>Analog Joystick</item> - <item>NeGcon</item> - <item>GunCon</item> - </string-array> - <string-array name="settings_memory_card_mode_entries"> - <item>Sin tarjeta de memoria</item> - <item>Compartido entre todos los juegos</item> - <item>Tarjeta separada por juego (Código)</item> - <item>Tarjeta separada por juego (Título)</item> - </string-array> - <string-array name="settings_cdrom_read_speedup_entries"> - <item>Ninguno (Velocidad doble)</item> - <item>2x (Velocidad cuádruple)</item> - <item>3x (6x Velocidad)</item> - <item>4x (8x Velocidad)</item> - <item>5x (10x Velocidad)</item> - <item>6x (12x Velocidad)</item> - <item>7x (14x Velocidad)</item> - <item>8x (16x Velocidad)</item> - <item>9x (18x Velocidad)</item> - <item>10x (20x Velocidad)</item> - </string-array> - <string-array name="settings_touchscreen_controller_view_entries"> - <item>Ninguno</item> - <item>Mando digital</item> - <item>Mando analógico unico</item> - <item>Mando analógico dual</item> - <item>Lightgun</item> - </string-array> - <string-array name="settings_audio_backend_entries"> - <item>Nulo (Sin Salida)</item> - <item>Cubeb</item> - <item>OpenSL ES (Recomendado)</item> - </string-array> - <string-array name="settings_audio_buffer_size_entries"> - <item>1024 Fotogramas (23.22ms)</item> - <item>2048 Fotogramas (46.44ms, Recomendado)</item> - <item>3072 Fotogramas (69.66ms)</item> - <item>4096 Fotogramas (92.88ms)</item> - </string-array> - <string-array name="settings_log_level_entries"> - <item>Ninguno</item> - <item>Error</item> - <item>Alerta</item> - <item>Alertas de Rendimiento</item> - <item>Información</item> - <item>Detalles</item> - <item>Desarrollador</item> - <item>Perfil</item> - <item>Depurar</item> - <item>Seguimiento</item> - </string-array> - <string-array name="settings_tabs"> - <item>General</item> - <item>Pantalla</item> - <item>Audio</item> - <item>Mejoras</item> - <item>Logros</item> - <item>Avanzado</item> - </string-array> - <string-array name="settings_gpu_msaa_entries"> - <item>Deshabilitado</item> - <item>2x MSAA</item> - <item>4x MSAA</item> - <item>8x MSAA</item> - <item>2x SSAA</item> - <item>4x SSAA</item> - <item>8x SSAA</item> - </string-array> - <string-array name="settings_advanced_display_fps_limit_entries"> - <item>Ilimitado (Mostrar fotogramas)</item> - <item>10 FPS</item> - <item>15 FPS</item> - <item>30 FPS</item> - <item>45 FPS</item> - <item>60 FPS</item> - <item>75 FPS</item> - <item>90 FPS</item> - </string-array> - <string-array name="settings_emulation_speed_entries"> - <item>Ilimitado</item> - <item>10% [6 FPS (NTSC) / 5 FPS (PAL)]</item> - <item>20% [12 FPS (NTSC) / 10 FPS (PAL)]</item> - <item>30% [18 FPS (NTSC) / 15 FPS (PAL)]</item> - <item>40% [24 FPS (NTSC) / 20 FPS (PAL)]</item> - <item>50% [30 FPS (NTSC) / 25 FPS (PAL)]</item> - <item>60% [36 FPS (NTSC) / 30 FPS (PAL)]</item> - <item>70% [42 FPS (NTSC) / 35 FPS (PAL)]</item> - <item>80% [48 FPS (NTSC) / 40 FPS (PAL)]</item> - <item>90% [54 FPS (NTSC) / 45 FPS (PAL)]</item> - <item>100% [60 FPS (NTSC) / 50 FPS (PAL), Defecto]</item> - <item>125% [75 FPS (NTSC) / 62 FPS (PAL)]</item> - <item>150% [90 FPS (NTSC) / 75 FPS (PAL)]</item> - <item>175% [105 FPS (NTSC) / 87 FPS (PAL)]</item> - <item>200% [120 FPS (NTSC) / 100 FPS (PAL)]</item> - <item>250% [150 FPS (NTSC) / 125 FPS (PAL)]</item> - <item>300% [180 FPS (NTSC) / 150 FPS (PAL)]</item> - <item>350% [210 FPS (NTSC) / 175 FPS (PAL)]</item> - <item>400% [240 FPS (NTSC) / 200 FPS (PAL)]</item> - <item>450% [270 FPS (NTSC) / 225 FPS (PAL)]</item> - <item>500% [300 FPS (NTSC) / 250 FPS (PAL)]</item> - <item>600% [360 FPS (NTSC) / 300 FPS (PAL)]</item> - <item>700% [420 FPS (NTSC) / 350 FPS (PAL)]</item> - <item>800% [480 FPS (NTSC) / 400 FPS (PAL)]</item> - <item>900% [540 FPS (NTSC) / 450 FPS (PAL)]</item> - <item>1000% [600 FPS (NTSC) / 500 FPS (PAL)]</item> - </string-array> - <string-array name="settings_advanced_cpu_overclock_entries"> - <item>25% (8MHz)</item> - <item>50% (16MHz)</item> - <item>75% (24MHz)</item> - <item>100% (33MHz, Defecto)</item> - <item>125% (41MHz)</item> - <item>150% (49MHz)</item> - <item>175% (57MHz)</item> - <item>200% (66MHz)</item> - <item>225% (74MHz)</item> - <item>250% (82MHz)</item> - <item>275% (90MHz)</item> - <item>300% (99MHz)</item> - <item>350% (115MHz)</item> - <item>400% (132MHz)</item> - <item>450% (148MHz)</item> - <item>500% (165MHz)</item> - <item>500% (165MHz)</item> - <item>600% (198MHz)</item> - <item>700% (231MHz)</item> - <item>800% (264MHz)</item> - <item>900% (297MHz)</item> - <item>1000% (330MHz)</item> - </string-array> - <string-array name="settings_emulation_screen_orientation_entries"> - <item>Usar configuración del dipositivo</item> - <item>Vertical</item> - <item>Horizontal</item> - <item>Sensor Based</item> - </string-array> - <string-array name="settings_theme_entries"> - <item>Usar configuración del Sistema</item> - <item>Claro</item> - <item>Oscuro</item> - </string-array> - <string-array name="settings_downsample_mode_entries"> - <item>Deshabilitado</item> - <item>Cuadro (Reducir Resolución 3D/Suavizar todo)</item> - <item>Adaptable (Preservar 3D/Suavizar 2D)</item> - </string-array> - <string-array name="settings_boolean_entries"> - <item>Deshabilitado</item> - <item>Habilitado</item> - </string-array> -</resources> diff --git a/android/app/src/main/res/values-es/strings.xml b/android/app/src/main/res/values-es/strings.xml deleted file mode 100644 index 7543266ad..000000000 --- a/android/app/src/main/res/values-es/strings.xml +++ /dev/null @@ -1,346 +0,0 @@ -<resources> - <string name="app_name">DuckStation</string> - <string name="action_settings">Configuraciones</string> - <string name="action_controller_mapping">Mapeado del Control</string> - <string name="title_activity_settings">Configuraciones</string> - <string name="settings_console_region">Región de Consola</string> - <string name="settings_console_tty_output">Habilitar Salida TTY</string> - <string name="settings_console_fast_boot">Inicio Rápido</string> - <string name="settings_osd_show_messages">Mostrar Mensajes</string> - <string name="settings_osd_show_speed">Mostrar Velocidad de Emulación</string> - <string name="settings_osd_show_show_fps">Mostrar velocidad de fotogramas del juego</string> - <string name="settings_osd_show_show_vps">Mostrar pantalla FPS</string> - <string name="settings_cpu_execution_mode">Modo de Ejecución de CPU</string> - <string name="settings_gpu_renderer">Renderizador de GPU</string> - <string name="settings_gpu_resolution_scale">Escala de Resolución</string> - <string name="title_activity_emulation">Actividad de Emulación</string> - <string name="settings_emulation_speed">Velocidad de Emulación</string> - <string name="settings_fast_forward_speed">Velocidad de Avance Rápido</string> - <string name="settings_save_state_on_exit">Guardar Estado al Salir</string> - <string name="settings_emulation_screen_orientation">Orientación de pantalla del Emulador</string> - <string name="settings_load_patch_codes">Cargar Códigos de Parche</string> - <string name="settings_summary_save_state_on_exit">Guarda automáticamente el estado del emulador al apagar o salir. Después puedes continuar desde donde lo dejaste la última vez.</string> - <string name="settings_summary_load_patch_codes"><![CDATA[Cargar Códigos de Parche de trucos/<game name>.cht en formato PCSXR. Los códigos pueden ser activados dentro del juego.]]></string> - <string name="settings_apply_compatibility_settings">Aplicar configuración de compatiblidad</string> - <string name="settings_summary_apply_compatibility_settings">Desactiva las mejoras automáticamente cuando no son compatibles con los juegos.</string> - <string name="settings_summary_video_sync">Habilita esta opción para coincidir la tasa de refresco de DuckStation con la de tu pantalla. La VSync se deshabilita automáticamente cuando no sea posible (ejemplo, no llegar al 100% de la velocidad).</string> - <string name="settings_video_sync">Sincronizar Video</string> - <string name="settings_cpu_overclocking">CPU Overclocking</string> - <string name="settings_cdrom_region_check">Chequeo Regional de CD-ROM</string> - <string name="settings_summary_cdrom_region_check">Evita que el emulador lea discos de regiones incorrectas. Comúnmente es seguro desactivarlo.</string> - <string name="settings_cdrom_preload_image_to_ram">Precargar imagen a RAM de CD-ROM</string> - <string name="settings_summary_preload_image_to_ram">Carga la imagen del juego en la RAM. Útil para cuando se usan directorios a través de una red. En algunas ocasiones puede eliminar las pausas que se generan cuando el juego inicia la reproducción de una pista de audio.</string> - <string name="settings_pgxp_vertex_cache">Caché de vértices PGXP</string> - <string name="settings_summary_pgxp_vertex_cache">Utiliza las coordenadas de la pantalla como respaldo cuando falla el seguimiento de vértices a través de la memoria. Puede mejorar la compatibilidad con PGXP.</string> - <string name="settings_pgxp_cpu_mode">Modo PGXP CPU</string> - <string name="settings_summary_pgxp_cpu_mode">Intenta rastrear la manipulación de vértices a través del CPU. Algunos juegos requieren esta opción para que PGXP sea efectivo. Muy lento e incompatible con el recompilador.</string> - <string name="settings_cpu_recompiler_icache">CPU Recompilado ICache</string> - <string name="settings_summary_cpu_recompiler_icache">Determina si la caché de instrucciones del CPU se simula en el recompilador. Mejora la precisión con un pequeño coste de rendimiento. Si los juegos corren demasiado rápido, intenta habilitar esta opción.</string> - <string name="settings_cpu_recompiler_fastmem">CPU Recompilador de acceso rápido a la memoria</string> - <string name="settings_summary_cpu_recompiler_fastmem">Hace que el acceso de memoria de los invitados sea más eficiente mediante el uso de errores de página y parches. Desactívalo si es inestable en tu dispositivo.</string> - <string name="settings_presented_frame_limit">Límite de fotogramas presentados</string> - <string name="settings_logging_level">Nivel de Registro</string> - <string name="settings_log_to_file">Registrar en Archivo</string> - <string name="settings_summary_log_to_file">Escribe los mensajes de registros duckstation.log en tu directorio de Usuario. Usarlo solamente para depurar, ya que ralentiza la emulación.</string> - <string name="settings_log_to_logcat">Registrar en Logcat</string> - <string name="settings_summary_log_to_logcat">Escribe los mensajes de registros en el registrador de mensajes de Android. Solo es útil cuando se conecta a una computadora con adb.</string> - <string name="settings_volume">Volumen</string> - <string name="settings_summary_volume">Controla el volumen de salida de audio del emulador.</string> - <string name="settings_fast_forward_volume">Volumen de Avance Rápido</string> - <string name="settings_summary_fast_forward_volume">Controla el volumen de salida de audio del emulador que durante el avance rápido.</string> - <string name="settings_mute_all_sound">Silenciar todo</string> - <string name="settings_summary_mute_all_sound">Evita que el emulador emita cualquier sonido.</string> - <string name="settings_mute_cd_audio">Silenciar audio de CD</string> - <string name="settings_summary_mute_cd_audio">Silecia a la fuerza el audio CD-DA y XA del CD-ROM. Puede usarse para deshabilitar la música de fondo en algunos juegos.</string> - <string name="settings_audio_backend">Motor de Audio</string> - <string name="settings_audio_buffer_size">Tamaño del Búfer de Audio</string> - <string name="settings_summary_audio_buffer_size">Determina la latencia entre el audio que se genera y de salida por altavoces. Los valores más pequeños reducen la latencia, pero las variaciones en la velocidad de emulación causarán problemas.</string> - <string name="settings_audio_sync">Sincronizar Audio</string> - <string name="settings_summary_audio_sync">Acelera la velocidad de la emulación basado en los fotogramas de audio enviados por el motor de audio. Esto ayuda a eliminar ruidos o distorsiones si la emulación es muy rápida. La sincronización se desabilitará automáticamente si la velocidad no es del 100%.</string> - <string name="settings_controller_type">Tipo de Control</string> - <string name="settings_enable_analog_mode_on_reset">Habilitar el Modo Analógico al Reiniciar</string> - <string name="settings_touchscreen_controller_view">Vista de Control de Pantalla Táctil</string> - <string name="settings_auto_hide_touchscreen_controller">Auto-Ocultar el control de pantalla táctil</string> - <string name="settings_summary_auto_hide_touchscreen_controller">Oculta el control de pantalla táctil cuando un control externo es detectado.</string> - <string name="settings_vibrate_on_press">Vibrar al presionar</string> - <string name="settings_summary_vibrate_on_press">Permite una vibración corta cuando un botón en la pantalla táctil es presionado. Requiere que \"Vibrar al presionar\" esté habilitado en tu dispositivo.</string> - <string name="settings_enable_vibration">Activar Vibración</string> - <string name="settings_summary_enable_vibration">Reenvía el ruido del juego al motor de vibración del teléfono..</string> - <string name="settings_memory_card_1_type">Tarjeta de Memoria Tipo 1</string> - <string name="settings_memory_card_2_type">Tarjeta de Memoria Tipo 2</string> - <string name="settings_crop_mode">Modo de recorte</string> - <string name="settings_aspect_ratio">Relación de Aspecto</string> - <string name="settings_linear_upscaling">Escalado Lineal</string> - <string name="settings_integer_upscaling">Escalado Entero</string> - <string name="settings_summary_linear_upscaling">Suaviza la imagen al escalar la consola a la pantalla.</string> - <string name="settings_summary_integer_upscaling">Añade relleno en la pantalla para asegurarse que la relación entre los pixeles de la consola y del anfitrión es un número entero. Puede resultar en una imagen más nítida en algunos juegos 2D.</string> - <string name="settings_summary_osd_show_messages">Muestra mensajes en pantalla cuando ocurren eventos como crear o cargar estados guardados, tomar capturas, etc.</string> - <string name="settings_summary_osd_show_speed">Establece la velocidad de emulación de destino. No se asegura que esa velocidad se vaya a alcanzar, y de no hacerlo, el emulador va a correr lo más rápido que pueda.</string> - <string name="settings_summary_osd_show_fps">Muestra la velocidad de fotogramas interna del juego en la esquina superior derecha de la pantalla.</string> - <string name="settings_summary_osd_show_vps">Muestra el número de fotogramas (o sincronizaciones verticales) mostradas por segundo por el sistema en la esquina superior derecha de la pantalla.</string> - <string name="settings_cdrom_read_speedup">CD-ROM Aceleración de lectura</string> - <string name="settings_summary_cdrom_read_speedup">Acelera la lectura del CD-ROM para el valor especificado. Sólo se aplica a lecturas de doble velocidad, y se ignora cuando se está reproduciendo audio. Puede mejorar las velocidades de carga en algunos juegos, mientras que puede interrumpir otros.</string> - <string name="settings_summary_console_fast_boot">Omite el BIOS shell/intro, iniciando directamente en el juego. Normalmente es seguro habilitarlo, pero algunos juegos se tildan.</string> - <string name="settings_msaa">Anti-aliasing de muestreo múltiple</string> - <string name="settings_true_color">Renderizado de color verdadero (24-bit, deshabilita el tramado)</string> - <string name="settings_summary_true_color">Esto produce mejores gradientes al costo de hacer algunos colores diferentes. Deshabilitar esta opción también activa el tramado. La mayoría de los juegos son compatibles con esta opción.</string> - <string name="settings_scaled_dithering">Escalado de tramado (escalar patrón de tramado a resolución)</string> - <string name="settings_summary_scaled_dithering">Escala el patrón del tramado a la escala de resolución de la GPU emulada. Esto disimula el tramado en altas resoluciones. Usualmente es seguro habilitarlo, y sólo está soportado por los renderizadores de hardware.</string> - <string name="settings_disable_interlacing">Deshabilitar tramado (fuerza progresivamente renderizado/escaneo)</string> - <string name="settings_summary_disable_interlacing">Fuerza el renderizado y visualización de fotogramas en modo progresivo. Esto elimina el efecto \"peine\" visto en juegos con 480i renderizándolos en 480p. Normalmente es seguro habilitarlo.</string> - <string name="settings_texture_filtering">Filtrado de textura</string> - <string name="settings_force_ntsc_timings">Forzar tiempos NTSC (60hz en PAL)</string> - <string name="settings_summary_force_ntsc_timings">Usa los tiempos de fotograma del modo NTSC cuando la consola está en modo PAL, forzando los juegos PAL a correr a 60Hz.</string> - <string name="settings_widescreen_hack">Hack de Pantalla Panorámica</string> - <string name="settings_summary_widescreen_hack">Escala las posiciones de vértices en pantalla a una relación de aspecto panorámica, incrementando el campo de visión de 4:3 a 16:9 en juegos 3D. Tal vez no sea compatible con todos los juegos.</string> - <string name="settings_force_4_3_for_24bit">Forzar 4:3 para escenas 24-bit</string> - <string name="settings_summary_force_4_3_for_24bit">Cambia al modo de pantalla 4:3 cuando se muestra contenido de 24-bit, generalmente FMVs.</string> - <string name="settings_chroma_smoothing_24bit">Suavizado de croma para escenas 24-bit</string> - <string name="settings_summary_chrome_smoothing_24bit">Suaviza el efecto pixelado que se produce entre las transiciones de colores en contenido de 24-bit, generalmente en FMVs. Sólo se aplica a los renderizadores de hardware.</string> - <string name="settings_pgxp_geometry_correction">PGXP Corrección de Geometría</string> - <string name="settings_summary_pgxp_geometry_correction"><![CDATA[Reduce los polígonos \"temblorosos\" y las texturas \"deformadas\" que son comunes en juegos de PS1. >Solo funciona con los renderizadores de hardware. Tal vez no sea compatible con todos los juegos.]]></string> - <string name="settings_pgxp_culling_correction">PGXP Correción de Culling</string> - <string name="settings_summary_pgxp_culling_correction">Incrementa la precisión del culling de polígonos, reduciendo el número de huecos en la geometría. Requiere la correción de geometría activada.</string> - <string name="settings_pgxp_texture_correction">PGXP Corrección de Texturas</string> - <string name="settings_summary_pgxp_texture_correction">Usa interpolación con perspectiva correcta para las coordenadas de texturas y colores, enderezando texturas deformadas. Requiere la correción de geometría activada.</string> - <string name="settings_pgxp_preserve_projection_precision">PGXP Conservar la precisión de proyección</string> - <string name="settings_summary_pgxp_preserve_projection_precision">Permite precisión adicional para PGXP. Puede mejorar las imágenes en algunos juegos pero fallar en otros.</string> - <string name="settings_pgxp_depth_buffer">PGXP Búfer de Profundidad</string> - <string name="settings_summary_pgxp_depth_buffer">Intenta reducir los polígonos en el eje Z probando píxeles con los valores de profundidad de PGXP. Tiene baja compatibilidad, pero puede funcionar bien en algunos juegos.</string> - <string name="menu_main_resume_last_session">Reanudar la última sesión</string> - <string name="menu_main_start_file">Iniciar Archivo</string> - <string name="menu_main_start_bios">Iniciar BIOS</string> - <string name="menu_main_edit_game_directories">Editar Directorios de Juego</string> - <string name="menu_main_scan_for_new_games">Escanear para juegos nuevos</string> - <string name="menu_main_rescan_all_games">Reescanear todos los juegos</string> - <string name="menu_main_import_bios">Importar BIOS</string> - <string name="menu_main_show_version">Mostrar Versión</string> - <string name="menu_main_github_repository">Repositorio de GitHub</string> - <string name="menu_main_discord_server">Servidor de Discord</string> - <string name="menu_game_list_entry_start_game">Iniciar Juego</string> - <string name="menu_game_list_entry_resume_game">Reanudar Juego</string> - <string name="android_progress_callback_please_wait">Cargando...</string> - <string name="android_progress_callback_ok">OK</string> - <string name="android_progress_callback_information">Información</string> - <string name="android_progress_callback_confirmation">Confirmación</string> - <string name="android_progress_callback_yes">Si</string> - <string name="android_progress_callback_no">No</string> - <string name="emulation_activity_error">Error</string> - <string name="emulation_activity_ok">OK</string> - <string name="emulation_activity_import_patch_codes">Importar códigos de parche...</string> - <string name="emulation_activity_patch_on">(ENCENDIDO)</string> - <string name="emulation_activity_patch_off">(APAGADO)</string> - <string name="emulation_activity_choose_patch_code_file">Seleccionar Archivo con Códigos de Parche</string> - <string name="emulation_activity_failed_to_import_patch_codes">Fallo al importar códigos de parche. Asegúrese de seleccionar un archivo con formato PCSXR o Libretro.</string> - <string name="main_activity_choose_directory">Elegir Directorio</string> - <string name="main_activity_error">Error</string> - <string name="main_activity_get_path_from_file_error">No se pudo obtener la ruta del archivo seleccionado. Asegúrese de que el archivo esté un almacenamiento interno/externo.\n\nToque el botón que sobresale en el selector de directorio.\nSeleccione "Mostrar Almacenamiento Interno".\nToque el botón de menú y seleccione el nombre de su dispositivo o tarjeta SD .</string> - <string name="main_activity_ok">OK</string> - <string name="main_activity_get_path_from_directory_error">No se pudo obtener la ruta del directorio seleccionado. Asegúrese de que el directorio esté un almacenamiento interno/externo.\n\nToque el botón que sobresale en el selector de directorio.\nSeleccione \"Mostrar Almacenamiento Interno\".\nToque el botón de menú y seleccione el nombre de su dispositivo o tarjeta SD .</string> - <string name="main_activity_external_storage_permissions_error">Se requieren permisos de almacenamiento externo para usar DuckStation.</string> - <string name="main_activity_choose_disc_image">Seleccionar Imagen de Disco</string> - <string name="main_activity_missing_bios_image_prompt">No se encontró ninguna imagen de BIOS en el directorio BIOS de DuckStation. ¿Quiere localizar e importar una imagen de BIOS ahora?</string> - <string name="main_activity_missing_bios_image">Imagen BIOS Ausente</string> - <string name="main_activity_yes">Si</string> - <string name="main_activity_no">No</string> - <string name="main_activity_choose_bios_image">Elegir Imagen BIOS</string> - <string name="main_activity_failed_to_open_bios_image">Fallo al cargar la imagen BIOS.</string> - <string name="main_activity_failed_to_read_bios_image_prefix">\"Fallo al leer la imagen BIOS: \"</string> - <string name="main_activity_bios_image_too_large">La imagen de BIOS es demasiado grande. Debes seleccionar una imagen de BIOS, no un juego, y debe tener un tamaño de 512 KB.</string> - <string name="main_activity_invalid_error">Esta Imagen BIOS es incorrecta, o ya ha sido importado.</string> - <string name="main_activity_show_version_title">Version</string> - <string name="main_activity_copy">Copiar</string> - <string name="settings_gpu_thread">Renderizado de GPU con Hilos</string> - <string name="settings_summary_gpu_thread">Usa un segundo hilo para dibujar los gráficos. Actualmente solo está disponible para el renderizador por software, pero puede dar un aumento significante de velocidad, y es seguro de usar.</string> - <string name="settings_gpu_threaded_presentation">Presentación de GPU con subprocesos</string> - <string name="settings_summary_gpu_threaded_presentation">Presenta fotogramas en un hilo de fondo cuando el Avance Rápido o VSync está desactivado. Esto puede mejorar considerablemente el rendimiento en el renderizador Vulkan.</string> - <string name="settings_language">Idioma (reiniciar para aplicar)</string> - <string name="touchscreen_controller_stop_editing">Dejar de editar</string> - <string name="touchscreen_controller_reset_layout">Reiniciar Modelo</string> - <string name="emulation_activity_touchscreen_controller_not_active">El control de pantalla táctil no está activo.</string> - <string name="settings_theme">Tema</string> - <string name="settings_controller_mapping_summary">Permite asignar botones/ejes del control externo al controlador emulado.</string> - <string name="settings_controller_mapping">Mapeado de Control</string> - <string name="controller_binding_dialog_message">Presiona un botón del control para seleccionar una nueva asignación.\n\nAsignación Actual: %s</string> - <string name="controller_binding_dialog_no_binding"><![CDATA[<Sin Asignar>]]></string> - <string name="controller_binding_dialog_cancel">Cancelar</string> - <string name="controller_binding_dialog_clear">Limpiar</string> - <string name="controller_mapping_activity_title">Mapeado de Control</string> - <string name="controller_mapping_activity_no_profiles_found">No se encontraron perfiles.</string> - <string name="controller_mapping_activity_select_input_profile">Seleccionar perfil de control</string> - <string name="controller_mapping_activity_failed_to_load_profile">Fallo al cargar el perfil \'%s\'</string> - <string name="controller_mapping_activity_input_profile_name">Ingrese Nombre de Perfil:</string> - <string name="controller_mapping_activity_save">Guardar</string> - <string name="controller_mapping_activity_name_must_be_provided">Debe proporcionarse un nombre.</string> - <string name="controller_mapping_activity_failed_to_save_input_profile">Fallo al guardar perfil de control.</string> - <string name="controller_mapping_activity_input_profile_saved">Perfil de control \'%s\' guardado.</string> - <string name="controller_mapping_activity_cancel">Cancelar</string> - <string name="settings_use_analog_sticks_for_dpad">Usar las palancas analógicas como cruceta en el modo digital</string> - <string name="settings_summary_enable_analog_mode_on_reset">Fuerza el control al modo analógico cuando la consola se reinicia/enciende</string> - <string name="settings_summary_use_analog_sticks_for_dpad">Te permite usar las palancas analógicas para controlar la cruceta y los botones en modo digital.</string> - <string name="settings_disable_all_enhancements">Desactiva todas las mejoras</string> - <string name="settings_summary_disable_all_enhancements">Temporalmente desactiva todas las mejoras, el cual puede ser útil al depurar problemas.</string> - <string name="settings_downsample_mode">Submuestreo</string> - <string name="activity_game_properties">Propiedades del Juego</string> - <string name="game_properties_preference_use_global_setting">Usar configuración global</string> - <string name="settings_input_profile">Perfil de Control</string> - <string name="game_properties_tab_summary">Resumen</string> - <string name="game_properties_tab_game_settings">Configuraciones de juego</string> - <string name="game_properties_tab_controller_settings">Configuraciones de Control</string> - <string name="settings_audio_resampling">Remuestreo de Audio</string> - <string name="settings_summary_audio_resampling">Cuando se ejecuta por encima del 100% de velocidad, vuelve a muestrear el audio de la velocidad objetivo en lugar de eliminar fotogramas. Produce un audio de avance/desaceleración mucho más agradable a un pequeño costo del rendimiento.</string> - <string name="settings_general_sync_to_host_refresh_rate">Sincronizar con la velocidad de actualización del anfitrión</string> - <string name="settings_summary_general_sync_to_host_refresh_rate">Ajusta la velocidad de emulación para que la frecuencia de actualización de la consola coincida con la frecuencia de actualización del anfitrión cuando las configuraciones de VSync y Remuestreo de audio estén habilitados. Esto da como resultado las animaciones más suaves posibles, a costa de aumentar potencialmente la velocidad de emulación en menos del 1%.</string> - <string name="settings_sustained_performance_mode">Modo de Rendimiento Sostenido</string> - <string name="settings_summary_sustained_performance_mode">Habilita el Modo de Rendimiento Sostenido por Android. Puede resultar en velocidades de fotogramas más consistentes para sesiones largas en algunos dispositivos.</string> - <string name="title_activity_game_directories">Editar Directorio de juegos</string> - <string name="settings_game_directories">Directorio de juegos</string> - <string name="settings_summary_game_directories">Cambia la lista de directorio que se utiliza para buscar juegos.</string> - <string name="game_directories_scanning_subdirectories">Escaneo de subdirectorios.</string> - <string name="game_directories_not_scanning_subdirectories">No escanear subdirectorios.</string> - <string name="settings_display_all_frames">Optimizar Frame Pacing</string> - <string name="settings_summary_display_all_frames">Habilitar esta opción asegurará que cada fotograma que la consola renderice se muestre en la pantalla, para un ritmo de fotograma óptimo. Si tiene dificultades para mantener la velocidad máxima o problemas de audio, intente desactivar esta opción.</string> - <string name="menu_edit_game_directories_add_directory">Agregar directorio</string> - <string name="menu_edit_game_directories_add_path">Agregar ruta</string> - <string name="edit_game_directories_add_path">Agregar ruta</string> - <string name="edit_game_directories_add_path_summary">Ingrese la ruta completa al directorio con juegos. \n\nEsto lo puedes obtener de un administrador de archivos.\n\nEjemplo: /storage/emulated/0/games</string> - <string name="save_state_info_slot_is_empty">Ranura vacia</string> - <string name="save_state_info_game_save_n">Juego guardado en %d</string> - <string name="save_state_info_global_save_n">Guardado global %d</string> - <string name="save_state_info_quick_save">Guardado rápido</string> - <string name="settings_osd_show_show_resolution">Mostrar resolución</string> - <string name="settings_summary_osd_show_resolution">Muestra la resolución a la que se está corriendo el juego en la esquina superior derecha de la pantalla.</string> - <string name="settings_summary_display_stretch">Estira la pantalla activa para llenar la pantalla.</string> - <string name="settings_display_stretch">Estirar para rellenar</string> - <string name="settings_category_global">Configuración Global</string> - <string name="settings_category_display">Mostrar configuración en Pantalla</string> - <string name="settings_category_audio">Configuración de Audio</string> - <string name="settings_category_console">Configuración de consola</string> - <string name="settings_category_cpu">Configuración de CPU</string> - <string name="settings_category_gpu">Configuración de GPU</string> - <string name="settings_category_logging">Configuración de registro</string> - <string name="dialog_done">Terminado</string> - <string name="dialog_touchscreen_controller_type">Tipo de control de pantalla táctil</string> - <string name="dialog_touchscreen_controller_opacity">Opacidad del control de pantalla táctil</string> - <string name="dialog_touchscreen_controller_buttons">Botones del control de pantalla táctil</string> - <string name="dialog_touchscreen_controller_settings">Configuración del control de pantalla táctil</string> - <string name="settings_summary_console_tty_output">Registra mensajes de depuración de los juegos.</string> - <string name="action_show_game_list">Vista por lista</string> - <string name="action_show_game_grid">Vista por grilla</string> - <string name="settings_touch_gliding">Toque deslizamiento</string> - <string name="settings_summary_touch_gliding">Le permite presionar varios botones frontales del control arrastrando el dedo por la pantalla. </string> - <string name="menu_game_list_entry_game_properties">Propiedades del Juego</string> - <string name="emulation_activity_change_disc_select_new_file">Seleccionar nuevo archivo...</string> - <string name="settings_achievements_enable">Habilitar RetroAchievements</string> - <string name="settings_summary_achievements_enable">Cuando está habilitado y logueado, DuckStation buscará logros al iniciarse.</string> - <string name="settings_achievements_challenge_mode">Habilitar modo Hardcore</string> - <string name="settings_summary_achievements_challenge_mode">Modo de Desafío. Desactiva el estado de guardado, los trucos y las funciones de ralentización, pero recibes el doble de puntos de logros. No se puede alternar en el juego.</string> - <string name="settings_achievements_rich_presence">Habilitar Rich Presence</string> - <string name="settings_summary_achievements_rich_presence">La información de Rich presence se recopilará y enviará información al servidor donde sea compatible</string> - <string name="settings_achievements_username">Nombre de Usuario</string> - <string name="settings_achievements_token_generation_time">Tiempo de generación del Token</string> - <string name="settings_achievements_login">Inicio de sesión</string> - <string name="settings_summary_achievements_login">Inicia sesión en tu cuenta para registrar logros.</string> - <string name="settings_achievements_register">Registro</string> - <string name="settings_summary_achievements_register">Abre un enlace para crear una nueva cuenta.</string> - <string name="settings_achievements_logout">Cerrar sesión</string> - <string name="settings_summary_achievements_logout">Cierra sesión en su cuenta. No se registrarán nuevos logros.</string> - <string name="settings_achievements_view_profile">Ver Perfil</string> - <string name="settings_summary_achievements_view_profile">Abre un enlace a tu perfil.</string> - <string name="settings_achievements_test_mode">Habilitar el modo Test</string> - <string name="settings_summary_achievements_test_mode">Cuando está habilitado, DuckStation asumirá que todos los logros están bloqueados y no enviará notificaciones de desbloqueo al servidor.</string> - <string name="settings_achievements_use_first_disc_from_playlist">Usar el primer disco de la Lista</string> - <string name="settings_summary_achievements_use_first_disc_from_playlist">Cuando está habilitado, el primer disco de una lista se utilizará para los logros, independientemente del disco que esté activo.</string> - <string name="achievement_settings_login_title">Inicio de sesión en RetroAchievements</string> - <string name="achievement_settings_login_help">Ingrese el nombre de usuario y password de retroachievements.org. Su contraseña no será guardada en DuckStation, en su lugar se generará y se utilizará un token de acceso.</string> - <string name="achievement_settings_login_username_hint">Usuario</string> - <string name="achievement_settings_login_password_hint">Contraseña</string> - <string name="achievement_settings_login_login_button">Loguearse</string> - <string name="achievement_settings_login_cancel_button">Cancelar</string> - <string name="achievement_settings_login_failed">Fallo al iniciar sesión. Chequear que el nombre de usuario y contraseña estén bien escritos e intentelo nuevamente.</string> - <string name="achievement_points_format_string">%d puntos</string> - <string name="achievement_summary_format_string">Has desbloqueado %1$d de %2$d logros y has obtenido %3$d de %4$d puntos posibles.</string> - <string name="achievement_title_challenge_mode_format_string">%s (Modo Hardcore)</string> - <string name="settings_achievements_disclaimer">DuckStation utiliza RetroAchievements (retroachievements.org) como base de datos de logros y para realizar un seguimiento del progreso.</string> - <string name="settings_achievements_confirm_logout_title">Confirmar cierre de sesión</string> - <string name="settings_achievements_confirm_logout_message">Después de cerrar la sesión, no se desbloquearán más logros hasta que vuelva a iniciar sesión. Los logros desbloqueados no se perderán.</string> - <string name="controller_binding_device_for_vibration">Dispositivo para vibración</string> - <string name="controller_settings_tab_settings">Configuración</string> - <string name="controller_settings_tab_hotkeys">Hotkeys</string> - <string name="controller_settings_category_button_bindings">Asignación de botones</string> - <string name="controller_settings_category_axis_bindings">Asignación de ejes</string> - <string name="controller_settings_category_settings">Configuración</string> - <string name="controller_settings_category_touchscreen_controller">Control de pantalla táctil</string> - <string name="controller_settings_category_ports">Puertos</string> - <string name="controller_settings_main_port_format">Puerto %d</string> - <string name="controller_settings_sub_port_format">Puerto %1$d%2$c</string> - <string name="action_switch_view">Cambiar vista</string> - <string name="title_activity_memory_card_editor">Editor de Tarjeta de Memoria</string> - <string name="action_memory_card_editor">Editar Tarjeta de Memoria</string> - <string name="action_memory_card_editor_import_card">Importar Tarjeta</string> - <string name="action_memory_card_editor_open_card">Abrir Tarjeta</string> - <string name="action_memory_card_editor_new_card">Nueva Tarjeta</string> - <string name="action_memory_card_editor_format_card">Formatear Tarjeta</string> - <string name="action_memory_card_editor_delete_card">Borrar Tarjeta</string> - <string name="memory_card_editor_no_cards_found">No se encontraron tarjetas de memoria.</string> - <string name="memory_card_editor_card_already_open">Esta tarjeta ya está abierta.</string> - <string name="memory_card_editor_failed_to_open_card">Error al abrir o leer la tarjeta de memoria.</string> - <string name="memory_card_editor_must_have_at_least_two_cards_to_copy">Debe tener al menos dos tarjetas abiertas para copiar.</string> - <string name="memory_card_editor_copy_save_to">Copiar %s a...</string> - <string name="memory_card_editor_select_card">Seleccionar tarjeta</string> - <string name="memory_card_editor_error">Error</string> - <string name="memory_card_editor_copy_insufficient_blocks">Este archivo requiere %1$d bloques, pero solo tiene %2$d bloques libres.</string> - <string name="memory_card_editor_copy_already_exists">El archivo \'%s\' ya existe en la tarjeta de destino.</string> - <string name="memory_card_editor_copy_read_failed">Error al leer el archivo \'%s\' de la tarjeta seleccionada.</string> - <string name="memory_card_editor_copy_write_failed">Error al escribir el archivo \'%s\' en la tarjeta de destino.</string> - <string name="memory_card_editor_copy_success">Copiado \'%1$s\' a \'%2$s\'.</string> - <string name="memory_card_editor_delete_confirm">¿Estás seguro de borrar el estado guardado \'%s\'?</string> - <string name="memory_card_editor_delete_success">Borrado estado guardado \'%s\'.</string> - <string name="memory_card_editor_delete_failed">Error al eliminar el archivo \'%s\'.</string> - <string name="memory_card_editor_no_card_selected">No se ha seleccionado una tarjeta.</string> - <string name="memory_card_editor_import_failed">Error al importar la tarjeta de memoria. Puede que no sea un formato compatible.</string> - <string name="memory_card_editor_delete_card_confirm_message">La tarjeta de memoria \'%s\' se eliminará y no se podra recuperar. ¿Estás seguro de eliminarlo?</string> - <string name="memory_card_editor_delete_card_failed">Fallo al borrar \'%s\'.</string> - <string name="memory_card_editor_delete_card_success">Tarjeta borrada \'%s\'.</string> - <string name="memory_card_editor_format_card_confirm_message">La tarjeta de memoria \'%s\' será formateada borrando todos los estados guardados. ¿Estás seguro de formatearlo?</string> - <string name="memory_card_editor_format_card_failed">Error al formatear \'%s\'.</string> - <string name="memory_card_editor_format_card_success">Tarjeta formateada \'%s\'.</string> - <string name="memory_card_editor_import_card_confirm_message">La importación de \'%1$s\' eliminará todos los archivos guardados en \'%2$s\'. ¿Deseas continuar?</string> - <string name="memory_card_editor_import_card_read_failed">Error al leer \'%s\'.</string> - <string name="memory_card_editor_import_card_failed">Error al importar la tarjeta \'%s\'. Puede que no sea un formato compatible.</string> - <string name="memory_card_editor_import_card_success">Tarjeta importada \'%s\'.</string> - <string name="menu_game_list_entry_choose_cover_image">Selecciona una imagen de tapa</string> - <string name="controller_settings_vibration_unsupported">El dispositivo seleccionado no soporta vibración.</string> - <string name="controller_settings_automatic_mapping">Realizar mapeo automático</string> - <string name="controller_settings_summary_automatic_mapping">Intenta vincular automáticamente todos los botones/ejes a un control conectado.</string> - <string name="controller_settings_clear_controller_bindings">Limpiar asignaciones</string> - <string name="controller_settings_summary_clear_controller_bindings">Desvincula todos los botones/ejes de este control.</string> - <string name="controller_settings_clear_controller_bindings_confirm">¿Está seguro de que desea borrar todas las asignaciones? Esto no se puede revertir.</string> - <string name="controller_settings_clear_controller_bindings_done">Todas las asignaciones fueron borradas para el control %d.</string> - <string name="controller_auto_mapping_no_devices">No se encontraron dispositivos adecuados. La asignación automática solo admite dispositivos de mando, pero aún puede vincular otros tipos de dispositivos manualmente.</string> - <string name="controller_auto_mapping_select_device">Seleccione el dispositivo</string> - <string name="controller_auto_mapping_results">Resultados de asignación automática</string> - <string name="main_activity_empty_game_list_title">No se encontraron juegos. Agregue un directorio con juegos o seleccione manualmente un archivo.</string> - <string name="main_activity_empty_game_list_supported_formats">Formatos admitidos: %s</string> - <string name="main_activity_empty_game_list_add_directory">Añadir directorio de juegos</string> - <string name="main_activity_empty_game_list_start_file">Iniciar archivo</string> - <string name="update_notes_title">Notas de actualización</string> - <string name="update_notes_message_version_controller_update">Esta actualización de DuckStation incluye soporte para múltiples controles con vibración y dispositivos vinculantes como teclados/botones de volumen.\n\nDebe volver a re-asignar sus controles, de lo contrario dejarán de funcionar. ¿Quieres hacer esto ahora?</string> - <string name="settings_osd_show_show_inputs">Mostrar entrada del control</string> - <string name="settings_summary_osd_show_inputs">Muestra el estado actual del control del sistema en la esquina inferior izquierda de la pantalla.</string> - <string name="touchscreen_controller_edit_menu">Editar menu</string> - <string name="settings_achievements_category">Cuenta</string> - <string name="settings_achievements_global_settings">Configuración global</string> - <string name="settings_category_achievements">Configuración de logros</string> - <string name="settings_multitap_mode">Modo Multitap</string> - <string name="emulation_menu_load_state">Cargar partida</string> - <string name="emulation_menu_save_state">Guardar partida</string> - <string name="emulation_menu_toggle_fast_forward">Activar avance rápido</string> - <string name="emulation_menu_achievements">Logros</string> - <string name="emulation_menu_patch_codes">Códigos de parche</string> - <string name="emulation_menu_change_disc">Cambiar disco</string> - <string name="emulation_menu_touchscreen_controller_settings">Configuración del control de pantalla táctil</string> - <string name="emulation_menu_toggle_analog_mode">Activar modo de control analógico</string> - <string name="emulation_menu_reset_console">Reiniciar consola</string> - <string name="emulation_menu_exit_game">Salir del juego</string> -</resources> diff --git a/android/app/src/main/res/values-it/arrays.xml b/android/app/src/main/res/values-it/arrays.xml deleted file mode 100644 index 1fef79048..000000000 --- a/android/app/src/main/res/values-it/arrays.xml +++ /dev/null @@ -1,206 +0,0 @@ -<resources> - <string-array name="settings_console_region_entries"> - <item>Auto-Rileva</item> - <item>NTSC-J (Giappone)</item> - <item>NTSC-U (US, Canada)</item> - <item>PAL (Europa, Australia)</item> - </string-array> - <string-array name="settings_cpu_execution_mode_entries"> - <item>Interprete (Il più lento)</item> - <item>Cached Interpreter (Più veloce)</item> - <item>Recompiler (Il più veloce)</item> - </string-array> - <string-array name="settings_cpu_fastmem_mode_entries"> - <item>Disabilitato (Il più lento)</item> - <item>MMap (Hardware, il più veloce, Solo 64-Bit)</item> - <item>LUT (Più veloce)</item> - </string-array> - <string-array name="gpu_renderer_entries"> - <item>Hardware (OpenGL)</item> - <item>Hardware (Vulkan)</item> - <item>Software</item> - </string-array> - <string-array name="settings_gpu_resolution_scale_entries"> - <item>1x</item> - <item>2x</item> - <item>3x (per 720p)</item> - <item>4x</item> - <item>5x (per 1080p)</item> - <item>6x (per 1440p)</item> - <item>7x</item> - <item>8x</item> - <item>9x (per 4K)</item> - <item>10x</item> - <item>11x</item> - <item>12x</item> - <item>13x</item> - <item>14x</item> - <item>15x</item> - <item>16x</item> - </string-array> - <string-array name="settings_display_crop_mode_entries"> - <item>None</item> - <item>Solo area di Overscan</item> - <item>Tutti i bordi</item> - </string-array> - <string-array name="settings_display_aspect_ratio_names"> - <item>Auto (Game Native)</item> - <item>Auto (Match Display)</item> - <item>Custom</item> - <item>4:3</item> - <item>16:9</item> - <item>19:9</item> - <item>20:9</item> - <item>PAR 1:1</item> - </string-array> - <string-array name="settings_gpu_texture_filter_names"> - <item>Nearest-Neighbor</item> - <item>Bilineare</item> - <item>Bilineare (No Blending Bordi)</item> - <item>JINC2</item> - <item>JINC2 (No Blending Bordi)</item> - <item>xBR</item> - <item>xBR (No Blending Bordi)</item> - </string-array> - <string-array name="settings_controller_type_entries"> - <item>None</item> - <item>Controller Digitale (Gamepad)</item> - <item>Controller Analogico (DualShock)</item> - <item>Analog Joystick</item> - <item>NeGcon</item> - <item>GunCon</item> - </string-array> - <string-array name="settings_memory_card_mode_entries"> - <item>No Memory Card</item> - <item>Condivisa fra tutti i giochi</item> - <item>MC separata per ogni gioco (Codice Gioco)</item> - <item>MC separata per ogni gioco (Titolo Gioco)</item> - </string-array> - <string-array name="settings_cdrom_read_speedup_entries"> - <item>Nessuna Velocità Doppia)</item> - <item>2x (Velocità Quadrupla</item> - <item>3x (Velocità 6x)</item> - <item>4x (Velocità 8x)</item> - <item>5x (Velocità 10x)</item> - <item>6x (Velocità 12x)</item> - <item>7x (Velocità 14x)</item> - <item>8x (Velocità 16x)</item> - <item>9x (Velocità 18x)</item> - <item>10x (Velocità 20x)</item> - </string-array> - <string-array name="settings_touchscreen_controller_view_entries"> - <item>Nessuno</item> - <item>Pad Digitale</item> - <item>Pad Analogico Singolo</item> - <item>Pad Analogico Doppio</item> - <item>Lightgun</item> - </string-array> - <string-array name="settings_audio_backend_entries"> - <item>Null (No Output)</item> - <item>Cubeb</item> - <item>OpenSL ES (Raccomandato)</item> - </string-array> - <string-array name="settings_audio_buffer_size_entries"> - <item>1024 Fotogrammi (23.22ms)</item> - <item>2048 Fotogrammi (46.44ms, Raccomandato)</item> - <item>3072 Fotogrammi (69.66ms)</item> - <item>4096 Fotogrammi (92.88ms)</item> - </string-array> - <string-array name="settings_log_level_entries"> - <item>None</item> - <item>Error</item> - <item>Warning</item> - <item>Performance Warnings</item> - <item>Information</item> - <item>Verbose</item> - <item>Developer</item> - <item>Profile</item> - <item>Debug</item> - <item>Trace</item> - </string-array> - <string-array name="settings_tabs"> - <item>Generali</item> - <item>Display</item> - <item>Audio</item> - <item>Miglioramenti</item> - <item>Achievements</item> - <item>Avanzate</item> - </string-array> - <string-array name="settings_gpu_msaa_entries"> - <item>Disabilitato</item> - <item>2x MSAA</item> - <item>4x MSAA</item> - <item>8x MSAA</item> - <item>2x SSAA</item> - <item>4x SSAA</item> - <item>8x SSAA</item> - </string-array> - <string-array name="settings_advanced_display_fps_limit_entries"> - <item>Senza Limite (Mostra tutti i fotogrammi)</item> - <item>10 FPS</item> - <item>15 FPS</item> - <item>30 FPS</item> - <item>45 FPS</item> - <item>60 FPS</item> - <item>75 FPS</item> - <item>90 FPS</item> - </string-array> - <string-array name="settings_emulation_speed_entries"> - <item>Senza Limite</item> - <item>10% [6 FPS (NTSC) / 5 FPS (PAL)]</item> - <item>20% [12 FPS (NTSC) / 10 FPS (PAL)]</item> - <item>30% [18 FPS (NTSC) / 15 FPS (PAL)]</item> - <item>40% [24 FPS (NTSC) / 20 FPS (PAL)]</item> - <item>50% [30 FPS (NTSC) / 25 FPS (PAL)]</item> - <item>60% [36 FPS (NTSC) / 30 FPS (PAL)]</item> - <item>70% [42 FPS (NTSC) / 35 FPS (PAL)]</item> - <item>80% [48 FPS (NTSC) / 40 FPS (PAL)]</item> - <item>90% [54 FPS (NTSC) / 45 FPS (PAL)]</item> - <item>100% [60 FPS (NTSC) / 50 FPS (PAL), Default]</item> - <item>125% [75 FPS (NTSC) / 62 FPS (PAL)]</item> - <item>150% [90 FPS (NTSC) / 75 FPS (PAL)]</item> - <item>175% [105 FPS (NTSC) / 87 FPS (PAL)]</item> - <item>200% [120 FPS (NTSC) / 100 FPS (PAL)]</item> - <item>250% [150 FPS (NTSC) / 125 FPS (PAL)]</item> - <item>300% [180 FPS (NTSC) / 150 FPS (PAL)]</item> - <item>350% [210 FPS (NTSC) / 175 FPS (PAL)]</item> - <item>400% [240 FPS (NTSC) / 200 FPS (PAL)]</item> - <item>450% [270 FPS (NTSC) / 225 FPS (PAL)]</item> - <item>500% [300 FPS (NTSC) / 250 FPS (PAL)]</item> - <item>600% [360 FPS (NTSC) / 300 FPS (PAL)]</item> - <item>700% [420 FPS (NTSC) / 350 FPS (PAL)]</item> - <item>800% [480 FPS (NTSC) / 400 FPS (PAL)]</item> - <item>900% [540 FPS (NTSC) / 450 FPS (PAL)]</item> - <item>1000% [600 FPS (NTSC) / 500 FPS (PAL)]</item> - </string-array> - <string-array name="settings_advanced_cpu_overclock_entries"> - <item>25% (8MHz)</item> - <item>50% (16MHz)</item> - <item>75% (24MHz)</item> - <item>100% (33MHz, Default)</item> - <item>125% (41MHz)</item> - <item>150% (49MHz)</item> - <item>175% (57MHz)</item> - <item>200% (66MHz)</item> - <item>225% (74MHz)</item> - <item>250% (82MHz)</item> - <item>275% (90MHz)</item> - <item>300% (99MHz)</item> - <item>350% (115MHz)</item> - <item>400% (132MHz)</item> - <item>450% (148MHz)</item> - <item>500% (165MHz)</item> - <item>500% (165MHz)</item> - <item>600% (198MHz)</item> - <item>700% (231MHz)</item> - <item>800% (264MHz)</item> - <item>900% (297MHz)</item> - <item>1000% (330MHz)</item> - </string-array> - <string-array name="settings_emulation_screen_orientation_entries"> - <item>Usa Impostazione Dispositivo</item> - <item>Verticale</item> - <item>Orizzontale</item> - <item>Sensor Based</item> - </string-array> -</resources> diff --git a/android/app/src/main/res/values-it/strings.xml b/android/app/src/main/res/values-it/strings.xml deleted file mode 100644 index edcd29639..000000000 --- a/android/app/src/main/res/values-it/strings.xml +++ /dev/null @@ -1,16 +0,0 @@ -<resources> - <string name="app_name">DuckStation</string> - <string name="action_settings">Impostazioni</string> - <string name="title_activity_settings">Impostazioni</string> - <string name="settings_console_region">Regione Console</string> - <string name="settings_console_tty_output">Abilita TTY Output</string> - <string name="settings_console_fast_boot">Avvio Rapido</string> - <string name="settings_osd_show_messages">Mostra Messaggi</string> - <string name="settings_osd_show_speed">Mostra Velocità Emulazione</string> - <string name="settings_osd_show_show_fps">Mostra la frequenza dei fotogrammi del gioco</string> - <string name="settings_osd_show_show_vps">Mostra FPS di visualizzazione</string> - <string name="settings_cpu_execution_mode">Modalità di Esecuzione CPU</string> - <string name="settings_gpu_renderer">GPU Renderer</string> - <string name="settings_gpu_resolution_scale">Scala di Risoluzione</string> - <string name="title_activity_emulation">EmulationActivity</string> -</resources> diff --git a/android/app/src/main/res/values-night/colors.xml b/android/app/src/main/res/values-night/colors.xml deleted file mode 100644 index 6801baa94..000000000 --- a/android/app/src/main/res/values-night/colors.xml +++ /dev/null @@ -1,12 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<resources> - <color name="colorPrimary">#000000</color> - <color name="colorPrimaryDark">#000000</color> - <color name="colorAccent">#03A9F4</color> - <color name="colorNavigation">#000000</color> - - <color name="black_overlay">#66000000</color> - <color name="fab_background">#222222</color> - - <color name="emulationActivityPauseBackground">#cc000000</color> -</resources> diff --git a/android/app/src/main/res/values-nl/arrays.xml b/android/app/src/main/res/values-nl/arrays.xml deleted file mode 100644 index 4f0cdfedb..000000000 --- a/android/app/src/main/res/values-nl/arrays.xml +++ /dev/null @@ -1,206 +0,0 @@ -<resources> - <string-array name="settings_console_region_entries"> - <item>Automatisch Detecteren</item> - <item>NTSC-J (Japan)</item> - <item>NTSC-U (VS)</item> - <item>PAL (Europa, Australië)</item> - </string-array> - <string-array name="settings_cpu_execution_mode_entries"> - <item>Interpreter (Langzaamst)</item> - <item>Cached Interpreter (Sneller)</item> - <item>Recompiler (Snelst)</item> - </string-array> - <string-array name="settings_cpu_fastmem_mode_entries"> - <item>Uitgeschakeld (Langzaamst)</item> - <item>MMap (Hardware, Snelst, Alleen 64-Bit)</item> - <item>LUT (Sneller)</item> - </string-array> - <string-array name="gpu_renderer_entries"> - <item>Hardware (OpenGL)</item> - <item>Hardware (Vulkan)</item> - <item>Software</item> - </string-array> - <string-array name="settings_gpu_resolution_scale_entries"> - <item>1x</item> - <item>2x</item> - <item>3x (voor 720p)</item> - <item>4x</item> - <item>5x (voor 1080p)</item> - <item>6x (voor 1440p)</item> - <item>7x</item> - <item>8x</item> - <item>9x (voor 4K)</item> - <item>10x</item> - <item>11x</item> - <item>12x</item> - <item>13x</item> - <item>14x</item> - <item>15x</item> - <item>16x</item> - </string-array> - <string-array name="settings_display_crop_mode_entries"> - <item>Geen</item> - <item>Alleen Overscangebied</item> - <item>Alle Randen</item> - </string-array> - <string-array name="settings_display_aspect_ratio_names"> - <item>Auto (Game Native)</item> - <item>Auto (Match Display)</item> - <item>Custom</item> - <item>4:3</item> - <item>16:9</item> - <item>19:9</item> - <item>20:9</item> - <item>PAR 1:1</item> - </string-array> - <string-array name="settings_gpu_texture_filter_names"> - <item>Dichtstbijzijde</item> - <item>Bilineair</item> - <item>Bilineair (Geen Edge Blending)</item> - <item>JINC2</item> - <item>JINC2 (Geen Edge Blending)</item> - <item>xBR</item> - <item>xBR (Geen Edge Blending)</item> - </string-array> - <string-array name="settings_controller_type_entries"> - <item>None</item> - <item>Digitale Controller (Gamepad)</item> - <item>Analoge Controller (DualShock)</item> - <item>Analog Joystick</item> - <item>NeGcon</item> - <item>GunCon</item> - </string-array> - <string-array name="settings_memory_card_mode_entries"> - <item>Geen Geheugenkaart</item> - <item>Gedeeld Tussen Alle Spellen</item> - <item>Aparte Kaart Per Spel (Spelcode)</item> - <item>Aparte Kaart Per Spel (Speltitel)</item> - </string-array> - <string-array name="settings_cdrom_read_speedup_entries"> - <item>Geen (Dubbele Snelheid)</item> - <item>2x (Vierdubbele Snelheid)</item> - <item>3x (6x Snelheid)</item> - <item>4x (8x Snelheid)</item> - <item>5x (10x Snelheid)</item> - <item>6x (12x Snelheid)</item> - <item>7x (14x Snelheid)</item> - <item>8x (16x Snelheid)</item> - <item>9x (18x Snelheid)</item> - <item>10x (20x Snelheid)</item> - </string-array> - <string-array name="settings_touchscreen_controller_view_entries"> - <item>Geen</item> - <item>Digitale Pad</item> - <item>Enekele Analoge Pad</item> - <item>Dubbele Analoge Pad</item> - <item>Lightgun</item> - </string-array> - <string-array name="settings_audio_backend_entries"> - <item>Null (Geen Output)</item> - <item>Cubeb</item> - <item>OpenSL ES (Aanbevolen)</item> - </string-array> - <string-array name="settings_audio_buffer_size_entries"> - <item>1024 Frames (23.22ms)</item> - <item>2048 Frames (46.44ms, Recommended)</item> - <item>3072 Frames (69.66ms)</item> - <item>4096 Frames (92.88ms)</item> - </string-array> - <string-array name="settings_log_level_entries"> - <item>Geen</item> - <item>Fout</item> - <item>Waarschuwing</item> - <item>Uitgebreid</item> - <item>Prestatie Waarschuwingen</item> - <item>Informatie</item> - <item>Ontwikkelaar</item> - <item>Profiel</item> - <item>Debug</item> - <item>Trace</item> - </string-array> - <string-array name="settings_tabs"> - <item>Algemeen</item> - <item>Weergave</item> - <item>Audio</item> - <item>Verbeteringen</item> - <item>Achievements</item> - <item>Geavanceerd</item> - </string-array> - <string-array name="settings_gpu_msaa_entries"> - <item>Uitgeschakeld</item> - <item>2x MSAA</item> - <item>4x MSAA</item> - <item>8x MSAA</item> - <item>2x SSAA</item> - <item>4x SSAA</item> - <item>8x SSAA</item> - </string-array> - <string-array name="settings_advanced_display_fps_limit_entries"> - <item>Onbegrensd (Alle Frames Weergeven)</item> - <item>10 FPS</item> - <item>15 FPS</item> - <item>30 FPS</item> - <item>45 FPS</item> - <item>60 FPS</item> - <item>75 FPS</item> - <item>90 FPS</item> - </string-array> - <string-array name="settings_emulation_speed_entries"> - <item>Onbegrensd</item> - <item>10% [6 FPS (NTSC) / 5 FPS (PAL)]</item> - <item>20% [12 FPS (NTSC) / 10 FPS (PAL)]</item> - <item>30% [18 FPS (NTSC) / 15 FPS (PAL)]</item> - <item>40% [24 FPS (NTSC) / 20 FPS (PAL)]</item> - <item>50% [30 FPS (NTSC) / 25 FPS (PAL)]</item> - <item>60% [36 FPS (NTSC) / 30 FPS (PAL)]</item> - <item>70% [42 FPS (NTSC) / 35 FPS (PAL)]</item> - <item>80% [48 FPS (NTSC) / 40 FPS (PAL)]</item> - <item>90% [54 FPS (NTSC) / 45 FPS (PAL)]</item> - <item>100% [60 FPS (NTSC) / 50 FPS (PAL), Default]</item> - <item>125% [75 FPS (NTSC) / 62 FPS (PAL)]</item> - <item>150% [90 FPS (NTSC) / 75 FPS (PAL)]</item> - <item>175% [105 FPS (NTSC) / 87 FPS (PAL)]</item> - <item>200% [120 FPS (NTSC) / 100 FPS (PAL)]</item> - <item>250% [150 FPS (NTSC) / 125 FPS (PAL)]</item> - <item>300% [180 FPS (NTSC) / 150 FPS (PAL)]</item> - <item>350% [210 FPS (NTSC) / 175 FPS (PAL)]</item> - <item>400% [240 FPS (NTSC) / 200 FPS (PAL)]</item> - <item>450% [270 FPS (NTSC) / 225 FPS (PAL)]</item> - <item>500% [300 FPS (NTSC) / 250 FPS (PAL)]</item> - <item>600% [360 FPS (NTSC) / 300 FPS (PAL)]</item> - <item>700% [420 FPS (NTSC) / 350 FPS (PAL)]</item> - <item>800% [480 FPS (NTSC) / 400 FPS (PAL)]</item> - <item>900% [540 FPS (NTSC) / 450 FPS (PAL)]</item> - <item>1000% [600 FPS (NTSC) / 500 FPS (PAL)]</item> - </string-array> - <string-array name="settings_advanced_cpu_overclock_entries"> - <item>25% (8MHz)</item> - <item>50% (16MHz)</item> - <item>75% (24MHz)</item> - <item>100% (33MHz, Default)</item> - <item>125% (41MHz)</item> - <item>150% (49MHz)</item> - <item>175% (57MHz)</item> - <item>200% (66MHz)</item> - <item>225% (74MHz)</item> - <item>250% (82MHz)</item> - <item>275% (90MHz)</item> - <item>300% (99MHz)</item> - <item>350% (115MHz)</item> - <item>400% (132MHz)</item> - <item>450% (148MHz)</item> - <item>500% (165MHz)</item> - <item>500% (165MHz)</item> - <item>600% (198MHz)</item> - <item>700% (231MHz)</item> - <item>800% (264MHz)</item> - <item>900% (297MHz)</item> - <item>1000% (330MHz)</item> - </string-array> - <string-array name="settings_emulation_screen_orientation_entries"> - <item>Apparaatinstellingen Gebruiken</item> - <item>Portret</item> - <item>Landschap</item> - <item>Sensor Based</item> - </string-array> -</resources> \ No newline at end of file diff --git a/android/app/src/main/res/values-nl/strings.xml b/android/app/src/main/res/values-nl/strings.xml deleted file mode 100644 index 8c17c4277..000000000 --- a/android/app/src/main/res/values-nl/strings.xml +++ /dev/null @@ -1,152 +0,0 @@ -<resources> - <string name="app_name">DuckStation</string> - <string name="action_settings">Instellingen</string> - <string name="title_activity_settings">Instellingen</string> - <string name="settings_console_region">Console Gebied</string> - <string name="settings_console_tty_output">TTY Output Aanzetten</string> - <string name="settings_console_fast_boot">Snel Starten</string> - <string name="settings_osd_show_messages">Toon Berichten</string> - <string name="settings_osd_show_speed">Toon Emulatiesnelheid</string> - <string name="settings_osd_show_show_fps">Framesnelheid van games weergeven</string> - <string name="settings_osd_show_show_vps">Toon weergave FPS</string> - <string name="settings_cpu_execution_mode">CPU Executie Modus</string> - <string name="settings_gpu_renderer">GPU Renderer</string> - <string name="settings_gpu_resolution_scale">Resolutie Schaal</string> - <string name="title_activity_emulation">Emulatie Activiteit</string> - <string name="settings_emulation_speed">Emulatie Snelheid</string> - <string name="settings_fast_forward_speed">Doorspoelsnelheid</string> - <string name="settings_save_state_on_exit">Staat Opslaan Bij Afsluiten</string> - <string name="settings_emulation_screen_orientation">Emulatie Schermorientatie</string> - <string name="settings_load_patch_codes">Laad Patch Codes</string> - <string name="settings_summary_save_state_on_exit">Slaat automatisch de emulator staat op bij afsluiten. Je kan dan de volgende keer verder vanaf waar je gebleven was.</string> - <string name="settings_summary_load_patch_codes"><![CDATA[Laad patch codes van cheats/<game name>.cht in PCSXR formaat. Codes kunnen aan- en uitgeschakeld worden in-game.]]></string> - <string name="settings_apply_compatibility_settings">Pas Compatibiliteitsinstellingen Toe</string> - <string name="settings_summary_apply_compatibility_settings">Schakelt automatisch verbeteringen uit wanneer ze niet door spellen ondersteund worden.</string> - <string name="settings_summary_video_sync">Schakel deze optie in om DuckStation\'s verversingssnelheid te synchroniseren met je scherm. VSync is automatisch uitegeschakeld wanneer dit niet mogelijk is (bijvoorbeeld wanneer er niet op 100% snelheid gespeeld wordt).</string> - <string name="settings_video_sync">Video Sync</string> - <string name="settings_cpu_overclocking">CPU Overclocken</string> - <string name="settings_cdrom_region_check">CD-ROM Regio Check</string> - <string name="settings_summary_cdrom_region_check">Voorkomt dat discs uit incorrecte regio\'s geladen worden door de emulator. Over het algemeen veilig om uit te schakelen.</string> - <string name="settings_cdrom_preload_image_to_ram">CD-ROM Image Voorladen naar RAM</string> - <string name="settings_summary_preload_image_to_ram">Laadt de image van het spel in RAM. Handig voor netwerkpaden die instabiel kunnen worden tijdens het spelen van het spelen. Kan soms ook haperingen voorkomen wanneer spellen audio instellen.</string> - <string name="settings_pgxp_vertex_cache">PGXP Vertex Cache</string> - <string name="settings_summary_pgxp_vertex_cache">Gebruikt schermcoordinaten als terugval wanneer vertices niet door het geheugen getraceerd kunnen worden. Kan PGXP compatibiliteit verbeteren.</string> - <string name="settings_pgxp_cpu_mode">PGXP CPU Modus</string> - <string name="settings_summary_pgxp_cpu_mode">Probeert vertex manupulatie te traceren door de CPU. Sommige spellen vereisen deze optie om PGXP te gebruiken. Heel langzaam, en incompatibel met de recompiler.</string> - <string name="settings_cpu_recompiler_icache">CPU Recompiler ICache</string> - <string name="settings_summary_cpu_recompiler_icache">Bepaalt of de CPU\'s instructie cache gesimuleerd wordt in de recompiler. Verbetert precisie, maar kost een klein beetje prestatie. Als games te snel afspelen, probeer dan deze optie aan te zetten.</string> - <string name="settings_cpu_recompiler_fastmem">CPU Recompiler Fast Memory Access</string> - <string name="settings_summary_cpu_recompiler_fastmem">Maakt geheugentoegang van het gesimuleerde systeem meer efficient door page faults en backpatching te gebruiken. Schakel dit uit als het instabiel is op je systeem.</string> - <string name="settings_presented_frame_limit">Getoonde Frame Begrenzing</string> - <string name="settings_logging_level">Logging Niveau</string> - <string name="settings_log_to_file">Log Naar Bestand</string> - <string name="settings_summary_log_to_file">Schrijft de log naar duckstation.log in je gebruikersfolder. Gebruik dit alleen voor debuggen, want het kan vertraagt de emulatie.</string> - <string name="settings_log_to_logcat">Log Naar Logcat</string> - <string name="settings_summary_log_to_logcat">Schrijft logberichten naar de Android berichtenlog. Alleen nuttig wanneer gebruikt in combinatie met een computer met adb.</string> - <string name="settings_volume">Volume</string> - <string name="settings_summary_volume">Bedient het volume van de emulator.</string> - <string name="settings_mute_all_sound">Alles Dempen</string> - <string name="settings_summary_mute_all_sound">Voorkomt dat de emulator geluid produceert.</string> - <string name="settings_mute_cd_audio">CD Audio Dempen</string> - <string name="settings_summary_mute_cd_audio">Dempt zowel CD-DA en XA audio van de CD-ROM. Kan gebruikt worden om achtergrondmuziek uit te schakelen in sommige spellen.</string> - <string name="settings_audio_backend">Audio Backend</string> - <string name="settings_audio_buffer_size">Audio Buffer Grootte</string> - <string name="settings_summary_audio_buffer_size">Bepaald de vertraging tussen de audiogeneratie en de output van de speakers. Kleinere waardes kunnen vertraging verkleinen, maar variaties in emulatiesnelheid kunnen voor haperingen zorgen.</string> - <string name="settings_audio_sync">Audio Sync</string> - <string name="settings_summary_audio_sync">Beperkt de emulatiesnelheid gebaseerd op hoe snel de audio backend samples opvraagt. Dit helpt om ruis en kraken te voorkomen wanneer de emulator te snel gaat. Wordt automatisch uitgeschakeld wanneer er niet op 100% snelheid afgespeeld wordt.</string> - <string name="settings_controller_type">Controller Type</string> - <string name="settings_enable_analog_mode_on_reset">Analoge Modus Bij Reset.</string> - <string name="settings_touchscreen_controller_view">Touchscreen Controller Beeld</string> - <string name="settings_auto_hide_touchscreen_controller">Automatisch Touchscreen Controller Verbergen</string> - <string name="settings_summary_auto_hide_touchscreen_controller">Verbergt de touchscreen controller wanneer een externe controller gedetecteerd wordt.</string> - <string name="settings_vibrate_on_press">Vibreren Bij Indrukking</string> - <string name="settings_summary_vibrate_on_press">Schakelt een kleine trilling in wanneer een touchscreenknop ingedrukt wordt. Vereist dat \"Trillen bij aanraking\" ingeschakeld is op je apparaat.</string> - <string name="settings_enable_vibration">Vibratie Inschakelen</string> - <string name="settings_summary_enable_vibration">Vibreert de telefoon wanneer de spel dit voor een controller doet.</string> - <string name="settings_memory_card_1_type">Geheugenkaart 1 Type</string> - <string name="settings_memory_card_2_type">Geheugenkaart 2 Type</string> - <string name="settings_crop_mode">Knip Modus</string> - <string name="settings_aspect_ratio">Schermverhouding</string> - <string name="settings_linear_upscaling">Lineaire Opschaling</string> - <string name="settings_integer_upscaling">Integer Opschaling</string> - <string name="settings_summary_linear_upscaling">Interpoleert tussen pixels wanneer het beeld opgeschaald wordt naar het apparaat.</string> - <string name="settings_summary_integer_upscaling">Voegt randen toe aan het beeld zodat de verhouding tussen pixels op het apparaat, en pixels van de console een geheel getal is. Kan voor een scherper beeld zorgen in sommige 2D games.</string> - <string name="settings_summary_osd_show_messages">Toont berichten op het scherm wanneer gebeurtenissen als het opslaan/laden van een spelstatus, schermafbeeldingen maken, etc. gebeuren.</string> - <string name="settings_summary_osd_show_speed">Zet een doelsnelheid voor de emulatie. Het is niet gegarandeerd dat deze snelheid behaald wordt. Zo niet, dan gaat de emulator zo snel als hij kan.</string> - <string name="settings_summary_osd_show_fps">Toont de interne framesnelheid van het spel in de rechter bovenhoek van het scherm.</string> - <string name="settings_summary_osd_show_vps">Toont het aantal frames (of v-syncs) van het systeem in de rechter bovenhoek van het scherm.</string> - <string name="settings_cdrom_read_speedup">CD-ROM Leesversnelling</string> - <string name="settings_summary_cdrom_read_speedup">Versnelt de CD-ROM leessnelheid met de gegeven factor. Alleen van toepassing op dubbele-snelheids leesoperaties, en genegeerd wanneer audio afspeelt. Kan laadsnelheden vergroten bij sommige spellen, maar kan andere spellen niet goed laten werken.</string> - <string name="settings_summary_console_fast_boot">Slaat de BIOS intro over, en start direct het spel. Over het algemeen veilig om in te schakelen, maar sommige spellen werken niet goed meer.</string> - <string name="settings_msaa">Multisample Antialiasing</string> - <string name="settings_true_color">True Color Rendering (24-bit, schakelt dithering uit)</string> - <string name="settings_summary_true_color">Dit produceert mooiere gradienten, maar kan sommige kleuren een klein beetje verkleuren. Uitschakelen schakelt ook dithering uit. De meeste spellen zijn compatibel met deze optie.</string> - <string name="settings_scaled_dithering">Geschaalde Dithering (schaal dither patrron naar resolutie)</string> - <string name="settings_summary_scaled_dithering">Schaalt het dither patroon naar de resolutieschaal van de geëmuleerde GPU. Dit maakt het ditherpatroon minder duidelijk bij hogere resoluties. Over het algemeen veilig in te schakelen. Werkt alleen bij hardware renderers.</string> - <string name="settings_disable_interlacing">Interlacing Uitschakelen(forceer progressieve render/scan)</string> - <string name="settings_summary_disable_interlacing">Forceert het renderen en weergeven van frames naar de progressieve modus. Dit verwijdert het \"kam\" effect gezien in 480i spellen door ze in 480p te rendreren. Meestal veilig om in te schakelen.</string> - <string name="settings_texture_filtering">Texture Filtering</string> - <string name="settings_force_ntsc_timings">Forceer NTSC Timings (60hz-on-PAL)</string> - <string name="settings_summary_force_ntsc_timings">Gebruikt NTSC frame timings wanneer de console in PAL modus is. Dwingt PAL spellen om in 60hz af te spelen.</string> - <string name="settings_widescreen_hack">Widescreen Hack</string> - <string name="settings_summary_widescreen_hack">Schaalt vertex posities in schermruimte op naar een breedbeeldverhouding, wat in essentie het gezichtsveld van 4:3 naar 16:9 verhoogt in 3D spellen. Niet compatibel met alle spellen.</string> - <string name="settings_force_4_3_for_24bit">Forceer 4:3 Voor 24-Bit Schermen</string> - <string name="settings_summary_force_4_3_for_24bit">Gaat terug naar een 4:3 schermverhouding wanneer 24-bit inhoud weergeven wordt, meestal FMVs.</string> - <string name="settings_chroma_smoothing_24bit">Chroma Smoothing Voor 24-Bit Schermen</string> - <string name="settings_summary_chrome_smoothing_24bit">Vermindert de blokkerigheid bij kleurtransities van 24-bit inhoud, meestal FMVs. Alleen van toepassing bij hardware renderers.</string> - <string name="settings_pgxp_geometry_correction">PGXP Geometry Correction</string> - <string name="settings_summary_pgxp_geometry_correction"><![CDATA[Vermindert \"wiebelige\" polygons en \"vervormde\" textures die vaak in PS1 spellen voorkomen. >Werkt alleen met hardware renderers. Mogelijk niet compatibel met alle spellen.]]></string> - <string name="settings_pgxp_culling_correction">PGXP Culling Correction</string> - <string name="settings_summary_pgxp_culling_correction">Verhoogt de precisie van polygon culling, vermindert het aantal gaten in objecten. Vereist dat \"geometry correction\" ingeschakeld is.</string> - <string name="settings_pgxp_texture_correction">PGXP Texture Correction</string> - <string name="settings_summary_pgxp_texture_correction">Gebruikt perspectief-correcte interpolatie voor texture coordinaten en kleuren, maakt vervormde textures weer glad. Vereist dat \"geometry correction\" ingeschakeld is.</string> - <string name="settings_pgxp_preserve_projection_precision">PGXP Behoud Projectie Precisie</string> - <string name="settings_summary_pgxp_preserve_projection_precision">Schakelt extra precisie in voor PGXP. Kan beeld verbeteren in sommige spellen, maar kan andere minder goed laten werken.</string> - <string name="menu_main_resume_last_session">Hervat Vorige Sessie</string> - <string name="menu_main_start_file">Start Bestand</string> - <string name="menu_main_start_bios">Start BIOS</string> - <string name="menu_main_edit_game_directories">Bewerk Gamemappen</string> - <string name="menu_main_scan_for_new_games">Scan Naar Nieuwe Spellen</string> - <string name="menu_main_rescan_all_games">Alle Spellen Opnieuw Scannen</string> - <string name="menu_main_import_bios">Importeer BIOS</string> - <string name="menu_main_show_version">Toon Versie</string> - <string name="menu_main_github_repository">GitHub Repository</string> - <string name="menu_main_discord_server">Discord Server</string> - <string name="menu_game_list_entry_start_game">Start Spel</string> - <string name="menu_game_list_entry_resume_game">Hervat Spel</string> - <string name="android_progress_callback_please_wait">Wachten alstublieft...</string> - <string name="android_progress_callback_ok">Oké</string> - <string name="android_progress_callback_information">Informatie</string> - <string name="android_progress_callback_confirmation">Bevestiging</string> - <string name="android_progress_callback_yes">Ja</string> - <string name="android_progress_callback_no">Nee</string> - <string name="emulation_activity_error">Fout</string> - <string name="emulation_activity_ok">Oké</string> - <string name="emulation_activity_import_patch_codes">Importeer Patch Codes...</string> - <string name="emulation_activity_patch_on">(AAN)</string> - <string name="emulation_activity_patch_off">(UIT)</string> - <string name="emulation_activity_choose_patch_code_file">Kies Een Patch Code Bestand</string> - <string name="emulation_activity_failed_to_import_patch_codes">Patch codes importeren mislukt. Selecteer een PCSXR of Libretro formaat bestand.</string> - <string name="main_activity_choose_directory">Kies folder</string> - <string name="main_activity_error">Fout</string> - <string name="main_activity_get_path_from_file_error">Mislukt om het bestand op te halen. Zorg ervoor dat het bestand in de interne/externe opslag is.\n\nTik op de overflow knop in de folderselectie.\nSelecteer "Toon Interne Opslag".\nTik op de menuknop en selecteer uw apparaat of SD kaart.</string> - <string name="main_activity_ok">Oké</string> - <string name="main_activity_get_path_from_directory_error">Pad van folder ophalen mislukt.Zorg ervoor dat de folder in de interne/externe opslag is.\n\nTik op de overflow knop in de folderselectie.\nSelecteer "Toon Interne Opslag".\nTik op de menuknop en selecteer uw apparaat of SD kaart.</string> - <string name="main_activity_external_storage_permissions_error">Toegang tot externe opslag nodig om DuckStation te gebruiken.</string> - <string name="main_activity_choose_disc_image">Kies Disc Image</string> - <string name="main_activity_missing_bios_image_prompt">Er was geen BIOS image was gevonden in DuckStation\'s bios folder. Wilt u nu een BIOS image importeren?</string> - <string name="main_activity_missing_bios_image">Ontbrekende BIOS Image</string> - <string name="main_activity_yes">Ja</string> - <string name="main_activity_no">Nee</string> - <string name="main_activity_choose_bios_image">Kies BIOS Image</string> - <string name="main_activity_failed_to_open_bios_image">BIOS image openen mislukt.</string> - <string name="main_activity_failed_to_read_bios_image_prefix">\"BIOS image lezen mislukt: \"</string> - <string name="main_activity_bios_image_too_large">BIOS-image is te groot. U moet een BIOS-image selecteren, geen game, en deze moet 512 KB groot zijn.</string> - <string name="main_activity_invalid_error">Deze BIOS image is ongeldig, of is al geimporteerd.</string> - <string name="main_activity_show_version_title">Versie</string> - <string name="main_activity_copy">Kopieer</string> - <string name="settings_fast_forward_volume">Doorspoel Volume</string> - <string name="settings_summary_fast_forward_volume">Bedient het volume van de emulator wanneer het spel sneller afgespeeld wordt.</string> - <string name="settings_gpu_thread">Threaded GPU Rendering</string> - <string name="settings_summary_gpu_thread">Gebruikt een tweede thread voor het renderen van graphics. Op het moment alleen beschikbaar voor software renderers, maar kan een significante snelheidsverbetering opleveren, en is veilig te gebruiken.</string> -</resources> diff --git a/android/app/src/main/res/values-pt-rBR/arrays.xml b/android/app/src/main/res/values-pt-rBR/arrays.xml deleted file mode 100644 index 21379782a..000000000 --- a/android/app/src/main/res/values-pt-rBR/arrays.xml +++ /dev/null @@ -1,264 +0,0 @@ -<resources> - <string-array name="settings_console_region_entries"> - <item>Auto-Detectar</item> - <item>NTSC-J (Japão)</item> - <item>NTSC-U (US)</item> - <item>PAL (Europa, Austrália)</item> - </string-array> - <string-array name="settings_cpu_execution_mode_entries"> - <item>Interpretador (Mais Lento)</item> - <item>Interpretador Armazenado (Rápido)</item> - <item>Recompilador (Mais Rápido)</item> - </string-array> - <string-array name="settings_cpu_fastmem_mode_entries"> - <item>Desabilitado (Lento)</item> - <item>MMap (Hardware, Mais Rápido, (Dispositivos 64-Bits)</item> - <item>LUT (Rápido)</item> - </string-array> - <string-array name="gpu_renderer_entries"> - <item>Dedicado (OpenGL)</item> - <item>Dedicado (Vulkan)</item> - <item>Aplicativo</item> - </string-array> - <string-array name="settings_gpu_resolution_scale_entries"> - <item>1x</item> - <item>2x</item> - <item>3x (para 720p)</item> - <item>4x</item> - <item>5x (para 1080p)</item> - <item>6x (para 1440p)</item> - <item>7x</item> - <item>8x</item> - <item>9x (para 4K)</item> - <item>10x</item> - <item>11x</item> - <item>12x</item> - <item>13x</item> - <item>14x</item> - <item>15x</item> - <item>16x</item> - </string-array> - <string-array name="settings_display_crop_mode_entries"> - <item>Nenhum</item> - <item>Área Renderizada</item> - <item>Todas as Bordas</item> - </string-array> - <string-array name="settings_display_aspect_ratio_names"> - <item>Auto (Nativo)</item> - <item>Auto (Corresponder a Janela)</item> - <item>Custom</item> - <item>4:3</item> - <item>16:9</item> - <item>19:9</item> - <item>20:9</item> - <item>PAR 1:1</item> - </string-array> - <string-array name="settings_gpu_texture_filter_names"> - <item>Nearest-Neighbor</item> - <item>Bilinear</item> - <item>Bilinear (Sem AA)</item> - <item>JINC2</item> - <item>JINC2 (Sem AA)</item> - <item>xBR</item> - <item>xBR (Sem AA)</item> - </string-array> - <string-array name="settings_controller_type_entries"> - <item>Nenhum</item> - <item>Controle Digital (Gamepad)</item> - <item>Controle Analógico (DualShock)</item> - <item>Joystick Analógico</item> - <item>NeGcon</item> - <item>GunCon</item> - </string-array> - <string-array name="settings_memory_card_mode_entries"> - <item>Sem Cartão de Memória</item> - <item>Compartilhada entre Jogos</item> - <item>Separado Por Jogo (Cód. Jogo)</item> - <item>Separado Por Jogo (Título Jogo)</item> - </string-array> - <string-array name="emulation_touchscreen_menu"> - <item>Mudar</item> - <item>Ajustar Visibilidade</item> - <item>Adicionar/Remover botões</item> - <item>Mover Botões</item> - <item>Redimensionar Botões</item> - </string-array> - <string-array name="touchscreen_layout_menu"> - <item>Mudar Opacidade</item> - <item>Adicionar/Remover Botões</item> - <item>Mover Botões</item> - <item>Redimensionar Botões</item> - <item>Redefinir Posição</item> - <item>Sair</item> - </string-array> - <string-array name="settings_cdrom_read_speedup_entries"> - <item>Nenhum</item> - <item>2x (4x Veloz)</item> - <item>3x (6x Veloz)</item> - <item>4x (8x Veloz)</item> - <item>5x (10x Veloz)</item> - <item>6x (12x Veloz)</item> - <item>7x (14x Veloz)</item> - <item>8x (16x Veloz)</item> - <item>9x (18x Veloz)</item> - <item>10x(20x Veloz)</item> - </string-array> - <string-array name="settings_touchscreen_controller_view_entries"> - <item>Nenhum</item> - <item>Digital D-Pad</item> - <item>1 Analógico</item> - <item>2 Analógicos</item> - <item>Lightgun</item> - </string-array> - <string-array name="settings_audio_backend_entries"> - <item>Mudo</item> - <item>Cubeb</item> - <item>SLES (Recomendado)</item> - </string-array> - <string-array name="settings_audio_buffer_size_entries"> - <item>1024 Quadros (23.22ms)</item> - <item>2048 Quadros (46.44ms, Recomendado)</item> - <item>3072 Quadros (69.66ms)</item> - <item>4096 Quadros (92.88ms)</item> - </string-array> - <string-array name="settings_log_level_entries"> - <item>Nenhum</item> - <item>Erro</item> - <item>Alerta</item> - <item>Alertas de Performance</item> - <item>Informação</item> - <item>Detalhado</item> - <item>Desenvolvedor</item> - <item>Perfil</item> - <item>Depuração</item> - <item>Rota</item> - </string-array> - <string-array name="settings_tabs"> - <item>Geral</item> - <item>Vídeo</item> - <item>Áudio</item> - <item>Melhorias</item> - <item>Conquistas</item> - <item>Avançado</item> - </string-array> - <string-array name="settings_gpu_msaa_entries"> - <item>Desativado</item> - <item>2x MSAA</item> - <item>4x MSAA</item> - <item>8x MSAA</item> - <item>2x SSAA</item> - <item>4x SSAA</item> - <item>8x SSAA</item> - </string-array> - <string-array name="settings_advanced_display_fps_limit_entries"> - <item>Sem limite mostrar quadros)</item> - <item>10 FPS</item> - <item>15 FPS</item> - <item>30 FPS</item> - <item>45 FPS</item> - <item>60 FPS</item> - <item>75 FPS</item> - <item>90 FPS</item> - </string-array> - <string-array name="settings_emulation_speed_entries"> - <item>Sem Limite</item> - <item>10% [6 FPS (NTSC) / 5 FPS (PAL)]</item> - <item>20% [12 FPS (NTSC) / 10 FPS (PAL)]</item> - <item>30% [18 FPS (NTSC) / 15 FPS (PAL)]</item> - <item>40% [24 FPS (NTSC) / 20 FPS (PAL)]</item> - <item>50% [30 FPS (NTSC) / 25 FPS (PAL)]</item> - <item>60% [36 FPS (NTSC) / 30 FPS (PAL)]</item> - <item>70% [42 FPS (NTSC) / 35 FPS (PAL)]</item> - <item>80% [48 FPS (NTSC) / 40 FPS (PAL)]</item> - <item>90% [54 FPS (NTSC) / 45 FPS (PAL)]</item> - <item>100% [60 FPS (NTSC) / 50 FPS (PAL), Padrão]</item> - <item>125% [75 FPS (NTSC) / 62 FPS (PAL)]</item> - <item>150% [90 FPS (NTSC) / 75 FPS (PAL)]</item> - <item>175% [105 FPS (NTSC) / 87 FPS (PAL)]</item> - <item>200% [120 FPS (NTSC) / 100 FPS (PAL)]</item> - <item>250% [150 FPS (NTSC) / 125 FPS (PAL)]</item> - <item>300% [180 FPS (NTSC) / 150 FPS (PAL)]</item> - <item>350% [210 FPS (NTSC) / 175 FPS (PAL)]</item> - <item>400% [240 FPS (NTSC) / 200 FPS (PAL)]</item> - <item>450% [270 FPS (NTSC) / 225 FPS (PAL)]</item> - <item>500% [300 FPS (NTSC) / 250 FPS (PAL)]</item> - <item>600% [360 FPS (NTSC) / 300 FPS (PAL)]</item> - <item>700% [420 FPS (NTSC) / 350 FPS (PAL)]</item> - <item>800% [480 FPS (NTSC) / 400 FPS (PAL)]</item> - <item>900% [540 FPS (NTSC) / 450 FPS (PAL)]</item> - <item>1000% [600 FPS (NTSC) / 500 FPS (PAL)]</item> - </string-array> - <string-array name="settings_advanced_cpu_overclock_entries"> - <item>25% (8MHz)</item> - <item>50% (16MHz)</item> - <item>75% (24MHz)</item> - <item>100% (33MHz, Padrão)</item> - <item>125% (41MHz)</item> - <item>150% (49MHz)</item> - <item>175% (57MHz)</item> - <item>200% (66MHz)</item> - <item>225% (74MHz)</item> - <item>250% (82MHz)</item> - <item>275% (90MHz)</item> - <item>300% (99MHz)</item> - <item>350% (115MHz)</item> - <item>400% (132MHz)</item> - <item>450% (148MHz)</item> - <item>500% (165MHz)</item> - <item>500% (165MHz)</item> - <item>600% (198MHz)</item> - <item>700% (231MHz)</item> - <item>800% (264MHz)</item> - <item>900% (297MHz)</item> - <item>1000% (330MHz)</item> - </string-array> - <string-array name="settings_emulation_screen_orientation_entries"> - <item>Padrão do Dispositivo</item> - <item>Retrato</item> - <item>Paisagem</item> - <item>Baseado no sensor de movimento</item> - </string-array> - <string-array name="settings_language_entries"> - <item>Mesmo do sistema</item> - <item>Inglês</item> - <item>Português (Brasil)</item> - <item>Italiano</item> - <item>Holandês</item> - <item>Espanhol</item> - <item>Russo</item> - </string-array> - <string-array name="settings_theme_entries"> - <item>Padrão do Sistema</item> - <item>Claro</item> - <item>Escuro</item> - </string-array> - <string-array name="settings_downsample_mode_entries"> - <item>Desabilitado</item> - <item>Misto (Reduz 3D / Suaviza Tudo)</item> - <item>Adaptativo (Preserva o 3D / Suaviza 2D)</item> - </string-array> - <string-array name="settings_boolean_entries"> - <item>Desligado</item> - <item>Ligado</item> - </string-array> - <string-array name="settings_multitap_mode_entries"> - <item>Desativado</item> - <item>Conectado à porta 1</item> - <item>Conectado à porta 2</item> - <item>Conectado à porta 1 e 2</item> - </string-array> - <string-array name="memory_card_editor_save_menu"> - <item>Copiar salvar</item> - <item>Excluir salvar</item> - </string-array> - <string-array name="settings_touchscreen_controller_port_entries"> - <item>Porta 1</item> - <item>Porta 2</item> - <item>Multitap 3</item> - <item>Multitap 4</item> - <item>Multitap 5</item> - <item>Multitap 6</item> - <item>Multitap 7</item> - <item>Multitap 8</item> - </string-array> -</resources> diff --git a/android/app/src/main/res/values-pt-rBR/strings.xml b/android/app/src/main/res/values-pt-rBR/strings.xml deleted file mode 100644 index b4c92179f..000000000 --- a/android/app/src/main/res/values-pt-rBR/strings.xml +++ /dev/null @@ -1,368 +0,0 @@ -<resources> - <string name="app_name">DuckStation</string> - <string name="action_settings">Configurações</string> - <string name="action_controller_mapping">Configurações de Controle</string> - <string name="title_activity_settings">Configurações</string> - <string name="settings_console_region">Região do Console</string> - <string name="settings_console_tty_output">Ativar saída TTY</string> - <string name="settings_console_fast_boot">Inicio Rápido</string> - <string name="settings_osd_show_messages">Mostrar Mensagens</string> - <string name="settings_osd_show_speed">Mostrar velocidade da emulação</string> - <string name="settings_osd_show_show_fps">Mostrar FPS do Jogo</string> - <string name="settings_osd_show_show_vps">Mostrar VPS do Jogo</string> - <string name="settings_cpu_execution_mode">Modo de execução CPU</string> - <string name="settings_gpu_renderer">Renderizado por GPU</string> - <string name="settings_gpu_resolution_scale">Escala de Resolução</string> - <string name="title_activity_emulation">Atividade da Emulação</string> - <string name="settings_emulation_speed">Velocidade da Emulação</string> - <string name="settings_fast_forward_speed">Velocidade de Avanço Rápido</string> - <string name="settings_save_state_on_exit">Salvar estado ao Sair</string> - <string name="settings_emulation_screen_orientation">Orientação de Tela</string> - <string name="settings_load_patch_codes">Carregar Trapaças</string> - <string name="settings_summary_save_state_on_exit">Salvar automaticamente o estado da emulação ao desligar</string> - <string name="settings_summary_load_patch_codes"><![CDATA[Loads Carrega códigos de trapaça no formato .cht e ou PCSXR. Códigos podem ser alternados durante o jogo.]]></string> - <string name="settings_apply_compatibility_settings">Aplicar Configurações de Compatibilidade</string> - <string name="settings_summary_apply_compatibility_settings">Desativar automaticamente melhorias quando não são suportadas.</string> - <string name="settings_summary_video_sync">Ative essa opção para que o emulador sincronize a taxa de FPS de acordo com a taxa do seu aparelho.</string> - <string name="settings_video_sync">Sincronização Vertical</string> - <string name="settings_cpu_overclocking">Aumento de Velocidade CPU (Overclock)</string> - <string name="settings_cdrom_region_check">Checagem de Região do CD-ROM</string> - <string name="settings_summary_cdrom_region_check">Previne que discos de regiões incorretas sejam lidos pelo emulador. Pode ser Desligado.</string> - <string name="settings_cdrom_preload_image_to_ram">Carregar CD-ROM para memória RAM</string> - <string name="settings_summary_preload_image_to_ram">Carrega o jogo todo na RAM. Útil para prevenir instabilidades durante o jogo. Em alguns casos também elimina travamentos durante os carregamentos.</string> - <string name="settings_pgxp_vertex_cache">PGXP - Vértice Armazenado</string> - <string name="settings_summary_pgxp_vertex_cache">Reduz as oscilações nos poligonos tentando preservar os mesmos na hora da transferência para a RAM.</string> - <string name="settings_pgxp_cpu_mode">PGXP - Modo CPU</string> - <string name="settings_summary_pgxp_cpu_mode">Tenta reduzir oscilações nos poligonos preservando-os na hora da transferência para o CPU. Alguns jogos se beneficiam com esta opção junto com o PGXP para que funcione corretamente. Muito lento, e imcompativel com o modo recompilador.</string> - <string name="settings_cpu_recompiler_icache">Recompilador CPU Modo ICache</string> - <string name="settings_summary_cpu_recompiler_icache">Determina se a instrução enviada ao CPU emulado fica armazenada no recompilador. Melhor a precisão ao pequeno custo de performance. Se os jogos estão rodando muito rápido, tente ativar esta opção.</string> - <string name="settings_cpu_recompiler_fastmem">Recompilador CPU Modo FASTMEM</string> - <string name="settings_summary_cpu_recompiler_fastmem">Torna o acesso à memória mais eficiente. Desative se estiver instável em seu aparelho.</string> - <string name="settings_presented_frame_limit">Limite do quadro Atual</string> - <string name="settings_logging_level">Nível de Registro</string> - <string name="settings_log_to_file">Registro para Arquivo</string> - <string name="settings_summary_log_to_file">Escreve mensagens em um arquivo duckstation.log em seu diretório raiz. Use só para depuração isto deixará o emulador lento.</string> - <string name="settings_log_to_logcat">Registro em Linha de Comando</string> - <string name="settings_summary_log_to_logcat">Escreve um arquivo de registro em um arquivo no Android. Só útil quando atrelado ao PC com adb.</string> - <string name="settings_volume">Volume</string> - <string name="settings_summary_volume">Controla o volume do emulador.</string> - <string name="settings_fast_forward_volume">Volume do Avanço Rápido</string> - <string name="settings_summary_fast_forward_volume">Controla o volume do áudio quando o avanço rápido é usado.</string> - <string name="settings_mute_all_sound">Silenciar Tudo</string> - <string name="settings_summary_mute_all_sound">Silencia totalmente o emulador.</string> - <string name="settings_mute_cd_audio">Silenciar CDs de Áudio</string> - <string name="settings_summary_mute_cd_audio">Silencia de forma forçada tanto para CDs de música quanto em jogos.</string> - <string name="settings_audio_backend">Opções de Áudio</string> - <string name="settings_audio_buffer_size">Latência do Volume</string> - <string name="settings_summary_audio_buffer_size">Determina a latência entre o áudio. Valores menores reduzem a latência (atraso), pode causar engasgos quando jogos são acelerados.</string> - <string name="settings_audio_sync">Sincronia de Áudio</string> - <string name="settings_summary_audio_sync">Limita a velocidade de emulação com base na opção escolhida. Isso ajuda a remover ruídos ou estalos se a emulação for muito rápida. A sincronização será automaticamente desativada se não funcionar a 100%.</string> - <string name="settings_controller_type">Tipo de Controle</string> - <string name="settings_enable_analog_mode_on_reset">Ativa modo analógico ao reiniciar</string> - <string name="settings_touchscreen_controller_view">Visualização do controle em tela</string> - <string name="settings_auto_hide_touchscreen_controller">Auto ocultar controles em tela</string> - <string name="settings_summary_auto_hide_touchscreen_controller">Esconde controles em tela quando um controle externo é detectado.</string> - <string name="settings_vibrate_on_press">Vibrar ao Pressionar</string> - <string name="settings_summary_vibrate_on_press">Ativa vibração quando um botão da tela de toque é pressionado. Requer \"Vibrar ao Tocar\" ativado nas opções do seu dispositivo para funcionar.</string> - <string name="settings_enable_vibration">Ativa Vibração</string> - <string name="settings_summary_enable_vibration">Encaminha vibração do jogo para o motor do aparelho.</string> - <string name="settings_memory_card_1_type">Tipo de Cartão de Memória 1</string> - <string name="settings_memory_card_2_type">Tipo de Cartão de Memória 2</string> - <string name="settings_crop_mode">Modo de Corte</string> - <string name="settings_aspect_ratio">Razão de Aspecto</string> - <string name="settings_linear_upscaling">Escalonamento Linear</string> - <string name="settings_integer_upscaling">Escalonamento Integro</string> - <string name="settings_summary_linear_upscaling">Suaviza a imagem ao aumentar a resolução da emulação.</string> - <string name="settings_summary_integer_upscaling">Adiciona preenchimento a área exibida para garantir a proporção entre os pixels. Pode resultar em uma imagem mais nítida em jogos 2D.</string> - <string name="settings_summary_osd_show_messages">Mostra mensagens em tela ao salvar, carregar, carregar trapaças ou quando eventos e alertas ocorrerem.</string> - <string name="settings_summary_osd_show_speed">Mostra a velocidadea atual da emulação no topo superior direito da tela..</string> - <string name="settings_summary_osd_show_fps">Mostra a velocidade atual dos quadros FPS no topo da tela.</string> - <string name="settings_summary_osd_show_vps">Mostra a velocidade atual dos quadros VPS no topo da tela.</string> - <string name="settings_cdrom_read_speedup">Velocidade de leitura CD-Rom</string> - <string name="settings_summary_cdrom_read_speedup">Aumenta a velocidade de leitura do CD-Rom. Só se aplica a velocidade de leitura em 2x para cima, configuração será ignorada quando usado para tocar CD\'s de música. Pode aumentar a velocidade de leitura em telas de carregamento em alguns jogos, ao custo de quebrar outros..</string> - <string name="settings_summary_console_fast_boot">Pula a tela de abertura clássica da Sony seguro ativar porém alguns raros jogos podem quebrar.</string> - <string name="settings_msaa">Filtro Anti-serrilhado</string> - <string name="settings_true_color">Renderizar em 24 Cores (desativa dithering)</string> - <string name="settings_summary_true_color">Produz gradientes de aparência mais agradável ao custo de fazer algumas cores ficarem ligeiramente diferentes. A maioria dos jogos são compatíveis com esta opção.</string> - <string name="settings_scaled_dithering">Efeito Dithering Escalado (escala pontilhados para resolução)</string> - <string name="settings_summary_scaled_dithering">Escala o dithering para a resolução da GPU emulada. Torna o padrão do pontilhado muito menos óbvio em resoluções mais altas.</string> - <string name="settings_disable_interlacing">Desativar Entrelaçamento (força redenrização progressiva)</string> - <string name="settings_summary_disable_interlacing">Força a renderização e exibição de quadros para o modo progressivo. Remove o efeito de \'alisamento\' visto em jogos 480i renderizando sempre em 480, seguro deixar ativo.</string> - <string name="settings_texture_filtering">Filtragem de textura</string> - <string name="settings_force_ntsc_timings">Força renderização em NTSC (60hz-em-PAL)</string> - <string name="settings_summary_force_ntsc_timings">Usa temporizadores de quadro NTSC forçando os jogos PAL vulgo Europeus, a rodarem a 60 Hz.</string> - <string name="settings_widescreen_hack">Hack de tela panorâmica</string> - <string name="settings_summary_widescreen_hack">Dimensiona as posições dos vértices da tela para a proporção mais larga (Panoramicas), basicamente aumenta o campo de visão de 4:3 para 16:09 em jogos 3D. Não é compatível com todos os jogos.</string> - <string name="settings_force_4_3_for_24bit">Forçar 4:3 para telas 24-bits</string> - <string name="settings_summary_force_4_3_for_24bit">Volta a tela para 4:3 (Desativa efeito esticado em FMVs).</string> - <string name="settings_chroma_smoothing_24bit">Suavização de Croma</string> - <string name="settings_summary_chrome_smoothing_24bit">Suavização de Croma (reduz artefatos em cenas FMV).</string> - <string name="settings_pgxp_geometry_correction">Correção Geométrica PGXP</string> - <string name="settings_summary_pgxp_geometry_correction"><![CDATA[Reduz as "oscilações" nos polígonos tentando preservar os mesmos na hora da transferência para a memória. Funciona apenas se rederizado por hardware e pode não ser compatível com todos os jogos Não compativel com todos os jogos.]]></string> - <string name="settings_pgxp_culling_correction">PGXP - Correção de Curvas</string> - <string name="settings_summary_pgxp_culling_correction">Aumenta a precisão das curvas nos polígonos, reduzindo o número de buracos na geometria do mesmo. Requer a Correção Geometrica ativada. Requer que a correção geométrica esteja ativada.</string> - <string name="settings_pgxp_texture_correction">PGXP - Correção de Textura</string> - <string name="settings_summary_pgxp_texture_correction">Utiliza interpolação corretiva em perspetiva para coordenadas e das cores na textura, endireitando as que estiverem distorcidas. Requer que a correção geométrica esteja ativada.</string> - <string name="settings_pgxp_preserve_projection_precision">PGXP - Preserva Precisão de Projeção</string> - <string name="settings_summary_pgxp_preserve_projection_precision">Permite precisão adicional para PGXP; Pode melhorar o visual em alguns jogos e prejudicar outros.</string> - <string name="settings_pgxp_depth_buffer">PGXP - Modo Polimento (Z)</string> - <string name="settings_summary_pgxp_depth_buffer">Tenta reduzir os poligonos no eixo Z (parte inferior ou cantos em alguns casos) ajustando os limites dos valores para que não haja conflitos na renderização de poligonos 3D. Gerando um efeito de buracos ou quadrados piscando. Tem pouca compatibilidade no geral, mas pode funcionar bem em alguns jogos. Outros precisam ser ajustados via limitador.</string> - <string name="menu_main_resume_last_session">Resumir Jogo</string> - <string name="menu_main_start_file">Iniciar Arquivo</string> - <string name="menu_main_start_bios">Iniciar BIOS</string> - <string name="menu_main_edit_game_directories">Editar Diretórios de Jogos</string> - <string name="menu_main_scan_for_new_games">Escanear por Jogos Novos</string> - <string name="menu_main_rescan_all_games">Rescanear Tudo</string> - <string name="menu_main_import_bios">Importar BIOS</string> - <string name="menu_main_show_version">Mostrar Versão</string> - <string name="menu_main_github_repository">Repositório no Github</string> - <string name="menu_main_discord_server">Servidor no Discord</string> - <string name="menu_game_list_entry_start_game">Iniciar Jogo</string> - <string name="menu_game_list_entry_resume_game">Resumir Jogo</string> - <string name="android_progress_callback_please_wait">Aguarde...</string> - <string name="android_progress_callback_ok">OK</string> - <string name="android_progress_callback_information">Informação</string> - <string name="android_progress_callback_confirmation">Confirmação</string> - <string name="android_progress_callback_yes">Sim</string> - <string name="android_progress_callback_no">Não</string> - <string name="emulation_activity_error">Erro</string> - <string name="emulation_activity_ok">OK</string> - <string name="emulation_activity_import_patch_codes">Importar Trapaças...</string> - <string name="emulation_activity_patch_on">(Ligado)</string> - <string name="emulation_activity_patch_off">(Desligado)</string> - <string name="emulation_activity_choose_patch_code_file">Escolher Arquivo de Trapaça</string> - <string name="emulation_activity_failed_to_import_patch_codes">Falha ao importar trapaça. Tenha certeza de ter escolhido o formato PCSXR ou Libretro CHT.</string> - <string name="main_activity_choose_directory">Escolher Diretório</string> - <string name="main_activity_error">Erro</string> - <string name="main_activity_get_path_from_file_error">Falha ao obter o caminho para o arquivo selecionado. Certifique-se de que o arquivo esteja no armazenamento interno / externo.\n\nTap.\nSelect "Mostrar armazenamento interno".\nTap selecione o nome do seu dispositivo ou cartão SD.</string> - <string name="main_activity_ok">OK</string> - <string name="main_activity_get_path_from_directory_error">Falha ao obter o caminho para o arquivo selecionado. Certifique-se de que o arquivo esteja no armazenamento interno / externo. \n\nTap the overflow button in the directory selector.\nSelect \"Mostrar armazenamento interno\".\nTap selecione o nome do seu dispositivo ou cartão SD.</string> - <string name="main_activity_external_storage_permissions_error">Permissões de armazenamento externo são necessárias para usar o DuckStation.</string> - <string name="main_activity_choose_disc_image">Escolha Arquivo de Jogo</string> - <string name="main_activity_missing_bios_image_prompt">Nenhum BIOS foi encontrada no diretório de BIOS do DuckStation. Deseja localizar e importar o BIOS agora?</string> - <string name="main_activity_missing_bios_image">BIOS ausente</string> - <string name="main_activity_yes">Sim</string> - <string name="main_activity_no">Não</string> - <string name="main_activity_choose_bios_image">Escolher BIOS</string> - <string name="main_activity_failed_to_open_bios_image">Falha ao Abrir BIOS</string> - <string name="main_activity_failed_to_read_bios_image_prefix">\"Falha ao ler BIOS: \"</string> - <string name="main_activity_bios_image_too_large">Aqruivo BIOS muito grande. Você deve selecionar uma imagem do BIOS, não um jogo, e deve ter 512 KB de tamanho.</string> - <string name="main_activity_invalid_error">Esse BIOS não é válido, ou já foi importado.</string> - <string name="main_activity_show_version_title">Versão</string> - <string name="main_activity_copy">Copiar</string> - <string name="settings_gpu_thread">Renderização Sequencial - GPU</string> - <string name="settings_summary_gpu_thread">Usa um segundo processo para desenhar gráficos em tela. Atualmente só disponível para renderizadores por software, pode fornecer uma melhoria significativa na velocidade, pode ser usado a vontade.</string> - <string name="settings_gpu_threaded_presentation">Apresentação Sequencial - GPU</string> - <string name="settings_summary_gpu_threaded_presentation">Apresenta quadros sequêncialmente em segundo plano quando o avanço rápido ou sincronizador vertical (Vsync) está desativado Isso pode melhorar o desempenho no renderizador Vulkan.</string> - <string name="settings_language">Linguagem (Necessário Reiniciar)</string> - <string name="touchscreen_controller_stop_editing">Terminado</string> - <string name="touchscreen_controller_reset_layout">Redefinir</string> - <string name="emulation_activity_touchscreen_controller_not_active">Controle em tela não Ativado.</string> - <string name="settings_theme">Tema</string> - <string name="settings_controller_mapping_summary">Permite configurar e atribuir os botões de seu controle externo ao emulador.</string> - <string name="settings_controller_mapping">Mapear Controles</string> - <string name="controller_binding_dialog_message">Pressione os botões para atribuí-los ao controle.\n\nAtribuição Atual: %s</string> - <string name="controller_binding_dialog_no_binding"><![CDATA[<Nenhuma Atribuição>]]></string> - <string name="controller_binding_dialog_cancel">Cancelar</string> - <string name="controller_binding_dialog_clear">Limpar</string> - <string name="controller_mapping_activity_title">Mapear Controle</string> - <string name="controller_mapping_activity_no_profiles_found">Perfil não encontrado.</string> - <string name="controller_mapping_activity_select_input_profile">Escolha o Perfil de Entrada</string> - <string name="controller_mapping_activity_failed_to_load_profile">Falha ao carregar o perfil \'%s\'</string> - <string name="controller_mapping_activity_input_profile_name">Nome do Perfil:</string> - <string name="controller_mapping_activity_save">Salvar</string> - <string name="controller_mapping_activity_name_must_be_provided">Um nome deve ser escolhido.</string> - <string name="controller_mapping_activity_failed_to_save_input_profile">Falha ao salvar perfil.</string> - <string name="controller_mapping_activity_input_profile_saved">Perfil \'%s\' salvo.</string> - <string name="controller_mapping_activity_cancel">Cancelar</string> - <string name="settings_use_analog_sticks_for_dpad">Usar Analógicos como D-Pad no Modo Digital</string> - <string name="settings_summary_enable_analog_mode_on_reset">Força os controles ao modo analógico quando emulador é reiniciado.</string> - <string name="settings_summary_use_analog_sticks_for_dpad">Permite usar os analógicos como um direcional (D-Pad) no modo digital, assim como os botões.</string> - <string name="settings_disable_all_enhancements">Desativar todos os aprimoramentos</string> - <string name="settings_summary_disable_all_enhancements">Desliga temporariamente todos os aprimoramentos, útil para achar problemas de performance..</string> - <string name="settings_downsample_mode">Suavização da Imagem</string> - <string name="activity_game_properties">Propriedades do Jogo</string> - <string name="game_properties_preference_use_global_setting">Usar configuração global</string> - <string name="settings_input_profile">Perfil de controle</string> - <string name="game_properties_tab_summary">Sumário</string> - <string name="game_properties_tab_game_settings">Configuração de Jogo</string> - <string name="game_properties_tab_controller_settings">Configurações de Controle</string> - <string name="settings_audio_resampling">Ajuste de Áudio</string> - <string name="settings_summary_audio_resampling">Quando estiver rodando fora dos 100% da velocidade, o áudio será ajustado para que não haja queda de quadros. Produz uma melhor qualidade do avanço rápido no áudio ao custo pequeno de perda de performance.</string> - <string name="settings_general_sync_to_host_refresh_rate">Sincronizar taxa de atualização</string> - <string name="settings_summary_general_sync_to_host_refresh_rate">Ajusta a velocidade da emulação de acordo com a mesma taxa de atualização do dispositivo.</string> - <string name="settings_sustained_performance_mode">Desempenho Contínuo</string> - <string name="settings_summary_sustained_performance_mode">Ativa o modo contínuo de perfomance do Android. Resulta em um melhor desempenho de quadros e perfomance por longos periodos em alguns dispositivos..</string> - <string name="title_activity_game_directories">Editar Diretório de Jogos</string> - <string name="settings_game_directories">Diretório de Jogos</string> - <string name="settings_summary_game_directories">Altera a lista de diretórios usados para pesquisar jogos.</string> - <string name="game_directories_scanning_subdirectories">Ler subdiretórios.</string> - <string name="game_directories_not_scanning_subdirectories">Não ler subdiretórios.</string> - <string name="settings_display_all_frames">Otimização de Quadros</string> - <string name="settings_summary_display_all_frames">Garante que cada quadro renderizado será mostrado em tela, no seu rtimo adequado. Se estiver tendo dificuldades ao manter uma boa velocidade, ou estiver enfrentando algumas falhas de áudio tente desativar esta opção.</string> - <string name="menu_edit_game_directories_add_directory">Adicionar Diretório</string> - <string name="menu_edit_game_directories_add_path">Adicionar Caminho</string> - <string name="edit_game_directories_add_path">Editar Caminho</string> - <string name="edit_game_directories_add_path_summary">Insira o caminho completo dos seus jogos.\n\nUse um gerenciador de arquivos para ver o caminho.\n\nExemplo: /storage/emulated/0/games</string> - <string name="save_state_info_slot_is_empty">Espaço Vazio</string> - <string name="save_state_info_game_save_n">Id do Jogo %d</string> - <string name="save_state_info_global_save_n">Espaço Global %d</string> - <string name="save_state_info_quick_save">Salvamento Rápido</string> - <string name="settings_osd_show_show_resolution">Mostrar Resolução</string> - <string name="settings_summary_osd_show_resolution">Mostra resolução do jogo no canto superior direito da tela.</string> - <string name="settings_summary_display_stretch">Estica a imagem para preencher toda a tela.</string> - <string name="settings_display_stretch">Esticar para Preencher</string> - <string name="settings_category_global">Configurações Básicas</string> - <string name="settings_category_display">Configurações de Tela</string> - <string name="settings_category_audio">Configurações de Áudio</string> - <string name="settings_category_console">Configurações do Console</string> - <string name="settings_category_cpu">Configurações de CPU</string> - <string name="settings_category_gpu">Configurações de GPU</string> - <string name="settings_category_logging">Configurações de Rastreio</string> - <string name="dialog_done">Salvar</string> - <string name="dialog_touchscreen_controller_type">Ver Controle em Tela</string> - <string name="dialog_touchscreen_controller_opacity">Visibilidade do Controle</string> - <string name="dialog_touchscreen_controller_buttons">Botões do Controle</string> - <string name="dialog_touchscreen_controller_settings">Configurações do controle em Tela</string> - <string name="settings_summary_console_tty_output">Informações de Depuração.</string> - <string name="action_show_game_list">Modo Lista</string> - <string name="action_show_game_grid">Modo Grade</string> - <string name="settings_touch_gliding">Deslizar por toque</string> - <string name="settings_summary_touch_gliding">Permite que você pressione combinações de botões deslizando o dedo pela tela.</string> - <string name="menu_game_list_entry_game_properties">Propriedades</string> - <string name="emulation_activity_change_disc_select_new_file">Escolha um arquivo...</string> - <string name="settings_achievements_enable">Ativar Conquistas</string> - <string name="settings_summary_achievements_enable">Quando ativado e logado com sua conta, Ducstation irá procurar e baixar as conquistas se hovuerem ao iniciar o jogo.</string> - <string name="settings_achievements_challenge_mode">Modo Dificílimo (Hardcore)</string> - <string name="settings_summary_achievements_challenge_mode">Modo Dificílimo (hardcore). Desativa salvamentos rápidos, carregamento de trapaças e funções de velocidade, mas você receberá o dobro de pontos de conquistas em troca.</string> - <string name="settings_achievements_rich_presence">Ativar presença Rica (Discord)</string> - <string name="settings_summary_achievements_rich_presence">Quando ativado, a informação do que estiver sendo jogado será enviado ao servidor se suportado.</string> - <string name="settings_achievements_username">Nome de Usuário</string> - <string name="settings_achievements_token_generation_time">Token Gerado</string> - <string name="settings_achievements_login">Usuário</string> - <string name="settings_summary_achievements_login">Entre para obter Conquistas</string> - <string name="settings_achievements_register">Registrar-se</string> - <string name="settings_summary_achievements_register">Acesse para registrar-se.</string> - <string name="settings_achievements_logout">Sair</string> - <string name="settings_summary_achievements_logout">Sair da sua conta. Novas conquistas não serão registradas.</string> - <string name="settings_achievements_view_profile">Ver Perfil</string> - <string name="settings_summary_achievements_view_profile">Ver Peril...</string> - <string name="settings_achievements_test_mode">Ativar Modo Teste</string> - <string name="settings_summary_achievements_test_mode">Quando ativado, DuckStation entenderá que todas as Conquistas deverão ficar travadas e não mandará uma notificação para o servidor não marcando a mesma como destravada.</string> - <string name="settings_achievements_use_first_disc_from_playlist">Usar primeiro Disco (Playlist)</string> - <string name="settings_summary_achievements_use_first_disc_from_playlist">Quando ativado, o primeiro disco em uma lista de reprodução será usado para conquistas, independente de qual disco está ativo.</string> - <string name="achievement_settings_login_title">Credenciais do RetroAchievements</string> - <string name="achievement_settings_login_help">Por favor entre com um nome de usuário e senha para se autenticar no retroachievements.org conforme abaixo. Suas credenciais não serão salvas no emulador. Será criado um token único de acesso para autenticação.</string> - <string name="achievement_settings_login_username_hint">Usuário</string> - <string name="achievement_settings_login_password_hint">Senha</string> - <string name="achievement_settings_login_login_button">Entrar</string> - <string name="achievement_settings_login_cancel_button">Cancelar</string> - <string name="achievement_settings_login_failed">Falha na entrada, verifique seu usuário e senha e tente novamente</string> - <string name="achievement_points_format_string">%d pontos</string> - <string name="achievement_summary_format_string">Você obteve %1$d de %2$d conquistas, ganhando %3$d pontos de %4$d disponiveis.</string> - <string name="achievement_title_challenge_mode_format_string">%s (Modo Hardcore)</string> - <string name="settings_achievements_disclaimer">DuckStation usa o RetroAchievements como base de dados para as conquistas. Para usar esta função, considere fazer sua conta em:(https://retroachievements.org).</string> - <string name="settings_achievements_confirm_logout_title">Confirmar Sair</string> - <string name="settings_achievements_confirm_logout_message">O encerramento de uma sessão desabilitará as conquistas até que entre novamente. Conquistas abertas anteriormente não serão perdidas.</string> - <string name="controller_binding_device_for_vibration">Vibração do Dispositivo</string> - <string name="controller_settings_tab_settings">Configurações</string> - <string name="controller_settings_tab_hotkeys">Atalhos</string> - <string name="controller_settings_category_button_bindings">Atribuição de Botões</string> - <string name="controller_settings_category_axis_bindings">Atribuição de Eixos</string> - <string name="controller_settings_category_settings">Configurações</string> - <string name="controller_settings_category_touchscreen_controller">Controles de toque</string> - <string name="controller_settings_category_ports">Portas</string> - <string name="controller_settings_main_port_format">Porta %d</string> - <string name="controller_settings_sub_port_format">Porta %1$d%2$c</string> - <string name="action_switch_view">Mudar visualização</string> - <string name="title_activity_memory_card_editor">Editor de Cartão de Memória</string> - <string name="action_memory_card_editor">Editor de Cartão de Memória</string> - <string name="action_memory_card_editor_import_card">Importar Cartão</string> - <string name="action_memory_card_editor_open_card">Abrir Cartão</string> - <string name="action_memory_card_editor_new_card">Novo Cartão</string> - <string name="action_memory_card_editor_format_card">Formartar Cartão</string> - <string name="action_memory_card_editor_delete_card">Apagar Cartão</string> - <string name="memory_card_editor_no_cards_found">Nenhum Cartão de Memória encontrado.</string> - <string name="memory_card_editor_card_already_open">Este cartão já está aberto.</string> - <string name="memory_card_editor_failed_to_open_card">Falha ao abrir ou ler o cartão de memória.</string> - <string name="memory_card_editor_must_have_at_least_two_cards_to_copy">Necessário que tenha pelo menos 2 cartões para abrir e copiar.</string> - <string name="memory_card_editor_copy_save_to">Coppiar %s para...</string> - <string name="memory_card_editor_select_card">Escolher Cartão</string> - <string name="memory_card_editor_error">Erro</string> - <string name="memory_card_editor_copy_insufficient_blocks">Este arquivo precisa de %1$d blocos, mas só restam %2$d livres.</string> - <string name="memory_card_editor_copy_already_exists">Arquivo \'%s\' já existente no cartão destino.</string> - <string name="memory_card_editor_copy_read_failed">Falha ao ler \'%s\' do cartão origem.</string> - <string name="memory_card_editor_copy_write_failed">Falha ao escrever \'%s\' no cartão destino.</string> - <string name="memory_card_editor_copy_success">Copiado \'%1$s\' para \'%2$s\'.</string> - <string name="memory_card_editor_delete_confirm">Tem certeza que quer apagar o save \'%s\'?</string> - <string name="memory_card_editor_delete_success">Apagar save \'%s\'.</string> - <string name="memory_card_editor_delete_failed">Falha ao apagar arquivo \'%s\'.</string> - <string name="memory_card_editor_no_card_selected">Nenhum cartão selecionado.</string> - <string name="memory_card_editor_import_failed">Falha ao importar cartão. Pode não ter o formato correto.</string> - <string name="memory_card_editor_delete_card_confirm_message">Cartao de Memória \'%s\' será apagado, e não poderá ser recuperado. Tem certeza que quer apagá-lo?</string> - <string name="memory_card_editor_delete_card_failed">Falha ao deletar \'%s\'.</string> - <string name="memory_card_editor_delete_card_success">Cartão Apagado \'%s\'.</string> - <string name="memory_card_editor_format_card_confirm_message">Cartão de Memória \'%s\' será formatado, limpando tudo. Tem certeza que quer formatar?</string> - <string name="memory_card_editor_format_card_failed">Falha ao formatar \'%s\'.</string> - <string name="memory_card_editor_format_card_success">Cartão formatado \'%s\'.</string> - <string name="memory_card_editor_import_card_confirm_message">Importando \'%1$s\' removerá todos os saves \'%2$s\'. Quer mesmo continuar?</string> - <string name="memory_card_editor_import_card_read_failed">Falha ao ler \'%s\'.</string> - <string name="memory_card_editor_import_card_failed">Falha ao importar cartão \'%s\'. Pode não conter um formato válido.</string> - <string name="memory_card_editor_import_card_success">Cartão Importado \'%s\'.</string> - <string name="menu_game_list_entry_choose_cover_image">Escolha um arquivo de Capa</string> - <string name="controller_settings_vibration_unsupported">O dispositivo escolhido não tem suporte a vibração.</string> - <string name="controller_settings_automatic_mapping">Executar mapeamento automático</string> - <string name="controller_settings_summary_automatic_mapping">Tentará mapear os botões de forma automática ao controle conectado.</string> - <string name="controller_settings_clear_controller_bindings">Limpar atribuições</string> - <string name="controller_settings_summary_clear_controller_bindings">Remove todas as atribuições para o controle conectado.</string> - <string name="controller_settings_clear_controller_bindings_confirm">Tem certeza de que quer remover as atribuições para o controle, isto não poderá ser desfeito.</string> - <string name="controller_settings_clear_controller_bindings_done">Todas as atribuições de botões removidas para o controle %d.</string> - <string name="controller_auto_mapping_no_devices">Nenhum controle com suporte disponível encontrado. A atribuição automática não pôde ser feita, mas você pode ainda atribuir os botões manualmente..</string> - <string name="controller_auto_mapping_select_device">Escolha o dispositivo</string> - <string name="controller_auto_mapping_results">Resultados da atribuição automática</string> - <string name="main_activity_empty_game_list_title">Nenhum jogo encontrado. Adicione o diretório contendo jogos para iniciar.</string> - <string name="main_activity_empty_game_list_supported_formats">Os formatos suportados são:\n\n%s\n\nJogos no formato .bin precisam obrigatoriamente do arquvio .cue para iniciar.</string> - <string name="main_activity_empty_game_list_add_directory">Adicionar diretório de jogos</string> - <string name="main_activity_empty_game_list_start_file">Iniciar arquivo</string> - <string name="update_notes_title">Atualizar Notas</string> - <string name="update_notes_message_version_controller_update">Esta atualização inclui suporte para multiplos controles com vibração, e suporte a atribuição de botões comos os de volume.\n\nVocê deverá reatribuir seus controles, caso contrário eles não irão mais funcionar. Quer continuar ?</string> - <string name="settings_osd_show_show_inputs">Mostrar entrada de controle</string> - <string name="settings_summary_osd_show_inputs">Mostra quais botões estão sendo pressionados no canto inferior esquerdo da tela.</string> - <string name="touchscreen_controller_edit_menu">Editar Menu</string> - <string name="settings_achievements_category">Conta</string> - <string name="settings_achievements_global_settings">Configuração Global</string> - <string name="settings_category_achievements">Configuração de Conquista</string> - <string name="settings_multitap_mode">Modo Multitap</string> - <string name="settings_touchscreen_controller_port">Porta do controle em tela</string> - <string name="emulation_menu_load_state">Carregar Estado</string> - <string name="emulation_menu_save_state">Salvar Estado</string> - <string name="emulation_menu_toggle_fast_forward">Alternar Avanço Rápido</string> - <string name="emulation_menu_achievements">Conquistas</string> - <string name="emulation_menu_patch_codes">Trapaças</string> - <string name="emulation_menu_change_disc">Mudar Disco</string> - <string name="emulation_menu_touchscreen_controller_settings">Configuração do controle em tela</string> - <string name="emulation_menu_toggle_analog_mode">Alternar modo analógico do controle</string> - <string name="emulation_menu_reset_console">Reiniciar Console</string> - <string name="emulation_menu_exit_game">Sair do Jogo</string> - <string name="settings_use_software_renderer_for_readbacks">Usar rederizador por software para releituras</string> - <string name="settings_summary_use_software_renderer_for_readbacks">Executa o modo software em paralelo para releituras na memória de vídeo. Em alguns sistemas, pode resultar em maior desempenho ao usar aprimoramentos gráficos com o renderizador por hardware..</string> - <string name="settings_use_software_renderer">Usar modo Software</string> - <string name="settings_disable_widescreen">Desativar Hack de tela panorâmica</string> - <string name="settings_cdrom_seek_speedup">Velocidade de busca CD-ROM</string> - <string name="settings_summary_cdrom_seek_speedup">Aumenta a velocidade de leitura do CD-Rom. Só se aplica a velocidade de leitura em 2x para cima, configuração será ignorada quando usado para tocar CD\'s de música. Pode aumentar a velocidade de leitura em telas de carregamento em alguns jogos, ao custo de quebrar outros.</string> - <string name="settings_custom_aspect_ratio">Proporção da imagem customizada</string> - <string name="settings_summary_custom_aspect_ratio">Usada para quando a proporção de imagem é definida como customizada.</string> - <string name="controller_settings_category_auto_fire_buttons">Botões de auto disparo</string> - <string name="controller_settings_category_auto_fire_bindings">Botões de auto disparo (Gatilho)</string> - <string name="controller_settings_auto_fire_n_button">Auto disparo botão %d</string> - <string name="controller_settings_auto_fire_n_frequency">Auto disparo botão %d Frequência/Intervalo</string> - <string name="controller_binding_auto_fire_n">Auto disparo %d</string> - <string name="settings_category_cdrom">Configurações de CD-ROM</string> - <string name="settings_cdrom_read_thread">Usar Leitura Assíncrona</string> - <string name="settings_summary_read_thread">Reduz engasgos na emulação lendo / descomprimindo os arquivos da midia de forma assíncrona.</string> - <string name="settings_cdrom_load_image_patches">Aplicar Modificações</string> - <string name="settings_summary_load_image_patches">Aplica automaticamente \'modificações\' em jogos quando presentes no mesmo diretório. Atualmente só são aceitos modificações do tipo PPF.</string> - <string name="menu_edit_game_directories_force_saf">Forçar armazenamento com escopo</string> - <string name="settings_expand_to_cutout">Expandir para área cortada</string> - <string name="settings_summary_expand_to_cutout">Expande a área de exibição para incluir partes que foram removidas da imagem. Útil para telas curvas em que parte da imagem acaba de perdendo.</string> -</resources> diff --git a/android/app/src/main/res/values-ru/arrays.xml b/android/app/src/main/res/values-ru/arrays.xml deleted file mode 100644 index 522bd81b7..000000000 --- a/android/app/src/main/res/values-ru/arrays.xml +++ /dev/null @@ -1,277 +0,0 @@ -<resources> - <string-array name="settings_console_region_entries"> - <item>Автоопределение</item> - <item>NTSC-J (Япония)</item> - <item>NTSC-U (США)</item> - <item>PAL (Европа, Австралия)</item> - </string-array> - <string-array name="settings_cpu_execution_mode_entries"> - <item>Интерпретатор (самый медленный)</item> - <item>Кэшированный интерпретатор (быстрее)</item> - <item>Рекомпилятор (самый быстрый)</item> - </string-array> - <string-array name="settings_cpu_fastmem_mode_entries"> - <item>Выключен (самый медленный)</item> - <item>MMap (аппаратный, самый быстрый, только для 64-бит)</item> - <item>LUT (быстрее)</item> - </string-array> - <string-array name="gpu_renderer_entries"> - <item>Аппаратный (OpenGL)</item> - <item>Аппаратный (Vulkan)</item> - <item>Программный</item> - </string-array> - <string-array name="settings_gpu_resolution_scale_entries"> - <item>1x</item> - <item>2x</item> - <item>3x (720p)</item> - <item>4x</item> - <item>5x (1080p)</item> - <item>6x (1440p)</item> - <item>7x</item> - <item>8x</item> - <item>9x (4K)</item> - <item>10x</item> - <item>11x</item> - <item>12x</item> - <item>13x</item> - <item>14x</item> - <item>15x</item> - <item>16x</item> - </string-array> - <string-array name="settings_display_crop_mode_entries"> - <item>Нет</item> - <item>Только вылеты развёртки</item> - <item>Все границы</item> - </string-array> - <string-array name="settings_display_aspect_ratio_names"> - <item>Автонастройка (нативно игре)</item> - <item>Автонастройка (под экран)</item> - <item>Вручную</item> - <item>4:3</item> - <item>16:9</item> - <item>19:9</item> - <item>20:9</item> - <item>PAR 1:1</item> - </string-array> - <string-array name="settings_gpu_texture_filter_names"> - <item>Метод ближайшего соседа</item> - <item>Билинейная</item> - <item>Билинейная (без сглаживания краёв)</item> - <item>JINC2</item> - <item>JINC2 (без сглаживания краёв)</item> - <item>xBR</item> - <item>xBR (без сглаживания краёв)</item> - </string-array> - <string-array name="settings_controller_type_entries"> - <item>Нет</item> - <item>Цифровой</item> - <item>Аналоговый (DualShock)</item> - <item>Аналоговый джойстик</item> - <item>NeGcon</item> - <item>GunCon</item> - </string-array> - <string-array name="settings_memory_card_mode_entries"> - <item>Без карты памяти</item> - <item>Общая для всех игр</item> - <item>Своя карта для каждой игры (по коду)</item> - <item>Своя карта для каждой игры (по названию)</item> - </string-array> - <string-array name="emulation_touchscreen_menu"> - <item>Сменить вид</item> - <item>Настроить видимость</item> - <item>Добавить/убрать кнопки</item> - <item>Положение кнопок</item> - <item>Размер кнопок</item> - </string-array> - <string-array name="touchscreen_layout_menu"> - <item>Настроить видимость</item> - <item>Добавить/убрать кнопки</item> - <item>Положение кнопок</item> - <item>Размер кнопок</item> - <item>Сбросить макет</item> - <item>Закрыть редактор</item> - </string-array> - <string-array name="settings_cdrom_read_speedup_entries"> - <item>Нет (двойная скорость)</item> - <item>2x (скорость 4x)</item> - <item>3x (скорость 6x)</item> - <item>4x (скорость 8x)</item> - <item>5x (скорость 10x)</item> - <item>6x (скорость 12x)</item> - <item>7x (скорость 14x)</item> - <item>8x (скорость 16x)</item> - <item>9x (скорость 18x)</item> - <item>10x (скорость 20x)</item> - </string-array> - <string-array name="settings_touchscreen_controller_view_entries"> - <item>Нет</item> - <item>Цифровой</item> - <item>Аналоговый, один стик</item> - <item>Аналоговый, два стика</item> - <item>Световой пистолет</item> - </string-array> - <string-array name="settings_audio_backend_entries"> - <item>Нет (без звука)</item> - <item>Cubeb</item> - <item>OpenSL ES (рекомендовано)</item> - </string-array> - <string-array name="settings_audio_buffer_size_entries"> - <item>1024 блока (23.22 мс)</item> - <item>2048 блоков (46.44 мс, рекомендовано)</item> - <item>3072 блока (69.66 мс)</item> - <item>4096 блоков (92.88 мс)</item> - </string-array> - <string-array name="settings_log_level_entries"> - <item>Нет</item> - <item>Error</item> - <item>Warning</item> - <item>Performance Warnings</item> - <item>Information</item> - <item>Verbose</item> - <item>Developer</item> - <item>Profile</item> - <item>Debug</item> - <item>Trace</item> - </string-array> - <string-array name="settings_tabs"> - <item>Основные</item> - <item>Экран</item> - <item>Звук</item> - <item>Улучшения</item> - <item>Достижения</item> - <item>Расширенные</item> - </string-array> - <string-array name="settings_gpu_msaa_entries"> - <item>Выключен</item> - <item>2x MSAA</item> - <item>4x MSAA</item> - <item>8x MSAA</item> - <item>2x SSAA</item> - <item>4x SSAA</item> - <item>8x SSAA</item> - </string-array> - <string-array name="settings_advanced_display_fps_limit_entries"> - <item>Без ограничения (выводить все кадры)</item> - <item>10 FPS</item> - <item>15 FPS</item> - <item>30 FPS</item> - <item>45 FPS</item> - <item>60 FPS</item> - <item>75 FPS</item> - <item>90 FPS</item> - </string-array> - <string-array name="settings_emulation_speed_entries"> - <item>Без ограничения</item> - <item>10% [6 FPS (NTSC) / 5 FPS (PAL)]</item> - <item>20% [12 FPS (NTSC) / 10 FPS (PAL)]</item> - <item>30% [18 FPS (NTSC) / 15 FPS (PAL)]</item> - <item>40% [24 FPS (NTSC) / 20 FPS (PAL)]</item> - <item>50% [30 FPS (NTSC) / 25 FPS (PAL)]</item> - <item>60% [36 FPS (NTSC) / 30 FPS (PAL)]</item> - <item>70% [42 FPS (NTSC) / 35 FPS (PAL)]</item> - <item>80% [48 FPS (NTSC) / 40 FPS (PAL)]</item> - <item>90% [54 FPS (NTSC) / 45 FPS (PAL)]</item> - <item>100% [60 FPS (NTSC) / 50 FPS (PAL), по умолчанию]</item> - <item>125% [75 FPS (NTSC) / 62 FPS (PAL)]</item> - <item>150% [90 FPS (NTSC) / 75 FPS (PAL)]</item> - <item>175% [105 FPS (NTSC) / 87 FPS (PAL)]</item> - <item>200% [120 FPS (NTSC) / 100 FPS (PAL)]</item> - <item>250% [150 FPS (NTSC) / 125 FPS (PAL)]</item> - <item>300% [180 FPS (NTSC) / 150 FPS (PAL)]</item> - <item>350% [210 FPS (NTSC) / 175 FPS (PAL)]</item> - <item>400% [240 FPS (NTSC) / 200 FPS (PAL)]</item> - <item>450% [270 FPS (NTSC) / 225 FPS (PAL)]</item> - <item>500% [300 FPS (NTSC) / 250 FPS (PAL)]</item> - <item>600% [360 FPS (NTSC) / 300 FPS (PAL)]</item> - <item>700% [420 FPS (NTSC) / 350 FPS (PAL)]</item> - <item>800% [480 FPS (NTSC) / 400 FPS (PAL)]</item> - <item>900% [540 FPS (NTSC) / 450 FPS (PAL)]</item> - <item>1000% [600 FPS (NTSC) / 500 FPS (PAL)]</item> - </string-array> - <string-array name="settings_advanced_cpu_overclock_entries"> - <item>25% (8 МГц)</item> - <item>50% (16 МГц)</item> - <item>75% (24 МГц)</item> - <item>100% (33 МГц, по умолчанию)</item> - <item>125% (41 МГц)</item> - <item>150% (49 МГц)</item> - <item>175% (57 МГц)</item> - <item>200% (66 МГц)</item> - <item>225% (74 МГц)</item> - <item>250% (82 МГц)</item> - <item>275% (90 МГц)</item> - <item>300% (99 МГц)</item> - <item>350% (115 МГц)</item> - <item>400% (132 МГц)</item> - <item>450% (148 МГц)</item> - <item>500% (165 МГц)</item> - <item>500% (165 МГц)</item> - <item>600% (198 МГц)</item> - <item>700% (231 МГц)</item> - <item>800% (264 МГц)</item> - <item>900% (297 МГц)</item> - <item>1000% (330 МГц)</item> - </string-array> - <string-array name="settings_emulation_screen_orientation_entries"> - <item>По выбору системы</item> - <item>Портретная</item> - <item>Ландшафтная</item> - <item>По датчику положения</item> - </string-array> - <string-array name="settings_language_entries"> - <item>По выбору системы</item> - <item>Английский</item> - <item>Бразильский португальский</item> - <item>Итальянский</item> - <item>Нидерландский</item> - <item>Испанский</item> - <item>Русский</item> - </string-array> - <string-array name="settings_theme_entries"> - <item>По выбору системы</item> - <item>Светлая</item> - <item>Тёмная</item> - </string-array> - <string-array name="settings_downsample_mode_entries"> - <item>Выключен</item> - <item>Прямоугольный (понижать 3D/сглаживать всё)</item> - <item>Адаптивный (не понижать 3D/сглаживать 2D)</item> - </string-array> - <string-array name="settings_boolean_entries"> - <item>Выключено</item> - <item>Включено</item> - </string-array> - <string-array name="settings_multitap_mode_entries"> - <item>Отключен</item> - <item>Подключен к порту 1</item> - <item>Подключен к порту 2</item> - <item>Подключен к портам 1 и 2</item> - </string-array> - <string-array name="memory_card_editor_save_menu"> - <item>Скопировать сохранение</item> - <item>Удалить сохранение</item> - </string-array> - <string-array name="settings_touchscreen_controller_port_entries"> - <item>Порт 1</item> - <item>Порт 2</item> - <item>Multitap 3</item> - <item>Multitap 4</item> - <item>Multitap 5</item> - <item>Multitap 6</item> - <item>Multitap 7</item> - <item>Multitap 8</item> - </string-array> - <string-array name="settings_cdrom_seek_speedup_entries"> - <item>Нет (обычная скорость)</item> - <item>Без задержки</item> - <item>2x</item> - <item>3x</item> - <item>4x</item> - <item>5x</item> - <item>6x</item> - <item>7x</item> - <item>8x</item> - <item>9x</item> - <item>10x</item> - </string-array> -</resources> diff --git a/android/app/src/main/res/values-ru/strings.xml b/android/app/src/main/res/values-ru/strings.xml deleted file mode 100644 index c88009189..000000000 --- a/android/app/src/main/res/values-ru/strings.xml +++ /dev/null @@ -1,368 +0,0 @@ -<resources> - <string name="app_name">DuckStation</string> - <string name="action_settings">Настройки</string> - <string name="action_controller_mapping">Настройки управления</string> - <string name="title_activity_settings">Настройки</string> - <string name="settings_console_region">Регион консоли</string> - <string name="settings_console_tty_output">Вывод в TTY</string> - <string name="settings_console_fast_boot">Быстрый запуск</string> - <string name="settings_osd_show_messages">Показывать сообщения</string> - <string name="settings_osd_show_speed">Показывать скорость эмуляции</string> - <string name="settings_osd_show_show_fps">Показывать частоту кадров в игре</string> - <string name="settings_osd_show_show_vps">Показывать частоту кадров дисплея</string> - <string name="settings_cpu_execution_mode">Режим работы CPU</string> - <string name="settings_gpu_renderer">Графический движок</string> - <string name="settings_gpu_resolution_scale">Масштаб разрешения</string> - <string name="title_activity_emulation">EmulationActivity</string> - <string name="settings_emulation_speed">Скорость эмуляции</string> - <string name="settings_fast_forward_speed">Скорость перемотки</string> - <string name="settings_save_state_on_exit">Сохранять при выходе</string> - <string name="settings_emulation_screen_orientation">Ориентация экрана эмуляции</string> - <string name="settings_load_patch_codes">Загружать чит-коды</string> - <string name="settings_summary_save_state_on_exit">Автоматически сохранять состояние эмулятора при выходе. Позволяет продолжить игру с места остановки.</string> - <string name="settings_summary_load_patch_codes">Загружать чит-коды из cheats/<название игры>.cht в формате PCSXR или Libretro. Коды можно активировать после запуска игры.</string> - <string name="settings_apply_compatibility_settings">Применять настройки совместимости</string> - <string name="settings_summary_apply_compatibility_settings">Автоматически отключать улучшения, которые не поддерживаются играми.</string> - <string name="settings_summary_video_sync">Включите для синхронизации частоты обновления DuckStation с частотой экрана устройства. Синхронизация автоматически выключится, если скорость эмуляции не равна 100%.</string> - <string name="settings_video_sync">Видеосинхронизация</string> - <string name="settings_cpu_overclocking">Разгон CPU</string> - <string name="settings_cdrom_region_check">Проверка региона CD-ROM</string> - <string name="settings_summary_cdrom_region_check">Снижает вероятность некорректного определения региона диска эмулятором. Как правило, не влияет на стабильность.</string> - <string name="settings_cdrom_preload_image_to_ram">Предзагрузка образа CD-ROM в ОЗУ</string> - <string name="settings_summary_preload_image_to_ram">Загружать образ диска в оперативную память. Полезно при запуске игр с ненадёжных сетевых ресурсов. В некоторых случаях помогает устранить замедления при запуске игрой аудиодорожек.</string> - <string name="settings_pgxp_vertex_cache">Вершинный кэш PGXP</string> - <string name="settings_summary_pgxp_vertex_cache">Использовать координаты экрана в качестве резервных при отслеживании вершин с помощью отказов памяти. Может улучшать совместимость PGXP.</string> - <string name="settings_pgxp_cpu_mode">Режим CPU PGXP</string> - <string name="settings_summary_pgxp_cpu_mode">Пытаться отслеживать смещения вершин с помощью CPU. Требуется для правильной работы PGXP в некоторых играх. Существенно влияет на производительность.</string> - <string name="settings_cpu_recompiler_icache">Рекомпиляция кэша команд CPU</string> - <string name="settings_summary_cpu_recompiler_icache">Включить симуляцию кэша команд CPU в рекомпиляторе. Повышает точность, незначительно снижая производительность. Попробуйте включить, если игры идут слишком быстро.</string> - <string name="settings_cpu_recompiler_fastmem">Быстрый доступ к памяти в рекомпиляторе CPU</string> - <string name="settings_summary_cpu_recompiler_fastmem">Повышает эффективность доступа к гостевой памяти с помощью бэкпатчей и ошибок страниц. Отключите при нестабильной работе на устройстве.</string> - <string name="settings_presented_frame_limit">Ограничение частоты кадров</string> - <string name="settings_logging_level">Уровень логирования</string> - <string name="settings_log_to_file">Лог в файл</string> - <string name="settings_summary_log_to_file">Записывать сообщения лога в duckstation.log в папке эмулятора. Из-за снижения скорости эмуляции используйте только для отладки.</string> - <string name="settings_log_to_logcat">Лог в Logcat</string> - <string name="settings_summary_log_to_logcat">Записывать сообщения лога в журнал отладки Android. Полезно только при подключении к компьютеру с adb.</string> - <string name="settings_volume">Громкость</string> - <string name="settings_summary_volume">Изменение громкости звука эмулятора.</string> - <string name="settings_fast_forward_volume">Громкость при ускорении</string> - <string name="settings_summary_fast_forward_volume">Изменение громкости звука при ускоренной перемотке.</string> - <string name="settings_mute_all_sound">Отключить звук</string> - <string name="settings_summary_mute_all_sound">Отключает вывод звука в эмуляторе.</string> - <string name="settings_mute_cd_audio">Отключить CD аудио</string> - <string name="settings_summary_mute_cd_audio">Принудительное отключение CD-DA и XA дорожек диска. Может использоваться для отключения фоновой музыки в играх.</string> - <string name="settings_audio_backend">Аудио бэкенд</string> - <string name="settings_audio_buffer_size">Размер аудио буфера</string> - <string name="settings_summary_audio_buffer_size">Определяет задержку звука между обработкой и выводом. Меньшие значения снижают задержку, но вызывают треск при нестабильной скорости эмуляции.</string> - <string name="settings_audio_sync">Аудиосинхронизация</string> - <string name="settings_summary_audio_sync">Ускоряет эмуляцию в зависимости от скорости вывода блоков бэкендом. Помогает устранить искажения звука, если эмуляция идёт слишком быстро. Синхронизация автоматически выключается, если скорость эмуляции не равна 100%.</string> - <string name="settings_controller_type">Тип контроллера</string> - <string name="settings_enable_analog_mode_on_reset">Аналоговый режим при сбросе</string> - <string name="settings_touchscreen_controller_view">Вид экранного геймпада</string> - <string name="settings_auto_hide_touchscreen_controller">Автоотключение экранного геймпада</string> - <string name="settings_summary_auto_hide_touchscreen_controller">Скрывать экранный геймпад при подключении внешнего устройства ввода.</string> - <string name="settings_vibrate_on_press">Вибрация при касании</string> - <string name="settings_summary_vibrate_on_press">Включить короткую вибрацию при нажатии экранных кнопок. Виброотклик должен быть включен в настройках системы.</string> - <string name="settings_enable_vibration">Включить вибрацию</string> - <string name="settings_summary_enable_vibration">Перенаправлять отдачу в игре на вибромотор смартфона.</string> - <string name="settings_memory_card_1_type">Тип карты памяти 1</string> - <string name="settings_memory_card_2_type">Тип карты памяти 2</string> - <string name="settings_crop_mode">Режим обрезки</string> - <string name="settings_aspect_ratio">Соотношение сторон</string> - <string name="settings_linear_upscaling">Линейное масштабирование</string> - <string name="settings_integer_upscaling">Целочисленное масштабирование</string> - <string name="settings_summary_linear_upscaling">Сглаживает картинку при масштабировании изображения с консоли под экран.</string> - <string name="settings_summary_integer_upscaling">Добавляет пустое пространство к изображению, чтобы пиксельное соотношение устройства и консоли равнялось целому числу. Позволяет получить более чёткую картинку в 2D-играх.</string> - <string name="settings_summary_osd_show_messages">Выводить на экран сообщения о системных событиях, таких как сохранение/загрузка, снимок экрана и т.д.</string> - <string name="settings_summary_osd_show_speed">Показывать скорость эмуляции в процентах в правом верхнем углу экрана.</string> - <string name="settings_summary_osd_show_fps">Показывать внутреннюю частоту кадров игры в правом верхнем углу экрана.</string> - <string name="settings_summary_osd_show_vps">Показывать количество кадров (синхронизаций) в секунду в правом верхнем углу экрана.</string> - <string name="settings_cdrom_read_speedup">Ускорение чтения CD-ROM</string> - <string name="settings_summary_cdrom_read_speedup">Повышает скорость считывания диска на заданный множитель. Применяется только в режиме чтения с удвоенной скоростью и не учитывается при воспроизведении аудио. Ускоряет загрузки в некоторых играх, но может приводить к ошибкам.</string> - <string name="settings_summary_console_fast_boot">Пропускать заставку BIOS, загружаясь прямо в игру. Как правило, не влияет на стабильность.</string> - <string name="settings_msaa">Мультисэмплинг</string> - <string name="settings_true_color">Рендеринг в True Color (24-бита, без дизеринга)</string> - <string name="settings_summary_true_color">Обеспечивает более качественные градиенты, но меняет отображение некоторых цветов. Отключение опции также включает дизеринг. Совместимо с большинством игр.</string> - <string name="settings_scaled_dithering">Масштабировать дизеринг</string> - <string name="settings_summary_scaled_dithering">Масштабировать паттерн дизеринга под разрешение эмулируемого GPU, маскируя эффект зашумления на высоких разрешениях. Поддерживается только аппаратными рендерами и обычно не влияет на стабильность.</string> - <string name="settings_disable_interlacing">Отключить чересстрочность</string> - <string name="settings_summary_disable_interlacing">Принудительный рендеринг и вывод кадров в прогрессивной развёртке. Убирает эффект \"гребёнки\" для игр в 480i. Как правило, не влияет на стабильность.</string> - <string name="settings_texture_filtering">Фильтрация текстур</string> - <string name="settings_force_ntsc_timings">Принудительный NTSC-тайминг (PAL в 60 Гц)</string> - <string name="settings_summary_force_ntsc_timings">Использовать NTSC-тайминги кадра когда консоль в режиме PAL, тем самым принудительно запуская игры PAL в 60 Гц.</string> - <string name="settings_widescreen_hack">Широкоформатный хак</string> - <string name="settings_summary_widescreen_hack">Масштабировать позиции вершин в пространстве экрана до широкоформатных соотношений сторон, расширяя область обзора в 3D-играх с 4:3 до 16:9. Несовместимо с некоторыми играми.</string> - <string name="settings_force_4_3_for_24bit">Использовать 4:3 для 24-бит</string> - <string name="settings_summary_force_4_3_for_24bit">Переключаться обратно на соотношение сторон 4:3 при выводе 24-битного контента, например видео.</string> - <string name="settings_chroma_smoothing_24bit">Сглаживание цвета для 24-бит</string> - <string name="settings_summary_chrome_smoothing_24bit">Сглаживать блочность цветовых переходов в 24-битном контенте, например видео. Поддерживается только аппаратными рендерами.</string> - <string name="settings_pgxp_geometry_correction">Коррекция геометрии PGXP</string> - <string name="settings_summary_pgxp_geometry_correction">Уменьшает дрожание и неровность текстур, характерные для PS1. Поддерживается только аппаратными рендерами. Несовместимо с некоторыми играми.</string> - <string name="settings_pgxp_culling_correction">Коррекция выборки PGXP</string> - <string name="settings_summary_pgxp_culling_correction">Повышает точность отбраковки полигонов, снижая количество провалов в геометрии. Требуется включение коррекции геометрии.</string> - <string name="settings_pgxp_texture_correction">Коррекция текстур PGXP</string> - <string name="settings_summary_pgxp_texture_correction">Использовать перспективно-корректную интерполяцию координат текстур и цветов для выпрямления неровности текстур. Должна быть включена коррекция геометрии.</string> - <string name="settings_pgxp_preserve_projection_precision">Точность проекции PGXP</string> - <string name="settings_summary_pgxp_preserve_projection_precision">Включает повышенную точность PGXP. Может улучшать графику в некоторых играх, но в других вызывать ошибки.</string> - <string name="settings_pgxp_depth_buffer">Буфер глубины PGXP</string> - <string name="settings_summary_pgxp_depth_buffer">Пытаться устранять наложения полигонов проверкой пикселей по значениям глубины PGXP. Обладает низкой совместимостью, но в ряде игр даёт хороший эффект.</string> - <string name="menu_main_resume_last_session">Продолжить сеанс</string> - <string name="menu_main_start_file">Открыть файл</string> - <string name="menu_main_start_bios">Запустить BIOS</string> - <string name="menu_main_edit_game_directories">Настроить каталоги игр</string> - <string name="menu_main_scan_for_new_games">Обновить список игр</string> - <string name="menu_main_rescan_all_games">Проверить игры в списке</string> - <string name="menu_main_import_bios">Импортировать BIOS</string> - <string name="menu_main_show_version">Версия приложения</string> - <string name="menu_main_github_repository">Репозиторий GitHub</string> - <string name="menu_main_discord_server">Сервер Discord</string> - <string name="menu_game_list_entry_start_game">Запустить</string> - <string name="menu_game_list_entry_resume_game">Продолжить</string> - <string name="android_progress_callback_please_wait">Пожалуйста, подождите...</string> - <string name="android_progress_callback_ok">OK</string> - <string name="android_progress_callback_information">Информация</string> - <string name="android_progress_callback_confirmation">Подтверждение</string> - <string name="android_progress_callback_yes">Да</string> - <string name="android_progress_callback_no">Нет</string> - <string name="emulation_activity_error">Ошибка</string> - <string name="emulation_activity_ok">OK</string> - <string name="emulation_activity_import_patch_codes">Импорт чит-кодов...</string> - <string name="emulation_activity_patch_on">(ВКЛ)</string> - <string name="emulation_activity_patch_off">(ВЫКЛ)</string> - <string name="emulation_activity_choose_patch_code_file">Выберите файл с чит-кодами</string> - <string name="emulation_activity_failed_to_import_patch_codes">Не удалось импортировать чит-коды. Убедитесь, что выбранный файл в формате PCSXR или Libretro.</string> - <string name="main_activity_choose_directory">Выберите каталог</string> - <string name="main_activity_error">Ошибка</string> - <string name="main_activity_get_path_from_file_error">Не удалось получить путь к указанному файлу. Пожалуйста, убедитесь, что файл присутствует во внутреннем/внешнем хранилище. Нажмите значок настроек в окне выбора каталога. Включите отображение внутренней памяти. Нажмите кнопку меню и выберите устройство или SD-карту.</string> - <string name="main_activity_ok">OK</string> - <string name="main_activity_get_path_from_directory_error">Не удалось получить путь к указанному каталогу. Пожалуйста, убедитесь, что каталог присутствует во внутреннем/внешнем хранилище. Нажмите значок настроек в окне выбора каталога. Включите отображение внутренней памяти. Нажмите кнопку меню и выберите устройство или SD-карту.</string> - <string name="main_activity_external_storage_permissions_error">DuckStation требуется разрешение для доступа к внешнему хранилищу.</string> - <string name="main_activity_choose_disc_image">Выберите образ диска</string> - <string name="main_activity_missing_bios_image_prompt">Не найдены образы BIOS в папке bios эмулятора. Указать путь и импортировать образ BIOS сейчас?</string> - <string name="main_activity_missing_bios_image">Отсутствует образ BIOS</string> - <string name="main_activity_yes">Да</string> - <string name="main_activity_no">Нет</string> - <string name="main_activity_choose_bios_image">Выберите образ BIOS</string> - <string name="main_activity_failed_to_open_bios_image">Не удалось открыть образ BIOS.</string> - <string name="main_activity_failed_to_read_bios_image_prefix">\"Не удалось прочитать образ BIOS: \"</string> - <string name="main_activity_bios_image_too_large">Образ BIOS слишком большой. Вы должны выбрать образ BIOS, а не игру, и он должен быть размером 512 KB.</string> - <string name="main_activity_invalid_error">Образ BIOS неправильный или уже был импортирован.</string> - <string name="main_activity_show_version_title">Версия</string> - <string name="main_activity_copy">Копировать</string> - <string name="settings_gpu_thread">Рендеринг GPU в отдельном потоке</string> - <string name="settings_summary_gpu_thread">Использовать второй поток для отрисовки графики. В настоящее время поддерживается только программным рендерингом, существенно повышая производительность и не влияя на стабильность.</string> - <string name="settings_gpu_threaded_presentation">Вывод с GPU в отдельном потоке</string> - <string name="settings_summary_gpu_threaded_presentation">Выводить кадры в фоновом потоке когда не используется ускорение или видеосинхронизация. Может значительно повысить производительность при рендеринге на Vulkan.</string> - <string name="settings_language">Язык (требуется перезапуск)</string> - <string name="touchscreen_controller_stop_editing">Закрыть редактор</string> - <string name="touchscreen_controller_reset_layout">Сбросить макет</string> - <string name="emulation_activity_touchscreen_controller_not_active">Экранный геймпад неактивен.</string> - <string name="settings_theme">Тема</string> - <string name="settings_controller_mapping_summary">Настроить привязки подключенного геймпада к кнопкам и осям эмулируемого контроллера.</string> - <string name="settings_controller_mapping">Настройка геймпада</string> - <string name="controller_binding_dialog_message">Нажмите кнопку геймпада для установки новой привязки.\n\nТекущая привязка: %s</string> - <string name="controller_binding_dialog_no_binding"><Нет привязки></string> - <string name="controller_binding_dialog_cancel">Отмена</string> - <string name="controller_binding_dialog_clear">Удалить</string> - <string name="controller_mapping_activity_title">Управление</string> - <string name="controller_mapping_activity_no_profiles_found">Профили не найдены.</string> - <string name="controller_mapping_activity_select_input_profile">Профиль устройства ввода</string> - <string name="controller_mapping_activity_failed_to_load_profile">Не удалось загрузить профиль \'%s\'</string> - <string name="controller_mapping_activity_input_profile_name">Имя профиля ввода:</string> - <string name="controller_mapping_activity_save">Сохранить</string> - <string name="controller_mapping_activity_name_must_be_provided">Требуется ввести имя.</string> - <string name="controller_mapping_activity_failed_to_save_input_profile">Не удалось сохранить профиль ввода.</string> - <string name="controller_mapping_activity_input_profile_saved">Профиль ввода \'%s\' сохранён.</string> - <string name="controller_mapping_activity_cancel">Отмена</string> - <string name="settings_use_analog_sticks_for_dpad">Джойстик как d-pad в цифровом режиме</string> - <string name="settings_summary_enable_analog_mode_on_reset">Переключить контроллер в аналоговый режим при включении/перезагрузке консоли.</string> - <string name="settings_summary_use_analog_sticks_for_dpad">Использовать аналоговый джойстик как d-pad в цифровом режиме DualShock.</string> - <string name="settings_disable_all_enhancements">Отключить улучшения</string> - <string name="settings_summary_disable_all_enhancements">Временно отключить все улучшения. Используйте для отладки.</string> - <string name="settings_downsample_mode">Даунсэмплинг</string> - <string name="activity_game_properties">Свойства</string> - <string name="game_properties_preference_use_global_setting">Глобальная настройка</string> - <string name="settings_input_profile">Профиль ввода</string> - <string name="game_properties_tab_summary">Сведения</string> - <string name="game_properties_tab_game_settings">Настройки игры</string> - <string name="game_properties_tab_controller_settings">Настройки контроллера</string> - <string name="settings_audio_resampling">Аудио ресэмплинг</string> - <string name="settings_summary_audio_resampling">Изменять частоту звука вместо пропуска блоков, если скорость эмуляции отличается от 100%. Улучшает звук при ускорении/замедлении, незначительно влияя на производительность.</string> - <string name="settings_general_sync_to_host_refresh_rate">Синхронизировать с частотой хоста</string> - <string name="settings_summary_general_sync_to_host_refresh_rate">Подстраивать скорость эмуляции для совпадения частоты обновления консоли с частотой хоста, если включены Видеосинхронизация и Аудио ресэмплинг. Обеспечивает наиболее плавную анимацию за счёт возможного завышения скорости менее чем на 1%.</string> - <string name="settings_sustained_performance_mode">Режим устойчивой производительности</string> - <string name="settings_summary_sustained_performance_mode">Включить режим устойчивой производительности Андроид. Обеспечивает стабильный фреймрейт при продолжительных сеансах игры на некоторых устройствах.</string> - <string name="title_activity_game_directories">Настройка каталогов игр</string> - <string name="settings_game_directories">Каталоги игр</string> - <string name="settings_summary_game_directories">Редактировать список каталогов для поиска игр.</string> - <string name="game_directories_scanning_subdirectories">Сканировать подкаталоги.</string> - <string name="game_directories_not_scanning_subdirectories">Не сканировать подкаталоги.</string> - <string name="settings_display_all_frames">Оптимальное распределение кадров</string> - <string name="settings_summary_display_all_frames">Включение настройки гарантирует вывод всех кадров с консоли на экран для оптимального распределения. Попробуйте отключить, если не получается достичь полной скорости или есть проблемы со звуком.</string> - <string name="menu_edit_game_directories_add_directory">Добавить каталог</string> - <string name="menu_edit_game_directories_add_path">Добавить путь</string> - <string name="edit_game_directories_add_path">Добавить путь</string> - <string name="edit_game_directories_add_path_summary">Введите полный путь к каталогу с играми.\n\nВы можете уточнить его с помощью файлового менеджера.\n\nПример: /storage/emulated/0/games</string> - <string name="save_state_info_slot_is_empty">Свободный слот</string> - <string name="save_state_info_game_save_n">Сохранение %d</string> - <string name="save_state_info_global_save_n">Глобальное сохранение %d</string> - <string name="save_state_info_quick_save">Быстрое сохранение</string> - <string name="settings_osd_show_show_resolution">Показывать разрешение</string> - <string name="settings_summary_osd_show_resolution">Показывать разрешение рендеринга игры в правом верхнем углу экрана.</string> - <string name="settings_summary_display_stretch">Растягивать изображение до границ экрана.</string> - <string name="settings_display_stretch">Растягивать на весь экран</string> - <string name="settings_category_global">Основные настройки</string> - <string name="settings_category_display">Настройки экрана</string> - <string name="settings_category_audio">Настройки звука</string> - <string name="settings_category_console">Настройки консоли</string> - <string name="settings_category_cpu">Настройки CPU</string> - <string name="settings_category_gpu">Настройки GPU</string> - <string name="settings_category_logging">Настройки логирования</string> - <string name="dialog_done">Сохранить</string> - <string name="dialog_touchscreen_controller_type">Вид экранного геймпада</string> - <string name="dialog_touchscreen_controller_opacity">Видимость экранного геймпада</string> - <string name="dialog_touchscreen_controller_buttons">Кнопки экранного геймпада</string> - <string name="dialog_touchscreen_controller_settings">Настройки экранного геймпада</string> - <string name="settings_summary_console_tty_output">Выводить отладочную информацию по игре в консоль.</string> - <string name="action_show_game_list">Вид списка</string> - <string name="action_show_game_grid">Вид сетки</string> - <string name="settings_touch_gliding">Скольжение касаний</string> - <string name="settings_summary_touch_gliding">Позволяет нажимать комбинации кнопок скольжением пальца по экрану.</string> - <string name="menu_game_list_entry_game_properties">Свойства</string> - <string name="emulation_activity_change_disc_select_new_file">Выбрать файл...</string> - <string name="settings_achievements_enable">Включить достижения</string> - <string name="settings_summary_achievements_enable">Если опция включена и выполнен вход в учётную запись, DuckStation будет искать достижения при запуске игр.</string> - <string name="settings_achievements_challenge_mode">Режим хардкора</string> - <string name="settings_summary_achievements_challenge_mode">Соревновательный режим. Отключает сохранение состояния, чит-коды, возможность замедления, но удваивает количество получаемых очков достижений. Нельзя включить во время игры.</string> - <string name="settings_achievements_rich_presence">Расширенный статус</string> - <string name="settings_summary_achievements_rich_presence">Если поддерживается, собирать и отсылать на сервер расширенную информацию.</string> - <string name="settings_achievements_username">Имя пользователя</string> - <string name="settings_achievements_token_generation_time">Время генерации маркера доступа</string> - <string name="settings_achievements_login">Вход</string> - <string name="settings_summary_achievements_login">Войти в учётную запись для получения достижений.</string> - <string name="settings_achievements_register">Регистрация</string> - <string name="settings_summary_achievements_register">Открыть ссылку для создания новой учётной записи.</string> - <string name="settings_achievements_logout">Выход</string> - <string name="settings_summary_achievements_logout">Выйти из аккаунта. Получение достижений будет остановлено.</string> - <string name="settings_achievements_view_profile">Просмотр профиля</string> - <string name="settings_summary_achievements_view_profile">Открыть ссылку на ваш профиль.</string> - <string name="settings_achievements_test_mode">Тестовый режим</string> - <string name="settings_summary_achievements_test_mode">Если включено, DuckStation будет считать, что все достижения закрыты и не будет отправлять уведомления об открытии на сервер.</string> - <string name="settings_achievements_use_first_disc_from_playlist">Использовать первый диск в плейлисте</string> - <string name="settings_summary_achievements_use_first_disc_from_playlist">Если включено, для получения достижений будет использоваться первый диск в плейлисте, независимо от активного диска.</string> - <string name="achievement_settings_login_title">Вход в RetroAchievements</string> - <string name="achievement_settings_login_help">Пожалуйста, введите логин и пароль для retroachievements.org. Ваш пароль не хранится в DuckStation. Вместо этого будет сгенерирован маркер доступа.</string> - <string name="achievement_settings_login_username_hint">Логин</string> - <string name="achievement_settings_login_password_hint">Пароль</string> - <string name="achievement_settings_login_login_button">Вход</string> - <string name="achievement_settings_login_cancel_button">Отмена</string> - <string name="achievement_settings_login_failed">Ошибка входа. Пожалуйста, проверьте логин и пароль и повторите попытку.</string> - <string name="achievement_points_format_string">%d очков</string> - <string name="achievement_summary_format_string">Вы открыли %1$d из %2$d достижений, заработав %3$d очков из %4$d возможных.</string> - <string name="achievement_title_challenge_mode_format_string">%s (Режим хардкора)</string> - <string name="settings_achievements_disclaimer">DuckStation использует RetroAchievements (retroachievements.org) для отслеживания прогресса и получения данных о достижениях.</string> - <string name="settings_achievements_confirm_logout_title">Подтвердите выход</string> - <string name="settings_achievements_confirm_logout_message">Завершение сеанса отключит получение достижений до следующего входа в учётную запись. Открытые ранее достижения не будут утеряны.</string> - <string name="controller_binding_device_for_vibration">Вибрация для устройства</string> - <string name="controller_settings_tab_settings">Настройки</string> - <string name="controller_settings_tab_hotkeys">Горячие клавиши</string> - <string name="controller_settings_category_button_bindings">Привязки кнопок</string> - <string name="controller_settings_category_axis_bindings">Привязки осей</string> - <string name="controller_settings_category_settings">Настройки</string> - <string name="controller_settings_category_touchscreen_controller">Экранный геймпад</string> - <string name="controller_settings_category_ports">Порты</string> - <string name="controller_settings_main_port_format">Порт %d</string> - <string name="controller_settings_sub_port_format">Порт %1$d%2$c</string> - <string name="action_switch_view">Сменить вид</string> - <string name="title_activity_memory_card_editor">Редактор карт памяти</string> - <string name="action_memory_card_editor">Редактор карт памяти</string> - <string name="action_memory_card_editor_import_card">Импорт карты</string> - <string name="action_memory_card_editor_open_card">Открыть карту</string> - <string name="action_memory_card_editor_new_card">Новая карта</string> - <string name="action_memory_card_editor_format_card">Форматировать</string> - <string name="action_memory_card_editor_delete_card">Удалить карту</string> - <string name="memory_card_editor_no_cards_found">Карты памяти не найдены.</string> - <string name="memory_card_editor_card_already_open">Данная карта уже открыта.</string> - <string name="memory_card_editor_failed_to_open_card">Не удалось открыть или прочитать карту памяти.</string> - <string name="memory_card_editor_must_have_at_least_two_cards_to_copy">Для копирования требуется открыть минимум две карты памяти.</string> - <string name="memory_card_editor_copy_save_to">Скопировать %s в...</string> - <string name="memory_card_editor_select_card">Выбор карты</string> - <string name="memory_card_editor_error">Ошибка</string> - <string name="memory_card_editor_copy_insufficient_blocks">Для данного файла требуется %1$d блока, но свободно только %2$d.</string> - <string name="memory_card_editor_copy_already_exists">Файл \'%s\' уже создан на целевой карте памяти.</string> - <string name="memory_card_editor_copy_read_failed">Не удалось прочитать файл \'%s\' с исходной карты памяти.</string> - <string name="memory_card_editor_copy_write_failed">Не удалось записать файл \'%s\' на целевую карту памяти.</string> - <string name="memory_card_editor_copy_success">\'%1$s\' скопировано в \'%2$s\'.</string> - <string name="memory_card_editor_delete_confirm">Вы действительно хотите удалить сохранение \'%s\'?</string> - <string name="memory_card_editor_delete_success">Сохранение \'%s\' удалено.</string> - <string name="memory_card_editor_delete_failed">Не удалось удалить файл \'%s\'.</string> - <string name="memory_card_editor_no_card_selected">Карта не выбрана.</string> - <string name="memory_card_editor_import_failed">Не удалось импортировать карту памяти. Возможно, формат не поддерживается.</string> - <string name="memory_card_editor_delete_card_confirm_message">Карта памяти \'%s\' будет удалена без возможности восстановления. Вы действительно хотите удалить данную карту?</string> - <string name="memory_card_editor_delete_card_failed">Не удалось удалить \'%s\'.</string> - <string name="memory_card_editor_delete_card_success">Карта \'%s\' удалена.</string> - <string name="memory_card_editor_format_card_confirm_message">Карта памяти \'%s\' будет отформатирована с удалением всех сохранений. Вы действительно хотите отформатировать данную карту?</string> - <string name="memory_card_editor_format_card_failed">Не удалось отформатировать \'%s\'.</string> - <string name="memory_card_editor_format_card_success">Карта \'%s\' отформатирована.</string> - <string name="memory_card_editor_import_card_confirm_message">Импортирование \'%1$s\' удалит все сохранения на \'%2$s\'. Продолжить?</string> - <string name="memory_card_editor_import_card_read_failed">Не удалось прочитать \'%s\'.</string> - <string name="memory_card_editor_import_card_failed">Не удалось импортировать карту \'%s\'. Возможно, формат не поддерживается.</string> - <string name="memory_card_editor_import_card_success">Карта \'%s\' импортирована.</string> - <string name="menu_game_list_entry_choose_cover_image">Обложка</string> - <string name="controller_settings_vibration_unsupported">Данное устройство не поддерживает вибрацию.</string> - <string name="controller_settings_automatic_mapping">Выполнить автонастройку</string> - <string name="controller_settings_summary_automatic_mapping">Попытаться автоматически привязать все кнопки/оси для подключенного устройства.</string> - <string name="controller_settings_clear_controller_bindings">Сброс привязок</string> - <string name="controller_settings_summary_clear_controller_bindings">Удалить привязки для всех кнопок и осей текущего устройства.</string> - <string name="controller_settings_clear_controller_bindings_confirm">Вы действительно хотите удалить все привязки? Это действие нельзя отменить.</string> - <string name="controller_settings_clear_controller_bindings_done">Удалены привязки для устройства %d.</string> - <string name="controller_auto_mapping_no_devices">Подходящие устройства не найдены. Автонастройка поддерживается только для геймпадов. Вы можете настроить прочие устройства вручную.</string> - <string name="controller_auto_mapping_select_device">Выбор устройства</string> - <string name="controller_auto_mapping_results">Результаты автонастройки</string> - <string name="main_activity_empty_game_list_title">Игры не найдены. Пожалуйста, добавьте каталог с играми или выберите файл вручную.</string> - <string name="main_activity_empty_game_list_supported_formats">Поддерживаемые форматы:\n\n%s\n\nДля игр в формате bin требуется наличие файла разметки (.cue).</string> - <string name="main_activity_empty_game_list_add_directory">Добавить каталог с играми</string> - <string name="main_activity_empty_game_list_start_file">Открыть файл</string> - <string name="update_notes_title">Примечание к обновлению</string> - <string name="update_notes_message_version_controller_update">В данном обновлении DuckStation добавлена возможность подключения нескольких геймпадов с поддержкой отдачи, поддержка клавиатур, возможность привязки действий к кнопкам громкости.\n\nТребуется перенастроить привязки геймпадов, иначе они перестанут функционировать. Выполнить это сейчас?</string> - <string name="settings_osd_show_show_inputs">Показывать нажатия контроллера</string> - <string name="settings_summary_osd_show_inputs">Показывать системное состояние контроллера в левом нижнем углу экрана.</string> - <string name="touchscreen_controller_edit_menu">Меню редактора</string> - <string name="settings_achievements_category">Учётная запись</string> - <string name="settings_achievements_global_settings">Глобальные настройки</string> - <string name="settings_category_achievements">Настройки достижений</string> - <string name="settings_multitap_mode">Режим Multitap</string> - <string name="settings_touchscreen_controller_port">Порт экранного геймпада</string> - <string name="emulation_menu_load_state">Загрузить состояние</string> - <string name="emulation_menu_save_state">Сохранить состояние</string> - <string name="emulation_menu_toggle_fast_forward">Вкл./выкл. ускорение</string> - <string name="emulation_menu_achievements">Достижения</string> - <string name="emulation_menu_patch_codes">Чит-коды</string> - <string name="emulation_menu_change_disc">Сменить диск</string> - <string name="emulation_menu_touchscreen_controller_settings">Экранный геймпад</string> - <string name="emulation_menu_toggle_analog_mode">Режим контроллера</string> - <string name="emulation_menu_reset_console">Сброс консоли</string> - <string name="emulation_menu_exit_game">Закрыть игру</string> - <string name="settings_use_software_renderer_for_readbacks">Софт-рендер для обратных считываний</string> - <string name="settings_summary_use_software_renderer_for_readbacks">Запускать параллельно программный рендер для обратных считываний VRAM. На некоторых устройствах может существенно повысить скорость при использовании улучшений на аппаратном рендеринге.</string> - <string name="settings_use_software_renderer">Использовать программный рендер</string> - <string name="settings_disable_widescreen">Отключить широкоформатный режим</string> - <string name="settings_cdrom_seek_speedup">Ускорение поиска по CD-ROM</string> - <string name="settings_summary_cdrom_seek_speedup">Повышает скорость поиска по диску на указанный множитель. В некоторых играх ускоряет подгрузки, но может приводить к ошибкам.</string> - <string name="settings_custom_aspect_ratio">Ручная установка соотношения сторон</string> - <string name="settings_summary_custom_aspect_ratio">Применяется, если для соотношения сторон выбрана ручная настройка.</string> - <string name="controller_settings_category_auto_fire_buttons">Турбо-кнопки</string> - <string name="controller_settings_category_auto_fire_bindings">Активаторы турбо</string> - <string name="controller_settings_auto_fire_n_button">Турбо-кнопка %d</string> - <string name="controller_settings_auto_fire_n_frequency">Частота/интервал турбо %d</string> - <string name="controller_binding_auto_fire_n">Турбо %d</string> - <string name="settings_category_cdrom">Настройки CD-ROM</string> - <string name="settings_cdrom_read_thread">Производить чтение в потоке (асинхронно)</string> - <string name="settings_summary_read_thread">Уменьшает задержки в эмуляции с помощью асинхронного чтения/распаковки данных диска в рабочем потоке.</string> - <string name="settings_cdrom_load_image_patches">Применять патчи к образам</string> - <string name="settings_summary_load_image_patches">Автоматически применять патчи к образам дисков при их наличии. В настоящее время поддерживается только формат PPF.</string> - <string name="menu_edit_game_directories_force_saf">Вкл. Scoped Storage</string> - <string name="settings_expand_to_cutout">Добавлять область выреза</string> - <string name="settings_summary_expand_to_cutout">Расширяет изображение, используя область выреза.</string> -</resources> diff --git a/android/app/src/main/res/values/arrays.xml b/android/app/src/main/res/values/arrays.xml deleted file mode 100644 index 4d214c260..000000000 --- a/android/app/src/main/res/values/arrays.xml +++ /dev/null @@ -1,525 +0,0 @@ -<resources> - <string-array name="settings_console_region_entries"> - <item>Auto-Detect</item> - <item>NTSC-J (Japan)</item> - <item>NTSC-U (US)</item> - <item>PAL (Europe, Australia)</item> - </string-array> - <string-array name="settings_console_region_values"> - <item>Auto</item> - <item>NTSC-J</item> - <item>NTSC-U</item> - <item>PAL</item> - </string-array> - <string-array name="settings_cpu_execution_mode_entries"> - <item>Interpreter (Slowest)</item> - <item>Cached Interpreter (Faster)</item> - <item>Recompiler (Fastest)</item> - </string-array> - <string-array name="settings_cpu_execution_mode_values"> - <item>Interpreter</item> - <item>CachedInterpreter</item> - <item>Recompiler</item> - </string-array> - <string-array name="settings_cpu_fastmem_mode_entries"> - <item>Disabled (Slowest)</item> - <item>MMap (Hardware, Fastest, 64-Bit Only)</item> - <item>LUT (Faster)</item> - </string-array> - <string-array name="settings_cpu_fastmem_mode_values"> - <item>Disabled</item> - <item>MMap</item> - <item>LUT</item> - </string-array> - <string-array name="gpu_renderer_entries"> - <item>Hardware (OpenGL)</item> - <item>Hardware (Vulkan)</item> - <item>Software</item> - </string-array> - <string-array name="gpu_renderer_values"> - <item>OpenGL</item> - <item>Vulkan</item> - <item>Software</item> - </string-array> - <string-array name="settings_gpu_resolution_scale_entries"> - <item>1x</item> - <item>2x</item> - <item>3x (for 720p)</item> - <item>4x</item> - <item>5x (for 1080p)</item> - <item>6x (for 1440p)</item> - <item>7x</item> - <item>8x</item> - <item>9x (for 4K)</item> - <item>10x</item> - <item>11x</item> - <item>12x</item> - <item>13x</item> - <item>14x</item> - <item>15x</item> - <item>16x</item> - </string-array> - <string-array name="settings_gpu_resolution_scale_values"> - <item>1</item> - <item>2</item> - <item>3</item> - <item>4</item> - <item>5</item> - <item>6</item> - <item>7</item> - <item>8</item> - <item>9</item> - <item>10</item> - <item>11</item> - <item>12</item> - <item>13</item> - <item>14</item> - <item>15</item> - <item>16</item> - </string-array> - <string-array name="settings_display_crop_mode_entries"> - <item>None</item> - <item>Only Overscan Area</item> - <item>All Borders</item> - </string-array> - <string-array name="settings_display_crop_mode_values"> - <item>None</item> - <item>Overscan</item> - <item>Borders</item> - </string-array> - <string-array name="settings_display_aspect_ratio_names"> - <item>Auto (Game Native)</item> - <item>Auto (Match Display)</item> - <item>Custom</item> - <item>4:3</item> - <item>16:9</item> - <item>19:9</item> - <item>20:9</item> - <item>PAR 1:1</item> - </string-array> - <string-array name="settings_display_aspect_ratio_values"> - <item>Auto (Game Native)</item> - <item>Auto (Match Window)</item> - <item>Custom</item> - <item>4:3</item> - <item>16:9</item> - <item>19:9</item> - <item>20:9</item> - <item>PAR 1:1</item> - </string-array> - <string-array name="settings_gpu_texture_filter_names"> - <item>Nearest-Neighbor</item> - <item>Bilinear</item> - <item>Bilinear (No Edge Blending)</item> - <item>JINC2</item> - <item>JINC2 (No Edge Blending)</item> - <item>xBR</item> - <item>xBR (No Edge Blending)</item> - </string-array> - <string-array name="settings_gpu_texture_filter_values"> - <item>Nearest</item> - <item>Bilinear</item> - <item>BilinearBinAlpha</item> - <item>JINC2</item> - <item>JINC2BinAlpha</item> - <item>xBR</item> - <item>xBRBinAlpha</item> - </string-array> - <string-array name="settings_controller_type_entries"> - <item>None</item> - <item>Digital Controller (Gamepad)</item> - <item>Analog Controller (DualShock)</item> - <item>Analog Joystick</item> - <item>NeGcon</item> - <item>GunCon</item> - </string-array> - <string-array name="settings_controller_type_values"> - <item>None</item> - <item>DigitalController</item> - <item>AnalogController</item> - <item>AnalogJoystick</item> - <item>NeGcon</item> - <item>NamcoGunCon</item> - </string-array> - <string-array name="settings_memory_card_mode_entries"> - <item>No Memory Card</item> - <item>Shared Between All Games</item> - <item>Separate Card Per Game (Game Code)</item> - <item>Separate Card Per Game (Game Title)</item> - </string-array> - <string-array name="settings_memory_card_mode_values"> - <item>None</item> - <item>Shared</item> - <item>PerGame</item> - <item>PerGameTitle</item> - </string-array> - <string-array name="emulation_touchscreen_menu"> - <item>Change Type</item> - <item>Change Opacity</item> - <item>Add/Remove Buttons</item> - <item>Move Buttons</item> - <item>Resize Buttons</item> - </string-array> - <string-array name="touchscreen_layout_menu"> - <item>Change Opacity</item> - <item>Add/Remove Buttons</item> - <item>Move Buttons</item> - <item>Resize Buttons</item> - <item>Reset Layout</item> - <item>Exit Editor</item> - </string-array> - <string-array name="settings_cdrom_read_speedup_entries"> - <item>None (Double Speed)</item> - <item>2x (Quad Speed)</item> - <item>3x (6x Speed)</item> - <item>4x (8x Speed)</item> - <item>5x (10x Speed)</item> - <item>6x (12x Speed)</item> - <item>7x (14x Speed)</item> - <item>8x (16x Speed)</item> - <item>9x (18x Speed)</item> - <item>10x (20x Speed)</item> - </string-array> - <string-array name="settings_cdrom_read_speedup_values"> - <item>1</item> - <item>2</item> - <item>3</item> - <item>4</item> - <item>5</item> - <item>6</item> - <item>7</item> - <item>8</item> - <item>9</item> - <item>10</item> - </string-array> - <string-array name="settings_touchscreen_controller_view_entries"> - <item>None</item> - <item>Digital Pad</item> - <item>Single Analog Pad</item> - <item>Dual Analog Pad</item> - <item>Lightgun</item> - </string-array> - <string-array name="settings_touchscreen_controller_view_values"> - <item>none</item> - <item>digital</item> - <item>analog_stick</item> - <item>analog_sticks</item> - <item>lightgun</item> - </string-array> - <string-array name="settings_audio_backend_entries"> - <item>Null (No Output)</item> - <item>Cubeb</item> - <item>OpenSL ES (Recommended)</item> - </string-array> - <string-array name="settings_audio_backend_values"> - <item>Null</item> - <item>Cubeb</item> - <item>OpenSLES</item> - </string-array> - <string-array name="settings_audio_buffer_size_entries"> - <item>1024 Frames (23.22ms)</item> - <item>2048 Frames (46.44ms, Recommended)</item> - <item>3072 Frames (69.66ms)</item> - <item>4096 Frames (92.88ms)</item> - </string-array> - <string-array name="settings_audio_buffer_size_values"> - <item>1024</item> - <item>2048</item> - <item>3072</item> - <item>4096</item> - </string-array> - <string-array name="settings_log_level_entries"> - <item>None</item> - <item>Error</item> - <item>Warning</item> - <item>Performance Warnings</item> - <item>Information</item> - <item>Verbose</item> - <item>Developer</item> - <item>Profile</item> - <item>Debug</item> - <item>Trace</item> - </string-array> - <string-array name="settings_log_level_values"> - <item>None</item> - <item>Error</item> - <item>Warning</item> - <item>Perf</item> - <item>Info</item> - <item>Verbose</item> - <item>Dev</item> - <item>Profile</item> - <item>Debug</item> - <item>Trace</item> - </string-array> - <string-array name="settings_tabs"> - <item>General</item> - <item>Display</item> - <item>Audio</item> - <item>Enhancements</item> - <item>Achievements</item> - <item>Advanced</item> - </string-array> - <string-array name="settings_gpu_msaa_entries"> - <item>Disabled</item> - <item>2x MSAA</item> - <item>4x MSAA</item> - <item>8x MSAA</item> - <item>2x SSAA</item> - <item>4x SSAA</item> - <item>8x SSAA</item> - </string-array> - <string-array name="settings_gpu_msaa_values"> - <item>1</item> - <item>2</item> - <item>4</item> - <item>8</item> - <item>2-ssaa</item> - <item>4-ssaa</item> - <item>8-ssaa</item> - </string-array> - <string-array name="settings_advanced_display_fps_limit_entries"> - <item>Unlimited (Display All Frames)</item> - <item>10 FPS</item> - <item>15 FPS</item> - <item>30 FPS</item> - <item>45 FPS</item> - <item>60 FPS</item> - <item>75 FPS</item> - <item>90 FPS</item> - </string-array> - <string-array name="settings_advanced_display_fps_limit_values"> - <item>0</item> - <item>10</item> - <item>15</item> - <item>30</item> - <item>45</item> - <item>60</item> - <item>75</item> - <item>90</item> - </string-array> - <string-array name="settings_emulation_speed_entries"> - <item>Unlimited</item> - <item>10% [6 FPS (NTSC) / 5 FPS (PAL)]</item> - <item>20% [12 FPS (NTSC) / 10 FPS (PAL)]</item> - <item>30% [18 FPS (NTSC) / 15 FPS (PAL)]</item> - <item>40% [24 FPS (NTSC) / 20 FPS (PAL)]</item> - <item>50% [30 FPS (NTSC) / 25 FPS (PAL)]</item> - <item>60% [36 FPS (NTSC) / 30 FPS (PAL)]</item> - <item>70% [42 FPS (NTSC) / 35 FPS (PAL)]</item> - <item>80% [48 FPS (NTSC) / 40 FPS (PAL)]</item> - <item>90% [54 FPS (NTSC) / 45 FPS (PAL)]</item> - <item>100% [60 FPS (NTSC) / 50 FPS (PAL), Default]</item> - <item>125% [75 FPS (NTSC) / 62 FPS (PAL)]</item> - <item>150% [90 FPS (NTSC) / 75 FPS (PAL)]</item> - <item>175% [105 FPS (NTSC) / 87 FPS (PAL)]</item> - <item>200% [120 FPS (NTSC) / 100 FPS (PAL)]</item> - <item>250% [150 FPS (NTSC) / 125 FPS (PAL)]</item> - <item>300% [180 FPS (NTSC) / 150 FPS (PAL)]</item> - <item>350% [210 FPS (NTSC) / 175 FPS (PAL)]</item> - <item>400% [240 FPS (NTSC) / 200 FPS (PAL)]</item> - <item>450% [270 FPS (NTSC) / 225 FPS (PAL)]</item> - <item>500% [300 FPS (NTSC) / 250 FPS (PAL)]</item> - <item>600% [360 FPS (NTSC) / 300 FPS (PAL)]</item> - <item>700% [420 FPS (NTSC) / 350 FPS (PAL)]</item> - <item>800% [480 FPS (NTSC) / 400 FPS (PAL)]</item> - <item>900% [540 FPS (NTSC) / 450 FPS (PAL)]</item> - <item>1000% [600 FPS (NTSC) / 500 FPS (PAL)]</item> - </string-array> - <string-array name="settings_emulation_speed_values"> - <item>0.0</item> - <item>0.1</item> - <item>0.2</item> - <item>0.3</item> - <item>0.4</item> - <item>0.5</item> - <item>0.6</item> - <item>0.7</item> - <item>0.8</item> - <item>0.9</item> - <item>1.0</item> - <item>1.25</item> - <item>1.5</item> - <item>1.75</item> - <item>2.0</item> - <item>2.5</item> - <item>3.0</item> - <item>3.5</item> - <item>4.0</item> - <item>4.5</item> - <item>5.0</item> - <item>6.0</item> - <item>7.0</item> - <item>8.0</item> - <item>9.0</item> - <item>10.0</item> - </string-array> - <string-array name="settings_advanced_cpu_overclock_entries"> - <item>25% (8MHz)</item> - <item>50% (16MHz)</item> - <item>75% (24MHz)</item> - <item>100% (33MHz, Default)</item> - <item>125% (41MHz)</item> - <item>150% (49MHz)</item> - <item>175% (57MHz)</item> - <item>200% (66MHz)</item> - <item>225% (74MHz)</item> - <item>250% (82MHz)</item> - <item>275% (90MHz)</item> - <item>300% (99MHz)</item> - <item>350% (115MHz)</item> - <item>400% (132MHz)</item> - <item>450% (148MHz)</item> - <item>500% (165MHz)</item> - <item>500% (165MHz)</item> - <item>600% (198MHz)</item> - <item>700% (231MHz)</item> - <item>800% (264MHz)</item> - <item>900% (297MHz)</item> - <item>1000% (330MHz)</item> - </string-array> - <string-array name="settings_advanced_cpu_overclock_values"> - <item>25</item> - <item>50</item> - <item>75</item> - <item>100</item> - <item>125</item> - <item>150</item> - <item>175</item> - <item>200</item> - <item>225</item> - <item>250</item> - <item>275</item> - <item>300</item> - <item>350</item> - <item>400</item> - <item>450</item> - <item>500</item> - <item>500</item> - <item>600</item> - <item>700</item> - <item>800</item> - <item>900</item> - <item>1000</item> - </string-array> - <string-array name="settings_emulation_screen_orientation_entries"> - <item>Use Device Setting</item> - <item>Portrait</item> - <item>Landscape</item> - <item>Sensor Based</item> - </string-array> - <string-array name="settings_emulation_screen_orientation_values"> - <item>unspecified</item> - <item>portrait</item> - <item>landscape</item> - <item>sensor</item> - </string-array> - <string-array name="settings_language_entries"> - <item>Use Device Setting</item> - <item>English</item> - <item>Portuguese (pt) in Brazil (BR)</item> - <item>Italian (it)</item> - <item>Dutch (nl)</item> - <item>Spanish (es)</item> - <item>Russian (ru)</item> - </string-array> - <string-array name="settings_language_values"> - <item>none</item> - <item>en-EN</item> - <item>pt-rBR</item> - <item>it-IT</item> - <item>nl-NL</item> - <item>es-ES</item> - <item>ru-RU</item> - </string-array> - <string-array name="settings_theme_entries"> - <item>Follow System</item> - <item>Light</item> - <item>Dark</item> - </string-array> - <string-array name="settings_theme_values"> - <item>follow_system</item> - <item>light</item> - <item>dark</item> - </string-array> - <string-array name="settings_downsample_mode_entries"> - <item>Disabled</item> - <item>Box (Downsample 3D/Smooth All)</item> - <item>Adaptive (Preserve 3D/Smooth 2D)</item> - </string-array> - <string-array name="settings_downsample_mode_values"> - <item>Disabled</item> - <item>Box</item> - <item>Adaptive</item> - </string-array> - <string-array name="settings_boolean_entries"> - <item>Disabled</item> - <item>Enabled</item> - </string-array> - <string-array name="settings_boolean_values"> - <item>false</item> - <item>true</item> - </string-array> - <string-array name="settings_multitap_mode_entries"> - <item>Disabled</item> - <item>Enable on Port 1 Only</item> - <item>Enable on Port 2 Only</item> - <item>Enable on Ports 1 and 2</item> - </string-array> - <string-array name="settings_multitap_mode_values"> - <item>Disabled</item> - <item>Port1Only</item> - <item>Port2Only</item> - <item>BothPorts</item> - </string-array> - <string-array name="memory_card_editor_save_menu"> - <item>Copy Save</item> - <item>Delete Save</item> - </string-array> - <string-array name="settings_touchscreen_controller_port_entries"> - <item>Port 1</item> - <item>Port 2</item> - <item>Multitap 3</item> - <item>Multitap 4</item> - <item>Multitap 5</item> - <item>Multitap 6</item> - <item>Multitap 7</item> - <item>Multitap 8</item> - </string-array> - <string-array name="settings_touchscreen_controller_port_values"> - <item>0</item> - <item>1</item> - <item>2</item> - <item>3</item> - <item>4</item> - <item>5</item> - <item>6</item> - <item>7</item> - </string-array> - <string-array name="settings_cdrom_seek_speedup_entries"> - <item>None (Normal Speed)</item> - <item>Infinite/Instantaneous</item> - <item>2x</item> - <item>3x</item> - <item>4x</item> - <item>5x</item> - <item>6x</item> - <item>7x</item> - <item>8x</item> - <item>9x</item> - <item>10x</item> - </string-array> - <string-array name="settings_cdrom_seek_speedup_values"> - <item>1</item> - <item>0</item> - <item>2</item> - <item>3</item> - <item>4</item> - <item>5</item> - <item>6</item> - <item>7</item> - <item>8</item> - <item>9</item> - <item>10</item> - </string-array> -</resources> diff --git a/android/app/src/main/res/values/attrs.xml b/android/app/src/main/res/values/attrs.xml deleted file mode 100644 index 7ce840eb6..000000000 --- a/android/app/src/main/res/values/attrs.xml +++ /dev/null @@ -1,12 +0,0 @@ -<resources> - - <!-- Declare custom theme attributes that allow changing which styles are - used for button bars depending on the API level. - ?android:attr/buttonBarStyle is new as of API 11 so this is - necessary to support previous API levels. --> - <declare-styleable name="ButtonBarContainerTheme"> - <attr name="metaButtonBarStyle" format="reference" /> - <attr name="metaButtonBarButtonStyle" format="reference" /> - </declare-styleable> - -</resources> diff --git a/android/app/src/main/res/values/attrs_touchscreen_controller_button_view.xml b/android/app/src/main/res/values/attrs_touchscreen_controller_button_view.xml deleted file mode 100644 index e9dacf26a..000000000 --- a/android/app/src/main/res/values/attrs_touchscreen_controller_button_view.xml +++ /dev/null @@ -1,6 +0,0 @@ -<resources> - <declare-styleable name="TouchscreenControllerButtonView"> - <attr name="unpressedDrawable" format="color|reference" /> - <attr name="pressedDrawable" format="color|reference" /> - </declare-styleable> -</resources> diff --git a/android/app/src/main/res/values/colors.xml b/android/app/src/main/res/values/colors.xml deleted file mode 100644 index a66a016b2..000000000 --- a/android/app/src/main/res/values/colors.xml +++ /dev/null @@ -1,12 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<resources> - <color name="colorPrimary">#6200EE</color> - <color name="colorPrimaryDark">#3700B3</color> - <color name="colorAccent">#D81B60</color> - <color name="colorNavigation">#000000</color> - - <color name="black_overlay">#66000000</color> - <color name="fab_background">#ffffffff</color> - - <color name="emulationActivityPauseBackground">#eeffffff</color> -</resources> diff --git a/android/app/src/main/res/values/dimens.xml b/android/app/src/main/res/values/dimens.xml deleted file mode 100644 index 59a0b0c4f..000000000 --- a/android/app/src/main/res/values/dimens.xml +++ /dev/null @@ -1,3 +0,0 @@ -<resources> - <dimen name="fab_margin">16dp</dimen> -</resources> diff --git a/android/app/src/main/res/values/ic_launcher_background.xml b/android/app/src/main/res/values/ic_launcher_background.xml deleted file mode 100644 index c5d5899fd..000000000 --- a/android/app/src/main/res/values/ic_launcher_background.xml +++ /dev/null @@ -1,4 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<resources> - <color name="ic_launcher_background">#FFFFFF</color> -</resources> \ No newline at end of file diff --git a/android/app/src/main/res/values/strings.xml b/android/app/src/main/res/values/strings.xml deleted file mode 100644 index e3ddc5a3a..000000000 --- a/android/app/src/main/res/values/strings.xml +++ /dev/null @@ -1,368 +0,0 @@ -<resources> - <string name="app_name">DuckStation</string> - <string name="action_settings">Settings</string> - <string name="action_controller_mapping">Controller Settings</string> - <string name="title_activity_settings">Settings</string> - <string name="settings_console_region">Console Region</string> - <string name="settings_console_tty_output">Enable TTY Output</string> - <string name="settings_console_fast_boot">Fast Boot</string> - <string name="settings_osd_show_messages">Show Messages</string> - <string name="settings_osd_show_speed">Show Emulation Speed</string> - <string name="settings_osd_show_show_fps">Show Game Frame Rate</string> - <string name="settings_osd_show_show_vps">Show Display FPS</string> - <string name="settings_cpu_execution_mode">CPU Execution Mode</string> - <string name="settings_gpu_renderer">GPU Renderer</string> - <string name="settings_gpu_resolution_scale">Resolution Scale</string> - <string name="title_activity_emulation">EmulationActivity</string> - <string name="settings_emulation_speed">Emulation Speed</string> - <string name="settings_fast_forward_speed">Fast Forward Speed</string> - <string name="settings_save_state_on_exit">Save State On Exit</string> - <string name="settings_emulation_screen_orientation">Emulation Screen Orientation</string> - <string name="settings_load_patch_codes">Load Patch Codes</string> - <string name="settings_summary_save_state_on_exit">Automatically saves the emulator state when powering down or exiting. You can then resume directly from where you left off next time.</string> - <string name="settings_summary_load_patch_codes"><![CDATA[Loads patch codes from cheats/<game name>.cht in PCSXR format. Codes can be toggled while ingame.]]></string> - <string name="settings_apply_compatibility_settings">Apply Compatibility Settings</string> - <string name="settings_summary_apply_compatibility_settings">Automatically disable enhancements when they are not supported by games.</string> - <string name="settings_summary_video_sync">Enable this option to match DuckStation\'s refresh rate with your current monitor or screen. VSync is automatically disabled when it is not possible (e.g. running at non-100% speed).</string> - <string name="settings_video_sync">Video Sync</string> - <string name="settings_cpu_overclocking">CPU Overclocking</string> - <string name="settings_cdrom_region_check">Region Check</string> - <string name="settings_summary_cdrom_region_check">Prevents discs from incorrect regions being read by the emulator. Usually safe to disable.</string> - <string name="settings_cdrom_preload_image_to_ram">Preload Image to RAM</string> - <string name="settings_summary_preload_image_to_ram">Loads the game image into RAM. Useful for network paths that may become unreliable during gameplay. In some cases also eliminates stutter when games initiate audio track playback.</string> - <string name="settings_pgxp_vertex_cache">PGXP Vertex Cache</string> - <string name="settings_summary_pgxp_vertex_cache">Uses screen coordinates as a fallback when tracking vertices through memory fails. May improve PGXP compatibility.</string> - <string name="settings_pgxp_cpu_mode">PGXP CPU Mode</string> - <string name="settings_summary_pgxp_cpu_mode">Tries to track vertex manipulation through the CPU. Some games require this option for PGXP to be effective. Very high performance penalty.</string> - <string name="settings_cpu_recompiler_icache">CPU Recompiler ICache</string> - <string name="settings_summary_cpu_recompiler_icache">Determines whether the CPU\'s instruction cache is simulated in the recompiler. Improves accuracy at a small cost to performance. If games are running too fast, try enabling this option.</string> - <string name="settings_cpu_recompiler_fastmem">CPU Recompiler Fast Memory Access</string> - <string name="settings_summary_cpu_recompiler_fastmem">Makes guest memory access more efficient by using page faults and backpatching. Disable if it is unstable on your device.</string> - <string name="settings_presented_frame_limit">Presented Frame Limit</string> - <string name="settings_logging_level">Logging Level</string> - <string name="settings_log_to_file">Log To File</string> - <string name="settings_summary_log_to_file">Writes log messages to duckstation.log in your user directory. Only use for debugging as it slows down emulation.</string> - <string name="settings_log_to_logcat">Log To Logcat</string> - <string name="settings_summary_log_to_logcat">Writes log messages to the Android message logger. Only useful when attached to a computer with adb.</string> - <string name="settings_volume">Volume</string> - <string name="settings_summary_volume">Controls the volume of the emulator\'s sound output.</string> - <string name="settings_fast_forward_volume">Fast Forward Volume</string> - <string name="settings_summary_fast_forward_volume">Controls the volume of the emulator\'s sound output when fast forwarding.</string> - <string name="settings_mute_all_sound">Mute All Sound</string> - <string name="settings_summary_mute_all_sound">Prevents the emulator from emitting any sound.</string> - <string name="settings_mute_cd_audio">Mute CD Audio</string> - <string name="settings_summary_mute_cd_audio">Forcibly mutes both CD-DA and XA audio from the CD-ROM. Can be used to disable background music in some games.</string> - <string name="settings_audio_backend">Audio Backend</string> - <string name="settings_audio_buffer_size">Audio Buffer Size</string> - <string name="settings_summary_audio_buffer_size">Determines the latency between audio being generated and output to speakers. Smaller values reduce latency, but variations in emulation speed will cause hitches.</string> - <string name="settings_audio_sync">Audio Sync</string> - <string name="settings_summary_audio_sync">Throttles the emulation speed based on the audio backend pulling audio frames. This helps to remove noises or crackling if emulation is too fast. Sync will automatically be disabled if not running at 100% speed.</string> - <string name="settings_controller_type">Controller Type</string> - <string name="settings_enable_analog_mode_on_reset">Enable Analog Mode On Reset</string> - <string name="settings_touchscreen_controller_view">Touchscreen Controller View</string> - <string name="settings_auto_hide_touchscreen_controller">Auto-Hide Touchscreen Controller</string> - <string name="settings_summary_auto_hide_touchscreen_controller">Hides the touchscreen controller when an external controller is detected.</string> - <string name="settings_vibrate_on_press">Vibrate On Press</string> - <string name="settings_summary_vibrate_on_press">Enables a short vibration when a touchscreen button is pressed. Requires \"Vibrate on Touch\" to be enabled on your device.</string> - <string name="settings_enable_vibration">Device Vibration</string> - <string name="settings_summary_enable_vibration">Forwards rumble from the game to the phone\'s vibration motor.</string> - <string name="settings_memory_card_1_type">Memory Card 1 Type</string> - <string name="settings_memory_card_2_type">Memory Card 2 Type</string> - <string name="settings_crop_mode">Crop Mode</string> - <string name="settings_aspect_ratio">Aspect Ratio</string> - <string name="settings_linear_upscaling">Linear Upscaling</string> - <string name="settings_integer_upscaling">Integer Upscaling</string> - <string name="settings_summary_linear_upscaling">Smooths out the image when upscaling the console to the screen.</string> - <string name="settings_summary_integer_upscaling">Adds padding to the display area to ensure that the ratio between pixels on the host to pixels in the console is an integer number. May result in a sharper image in some 2D games.</string> - <string name="settings_summary_osd_show_messages">Shows on-screen-display messages when events occur such as save states being created/loaded, screenshots being taken, etc.</string> - <string name="settings_summary_osd_show_speed">Shows the current emulation speed of the system in the top-right corner of the display as a percentage.</string> - <string name="settings_summary_osd_show_fps">Shows the internal frame rate of the game in the top-right corner of the display.</string> - <string name="settings_summary_osd_show_vps">Shows the number of frames (or v-syncs) displayed per second by the system in the top-right corner of the display.</string> - <string name="settings_cdrom_read_speedup">CD-ROM Read Speedup</string> - <string name="settings_summary_cdrom_read_speedup">Speeds up CD-ROM reads by the specified factor. Only applies to double-speed reads, and is ignored when audio is playing. May improve loading speeds in some games, at the cost of breaking others.</string> - <string name="settings_summary_console_fast_boot">Skips the BIOS shell/intro, booting directly into the game. Usually safe to enable, but some games break.</string> - <string name="settings_msaa">Multisample Antialiasing</string> - <string name="settings_true_color">True Color Rendering (24-bit, disables dithering)</string> - <string name="settings_summary_true_color">This produces nicer looking gradients at the cost of making some colours look slightly different. Disabling the option also enables dithering. Most games are compatible with this option.</string> - <string name="settings_scaled_dithering">Scaled Dithering (scale dither pattern to resolution)</string> - <string name="settings_summary_scaled_dithering">Scales the dither pattern to the resolution scale of the emulated GPU. This makes the dither pattern much less obvious at higher resolutions. Usually safe to enable, and only supported by the hardware renderers.</string> - <string name="settings_disable_interlacing">Disable Interlacing (force progressive render/scan)</string> - <string name="settings_summary_disable_interlacing">Forces the rendering and display of frames to progressive mode. This removes the \"combing\" effect seen in 480i games by rendering them in 480p. Usually safe to enable.</string> - <string name="settings_texture_filtering">Texture Filtering</string> - <string name="settings_force_ntsc_timings">Force NTSC Timings (60hz-on-PAL)</string> - <string name="settings_summary_force_ntsc_timings">Uses NTSC frame timings when the console is in PAL mode, forcing PAL games to run at 60hz.</string> - <string name="settings_widescreen_hack">Widescreen Hack</string> - <string name="settings_summary_widescreen_hack">Scales vertex positions in screen-space to a widescreen aspect ratio, essentially increasing the field of view from 4:3 to 16:9 in 3D games. Not be compatible with all games.</string> - <string name="settings_force_4_3_for_24bit">Force 4:3 For 24-Bit Display</string> - <string name="settings_summary_force_4_3_for_24bit">Switches back to 4:3 display aspect ratio when displaying 24-bit content, usually FMVs.</string> - <string name="settings_chroma_smoothing_24bit">Chroma Smoothing For 24-Bit Display</string> - <string name="settings_summary_chrome_smoothing_24bit">Smooths out blockyness between colour transitions in 24-bit content, usually FMVs. Only applies to the hardware renderers.</string> - <string name="settings_pgxp_geometry_correction">PGXP Geometry Correction</string> - <string name="settings_summary_pgxp_geometry_correction"><![CDATA[Reduces \"wobbly\" polygons and \"warping\" textures that are common in PS1 games. >Only works with the hardware renderers. May not be compatible with all games.]]></string> - <string name="settings_pgxp_culling_correction">PGXP Culling Correction</string> - <string name="settings_summary_pgxp_culling_correction">Increases the precision of polygon culling, reducing the number of holes in geometry. Requires geometry correction enabled.</string> - <string name="settings_pgxp_texture_correction">PGXP Texture Correction</string> - <string name="settings_summary_pgxp_texture_correction">Uses perspective-correct interpolation for texture coordinates and colors, straightening out warped textures. Requires geometry correction enabled.</string> - <string name="settings_pgxp_preserve_projection_precision">PGXP Preserve Projection Precision</string> - <string name="settings_summary_pgxp_preserve_projection_precision">Enables additional precision for PGXP. May improve visuals in some games but break others.</string> - <string name="settings_pgxp_depth_buffer">PGXP Depth Buffer</string> - <string name="settings_summary_pgxp_depth_buffer">Attempts to reduce polygon Z-fighting by testing pixels against the depth values from PGXP. Low compatibility, but can work well in some games.</string> - <string name="menu_main_resume_last_session">Resume Last Session</string> - <string name="menu_main_start_file">Start File</string> - <string name="menu_main_start_bios">Start BIOS</string> - <string name="menu_main_edit_game_directories">Edit Game Directories</string> - <string name="menu_main_scan_for_new_games">Scan For New Games</string> - <string name="menu_main_rescan_all_games">Rescan All Games</string> - <string name="menu_main_import_bios">Import BIOS</string> - <string name="menu_main_show_version">Show Version</string> - <string name="menu_main_github_repository">GitHub Repository</string> - <string name="menu_main_discord_server">Discord Server</string> - <string name="menu_game_list_entry_start_game">Start Game</string> - <string name="menu_game_list_entry_resume_game">Resume Game</string> - <string name="android_progress_callback_please_wait">Please wait...</string> - <string name="android_progress_callback_ok">OK</string> - <string name="android_progress_callback_information">Information</string> - <string name="android_progress_callback_confirmation">Confirmation</string> - <string name="android_progress_callback_yes">Yes</string> - <string name="android_progress_callback_no">No</string> - <string name="emulation_activity_error">Error</string> - <string name="emulation_activity_ok">OK</string> - <string name="emulation_activity_import_patch_codes">Import Patch Codes...</string> - <string name="emulation_activity_patch_on">(ON)</string> - <string name="emulation_activity_patch_off">(OFF)</string> - <string name="emulation_activity_choose_patch_code_file">Choose Patch Code File</string> - <string name="emulation_activity_failed_to_import_patch_codes">Failed to import patch codes. Make sure you selected a PCSXR or Libretro format file.</string> - <string name="main_activity_choose_directory">Choose directory</string> - <string name="main_activity_error">Error</string> - <string name="main_activity_get_path_from_file_error">Failed to get path for the selected file. Please make sure the file is in internal/external storage.\n\nTap the overflow button in the directory selector.\nSelect "Show Internal Storage".\nTap the menu button and select your device name or SD card.</string> - <string name="main_activity_ok">OK</string> - <string name="main_activity_get_path_from_directory_error">Failed to get path for the selected directory. Please make sure the directory is in internal/external storage.\n\nTap the overflow button in the directory selector.\nSelect \"Show Internal Storage\".\nTap the menu button and select your device name or SD card.</string> - <string name="main_activity_external_storage_permissions_error">External storage permissions are required to use DuckStation.</string> - <string name="main_activity_choose_disc_image">Choose Disc Image</string> - <string name="main_activity_missing_bios_image_prompt">No BIOS image was found in DuckStation\'s bios directory. Do you wish to locate and import a BIOS image now?</string> - <string name="main_activity_missing_bios_image">Missing BIOS Image</string> - <string name="main_activity_yes">Yes</string> - <string name="main_activity_no">No</string> - <string name="main_activity_choose_bios_image">Choose BIOS Image</string> - <string name="main_activity_failed_to_open_bios_image">Failed to open BIOS image.</string> - <string name="main_activity_failed_to_read_bios_image_prefix">\"Failed to read BIOS image: \"</string> - <string name="main_activity_bios_image_too_large">BIOS image is too large. You must select a BIOS image, not a game, and it should be 512KB in size.</string> - <string name="main_activity_invalid_error">This BIOS image is invalid, or has already been imported.</string> - <string name="main_activity_show_version_title">Version</string> - <string name="main_activity_copy">Copy</string> - <string name="settings_gpu_thread">Threaded GPU Rendering</string> - <string name="settings_summary_gpu_thread">Uses a second thread for drawing graphics. Currently only available for the software renderer, but can provide a significant speed improvement, and is safe to use.</string> - <string name="settings_gpu_threaded_presentation">Threaded GPU Presentation</string> - <string name="settings_summary_gpu_threaded_presentation">Presents frames on a background thread when fast forwarding or vsync is disabled. This can measurably improve performance in the Vulkan renderer.</string> - <string name="settings_language">Language (restart to apply)</string> - <string name="touchscreen_controller_stop_editing">Stop Editing</string> - <string name="touchscreen_controller_reset_layout">Reset Layout</string> - <string name="emulation_activity_touchscreen_controller_not_active">Touchscreen controller is not active.</string> - <string name="settings_theme">Theme</string> - <string name="settings_controller_mapping_summary">Allows you bind external controller buttons/axises to the emulated controller.</string> - <string name="settings_controller_mapping">Controller Mapping</string> - <string name="controller_binding_dialog_message">Press button on controller to set new binding.\n\nCurrent Binding: %s</string> - <string name="controller_binding_dialog_no_binding"><![CDATA[<No Binding>]]></string> - <string name="controller_binding_dialog_cancel">Cancel</string> - <string name="controller_binding_dialog_clear">Clear</string> - <string name="controller_mapping_activity_title">Controller Settings</string> - <string name="controller_mapping_activity_no_profiles_found">No profiles found.</string> - <string name="controller_mapping_activity_select_input_profile">Select Input Profile</string> - <string name="controller_mapping_activity_failed_to_load_profile">Failed to load profile \'%s\'</string> - <string name="controller_mapping_activity_input_profile_name">Input Profile Name:</string> - <string name="controller_mapping_activity_save">Save</string> - <string name="controller_mapping_activity_name_must_be_provided">A name must be provided.</string> - <string name="controller_mapping_activity_failed_to_save_input_profile">Failed to save input profile.</string> - <string name="controller_mapping_activity_input_profile_saved">Input profile \'%s\' saved.</string> - <string name="controller_mapping_activity_cancel">Cancel</string> - <string name="settings_use_analog_sticks_for_dpad">Use Analog Sticks for D-Pad in Digital Mode</string> - <string name="settings_summary_enable_analog_mode_on_reset">Forces the controller to analog mode when the console is reset/powered on.</string> - <string name="settings_summary_use_analog_sticks_for_dpad">Allows you to use the analog sticks to control the d-pad in digital mode, as well as the buttons.</string> - <string name="settings_disable_all_enhancements">Disable All Enhancements</string> - <string name="settings_summary_disable_all_enhancements">Temporarily disables all enhancements, which can be useful when debugging issues.</string> - <string name="settings_downsample_mode">Downsampling</string> - <string name="activity_game_properties">Game Properties</string> - <string name="game_properties_preference_use_global_setting">Use Global Setting</string> - <string name="settings_input_profile">Input Profile</string> - <string name="game_properties_tab_summary">Summary</string> - <string name="game_properties_tab_game_settings">Game Settings</string> - <string name="game_properties_tab_controller_settings">Controller Settings</string> - <string name="settings_audio_resampling">Audio Resampling</string> - <string name="settings_summary_audio_resampling">When running outside of 100% speed, resamples audio from the target speed instead of dropping frames. Produces much nicer fast forward/slowdown audio at a small cost to performance.</string> - <string name="settings_general_sync_to_host_refresh_rate">Sync To Host Refresh Rate</string> - <string name="settings_summary_general_sync_to_host_refresh_rate">Adjusts the emulation speed so the console\'s refresh rate matches the host\'s refresh rate, when VSync and Audio Resampling is enabled. This results in the smoothest animations possible, at the cost of potentially increasing the emulation speed by less than 1%.</string> - <string name="settings_sustained_performance_mode">Sustained Performance Mode</string> - <string name="settings_summary_sustained_performance_mode">Enables Android\'s sustained performance mode. May result in more consistent framerates for long sessions on some devices.</string> - <string name="title_activity_game_directories">Edit Game Directories</string> - <string name="settings_game_directories">Game Directories</string> - <string name="settings_summary_game_directories">Change the list of directories used to search for games.</string> - <string name="game_directories_scanning_subdirectories">Scanning subdirectories.</string> - <string name="game_directories_not_scanning_subdirectories">Not scanning subdirectories.</string> - <string name="settings_display_all_frames">Optimal Frame Pacing</string> - <string name="settings_summary_display_all_frames">Enable this option will ensure every frame the console renders is displayed to the screen, for optimal frame pacing. If you are having difficulties maintaining full speed, or are getting audio glitches, try disabling this option.</string> - <string name="menu_edit_game_directories_add_directory">Add Directory</string> - <string name="menu_edit_game_directories_add_path">Add Path</string> - <string name="edit_game_directories_add_path">Add Path</string> - <string name="edit_game_directories_add_path_summary">Enter the full path to the directory with games.\n\nYou can get this from a file manager app.\n\nExample: /storage/emulated/0/games</string> - <string name="save_state_info_slot_is_empty">Slot Is Empty</string> - <string name="save_state_info_game_save_n">Game Save %d</string> - <string name="save_state_info_global_save_n">Global Save %d</string> - <string name="save_state_info_quick_save">Quick Save</string> - <string name="settings_osd_show_show_resolution">Show Resolution</string> - <string name="settings_summary_osd_show_resolution">Shows the resolution the game is rendering at in the top-right corner of the display.</string> - <string name="settings_summary_display_stretch">Stretches the active display to fill the screen.</string> - <string name="settings_display_stretch">Stretch To Fill</string> - <string name="settings_category_global">Global Settings</string> - <string name="settings_category_display">Display Settings</string> - <string name="settings_category_audio">Audio Settings</string> - <string name="settings_category_console">Console Settings</string> - <string name="settings_category_cpu">CPU Settings</string> - <string name="settings_category_gpu">GPU Settings</string> - <string name="settings_category_logging">Logging Settings</string> - <string name="dialog_done">Done</string> - <string name="dialog_touchscreen_controller_type">Touchscreen Controller Type</string> - <string name="dialog_touchscreen_controller_opacity">Touchscreen Controller Opacity</string> - <string name="dialog_touchscreen_controller_buttons">Touchscreen Controller Buttons</string> - <string name="dialog_touchscreen_controller_settings">Touchscreen Controller Settings</string> - <string name="settings_summary_console_tty_output">Logs debug messages printed by games.</string> - <string name="action_show_game_list">List View</string> - <string name="action_show_game_grid">Grid View</string> - <string name="settings_touch_gliding">Touch Gliding</string> - <string name="settings_summary_touch_gliding">Allows you to press multiple controller face buttons by dragging your finger along the screen.</string> - <string name="menu_game_list_entry_game_properties">Game Properties</string> - <string name="emulation_activity_change_disc_select_new_file">Select New File...</string> - <string name="settings_achievements_enable">Enable RetroAchievements</string> - <string name="settings_summary_achievements_enable">When enabled and logged in, DuckStation will scan for achievements on startup.</string> - <string name="settings_achievements_challenge_mode">Enable Hardcore Mode</string> - <string name="settings_summary_achievements_challenge_mode">Challenge mode. Disables save states, patch code, and slowdown functions, but you receive double the achievement points. Cannot be toggled while ingame.</string> - <string name="settings_achievements_rich_presence">Enable Rich Presence</string> - <string name="settings_summary_achievements_rich_presence">Rich presence information will be collected and sent to the server where supported.</string> - <string name="settings_achievements_username">User Name</string> - <string name="settings_achievements_token_generation_time">Token Generation Time</string> - <string name="settings_achievements_login">Login</string> - <string name="settings_summary_achievements_login">Logs in to your account to record achievements.</string> - <string name="settings_achievements_register">Register</string> - <string name="settings_summary_achievements_register">Opens a link to create a new account.</string> - <string name="settings_achievements_logout">Logout</string> - <string name="settings_summary_achievements_logout">Logs out of your account. No new achievements will be recorded.</string> - <string name="settings_achievements_view_profile">View Profile</string> - <string name="settings_summary_achievements_view_profile">Opens a link to your profile.</string> - <string name="settings_achievements_test_mode">Enable Test Mode</string> - <string name="settings_summary_achievements_test_mode">When enabled, DuckStation will assume all achievements are locked and not send any unlock notifications to the server.</string> - <string name="settings_achievements_use_first_disc_from_playlist">Use First Disc From Playlist</string> - <string name="settings_summary_achievements_use_first_disc_from_playlist">When enabled, the first disc in a playlist will be used for achievements, regardless of which disc is active.</string> - <string name="achievement_settings_login_title">RetroAchievements Login</string> - <string name="achievement_settings_login_help">Please enter user name and password for retroachievements.org below. Your password will not be saved in DuckStation, an access token will be generated and used instead.</string> - <string name="achievement_settings_login_username_hint">Username</string> - <string name="achievement_settings_login_password_hint">Password</string> - <string name="achievement_settings_login_login_button">Login</string> - <string name="achievement_settings_login_cancel_button">Cancel</string> - <string name="achievement_settings_login_failed">Login failed. Please check your username and password, and try again.</string> - <string name="achievement_points_format_string">%d points</string> - <string name="achievement_summary_format_string">You have unlocked %1$d of %2$d achievements, earning %3$d of %4$d possible points.</string> - <string name="achievement_title_challenge_mode_format_string">%s (Hardcore Mode)</string> - <string name="settings_achievements_disclaimer">DuckStation uses RetroAchievements (retroachievements.org) as an achievement database and for tracking progress.</string> - <string name="settings_achievements_confirm_logout_title">Confirm Logout</string> - <string name="settings_achievements_confirm_logout_message">After logging out, no more achievements will be unlocked until you log back in again. Achievements already unlocked will not be lost.</string> - <string name="controller_binding_device_for_vibration">Device for Vibration</string> - <string name="controller_settings_tab_settings">Settings</string> - <string name="controller_settings_tab_hotkeys">Hotkeys</string> - <string name="controller_settings_category_button_bindings">Button Bindings</string> - <string name="controller_settings_category_axis_bindings">Axis Bindings</string> - <string name="controller_settings_category_settings">Settings</string> - <string name="controller_settings_category_touchscreen_controller">Touchscreen Controller</string> - <string name="controller_settings_category_ports">Ports</string> - <string name="controller_settings_main_port_format">Port %d</string> - <string name="controller_settings_sub_port_format">Port %1$d%2$c</string> - <string name="action_switch_view">Switch View</string> - <string name="title_activity_memory_card_editor">Memory Card Editor</string> - <string name="action_memory_card_editor">Memory Card Editor</string> - <string name="action_memory_card_editor_import_card">Import Card</string> - <string name="action_memory_card_editor_open_card">Open Card</string> - <string name="action_memory_card_editor_new_card">New Card</string> - <string name="action_memory_card_editor_format_card">Format Card</string> - <string name="action_memory_card_editor_delete_card">Delete Card</string> - <string name="memory_card_editor_no_cards_found">No memory cards found.</string> - <string name="memory_card_editor_card_already_open">This card is already open.</string> - <string name="memory_card_editor_failed_to_open_card">Failed to open or read memory card.</string> - <string name="memory_card_editor_must_have_at_least_two_cards_to_copy">Must have at least two cards open to copy.</string> - <string name="memory_card_editor_copy_save_to">Copy %s to...</string> - <string name="memory_card_editor_select_card">Select Card</string> - <string name="memory_card_editor_error">Error</string> - <string name="memory_card_editor_copy_insufficient_blocks">This file requires %1$d blocks, but only %2$d blocks are free.</string> - <string name="memory_card_editor_copy_already_exists">File \'%s\' already exists on destination card.</string> - <string name="memory_card_editor_copy_read_failed">Failed to read file \'%s\' from source card.</string> - <string name="memory_card_editor_copy_write_failed">Failed to write file \'%s\' to destination card.</string> - <string name="memory_card_editor_copy_success">Copied \'%1$s\' to \'%2$s\'.</string> - <string name="memory_card_editor_delete_confirm">Are you sure you want to delete the save \'%s\'?</string> - <string name="memory_card_editor_delete_success">Deleted save \'%s\'.</string> - <string name="memory_card_editor_delete_failed">Failed to delete file \'%s\'.</string> - <string name="memory_card_editor_no_card_selected">No card is selected.</string> - <string name="memory_card_editor_import_failed">Failed to import card. It may not be a supported format.</string> - <string name="memory_card_editor_delete_card_confirm_message">Memory card \'%s\' will be deleted, and cannot be recovered. Are you sure you want to delete this card?</string> - <string name="memory_card_editor_delete_card_failed">Failed to delete \'%s\'.</string> - <string name="memory_card_editor_delete_card_success">Deleted card \'%s\'.</string> - <string name="memory_card_editor_format_card_confirm_message">Memory card \'%s\' will be formatted, clearing all saves. Are you sure you want to format this card?</string> - <string name="memory_card_editor_format_card_failed">Failed to format \'%s\'.</string> - <string name="memory_card_editor_format_card_success">Formatted card \'%s\'.</string> - <string name="memory_card_editor_import_card_confirm_message">Importing \'%1$s\' will remove all saves in \'%2$s\'. Do you want to continue?</string> - <string name="memory_card_editor_import_card_read_failed">Failed to read \'%s\'.</string> - <string name="memory_card_editor_import_card_failed">Failed to import card \'%s\'. It may not be a supported format.</string> - <string name="memory_card_editor_import_card_success">Imported card \'%s\'.</string> - <string name="menu_game_list_entry_choose_cover_image">Choose Cover Image</string> - <string name="controller_settings_vibration_unsupported">The selected device does not support vibration.</string> - <string name="controller_settings_automatic_mapping">Perform Automatic Mapping</string> - <string name="controller_settings_summary_automatic_mapping">Attempts to automatically bind all buttons/axes to a connected controller.</string> - <string name="controller_settings_clear_controller_bindings">Clear Bindings</string> - <string name="controller_settings_summary_clear_controller_bindings">Unbinds all buttons/axes for this controller.</string> - <string name="controller_settings_clear_controller_bindings_confirm">Are you sure you want to clear all bindings? This cannot be reversed.</string> - <string name="controller_settings_clear_controller_bindings_done">All bindings cleared for Controller %d.</string> - <string name="controller_auto_mapping_no_devices">No suitable devices found. Automatic binding only supports gamepad devices, but you can still bind other device types manually.</string> - <string name="controller_auto_mapping_select_device">Select Device</string> - <string name="controller_auto_mapping_results">Automatic Binding Results</string> - <string name="main_activity_empty_game_list_title">No games were found. Please add a directory with games to begin.</string> - <string name="main_activity_empty_game_list_supported_formats">Supported formats are:\n\n%s\n\nGames in bin format require a cuesheet (.cue) to start.</string> - <string name="main_activity_empty_game_list_add_directory">Add Game Directory</string> - <string name="main_activity_empty_game_list_start_file">Start File</string> - <string name="update_notes_title">Update Notes</string> - <string name="update_notes_message_version_controller_update">This DuckStation update includes support for multiple controllers with vibration, and binding devices such as keyboards/volume buttons.\n\nYou must re-bind your controllers, otherwise they will no longer function. Do you want to do this now?</string> - <string name="settings_osd_show_show_inputs">Show Controller Input</string> - <string name="settings_summary_osd_show_inputs">Shows the current controller state of the system in the bottom-left corner of the display.</string> - <string name="touchscreen_controller_edit_menu">Edit Menu</string> - <string name="settings_achievements_category">Account</string> - <string name="settings_achievements_global_settings">Global Settings</string> - <string name="settings_category_achievements">Achievement Settings</string> - <string name="settings_multitap_mode">Multitap Mode</string> - <string name="settings_touchscreen_controller_port">Touchscreen Controller Port</string> - <string name="emulation_menu_load_state">Load State</string> - <string name="emulation_menu_save_state">Save State</string> - <string name="emulation_menu_toggle_fast_forward">Toggle Fast Forward</string> - <string name="emulation_menu_achievements">Achievements</string> - <string name="emulation_menu_patch_codes">Patch Codes</string> - <string name="emulation_menu_change_disc">Change Disc</string> - <string name="emulation_menu_touchscreen_controller_settings">Touchscreen Controller Settings</string> - <string name="emulation_menu_toggle_analog_mode">Toggle Controller Analog Mode</string> - <string name="emulation_menu_reset_console">Reset Console</string> - <string name="emulation_menu_exit_game">Exit Game</string> - <string name="settings_use_software_renderer_for_readbacks">Use Software Renderer For Readbacks</string> - <string name="settings_summary_use_software_renderer_for_readbacks">Runs the software renderer in parallel for VRAM readbacks. On some devices, this may result in greater performance when using graphical enhancements with the hardware renderer.</string> - <string name="settings_use_software_renderer">Use Software Renderer</string> - <string name="settings_disable_widescreen">Disable Widescreen</string> - <string name="settings_cdrom_seek_speedup">CD-ROM Seek Speedup</string> - <string name="settings_summary_cdrom_seek_speedup">Speeds up CD-ROM seeks by the specified factor. May improve loading speeds in some games, at the cost of breaking others.</string> - <string name="settings_custom_aspect_ratio">Custom Aspect Ratio</string> - <string name="settings_summary_custom_aspect_ratio">Used when aspect ratio is set to Custom.</string> - <string name="controller_settings_category_auto_fire_buttons">Auto Fire Buttons</string> - <string name="controller_settings_category_auto_fire_bindings">Auto Fire Triggers</string> - <string name="controller_settings_auto_fire_n_button">Auto Fire %d Button</string> - <string name="controller_settings_auto_fire_n_frequency">Auto Fire %d Frequency/Interval</string> - <string name="controller_binding_auto_fire_n">Auto Fire %d</string> - <string name="settings_category_cdrom">CD-ROM Settings</string> - <string name="settings_cdrom_read_thread">Use Read Thread (Asynchronous)</string> - <string name="settings_summary_read_thread">Reduces hitches in emulation by reading/decompressing CD data asynchronously on a worker thread.</string> - <string name="settings_cdrom_load_image_patches">Apply Image Patches</string> - <string name="settings_summary_load_image_patches">Automatically applies patches to disc images when they are present, currently only PPF is supported.</string> - <string name="menu_edit_game_directories_force_saf">Force Scoped Storage</string> - <string name="settings_expand_to_cutout">Expand To Cutout Area</string> - <string name="settings_summary_expand_to_cutout">Expands the display area to include the cutout (or notch) area.</string> -</resources> diff --git a/android/app/src/main/res/values/styles.xml b/android/app/src/main/res/values/styles.xml deleted file mode 100644 index 83f0c72bb..000000000 --- a/android/app/src/main/res/values/styles.xml +++ /dev/null @@ -1,45 +0,0 @@ -<resources> - - <!-- Base application theme. --> - <style name="AppTheme" parent="Theme.AppCompat.DayNight.DarkActionBar"> - <!-- Customize your theme here. --> - <item name="colorPrimary">@color/colorPrimary</item> - <item name="colorPrimaryDark">@color/colorPrimaryDark</item> - <item name="colorAccent">@color/colorAccent</item> - <item name="android:navigationBarColor">@color/colorNavigation</item> - </style> - - <style name="AppTheme.NoActionBar"> - <item name="windowActionBar">false</item> - <item name="windowNoTitle">true</item> - </style> - - <style name="AppTheme.AppBarOverlay" parent="ThemeOverlay.AppCompat.Dark.ActionBar" /> - - <style name="AppTheme.PopupOverlay" parent="ThemeOverlay.AppCompat.DayNight" /> - - <style name="FullscreenTheme" parent="AppTheme"> - <item name="android:actionBarStyle">@style/FullscreenActionBarStyle</item> - <item name="android:windowActionBarOverlay">true</item> - <item name="android:windowBackground">@null</item> - <item name="metaButtonBarStyle">?android:attr/buttonBarStyle</item> - <item name="metaButtonBarButtonStyle">?android:attr/buttonBarButtonStyle</item> - </style> - - <style name="FullscreenActionBarStyle" parent="Widget.AppCompat.ActionBar"> - <item name="android:background">@color/black_overlay</item> - </style> - - <style name="TabTextAppearance" parent="TextAppearance.Design.Tab"> - <item name="textAllCaps">false</item> - <item name="android:textAllCaps">false</item> - </style> - - <style name="EmulationActivityOverlay" parent="ThemeOverlay.AppCompat.Dark"> - <item name="android:windowNoTitle">true</item> - <item name="android:windowBackground">@color/emulationActivityPauseBackground</item> - <item name="android:colorBackgroundCacheHint">@null</item> - <item name="android:windowIsTranslucent">true</item> - <item name="android:windowAnimationStyle">@android:style/Animation.Dialog</item> - </style> -</resources> diff --git a/android/app/src/main/res/xml/achievement_preferences.xml b/android/app/src/main/res/xml/achievement_preferences.xml deleted file mode 100644 index 29901275b..000000000 --- a/android/app/src/main/res/xml/achievement_preferences.xml +++ /dev/null @@ -1,59 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<PreferenceScreen xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:android="http://schemas.android.com/apk/res/android"> - - <PreferenceCategory app:title="@string/settings_achievements_global_settings" app:iconSpaceReserved="false"> - <SwitchPreferenceCompat - app:key="Cheevos/Enabled" - app:title="@string/settings_achievements_enable" - app:summary="@string/settings_summary_achievements_enable" - app:defaultValue="false" - app:iconSpaceReserved="false" /> - <SwitchPreferenceCompat - app:key="Cheevos/ChallengeMode" - app:title="@string/settings_achievements_challenge_mode" - app:summary="@string/settings_summary_achievements_challenge_mode" - app:dependency="Cheevos/Enabled" - app:defaultValue="false" - app:iconSpaceReserved="false" /> - <SwitchPreferenceCompat - app:key="Cheevos/RichPresence" - app:title="@string/settings_achievements_rich_presence" - app:summary="@string/settings_summary_achievements_rich_presence" - app:dependency="Cheevos/Enabled" - app:defaultValue="true" - app:iconSpaceReserved="false" /> - </PreferenceCategory> - - <PreferenceCategory app:title="@string/settings_achievements_category" app:iconSpaceReserved="false"> - <Preference - app:key="Cheevos/Username" - app:title="@string/settings_achievements_username" - app:iconSpaceReserved="false" /> - <Preference - app:key="Cheevos/LoginTokenTime" - app:title="@string/settings_achievements_token_generation_time" - app:iconSpaceReserved="false" /> - <PreferenceScreen - app:key="Cheevos/Login" - app:title="@string/settings_achievements_login" - app:summary="@string/settings_summary_achievements_login" - app:iconSpaceReserved="false" /> - <PreferenceScreen - app:key="Cheevos/Register" - app:title="@string/settings_achievements_register" - app:summary="@string/settings_summary_achievements_register" - app:iconSpaceReserved="false" /> - <PreferenceScreen - app:key="Cheevos/Logout" - app:title="@string/settings_achievements_logout" - app:summary="@string/settings_summary_achievements_logout" - app:iconSpaceReserved="false" /> - <PreferenceScreen - app:key="Cheevos/ViewProfile" - app:title="@string/settings_achievements_view_profile" - app:summary="@string/settings_summary_achievements_view_profile" - app:iconSpaceReserved="false" /> - </PreferenceCategory> - <PreferenceCategory app:title="@string/settings_achievements_disclaimer" app:iconSpaceReserved="false"> - </PreferenceCategory> -</PreferenceScreen> \ No newline at end of file diff --git a/android/app/src/main/res/xml/advanced_preferences.xml b/android/app/src/main/res/xml/advanced_preferences.xml deleted file mode 100644 index 7187e34c9..000000000 --- a/android/app/src/main/res/xml/advanced_preferences.xml +++ /dev/null @@ -1,256 +0,0 @@ -<!-- - ~ Copyright 2018 The app Open Source Project - ~ - ~ Licensed under the Apache License, Version 2.0 (the "License"); - ~ you may not use this file except in compliance with the License. - ~ You may obtain a copy of the License at - ~ - ~ http://www.apache.org/licenses/LICENSE-2.0 - ~ - ~ Unless required by applicable law or agreed to in writing, software - ~ distributed under the License is distributed on an "AS IS" BASIS, - ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - ~ See the License for the specific language governing permissions and - ~ limitations under the License. - --> - -<PreferenceScreen xmlns:app="http://schemas.android.com/apk/res-auto"> - <PreferenceCategory app:title="@string/settings_category_global" app:iconSpaceReserved="false"> - <SwitchPreferenceCompat - app:key="Main/AutoLoadCheats" - app:title="@string/settings_load_patch_codes" - app:defaultValue="true" - app:summary="@string/settings_summary_load_patch_codes" - app:iconSpaceReserved="false" /> - <SwitchPreferenceCompat - app:key="Main/ApplyGameSettings" - app:title="@string/settings_apply_compatibility_settings" - app:defaultValue="true" - app:summary="@string/settings_summary_apply_compatibility_settings" - app:iconSpaceReserved="false" /> - <SwitchPreferenceCompat - app:key="Main/DisableAllEnhancements" - app:title="@string/settings_disable_all_enhancements" - app:defaultValue="false" - app:summary="@string/settings_summary_disable_all_enhancements" - app:iconSpaceReserved="false" /> - <SwitchPreferenceCompat - app:key="Main/SustainedPerformanceMode" - app:title="@string/settings_sustained_performance_mode" - app:defaultValue="false" - app:summary="@string/settings_summary_sustained_performance_mode" - app:iconSpaceReserved="false" /> - </PreferenceCategory> - - <PreferenceCategory app:title="@string/settings_category_display" app:iconSpaceReserved="false"> - <SwitchPreferenceCompat - app:key="Display/VSync" - app:title="@string/settings_video_sync" - app:defaultValue="false" - app:summary="@string/settings_summary_video_sync" - app:iconSpaceReserved="false" /> - <SwitchPreferenceCompat - app:key="Main/SyncToHostRefreshRate" - app:title="@string/settings_general_sync_to_host_refresh_rate" - app:defaultValue="false" - app:summary="@string/settings_summary_general_sync_to_host_refresh_rate" - app:dependency="Display/VSync" - app:iconSpaceReserved="false" /> - <SwitchPreferenceCompat - app:key="Display/DisplayAllFrames" - app:title="@string/settings_display_all_frames" - app:defaultValue="false" - app:summary="@string/settings_summary_display_all_frames" - app:iconSpaceReserved="false" /> - <ListPreference - app:key="Display/MaxFPS" - app:title="@string/settings_presented_frame_limit" - app:defaultValue="60" - app:entries="@array/settings_advanced_display_fps_limit_entries" - app:entryValues="@array/settings_advanced_display_fps_limit_values" - app:useSimpleSummaryProvider="true" - app:iconSpaceReserved="false" /> - <SwitchPreferenceCompat - app:key="GPU/UseSoftwareRendererForReadbacks" - app:title="@string/settings_use_software_renderer_for_readbacks" - app:defaultValue="false" - app:summary="@string/settings_summary_use_software_renderer_for_readbacks" - app:iconSpaceReserved="false" /> - </PreferenceCategory> - - <PreferenceCategory app:title="@string/settings_category_audio" app:iconSpaceReserved="false"> - <ListPreference - app:key="Audio/Backend" - app:title="@string/settings_audio_backend" - app:entries="@array/settings_audio_backend_entries" - app:entryValues="@array/settings_audio_backend_values" - app:defaultValue="OpenSLES" - app:useSimpleSummaryProvider="true" - app:iconSpaceReserved="false" /> - <ListPreference - app:key="Audio/BufferSize" - app:title="@string/settings_audio_buffer_size" - app:entries="@array/settings_audio_buffer_size_entries" - app:entryValues="@array/settings_audio_buffer_size_values" - app:defaultValue="2048" - app:summary="@string/settings_summary_audio_buffer_size" - app:useSimpleSummaryProvider="true" - app:iconSpaceReserved="false" /> - <SwitchPreferenceCompat - app:key="Audio/Sync" - app:title="@string/settings_audio_sync" - app:defaultValue="true" - app:summary="@string/settings_summary_audio_sync" - app:iconSpaceReserved="false" /> - <SwitchPreferenceCompat - app:key="Audio/Resampling" - app:title="@string/settings_audio_resampling" - app:defaultValue="true" - app:summary="@string/settings_summary_audio_resampling" - app:iconSpaceReserved="false" /> - </PreferenceCategory> - - <PreferenceCategory app:title="@string/settings_category_console" app:iconSpaceReserved="false"> - <ListPreference - app:key="Console/Region" - app:title="@string/settings_console_region" - app:entries="@array/settings_console_region_entries" - app:entryValues="@array/settings_console_region_values" - app:defaultValue="Auto" - app:useSimpleSummaryProvider="true" - app:iconSpaceReserved="false" /> - </PreferenceCategory> - - <PreferenceCategory app:title="@string/settings_category_cdrom" app:iconSpaceReserved="false"> - <SwitchPreferenceCompat - app:key="CDROM/ReadThread" - app:title="@string/settings_cdrom_read_thread" - app:defaultValue="true" - app:summary="@string/settings_summary_read_thread" - app:iconSpaceReserved="false" /> - <SwitchPreferenceCompat - app:key="CDROM/RegionCheck" - app:title="@string/settings_cdrom_region_check" - app:defaultValue="false" - app:summary="@string/settings_summary_cdrom_region_check" - app:iconSpaceReserved="false" /> - <SwitchPreferenceCompat - app:key="CDROM/LoadImageToRAM" - app:title="@string/settings_cdrom_preload_image_to_ram" - app:defaultValue="false" - app:summary="@string/settings_summary_preload_image_to_ram" - app:iconSpaceReserved="false" /> - <SwitchPreferenceCompat - app:key="CDROM/LoadImagePatches" - app:title="@string/settings_cdrom_load_image_patches" - app:defaultValue="false" - app:summary="@string/settings_summary_load_image_patches" - app:iconSpaceReserved="false" /> - </PreferenceCategory> - - <PreferenceCategory app:title="@string/settings_category_cpu" app:iconSpaceReserved="false"> - <ListPreference - app:key="CPU/ExecutionMode" - app:title="@string/settings_cpu_execution_mode" - app:entries="@array/settings_cpu_execution_mode_entries" - app:entryValues="@array/settings_cpu_execution_mode_values" - app:defaultValue="Recompiler" - app:useSimpleSummaryProvider="true" - app:iconSpaceReserved="false" /> - <ListPreference - app:key="CPU/Overclock" - app:title="@string/settings_cpu_overclocking" - app:defaultValue="100" - app:entries="@array/settings_advanced_cpu_overclock_entries" - app:entryValues="@array/settings_advanced_cpu_overclock_values" - app:useSimpleSummaryProvider="true" - app:iconSpaceReserved="false" /> - <SwitchPreferenceCompat - app:key="CPU/RecompilerICache" - app:title="@string/settings_cpu_recompiler_icache" - app:defaultValue="false" - app:summary="@string/settings_summary_cpu_recompiler_icache" - app:iconSpaceReserved="false" /> - <ListPreference - app:key="CPU/FastmemMode" - app:title="@string/settings_cpu_recompiler_fastmem" - app:entries="@array/settings_cpu_fastmem_mode_entries" - app:entryValues="@array/settings_cpu_fastmem_mode_values" - app:useSimpleSummaryProvider="true" - app:defaultValue="MMap" - app:summary="@string/settings_summary_cpu_recompiler_fastmem" - app:iconSpaceReserved="false" /> - </PreferenceCategory> - - <PreferenceCategory app:title="@string/settings_category_gpu" app:iconSpaceReserved="false"> - <SwitchPreferenceCompat - app:key="GPU/UseThread" - app:title="@string/settings_gpu_thread" - app:defaultValue="true" - app:summary="@string/settings_summary_gpu_thread" - app:iconSpaceReserved="false" /> - <SwitchPreferenceCompat - app:key="GPU/ThreadedPresentation" - app:title="@string/settings_gpu_threaded_presentation" - app:defaultValue="true" - app:summary="@string/settings_summary_gpu_threaded_presentation" - app:iconSpaceReserved="false" /> - <SwitchPreferenceCompat - app:key="GPU/PGXPVertexCache" - app:title="@string/settings_pgxp_vertex_cache" - app:defaultValue="false" - app:summary="@string/settings_summary_pgxp_vertex_cache" - app:iconSpaceReserved="false" /> - <SwitchPreferenceCompat - app:key="GPU/PGXPCPU" - app:title="@string/settings_pgxp_cpu_mode" - app:defaultValue="false" - app:summary="@string/settings_summary_pgxp_cpu_mode" - app:iconSpaceReserved="false" /> - </PreferenceCategory> - - <PreferenceCategory app:title="@string/settings_category_logging" app:iconSpaceReserved="false"> - <ListPreference - app:key="Logging/LogLevel" - app:title="@string/settings_logging_level" - app:defaultValue="Warning" - app:entries="@array/settings_log_level_entries" - app:entryValues="@array/settings_log_level_values" - app:useSimpleSummaryProvider="true" - app:iconSpaceReserved="false" /> - <SwitchPreferenceCompat - app:key="Logging/LogToFile" - app:title="@string/settings_log_to_file" - app:defaultValue="false" - app:summary="@string/settings_summary_log_to_file" - app:iconSpaceReserved="false" /> - <SwitchPreferenceCompat - app:key="Logging/LogToDebug" - app:title="@string/settings_log_to_logcat" - app:defaultValue="false" - app:summary="@string/settings_summary_log_to_logcat" - app:iconSpaceReserved="false" /> - <SwitchPreferenceCompat - app:key="BIOS/PatchTTYEnable" - app:title="@string/settings_console_tty_output" - app:defaultValue="false" - app:summary="@string/settings_summary_console_tty_output" - app:iconSpaceReserved="false" /> - </PreferenceCategory> - - <PreferenceCategory app:title="@string/settings_category_achievements" app:iconSpaceReserved="false"> - <SwitchPreferenceCompat - app:key="Cheevos/TestMode" - app:title="@string/settings_achievements_test_mode" - app:summary="@string/settings_summary_achievements_test_mode" - app:defaultValue="false" - app:iconSpaceReserved="false" /> - <SwitchPreferenceCompat - app:key="Cheevos/UseFirstDiscFromPlaylist" - app:title="@string/settings_achievements_use_first_disc_from_playlist" - app:summary="@string/settings_summary_achievements_use_first_disc_from_playlist" - app:defaultValue="true" - app:iconSpaceReserved="false" /> - </PreferenceCategory> - -</PreferenceScreen> diff --git a/android/app/src/main/res/xml/audio_preferences.xml b/android/app/src/main/res/xml/audio_preferences.xml deleted file mode 100644 index 53e64ca38..000000000 --- a/android/app/src/main/res/xml/audio_preferences.xml +++ /dev/null @@ -1,51 +0,0 @@ -<!-- - ~ Copyright 2018 The app Open Source Project - ~ - ~ Licensed under the Apache License, Version 2.0 (the "License"); - ~ you may not use this file except in compliance with the License. - ~ You may obtain a copy of the License at - ~ - ~ http://www.apache.org/licenses/LICENSE-2.0 - ~ - ~ Unless required by applicable law or agreed to in writing, software - ~ distributed under the License is distributed on an "AS IS" BASIS, - ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - ~ See the License for the specific language governing permissions and - ~ limitations under the License. - --> - -<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:app="http://schemas.android.com/apk/res-auto"> - - <SeekBarPreference - app:key="Audio/OutputVolume" - app:title="@string/settings_volume" - app:summary="@string/settings_summary_volume" - app:defaultValue="100" - android:max="100" - app:min="0" - app:iconSpaceReserved="false" - app:showSeekBarValue="true" /> - <SeekBarPreference - app:key="Audio/FastForwardVolume" - app:title="@string/settings_fast_forward_volume" - app:summary="@string/settings_summary_fast_forward_volume" - app:defaultValue="100" - android:max="100" - app:min="0" - app:iconSpaceReserved="false" - app:showSeekBarValue="true" /> - <SwitchPreferenceCompat - app:key="Audio/OutputMuted" - app:title="@string/settings_mute_all_sound" - app:defaultValue="false" - app:summary="@string/settings_summary_mute_all_sound" - app:iconSpaceReserved="false" /> - <SwitchPreferenceCompat - app:key="CDROM/MuteCDAudio" - app:title="@string/settings_mute_cd_audio" - app:defaultValue="false" - app:summary="@string/settings_summary_mute_cd_audio" - app:iconSpaceReserved="false" /> - -</PreferenceScreen> diff --git a/android/app/src/main/res/xml/controllers_preferences.xml b/android/app/src/main/res/xml/controllers_preferences.xml deleted file mode 100644 index 8b0654dcc..000000000 --- a/android/app/src/main/res/xml/controllers_preferences.xml +++ /dev/null @@ -1,93 +0,0 @@ -<!-- - ~ Copyright 2018 The app Open Source Project - ~ - ~ Licensed under the Apache License, Version 2.0 (the "License"); - ~ you may not use this file except in compliance with the License. - ~ You may obtain a copy of the License at - ~ - ~ http://www.apache.org/licenses/LICENSE-2.0 - ~ - ~ Unless required by applicable law or agreed to in writing, software - ~ distributed under the License is distributed on an "AS IS" BASIS, - ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - ~ See the License for the specific language governing permissions and - ~ limitations under the License. - --> - -<PreferenceScreen xmlns:app="http://schemas.android.com/apk/res-auto"> - - <PreferenceCategory - app:iconSpaceReserved="false" - app:title="@string/controller_settings_category_touchscreen_controller"> - <ListPreference - app:defaultValue="digital" - app:entries="@array/settings_touchscreen_controller_view_entries" - app:entryValues="@array/settings_touchscreen_controller_view_values" - app:iconSpaceReserved="false" - app:key="Controller1/TouchscreenControllerView" - app:title="@string/settings_touchscreen_controller_view" - app:useSimpleSummaryProvider="true" /> - <ListPreference - app:defaultValue="0" - app:entries="@array/settings_touchscreen_controller_port_entries" - app:entryValues="@array/settings_touchscreen_controller_port_values" - app:iconSpaceReserved="false" - app:key="TouchscreenController/PortIndex" - app:title="@string/settings_touchscreen_controller_port" - app:useSimpleSummaryProvider="true" /> - <SwitchPreferenceCompat - app:defaultValue="false" - app:iconSpaceReserved="false" - app:key="Controller1/AutoHideTouchscreenController" - app:summary="@string/settings_summary_auto_hide_touchscreen_controller" - app:title="@string/settings_auto_hide_touchscreen_controller" /> - <SwitchPreferenceCompat - app:defaultValue="false" - app:iconSpaceReserved="false" - app:key="Controller1/TouchGliding" - app:summary="@string/settings_summary_touch_gliding" - app:title="@string/settings_touch_gliding" /> - <SwitchPreferenceCompat - app:defaultValue="false" - app:iconSpaceReserved="false" - app:key="Controller1/HapticFeedback" - app:summary="@string/settings_summary_vibrate_on_press" - app:title="@string/settings_vibrate_on_press" /> - <SwitchPreferenceCompat - app:defaultValue="false" - app:iconSpaceReserved="false" - app:key="Controller1/Vibration" - app:summary="@string/settings_summary_enable_vibration" - app:title="@string/settings_enable_vibration" /> - </PreferenceCategory> - - <PreferenceCategory - app:iconSpaceReserved="false" - app:title="@string/controller_settings_category_ports"> - <ListPreference - app:defaultValue="Disabled" - app:entries="@array/settings_multitap_mode_entries" - app:entryValues="@array/settings_multitap_mode_values" - app:iconSpaceReserved="false" - app:key="ControllerPorts/MultitapMode" - app:title="@string/settings_multitap_mode" - app:useSimpleSummaryProvider="true" /> - <ListPreference - app:defaultValue="PerGameTitle" - app:entries="@array/settings_memory_card_mode_entries" - app:entryValues="@array/settings_memory_card_mode_values" - app:iconSpaceReserved="false" - app:key="MemoryCards/Card1Type" - app:title="@string/settings_memory_card_1_type" - app:useSimpleSummaryProvider="true" /> - <ListPreference - app:defaultValue="None" - app:entries="@array/settings_memory_card_mode_entries" - app:entryValues="@array/settings_memory_card_mode_values" - app:iconSpaceReserved="false" - app:key="MemoryCards/Card2Type" - app:title="@string/settings_memory_card_2_type" - app:useSimpleSummaryProvider="true" /> - </PreferenceCategory> - -</PreferenceScreen> diff --git a/android/app/src/main/res/xml/display_preferences.xml b/android/app/src/main/res/xml/display_preferences.xml deleted file mode 100644 index 2d55a57ed..000000000 --- a/android/app/src/main/res/xml/display_preferences.xml +++ /dev/null @@ -1,129 +0,0 @@ -<!-- - ~ Copyright 2018 The app Open Source Project - ~ - ~ Licensed under the Apache License, Version 2.0 (the "License"); - ~ you may not use this file except in compliance with the License. - ~ You may obtain a copy of the License at - ~ - ~ http://www.apache.org/licenses/LICENSE-2.0 - ~ - ~ Unless required by applicable law or agreed to in writing, software - ~ distributed under the License is distributed on an "AS IS" BASIS, - ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - ~ See the License for the specific language governing permissions and - ~ limitations under the License. - --> - -<PreferenceScreen xmlns:app="http://schemas.android.com/apk/res-auto"> - - <ListPreference - app:key="Display/CropMode" - app:title="@string/settings_crop_mode" - app:entries="@array/settings_display_crop_mode_entries" - app:entryValues="@array/settings_display_crop_mode_values" - app:defaultValue="Overscan" - app:useSimpleSummaryProvider="true" - app:iconSpaceReserved="false" /> - - <ListPreference - app:key="Display/AspectRatio" - app:title="@string/settings_aspect_ratio" - app:entries="@array/settings_display_aspect_ratio_names" - app:entryValues="@array/settings_display_aspect_ratio_values" - app:defaultValue="Auto (Game Native)" - app:useSimpleSummaryProvider="true" - app:iconSpaceReserved="false" /> - - <com.github.stenzek.duckstation.RatioPreference - numeratorKey="Display/CustomAspectRatioNumerator" - defaultNumerator="4" - minimumNumerator="1" - maximumNunerator="100" - denominatorKey="Display/CustomAspectRatioDenominator" - defaultDenominator="3" - minimumDenominator="1" - maximumDenominator="100" - app:title="@string/settings_custom_aspect_ratio" - app:summary="@string/settings_summary_custom_aspect_ratio" - app:useSimpleSummaryProvider="true" - app:iconSpaceReserved="false" /> - - <ListPreference - app:key="GPU/DownsampleMode" - app:title="@string/settings_downsample_mode" - app:entries="@array/settings_downsample_mode_entries" - app:entryValues="@array/settings_downsample_mode_values" - app:defaultValue="Disabled" - app:useSimpleSummaryProvider="true" - app:iconSpaceReserved="false" /> - - <SwitchPreferenceCompat - app:key="Display/IntegerScaling" - app:title="@string/settings_integer_upscaling" - app:defaultValue="false" - app:disableDependentsState="true" - app:summary="@string/settings_summary_integer_upscaling" - app:iconSpaceReserved="false" /> - - <SwitchPreferenceCompat - app:key="Display/LinearFiltering" - app:title="@string/settings_linear_upscaling" - app:defaultValue="true" - app:dependency="Display/IntegerScaling" - app:summary="@string/settings_summary_linear_upscaling" - app:iconSpaceReserved="false" /> - - <SwitchPreferenceCompat - app:key="Display/Stretch" - app:title="@string/settings_display_stretch" - app:defaultValue="false" - app:dependency="Display/IntegerScaling" - app:summary="@string/settings_summary_display_stretch" - app:iconSpaceReserved="false" /> - - <SwitchPreferenceCompat - app:key="Display/ExpandToCutout" - app:title="@string/settings_expand_to_cutout" - app:defaultValue="false" - app:summary="@string/settings_summary_expand_to_cutout" - app:iconSpaceReserved="false" /> - - <SwitchPreferenceCompat - app:key="Display/ShowOSDMessages" - app:title="@string/settings_osd_show_messages" - app:defaultValue="true" - app:summary="@string/settings_summary_osd_show_messages" - app:iconSpaceReserved="false" /> - - <SwitchPreferenceCompat - app:key="Display/ShowSpeed" - app:title="@string/settings_osd_show_speed" - app:defaultValue="false" - app:summary="@string/settings_summary_osd_show_speed" - app:iconSpaceReserved="false" /> - <SwitchPreferenceCompat - app:key="Display/ShowVPS" - app:title="@string/settings_osd_show_show_vps" - app:defaultValue="false" - app:summary="@string/settings_summary_osd_show_vps" - app:iconSpaceReserved="false" /> - <SwitchPreferenceCompat - app:key="Display/ShowFPS" - app:title="@string/settings_osd_show_show_fps" - app:defaultValue="false" - app:summary="@string/settings_summary_osd_show_fps" - app:iconSpaceReserved="false" /> - <SwitchPreferenceCompat - app:key="Display/ShowResolution" - app:title="@string/settings_osd_show_show_resolution" - app:defaultValue="false" - app:summary="@string/settings_summary_osd_show_resolution" - app:iconSpaceReserved="false" /> - <SwitchPreferenceCompat - app:key="Display/ShowInputs" - app:title="@string/settings_osd_show_show_inputs" - app:defaultValue="false" - app:summary="@string/settings_summary_osd_show_inputs" - app:iconSpaceReserved="false" /> - -</PreferenceScreen> diff --git a/android/app/src/main/res/xml/enhancements_preferences.xml b/android/app/src/main/res/xml/enhancements_preferences.xml deleted file mode 100644 index a0621cfd9..000000000 --- a/android/app/src/main/res/xml/enhancements_preferences.xml +++ /dev/null @@ -1,154 +0,0 @@ -<!-- - ~ Copyright 2018 The app Open Source Project - ~ - ~ Licensed under the Apache License, Version 2.0 (the "License"); - ~ you may not use this file except in compliance with the License. - ~ You may obtain a copy of the License at - ~ - ~ http://www.apache.org/licenses/LICENSE-2.0 - ~ - ~ Unless required by applicable law or agreed to in writing, software - ~ distributed under the License is distributed on an "AS IS" BASIS, - ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - ~ See the License for the specific language governing permissions and - ~ limitations under the License. - --> - -<PreferenceScreen xmlns:app="http://schemas.android.com/apk/res-auto"> - <ListPreference - app:key="CDROM/ReadSpeedup" - app:title="@string/settings_cdrom_read_speedup" - app:entries="@array/settings_cdrom_read_speedup_entries" - app:entryValues="@array/settings_cdrom_read_speedup_values" - app:defaultValue="1" - app:summary="@string/settings_summary_cdrom_read_speedup" - app:useSimpleSummaryProvider="true" - app:iconSpaceReserved="false" /> - <ListPreference - app:key="CDROM/SeekSpeedup" - app:title="@string/settings_cdrom_seek_speedup" - app:entries="@array/settings_cdrom_seek_speedup_entries" - app:entryValues="@array/settings_cdrom_seek_speedup_values" - app:defaultValue="1" - app:summary="@string/settings_summary_cdrom_seek_speedup" - app:useSimpleSummaryProvider="true" - app:iconSpaceReserved="false" /> - <SwitchPreferenceCompat - app:key="BIOS/PatchFastBoot" - app:title="@string/settings_console_fast_boot" - app:defaultValue="true" - app:summary="@string/settings_summary_console_fast_boot" - app:iconSpaceReserved="false" /> - <ListPreference - app:key="GPU/ResolutionScale" - app:title="@string/settings_gpu_resolution_scale" - app:entries="@array/settings_gpu_resolution_scale_entries" - app:entryValues="@array/settings_gpu_resolution_scale_values" - app:defaultValue="1" - app:useSimpleSummaryProvider="true" - app:iconSpaceReserved="false" /> - <ListPreference - app:key="GPU/MSAA" - app:title="@string/settings_msaa" - app:entries="@array/settings_gpu_msaa_entries" - app:entryValues="@array/settings_gpu_msaa_values" - app:defaultValue="1" - app:useSimpleSummaryProvider="true" - app:iconSpaceReserved="false" /> - <SwitchPreferenceCompat - app:key="GPU/TrueColor" - app:title="@string/settings_true_color" - app:summary="@string/settings_summary_true_color" - app:iconSpaceReserved="false" /> - - <SwitchPreferenceCompat - app:key="GPU/ScaledDithering" - app:title="@string/settings_scaled_dithering" - app:defaultValue="true" - app:summary="@string/settings_summary_scaled_dithering" - app:iconSpaceReserved="false" /> - - <SwitchPreferenceCompat - app:key="GPU/DisableInterlacing" - app:title="@string/settings_disable_interlacing" - app:defaultValue="true" - app:summary="@string/settings_summary_disable_interlacing" - app:iconSpaceReserved="false" /> - - <ListPreference - app:key="GPU/TextureFilter" - app:title="@string/settings_texture_filtering" - app:entries="@array/settings_gpu_texture_filter_names" - app:entryValues="@array/settings_gpu_texture_filter_values" - app:defaultValue="Nearest" - app:useSimpleSummaryProvider="true" - app:iconSpaceReserved="false" /> - - <SwitchPreferenceCompat - app:key="GPU/ForceNTSCTimings" - app:title="@string/settings_force_ntsc_timings" - app:defaultValue="false" - app:summary="@string/settings_summary_force_ntsc_timings" - app:iconSpaceReserved="false" /> - - <SwitchPreferenceCompat - app:key="GPU/WidescreenHack" - app:title="@string/settings_widescreen_hack" - app:defaultValue="false" - app:summary="@string/settings_summary_widescreen_hack" - app:iconSpaceReserved="false" /> - - <SwitchPreferenceCompat - app:key="Display/Force4_3For24Bit" - app:title="@string/settings_force_4_3_for_24bit" - app:defaultValue="false" - app:summary="@string/settings_summary_force_4_3_for_24bit" - app:iconSpaceReserved="false" /> - - <SwitchPreferenceCompat - app:key="GPU/ChromaSmoothing24Bit" - app:title="@string/settings_chroma_smoothing_24bit" - app:defaultValue="false" - app:summary="@string/settings_summary_chrome_smoothing_24bit" - app:iconSpaceReserved="false" /> - - <SwitchPreferenceCompat - app:key="GPU/PGXPEnable" - app:title="@string/settings_pgxp_geometry_correction" - app:defaultValue="false" - app:summary="@string/settings_summary_pgxp_geometry_correction" - app:iconSpaceReserved="false" /> - - <SwitchPreferenceCompat - app:key="GPU/PGXPCulling" - app:title="@string/settings_pgxp_culling_correction" - app:dependency="GPU/PGXPEnable" - app:defaultValue="true" - app:summary="@string/settings_summary_pgxp_culling_correction" - app:iconSpaceReserved="false" /> - - <SwitchPreferenceCompat - app:key="GPU/PGXPTextureCorrection" - app:title="@string/settings_pgxp_texture_correction" - app:dependency="GPU/PGXPEnable" - app:defaultValue="true" - app:summary="@string/settings_summary_pgxp_texture_correction" - app:iconSpaceReserved="false" /> - - <SwitchPreferenceCompat - app:key="GPU/PGXPPreserveProjFP" - app:title="@string/settings_pgxp_preserve_projection_precision" - app:dependency="GPU/PGXPEnable" - app:defaultValue="false" - app:summary="@string/settings_summary_pgxp_preserve_projection_precision" - app:iconSpaceReserved="false" /> - - <SwitchPreferenceCompat - app:key="GPU/PGXPDepthBuffer" - app:title="@string/settings_pgxp_depth_buffer" - app:dependency="GPU/PGXPEnable" - app:defaultValue="false" - app:summary="@string/settings_summary_pgxp_depth_buffer" - app:iconSpaceReserved="false" /> - -</PreferenceScreen> diff --git a/android/app/src/main/res/xml/general_preferences.xml b/android/app/src/main/res/xml/general_preferences.xml deleted file mode 100644 index 917b543f2..000000000 --- a/android/app/src/main/res/xml/general_preferences.xml +++ /dev/null @@ -1,83 +0,0 @@ -<!-- - ~ Copyright 2018 The app Open Source Project - ~ - ~ Licensed under the Apache License, Version 2.0 (the "License"); - ~ you may not use this file except in compliance with the License. - ~ You may obtain a copy of the License at - ~ - ~ http://www.apache.org/licenses/LICENSE-2.0 - ~ - ~ Unless required by applicable law or agreed to in writing, software - ~ distributed under the License is distributed on an "AS IS" BASIS, - ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - ~ See the License for the specific language governing permissions and - ~ limitations under the License. - --> - -<PreferenceScreen xmlns:app="http://schemas.android.com/apk/res-auto" - xmlns:android="http://schemas.android.com/apk/res/android"> - <Preference - app:title="@string/settings_game_directories" - app:summary="@string/settings_summary_game_directories" - app:iconSpaceReserved="false"> - <intent - android:action="android.intent.action.VIEW" - android:targetClass="com.github.stenzek.duckstation.GameDirectoriesActivity" - android:targetPackage="com.github.stenzek.duckstation" /> - </Preference> - <ListPreference - app:key="Main/EmulationSpeed" - app:title="@string/settings_emulation_speed" - app:entries="@array/settings_emulation_speed_entries" - app:entryValues="@array/settings_emulation_speed_values" - app:defaultValue="1.0" - app:useSimpleSummaryProvider="true" - app:iconSpaceReserved="false" /> - <ListPreference - app:key="Main/FastForwardSpeed" - app:title="@string/settings_fast_forward_speed" - app:entries="@array/settings_emulation_speed_entries" - app:entryValues="@array/settings_emulation_speed_values" - app:defaultValue="0.0" - app:useSimpleSummaryProvider="true" - app:iconSpaceReserved="false" /> - <ListPreference - app:key="Main/EmulationScreenOrientation" - app:title="@string/settings_emulation_screen_orientation" - app:entries="@array/settings_emulation_screen_orientation_entries" - app:entryValues="@array/settings_emulation_screen_orientation_values" - app:defaultValue="unspecified" - app:useSimpleSummaryProvider="true" - app:iconSpaceReserved="false" /> - <SwitchPreferenceCompat - app:key="Main/SaveStateOnExit" - app:title="@string/settings_save_state_on_exit" - app:defaultValue="true" - app:summary="@string/settings_summary_save_state_on_exit" - app:iconSpaceReserved="false" /> - <ListPreference - app:key="GPU/Renderer" - app:title="@string/settings_gpu_renderer" - app:entries="@array/gpu_renderer_entries" - app:entryValues="@array/gpu_renderer_values" - app:defaultValue="OpenGL" - app:useSimpleSummaryProvider="true" - app:iconSpaceReserved="false" /> - <ListPreference - app:key="Main/Language" - app:title="@string/settings_language" - app:defaultValue="none" - app:entries="@array/settings_language_entries" - app:entryValues="@array/settings_language_values" - app:useSimpleSummaryProvider="true" - app:iconSpaceReserved="false" /> - <ListPreference - app:key="Main/Theme" - app:title="@string/settings_theme" - app:entries="@array/settings_theme_entries" - app:entryValues="@array/settings_theme_values" - app:defaultValue="follow_system" - app:useSimpleSummaryProvider="true" - app:iconSpaceReserved="false" /> - -</PreferenceScreen> diff --git a/android/app/src/main/res/xml/network_security_config.xml b/android/app/src/main/res/xml/network_security_config.xml deleted file mode 100644 index f86a16beb..000000000 --- a/android/app/src/main/res/xml/network_security_config.xml +++ /dev/null @@ -1,6 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<network-security-config> - <domain-config cleartextTrafficPermitted="true"> - <domain includeSubdomains="true">i.retroachievements.org</domain> - </domain-config> -</network-security-config> diff --git a/android/app/src/test/java/com/github/stenzek/duckstation/ExampleUnitTest.java b/android/app/src/test/java/com/github/stenzek/duckstation/ExampleUnitTest.java deleted file mode 100644 index b90ac4a49..000000000 --- a/android/app/src/test/java/com/github/stenzek/duckstation/ExampleUnitTest.java +++ /dev/null @@ -1,17 +0,0 @@ -package com.github.stenzek.duckstation; - -import org.junit.Test; - -import static org.junit.Assert.*; - -/** - * Example local unit test, which will execute on the development machine (host). - * - * @see <a href="http://d.android.com/tools/testing">Testing documentation</a> - */ -public class ExampleUnitTest { - @Test - public void addition_isCorrect() { - assertEquals(4, 2 + 2); - } -} \ No newline at end of file diff --git a/android/build.gradle b/android/build.gradle deleted file mode 100644 index 0be6f99d2..000000000 --- a/android/build.gradle +++ /dev/null @@ -1,25 +0,0 @@ -// Top-level build file where you can add configuration options common to all sub-projects/modules. - -buildscript { - repositories { - google() - mavenCentral() - } - dependencies { - classpath 'com.android.tools.build:gradle:4.2.1' - - // NOTE: Do not place your application dependencies here; they belong - // in the individual module build.gradle files - } -} - -allprojects { - repositories { - google() - mavenCentral() - } -} - -task clean(type: Delete) { - delete rootProject.buildDir -} diff --git a/android/gradle.properties b/android/gradle.properties deleted file mode 100644 index 199d16ede..000000000 --- a/android/gradle.properties +++ /dev/null @@ -1,20 +0,0 @@ -# Project-wide Gradle settings. -# IDE (e.g. Android Studio) users: -# Gradle settings configured through the IDE *will override* -# any settings specified in this file. -# For more details on how to configure your build environment visit -# http://www.gradle.org/docs/current/userguide/build_environment.html -# Specifies the JVM arguments used for the daemon process. -# The setting is particularly useful for tweaking memory settings. -org.gradle.jvmargs=-Xmx1536m -# When configured, Gradle will run in incubating parallel mode. -# This option should only be used with decoupled projects. More details, visit -# http://www.gradle.org/docs/current/userguide/multi_project_builds.html#sec:decoupled_projects -# org.gradle.parallel=true -# AndroidX package structure to make it clearer which packages are bundled with the -# Android operating system, and which are packaged with your app's APK -# https://developer.android.com/topic/libraries/support-library/androidx-rn -android.useAndroidX=true -# Automatically convert third-party libraries to use AndroidX -android.enableJetifier=true - diff --git a/android/gradle/wrapper/gradle-wrapper.jar b/android/gradle/wrapper/gradle-wrapper.jar deleted file mode 100644 index f6b961fd5a86aa5fbfe90f707c3138408be7c718..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 54329 zcmagFV|ZrKvM!pAZQHhO+qP}9lTN<awrzcJ(s9S^*tV^{eb3tK-m}(Od!HXQ=loIi zj8XF$V^r1q)=-uM14jn|frbVF0TKBtARwUs>j?q^^Y^VFp)SH8qbSJ)2BQ2giqr}t zFG7D6)c?v~^Z#E_K}1nTQbJ9gQ9<%vVRAxVj)8FwL5_iTdUB>&m3fhE=kRWl;g`&m z!W5kh{WsV%fO*<Mi7rh$7Dd@XiRrI_)~u7vTi09HZ~r#n-!cBbnSuZPc5=1)KPL6R z>%je&j+Lv4xxK~zsEYQls$Q-p&dwID|A)!7uWtJF-=Tm1{V@#x*+kUI$=%KUuf2ka zjiZ{oiL1MXE2EjciJM!jrjFNwCh`~hL>iemrqwqnX?T*MX;U>>8yRcZb{Oy+VKZos zLiFKYPw=LcaaQt8tj=eoo3-@bG_342HQ%?jpgAE?KCLEHC+DmjxAfJ%Og^$dpC8Xw zAcp-)tfJm}BPNq_+6m4gBgBm3+CvmL>4|$2N$^Bz7W(}fz1?U-u;nE`+9`KCLuqg} zwNstNM!J4Uw|78&Y9~9>MLf56to!@qGkJw5Thx%zkzj%Ek9Nn1QA@8NBXbwyWC>9H z#EPwjMNYPigE>*Ofz)HfTF&%PFj$U6mCe-AFw$U%-L?~-+nSXHHKkdgC5KJRTF}`G zE_HNdrE}S0zf4j{r_f-V2imSqW?}3w-4=f@o@-q+c<jxZ)hJGoUQe?`w={^dq{L*; zo#MT%&<y5(Xhp#!?qX!hl87p;R?!hIpXe#kMGshFw+C8Kd9<p_X4=M~uw2+;Pb%sg z$^33?cTFtvlm_)Z_va(O%DPX_=rK70hyM+uO<&(!lk4n5&a;xyeyPCZ^EqWXBR}af zaj&NXw6QBwNh(mGxywqFtF$2N>ZgaAbZ((hn))@|eWWhcT2pLpTpL!;_5*vM=sRL8 zqU##{U#lJKuyqW^X$ETU5ETeEVzhU|1m1750#f}38_5N9)B_2|v@1hUu=Kt7-@dhA zq_`OMgW01n`%1dB*}C)qxC8q;?zPeF_r;>}%JYmlER_1CUbKa07+=TV45~symC*g8 zW-8(gag#cAOuM0B1xG8eTp5HGVLE}+gYTmK=`XVVV*U!>H`~j4+ROIQ+NkN$LY>h4 zqpwdeE_@AX@PL};e5vTn`Ro(EjHVf$;^oiA%@IBQq>R7_D>m2D4OwwEepkg}R_k*M zM-o;+P27087eb+%*+6vWFCo9UEGw>t&WI17Pe7QVuoAoGHdJ(TEQNlJOqnjZ8adCb zI`}op16D@v7UOEo%8E-~m?c8FL1utPYlg@m$q@q7%mQ4?OK1h%ODjTj<zl>Fvqd!C z-PI?8qX8{a@6d&Lb_X+hKxCI<?sRKEGp0kXECYz$Y`2aJFm_ruTJgdH&EikAH~SRF zey>mb*3GFemm?W_du5_&EqRq!+H?5#xiX#w$eLti-?E$;Dhu`{R(o>LzM4CjO>ICf z&DMfES#FW7npnbcuqREgjPQM#gs6h>`av_oEWwOJZ2i2|D|0~pYd#WazE2Bbsa}X@ zu;(9fi~%!VcjK6)?_wMAW-YXJAR{QHxrD5g(ou9mR6LPSA4BRG1QSZT6A?kelP_g- zH(JQjLc!`H4N=oLw=f3{+WmPA*s8QEeEUf6Vg}@!xwnsnR0bl~^2GSa5vb!Yl&4!> zWb|KQUsC$lT=3A|7vM9+d;mq=@L%uWKwXiO9}a~gP4s_4Yohc!fKEgV7WbV<YDeeg zQ?eWqkDKATh@$=^kQK|Zk0*`Xf6$X8x1&1wqaixwkT+yU?opKnm;TIqyG0x&ow8sa z)=S))qB&;v{b@ppB_k95vf4BVVz;!?%B@#z@4NSjRg64B1eG@=EjBDc#m){H_`sJD zQPcp_pRarLaMnT-CL|?hRf&U{+yVF`y}a+x-?AvBM^F8uh+Qh&4md*yb4Zv2-BF$u ziaZL^*|!IDKv$Gfg`}tw!`qURCKO3u__(iMWWJ#OHCR}Om|GVAJu!d(6|(<)a*8{7 zIodm!n3J>o<Gc)rQGgv_Mh@Gy=Fp|{WD0>>2ITb<Ig>E*i`a|V!^p@~^<={#?Gz57 zyPWeM2@p>D*FW#W5Q`1`#5NW62XduP1XNO(bhg&cX`-LYZa|m-**bu|>}S;3)eP8_ zp<y0TbX2emKIh^Fa-%^()iEHVuFR61v6x$OO459|%LCMbo$9Pk(Dy<K?l{N-{^dlW zv!w8%lGu<$;jx1V9t;El{}!Ldop{}l{)SHBzY&7{|Kg*vtCP2nh=;qig`>NTnTfm8 ze+7wDH3KJ95p)5tlwk`S7mbD`SqHnYD*6`;gpp8VdHDz%RR_~I_Ar>5)vE-Pgu7^Y z|9Px+>pi3!DV%E%4N;ii0U3VBd2ZJNUY1YC^-e+{DYq+<s62Rxu9!=x?KWlvcrf;q z4fY#)oIvMwNpv5$b<8W~q5Rjv`g}I=`!E53wgM-_pz0>l@cGtmu(H#Oh%ibUBOd?C z{y5jW3v=0eV0r@qMLgv1JjZC|cZ9l9Q)k1lLgm))UR@#FrJd>w^`+iy$c9F@ic-|q zVHe@S2UAnc5VY_U4253QJxm&Ip!XKP8WNcnx9^cQ;KH6PlW8%pSihSH2(@{2m_o+m zr((MvBja2ctg0d0&U5XTD;5?d?h%JcRJp{_1BQW1xu&BrA3(a4Fh9hon-ly$pyeHq zG&<CL?eS1$gJN*;*inDHGT<|Xs>;6q?m%NJ36K1Sq_=fdP(4f{Hop;_G_(i?sPzvB zDM}>*(uOsY0I1j^{$yn3#U(;B*g4cy$-1DTOkh3P!LQ;lJlP%jY8}Nya=h8$XD~%Y zbV&HJ%eCD9nui-0cw!+n`V~p6VCRqh5fR<OO9ra1Pl6`~x$5GYS_C-}DD{ww$JZZ% z=T(bF-n%!zaxtTJD5#J!5jT#KG0^JLQEpCV#$XRjn~Y#yGVR9DCn~E&eC2Y^tdTQB zh0qU)tu{|o{DAz|O_XqpGL3`?0z!!o0z&dXFR*`Xp<Ep}WAtSY0j0G~oLEUBP3Z>X z8`GbdZ@73r7~myQLBW%db;+BI?c-a>Y)m-FW~M=1^|<21_Sh9RT3iGbO{o-hpN%d6 z7%++#WekoBOP^d0$$|5npPe>u3PLvX_gjH2x(?{&z{jJ2tAOWTznPxv-pAv<*V7r$ z6&glt>7CAClWz6FEi3bToz-soY^{ScrjwVPV51=>n->c(NJngMj6TyHty`bfkF1hc zkJS%A@cL~QV0-aK4>Id!9dh7>0IV;1J9(myDO+gv76L3NLMUm9XyPauvNu$S<)-|F zZS}(kK_WnB)Cl`U?jsdYfAV4nrgzIF@+%1U8$poW&h^c6>kCx3;||fS1_7JvQT~CV zQ8Js+!p)3oW>Df(-}uqC`Tcd%E7GdJ0p}kYj5j8NKMp(KUs9u7?jQ94C)}0rba($~ zqyBx$(1ae^HEDG`Zc@-rXk1cqc7v0wibOR4qpgRDt#>-*8N3P;uKV0CgJE2SP>#8h z=+;i_CGlv+B^+$5a}SicVaSeaNn29K`C&=}`=#Nj&WJP9Xhz4mVa<+yP6hkrq1vo= z1rX4qg8dc4pmEvq%NAkpMK>mf2g?tg_1k2%v}<3`$6~Wlq<DlOQ=}&%93mb{Vn~Ry zHv_6my*MG0QdZB_mSSOt?UzC^Ff*hPNF^k7u-Y8h(v3`<>@ItJ*PhHPoEh1Yi>v57 z4k0JMO)*=S`tKvR5gb-(VTEo>5Y>DZJZzgR+j6{Y`kd|jCVr<S=g{oaepfM8<qKkC zElzx{_tUc3MD9$yG|RFvX^C!qvpq6Yr`K2~b_No)saZ8St1KkQCthfa-6qthD`c4+ zGV6Rc3T2Br8#HtrCO$Ge(@KyZtK<qjHXNyyMO{^v+fy#vCoGOxuDPcN@*~X?Dg~2< zo3xP+;)XFlr)oO_@Yk;iiSQ<`v)sFoDAa&!D$S@cm9Q)=IVs9AD>g!>2hVjz({kZR z`dLlKhoqT!aI8=S+fVp(5*Dn6RrbpyO~0+?fy;bm$0jmTN|t5i6rxqr4=O}dY+ROd zo9Et|x}!u*xi~>-y>!M^+f&jc;IAsGiM_^}+4|pHRn{LThFFpD{bZ|TA*wcGm}XV^ zr*C6~@^5X-*R%FrHIgo-hJTBcyQ|3QEj+cSqp#>&t`ZzB?cXM6S(lRQw$I2?m5=wd z78ki`R?%;o%VUhXH?Z#(uwAn9$m`npJ=cA+lHGk@T7qq_M6Zoy1Lm9E0UUysN)I_x zW__OAqvku^>`J&CB=ie@yNWsaFmem}#L3T(x?a`oZ+$;3O-icj2(5z72Hnj=9Z0w% z<2#q-R=>hig*(t0^v)eGq2DHC%GymE-_j1WwBVGoU=GORGjtaqr0BNigOCqyt;O(S zKG+DoBsZU~okF<7ahjS}bzwXxbAxFfQAk&O@>LsZMsZ`?N?|CDWM(vOm%B3CBPC3o z%2t@%H$fwur}SSnckUm0-k)mOtht`?nwsDz=2#v=RBPGg39i#%odKq{K^;bTD!6A9 zskz$}t)sU^=a#jLZP@I=bPo?f-L}wpMs{Tc!m7-bi!Ldqj3EA~V;4(dltJmTXqH0r z%HAWKGutEc9vOo3P6Q;JdC^YTnby->VZ6&X8f{obffZ??1(cm&L2<AcM~Uq<(8Ng( z=Otn3JE$IgV`95rhf%=i7-nH1pH+w7+?S|;5r@T$Fl?EhLmgqP#9BRA4Od_xjk7ad zM5h|cpfoMxrWsLSApyv{$l`9&hh@@ig<>h7q)*w**+sE6dG*;(H|_Q!WxU{g)CeoT z(K<vy4U2)MD?P@=!pGsq#g)TUpCl$zNfpzIh^JdcRQUBj6{U$eEIgsR1-jF~hzD@# zN_VKRN+8h%NuhPCbRU>Y&bv!Usc|m+Fqfmk;h&RNF|LWuNZ!+DdX*L=s-=_iH=@i` z?Z+Okq^cFO4}_n|G*!)Wl_i%qiMBaH8(WuXtgI7EO=M>=i_+<rx1le^rMzvb;2h?0 z5sc4KeR7b9d(*GtIX!Y8kET`N&XUeFRlEW3zfBJ3g<;m3WGbd>;MDjf3aY~6S9w0K zUuDO7O5Ta6+k40~xh~)D{=L&?Y0?c$s9cw*Ufe18)zzk%#ZY>Tr^|e%8KPb0ht`b( zuP@8#Ox@nQIqz9}AbW0RzE`Cf>39bOWz5N3qzS}ocxI=o$W|(nD~@EhW13Rj5nAp; zu2obEJa=kGC*#3=MkdkWy_%RKcN=?g$7!AZ8vBYKr$ePY(8aIQ&yRPlQ=mudv#q$q z4%WzAx=B{i)UdLFx4os?rZp6poShD7Vc&mSD@RdBJ=_m^&OlkEE1DFU@csgKcBifJ zz4N<X6zjOG6Pd$1)TIqw@?KA4;{l<rWcd@b+&$U8lC6nP$yh8NT>7+XEJhYzzO=86 z#%eBQZ$Nsf2+X0XPHUNmg#(sNt^NW1Y0|M(${e<0kW6f2q5M!2YE|hSEQ*X-%qo(V zHaFwyGZ0on=I{=fhe<=zo{=Og-_(to3?cvL4m6PymtNsdDINsBh8m>a%!5o3s(en) z<K3a<NOCWAOnN#<ht7DdTp3h4WBk0Vi+Wi^QJ?}w8I92)imOJ|Ldj_FrC*44f>=1I z6O+YNertC|OFNqd6P=$gMyvmfa`w~p9*gKDESFqNBy(~Zw3TFDYh}$iudn)9HxPBi zdokK@o~nu?%imcURr5Y~?6oo_JB<T{06ROY)xvOYMQE?=Q{O2ChH1OG#K_}G(cC`M z&0>e}t|pU5qjai|#JDyG=i^V~7+a{dEnO<(y>ahND#_X_fcEBNiZ)uc&%1HVtx8Ts z*H_Btvx^IhkfOB#{szN*n6;y05A>3eARDXslaE>tnLa>+`V&cgho?ED+&vv5KJszf zG4@G;7i;4_bVvZ>!mli3j7~tPgybF5|J6=Lt`u$D%X0l}#iY9nOXH@(%FFJLtzb%p zzHfABnSs;v-9(&nzbZytLiqqDIWzn>JQDk#JULcE5CyPq_<R&*SSGLH#zOQ)FlXn- zeg1Seb_q|UjEx36*7zdeFSRyySOmGz$V?RugesvL_QkU_Uw$ig6DWIrw*hBf?YI=u z6?y0yrM{}#t*E!whC^ujiG3Rmj(Xx6dhZ(QZ61aa1q`U|QO0_s8lmk43}c({v6q^% z>m#4QV!}3421haQ+LcfO*>r;rg6K|r#<M0Jf@axA{?h0RnOe}CLphrI-z23J4V*Pb zVp9l<M&T$}(G@+AZZhe<!`mWw?nN-0vcSy!i3v<^cqbB%>5Sh|y@h1ao%Cl)t*u`4 zMTP!deC?aL7uTxm5^nUv#q2vS-5QbBKP|drbDXS%erB>f<x@jf<5FQBD0zF-9QcM@ zF3)BRXXVX$gzhiTp_lKpMq3j`hBjHB!nCwXfktaf$<<%akp?@H7g;otp#Cy7Q*u_I zGo1Hx=jpU*Q)w;-S}GZkW6w3Opl=(fJ<=c5nYdwc1tCu{k>YM84Kpk^au99-BQBZR z7CDynflrIAi&ahza+kUryju5LR<m1AGV0-a%_}al3TuA0JZPQ44IeFBc<Fj)f?+^p zUNT<~HwDbgnV|FBsPL!r7;q=yc<|<vv+iKvG<|3O=u#eF{5(rPp1u1cWMIwCJD1Xr zz(`{|=QJq88uaR@A{_mB{^LC&`g3SG;NkikZz-1F+-T4{OT@PrR1y~a5%4(X7f2jy zsmK~L@mXd9)(|Qee5K?wH16R1GP}UM#eA|yyNG=_?pUT>_}-Z27g)jqOc(!Lx9y)e z{cYc&_r947s9pteaa4}dc|!$$N9+M38sUr7h(%@Ehq`4HJtTpA>B8CLNO__@%(F5d z`SmX5jbux6i#qc}xOhumzbAELh*Mfr2SW99=WNOZRZgoCU4A2|4i|ZVFQt6qEhH#B zK_9G;&h*LO6tB`5dXRSBF0hq0tk{2q__aCKXYkP#9n^)@cq}`&Lo)1KM{W+>5mSed zKp~=}$p7>~nK@va`vN{mYzWN1(t<LDUfYz{(EH{AD)IZ$<F28%{RrOoqF0D|nWDiQ zCUtv0Ea#-e)5}r9ecRbr_!SOK2o&&2@t#>E=u2BZhga5(VtPKk(*TvE&zmn5vSbjo zZLVobTl%;t@6;4SsZ>5+U-XEGUZGG;+~|V(pE&qqrp_f~{_1h@5ZrNETqe{bt9ioZ z#Qn~gWCH!t#Ha^n&fT2?{`}D@s4?9kXj;E;lWV9Zw8_4yM0Qg-6YSsKgvQ*fF{#Pq z{=(nyV>#*`RloBVCs;Lp*R1PBIQOY=EK4CQa*BD0MsYcg=opP?8;xYQDSAJBeJpw5 zPBc_Ft9?;<0?pBhCmOtWU*pN*;CkjJ_}qVic`}V@$TwFi15!mF1*m2wVX+>5p%(+R zQ~JUW*zWkalde{90@2v+oVlkxOZFihE&ZJ){c?hX3L2@R7jk*xjYtHi=}qb+4B(XJ z$gYcNudR~4Kz_WRq8eS((>ALWCO)&R-MXE<vEqnorPNm+Fsb;o_Wlx}NSX#*my3$+ zHp_NEmALLgtv-PdAdM+8+m9(x^RHIWJtH>+YxDn9V#X{_H@j616<|P(8h(7z?q*r+ zmpqR#7+g$cT@e&(%_|ipI&A%9+47%30TLY(yuf&*knx1wNx|%*H^;YB%ftt%5>QM= z^i;*6_KTSRzQm%qz*>cK&EISvF^ovbS4|R%)zKhTH_2K>jP3mBGn5{95&G9^a#4|K zv+!>fIsR8z{^x4)FIr*cYT@Q4Z{y}};rLHL+atCgHbfX*;+k&37DIgENn&=k(*lKD zG;uL-KAdLn*JQ?@r6Q!0V$xXP=J2i~;_+i3|F;_En;oAMG|I-RX#FwnmU&G}w`7R{ z788CrR-g1DW4h_`&$Z`ctN~{A)Hv_-Bl!%+pfi<f@n#kgTY9XT^jaBh>f8wN32rMD zJDs$eVWBYQx1&2sCdB0!vU5~uf)=vy*{}t{2VBpcz<+~h0wb7F3?V^44*&83Z2#F` z32!rd4>uc63rQP$3lTH3zb-47IGR}f)8kZ4JvX#toIpXH`L%NnPDE~$QI1)0)|HS4 zVcITo$$oWWw<eeUP|>CN@E-5h>N?Hua!N9CYb6f8vTFd>h3q5Jg-lCI6y%vu{Z_Uf z$MU{{^o~;nD_@m2|E{J)q;|BK7rx%`<ACjBKdqq8Ybhcy?$CAKynzlx{zw=Od0Xy! zvN#$9qlLsFo>m``+OqZAqAVj-Dy+pD4-S3xK?($>wn5bi90CFAQ+ACd;&m6DQB8_o zjAq^=<LYcW-lN@?;-ZU=%Nt&mVJ`QVic@H1CE-sGqJTOyEf<AB4+J>eUYc1o{#+p+ zn;K<)Pn*4u742P!;H^E3^Qu%2dM{2slouc$AN_3V^M<Z*M}NxUVyUo{u~vx|(uf^s z5phH18INK=LP^kX*F_W8A<xU52w_qKYV$JiJ)e5{;j5y{aka<sm<Os_94Xo$!!g$~ z`fbhkBNP6NW*Z8<hmX~Z8mCl(%$_5?-&GIIqjl*yzEi!lqxMp9X|he4cy0Q2ns4A) zEdyY|bMENjmlmlT&MnnYz+?s=$I7esd4wjP373@7U3t01a;v&uss%A)=Njuq#t~G| zW4E&RpnRkv>7H_KY3H)#n7qd5_p~Za7zAj|s9{l)RdbV9e||_67`#Tu*c<8!I=zb@ z(MSvQ9;Wrkq6d)!9afh+G`!f$Ip!F<4ADdc*OY-y7BZMsau%y?EN6*hW4mOF%Q~bw z2==Z3^~?q<1G<X$MIxfi$y$Yn#2NLfUorr)W&ye%GOR8ep7_J*KzBguntmgurTNya z?VbH*TJWIzqrd}-p|}JU6Q8V{UhwErq6s^i;U*KudB^+Q1)l0SB*1y_XCOW^a|9Tu zq@6WnZ<rGtfA3ouLG8Mt&KqR!k89i)LPHWIK+b%3u-5N><X)#8sCJtj4vr6GE}e^T z>I<kND}yjLyv0zjK>TeS>xGN-?CHZ7a#M4k<u0(*?HGTUeRU(rtF65{s7+a(>DL zQxQr~1ZM<I{lt4|1mt7C&}^|Q548jGab9==NoIL)S|Jy@?5nf`$E@s8#cdSRrtH!P zn73x%@8npDx$Gbfp((9wUs8kHZh!zIycYyV>zCSKFK5+32C%+C1kE#(2L=<Qz%s{v zu9mDQk{@NHhPg0om|+{q(=~ykxDtvw7>15AR!er7GKbp?Xd1qkkGipx5Q~FI-6zt< z*PTpeVI)Ngnnyaz5noIIgNZtb4bQdKG{Bs~&tf)?nM$a;7>r36djllw%hQxeCXeW^ z(i6@TEIuxD<2ulwLTt|&gZP%Ei+l!(%p5Yij6U(H#HMkqM8U$@OKB|5@vUiuY^d6X zW}fP3;Kps6051OEO(|JzmVU6SX(8q>*y<zQy7G#dujaC7=7@%=f_$R$@)sIMF<2XO zV&<O)@VvenGdrDHtq9XDTL>f*x5QoxDK={PH^F?!VCzES_Qs>()_y|jg6LJlJWp;L zKM*g5DK7>W_*uv}{0WUB0>MHZ#oJZmO!b3MjEc}VhsLD~;E-qNNd<fQf`>?x7Q6~v zR=0$u>Zc2Xr}>x_5$-s#l!oz6I>W?lw;m9Ae{Tf9eMX;TI-Wf_mZ6sVrMnY#F}cDd z%CV*}fDsXUF7Vbw>PuDaGhu631+3|{xp<@Kl|%WxU+vuLlcrklMC!Aq+7n~I3cmQ! z`e3cA!XUEGdEPSu``&lZEKD1IKO(-VGvcnSc153m(i!8ohi`)N2n>U<u}iBLDuDW* z5SRX;S?=hSKmN>_BemYJ`uY>8B*Epj!oXRLV}XK}>D*^DHQ7?NY*&LJ9VSo`Ogi9J zGa;clWI8vIQqkngv2>xKd91K>?0`Sw;E&TMg&6dcd20|FcTsnUT7Yn{oI5V4@Ow~m zz#k~8TM!A9L7T!|colrC0P2WKZW7PNj_X4MfESbt<-soq*0LzShZ}fyUx!(xIIDwx zRHt^_GAWe0-Vm~bDZ(}XG%E+`XhKpPlMBo*5q_z$BGxYef8O!ToS8aT8pmjbPq)nV z%x*PF5ZuSHRJqJ!`5<4xC*xb2vC?7u1iljB_*iUGl6+yPyjn?F?GOF2_KW&gOkJ?w z3e^qc-te;zez`H$rsUCE0<@7PKGW?7sT1SPYWId|FJ8H`uEdNu4YJjre`8F*D}6Wh z|FQ`xf7yiphHIAkU&OYCn}w^ilY@o4larl?^M7&8YI;hzBIsX|i3UrLsx{QDKwCX< zy;a>yjfJ6!sz`NcVi+a!Fqk^VE^{6G53L?@Tif|j!3QZ0fk9QeUq8CWI;OmO-Hs+F zuZ4sHLA3{}LR2Qlyo+{d@?;`tpp6YB^<N^9B^!u$J3<mbdXRlpBvq{y2IOGm;FI;< zp58=gjn>BMoJt?&MHFY!JQwoa0nTSD+#Ku^4b{5SZVFwU<IJ0}bQVpgF?my1a(=#v zCe{m$czGs%5QDa^dwpTc&v1h5?Urk0&xwUXdDP6{oVl<RF(vZZ*Iaht8&i1Um{<Ya z7K60dbu=HI%sT{`2mtYMmulVL9JH9rf?bk5(*_RZhlK3yUFVD5<1UI>9<~APYbaLO zu~Z)nS#dxI-5lmS-Bnw!(u15by(80LlC@|ynj{TzW)XcspC*}z0~8VRZq>#Z49G`I zgl|C#H&=}n-ajxfo{=pxPV(L*7g}gHET9b*s=cGV7VFa<;Htgjk>KyW@S!|z`lR1( zGSYkEl&@-bZ*d2WQ~hw3NpP=YNHF^XC{TMG$Gn+{b6pZn+5=<()>C!N^jncl0w6BJ zdHdnmSEGK5BlMeZD!v4t5m7ct7{k~$1Ie3GLFoHjAH*b?++s<|=yTF+^I&jT#zuMx z)MLhU+;LFk8bse|_{j+d*a=&cm2}M?*arjBPnfPgLwv)86D$6L<v-FBc*O=@Aayd9 z!$`&9Ni`!p;p1hdi2)tw1E`qPlur~3XMJ_)G<yDOTF@9w1))%tUp$L9$dPXFLE-dI z1CAFIqON5co=;5wnnj-1*d~|3{w2JyK|pB#b5`|_Wvca$o{ImsE#kk(32i8Uv}K$> zLJ0wPul7IenMvVAK$z^q5<^!)7aI|<&GGEbOr=E;UmGOIa}yO~EIr5xWU_(ol$&fa zR5E(2vB?S3EvJglTXdU#@qfDbCYs#82Yo^aZN6`{Ex#M)easBTe_J8utXu(fY1j|R z9o(sQbj$bKU{IjyhosYahY{63>}$9_+hWxB3j}VQkJ@2$D@vpeRSldU?&7I;qd2MF zSYmJ>zA(@N_iK}m*AMPIJG#Y&1KR)6`LJ83qg~`Do3v^B0<c@vrWjl0ra05o-pa$c zV~2wLB|D#i{=yOjf)%9EFs~dm=}2RTCPHN&-r`|I@#CLnu+vrE_(YnwDE{ihqc<)X z`9INM1uJ*dXn{L282KYsA1^f}uQ^2dS~n1{uM$2lDf}Nv<_{@EMrkp<d!t$y{t9cZ zZTh`eqXc))c!B<E!)-SX5Zkx=T}gk>>fU&wUx(qefuTgzFED{sJ65!iw{F2}1fQ3= ziFIP{kezQxmlx-!yo+sC4PEtG#K=5VM9YIN0z9~c4XTX?*4e@m;hFM!zVo>A`#566 z>f&3g94lJ{r)QJ5m7Xe3SLau_lOpL;A($wsj<FPGOPs;4j|gI*y@+n1^HrpcC3D#_ z_?)Ug-getbQrU}r{iT(L54IrQY8th5jSYt6V*yfXZ_*pk`O>HR`;xTXgIiZ#o&vt~ zGR6KdU$FFbLfZCC3<gTENk*-sjo;5)w@S;wX$fL7aJC4e@%U@;l`{ETOeJ+i!BbLf zbaPqu(&El5Tl(XFzxqn<H#&!BN}r6O*jy0eg~yB+S>AEu$b`tj!9XgOGLSV=QPIYW zjI!hSP#?8pn0@ezuenOzoka8!8~jXTbiJ6+ZuItsWW03uzASFyn*zV2kIgPFR$Yzm zE<$cZlF>R8?Nr2_i?KiripBc+TGgJvG@vRTY2o?(_Di}D30!k&CT`>+7ry2!!iC*X z<@=U0_C#16=PN7bB39w+zPwDOHX}h20Ap);dx}kjXX0-QkRk=cr};GYsjSvyLZa-t zzHONWddi*)RDUH@RTAsGB_#&O+QJaaL+H<<9LLSE+nB@eGF1fALwjVOl8X_sdOYme z0lk!X=S(@25=TZHR7LlPp}fY~yNeThMIjD}pd9+q=j<_inh0$>mIzWVY+Z9<urh;8 zH|z!)CyJ7QAUOQ_BY2kV(F}Clz(^ySmsY^`PTLR<rLrqM8rw;;!XGIZ+ZTes`dy@# z;t(O57q+i~k}R5vTwmWBDWc^Ytq+C4?OP-Sn~lm{^t{Uc0Rz~t%3Y(Ewx6m<&mI%K z`0>p<{D^#0Xk+b_@eNSiR8;KzSZ#7lUsk~NGMcB8C2c=m2l5paHPq`q{S(kdA7Z1a zyfk2Y;w?^t`?@yC5Pz9&pzo}Hc#}mLgDmhKV|PJ3lKOY(Km@Fi2AV~CuET*YfUi}u zfInZnqDX(<#vaS<^fszuR=l)AbqG{}9{rnyx?PbZz3Pyu!eSJK`<jn!(pTPC`j`BC z6h+KNp*mSbL}^yL^w~L|C>uwkJU!ORQXy4x83r!PNgOyD33}}L=>xX_9<OPcXk91C z7JeZa4I4_-T@qhSd93p0n!CY74f`dZ|6+u0mNto|Y$S<7P10V7Nmo*~nj+22-JGop zi`cpyz&<4*8a3+*Rh=Xmzc2;2KCLd2!?c!iDUvsM;@99MM`6jPz38b687?0xo1|#t z0nbYtb&(+&LVMihYH<&<D}g1zy;*?$5>3l6njNTuqL8J{l%*3FVn3MG4&Fv*`lBXZ z?=;kn6HTT^#SrPX-N)4EZiIZI!0ByXTWy;;J-Tht{jq1mjh`DSy7yGjHxIaY%*sTx zuy9#9CqE#qi>1misx=KRWm=qx4rk|}vd+LMY3M`ow8)}m$3Ggv&)Ri*ON+}<^P%T5 z_7JPVPfdM=Pv-oH<tecoE}(0O7|YZc*d8`Uv_M*3Rzv7$yZnJE6N_<lW4-Y3nv8 z&0M}}4zz%H)@xku37-xNYl7+e>W=AQ3_BgU_TjA_T?a)U1csCmJ&YqMp-lJe`y6>N zt++Bi;ZMOD%%1c&-Q;bKsYg!SmS^#J@8UFY|G3!rtyaTFb!5@e(@l?1t(87ln8rG? z--$1)YC~vWnXiW3GXm`FNSyzu!m$qT=Eldf$sMl#PEfGmzQs^oUd=GIQfj(X=}dw+ zT*oa0*oS%@cLgvB&PKIQ=Ok?>x#c#dC#sQifgMwtAG^l3D9nIg<uQ!0`kZ2#jQjY= z^fp6|svg0-4m9^9&y=jgtP8tOHf$4)G{z8?_hB9;^J!V@4SpkSI6&jw_YRX{M)aNa zhHy=Usx=Vv1l2K9Y=4Ue+(9yRy1}0bT3PF<Ui&bXrp~l%srldKWk1^=Rtvnapw6|^ zFoloYAD>(Zqi;D%807TtUUCL3_;kjyte#cAg?S%e4S2W>9^A(uy8Ss0Tc++ZTjJw1 z&Em2g!3lo@LlDyri(P^I8BPpn$RE7n*q9Q-c^>rfOMM6Pd5671I=ZBjAvpj8oIi$! zl0exNl(>NIiQpX~FRS9UgK|0l#s@#)p4?^?XAz}Gjb1?4Qe4?j&cL$C8u}n)?A@YC zfmbSM`Hl5pQFwv$CQBF=<Q-UGZ@hw~4An$EBbxn9OWL^<{5oG0g9fW54P1`=a-g7| zC0f|-l)OqWwLsMR6x}wWi8^{%XA#n;spL1&1D6shHJ6;;#FElpktRn4r=rQKbAvtX zL<gj%yy+phsG2qh{)3Y7BRFH;0IsWU_HZXomlw%T4~EU|xU{7?1B40*vb18D>_$Sq zxsV?BHI5bGZTk?B6B&KLdIN-40S426X3j_|ceLla*M3}3gx3(_7MVY1++4mzhH#7# zD>2gTHy*%i$~}mqc#gK83288SKp@y3wz1L_e8fF$Rb}ex+`(h)j}%~Ld^3DUZkgez zOUNy^%>>HHE|-y$V@B}-M|_{h!vXpk01xaD%{l{oQ|~+^>rR*rv9iQen5t?{BHg|% zR`;S|KtUb!X<22RTBA4AAUM6#M?=w5VY-hEV)b`!y1^mPNEoy2K)a>OyA?Q~Q*&(O zRzQI~y_W=IPi?-OJX*&&8dvY0zWM2%yXdFI!D-n@6FsG)pEYdJbuA`g4yy;qrgR?G z8Mj7gv1oiWq)+_$GqqQ$(ZM@#|0j7})=#$S&hZwdoijFI4aCFLVI3tMH5fLreZ;KD zqA`)0l~D2tuIBYOy+LGw&hJ5OyE+@cnZ0L5+<w{cWEo@_^~M|2=36q$z3_?Gf)VJr zUpe}NVgM}-;&|6HhxkYp7HzE53izT81kTG@Jmq2@d-$W+^KDXF(P7@EuYfbYIyV7U zV*wOvC$^_oi0@eKQ5Lg<*9K4ZW~-9Em>;yo2pIMdt@4$r^5Y!x7nHs{@<B%ZFKsNr zUMwD7Y!0QZu_?1dF&#e)6E>>|W(MzJjATyWGNwZ^4j+EPU0RpAl-oTM@<pD`jR@;t z`dx{{CIdGvrizSwgHXZPcy<mdC17yqEl4I024K6slY7B=b!@b?Z_t%9OP67!Fb4;O z;drPKrpu;B8_&tqVEsY**KGIrLfftCZ<f3MS4jVJwkz|`KDK{kxe|Xt(g9|8z@N#} zBXpE*Si?ut+wN*uFcIYk!!}k<S-vxO!E7j^pW&!{sW{MM=^wB6{+mP~m?wTGzR=Kt zMRXJ#O3=xtl*d}rDb%YbSYbxv?0QzJq0M9@+MA{-DVds9NCFdn0W6Ib&!HkMA39U# zVguUQDWw1^)rRq#B4hvu?!b*1Q-|#8Q%ZC@dCXVwky^O0vocgiD5m~|gPh0Z%7gv& z&mgdW^)$B{`(^PjTFQy^-+Sul=5Atd|IdECT&;IMbS<1fr6<-2%kRj#&U)5!k}LEG zaD~b+!LTq6V(G$oqTps8O?>u{lx*i0^yyWPfHt6QwPvYpk9xFMWfBFt!+Gu6TlAmr zeQ#PX71vzN*_-xh&__N`IXv6`>CgV#eA_%e@7wjgkj8jlKzO~Ic6g$cT`^W{R{606 zCDP~+NVZ6DMO$jhL~#+!g*$T!XW63#(ngDn#Qwy71yj^gazS{e;3jGRM0HedGD@pt z?(ln3pCUA(ekqAvvnKy0G@?-|-dh=eS%4Civ&c}s%wF@0K5Bltaq^2Os1n6Z3%?-Q zAlC4goQ&vK6TpgtzkHVt*1!tBYt-`|5HLV1V7*#45Vb+GACuU+QB&hZ=N_flPy0TY zR^HIrdskB#<<v3VZZ(6)Q<hH<WFIP7EzWSwOI2$+%qFf>$aU;HY(K{a3(OQa$0<!Z zwV)dCsnAJ%s$60=Taf${mur@a6L!U%;lMq7fsK(vim><9qH(oa)lg@Uf>M5g2W0U5 zk!JSlhrw8quBx9A>RJ6}=;W&wt@2E$7J=9SVHsdC?K(L(KACb#z)@C$xXD8^!7|uv zZh$6fkq)aoD}^79VqdJ!Nz-8$IrU(_-&^cHBI;4<r+1$HU?qG1J088{7lCH{fI}f^ zvy+vSe{z?zfJ#0~_d*#~6_b~IvofLQ3@^|Q9eojowZuM$JzNi`=-rXVDv!mXDZ;xe zE9ba^4q9OO5o3vd<M~xJ;2KX?9umvZyxy44nb9eY+)`&yt0U~q@kb3&9<Rj_#e5S> z^$B+1aPe|LG)C55LjP;jab{dTf$0~xbXS9!<M2ebiR^>!Qd<NroZru}b;ry@LG!l- zM!n%>cmDYLbL^jvxu2y*qn<cdgNOutE`4#&#_4e){y%!N#7<u*3DvdNWs5&CCKxmF z;-bApM*r4Onl90Px}#p^0ufjq{#e@!w*feT#7*fpVhBR>x2%jbL%<aHndMtEpHH-p z6qWPGl6!=`TPxhax_zvd(m12tCV-av2X5b-3q&(-ReP0*;wVRV)oy3pc2xd$@S>rB z{aP85qBJe#(&O~Prk%IJARcdEypZ)vah%ZZ%;Zk{eW(U)Bx7VlzgOi8<yX;uy|>)x z`rh4l`@l_Ada7z&yUK>ZF;i6YLGwI*Sg#Fk#Qr0Jg&VLax(nNN$u-XJ5=MsP3<SnL za}V*@pmgL3Baam<X2AKjxwE0R!TMUJ&9ZWO)ZZ^6gQ3>|(lEdIOJ7|(x3iY<!N++B z=U1Q6TGt3S3YV*F+Ahywu6XP(b~Lktd&^7%Z@PEqtF(8!YzKB%4=X&Y*xq898JuT& z&Vh%4r;T-A)?v5-+2&x+>;ea)5#BW*mDV%^=8qOeYO&gIdJVuLLN3cFaN=xZtFB=b zH{l)PZl_j^u+qx@89}gAQW7ofb+k)QwX=aegihossZq*+@PlCpb$rpp>Cbk9UJO<~ zDjlXQ_Ig#W0zdD3&*e<b)v&6o<r;N-*6|7H8Mqq3Q2=Q3wWhIae70i~T<EsK{q2f7 zHJ5f3S3TaWCv=OH6R0kmo8ysOJ=6-#H_t!YTE&)H&)crJr8s~dk41huQv00%j*0bY z&7rQ&g9dPJr}`;=)*qSWmdy7%@RoTs-JMb|cteD`*M|!z?!x=sEX_Wcv~Jh*ysQDu z5$39MI^t}VEA*zB>i(FwlN#3b%FSR%&M^ywF@Fr>d~do@-kIS$e%wkIVfJ|Ohh=zc zF&Rnic^|>@R%v?@jO}a9;nY3Qrg_!xC=ZWUcYiA5R+|2nsM*$+c$TOs6pm!}Z}dfM zGeBhMGWw3$6KZXav^>YNA=r6Es>p<6HRYcZY)z{>yasbC81A*G-le8~QoV;rtKnkx z;+os8BvEe?0A6W*a#<J2Tf?&<fZTof%8x8JT(_GWg%u}o_rMs&m4F@52Hp`aqUv%* zA+83O5;aq3wKpGRSnm_3aeGBuJ>dOudsv3aWs?<dJ*490)E?9FR?9;?D^I}Y)t=~s z9|7TF=C(4azs;8zWq`Os@;d<Ej^~L?LGh9_-_?Ac+((@_ylkxK_<&Fn(ZD2iyJUE~ zk?7A)<gYN3Rzj#nN<&#zZ*7F#f~p-9k8k0N_t+XtdkwxY@sKr{L#%H;AV@5VDQVfa z%=vpSR66V-Kg<z*)b`bN1tO(hG)+_q$g{)_v_vjPsWS;p4%(bE<l|UJXnn8CFU>d% z0oNngyVMjavLjtjiG`!007#?62ClTqqU$@<hq&JblU=*qC?|bLqd#83w}`s4hoCZG zZ-O+2XV_of{|)QPh3gO||9e&Fi3S9O_`iw%|A>kIY`=x^$2e>iqIy1>o|<Za5N)p^ zLmeaZWT(bWB5ouhHen&&Blk***`S!tl|wz(B+}HqEb?f>@Tw@)P)B8_1$r#6>DB_5 zmaOaoE~^9TolgDgooKFuEFB#klSF<Vq&r#m9@hME>%9-~d2~_|kQ0Y{Ek=HH5yq9s zDq#1S551c`kSiWPZbweN^A4kWiP#Qg6er1}HcKv{fxb1*BULboD0fwfaNM_<55>qM zETZ8TJDO4V)=aPp_eQjX%||Ud<>wkIzvDlpNjqW>I}W!-j7M^TNe5J<O&m1qXTjRg z-giV*V;CYIguyZ;;Y5qE=ch~mnI~pSK6XWUcE{l(6PM6OJHWW(XN#ZNOC=G^o`Kn| z)!fw}(M2@Gu1+p9%z`Xz(5247JK&gKsJQWg4PyMIAYw>IFh#-}zAV!$ICOju8Kx)N z0vLtzDdy*rQN!7r>Xz7rLw8J-(GzQlYYVH$WK#F`i_i^qVlzTNAh>gBWKV@XC$T-` z3|kj#iCquDhiO7NKum07i|<-NuVsX}Q}mIP$jBJDMfUiaWR3c|F_kWBMw0_Sr|6h4 zk`_r5=0&rCR^*tOy<?~|OBH2^xi@ovc<0m6Z9pQ}p}$L)86o2kGm22nSVfgAnM9+% z-O%Z&wlG5Q7|Vdi#a_48(&%DvANSabx6F*eZcubRUtR3m-P}10ob*11EpzdR^qybZ zf3g(F3Srb@fhdZcRva|VnoDWmt>$A8K;@|NqwncjZ>Y-75vlpxq%Cl3EgH`}^^~=u zoll6xxY@a>0f%Ddpi;=cY}fyG!K2N-dEyXXmUP5u){4VnyS^T4?pjN@Ot4zjL(Puw z_U#wMH2Z#8Pts{olG5Dy0tZj;N@;fHheu>YKYQU=4Bk|wcD9MbA`3O4bj$hNRHwzb zSLcG0SLV%zywdbuwl(^E_!@&)TdXge4O{MRWk2RKOt@!8E{$B<l(@e{<+(eX3IivK zR*O|UTWTINjWzl=zX^M}v1dxUarP|=BCd-w1w34qQf5C{x%6J^)21}_7#me}_4*lH z^%q-ruGlL}T~~d&8N6oL9E@FkCtaLEfQKf*k=~T!D}W&wtynLO0^<vGBc%UH9sOtu z)!T7Qnzqz%ZvULsH*;mkh>U-AH(@4{gxs=YAz9LIob|Hzto0}9cWoz6Tp2x0&xi#$ zHh$dwO&UCR1Ob2w00-2eG7d4=cN(Y>0R#$q8?||q@iTi+7-w-xR%uMr&StFIthC<# zvK(aPduwuNB}oJUV8+Zl)%cnfsHI%4`;x6XW^UF^e4s3Z@S<&EV8?56Wya;HNs0E> z`$0dgRdiUz9RO9Au3RmYq>K#G=X%*_dUbSJHP`lSfBaN8t-~@F>)BL1RT*9I851A3 z<-+Gb#_QRX>~av#Ni<#zLswtu-c6{jGHR>wflhKLzC4P@b%8&~u)fosoNjk4r#GvC zlU#UU9&0Hv;d%g72Wq?Ym<&&vtA3AB##L}=ZjiTR4hh7<lQjQPD7BH3(LxrPlKZV_ z(AQ%i>J)e>e<PJRC|ur!@X9?=ab6p0zN|sRcBVRzCz(8|n1EsiKD}%a;v@kHJ{>i} zt*u+>h%MwN`%3}b4wYpV=QwbY!jwfIj#{me)TDOG`?tI!%l=AwL2G@9I~}?_dA5g6 zCKgK(;6Q0&P&K21Tx~k=o6jwV{dI_G+Ba*Zts|Tl6q1zeC?iYJTb{hel*<TxGDp1t z93yVek$KyL5=fjxatJAN*YDud$cY|0pGn7|DKyyuDwvG`Z(2)p)Yci42_hErHf2UU zS$_$$j&c&-LV>x>^wb|2RkHkU$!+S4OU4ZOKPZjV>9OVsqNnv5jK8TRAE$A&^yRwK zj-MJ3Pl?)KA~fq#*K~W0l4$0=8<bVxkhVxe=la}*Hbv)==tjpYows*bL@c2eYWT3W z01=rCX`^R^f`_THwcLEMklb`A^)+)^x|)kEA{OtGmozckxKB4Ey0h}MC>GRx^9+?w z!QT8*-)w|S^B0)ZeY5gZPI2G(QtQf?DjuK(s^$rMA!C%P22vynZY4SuOE=wX2f8$R z)A}mzJi4WJnZ`!bHG1=$lwaxm!GOnRbR15F$nRC-M*H<*VfF|pQw(;tbSfp({>9^5 zw_M1-SJ9eGF~m<G!kjc;F?%%**IztSuXp$ob-V2#!>(0dvp*P8uaA0Yw+EkP-SWqu zqal$hK8SmM7#Mrs0@OD+%_J%H*bMyZiWAZdsIBj#lkZ!l2c&IpLu(5^T0Ge5PHzR} zn;TXs$+I<V5KeQon$dKjn%XTNOq1iDY~a}L->Q_&;O~u=Jz+XE0wbOy`=6>m9JVG} zJ~Kp1e5m?K3x@@>!D)piw^eMIHjD4RebtR`|IlckplP1;r21wTi8v((KqNqn%2CB< zifaQc&T}*M&0i|LW^LgdjIaX|o~I$`owHolRqeH_CFrqCUCleN130&vH}dK|^kC>) z-r2P~mApHotL4dRX$25lIcRh_*kJaxi^%ZN5-GAAMOxfB!6flLPY-p&QzL9TE%ho( zRwft<s>E3sy5<*^)qYzKkL|rE>n@hyr;xPqncY6QJ8125!<x6~mJ8#t72J`9j7Vt+ z{)(shXdhRK*hg{^0-o)*=-BD_{=G?(3Uxw|igce$D@5V+;|AwbJ^|mBZT}P+{e?ev z^Hm#S8hQoc_g2THK_hq+^7dV+oJJtv89LQULvUb*<|80Ah}f7O7thWnN;ldB%tWj; zXGuVR(uM%0S~B_My>MWr`UCWuC~A#G1AqF1@V$kv>@NBvN&2ygy*{QvxolkRRb%Ui zsmKRO<HOo)OXBaW@%o9D)qKMSmek)As&f%&XJh-+5w*Sni?higYzm6~sL9T}q|+D9 z%qzvC4v{11N6=sMD9x29k-{?M)q53}>R%{*g*WjUUod@@cS^4eF^}yQ1>;WlGwOli z+Y$(8I`0(^d|w>{eaf!_BBM;NpCoeem2>J}82*!em=}}ymoXk>QEfJ>G(3LNA2-46 z5PGvjr)Xh9>aSe>vEzM*>xp{tJyZox1ZRl}QjcvX2TEgNc^(_-hir@Es>NySoa1g^ zFow_twnHdx<e!lgrNvI*WwBW)9wT|Gdp=c5apgD*amgLuUgeizAc}`P6%lbB0d#Z7 zM;4Blo<T=VRwcg`wRx_6=?ltdSX=X;(4baV;MUcCy|{FBA`Zxe#<lM|b7@g?@2fGg zIvWGt;sS3yPx@x}jSYQsvJ=J#PvK6X<0Fh+*Q@3wty9k8PJk&wC(b6g5hW5g=_%s~ zV<m~1V;vNeZD@7?COKF+T!CB6pDv{fSFU@)-jTV7?mWdMju#)3pR&V^9*<dsEofq{ zF+@6BVl-^4$mc*8L3np=n^m5nn8IF%8bAI=nujF$D~jYJ3+6&3Mm)2am@cr9QtAFN z6?MSMSmK(1OxK*zdYZhr8j$3c-8K0_%mPH{twF*(|Ie~m)^78KdHi44QLneiwch+8 zD=yq1et$wHz{iz|?7L^3fb6J#`$6{DTVV(S=?Mz={o?+%SMad-iF)}cnoEkSidJPM z1tAxRVlVg^!)Vef0KfMogS||RlXA1A@sW2l3oT@37DDbNV^ovJi3(g(k=k-tSw$0w z>(j?Q_3q51t3XI7YlJ4_q&(0#)&a+RUy{IcBq?)eaWo*=H2UUVIqtp&lW9JTJiP&u zw8+4vo~_IJXZIJb_U^&=GI1nSD%e;P!c{kZAL<I?m@N;2QRs5XV@LYa&h7gsYW*aK zkiR{aVR>NCm5c%%oF+I3DrA63_@4)(v4(t~JiddILp7jmoy+>cD~ivwoctFfEL<GF zS2?j=;5_KN<!_59Fr3**B&RM#EV)k5&x%z^$4i+F6t$2SQeVakt1E=3m%N!0egN-> zP*#2Rx?_&bCpX26MBgp^4G>@h`Hxc(lnqyj!*t>9sOBcXN(hTwEDpn^X{x!!gPX?1 z*uM$}cYRwHXuf+gYTB}gDTcw{TXSOUU$S?8BeP&sc!Lc{{pEv}x#ELX>6*ipI1#>8 zKes$bHjiJ1OygZge_ak^Hz#k;=od1wZ=o71ba7oClBMq>Uk6hVq|ePPt)@FM5bW$I z;d2Or@wBjbTyZj|;+iHp%Bo!Vy(X3YM-}lasMItEV_QrP-Kk_J4C>)L&I3Xxj=E?| zsAF(IfVQ4w+dRRnJ>)}o^3_012YYgFWE)5TT=l2657*L8_u1KC><OI7!CHt-I8C=_ zLRniH(rk?7HtU~~$OrcZ%C_13=5$L<fZMyx5o=K4pR3}aI_Tp!*usOF04brWlk!!L zSy#n#5F3stC!GdnY(#!PB8CicslniZojp3F1sV>Y-R{7w^S<!A!SNx8PxrI522z82 z;05AcZ?RKoY9K8k=Y(xm=o4tfrYxE@T|pxPV|T*QtY?-IR=+aeiM#C&9#VHkoR(nT z6Vo&D<jxb-PViYakd_Ry0YqwV7R_xqvcvy}v9Exs`_0nE-Q8V_Yk}hK?(XjH6uVFy zio3fz6sNcqcXxNU@6OKb?#zE@zia{t2?TQao%^2iKIf5Xug1iSf>&A^X^U}h20jpS zQsdeaA#WIE*<8KG*oXc~$izYilTc#z{5xhpXmdT-YUnGh9v4c#lrHG6X82F2-t35} zB`jo$HjKe~E*W$=g|j&P>70_cI`GnOQ;Jp<HTnC@pzHe*%-Vsf^<VjPxxJSjDb)5A z@dUf*L9{G?#w|lxdVuotsY2r;fOm2iST%qnxNji!k#TFb0f-8Qgf3z4%40AK4^h19 z-A+mZ8|9~Z!1|i<Zp6yzDsXa7@B)f*{d=<-alUJ|78%CxgzIn2oJb7qBrmLuCNBss zF_q8l@r%nqD9F5rSuHz`Pr79~L*nR*J%<m`h7U96U%SEtApNd^esFL!Ci%{fS?37} zF(N_1dt4bLh|7V0L`!`*oUtV^<c06LL!nbvk{4Amm*FX0Igd2sZ20U7d%<>*JK#CT zuEGCn{8A@bC)~0%wsEv?O^hSZF*iqjO~_h|>xv>PO+?525Nw2472(yqS>(#R)D7O( zg)Zrj9n9$}=~b00=Wjf?E418qP-@8%MQ%PBiCTX=$B)e5cHFDu$LnOeJ~NC;xmOk# z>z&TbsK>Qzk)!88lNI8fOE2$Uxso^j*1fz>6Ot49y@=po)j4hbTIcVR`ePHpuJSfp zxaD^Dn3X}Na3@<_Pc>a;-|^Pon(>|ytG_+U^8j_JxP=_d>L$Hj?|0lz>_qQ#a|$+( z(<egK_JoCQRjdK;AXx%}_!KIQhP{J$V&g4kO;k^0n4w8Q6O42Hy~+M7^^jg-Xnl|q zua@Ow?sWRM>x=Lipuc8p4^}1EQhI|TubffZvB~lu$zz9ao%T?%ZLyV5S9}cLeT?c} z>yCN9<04NRi~1oR)CiBakoNhY9BPnv)kw%*iv8vdr&&VgLGIs(-FbJ?d_gfbL2={- zBk4lkdPk~7+jIxd<O?6fKBm-sx3(2vnx)%n4Ktsv_->4{M(-W1AC_WcN&Oza@jZoj zaE*9Y;g83#m(OhA!w~LNfUJNUuRz*H-=$s*z+q+;snKPRm9EptejugC-@7-a-}Tz0 z@KHra#Y@OXK+KsaSN9WiGf?&jlZ!V7L||%KHP;SLksMFfjkeIMf<1e~t?!G3{n)H8 zQAlFY#QwfKuj;l@<$YDATA<ukA}h2$W&;+e0r*}D;-38IJ>k;%PtD%B(0<|8>rXU< zJ66rkAVW_~Dj!7JGdGGi4NFuE?7ZafdMxIh65Sz7yQoA7fBZCE@WwysB=+`kT^LFX zz8#FlSA5)6FG9(qL3~A24m<P6Vythc;LAwJmg~^%V;+>pzL@@2D#>0J7mMS1T*9UJ zvOq!!a(%IYY69+h45CE?(&v9H4FCr>g<n&7wakQnQ`O|IzdV}gb4_uD%4%`E8Wyr_ zB*ahMr*K>K0>mK~F}5RdOuH2{4|}k@5XpsX7+LZo^Qa4sH5`eUj>iffoBVm<qdY>+ zz4Mtf`h?NW$*q1yr|}E&eNl)J``SZvTf6Qr*&S%tVv_OBpbjnA0&Vz#(;QmGiq-k! zgS0br4I&+^2mgA15*~Cd00cXLYOLA#Ep}_)eED>m+K@JTPr_|lSN}(OzFXQSBc6fM z@f-%<Ys?31?U5L7iFk_3XVAlD-h+YS+#5FBuWsR^&q+ZrQ8qFxk>2;1@BzhZa*LFV z-LrLmkmB%<<&jEURBEW>soaZ*rSIJNwaV%-RSaCZi4X)qYy^PxZ=oL?6N-5OGOMD2 z;q_JK?zkwQ@b3~ln&sDtT5SpW9a0q+5Gm|fpVY2|zqlNYBR}E5+ahgdj!CvK$Tlk0 z9g$5N;aar=CqMsudQV>yb4l@hN(9Jcc=1(|OHsqH6|g=K-WBd8GxZ`Ak<hfgdZW0z zKi-oN61LSSAoR(f9ZwQCaOPZ0{;FStt#m|s?TG5#XpA*N7&TI22y;2Um4})X>T?OO z-z_Ued-??Z*R4~L7jwJ%-`s~FK|qNAJ;EmIVDVpk{Lr7T4l{}vL)|GuUuswe9c5F| zv*5%u01hlv08?00Vpwyk*Q&&fY8k6MjOfpZfKa@F-^6d=Zv|0@&4_544RP5(s|4<x z+b;nhA1{boC<;F%x6Hv(9O(jAOR1EC=|%OzzX`7;Ig$v)|1k`YErIgDU4rdjVe4mI zJ4C2EkvdP+xAW=2t=H?{sVV8__t+@&`zg=)tGPIRsN4kR8&_0Y$zVv{Toa+*G@+ZJ z^L{}=jQE;Tdvmo*$p8w6T~?mrd3G7G>VPVP-f>%u(J@23BHqo2=zJ#v9g=F!cP((h zpt0|(s++ej?|$;2PE%+kc6JMmJjDW)3BXvBK!h!E`8Y&*7hS{c_Z?4SFP&Y<3evqf z9-ke+bSj$%Pk{CJlJbWwlBg^mE<tg;u(mK;v`;J3wh$h&l4L=+gfK7G4(vW`7Hj|D z=bOWeg>C^@%Ou?o>*|O)rl&`KIbHrjcpqsc$Zqt0^^F-gU2O=BusO+(Op}!jNzLMc zT;0YT%$@ClS%V+6lM<b-p>Tfhuzzxomoat=1H?1$5Ei7&M|gxo`~{UiV5w64Np6xV zVK^nL$)#^tjhCpTQMspXI({TW^U5h&Wi1Jl8g?P1YCV4=%ZYyjSo#5$SX&`r&1PyC zzc;uzCd)VTIih|8eNqFNeBMe#j_FS6rq81b>5?aXg+E#&$m++Gz9<+2)h=K(xtn}F ziV{rmu+Y>A)qvF}ms}4X^Isy!M&1%$E!rT<ZkEuVlksHeNSQ&HvE~V#;h-tRoskLU z!R%bS+IjeENm`Rw$2Ee2fT)9mfN=f$l2kNuwG?u3F|#waHFKtrbuclq6$L6~oUM%A zT&*1bL3d12){(&nQgSEF*XLa;oSK?fbQ-<FZBAEqbYz6kAV?cSv50+XWD`i`+m{i4 z%0+%k_bOiH3G@)F@v;GCN>O~5(p+8{U6#hWu>(Ll1}eD64Xa>~73A*538wry?v$vW z>^O#FRdbj(k0Nr&)U`Tl(4PI*%IV~;ZcI2z&rmq=(k^}zGOYZF3b2~Klpzd2eZJl> zB=MOLwI1{$RxQ7Y4e30&yOx?BvAvDkTBvWPpl4V8B7o>4SJn*+h1Ms&fHso%XLN5j z-zEwT%dTefp~)J_C8;Q6i$t!dnlh-!%haR1X_NuYUuP-)`IGWjwzAvp!9@h`kPZhf zwLwFk{m3arCdx8rD~K2`42mIN4}m%OQ|f)4kf%pL?Af5Ul<3M2fv>;nlhEPR8b)u} zIV*2-wyy<L1TA?TG4MnL%S`E4kQ~sEpED27z7e$gGD+x=E8gMD-+6}!-<d-^Mx7#I z(TAlejnA3QA=8rz{h%{5H=)OR4vvmWHX$#tZzM7@tHivO^PLhsq{;jsf3#K7>D%%) zl$G@KrC#cU<!=K&+xo$$vCQyv{yPi%4XqvQUk@kaCo8%m;7T0tZx$T?hf4VS5+F(a z*#LhL^^;LjTdUHJ-sGF1q?s%_DQNlnpq<=KGF>woL?YdQyf9WH)@gWB{jd5w4evI& zOFF)p_D8>;3-N1z6mES!OPe>B^<;9xsh)){Cw$Vs-ez5nXS95NOr3s$IU;>VZSzKn zBvub8_J~I%(DozZW@{)Vp37-zevxMRZ8$8iRfwHmYvyjOxIOAF2FUngKj289!(uxY zaClWm!%x&teKmr^ABrvZ(ikx{{I-lEzw5&4t3P0eX%M~>$wG0ZjA4Mb&op+0$#SO_ z--R`>X!aqFu^F|a!{Up-iF(K+alKB{MNMs>e(i@Tpy+7Z-dK%IEjQFO(G+2mOb@BO zP><k~U-~U(n}*BH%iq@7+uF^_$lCvY)Ycy8o#Dj)%|%Pd_XXguGKJw*5vP?4TESet zbtO9Dth?@<a&J7K=xA#1|L~*i$G}S&Ii$`Mb~NQsZA~JlSpQd(WY*XWv0y5)*!1LM zedRyd1iI=d=`{Og?yf71QE8(G=|)T^Hew=g@K0vzoMwc!fHlOQrLQG2?xefFM%U`^ zotJCbT-txJ43=`1S<Oz@?fEb6oLlxfKHk=)+nSxy2ADT4P6!Vyh<UhPF?1qz{BYd1 z^{c^zWSD4lEhT9${x%rJC@Ox-ei}*WUiO>WHlS#fSQm0et)bG8^ZDScGnh-qRKIFz zfUdnk=m){ej0i(VBd@RLtRq3Ep=>&2zZ2%&vvf?Iex01hx1X!8U+?>ER;yJlR-2q4 z;Y@hzhEC=d+Le%=esE>OQ!Q|E%6yG3V_2*uh&_nguPcZ{q?DNq8h_2ahaP6=pP-+x zK!(ve(yfoYC+n(_+chiJ6N(ZaN+XSZ{|H{TR1J_s8x4jpis-Z-rlRvRK#U%SMJ(`C z?T2<!8lc0Y0`9pNuNna*%oU`OR{DFL$sBJm9_+l(SsLxQ1D*r)2Z%cTv0{hRPqerr zmQQJw;@2*S-6+Q?tp!_e-)bD|uIVtl7np;!Hcr;|$iMg(Y_~jRMQqwUfq#^4D?Bv> zF(NNfO_&W%2roEC2j#v*(nRgl1X)V-USp-H|CwFNs?n@&vpRcj@W@xCJwR6<k+ZF3 zMlV*YZiVe;7ytcG5tZ7vdF6rV0knuI7xmRxbL0Ffh{&;KauYl`7^z{zhCh<g91&pY zsfWfKp|_B2`e7VYl*F7RI^ezWWt}Ybw~mrzPPC!<qCL)O2P$&+#MnsxNbi9)@5bEx zU?<+GbaUm2`960|0{PD9C>@T!jt377?XjZ06=`d*MFyTdyvW!`mQm~t3luzYzvh^F zM|V}rO>IlBjZc}9<ICqAZa1}Q=c8?w<|HA(b6|9N!!rbIeD+pLjiR$6o@Sx)<S8Rx z$j`+=NK*=8kZ_8IkI5fER%E?$)r+Tzg;PJ{dP2%{WM^<J&+Z7mPQ&7WX{4j%2x&>Z zd$&!tthvr>5)m;5;96LWiAV0?t)7suqdh0cZis`^Pyg@?t>Ms~7{nCU;z`Xl+raSr zXpp=W1oHB*98s!Tpw=R5C)O{{Inl>9l7M*kq%#w9a$6N~v?BY2GKOVRkXYCgg*d<P zS^9~2kSj9qx~FG%4r4tPN3zI3M5ligwGT|7NI1j`<~_UUXP3L76h$B<2^BN$(i;<B zS*AnDj9TL&%4iY58fK~xFv}sz2yoA<9yXZ9LpmpGRu+NQ(8dhgmEdv><5G2M1WZP5 zzqSuO91lJod(SBDDw<*sX(+F6Uq~YAeY<z`M%hj^r3vPe7FQsZ`y;Z{SBt%ZN$kqk zxSC4FSBdGLqi@c*;(0>V#2A;XQu_p=N5X+#cmu19Qk>QAnV=k!?wbk5I;tDWg<Ke3 z+Zln*k(p^Fx)V(N(0j>Fc}0NkvC*G=V+Yh1cyeJVq~9czZiDXe+S=VfL2g`LWo8om z$Y~FQc6MFjV-t1Y`^D9XMwY*U_re2R?&(O~68T&D4S{X`6JYU-pz=}ew-)V0AOUT1 zVOkHAB-8uBcRjLvz<9HS#a@X*Kc@|W)nyiSgi|u5$Md|P()%2(?olGg@ypoJwp6>m z*<ymn-fswTb^f%!tlC*e)Zfu(S723{ZOkO!ZOHx%3245^gD1Y{EuGWsRjV0(K1O+} zFJo}`9v%{DBbDmyDdOiLSiwDk=hGPIM~tP$#l?|Hb+U{q{JFH-xG^lPux^8#ZA4(} z#1*JkW6Z8kcFm-<?IE@GNtul<PBnXNiWyu(lHMNKoaM^9U&T{&w0rDh$O!PDU=Zs3 zEul%RKW%yeBy??93cs+Q-s5`vC39<<xgGgbpPLdMQ!E4_RQep=j_0Zp8i=bC{u=%K zi`drGdweqis9fR$I%P8d`(CNy1r!t80j0%2r%hKYGZ#rCd!S9{f0<?KsOYF+d~ix} zkrIq{vP<d|HihUYGf7f5e!-x?1fzs0(mx^1qzVJL?2Jf(I^4f#8xUBW1Un#2a!t;q zFb_xhJxY{q%9HIajGERztl0SZoHunhEy{nqyv7QEc7!|l9Ssx)(Gs69ANRY-(xqPa zl1Do{=NhWZlPUko+p>dnfjjWC>?_1p;%1brqZyDRR;8EntVA92EJ3ByOxj6a+bhPl z;a?m4rQAV1@QU^#M1HX)0+}A<7TCO`ZR_RzF}X9-M>cRLyN4C+lCk2)kT^3gN^`IT zNP~fAm(wyIoR+l^lQDA(e1Yv}&$I!n?&*p6?lZcQ+vGLLd~fM)qt}wsbf3r=tmVYe zl)ntf#E!P7wlakP9MXS7m0nsAmqxZ*)#j;M&0De`oNmFgi$ov#!`6^4)iQyxg5Iuj zjLAhzQ)r`^hf7`*1`Rh`X;LVBtDSz@0T?kkT1o!ijeyTGt5vc^Cd*tmNgiNo<V{^& zLfFrG?6N-Vfh*a7zRa-hI?AoBxjDCsq~taz78sN8P99@#6GQn^Ac=oe%U({zYXvM? z>^EaWvaC8$e+nb_{W01j3%=1Y&92YacjCi>eNbwk%-gPQ@H-+4xskQ}f_c=jg^S-# zYFBDf)2?@5cy@^@FHK5$YdAK9cI;!?Jgd}25lOW%xbCJ>By3=HiK@1EM+I46A)Lsd zeT|ZH;KlCml=@;5+hfYf>QNOr^XNH%J-lvev)$Omy8MZ`!{`j>(J5cG&ZXXgv)TaF zg;cz99i$4CX_@3MIb?GL0s*8J=3`#P(jXF(_(6DXZjc@(@h&=M&JG)9&Te1?(^XMW zjjC_70|b=9hB6pKQi`S^Ls7JyJw^@P>Ko^&q8F&?>6i;#CbxUiLz1ZH4lNyd@QACd zu>{!sqjB!2Dg}pbAXD>d!<GKfmsHPhVDo}xP&THD##-_#3(aR4z908zAE_6^yD1x< z>3jW}=5aN0b;rw*W>*PAxm7D)aw(c*RX2@bTGEI|RRp}vw7;NR2wa;rXN{L{Q#=Fa z$x@ms6pqb>!8Au<UU`1%O<^p0K#_51IaBWaV0=e@l}O`A>V(prv>|aU8oWV={C&$c zMa=p=CDNOC2tISZcd8~18GN5oTbKY+Vrq;3_obJlfSKRMk;Hdp1`y`&LNSOqeauR_ z^j*Ojl3Ohzb5-a49A8s|UnM*NM8tg}BJXdci5%h&;$afbmRpN0&~9rCnBA`<MBW8q zii=3oqIYG@2L#$U`5a-*@qUd0xRZIiAX#A3@!*+Qo*}2I?GS_O{vJpcD{tJc0)1E0 zdu;^XgM9wTO*wzK_a683EROklxUtnAKe%zc5wM?+B;tNRJ8=uVumGIcXULI>#lG!p zc{(9Y?A0Y9yo?wSYn>iigf~KP$0*@bGZ>*YM4&D;@{<%G<K9Dm7(GMQY-vOtNa-3k z^1Gs8?lBtOp?IXNh`6FJOL*ILM5J7?(#|^u(@7jtHZ{gL-R)TD_S(>g5^uUJGRrV4 z(aZOGB&{_0f*O=Oi0k{@8vN^BU>s3jJRS&CJOl3o|BE{FAA&a#2YYiX3pZz@|Go-F z|Fly;7eX2OTs>R}<`4RwpHFs9nwh)B28*o5qK1Ge=_^w0m`uJOv!=&!tzt#Save(C zgKU=Bsgql|`ui(e1KVxR`?>Dx>(rD1$iWp&m`v)3A!j5(6vBm*z|aKm*T*)mo(W;R zNGo2`KM!^SS7+*9YxTm6YMm_oSrLceqN*nDOAtagULuZl5Q<7mOnB@Hq&P|#9y{5B z!2x+2s<%Cv2Aa0+u{bjZXS<eYvH2TwY^!y_lmH+heIicN?XfJ|VJYUm*=Mf4<I%hV zedGKhEz54U;aQ6Uy*KcjZ4R$`k#i-xZL=<FD%;D~)@x9HPebppVEw|I%7S#wcNK1d zv7<w=YQ$mc)mf#^yDqFDxkzbx_DjhwV|CeCMS58I=R>);#IFPk(Ph-K7K?3i|4ro> zRbqJoiOEYo(Im^((r}U4b8nvo_>4<`)ut`24?ILnglT;Pd&U}$lV3U$F9#PD(O=yV zgNNA=GW|(E=&m_1;uaNmipQe?pon4{T=zK!N!2_CJL0E*R^XXIKf*wi!>@l}3_P9Z zF~JyMbW!+n-+>!u=A1ESxzkJy$DRuG+$o<yICUm+39&}07-fE7jWYct6i={)gpF`c zq%};;XNgi&kAzY(kK*me)WuA}+4Ev33y?TCU9L?;$&CDIvE!tRzC(Eub8YYU0+HsD zsGFKaGBM%U=Qu}6btMVEIqFFG6@$bH*HjsnRcIFz_*J1eUMDilC-d8mj&xih0&4+8 zTNRYlD2Yp9+9kL$3dv9DxJrcjT!^*;sF6{USgG4WWJ#s(va~|Vtivvpl4^(v2|~$I z4KvV%6oS^$ag7Md8bL=uJOiO#K7G+oa1_jxXKw8s{$Fc*<s%Gq2xtbL2&B5v{QKVh zkJ=XVG&6DgZ|_o#A3o^7n{HJ+y_XikFitJY4-jzS1Qw6h1PpwYwHHMOeCydkEg2i1 zAC;IDm|N^t!rq0)dMk~joeJJVjfT^$uzY!Pm#_SvasF9ezbe&@^X_gBA2&ME9y4|) z#&tSxa<C1cY6(A)w(C%ckas6oPp(8^6h>ioG7(@Et|xVbJ#BCt;J43Nvj@MKvTxzy zMmjNuc#LXBxFAwIGZJk~^!q$*`FME}yKE8<LVNO0eIwqR59{+xK19B~if7K=eFkgD zIh>d1f5Mp}KHNq(@=Z8YxV}0@;YS~|SpGg$_jG7>_8WWYcVx#4SxpzlV9N4aO>K{c z$P?a_fyDzGX$Of3@<FPf)Zo`EIjBzhUAP0YL?@0Y2PsSLwG1MnlXE=W3qk@MV%!sa z1w_PRZva4oQuIZ>ykvedGd<@-R;M^Shlj*SswJLD+j@hi_&_>6WZ}#AYLR0iWMK|A zH_NBeu(tMyG=6VO-=Pb>-Q#$F*or}KmEGg*-n?vWQREURdB#+6AvOj*I%!R-4E_2$ zU5n9m>RWs|Wr;h2<xNYO6LIQU3LtCy=I2Xd2!kJhd!E~@d^vN$Yfu&5wfeS|&jUU! zp-j6yzC=XsCqT+u-WvC`)_%q^wE@k2puG1oWXVN+Eb#~@5VAd*UaPrLVaf))C=GUk zK%IJNK{6*^$z@1Y#bRaIw41OKL#4hSRCb<AJ3w*jbO9WVb5V1jxSU~#LejNz`6mRQ z1)Fy7HJ72>DaO&mFBdDb-Z{APGQx$(L`if?C|njd*fC=rTS%{o69U|meRvu?N;Z|Y zbT|ojL>j;q*?xXmnHH#3R4O-59NV1j=uapkK7}6@Wo*^Nd#(;$iuGsb;H315xh3pl zHaJ>h-_$hdNl{+|Zb%DZH%ES;*P*v0#}g|vrKm9;j-9e1M4qX@zkl&5OiwnCz=tb6 zz<6HXD+rGIV<!n~=b=nvG!TOPVF%Z<h|!Lxb5_bC!p~HE#l0w~R!i$%;iU6+rk1&q zNvMcxRx{Q1OKjBor!}odgT(nSx<VF%(%Q1DFG^AtWdws15DKet6Nys*tNYUdvJth+ zq**er^8_6w6&M{{gT9wfJ=VRT7IDho)_ZpK{iH4G?dd`6U2^5`5$Rq`*UXh$X1WC* zx=x;@i7j`y6IINxQbWa-ki0xngQ8y@=<Q?75y@@=nDdj$$F@c3Wrm3Ijv{c|-{86; zFYEd)RaV=^PL!_jI@EhnJG6V1?!I`YP7n^H1`%(C6;hwl&NDWZ(zeFn!@-e!`u|QZ zr%*2EsM;E$zlLMW=p4Umly;DBXD`^I<`kFeRnU_4Qe`SUCS%v>pGtkb{Q^LIgExOm zz?I|oO9)!BOLW#krLmWvX5(k!h{i>ots*EhpvAE;06K|u_c~y{#b|UxQ*O@Ks=bca z^_F0a@61j3I(Ziv{xLb8AXQj3;R{f_l6a#H5ukg5rxwF9A$?Qp-Mo54`N-SKc}fWp z0T)-L@V$$&my;l#Ha{O@!fK4-FSA)L&3<${Hcwa7ue`=f&YsXY(NgeDU#sRlT3+9J z6;(^(<LDM+AvzTU!-C{iPXaX4Nc}0`D$xG$>sjSK@3?oMo$%L-nqy*E;3pb0nZLx6 z;h5)T$y8GXK1DS-F@bGun8|J(v-9<Nj(YoS^a@X%WZ9CzyPzt0MsL^*li+Uz8R464 zO-KqEgSa2^s7jV3sjlYQyBA#{n=mhA!#eK4E&>o=42&nLJy#}M5D0T^5VWBNn$RpC zZzG6Bt66VY4_?<IE3S-C%&9DDOR8D|Xhv=kV0CuLf#wqH{>W=PX$DMpKAI!d`INr) zkMB{XPQ<52rvWVQqgI0OL_NWxoe`xxw&X8yVftdODPj5|t}S6*VMqN$-h9)1MBe0N zYq?g0+e8fJCoAksr0af1)FYtz?Me!Cxn`g<M_?!7yYXUX5LhS#3<X_Le=@)07fxfX zg<wQS_`%em|3SoY1|=4jyh^zC3dtEdfn<*o-|Lal<ZY+P?t&|dqFmI}T2qi9$C}2W zj)GYEvpt>Ux&|T;)695GG6HF7!Kg1zzRf_{VWv^bo81v4$?F6u2g|wxHc6eJQAg&V z#%0DnWm2Rmu71rPJ8#xFUNFC*V{+N_qqFH@gYRLZ6C?GAcVRi>^n3zQxORPG)$-B~ z%_oB?-%Zf7d*Fe;cf%tQwcGv2S?rD$Z&>QC2X^vwYjnr5pa5u#38cHCt4G3|efuci z@3z=#A13`+ztmp;%zjXwPY_aq-;isu*hecWWX_=Z8paSqq7;XYnUjK*T>c4~PR4W7 z#C*%_H&tfGx`Y$w7`dXvVhmovDnT>btmy~SLf>>~84jkoQ%cv=MMb+a{JV&t0+1`I z32g_Y@yDhKe|K^PevP~MiiVl{Ou7^Mt9{lOnXEQ`xY^6L8<d-9S$!~O7k-KROY*PL zCA|!)_d-_?xx)Gcs#Ag@Of}YkY_9U`To>D$705GON{!1?1&YJEl#fTf5Z)da=yiEQ zGgtC-soFGOEBE<kWyJ42cr@+Ng;c_*w#9AHzDDTzeU(l2#nqVc#nsY}WyV2@_UTD^ z0p3$t>B~ZF_{7b(76En>d}mI~XIwNw{e>=Fv)sgcw@qOsykWr?+qAOZSVrQfg}TNI ztKNG)1SRrAt6#Q?(me%)>&A_^DM`pL>J{2xu>xa$3d@90xR61TQDl@fu%_85DuUUA za9tn64?At;{`BAW6oykwntxHeDpXsV#{tmt5RqdN7LtcF4vR~_kZNT|wqyR#z^Xcd zFdymVRZvyLfTpBT>w9<)Ozv@;Yk@dOSVWbbtm^y@@C>?flP^EgQPAwsy75bveo=}T zFxl(f)s)j(0#N_>Or(xEuV(n$M+`#;Pc$1@OjXEJZumkaekVqgP_i}p`oTx;terTx zZpT+0dpUya2hqlf`SpXN<YE2ffZ2e*Y$SI>{}>PfhajNk_J0`H|2<5E;U5Vh4F8er z;RxLSFgpGhkU>W?IwdW~NZTyOBrQ84H7_?gviIf71l`EETodG9a1!8e{jW?DpwjL? zGEM&eCzwoZt^P*<N!;*VGB5Djp#t2G{>8KHZ$B<%{I}>46IT%jJ3AnnB5P%D2E2Z_ z1M!vr#8r}1|KTqWA4%67ZdbMW2YJ81b(KF&SQ2L1Qn(y-=J${p?xLMx3W7*MK;LFQ z6Z`aU;;mTL4XrrE<i<Or!wqhq%QlyTjdg*5fDb6gaB^_iv!f*rl-?Ln!l|T3VJ~h% zFG5H{F@Wd5y{?v7_`yvHg7*5QBVZnIdi~R=W<qSt+5=YVtMBSbwsxP|D{Se=)W!F_ zxvNkUp1u>;HY*Rkh6N%?qviUGNAKiCB~!P}Z->IpO6E(g<M&OUIhRLNqDkr%x|E#j zMC1rVZG&lU_Gx-!F5@j2`I=*FOTQj)Tg<qL0g{oF1T*!`;X&0>Gd7I#eDuT7j|?nZ zK}I(EJ>$Kb&@338M~O+em9(L!+=0zBR;JAQesx|3?Ok90)D1aS9P?yTh6Poh8Cr4X zk3zc=f2rE7jj+aP7nUsr@~?^EGP>Q>h#NHS?F{Cn`g-gD<8F&dqOh-0sa%pfL`b+1 zUsF*4a~)KGb4t<Bv2oG)5VkWX1^EnN#5~luJsu$ucbCPf?=LgPz2nRsx?GLVUI`=( zY$9SFA5^Me2%6^ZY_wkJC<KL%Hc?4sCh|C>e&K0}bE>z3yb8%<cvwb58{*M5QVoG> zibb5Q%Sfiv7fe<uW#_+&tCRnFhL4ZM4$sDrCbtY#b_!YAfVsY$g`+bS@`A0L^(QY? z#W|G!LhF#VQQPxNK_Mhx#q)buV#Q=UEEgyBA<mFM`k+AZ6ZM`=2=73Hpf@19E@eR7 zu;s6N(QU6mW?3M@cL+3p`Sw36_diSVzwy2Qy(p{Hbu{pSV4pmzkzuOyk3!5m%(%Ib z!r$;kO;Xc|%J_)ba*$RwXB4=7e@v++Wtrb#H}%Fm3|3Q=bY(Ph-U&aD+;XHO(Wzz< zDYY_P9<u$OA2uv5(*!<0&XGYb3rM%o__3~kghWc-?#G0vttHh0d@|n>b1r0tfmiMv z@^4XYwg@KZI=;`wC<fA3q+i3K`%`-~GM5g<V!~_MKB~jR$cR`F3fc7<G;rSHk2r&C ztrJxN)0M>)`1jUA9K<xCa85y51*NLZm@2!jk+e&%=>v{HKe2t$WmRcR4y8)VAFjRi zaz&O7Y2tDmc5+SX(bj6yGHYk$dBkWc96u3u&F)2yEE~*i0F%t9Kg^L6MJSb&?wrXi zGSc;_rln$!^ybwYBeacEFRsVGq-&4uC{F)*Y;<0y7~USXswMo>j4?~5%Zm!m@i@-> zXzi82sa-vpU{6MFRktJy+E0j#w`f`>Lbog{zP|9~hg(r{RCa!uGe>Yl536cn$;ouH za#@8<bb6U~GCb`PT?W5hHtV|47ZFG$+hAyN&fq$4(Ot12lKB<21MEZg_Q-YY!%}x= zuWFCT;tpouD&fMRN=Y>XMvS-k<e;&>ddc1`!1LVq;h57~zV`7IYR}pp3u!JtE6Q67 zq3H9ZUcWPm2V4IukS}MCHSdF0qg2@~ufNx9+VMjQP&exiG_u9TZAeAEj*jw($G)zL zq9%#v{wVyOAC4A~AF=dPX|M}MZV)s(qI9@aIK?Pe+~ch|>QYb+78lDF*Nxz2-v<D% zcRd<z99X^7c7PW8j+gcz?IBq-;oMn%;{H0yI^JQO`G+@}_ePz1Wy+Mh|7pZC=@Ii3 z0*m9!w~(oyyl|dFC58MGT~tAUx$vd#eA>pRbtQ*F4$0fDbvNM#CCatgQ@z1+EZWrt z2dZfywXkiW=no5jus-92>gXn5rFQ-COvKyegmL=4+NPzw6o@a?wGE-1Bt;<PJi94( z<6c`oa?1fKdAjFJW5W_g?tBjcWSvia^nQZ6V4vu{o{O_DSW2)fWnWP>pCHe;34K%Z z-FnOb%!nH;)gX+!a3nCk?5(f1HaWZBMmmC@lc({dUah+E;NOros{?ui1zPC-Q0);w zEbJmdE$oU$AVGQPdm{?xx<!1KpS@)5+lwbpwbHgBb5t;Tv7q=WjZP!H5`~PMu(R<= zb_w2iXtGulObR{20>I_0CKNG$LbY*i?YRQ$(&;NiA#h@DCxC(U@AJ$Yt}}^xt-EC_ z4!;QlLkjvSOhdx!bR~W|Ezmuf6A#@T`2tsjkr>TvW*lFCMY>Na_v8+{Y|=MCu1P8y z89vP<f7GYh$B_>iH5+CKcG-5lzk0oY>~aJC_0+4rS@c@ZVKLAp`G-sJB$$)^4*A!B zmcf}lIw|VxV9NSoJ8Ag3CwN&d7`|@>&B|l9G8tXT^BDHOUPrtC70NgwN4${$k~d_4 zJ@eo6%YQnOgq$th?0{h`KnqYa$Nz@vlHw<%!C5du6<*j1nwquk=uY}B8r7f|lY+v7 zm|JU$US08u<I_Z0*-mWQzO-I}`qHpS$zU=BX|3&Luf49L-+WxZKy4vRpusJ%8m)@0 ziv{;^9|o211-;}2C=izc*@WKjs!pixu>gor8E$h3wH$c&i~;guC|3-tqJy#T;v(g( zBZtPMSyv%jzf->435yM(-UfyHq_D=6;ouL4!ZoD+xI5uCM5ay2m)RPmm$I}h>()hS zO!0gzMxc`BPkUZ)WXaXam%1;)gedA7SM8~8yIy@6TPg!hR0=T>4$Zxd)j&P-pXeSF z9W`lg6@~YDhd19B9ETv(%er^Xp8Yj@AuFVR_8t*KS;6VHkEDKI#!@l!l3v6`W1`1~ zP{C@keuV4Q`Rjc08lx?zmT$e$!3esc9&$XZf4nRL(Z*@keUbk!GZi(2Bmyq*saOD? z3Q$V<*P-X1p2}aQmuMw9nSMbOzuASsxten7DKd6A@ftZ=NhJ(0IM|Jr<91uAul4JR zADqY^AOVT3a(NIxg|U;fyc#ZnSzw2cr}#a5lZ38>nP{05D)7~ad7JPhw!LqOwA<Y{ z)yrJ_La;uB3SP!wHE^grv11_tcxh#A!E8bJQhBK(9Mo&`u*lMyrj4p(I8aUmo)2i* zK1Ri%OzatjYYNK8-7I{EKb1H$SU6ydR@xd)2@5&9s<Q^eFvM0hFpYmGTORfJP~Sm0 zbzAdRW+^A`^K2`yHoag|woQA(>TXtRhK!w0X4HgS1i<%AxbFmGJx9?sEURV+S{k~g zGYF$IWSlQonq6}e;B(X(sIH|;52+(LYW}v_gBcp|x%rEAVB`5LXg_d5{Q5tMDu0_2 z|LOm$@K2?lrLN<F4(!5Ih-vJ&D`=Lp&e(8;uy%9Wg4#kfE!IquHgsYkR;<Orv$CnO zt>F=mr%YP|U-t)~9bqd+wHb4KuPmNK<}PK6e@aosGZK57=Zt+kcszVOSbe;`E^dN! ze7`ha3WUUU7(nS0{?@!}{0+-VO4A{7+nL~UOPW9<FTzMloH2%%9rtpS=Jy|^du^;_ z#!4Hd4(#1Ul%Gj75ynFpB2oy8p)HhvdITMDu^`)I+jaV6N>_P(6^GL0h${SLtqG!} zKl~Ng5#@Sy?65wk9z*3SA`Dpd4b4T^@C8Fhd8O)k_4%0RZL5?#b~jmgU+0|DB%0Z) zql-c<cx#eek}u-o<6!z^!jA`Z&7_*Rf08gH81%Bz6+y1+Co``NPc_0V2NfM4GGwsb zowc^r=VRUe^j6An3gYrL@v1Vl;+|i)K_fHqR%(frk}US!rna3>PC>A9HPjdOTpPC` zQwvF}uB5kG$Xr4XnaH#ruSjM*xG?_hT7y3G+8Ox`flzU^QIgb_>2&-f+XB6MDr-na zSi#S+c!ToK84<&m6s<?C_%KbO28)G|23ii3xXG@;CM=`fG3)1$3S3z7vhRja3qMoH zK?O+5-P#^X7Tjd7ulJI^d48(+_u6aya_BTAPgbwS>CiGTd^8pNdXo+$3^l3FL_E`0 z>8it5YIDxtTp2Tm(?}FX^w{fbfgh7>^8mtvN>9fWgFN_*a1P`Gz*dyOZF{OV7BC#j zQV=FQM5m>47xXgapI$WbPM5V`V<7J9tD)oz@d~MDoM`R^Y6-Na(lO~uvZlpu?;zw6 zVO1faor3dg#JEb5Q*gz4<<AnFRC*cC)M_OVz>W8tgC3nE2BG2je<udTI%)`On6Q}o zR&JsDj?T>IQs1)<{In&7hJ39x=;ih;CJDy)>0S1at*7n?Wr0ahYCpFjZ|@u91Zl7( zv;CSBRC65-6f+*JPf4p1UZ)k=XivKTX6_bWT~7V#rq0Xjas6hMO!HJN8GdpBKg_$B zwDHJF6;z?h<;GXFZan8W{XFNPpOj!(&I1`&kWO86p?Xz`a$`7qV7Xqev|7nn_lQuX ziGpU1MMYt&5dE2A62iX3;*0WzNB9*nSTzI%62A+N?f?;S>N@8M=|ef3gtQTIA*=yq zQAAjOqa!CkHOQo4?TsqrrsJLclXcP?dlAVv?v`}YUjo1Htt;6djP@NPFH+&p1I+f_ z)Y279{7OWomY8baT(4TAOlz1OyD{4P?(DGv3XyJTA2IXe=kqD)^h(@*E3{I~w;ws8 z)ZWv<c6*)h1$(Z51qcP+DRirB9I?!9z{4!tKo&NOtiNe!3Nskjf;<7)ZGR)Ce+8XH z$7`qTDUDKj%cwKeq%F!E5f^m5JlenxKeZ*MX)t~+9P40{hT}M-SFnMQu)KvR6_Mv- z1os%YtNb@bzIhWOjpZuY=nBo_$5tYbzK&6)5bkkIr((WN-0LPmQiEL5b_>7E)pbEM zd3MO<B?Qx@?L~w=ib1`&Z<WC=541d*cau`)HK)ilxYxk^H+U-}O0<j|!$=c%YHv$( zB62PGmLx4Gcyu!<9<2m@eK#f-9?|M1Q^a4}1sMCZnN)#sp5?k^i`?k>XRH3mQhks9 zv6{s;k0y5vrcjXaVfw8^>YyPo=oIqd5IGI{)+TZq5Z5O&hXAw%ZlL}^6FugH;-%vP zAaKFtt3i^ag226=f0YjzdPn6|4(C2sC5wHFX{7QF!tG1E-JFA`>eZ`}$ymcRJK?0c zN363o{&ir)QySOFY0vcu6)kX#;l??|7o{HBDVJN+17rt|w3;(C_1b>d;g9Gp=8YVl zYTtA5<a+evm|Uh9(^nt7y}^=R%V&07M;`wL$Z6eB3P>2@!7AUEkTm@P&h#eg+F*lR zQ7iotZTcMR1frJ0*V@Hw__~CL>_~2H2cCtuzYIUD24=Cv!1j6s{QS!v=PzwQ(a0HS zBKx04KA}-Ue+%9d`?PG*hIij@54RDSQpA7|>qY<VUdmtvCUx(~$ooAEO+~lek^feJ z*nH#k-4kpWB@9MHG~~$EzIn^8Dz$c4ZdF?E!e)Znig4A9{4xQ^OBKe|I6diEpHCz; z4=JikDy^i)j1->VIrK_G6%6;#ZkR}NjUgmGju)2F`>|WJoljo)DJgZr4eo1k1i1+o z<qL)5lk*b&hIr4A=KB{MWeJIAjTgw!9R>1D{>^RlpIY8OUaOEf5EBu%a&~c5aWnqM zxBpJq98f=%M^{4mm~5`CWl%)<vVlq$sK10I+C!$T$f&F>nFR64U{(chmST&2jp+-r z3675V<;Qi-kJud%oWnCLdaU-)xTnMM%rx%Jw6v@=J|Ir=4n-1Z23r-EVf91CGMGNz zb~wyv4V{H-hkr3j3WbGnComiqmS0vn?n?5v2`Vi>{Ip3OZUEPN7N8XeUtF)Ry6>y> zvn0BTLCiqGroFu|m2zG-;Xb6;W`UyLw)@v}H&(M}XCEVXZQoWF=Ykr5lX3XWwyNyF z#jHv)A*L~2BZ4lX?AlN3X#axMwOC)PoVy^6lCGse9bkGjb=qz%kDa6}MOmSwK`cVO zt(e*MW-x}XtU?GY5}9{MKhRhYOlLhJE5=<R+-QqP#4_qUQ*fYhz-TKyg5<VHOV^iF zmw{U2tLdX6=8e$W`cctWz+|!Xu%{|!xm;hl(Bfg6K$gw?-RM@Bzr)89_7_)3i&GcH z6YFo3@<W2)L^k*F4xWPR2w3%Hgqypk=|CBOh(C-wWyEZ$m@J1wyxA;wt!BYSYxD8g zFU9s}C)A08k5*p<s<(MOY~!sL?}I{Bwt`D&jolU!RoLd_l5{TA0Zdwec$X$MJ{In; z#qO9Yd_=QW5qS-dut~psFz4yPhQd!|M-JzeY1y$#z7SRyus~%_uGKZ>ca+-RmO04^ z66z{40J=s=<Mmb*Zx^<grQ^dX@zjQdeLQA7+rGP3X0qLLUJC0KRO>ey9OCdc(RCzy zd7Zr1%!y3}MG(D=wM_ebhXnJ@MLi7cImDkhm0y{d-Vm81j`0mbi4lF=eirlr)oW~a zCd?26&j^m4AeXEsIUXiTal)+SPM4)HX%%YWF1?(FV47BaA`h9m67S9x>hWMVHx~Hg z1meUYoL<blDsj63TBv640kUaLAx#!=rnp@1u_p};Z5nB5f$LgFFKoN)PJO29x+f3U zGA(28c!A^u21zIZ<FO6vnD|j2sRb9EgK?g^yqSvsY{aPo%19I#i9^C=?qc-KdQuFf zsR6Hn1<EP(2*WHlNndxJqD|^9Swomu2_pSS6s%xNp$a0Q@DbGy=0j4(aFot4&~k<D z{V#LA=j-W8;ooL_=>L(p@b3?x|9DgWeI|AJ`<t;U$xdMwsPOn~!9P8M!lwzJf)5ge zPt3~?XF>Ia84*P{Mb%H$ZRROouR4wZhOPX15=KiBMHl!^JnCt$Az`KiH^_d>cev&f zaG2>cWf$=A@&GP~DubsgYb|L~o<gBF&<LO~=SWReQBq}@iYsfq=fR#&V4w#~C!EfY zrw>)cn5h%2`i^!2)bzOTw2UR!>q5^r&2Vy}JaWFUQE04v>2;Z@ZPwXr?y&G(B^@&y zsd6kC=hHdKV>!NDLIj+3rgZJ|dF`%N$DNd;B)9BbiT9Ju^Wt%%u}SvfM^=|q-nxDG zuWCQG9e#~Q5cyf8@y76#kkR^}{c<_KnZ0QsZcAT|YLRo~&tU|N@BjxOuy`#>`X~Q< z?R?-Gsk$$!oo(BveQLlUrcL#eirhgBLh`qHEMg`+sR1`A=1QX7)ZLMRT+GBy?&mM8 zQG^z-!Oa&J-k7I(3_2#Q6Bg=NX<|@X&+YMIOzfEO2$6Mnh}YV!m!e^__{W@-CTprr zbdh3f=BeCD$gHwCrmwgM3LAv3!Mh$wM)~KWzp^w)Cu6roO7uUG5z*}i0_0j47}pK; ztN530`ScGatLOL06~zO)Qmuv`h!gq5l#wx(EliKe&rz-5qH(hb1*fB#B+q`9=jLp@ zOa2)>JTl7ovxMbrif`Xe9;+fqB1K<t$PN%b0*juJk@B^zQ;tiy5(~*|#DUYAgor}T zM8=J^f)tau_?D0X_`rotGny(P?~w+fXV=r|(S=EzflR<iVA^pG*GB>#l=Dv!iT;xF zdkCvS>C5q|O;}ns3AgoE({Ua-zNT-9_5|P0iANmC6O76Sq_(AN?UeEQJ>#b54fi3k zFmh+P%b1x3^)0M;QxXLP!BZ^h|AhOde*{9A=f3|Xq*JAs^Y{eViF|=EBfS6L%k4ip zk+7M$gEKI3<lnX;I~8;d41fE2N2dl$NyMaP%R(U%rVx-XQi||%EoeXN5;;rlz8cAC z{M55(C<Dd|hkU?)n?=$dY~JLVWqK!mN6pIqg)hP!h#156?rbpWcfmd7_psLRSOaWI zh=O=PQqk`j7Hd}4KFyusk+@oV@<<s_-9gM4h2N&3CTczWNu;}9hMGuq4_irhsrY}g zM7hOuM4@nU!4b6JLY-gUiMz%akvVA3tIjL8*l3q4&#Ks%cUI%AdaeJluTU3ha1PO5 zKwR${cl2Aq|Dft)aq!r3X3IdBNpGuS$wUD}n|D@fdCWOS)8}<)DcNL{7e#uF(ZIGN zY^$B;Sy?T*Rv2Mt>?bQg?H3zaE@;cyv9kv;cqK$VxQbFEsy^iM{XXW0@2|DOu$!-k zSFl}Y=jt-VaT>Cx*KQnHTyXt}f9XswFB9ibYh+k2J!ofO+nD?1iw@mwtrqI4_i?nE zhLkPp41ED62me}J<`3RN80#vjW;wt`pP?%oQ!oqy7`miL>d-35a=qotK$p{IzeSk# ze_$CFYp_zIkrPFVaW^s#U4xT1lI^A0IBe~Y<4uS%zSV=wcuLr%gQT=&5$&K*bwqx| zWzCMiz>7t^Et@9CRUm9E+@hy~sBpm9fri$sE1zgLU((1?Yg{N1Sars=DiW&~Zw=3I zi7y)&oTC?UWD<bim(U(Kcv26Hs1MgPYCZBQyaz{OU-1!oDtd9;K0gr>2w97xQ&5vx zRXEBGeJ(I?Y}eR0_O{$<B>~)bMJRTsNUPIfR!xU9PE7A>AMNr_wbrFK>&vVw=Y;RH zO$mlpmM<e5@>sQ}-FQ2cSj7s7GpC+~^<qIE<1Uq4Aa|;IK^K)Yh(A_XUCB|Y_R?~k zei=zP?!DdEmTszWYaP-@z07H$=_l%jx(w*~q_p3m(MQdLR!iM5qQ}A5&l2~45^XB! zUW8`<CFCM-FHQde?_1|-4E>Q~dC?y>M}%!-3kq(F3hGWo9B-Gn02AwUgJ>Z-pKOaj zysJBQx{1>Va=*e@sLb2z&RmQ7ira;aBijM-xQ&cpR>X3wP^foXM~u1>sv9xOjzZpX z<BQ#2^vCHKQ$F!+WCtF?gZbu_QJAuhoSUjsyz8+;?vb5qdIDvheozYu-4++t9hTcY zbR)6?>0K;EGouSYD~oQ&lAafj3~EaXfFShC+><iKQbwWBYIkb|tCE~^kzi;pS;%$l zKgeQc!Ja|tXHhs|vuNBpq7;why7Y~OkBN=s5_$h(<&luxUowJL<gbi2wNJlu_eEYQ zb_?aVix=V!OXdJWUufB<?#(vny@AY4z`w$l-OaG&e89%J0Nk&L|6k4!5hE8fDSH<) zdlxHLV0@7ZP<v)?0i0?bjexwv|IC&yQdza16-41X)m?)M12iHks%lH;wkdt}6QWUq z5EYKV097vUa!80?9<8HWEqlWJAZ6;n_yPT!Eg+<Iaz!0Qjzp4Xbn@(JJdJzzy5#aw z0Hk!62ApsJL47X1kI!vwv96|%k`R+njgSN2s=~u+$wDE$j}9<hC4>VsRlEMa9cg9i zFxhCKO}K0ax6g4@DEA?dg{mo>s+~RPI^ybb^u--^nTF>**0l5R9pocwB?_K)BG_)S zyLb&k%XZhBVr7U$wlhMqwL)_r&&n%*N$}~qijbkfM|dIWP{MyLx}X&}ES?}7i;9bW zmTVK@zR)7kE2+L42Q`n4m0VVg5l5(W`SC9HsfrLZ=v%lpef=Gj)W59VTLe+Z$8T8i z4V%5+T0t8LnM&H>Rsm5C%qpWBFqgTwL{=_4mE{S3EnBXknM&u8n}A^IIM4$s3m(Rd z>zq=CP-!9p9es2C*)_hoL@tDYABn+o#*l;6@7;knWIyDrt5EuakO99S$}n((Fj4y} zD!VvuRzghcE{!s;jC*<_H$y6!6QpePo2A3ZbX*ZzRnQq*b%KK^NF^z96CHaWmzU@f z#j<acd!VSzE28qM%06`oTXBbQEt6zJ&2X&)^HOYF6Pnpz<>;y?X=UP&+YS3kZx7;{ zDA{9(wfz7GF`1A6iB6fnXu0?&d|^p|6)%3$aG<Kg5Jl{;b)9vyrW+~P_>0Uor~8o? z*e}u#qz7Ri?8Uxp4m_u{a@%bztvz-BzewR6bh*1Xp+G=tQGpcy|4V_&*aOqu|32CM zz3r*E8o8SNea2hYJpLQ-_}R&M9^%@AMx&`1H8aDx4j%-gE+baf2+9zI*+Pmt+v{39 zDZ3Ix_vPYSc;Y;yn68kW4CG>PE5RoaV0n@#eVmk?p$u&Fy&KDTy!f^Hy6&^-H*)#u zdrSCTJPJw?(hLf56%2;_3n|uj<S!~jd!&;hUy<>USJOU8VPOTlDULwt0jS@j^t1WS z!n7dZIoT+|O9hFUUMbID4Ec$!cc($DuQWkocVRcYSikFeM&RZ=?BW)mG4?fh#)KVG zcJ!<=-8{&MdE)+}?C8s{k@l49I|Zwswy^<hSY@OWrCd=daYhyVsh3++Yv9P!Otyxd zYr!|~;J5!$7otrpXL(;Gt`M6)w8EjcUYeS0ogAHFK&g17jnaBRmS2tFge^7{t|dx< zUgs1<p==05JEfOIW~$+{WKl}T&QH1g-J2AoD4r7s&R3K8i}<Z<e!RF()LS`-mtZYo zezQv0sh3)<Sa%bi-o4*w%h1YNuhKF@#1?2f1$C)eaGkKn;xb6f@Jm-3j`p?BErB+l zHwQJSKqYTvG)b1Mx5%)zS8k>ZN3;E!FKyglY~Aq?4m74P-0)sMTGXqd5(S<-(DjjM z&7dL<EW0B_YAuips^)+S>-Mr8jhUCAG$5^m<srgKVh%Jz7M@*Ies!?2)w)Kdl4a_a zuHwQSNhF~YHc5%rQCXctfet<O8za-I?YydOFk8iN?JqT#U=4tC4f@I)EBP`j*`--{ zNGBM|)9Ytkc3T^M7RDsL<yKyN7!^_SO>I<|%`;JI5FVUnNj!VO2?Jiqa|c2;4^n!R z`5KK0hyB*F4w%cJ@Un6GC{mY&r%g`OX|1w2$B7wxu97%<@~9>NlXYd9RMF2UM>(z0 zouu4*+u+1*k;+nFPk%ly!nuMBgH4sL5Z`@Rok&?Ef=JrTmvBAS1h?C0)ty5+yEFRz zY$G=coQtNmT@1O5uk#_MQM1&bPPnspy5#>=_7%WcEL*n$;sSAZcXxMpcXxLe;_mLA z5F_paad+bGZV*oh@8h0(|D2P<J(t&2Qw&v^wfgJcGu^$r_u9Q*RQLJ1p@nF4Tco@2 z(1Ps*g@KQZFol96Tqf`~w0w8i@XjVE!)t~{G1+Ted=d-`Ysb%GXG84BqJ~^?`UyR8 zw*)YgFW}yav*K+Tc;as<ycKp3q1UreEHgV%{-DD&Lw587I$PqFzfY`h9kC<heY*xX zeTV-1r@oi~Jzv?6`f+rA)2}J0FW8Yx)AXHWVAC=Kl{qRb_;ZZenWU{)T$~^kw>!q# zTHjmiphJ=AazSeKQPkGOR-D8``LjzToyx{lfK-1CDD6M7?pMZOdLKFtjZaZMPk4}k zW)97Fh(Z+_Fqv(Q_C<zhRDIaVb+X5HoUF<TQrGZ$uH?09fna{AQ6dwyMUF<j(@?_{ z7dup3{JX?S)cqadoWhnBFSYmMD_->MH-YYi?fR5fBnz7KOt0*t^cxmDoIokc=+`o# zrud|^h_?KW=Gv%byo~(Ln@({?3gnd?DUf-j2J}|$Mk>mOB+1{ZQ8HgY#SA8END(Zw z3T+W)a&;OO54~m}ffemh^oZ!Vv;!O&yhL0~hs(p^(Yv=(3c+PzPXlS5W79Er8B1o* z`c`NyS{Zj_mKChj+q=w<HOP7Tq0RxJ;u<fTlvk?B9o$Wi&hPOY?Y2c&mNuZvb`-Y2 z_5}8ELw*g`I6xv4ops05GS?1{(ES#Zm-kpClr;oo6ZRu~upD(%jyh&9`ledY>)B}K za*zzPhs?c^`EQ;keH{-OXdXJet1EsQ)7;{3eF!-t^4_Srg4(Ot7M*E~91gwnfhqaM zNR7dFaWm7MlDYWS*m}CH${o?+YgHiPC|4?X?`vV+ws&Hf1ZO-w@OGG^o4|`b{bLZj z&9l=aA-Y(L11!EvRjc3Zpxk7lc@yH1e$a}8$_-r$)5++<GK}kbqxgH=4Tct(TwL^` z^f<xeT@)HfJ0rR60)NutB#?@dlV#K-$S%4<q|dyJ9(<Vo8k-QWkML>`_eUr1+dTb@ zU~2P1HM#W8qiNN3b*=f+FfG1!rFxnNlGx{15}BTI<gZnXqCb;nB49D)H>HgxO>Cq4 z;#9H9YjH%>Z2frJDJ8=xq>Z@H%GxXosS@Z>cY9ppF+)e~t_hWXYlrO6)0p7NBMa`+ z^L>-#GTh;k_XnE)Cg<Bw9XsVmKp2?IBmR@^xjFIWwfvA(PR_0Y3bH<dHA$ukL^nqU zFc)9w=@dA}yE)^wFlkFa(%m~`8h+w~I9AY&!?Z<t9kWjGo)R&+#Vu8>y|0Dw;(c0* zSzW14ZXozu)|I@5mRFF1eO%JM=f~R1dkNpZM+Jh(?&Zje3NgM{2ezg1N`AQg5%+3Y z64PZ0rPq6;_)Pj-hyIOgH_Gh`1$j1!jhml7ksHA1`CH3FDKiHLz+~=^u@kUM{ilI5 z^FPiJ7mSrzBs9{HXi2{sFhl5AyqwUnU{sPcUD{3+l-ZHAQ)C;c$=g1bdoxeG(5N01 zZy=t8i{*w9m?Y>V;uE&Uy~i<w#eexJWxGnFfWNZGkrIlf$sI~zk&Tqr=Ed!9rbKTc z`|lpRCJ}6^>Y{pY4AV3_N;RL_jT_QtLFx^KjcUy~q9K<?m7^TR%~{qqS!wi!O`F=v zm8o|@KNdytDU%MB5>cLE3$QJ{!)@$@En{UGG7&}lc*5Kuc^780;7Bj;)X?1CSy*^^ zPP^M)Pr5R>mvp3_hmCtS?5;W^e@5BjE>Cs<`lHDxj<|gtOK4De?Sf0YuK5GX9G93i zMYB{8X|hw|T6HqCf7Cv&r8A$S@AcgG1cF&iJ5=%+x;3yB`!lQ}2Hr(DE8=LuNb~Vs z=FO&2pdc16nD$1QL7j+!U^XWTI?2qQKt3H8=beVTdHHa9=MiJ&tM1RRQ-=+vy!~iz zj3O{pyRhCQ+b(>jC*H)J)%Wq}p>;?@W*Eut@P&?VU+Sdw^4kE8lvX|6czf{l*~L;J zFm*V~UC;3oQY(ytD|D*%*uVrBB}BbAfjK&%S;z;7$w68(8PV_whC~yvkZmX)xD^s6 z{$1Q}q;99W?*YkD2*;)tRCS{q2s@JzlO~<8x9}X<0?hCD5vpydvOw#<cvxXp^iJBo zLh*WQB{twDd_ndGde;Ycv4>Z$2;$@cZkYrp83J0PsS~!CFtY%BP=yxG?<@#{7%2sy zOc&^FJxsUYN36kSY)d7W=*1-{7ghPAQAXwT7z+NlESlkUH&8ODlpc8iC*iQ^MAe(B z?*xO4i{zFz^G=^G#9MsLKIN64rRJykiuIVX5~0#vAyDWc9-=6BDNT_aggS2G{B>dD ze-B%d3b6iCfc5{@yz$>=@1kdK^tX9qh0=ocv@9$ai``a_ofxT=>X7_Y0`X}a^M?d# z%EG)4@`^Ej_=%0_J-{ga!gFtji_byY&Vk@T1c|ucNAr(JNr@)nCWj?QnCy<Q#dA2E z;P8C%0;>vXg&?FW;S-VOmNL6^km_dqiVjJuIASVGSFEos@EVF7St$WE&Z%)`Q##+0 zjaZ=JI1G@0!?l|^+-ZrNd$WrHBi)DA0-Eke>dp=_XpV<%CO_Wf5kQx}5e<90dt>8k zAi00d0rQ821nA>B4JHN7U8Zz=0;9&U6LOTKOaC1FC8GgO&kc=_wHIOGycL@c*<bG) zwo>$`ce703t%>S}mvxEnD-V!;6c`2(p74V7D0No1Xxt`urE66$0(ThaAZ1YVG#QP$ zy~NN%kB*zhZ2Y!kjn826pw4bh)75*e!dse+2Db(;bN34Uq7bLpr47XTX{8UEeC?2i z*{$`3dP}32${8pF$!$2Vq^gY|#w+VA_|o(oWmQX8^iw#n_crb(K3{69*iU?<%C-%H zuKi)3M1BhJ@3VW>JA`M>L~5*_bxH@Euy@niFrI$82C1}fwR$p2E&Z<Ob;#(TU74Ph ztf8J0&fyeMMw)zi=hIx%&y{|{T_5jY)NMBe+>Ynu?jlS}u7W9AyfdXh2pM>78bIt3 z)JBh&XE@zA!kyCDfvZ1qN^np20c1u#%P6;6tU&dx0phT1l=(mw7`u!-0e=PxEjDds z9E}{E!7f9>jaCQhw)&2TtG-qiD)lD(4jQ!q{`x|<ESM5KH=eknfZ>8l&nmtHkdul# zy+CIF8lKbp9_w{;oR+jSLtTfE+B@tOd6h=QePP>rh4@~!8c;Hlg9m%%&<QnUTcKE; z)YrxkvA7z9t4D^hQ9oX+mA>?e`*Z?qz5-zLEWfi>`ord5uHF-s{^bexKAoMEV@9nU z^5nA{f{dW&g$)BAGfkq@r5D)jr%!Ven~Q58c!Kr;*Li#`4Bu_?BU0`Y`nVQGhNZk@ z!>Yr$+nB=`z#o2nR0)V3M7-eVLuY`z@6CT#OTUXKnxZn$fNLPv7w1<nPf|^3AoMwV zKsB+NSiodoZIAhe1$EQSDVdL)?SZ(PH*jg!xwhJ*#U_F)oKXO&*jTkSXt<YKQT&PH zl+Mukt=H*1QL&wAQ_xuxbV-d>y7eGE=Qv@Hey`n;`U=xEl|q@CCV^#l)s0ZfT+mUf z^(j5r4)L5i2jnHW4+!6Si3q_LdOLQi<^fu?6WdohIkn79=jf%Fs3JkeXwF(?_tcF? z?z#j6iXEd(wJy4|p6v?xNk-)iIf2oX5^^Y3q3ziw16p9C6B;{COXul%)`>nuUoM*q zzmr|NJ5n)+sF$!yH5zwp=iM1#ZR`O%L83tyog-q<XVH~w)?V;YEs2<xxAL9u8Cn)q z1@19=BrkPVp`q0nx*9KBOD=73^U!k`$Oz)fql$!XXe-VDQxD5No*n!+(&gJj6>h1I z0%dcj{NUs?{myT~33H^(%0QOM>-$hGFeP;U$puxoJ>>o-<CEgGXJLB#!{-C@Jwxpl zUVta>%Lk*8X^rx1>j|LtH$*)>1C!Pv&gd16%`qw5LdOIUbkNhaBBTo}5iuE%K&ZV^ zAr_)kkeNKNYJRgjsR%vexa~&8qMrQYY}+RbZ)egRg9_$vkoyV|Nc&MH@8L)`&rpqd zXnVaI@~A;Z^c3+{x=xgdhnocA&OP6^rr@rTvCnhG6^tMox$ulw2U7NgUtW%|-5VeH z_<gxR5|IS!q~A=25>qyd47}1?IbuKtqNbNx$HR`*+9o=8`%vM8&SIKbkX9&%TS++x z5|&6P<%=F$C?owUI`%uvUq^yW0>`>yz!|WjzsoB9dT;2Dx8iSuK%%_XPgy0dTD4kd zDXF@&O_vBVVKQq(9YTClUPM30Sk7B!v7nOyV`XC!BA;BIVwphh+c)?5VJ^(C;GoQ$ zvBxr7_p*k$T%I1ke}`U&)$uf}I_T~#3XTi53OX)PoXVgxEcLJgZG^i47U&>LY(l%_ z;9vVDEtuMCyu2fqZeez|RbbIE7@)UtJvgAcVwVZNLccswxm+*L&w`&t=ttT=sv6Aq z!Hou<k0lNu5^&RexWJv?GQ<(f-tAdV`ej!bdbIg1R|4AZ>Sc-24Y9;0q$>j<b^i|8 zppCpm&+RogSUV(8s{BI8BL#}F;4aOJZKcE!Pf-lH9R<RO^Qvy3pp`?zlkS$40ETip z#iwAYNc9U|m)^oU39^nY%y|fh6uw!3zzx%TC0aynt(FtcFlv}PC-h|0p?DEJQYrjq zBKI!p<K#dC6MPk}7LWi#I^%1f&O0$*|AhoYuOGhe5ch<EZ*Rey>X<1DnnGmAsP))- z^F~o99gHZw`S&Aw7e4id6Lg7kMk-e)B~=tZ!kE7sGTOJ)8@q}np@j7&7Sy{2`D^FH zI7aX%06vKsfJ168QnCM2=l|i>{I{%<!ihA(&wjT8>@gcr>ExM0Dw{PX6ozEuqFYEt z087%MKC;wVsMV}kIiuu9Zz9~H!21d!;Cu#b;hMDIP7nw3xSX~#?5#SSjyyg+Y@xh| z%(~fv3`0j#5CA2D8!M2TrG=8{%>YFr(j)I0DYlcz(2~92?G*?DeuoadkcjmZszH5& zKI@Lis%;RPJ8mNsbrxH@?J8Y2LaVjUIhRUiO-oqjy<&{2X~*f|)YxnUc6OU&5iac= z*^0qwD~L%FKiPmlzi&~a*9sk2$u<7Al=_`Ox^o2*kEv?p`#G(p(&i|ot8}T;8KLk- zPVf_4A9R`5^e`Om2LV*cK59EshYXse&IoByj}4WZaBomoHAPKqxRKbPcD`lMBI)g- zeMRY{gFaUuecSD6q!+b5(?vAnf>c`Z(8@RJy%Ulf?W~xB1dFAjw?CjSn$ph>st5bc zUac1aD_m6{l|$#g_v6;=32(mw<xx{81gP??-5Uh*EV=|5q0G)(9Um);{*OY?3hgGs zHqE$wRv9KDE!`nta<{9Y4QRqGn${O@+U-}(7qm0?ojE3A!<eQO9on1lM0ltLJ}Kpf zPO%OShmlRE#Wmx(J9Hyj$tUDEO>pveQDWhmjR7{|B=$oBhz`7_g7qNp)n20|^^op3 zSfTdWV#Q>cb{CMKlWk91^;mHap{mk<B1o0O$~&VV_U2#V<W~>)o?udk$^Q^^u@&jd zfZ;)saW6<!B#!OgYCYl~S`2$rXNu%O_6_#lt;!oR!`vSRj~T^(P81s=*gVNND(5&m za4R|>{e*yoL6#0}oVPb2!}r{pAUYtn4{P~ES9tTfC5hXZnM{HrC8^=Pof{G4%Bh#8 ze~?C9m*|fd8MK;{L^!+wMy>=f^8b&y?yr6KnTq28$pFMBW9Oy7!oV<DBr1GmQ?eRF zSbp)4f>5z|VM$s-cZ{I|Xf@}-)1=$V&x7e;9v81eiTi4O5-vs?^5pCKy2l>q);!MA zS!}M48l$scB~+Umz}7NbwyTn=rqt@`YtuwiQSMvCMFk2$83k<zeO0U*)I|(yg*Kj9 zONJ(J+8Nxd$mc?9L-e3_6F%}5XllimT|8wU-RBL2UO3qjy<3$=B&}4tijES(#plr# zo#B)LRZ<DaC0ur2d6y>50Q>OK5&fe*xCddIm)3D0I6vBU<+!3=6?(OhkO|b4fE_-j zimOzyfBB_*7*p8AmZi~X2bgVhyPy>KyGLAnOpou~sx9)S9%r)5dE%ADs<phjJ+~cu z6e^C%cj-bwkDqeTKwT845#%IrytZTl)MM>4v%fFybDa_w*0?+>PsEHTbhKK^G=pFz z@IxLTCROWiKy*)cV3y%0FwrDvf53Ob_XuA1#tHbyn%Ko!1D#sdhBo`;VC*e1YlhrC z?*y3rp86m#qI|qeo8)_xH*G4q@70aXN|SP+6MQ!fJQqo1kwO_v7zqvUfU=Gwx`CR@ zRFb*O8+54%_8tS(ADh}-hUJzE`s*8wLI>1c4b@$al)l}^%GuIXjzBK!EWFO8W`>F^ ze7y#qPS0NI7*aU)g$_ziF(1ft;2<}6Hfz10cR8P}67FD=+}MfhrpOkF3hFhQu;Q1y zu%=jJHTr;0;oC94Hi@LAF5quAQ(rJG(uo%BiR<W&PP;_;Uh7C_pCS&MdX%OcW)hw? zL}{(HSc2IOGWvq06nVXQXW)q)t<UD4PDnDq6M`=+mQENt0<@wGM<nU_;&^eWn$!ar zz_42ZyHoVPGok(apsld>Q@8U;nhX)j0i?0SL2g-A*YeAqF>RVCBOTrn{0R27vu}_S zS>tX4!#&U4W;ikTE!eFH+PKw%p+B(MR2I%n#+m0{#?qRP_tR@zpgCb=4rcrL!F=;A zh%EIF8m6%JG+qb&mEfuFTLHSxUAZEvC-+kvZKyX~SA3Umt`k}}c!5dy?-sLIM{h@> z!2=C)@nx>`;c9DdwZ&zeUc(7t<21D7qBj!|1^Mp1eZ6)PuvHx+poKSDCSBMFF{bKy z;9*&EyKitD99N}%mK8431rvbT+^%|O|HV23{;RhmS{$5tf!bIPoH9RKps`-EtoW5h zo6H_!s)Dl}2gCeGF6>aZtah9iLuGd19^z0*OryPNt{70RvJSM<#Ox9?HxGg04}b^f zrVEPceD%)#0)v5$YDE?f`73bQ6TA6wV;b^x*u2Ofe|S}+q{s5gr&m~4<L!Kst{sot z5KH0dt;&=upf|M07weKb>qGd!wOu|cZ||#h_u<art*duxwj*&{AKvt_C_~Rbj+&9M zkydF-zES=7nwWu)>=k*fB;R6&k?FoM+c&J;ISg70h!J7*xGus)ta4veTdW)S^@sU@ z4$OBS=a~@F*V0ECic;ht4@?Jw<9kpjBgHfr2FDPykCCz|v2)`JxTH55?b3IM={@DU z!^|9nVO-R#s{`VHypWyH0%cs;0GO3E;It6W@0gX6wZ%W|Dzz&O%m17pa19db(er}C zUId1a4#I+O<l=|m7ZxfZst4BS&JikX?HdNANhau=>u8E1MU$g=zo%g7K(=0Pn$)Rk z<4T2u<0rD)*j+tcy2<G9Ivw5qe%5#fv~8!s2fYQ!PCLn0mO&fewcXp9;Ab`>XvY+0 z0d2pqm4)4lDewsAGThQi{2Kc3&C=|OQF!vOd#WB_`4gG3@inh-4>BoL!&#ij8bw7? zqjFRDaQz!J-YGitV4}$*$hg`vv%N)@#UdzHFI2E<&_@0Uw@h_ZHf}7)G;_NUD3@18 zH5;EtugNT0*RXVK*by>WS>jaDDfe!A61Da=VpIK?mcp^W?!1S2oah^w<GqG&Q{GKG zsZrmPGpG`5;Zw5KjP_T(w6*Oc#l;%A<XJKoa;gjzf{rQ<msaCqJm@pc8fC%^aHdwx za;%pk=(M*8?1xrs9O?8~P(Pm^@-SApIj`E()NzqXYNwFt6`={MznUJN%?Q(&I7`j@ zUShz8uo+42K1njt7G_PTc!^uW&zBsg2Q6Hkvq_Ac-_%QcGd|r(JA=3c^ko`1$x6iV zeuEh$OpkHJoFOO;=9K^m4f2__2er<ga^Us%$iDhlGu0Gyf;e4o?^T0h5Mgqa<m(1* zz7Tzd6V3Btto~j{F-a}ip<@6RQ&-IuP<M>owRnrYjl~`lgP-mv$?yb6{{S55CCu{R z$9;`dyf0Y>uM1=X<U>Sl_$01Lc1Iy68IosWN8Q9Op=~I(F<0+_kKfgC*JggjxNgK6 z-3gQm6;sm?J&;bYe&(dx4BEjvq}b`OT^RqF$J4enP1YkeBK#>l1@-K`ajbn05`<Oq zmqj5{969^1c=`CM^D;dPl`V1bO3H_#G}K_47zMZo;VH~XSUf;WZ1OW;I6MlYB}z!$ ziM)W7<C{za(FgW$rM|O>0J?0daOtnzh@l3^=BkedW1EahZlRp;`j*CaT;-21&f2wU z+Nh-gc4I36Cw+;3<L&ul7M-c)rmHy9{KG4CN7|Yi5BPNiq@XCF2M`heJTxqm_-j<) zZv0h3mch@o2qwh*nupqD^@}aY<ug;}r8BckctukkvlZML584k|XHJvXR2{vA6<U@R zGOK6H91N*q)Wp}(%MPb(Yd4uT-&f8gwV(D=^MR0u<D2LG8^3H>UAc<%ySb`#+c@5y ze~en&bYV|kn?Cn|@fqmGxgfz}U!98$=drjAkMi`43I4R%&H0GKEgx-=7PF}y`+j>r zg&JF`jomnu2G{%QV~Gf_-1gx<3Ky=Md9Q3VnK=;;u0lyTBCuf^aUi?+1+`4lLE6ZK zT#(Bf`5rmr(tgTbIt?yA@y`(Ar=f>-aZ}T~>G32EM%XyFvhn&@PWCm#-<&ApLDCXT z<x33$GxGAak;#YXrG}i!b5RQTMf?{_;>D#(9m|V(OOo7PmE@`vD4$S5;+9IQm19dd zvMEU`)E1_F+0o0-z>YCWqg0u8ciIknU#{q02{~YX)gc_u;8;i233D66pf(IkTDxeN zL=4z2)?S$TV9=ORVr&AkZMl<4tTh(v;Ix1{`pPVqI3n2ci&4Dg+W|N8TBUfZ*WeLF zqCH_1Q0W&<NGK!A^MDXcf{IX8(y4apmdd$^)KF8&_-`QJW>f9T$lx3CFJ$o@Lz$99 zW!G&@zFHxTaP!o#z^~xgF|(vrHz8R_r9eo;TX9}2ZyjslrtH=%6O)?1?cL&BT(Amp zTGFU1%%#xl&6sH-UIJk_PGk_McFn7=%yd6tAjm|lnmr8bE2le3I~L{0(ffo}TQjyo zHZZI{-}{E4ohYTlZaS$blB!h$Jq^Rf#(ch}@S+Ww&$b);8+>g84IJcLU%B-W?+IY& zslcZIR>+U4v3O9RFEW;8NpCM0w1ROG84=WpKxQ^R`{=0MZCubg3s<Etz&NY5gvG$o zt!yR2s+eA9B|xgrHuO<dDs_6qmbK**o8#w0$rg#6N2V3+@h}vZqT~<9AqzG~0(P}r zmXo1RiMgVr)#~eH6ebDnM|qh^Q`sc-mnRmD`WlG2Ikp0I-Ox5n26$IlnwP}x{0W>t z48AyJNEvyxn-jCPTlTwp4EKvyEwD3e%kpdY?^BH0!3n6Eb57_L%J1=a*3>|k68A}v zaW`*4YitylfD}ua8V)vb79)N_Ixw_mpp}yJGbNu+5YYOP9K-7nf*jA1#<^rb4#AcS zKg%zCI)7cotx}L&J8Bqo8O1b0q;B1J#B5N5Z$Zq=wX~nQFgUfAE{@u0+EnmK{1hg> zC{vMfFLD;L8b4L+B51&LCm|scVLPe6h02rws@kGv@R+#IqE8>Xn8i|vRq_Z`V;x6F zNeot$1Zsu`lLS92QlLWF54za6vOEKGYQMdX($0JN*cjG7HP&qZ#3+bEN$8O_PfeAb z0R5;=zXac2IZ?fxu59?Nka;1lKm|;0)6|#RxkD05P5qz;*AL@ig!+f=lW5^Jbag%2 z%9@iM0ph$WFlxS!`p31t92z~TB}P-*CS+1Oo_g;7`6k(Jyj8m8U|Q3Sh7o-Icp4kV zK}%qri5>?%IPfamXIZ8pXbm-#{ytiam<{a5A+3dVP^xz!Pvirsq7Btv?*d7eYgx7q zWFxrzb3-%^lDgMc=Vl7^={=VDEKabTG?VWqOngE`Kt7hs236QKidsoeeUQ<dJdpn~ z8ugX}n?|k0G&ZNsQXiIdub6%BbDrFoQP{UHgSJr?H1haK6mY(Yh7KKv?iO`4vz^#t zxo0DGapnn_ZyGm|->_^FzsXjprCDd@pW25rNx#6x&L6ZEpoX9Ffzv@olnH3rGOSW( zG-D|cV0Q~qJ>-L}NIyT?T-+x+wU%;+_GY{>t(l9dI%Ximm+Kmwhee;FK$%{dnF;C% zFjM2&$W68Sz#d*wtfX?*WIOXwT;P6NUw}IHdk|)fw*YnGa0rHx#paG!m=Y6GkS4VX zX`T$4eW9k1W!=q8!(#8A9h67fw))k_G)Q9~Q1e3f`aV@kbcSv7!priDUN}gX(iXTy zr$|kU0Vn%*ylmyDCO&G0Z3g>%JeEPFAW!5*H2Ydl>39w3W+gEUjL&vrRs(xGP{(ze zy7EMWF14@Qh>X>st8_029||TP0>7SG9on_xxeR2Iam3G~Em$}aGsNt$iES9zFa<3W zxtOF*!G@=PhfHO<!$-(3o&U_UkqyK40n=6Vlx|zXzLEF_{kGb3A?Bg4s<?A8=0T~? zO=7Dsw!Ft7XCkIj^h-?lS0!wDbCClJ$pTlqYJJ-6S4tKPD||BXU`XGAJbWXRLvm)V zf)*66PqtX-R?cdA?IdZmRnc`+F~d;OH&Tq8uTfmSYG72eTO=Uss91Xs!~`obeW_$1 zh&9cdKR%|6GCoh+jx11S$4qnWiXaNR35MtDg(^dtMQwVOJ-Lk$#EBnm{#8l|?g5yC zn5>!=9pVPXMUVi30WmkPoy$02w}&6A7mF)G6-<G0>`~EVq5CwD2`9Zu`kd)52``#V zNSb`9dG~8(dooi1*-aSMf!fun7Sc`-C$-E(3BoSC$2kKrVcI!&yC*+ff2+C-@!AT_ zsvlAIV+%bRDfd{R*TMF><1&_a%@yZ0G0lg2K;F>7b+7A6pv3-S7qWIgx+Z?dt8}|S z>Qbb6x(+^aoV7FQ!Ph8|RUA6vX<EwOZP?_l8E>WQH*1$GJC+wXLXizNIc9p2yLzw9 z0=MdQ!{NnOwIICJc8!+Jp!zG}**r#E!<}&Te&}|B4q;U57$+pQI^}{qj669zMMe_I z&z0uUCqG%YwtUc8HVN7?0GHpu=bL7&{C>hcd5d(iFV{I5c~jpX&!(a{yS*4MEoYXh z*X4|Y@RVfn;piRm-C%b@{0R;<vec$F=k8NwAb#fTD<{6|sRCl8En=5xM-0JZd-!rE zs8JFw4w^fq(Co60(caS?->aXrjBtvx^HO;6(>i*RnoG0Rtcd25BT6edxTNOgUAOjn zJ2)l{ipj8IP$KID2}*#F=M%^n&=bA0tY<hfH<LW9Lo;6?J5TRypd=4|!3w{=vW6;g zfMUqyTlucEN|n*{H6D!}R83xo!DD>98@+2I+7~A&T-tw%W#3GV>GTmkHaqftl)#+E zMU*P(Rjo>8%P@_@#UNq(_L{}j(&-@1iY0TRizhiATJrnvwSH0v>lYfCI2ex^><3$q znzZgpW0JlQx?JB#0^^s-Js1}}wKh6f>(e%NrMwS`Q(FhazkZb|uyB@d%_9)_xb$6T zS*#-Bn)9gmobhAtvBmL+9H-+0_0US?g6^TOvE8f3v=z3o%NcPjOaf{5EMRnn(_z8- z$|m<k1+Y2M80uitGacvNl9R2EG12kWV0*95H-KkW?UVAYdtp6iv(`p<v|~>0D$FTU zDy;21v-#0i)9%_bZ7eo6B9@Q@&XprR&oKl4m>zIj-fi<A_ml^c*yyE~9KBeV?m&C{ z?zC$KvvQZ{0k<TvO$pP1byryt+m|`yvw<0(cY4VrGVL^;IHYW?KvVF8&gSy)h4$0M z?pQwA7YCHlk$luMaQh|UoJJ+izzn@@h#*~PJ@IegUzf;B4Z#&O$b;oRANjHDWA!n1 z^0^6(LV~RIUb^czO|XQZf$dD@R92b7GQ7*v1+HC0JUUK#)to%s$(LaZOA<rBPjC_H z&swsIbNNpHEd(`5r)GK%@jitrQ;3_BcW_MzVsDr-lsR9A8%>Ry4Dqy@VVVs?rscG| zmzaDQ%>AQTi<^vYCmv#KOTd@l7#2VIpsj?nm_WfRZzJako`^uU%Nt3e;cU*y*|$7W zLm%fX#i_*HoUXu!NI$ey>BA<5HQB=|nRAwK!$L#n-Qz;~`zACig0PhAq#^5QS<8L2 zS3A+8%vbVMa7LOtTEM?55apt(DcWh#L}R^P2AY*c8B}Cx=6OFAdMPj1f>k3#^#+Hk z6uW1WJW&RlBRh*1DLb7mJ+KO>!t^t8hX1#_Wk`gjDio9)9IGbyCAGI4DJ~orK+YRv znjxRMtshZQHc$#Y-<-JOV6g^Cr@odj&Xw5B(FmI)*qJ9NHmIz_r{t)TxyB`L-%q5l ztzHgD;S6cw?7Atg*6E1!c6*gPRCb%t7D%z<(xm+K{%EJNiI2N0l8ud0Ch@_av_RW? zIr!nO4dL5466WslE6MsfMss7<)-S!e)2@r2o=7_W)OO`~CwklRWzHTfpB)_HYwg<t zz{HB>z=BzLhgZ9S<{nLBOwOIgJU=94uj6r!m>Xyn9>&xP+=5!zG_*yEoRgM0`aYts z^)&8(>z5C-QQ*o_s(8E4*?AX#S^0)aqB)OTyX>4BMy8h(cHjA8ji1PRlox@jB*1n? zDIfyDjzeg91Ao(;Q;KE@zei$}>EnrF6I}q&Xd=~&$WdDsyH0H7fJX|E+O~%LS*7^Q zYzZ4`pBdY{b7u72gZm6^5~O-57HwzwAz{)NvVaowo`X02tL3PpgLjwA`^i9F^vSpN zAqH3mRjG8VeJNHZ(1{%!XqC+)Z%D}58Qel{_weSEHoy<sQiA0B_Gqb=CByVMyX%!w z4Eje5Bt-T0q$B3%(R6oxFvh1CN<`TxM65`>gT<GyFDwf<^GY6Vfrl5#gR3&m)nrt) zCWR3-*#eZPX3RXX`pjGOfi3o17!KQK8dwfP^~8MI@{GlTZ?WiL#7ES_s$*l2K2Z}H zas@Kh)G&#NThp?T8I`3G;i;?O${)4keDi<B5`os2ipc!lEq_U9t1+4j6&f+i3E1Qt zV(COdPse*sjcYv9z&+bej1ic_Zq~W{eH1#pFTwi$HEL#iDucQfEGnaMi)KRHfim?X z6PkMl?xaac7nJR0Ns&WP-SdXEOTpQyN=*w7lw%g(K13?>9pN@i<m@Psd5jg42?4iP z1TJCbd#Y_)triFdU(An6c0*yy6t5RbQdYS-sCDoqS+j+^Kq%-VNX#0B3ajQlsOh;> zi=G;!Vj6XQk2tuJC>lza%ywz|`f7TIz*EN2Gdt!s199Dr4Tfd_%~fu8gXo~|ogt5Q zlEy_CXEe^BgsYM^o@L?s33WM14}7^T(kqohOX_iN@U?u;$l|rAvn{rwy>!yfZw13U zB@X9)qt&4;(C6dP?yRsoTMI!j-f1KC!<%~i1}u7yLXYn)(#a;Z6~r>hp~kfP));mi zcG%kdaB9H)z9M=H!f>kM->fTjRVOELNwh1amgKQT=I8J66kI)u_?0@$$~5f`u%;zl zC?pkr^p2Fe=J~WK%4ItSzKA+<GP*jGNYka`Iu;bBcRXMzDVt^~dFbWv7OyePceS}f z-0Rr6B-P~VbM+kR0+dK+p>QHqJ@~m|Cduv=Q&-P8I5rQ-#G@bYH}<jhJxi*3)1Jx` z)AAx_CCf(b?oSg9xO-v~d&OUM2BAEz9qyGod)3A7h^QvW_MGq?LHCy~ZEPKLo>YJr zUS(~(w|vKyU(T(*py}jTUp%I<o#}x3P!`rEap=Wdb060(Y75-D1W6-~{J!!Ed<3tq zwp&hUHFog~v-Jls<xc8HK1Uq!smqAM<}r!S9d^J@R;5>%{2!W!K(i$uvotcPjVddW z8_5HKY!oBCwGZcs-q`4Yt`Zk~>K?mcxg51wkZlX5e#B08I75F7#dgn5yf&Hrp`*%$ zQ;_Qg>TYRzBe$x=T(@WI9SC!ReSas9vDm(yslQjBJZde5z8GDU``r|N(MHcxNopGr z_}u39W_zwWDL*XYYt>#Xo!9kL#97|EAGyGBcRXtLTd59x%m=3<KX%+}BsUGy9@h>i zL^9joWYA)HfL15l9%H?q`$mY27!<9$7GH(kxb%MV>`}hR4a?+*LH6aR{dzrX@?6X4 z3e`9L;cjqYb`cJmophbm(OX0b)!AFG?5`c#zLagzM<qLWA@@_TdWUT#E|2fIBK4QC zX>W~o)?-!@e80lvk!p#&CD8u5_r&wp4O0zQ>y!k5U$h_K;rWGk=U)zX!#@Q%|9g*A zWx)qS1?fq6X<$mQTB$#3g;;5tHOYuAh;YKSBz%il3Ui6fPRv#v62SsrCdMRTav)Sg zTq1WOu&@v$Ey;@^+_!)cf|w_X<@RC>!=~+A1-65O0bOFYiH-)abINwZvFB;hJjL_$ z(9iScmUdMp2O$WW!520Hd0Q^Yj?DK%YgJD^ez$Z^?@9@Ab-=KgW@n8nC&88)TDC+E zlJM)L3r+ZJfZW_T$;Imq*#2<(j+FIk8ls7)WJ6CjUu#r5PoXxQs4b)mZza<<Vrg%t z(8`S(Rc|dIPl3K8yS7-~cO9uc>8=v{o)VlLRM<9yw^0En#tXAj`Sylxvki{<1DPe^ zhjHwx^;c8tb?Vr$6ZB;$Ff$+3(*oinbwpN-#F)bTsXq@Sm?43MC#jQ~`F|twI=7oC zH4TJtu#;ngRA|Y~w5N=UfMZi?s0%ZmKUFTAye&6Y*y-%c1oD3yQ%IF2q2385Zl+=> zfz=o`Bedy|U;oxbyb^rB9ixG{Gb-{h$U0hVe`J;{ql!s_OJ_>>eoQn(G6h7+b^P48 zG<=Wg2;xGD-+d@UMZ!c;0>#3nws$9kIDkK13IfloGT@s14AY>&>>^#>`PT7GV$2Hp zN<{bN*ztlZu_%W=&3+=#3bE(mka6VoHEs~0BjZ$+=0`a@R$iaW)6>wp2w)=v2@|2d z%?34!+iOc5S@;AAC4hELWLH56RGxo4jw8MDMU0Wk2k_G}=Vo(>eRFo(g3@HjG|`H3 zm8b*dK=moM*oB<)*A$M9!!5o~4U``e)wxavm@O_R(`P|u%9^LGi(_%IF<6o;NLp*0 zKsfZ0#24GT8(G`i4UvoMh$^;kOhl?`0yNiyrC#HJH=tqOH^T_d<Sn^_)gv)I><2Z+ zeN>Y9Zn!X4*DMCK^o75Zk2621bdmV7Rx@AX^alBG4%~;G_vUoxhfhFRlR&+3WwF^T zaL)8xPq|wCZoNT^>3J0K?e{J-kl+hu2rZI>CUv#-z&u@`hjeb+bBZ>bcciQVZ{SbW zez04s9oFEgc8Z+Kp{XFX`MVf-s&w9*dx7wLen(_@y34}Qz@&`$2+osqfxz4&d}{Ql z*g1ag00Gu+$C`0avds{Q65BfGsu9`_`dML*rX~hyWIe$T>CsPRoLIr%MTk3pJ^2<X zSh&)U43JF%=<Yj{veBb(Ckb8gdgCpYh}%kpZZYDF{AgLe$}UrMaOOvu)YU9;n?BkT zNxs(4`%n);ebfU@MeFR!NNvHzh>zH1qub1MBzPG}PO;Wmav9w%F7?%l=xIf#LlP`! z_Nw;xBQY9anH5-c8A4mME}?{iewjz(Sq-29r{fV;Fc>fv%0!W@(+{={Xl-sJ6aMoc z)9Q+$bchoTGTyWU_oI19!)bD=IG&OImfy;VxNXoIO2hYEfO~MkE#IXTK(~?Z&!ae! zl8z{D&2PC$Q*OBC(rS~-*-GHNJ6AC$@eve>LB@Iq;jbBZj`wk4|LGogE||Ie=M5g= z9d`uYQ1^Sr_q2wmZE>w2WG)!F%^KiqyaD<N`p2N#PIS`Mf%==Eao;Uu2_^UDs-(J< zG74hi&Q&b4n<JGE>tIAct?}D~JP4shTJy5Bg+-(EA8aXaxbd~BKMtTf2iQ69jD1o* zZF9*S3!v-TdqwK$%&?91Sh2=e63;X0Lci@n7y3XOu2ofyL9^-I767eHESAq{m+@*r zbVDx!FQ|AjT;!bYsXv8ilQjy~Chiu&HNhFXt3R_6kMC8~ChEFqG@MWu#1Q1#=~#ix zrkHpJre_?#r=N0wv`-7cHHqU`phJX2M_^{H0~{VP79Dv{6YP)oA1&TSfKPEPZn2)G z9o{U1huZBLL;Tp_0OYw@+9z(jkrwIGd<rJ;;|g97;QyKudFl=p>UrOhKJUbwy?WBt zlIK)*K0lQCY0qZ!$%1?3A#-S70F#YyUnmJF*`xx?aH5;gE5pe-15w)EB#nuf6B*c~ z8Z25NtY%6Wlb)bUA$w%HKs5$!Z*W?YKV-lE0@w^{4vw;J>=rn?u!rv$&eM+rpU<lK zDSaRV>6rc=j9>N2Op+C{D^mospMCjF2ZGhe4eADA#skp2EA26%p3Ex9wHW8l&Y@HX z$Qv)<C51V>mHM}4*@M*#*ll5^hE9M^=q~eyWEai*P;4z<9ZYy!SlNE5nlc7gm;M&Q zKhKE4d*%A>^m0R?{N}y|i6i^k>^n4(wzKvlQeHq{l&JuFD~sTsdhs`(?lFK@Q{pU~ zb!M3c@*3IwN1RUOVjY5>uT+s-2QLW<CJ6(zZl(Y=4_QOGX*=xBx0IU{bjOr8d3j>Y z4T2>fiSn>>Fob+%B868-v9D@AfWr#M8eM6w#eAlhc#zk6jkLxGBGk`E3$!A@*am!R zy>29&ptYK6>cvP`b!syNp)Q$0UOW|-O@)8!?94GOYF_}+zlW%fCEl|Tep_zx05g6q z>tp47e-&R*hSNe{6{H!mL?+j$c^TXT{C&@T-<poA8}E*C#VxAw^S6u#n%mQpO;WFU zvLaxQPs)-49m4`q`S=1vU=9~A0zKn1+mPA-d!D#}Ga{6K-?jPMxc<i>xIaesNCl05 z9SLb@q&mSb)I{VXMaiWa3PWj=Ed!>*GwUe;^|uk=Pz$njNnfFY^MM>E?zqhf6^{}0 zx&~~dA5#}1ig~7HvOQ#;d9JZBeEQ+}<CQKP1(~6&tehmCAOE|1+U&fYps;i?%7U2p zS$$NL#C96qXCIm<KHY5B6l`{cfkDE1j9A*K@D<ezU#F~o4Jc6wIHIE1FM;gV*B;)0 zG;Z-u_NyJF6sUBMs*2d5FC-N2g4b5#W7L^fgw?1&N?2BbL-v_8w{+M;T4E-PtC(jp zwx$;ua6pZ4<M2z^rf4wO59&T7p0g;L(4p_&xl(GK)K%7!w_@bd(@>-~v$at`m!(ai z$w(H&mWCC~;PQ1$%iuz3`>dWeb3_p}X>L2LK%2l59Tyc}4m0>9A!8rhoU3m>i2+hl zx?*qs*c^j}+WPs>&v1%1Ko8_ivAGIn@QK7A`hDz-Emkcgv2@wTbYhkiwX2l=xz*XG zaiNg+j4F-I>9v+LjosI-QECrtKj<k3_!Y>p&0T@xIMKVr+&)gyb4@b3y?2CA?=ooN zT#;r<xDf1CATz!G(dQOqWZ;oJ_aQiWEGp<Ugklw>U86WLh(e@#mF*rk(NV-qSIZyr z$6!ZUmzD)%yO-ot`rw3rp6?*_l*@Z*IB0xn4|BGPWHNc-1ZUnNSMWmDh=EzWJRP`) z<NV4A@-;kC0%10Sy6M-PAN9ZN;dIx>l%d%J613oXzh5;VY^XWJi{lB`f#u+ThvtP7 zq(HK<4>tw(=yzSBWtYO}XI`S1pMBe3!jFxBHIuwJ(@%zdQFi1Q_hU2eDuHqXte7Ki zOV55H2D6u#4oTfr7|u*3p75K<e&o873&m~>F&jaLEDpxk!4*bhPc%mpfj)Us3XIG3 zIKMX^s^1wt8YK7Ky^UOG=w!o5e7W-<&c|fw2{;Q11vm@J{)@N3-p1U>!0~sKWHaL= zWV(0}1IIyt1p%=_-Fe5Kfzc71wg}`RDDntVZv;4!=&XXF-$48jS0Sc;eDy@Sg;+{A zFStc{dXT}kcIjMXb4F7MbX~2%i;UrBxm%qmLKb|2=?uPr00-$MEUIGR5+JG2l2Nq` zkM{{1RO_R)+8oQ6x&-^kCj)W8Z}TJjS*Wm4>hf+4#VJP)OBaDF%3pms7DclusBUw} z{ND#!*I6h85g6DzNvdAmnwWY{&+!KZM4DGzeHI?MR@+~|su0{y-5-nICz_MIT_#FE zm<5f3zlaKq!XyvY3H`9s&T};z!cK}G%;~!rpzk9-6L}4Rg7vXtKFsl}@sT#U#7)x- z7UWue5sa$R>N&b{J61&gvKcKlozH*;OjoDR+elkh|4bJ!_3AZNMOu?n9&|L>OTD78 z^i->ah_Mqc|Ev)KNDzfu1P3grBIM#%`QZqj5W{qu(HocQhjyS;UINoP`{J+DvV?|1 z_sw6Yr3z6%e7JKVDY<$P=M)dbk@~Yw9|2!Cw!io3%j92wTD!c^e9Vj+7VqXo3>u#= zv#M{HHJ=e$X5vQ>><L7PK}M0Mkv;HE!=8>ML?E8#UlmvJgTnb73{PSPTf*0)mcj6C z{KsfUbDK|F$E(k;ER%8HMdDi`=BfpZzP3cl5yJHu;v^o2FkHNk;cXc17tL8T!CsYI zfeZ6sw@;8ia|mY_AXjCS?kUfxdjDB28)~Tz1dGE|{VfBS9`0m2!m<b+8mQK3%NGoh zaOY+g1^h6C*Gw2j`j9qWgH0kild})ej>1yG?hR})er^pl4c@9Aq+|}ZlDaHL)K$O| z%9Jp-imI-Id0|(d5{v~w6mx)tUKfbuVD`xNt04Mry%M+jXzE>4(TBsx#&=@wT2Vh) z1yeEY&~17>0%P(eHP0HB^|7C+WJxQBTG$uyOWY@iDloRIb-Cf!p<{WQHR!422#F34 zG`v|#CJ^G}y9U*7jgTlD{D&y$Iv{6&PYG>{Ixg$pGk?lWrE#PJ8KunQC@}^6OP!|< zS;}p3to{S|uZz%kKe|;A0bL0XxPB&Q{<jo5;Kc4f%b@SP6h8+C2M0XP2e_UKD&SV% z$;{G_%HGJp$jsL9&w}a_RODkLfKcI4DRHVArb&i30QE00@B{9IZ-5jvK!7zd;Qy~) zBLV?x_a|t8<^8JwB*9)3DIrBZDlutcnwO7}O7-3TJbR=FxPJcB=kimh^#2}{;*%B= z7E(~8mJ)u6@biiP5ChJ~{i&n@?rrQ%{>J(9PyX`+Kr`k~r2}yP^ND{8!v7Q1&vtk& z2Y}l@J@{|2`oA%sxvM9i0V+8IXrZ4;tey)d;LZI70Kbim<4=WoTPZy=Yd|34v#$Kh zx|#YJ8s`J>W&jt#GcMpx84w2Z3ur-rK7gf-p5cE)=w1R2*|0mj12hvapuUWM0b~dG zMg9p8FmAZI@i{q~0@QuY44&mMUNXd7z>U58shA3o`p5eVLpq>+{(<3->DWuSFVZwC zxd50Uz(w~LxC4}bgag#q#NNokK@yNc+Q|Ap!u>Ddy+df>v;j@I12CDNN9do+0^n8p zMQs7X#+FVF0C5muGfN{r0|Nkql%BQT|K(DDNdR2pzM=_ea5+GO|J67`05AV92t@4l z0Qno0078PIHdaQGHZ~Scw!dzgqjK~3B7kf>BcP__&lLyU(cu3B^uLo%{j|Mb<L(`+ zI+OxXmH-z3=uZU;@C$xXWwHNQ-LLU7%TRB>0NR)tkeT7Hcwp4O#<O;C)U&kwZ#J9> z)yzu>cvG(d9~0a^)eZ;<gXy2}eqFmlH`*3uKnDQ<)($^E$Irz}^p|LoHYWeIw_j#C ze+Gk<_$AnH<vf3BQ!g`UKeM1q{co0EH^a+JqtBSafUo#3I{oF;<1cwfU)K0#p1)^w zVzpnQ|Jz7^k@fE-^vg7B&(N<m{|Wl9N!MPYzRXwhjQY;#|Ay>;%3ksk@F&1eEBje~ zW+-_s)&RgiweQc!otF>4%vbXKaOU41{!hw?|2`Ld3I8$&#WOsq>EG)1ANb!{N4z9@ zsU!bPG-~-bqCeIDzo^Q;gnucB{tRzm{ZH^Orphm2U+REA!*<*J6YQV83@<TXipoA? z4mtf3<{vQt|Lx28Qoi*WwZZu}Q2)D_>&xoDl%#wnl5qcBqCcAF-vX5{30}(oJrnSH z{RY85hylK2dMOh2%oO1J8%)0?8TOL%rS8)+CsDv}aQ>4D)Jv+DLK)9gI^n-T^$)Tc zFPUD75<D|$Mg0cTALhXKONoM)R4-$}pQ+?xf13*MeX;$suG>qJm!Y-KBqj;JP4dV4 z`X{lGmn<)1IG<SzlYX1!&k>z330}s}Jrjtf{(lnuuNHe5(ezA(pYa=1|Ff-LhPFK8 zyJh_b{yzu0yll6ZkpRzRjezyYivjyjW7QwO;@6X`m;2Apn2EK2!~7S}-*=;5*7K$B z`x(=!^?zgj(-`&ApZJXI09aDLXaT@<;CH=?fBOY5d|b~wBA@@p^K#nxr<VU8!}v?T z%QFpn*Z)oF{+k!(KXv|(&*jfflb=49=VAc>`)?i?SqTupI_PJ(A3cx`z~9mX_*)>L F{|7XC?P&l2 diff --git a/android/gradle/wrapper/gradle-wrapper.properties b/android/gradle/wrapper/gradle-wrapper.properties deleted file mode 100644 index 7b61d1ea9..000000000 --- a/android/gradle/wrapper/gradle-wrapper.properties +++ /dev/null @@ -1,6 +0,0 @@ -#Sun Jun 06 12:33:06 AEST 2021 -distributionBase=GRADLE_USER_HOME -distributionPath=wrapper/dists -zipStoreBase=GRADLE_USER_HOME -zipStorePath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-7.0.2-all.zip diff --git a/android/gradlew b/android/gradlew deleted file mode 100755 index cccdd3d51..000000000 --- a/android/gradlew +++ /dev/null @@ -1,172 +0,0 @@ -#!/usr/bin/env sh - -############################################################################## -## -## Gradle start up script for UN*X -## -############################################################################## - -# Attempt to set APP_HOME -# Resolve links: $0 may be a link -PRG="$0" -# Need this for relative symlinks. -while [ -h "$PRG" ] ; do - ls=`ls -ld "$PRG"` - link=`expr "$ls" : '.*-> \(.*\)$'` - if expr "$link" : '/.*' > /dev/null; then - PRG="$link" - else - PRG=`dirname "$PRG"`"/$link" - fi -done -SAVED="`pwd`" -cd "`dirname \"$PRG\"`/" >/dev/null -APP_HOME="`pwd -P`" -cd "$SAVED" >/dev/null - -APP_NAME="Gradle" -APP_BASE_NAME=`basename "$0"` - -# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. -DEFAULT_JVM_OPTS="" - -# Use the maximum available, or set MAX_FD != -1 to use that value. -MAX_FD="maximum" - -warn () { - echo "$*" -} - -die () { - echo - echo "$*" - echo - exit 1 -} - -# OS specific support (must be 'true' or 'false'). -cygwin=false -msys=false -darwin=false -nonstop=false -case "`uname`" in - CYGWIN* ) - cygwin=true - ;; - Darwin* ) - darwin=true - ;; - MINGW* ) - msys=true - ;; - NONSTOP* ) - nonstop=true - ;; -esac - -CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar - -# Determine the Java command to use to start the JVM. -if [ -n "$JAVA_HOME" ] ; then - if [ -x "$JAVA_HOME/jre/sh/java" ] ; then - # IBM's JDK on AIX uses strange locations for the executables - JAVACMD="$JAVA_HOME/jre/sh/java" - else - JAVACMD="$JAVA_HOME/bin/java" - fi - if [ ! -x "$JAVACMD" ] ; then - die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME - -Please set the JAVA_HOME variable in your environment to match the -location of your Java installation." - fi -else - JAVACMD="java" - which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. - -Please set the JAVA_HOME variable in your environment to match the -location of your Java installation." -fi - -# Increase the maximum file descriptors if we can. -if [ "$cygwin" = "false" -a "$darwin" = "false" -a "$nonstop" = "false" ] ; then - MAX_FD_LIMIT=`ulimit -H -n` - if [ $? -eq 0 ] ; then - if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then - MAX_FD="$MAX_FD_LIMIT" - fi - ulimit -n $MAX_FD - if [ $? -ne 0 ] ; then - warn "Could not set maximum file descriptor limit: $MAX_FD" - fi - else - warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT" - fi -fi - -# For Darwin, add options to specify how the application appears in the dock -if $darwin; then - GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\"" -fi - -# For Cygwin, switch paths to Windows format before running java -if $cygwin ; then - APP_HOME=`cygpath --path --mixed "$APP_HOME"` - CLASSPATH=`cygpath --path --mixed "$CLASSPATH"` - JAVACMD=`cygpath --unix "$JAVACMD"` - - # We build the pattern for arguments to be converted via cygpath - ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null` - SEP="" - for dir in $ROOTDIRSRAW ; do - ROOTDIRS="$ROOTDIRS$SEP$dir" - SEP="|" - done - OURCYGPATTERN="(^($ROOTDIRS))" - # Add a user-defined pattern to the cygpath arguments - if [ "$GRADLE_CYGPATTERN" != "" ] ; then - OURCYGPATTERN="$OURCYGPATTERN|($GRADLE_CYGPATTERN)" - fi - # Now convert the arguments - kludge to limit ourselves to /bin/sh - i=0 - for arg in "$@" ; do - CHECK=`echo "$arg"|egrep -c "$OURCYGPATTERN" -` - CHECK2=`echo "$arg"|egrep -c "^-"` ### Determine if an option - - if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then ### Added a condition - eval `echo args$i`=`cygpath --path --ignore --mixed "$arg"` - else - eval `echo args$i`="\"$arg\"" - fi - i=$((i+1)) - done - case $i in - (0) set -- ;; - (1) set -- "$args0" ;; - (2) set -- "$args0" "$args1" ;; - (3) set -- "$args0" "$args1" "$args2" ;; - (4) set -- "$args0" "$args1" "$args2" "$args3" ;; - (5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;; - (6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;; - (7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;; - (8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;; - (9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;; - esac -fi - -# Escape application args -save () { - for i do printf %s\\n "$i" | sed "s/'/'\\\\''/g;1s/^/'/;\$s/\$/' \\\\/" ; done - echo " " -} -APP_ARGS=$(save "$@") - -# Collect all arguments for the java command, following the shell quoting and substitution rules -eval set -- $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS "\"-Dorg.gradle.appname=$APP_BASE_NAME\"" -classpath "\"$CLASSPATH\"" org.gradle.wrapper.GradleWrapperMain "$APP_ARGS" - -# by default we should be in the correct project dir, but when run from Finder on Mac, the cwd is wrong -if [ "$(uname)" = "Darwin" ] && [ "$HOME" = "$PWD" ]; then - cd "$(dirname "$0")" -fi - -exec "$JAVACMD" "$@" diff --git a/android/gradlew.bat b/android/gradlew.bat deleted file mode 100644 index e95643d6a..000000000 --- a/android/gradlew.bat +++ /dev/null @@ -1,84 +0,0 @@ -@if "%DEBUG%" == "" @echo off -@rem ########################################################################## -@rem -@rem Gradle startup script for Windows -@rem -@rem ########################################################################## - -@rem Set local scope for the variables with windows NT shell -if "%OS%"=="Windows_NT" setlocal - -set DIRNAME=%~dp0 -if "%DIRNAME%" == "" set DIRNAME=. -set APP_BASE_NAME=%~n0 -set APP_HOME=%DIRNAME% - -@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. -set DEFAULT_JVM_OPTS= - -@rem Find java.exe -if defined JAVA_HOME goto findJavaFromJavaHome - -set JAVA_EXE=java.exe -%JAVA_EXE% -version >NUL 2>&1 -if "%ERRORLEVEL%" == "0" goto init - -echo. -echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. -echo. -echo Please set the JAVA_HOME variable in your environment to match the -echo location of your Java installation. - -goto fail - -:findJavaFromJavaHome -set JAVA_HOME=%JAVA_HOME:"=% -set JAVA_EXE=%JAVA_HOME%/bin/java.exe - -if exist "%JAVA_EXE%" goto init - -echo. -echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% -echo. -echo Please set the JAVA_HOME variable in your environment to match the -echo location of your Java installation. - -goto fail - -:init -@rem Get command-line arguments, handling Windows variants - -if not "%OS%" == "Windows_NT" goto win9xME_args - -:win9xME_args -@rem Slurp the command line arguments. -set CMD_LINE_ARGS= -set _SKIP=2 - -:win9xME_args_slurp -if "x%~1" == "x" goto execute - -set CMD_LINE_ARGS=%* - -:execute -@rem Setup the command line - -set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar - -@rem Execute Gradle -"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %CMD_LINE_ARGS% - -:end -@rem End local scope for the variables with windows NT shell -if "%ERRORLEVEL%"=="0" goto mainEnd - -:fail -rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of -rem the _cmd.exe /c_ return code! -if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1 -exit /b 1 - -:mainEnd -if "%OS%"=="Windows_NT" endlocal - -:omega diff --git a/android/settings.gradle b/android/settings.gradle deleted file mode 100644 index 7f5ee4013..000000000 --- a/android/settings.gradle +++ /dev/null @@ -1,2 +0,0 @@ -include ':app' -rootProject.name='DuckStation'