From 30a1221067849ea9891d4409ee316f4cfbe2f2c8 Mon Sep 17 00:00:00 2001 From: SSimco <37044560+SSimco@users.noreply.github.com> Date: Sat, 27 Jul 2024 18:15:40 +0300 Subject: [PATCH] Refactor code --- src/android/app/src/main/AndroidManifest.xml | 8 +- .../src/main/cpp/AndroidFilesystemCallbacks.h | 2 +- .../java/info/cemu/Cemu/CemuApplication.java | 3 + .../java/info/cemu/Cemu/CemuPreferences.java | 6 - .../java/info/cemu/Cemu/NativeLibrary.java | 336 +++++++----------- .../{ => emulation}/EmulationActivity.java | 18 +- .../{ => emulation}/EmulationFragment.java | 22 +- .../info/cemu/Cemu/{ => gameview}/Game.java | 2 +- .../cemu/Cemu/{ => gameview}/GameAdapter.java | 4 +- .../Cemu/{ => gameview}/GamesFragment.java | 19 +- .../BaseSelectionAdapter.java | 7 +- .../BaseSingleSelectionRecyclerViewItem.java | 4 +- .../ButtonRecyclerViewItem.java | 4 +- .../CheckboxRecyclerViewItem.java | 4 +- .../GenericRecyclerViewAdapter.java | 3 +- .../HeaderRecyclerViewItem.java | 4 +- .../RecyclerViewItem.java | 2 +- .../SelectionAdapter.java | 11 +- .../SimpleButtonRecyclerViewItem.java | 4 +- .../SingleSelectionRecyclerViewItem.java | 4 +- .../SliderRecyclerViewItem.java | 4 +- .../StringSelectionAdapter.java | 5 +- .../cemu/Cemu/{ => input}/InputManager.java | 6 +- .../cemu/Cemu/{ => inputoverlay}/Button.java | 2 +- .../ButtonStateChangeListener.java | 2 +- .../Cemu/{ => inputoverlay}/DPadInput.java | 2 +- .../cemu/Cemu/{ => inputoverlay}/Input.java | 2 +- .../InputOverlayConfigureActivity.java | 9 +- .../InputOverlaySettingsFragment.java | 15 +- .../InputOverlaySettingsProvider.java | 9 +- .../InputOverlaySurfaceView.java | 16 +- .../Cemu/{ => inputoverlay}/Joystick.java | 2 +- .../{ => inputoverlay}/RectangleButton.java | 2 +- .../Cemu/{ => inputoverlay}/RoundButton.java | 2 +- .../Cemu/{ => settings}/OptionsFragment.java | 27 +- .../Cemu/{ => settings}/SettingsActivity.java | 6 +- .../cemu/Cemu/settings/SettingsManager.java | 22 ++ .../audio}/AudioSettingsFragment.java | 29 +- .../GraphicPackItemRecyclerViewItem.java | 5 +- .../GraphicPackRecyclerViewItem.java | 8 +- .../graphicpacks}/GraphicPacksFragment.java | 7 +- .../GraphicPacksRecyclerViewAdapter.java | 5 +- .../GraphicPacksRootFragment.java | 7 +- .../graphics}/GraphicsSettingsFragment.java | 23 +- .../input}/ControllerInputsDataProvider.java | 15 +- .../input}/ControllerInputsFragment.java | 10 +- .../ControllerTypeResourceNameMapper.java | 18 + .../input}/EmulatedControllerTypeAdapter.java | 7 +- .../input}/InputRecyclerViewItem.java | 5 +- .../input}/InputSettingsFragment.java | 9 +- .../{ => settings/input}/MotionDialog.java | 2 +- .../overlay}/OverlaySettingsFragment.java | 35 +- .../info/cemu/Cemu/{ => utils}/FileUtil.java | 4 +- .../{ => utils}/ProgressResponseBody.java | 2 +- .../info/cemu/Cemu/{ => utils}/ZipUtil.java | 2 +- .../main/res/layout/activity_emulation.xml | 2 +- .../res/layout/activity_overlay_configure.xml | 4 +- .../src/main/res/layout/activity_settings.xml | 2 +- .../main/res/layout/fragment_emulation.xml | 4 +- .../src/main/res/layout/fragment_options.xml | 2 +- .../src/main/res/menu/menu_graphic_packs.xml | 3 +- .../app/src/main/res/menu/menu_main.xml | 3 +- .../app/src/main/res/navigation/nav_graph.xml | 2 +- .../res/navigation/nav_settings_graph.xml | 40 +-- .../app/src/main/res/values/strings.xml | 3 - 65 files changed, 475 insertions(+), 383 deletions(-) delete mode 100644 src/android/app/src/main/java/info/cemu/Cemu/CemuPreferences.java rename src/android/app/src/main/java/info/cemu/Cemu/{ => emulation}/EmulationActivity.java (93%) rename src/android/app/src/main/java/info/cemu/Cemu/{ => emulation}/EmulationFragment.java (86%) rename src/android/app/src/main/java/info/cemu/Cemu/{ => gameview}/Game.java (93%) rename src/android/app/src/main/java/info/cemu/Cemu/{ => gameview}/GameAdapter.java (98%) rename src/android/app/src/main/java/info/cemu/Cemu/{ => gameview}/GamesFragment.java (87%) rename src/android/app/src/main/java/info/cemu/Cemu/{ => guibasecomponents}/BaseSelectionAdapter.java (90%) rename src/android/app/src/main/java/info/cemu/Cemu/{ => guibasecomponents}/BaseSingleSelectionRecyclerViewItem.java (97%) rename src/android/app/src/main/java/info/cemu/Cemu/{ => guibasecomponents}/ButtonRecyclerViewItem.java (96%) rename src/android/app/src/main/java/info/cemu/Cemu/{ => guibasecomponents}/CheckboxRecyclerViewItem.java (97%) rename src/android/app/src/main/java/info/cemu/Cemu/{ => guibasecomponents}/GenericRecyclerViewAdapter.java (96%) rename src/android/app/src/main/java/info/cemu/Cemu/{ => guibasecomponents}/HeaderRecyclerViewItem.java (94%) rename src/android/app/src/main/java/info/cemu/Cemu/{ => guibasecomponents}/RecyclerViewItem.java (87%) rename src/android/app/src/main/java/info/cemu/Cemu/{ => guibasecomponents}/SelectionAdapter.java (84%) rename src/android/app/src/main/java/info/cemu/Cemu/{ => guibasecomponents}/SimpleButtonRecyclerViewItem.java (96%) rename src/android/app/src/main/java/info/cemu/Cemu/{ => guibasecomponents}/SingleSelectionRecyclerViewItem.java (98%) rename src/android/app/src/main/java/info/cemu/Cemu/{ => guibasecomponents}/SliderRecyclerViewItem.java (97%) rename src/android/app/src/main/java/info/cemu/Cemu/{ => guibasecomponents}/StringSelectionAdapter.java (88%) rename src/android/app/src/main/java/info/cemu/Cemu/{ => input}/InputManager.java (97%) rename src/android/app/src/main/java/info/cemu/Cemu/{ => inputoverlay}/Button.java (98%) rename src/android/app/src/main/java/info/cemu/Cemu/{ => inputoverlay}/ButtonStateChangeListener.java (78%) rename src/android/app/src/main/java/info/cemu/Cemu/{ => inputoverlay}/DPadInput.java (99%) rename src/android/app/src/main/java/info/cemu/Cemu/{ => inputoverlay}/Input.java (98%) rename src/android/app/src/main/java/info/cemu/Cemu/{ => inputoverlay}/InputOverlayConfigureActivity.java (89%) rename src/android/app/src/main/java/info/cemu/Cemu/{ => inputoverlay}/InputOverlaySettingsFragment.java (88%) rename src/android/app/src/main/java/info/cemu/Cemu/{ => inputoverlay}/InputOverlaySettingsProvider.java (97%) rename src/android/app/src/main/java/info/cemu/Cemu/{ => inputoverlay}/InputOverlaySurfaceView.java (98%) rename src/android/app/src/main/java/info/cemu/Cemu/{ => inputoverlay}/Joystick.java (99%) rename src/android/app/src/main/java/info/cemu/Cemu/{ => inputoverlay}/RectangleButton.java (96%) rename src/android/app/src/main/java/info/cemu/Cemu/{ => inputoverlay}/RoundButton.java (97%) rename src/android/app/src/main/java/info/cemu/Cemu/{ => settings}/OptionsFragment.java (81%) rename src/android/app/src/main/java/info/cemu/Cemu/{ => settings}/SettingsActivity.java (93%) create mode 100644 src/android/app/src/main/java/info/cemu/Cemu/settings/SettingsManager.java rename src/android/app/src/main/java/info/cemu/Cemu/{ => settings/audio}/AudioSettingsFragment.java (75%) rename src/android/app/src/main/java/info/cemu/Cemu/{ => settings/graphicpacks}/GraphicPackItemRecyclerViewItem.java (94%) rename src/android/app/src/main/java/info/cemu/Cemu/{ => settings/graphicpacks}/GraphicPackRecyclerViewItem.java (92%) rename src/android/app/src/main/java/info/cemu/Cemu/{ => settings/graphicpacks}/GraphicPacksFragment.java (94%) rename src/android/app/src/main/java/info/cemu/Cemu/{ => settings/graphicpacks}/GraphicPacksRecyclerViewAdapter.java (97%) rename src/android/app/src/main/java/info/cemu/Cemu/{ => settings/graphicpacks}/GraphicPacksRootFragment.java (98%) rename src/android/app/src/main/java/info/cemu/Cemu/{ => settings/graphics}/GraphicsSettingsFragment.java (68%) rename src/android/app/src/main/java/info/cemu/Cemu/{ => settings/input}/ControllerInputsDataProvider.java (95%) rename src/android/app/src/main/java/info/cemu/Cemu/{ => settings/input}/ControllerInputsFragment.java (92%) create mode 100644 src/android/app/src/main/java/info/cemu/Cemu/settings/input/ControllerTypeResourceNameMapper.java rename src/android/app/src/main/java/info/cemu/Cemu/{ => settings/input}/EmulatedControllerTypeAdapter.java (85%) rename src/android/app/src/main/java/info/cemu/Cemu/{ => settings/input}/InputRecyclerViewItem.java (94%) rename src/android/app/src/main/java/info/cemu/Cemu/{ => settings/input}/InputSettingsFragment.java (83%) rename src/android/app/src/main/java/info/cemu/Cemu/{ => settings/input}/MotionDialog.java (95%) rename src/android/app/src/main/java/info/cemu/Cemu/{ => settings/overlay}/OverlaySettingsFragment.java (68%) rename src/android/app/src/main/java/info/cemu/Cemu/{ => utils}/FileUtil.java (98%) rename src/android/app/src/main/java/info/cemu/Cemu/{ => utils}/ProgressResponseBody.java (98%) rename src/android/app/src/main/java/info/cemu/Cemu/{ => utils}/ZipUtil.java (97%) diff --git a/src/android/app/src/main/AndroidManifest.xml b/src/android/app/src/main/AndroidManifest.xml index 85c49e40..2f53dce8 100644 --- a/src/android/app/src/main/AndroidManifest.xml +++ b/src/android/app/src/main/AndroidManifest.xml @@ -19,20 +19,20 @@ android:theme="@style/Theme.Cemu" tools:targetApi="31"> GetStaticMethodID(*m_fileUtilClass, "openContentUri", "(Ljava/lang/String;)I"); m_listFilesMid = env->GetStaticMethodID(*m_fileUtilClass, "listFiles", "(Ljava/lang/String;)[Ljava/lang/String;"); m_isDirectoryMid = env->GetStaticMethodID(*m_fileUtilClass, "isDirectory", "(Ljava/lang/String;)Z"); diff --git a/src/android/app/src/main/java/info/cemu/Cemu/CemuApplication.java b/src/android/app/src/main/java/info/cemu/Cemu/CemuApplication.java index efa63959..56886fef 100644 --- a/src/android/app/src/main/java/info/cemu/Cemu/CemuApplication.java +++ b/src/android/app/src/main/java/info/cemu/Cemu/CemuApplication.java @@ -3,6 +3,9 @@ package info.cemu.Cemu; import android.app.Application; import android.util.DisplayMetrics; +import info.cemu.Cemu.NativeLibrary; +import info.cemu.Cemu.utils.FileUtil; + public class CemuApplication extends Application { @Override public void onCreate() { diff --git a/src/android/app/src/main/java/info/cemu/Cemu/CemuPreferences.java b/src/android/app/src/main/java/info/cemu/Cemu/CemuPreferences.java deleted file mode 100644 index 1167ff0f..00000000 --- a/src/android/app/src/main/java/info/cemu/Cemu/CemuPreferences.java +++ /dev/null @@ -1,6 +0,0 @@ -package info.cemu.Cemu; - -public class CemuPreferences { - public static final String PREFERENCES_NAME = "CEMU_PREFERENCES"; - public static final String GAMES_PATH_KEY = "GAME_PATHS_KEY"; -} diff --git a/src/android/app/src/main/java/info/cemu/Cemu/NativeLibrary.java b/src/android/app/src/main/java/info/cemu/Cemu/NativeLibrary.java index 27db83d3..93e74088 100644 --- a/src/android/app/src/main/java/info/cemu/Cemu/NativeLibrary.java +++ b/src/android/app/src/main/java/info/cemu/Cemu/NativeLibrary.java @@ -2,33 +2,16 @@ package info.cemu.Cemu; import android.view.Surface; -import androidx.annotation.Nullable; - import java.util.ArrayList; -import java.util.Arrays; -import java.util.Collections; import java.util.List; import java.util.Map; import java.util.Objects; -import java.util.function.Predicate; public class NativeLibrary { static { System.loadLibrary("CemuAndroid"); } - public interface FileSystemCallbacks { - int openContentUri(String uri); - - String[] listFiles(String uri); - - boolean isDirectory(String uri); - - boolean isFile(String uri); - - boolean exists(String uri); - } - public static native void setDPI(float dpi); public static native void setSurface(Surface surface, boolean isMainCanvas); @@ -72,145 +55,134 @@ public class NativeLibrary { public static native void onNativeAxis(String deviceDescriptor, String deviceName, int axis, float value); - static final int VPAD_BUTTON_NONE = 0; - static final int VPAD_BUTTON_A = 1; - static final int VPAD_BUTTON_B = 2; - static final int VPAD_BUTTON_X = 3; - static final int VPAD_BUTTON_Y = 4; - static final int VPAD_BUTTON_L = 5; - static final int VPAD_BUTTON_R = 6; - static final int VPAD_BUTTON_ZL = 7; - static final int VPAD_BUTTON_ZR = 8; - static final int VPAD_BUTTON_PLUS = 9; - static final int VPAD_BUTTON_MINUS = 10; - static final int VPAD_BUTTON_UP = 11; - static final int VPAD_BUTTON_DOWN = 12; - static final int VPAD_BUTTON_LEFT = 13; - static final int VPAD_BUTTON_RIGHT = 14; - static final int VPAD_BUTTON_STICKL = 15; - static final int VPAD_BUTTON_STICKR = 16; - static final int VPAD_BUTTON_STICKL_UP = 17; - static final int VPAD_BUTTON_STICKL_DOWN = 18; - static final int VPAD_BUTTON_STICKL_LEFT = 19; - static final int VPAD_BUTTON_STICKL_RIGHT = 20; - static final int VPAD_BUTTON_STICKR_UP = 21; - static final int VPAD_BUTTON_STICKR_DOWN = 22; - static final int VPAD_BUTTON_STICKR_LEFT = 23; - static final int VPAD_BUTTON_STICKR_RIGHT = 24; - static final int VPAD_BUTTON_MIC = 25; - static final int VPAD_BUTTON_SCREEN = 26; - static final int VPAD_BUTTON_HOME = 27; - static final int VPAD_BUTTON_MAX = 28; + public static final int VPAD_BUTTON_NONE = 0; + public static final int VPAD_BUTTON_A = 1; + public static final int VPAD_BUTTON_B = 2; + public static final int VPAD_BUTTON_X = 3; + public static final int VPAD_BUTTON_Y = 4; + public static final int VPAD_BUTTON_L = 5; + public static final int VPAD_BUTTON_R = 6; + public static final int VPAD_BUTTON_ZL = 7; + public static final int VPAD_BUTTON_ZR = 8; + public static final int VPAD_BUTTON_PLUS = 9; + public static final int VPAD_BUTTON_MINUS = 10; + public static final int VPAD_BUTTON_UP = 11; + public static final int VPAD_BUTTON_DOWN = 12; + public static final int VPAD_BUTTON_LEFT = 13; + public static final int VPAD_BUTTON_RIGHT = 14; + public static final int VPAD_BUTTON_STICKL = 15; + public static final int VPAD_BUTTON_STICKR = 16; + public static final int VPAD_BUTTON_STICKL_UP = 17; + public static final int VPAD_BUTTON_STICKL_DOWN = 18; + public static final int VPAD_BUTTON_STICKL_LEFT = 19; + public static final int VPAD_BUTTON_STICKL_RIGHT = 20; + public static final int VPAD_BUTTON_STICKR_UP = 21; + public static final int VPAD_BUTTON_STICKR_DOWN = 22; + public static final int VPAD_BUTTON_STICKR_LEFT = 23; + public static final int VPAD_BUTTON_STICKR_RIGHT = 24; + public static final int VPAD_BUTTON_MIC = 25; + public static final int VPAD_BUTTON_SCREEN = 26; + public static final int VPAD_BUTTON_HOME = 27; + public static final int VPAD_BUTTON_MAX = 28; - static final int PRO_BUTTON_NONE = 0; - static final int PRO_BUTTON_A = 1; - static final int PRO_BUTTON_B = 2; - static final int PRO_BUTTON_X = 3; - static final int PRO_BUTTON_Y = 4; - static final int PRO_BUTTON_L = 5; - static final int PRO_BUTTON_R = 6; - static final int PRO_BUTTON_ZL = 7; - static final int PRO_BUTTON_ZR = 8; - static final int PRO_BUTTON_PLUS = 9; - static final int PRO_BUTTON_MINUS = 10; - static final int PRO_BUTTON_HOME = 11; - static final int PRO_BUTTON_UP = 12; - static final int PRO_BUTTON_DOWN = 13; - static final int PRO_BUTTON_LEFT = 14; - static final int PRO_BUTTON_RIGHT = 15; - static final int PRO_BUTTON_STICKL = 16; - static final int PRO_BUTTON_STICKR = 17; - static final int PRO_BUTTON_STICKL_UP = 18; - static final int PRO_BUTTON_STICKL_DOWN = 19; - static final int PRO_BUTTON_STICKL_LEFT = 20; - static final int PRO_BUTTON_STICKL_RIGHT = 21; - static final int PRO_BUTTON_STICKR_UP = 22; - static final int PRO_BUTTON_STICKR_DOWN = 23; - static final int PRO_BUTTON_STICKR_LEFT = 24; - static final int PRO_BUTTON_STICKR_RIGHT = 25; - static final int PRO_BUTTON_MAX = 26; + public static final int PRO_BUTTON_NONE = 0; + public static final int PRO_BUTTON_A = 1; + public static final int PRO_BUTTON_B = 2; + public static final int PRO_BUTTON_X = 3; + public static final int PRO_BUTTON_Y = 4; + public static final int PRO_BUTTON_L = 5; + public static final int PRO_BUTTON_R = 6; + public static final int PRO_BUTTON_ZL = 7; + public static final int PRO_BUTTON_ZR = 8; + public static final int PRO_BUTTON_PLUS = 9; + public static final int PRO_BUTTON_MINUS = 10; + public static final int PRO_BUTTON_HOME = 11; + public static final int PRO_BUTTON_UP = 12; + public static final int PRO_BUTTON_DOWN = 13; + public static final int PRO_BUTTON_LEFT = 14; + public static final int PRO_BUTTON_RIGHT = 15; + public static final int PRO_BUTTON_STICKL = 16; + public static final int PRO_BUTTON_STICKR = 17; + public static final int PRO_BUTTON_STICKL_UP = 18; + public static final int PRO_BUTTON_STICKL_DOWN = 19; + public static final int PRO_BUTTON_STICKL_LEFT = 20; + public static final int PRO_BUTTON_STICKL_RIGHT = 21; + public static final int PRO_BUTTON_STICKR_UP = 22; + public static final int PRO_BUTTON_STICKR_DOWN = 23; + public static final int PRO_BUTTON_STICKR_LEFT = 24; + public static final int PRO_BUTTON_STICKR_RIGHT = 25; + public static final int PRO_BUTTON_MAX = 26; - static final int CLASSIC_BUTTON_NONE = 0; - static final int CLASSIC_BUTTON_A = 1; - static final int CLASSIC_BUTTON_B = 2; - static final int CLASSIC_BUTTON_X = 3; - static final int CLASSIC_BUTTON_Y = 4; - static final int CLASSIC_BUTTON_L = 5; - static final int CLASSIC_BUTTON_R = 6; - static final int CLASSIC_BUTTON_ZL = 7; - static final int CLASSIC_BUTTON_ZR = 8; - static final int CLASSIC_BUTTON_PLUS = 9; - static final int CLASSIC_BUTTON_MINUS = 10; - static final int CLASSIC_BUTTON_HOME = 11; - static final int CLASSIC_BUTTON_UP = 12; - static final int CLASSIC_BUTTON_DOWN = 13; - static final int CLASSIC_BUTTON_LEFT = 14; - static final int CLASSIC_BUTTON_RIGHT = 15; - static final int CLASSIC_BUTTON_STICKL_UP = 16; - static final int CLASSIC_BUTTON_STICKL_DOWN = 17; - static final int CLASSIC_BUTTON_STICKL_LEFT = 18; - static final int CLASSIC_BUTTON_STICKL_RIGHT = 19; - static final int CLASSIC_BUTTON_STICKR_UP = 20; - static final int CLASSIC_BUTTON_STICKR_DOWN = 21; - static final int CLASSIC_BUTTON_STICKR_LEFT = 22; - static final int CLASSIC_BUTTON_STICKR_RIGHT = 23; - static final int CLASSIC_BUTTON_MAX = 24; + public static final int CLASSIC_BUTTON_NONE = 0; + public static final int CLASSIC_BUTTON_A = 1; + public static final int CLASSIC_BUTTON_B = 2; + public static final int CLASSIC_BUTTON_X = 3; + public static final int CLASSIC_BUTTON_Y = 4; + public static final int CLASSIC_BUTTON_L = 5; + public static final int CLASSIC_BUTTON_R = 6; + public static final int CLASSIC_BUTTON_ZL = 7; + public static final int CLASSIC_BUTTON_ZR = 8; + public static final int CLASSIC_BUTTON_PLUS = 9; + public static final int CLASSIC_BUTTON_MINUS = 10; + public static final int CLASSIC_BUTTON_HOME = 11; + public static final int CLASSIC_BUTTON_UP = 12; + public static final int CLASSIC_BUTTON_DOWN = 13; + public static final int CLASSIC_BUTTON_LEFT = 14; + public static final int CLASSIC_BUTTON_RIGHT = 15; + public static final int CLASSIC_BUTTON_STICKL_UP = 16; + public static final int CLASSIC_BUTTON_STICKL_DOWN = 17; + public static final int CLASSIC_BUTTON_STICKL_LEFT = 18; + public static final int CLASSIC_BUTTON_STICKL_RIGHT = 19; + public static final int CLASSIC_BUTTON_STICKR_UP = 20; + public static final int CLASSIC_BUTTON_STICKR_DOWN = 21; + public static final int CLASSIC_BUTTON_STICKR_LEFT = 22; + public static final int CLASSIC_BUTTON_STICKR_RIGHT = 23; + public static final int CLASSIC_BUTTON_MAX = 24; - static final int WIIMOTE_BUTTON_NONE = 0; - static final int WIIMOTE_BUTTON_A = 1; - static final int WIIMOTE_BUTTON_B = 2; - static final int WIIMOTE_BUTTON_1 = 3; - static final int WIIMOTE_BUTTON_2 = 4; - static final int WIIMOTE_BUTTON_NUNCHUCK_Z = 5; - static final int WIIMOTE_BUTTON_NUNCHUCK_C = 6; - static final int WIIMOTE_BUTTON_PLUS = 7; - static final int WIIMOTE_BUTTON_MINUS = 8; - static final int WIIMOTE_BUTTON_UP = 9; - static final int WIIMOTE_BUTTON_DOWN = 10; - static final int WIIMOTE_BUTTON_LEFT = 11; - static final int WIIMOTE_BUTTON_RIGHT = 12; - static final int WIIMOTE_BUTTON_NUNCHUCK_UP = 13; - static final int WIIMOTE_BUTTON_NUNCHUCK_DOWN = 14; - static final int WIIMOTE_BUTTON_NUNCHUCK_LEFT = 15; - static final int WIIMOTE_BUTTON_NUNCHUCK_RIGHT = 16; - static final int WIIMOTE_BUTTON_HOME = 17; - static final int WIIMOTE_BUTTON_MAX = 18; + public static final int WIIMOTE_BUTTON_NONE = 0; + public static final int WIIMOTE_BUTTON_A = 1; + public static final int WIIMOTE_BUTTON_B = 2; + public static final int WIIMOTE_BUTTON_1 = 3; + public static final int WIIMOTE_BUTTON_2 = 4; + public static final int WIIMOTE_BUTTON_NUNCHUCK_Z = 5; + public static final int WIIMOTE_BUTTON_NUNCHUCK_C = 6; + public static final int WIIMOTE_BUTTON_PLUS = 7; + public static final int WIIMOTE_BUTTON_MINUS = 8; + public static final int WIIMOTE_BUTTON_UP = 9; + public static final int WIIMOTE_BUTTON_DOWN = 10; + public static final int WIIMOTE_BUTTON_LEFT = 11; + public static final int WIIMOTE_BUTTON_RIGHT = 12; + public static final int WIIMOTE_BUTTON_NUNCHUCK_UP = 13; + public static final int WIIMOTE_BUTTON_NUNCHUCK_DOWN = 14; + public static final int WIIMOTE_BUTTON_NUNCHUCK_LEFT = 15; + public static final int WIIMOTE_BUTTON_NUNCHUCK_RIGHT = 16; + public static final int WIIMOTE_BUTTON_HOME = 17; + public static final int WIIMOTE_BUTTON_MAX = 18; - static final int EMULATED_CONTROLLER_TYPE_VPAD = 0; - static final int EMULATED_CONTROLLER_TYPE_PRO = 1; - static final int EMULATED_CONTROLLER_TYPE_CLASSIC = 2; - static final int EMULATED_CONTROLLER_TYPE_WIIMOTE = 3; - static final int EMULATED_CONTROLLER_TYPE_DISABLED = -1; + public static final int EMULATED_CONTROLLER_TYPE_VPAD = 0; + public static final int EMULATED_CONTROLLER_TYPE_PRO = 1; + public static final int EMULATED_CONTROLLER_TYPE_CLASSIC = 2; + public static final int EMULATED_CONTROLLER_TYPE_WIIMOTE = 3; + public static final int EMULATED_CONTROLLER_TYPE_DISABLED = -1; - static final int DPAD_UP = 34; - static final int DPAD_DOWN = 35; - static final int DPAD_LEFT = 36; - static final int DPAD_RIGHT = 37; - static final int AXIS_X_POS = 38; - static final int AXIS_Y_POS = 39; - static final int ROTATION_X_POS = 40; - static final int ROTATION_Y_POS = 41; - static final int TRIGGER_X_POS = 42; - static final int TRIGGER_Y_POS = 43; - static final int AXIS_X_NEG = 44; - static final int AXIS_Y_NEG = 45; - static final int ROTATION_X_NEG = 46; - static final int ROTATION_Y_NEG = 47; + public static final int DPAD_UP = 34; + public static final int DPAD_DOWN = 35; + public static final int DPAD_LEFT = 36; + public static final int DPAD_RIGHT = 37; + public static final int AXIS_X_POS = 38; + public static final int AXIS_Y_POS = 39; + public static final int ROTATION_X_POS = 40; + public static final int ROTATION_Y_POS = 41; + public static final int TRIGGER_X_POS = 42; + public static final int TRIGGER_Y_POS = 43; + public static final int AXIS_X_NEG = 44; + public static final int AXIS_Y_NEG = 45; + public static final int ROTATION_X_NEG = 46; + public static final int ROTATION_Y_NEG = 47; - static final int MAX_CONTROLLERS = 8; - static final int MAX_VPAD_CONTROLLERS = 2; - static final int MAX_WPAD_CONTROLLERS = 7; - - public static int controllerTypeToResourceNameId(int type) { - return switch (type) { - case EMULATED_CONTROLLER_TYPE_DISABLED -> R.string.disabled; - case EMULATED_CONTROLLER_TYPE_VPAD -> R.string.vpad_controller; - case EMULATED_CONTROLLER_TYPE_PRO -> R.string.pro_controller; - case EMULATED_CONTROLLER_TYPE_WIIMOTE -> R.string.wiimote_controller; - case EMULATED_CONTROLLER_TYPE_CLASSIC -> R.string.classic_controller; - default -> throw new RuntimeException("Invalid controller type: " + type); - }; - } + public static final int MAX_CONTROLLERS = 8; + public static final int MAX_VPAD_CONTROLLERS = 2; + public static final int MAX_WPAD_CONTROLLERS = 7; public static native void setControllerType(int index, int emulatedControllerType); @@ -238,18 +210,9 @@ public class NativeLibrary { public static native void setAsyncShaderCompile(boolean enabled); - static final int VSYNC_MODE_OFF = 0; - static final int VSYNC_MODE_DOUBLE_BUFFERING = 1; - static final int VSYNC_MODE_TRIPLE_BUFFERING = 2; - - public static int vsyncModeToResourceNameId(int vsyncMode) { - return switch (vsyncMode) { - case VSYNC_MODE_OFF -> R.string.off; - case VSYNC_MODE_DOUBLE_BUFFERING -> R.string.double_buffering; - case VSYNC_MODE_TRIPLE_BUFFERING -> R.string.triple_buffering; - default -> throw new RuntimeException("Invalid vsync mode: " + vsyncMode); - }; - } + public static final int VSYNC_MODE_OFF = 0; + public static final int VSYNC_MODE_DOUBLE_BUFFERING = 1; + public static final int VSYNC_MODE_TRIPLE_BUFFERING = 2; public static native int getVSyncMode(); @@ -263,25 +226,16 @@ public class NativeLibrary { public static native void setAudioDeviceEnabled(boolean enabled, boolean tv); - static final int AUDIO_CHANNELS_MONO = 0; - static final int AUDIO_CHANNELS_STEREO = 1; - static final int AUDIO_CHANNELS_SURROUND = 2; - - public static int channelsToResourceNameId(int channels) { - return switch (channels) { - case AUDIO_CHANNELS_MONO -> R.string.mono; - case AUDIO_CHANNELS_STEREO -> R.string.stereo; - case AUDIO_CHANNELS_SURROUND -> R.string.surround; - default -> throw new RuntimeException("Invalid channels type: " + channels); - }; - } + public static final int AUDIO_CHANNELS_MONO = 0; + public static final int AUDIO_CHANNELS_STEREO = 1; + public static final int AUDIO_CHANNELS_SURROUND = 2; public static native void setAudioDeviceChannels(int channels, boolean tv); public static native int getAudioDeviceChannels(boolean tv); - static final int AUDIO_MIN_VOLUME = 0; - static final int AUDIO_MAX_VOLUME = 100; + public static final int AUDIO_MIN_VOLUME = 0; + public static final int AUDIO_MAX_VOLUME = 100; public static native void setAudioDeviceVolume(int volume, boolean tv); @@ -325,7 +279,7 @@ public class NativeLibrary { public void setActivePreset(String activePreset) { if (presets.stream().noneMatch(s -> s.equals(activePreset))) - throw new RuntimeException("Trying to set an invalid preset: " + activePreset); + throw new IllegalArgumentException ("Trying to set an invalid preset: " + activePreset); setGraphicPackActivePreset(graphicPackId, category, activePreset); this.activePreset = activePreset; } @@ -382,27 +336,13 @@ public class NativeLibrary { public static native void onOverlayAxis(int controllerIndex, int mappingId, float value); - static final int OVERLAY_SCREEN_POSITION_DISABLED = 0; - static final int OVERLAY_SCREEN_POSITION_TOP_LEFT = 1; - static final int OVERLAY_SCREEN_POSITION_TOP_CENTER = 2; - static final int OVERLAY_SCREEN_POSITION_TOP_RIGHT = 3; - static final int OVERLAY_SCREEN_POSITION_BOTTOM_LEFT = 4; - static final int OVERLAY_SCREEN_POSITION_BOTTOM_CENTER = 5; - static final int OVERLAY_SCREEN_POSITION_BOTTOM_RIGHT = 6; - - public static int overlayScreenPositionToResourceNameId(int overlayScreenPosition) { - return switch (overlayScreenPosition) { - case OVERLAY_SCREEN_POSITION_DISABLED -> R.string.overlay_position_disabled; - case OVERLAY_SCREEN_POSITION_TOP_LEFT -> R.string.overlay_position_top_left; - case OVERLAY_SCREEN_POSITION_TOP_CENTER -> R.string.overlay_position_top_center; - case OVERLAY_SCREEN_POSITION_TOP_RIGHT -> R.string.overlay_position_top_right; - case OVERLAY_SCREEN_POSITION_BOTTOM_LEFT -> R.string.overlay_position_bottom_left; - case OVERLAY_SCREEN_POSITION_BOTTOM_CENTER -> R.string.overlay_position_bottom_center; - case OVERLAY_SCREEN_POSITION_BOTTOM_RIGHT -> R.string.overlay_position_bottom_right; - default -> - throw new RuntimeException("Invalid overlay position: " + overlayScreenPosition); - }; - } + public static final int OVERLAY_SCREEN_POSITION_DISABLED = 0; + public static final int OVERLAY_SCREEN_POSITION_TOP_LEFT = 1; + public static final int OVERLAY_SCREEN_POSITION_TOP_CENTER = 2; + public static final int OVERLAY_SCREEN_POSITION_TOP_RIGHT = 3; + public static final int OVERLAY_SCREEN_POSITION_BOTTOM_LEFT = 4; + public static final int OVERLAY_SCREEN_POSITION_BOTTOM_CENTER = 5; + public static final int OVERLAY_SCREEN_POSITION_BOTTOM_RIGHT = 6; public static native int getOverlayPosition(); diff --git a/src/android/app/src/main/java/info/cemu/Cemu/EmulationActivity.java b/src/android/app/src/main/java/info/cemu/Cemu/emulation/EmulationActivity.java similarity index 93% rename from src/android/app/src/main/java/info/cemu/Cemu/EmulationActivity.java rename to src/android/app/src/main/java/info/cemu/Cemu/emulation/EmulationActivity.java index d0a5e1a5..a696cb57 100644 --- a/src/android/app/src/main/java/info/cemu/Cemu/EmulationActivity.java +++ b/src/android/app/src/main/java/info/cemu/Cemu/emulation/EmulationActivity.java @@ -1,21 +1,19 @@ -package info.cemu.Cemu; +package info.cemu.Cemu.emulation; -import androidx.appcompat.app.AlertDialog; -import androidx.appcompat.app.AppCompatActivity; -import androidx.core.view.WindowCompat; -import androidx.core.view.WindowInsetsAnimationCompat; -import androidx.core.view.WindowInsetsCompat; -import androidx.core.view.WindowInsetsControllerCompat; - -import android.content.DialogInterface; import android.os.Bundle; import android.view.KeyEvent; import android.view.MotionEvent; +import androidx.appcompat.app.AppCompatActivity; +import androidx.core.view.WindowCompat; +import androidx.core.view.WindowInsetsCompat; +import androidx.core.view.WindowInsetsControllerCompat; + import com.google.android.material.dialog.MaterialAlertDialogBuilder; +import info.cemu.Cemu.R; import info.cemu.Cemu.databinding.ActivityEmulationBinding; -import info.cemu.Cemu.databinding.ActivityMainBinding; +import info.cemu.Cemu.input.InputManager; public class EmulationActivity extends AppCompatActivity { diff --git a/src/android/app/src/main/java/info/cemu/Cemu/EmulationFragment.java b/src/android/app/src/main/java/info/cemu/Cemu/emulation/EmulationFragment.java similarity index 86% rename from src/android/app/src/main/java/info/cemu/Cemu/EmulationFragment.java rename to src/android/app/src/main/java/info/cemu/Cemu/emulation/EmulationFragment.java index 6906a12c..31e636f2 100644 --- a/src/android/app/src/main/java/info/cemu/Cemu/EmulationFragment.java +++ b/src/android/app/src/main/java/info/cemu/Cemu/emulation/EmulationFragment.java @@ -1,4 +1,4 @@ -package info.cemu.Cemu; +package info.cemu.Cemu.emulation; import android.content.Context; import android.os.Bundle; @@ -10,9 +10,14 @@ import android.view.ViewGroup; import android.widget.Toast; import androidx.annotation.NonNull; +import androidx.annotation.Nullable; import androidx.fragment.app.Fragment; +import info.cemu.Cemu.R; import info.cemu.Cemu.databinding.FragmentEmulationBinding; +import info.cemu.Cemu.inputoverlay.InputOverlaySettingsProvider; +import info.cemu.Cemu.inputoverlay.InputOverlaySurfaceView; +import info.cemu.Cemu.NativeLibrary; public class EmulationFragment extends Fragment implements SurfaceHolder.Callback { private final long gameTitleId; @@ -24,14 +29,19 @@ public class EmulationFragment extends Fragment implements SurfaceHolder.Callbac this.gameTitleId = gameTitleId; } + InputOverlaySettingsProvider.OverlaySettings overlaySettings; + + @Override + public void onCreate(@Nullable Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + var inputOverlaySettingsProvider = new InputOverlaySettingsProvider(requireContext()); + overlaySettings = inputOverlaySettingsProvider.getOverlaySettings(); + } + @Override public View onCreateView(@NonNull LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { FragmentEmulationBinding binding = FragmentEmulationBinding.inflate(inflater, container, false); - var context = requireContext(); - var sharedPref = context.getSharedPreferences( - context.getString(R.string.inputoverlaysettings_shared_preferences_name), Context.MODE_PRIVATE); - var inputOverlaySettingsProvider = new InputOverlaySettingsProvider(sharedPref); - var overlaySettings = inputOverlaySettingsProvider.getOverlaySettings(); + InputOverlaySurfaceView surfaceView = binding.inputOverlay; binding.inputModeButton.setOnClickListener(v -> { InputOverlaySurfaceView.InputMode nextMode = InputOverlaySurfaceView.InputMode.DEFAULT; diff --git a/src/android/app/src/main/java/info/cemu/Cemu/Game.java b/src/android/app/src/main/java/info/cemu/Cemu/gameview/Game.java similarity index 93% rename from src/android/app/src/main/java/info/cemu/Cemu/Game.java rename to src/android/app/src/main/java/info/cemu/Cemu/gameview/Game.java index c699be7c..4af88106 100644 --- a/src/android/app/src/main/java/info/cemu/Cemu/Game.java +++ b/src/android/app/src/main/java/info/cemu/Cemu/gameview/Game.java @@ -1,4 +1,4 @@ -package info.cemu.Cemu; +package info.cemu.Cemu.gameview; import android.graphics.Bitmap; diff --git a/src/android/app/src/main/java/info/cemu/Cemu/GameAdapter.java b/src/android/app/src/main/java/info/cemu/Cemu/gameview/GameAdapter.java similarity index 98% rename from src/android/app/src/main/java/info/cemu/Cemu/GameAdapter.java rename to src/android/app/src/main/java/info/cemu/Cemu/gameview/GameAdapter.java index 6605b9ca..4ef3b471 100644 --- a/src/android/app/src/main/java/info/cemu/Cemu/GameAdapter.java +++ b/src/android/app/src/main/java/info/cemu/Cemu/gameview/GameAdapter.java @@ -1,4 +1,4 @@ -package info.cemu.Cemu; +package info.cemu.Cemu.gameview; import android.graphics.Bitmap; import android.view.LayoutInflater; @@ -18,6 +18,8 @@ import java.util.List; import java.util.Map; import java.util.stream.Collectors; +import info.cemu.Cemu.R; + public class GameAdapter extends RecyclerView.Adapter implements Filterable { private final Map gameInfoMap; private final List gameTitleIds; diff --git a/src/android/app/src/main/java/info/cemu/Cemu/GamesFragment.java b/src/android/app/src/main/java/info/cemu/Cemu/gameview/GamesFragment.java similarity index 87% rename from src/android/app/src/main/java/info/cemu/Cemu/GamesFragment.java rename to src/android/app/src/main/java/info/cemu/Cemu/gameview/GamesFragment.java index b728e271..cd660f48 100644 --- a/src/android/app/src/main/java/info/cemu/Cemu/GamesFragment.java +++ b/src/android/app/src/main/java/info/cemu/Cemu/gameview/GamesFragment.java @@ -1,8 +1,6 @@ -package info.cemu.Cemu; +package info.cemu.Cemu.gameview; -import android.content.Context; import android.content.Intent; -import android.content.SharedPreferences; import android.graphics.Bitmap; import android.os.Bundle; import android.text.Editable; @@ -17,23 +15,28 @@ import androidx.fragment.app.Fragment; import androidx.recyclerview.widget.LinearLayoutManager; import androidx.recyclerview.widget.RecyclerView; +import info.cemu.Cemu.R; import info.cemu.Cemu.databinding.FragmentGamesBinding; +import info.cemu.Cemu.emulation.EmulationActivity; +import info.cemu.Cemu.NativeLibrary; +import info.cemu.Cemu.settings.SettingsActivity; +import info.cemu.Cemu.settings.SettingsManager; public class GamesFragment extends Fragment { - FragmentGamesBinding binding; - GameAdapter gameAdapter; + private FragmentGamesBinding binding; + private GameAdapter gameAdapter; + private SettingsManager settingsManager; @Override public void onCreate(@Nullable Bundle savedInstanceState) { super.onCreate(savedInstanceState); + settingsManager = new SettingsManager(requireContext()); } @Override public View onCreateView(@NonNull LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { binding = FragmentGamesBinding.inflate(inflater, container, false); - - SharedPreferences cemuPreferences = requireActivity().getSharedPreferences(CemuPreferences.PREFERENCES_NAME, Context.MODE_PRIVATE); - String gamesPath = cemuPreferences.getString(CemuPreferences.GAMES_PATH_KEY, null); + String gamesPath = settingsManager.getGamesPath(); if (gamesPath != null) NativeLibrary.addGamePath(gamesPath); RecyclerView recyclerView = binding.gamesRecyclerView; diff --git a/src/android/app/src/main/java/info/cemu/Cemu/BaseSelectionAdapter.java b/src/android/app/src/main/java/info/cemu/Cemu/guibasecomponents/BaseSelectionAdapter.java similarity index 90% rename from src/android/app/src/main/java/info/cemu/Cemu/BaseSelectionAdapter.java rename to src/android/app/src/main/java/info/cemu/Cemu/guibasecomponents/BaseSelectionAdapter.java index cb51c034..c922b42c 100644 --- a/src/android/app/src/main/java/info/cemu/Cemu/BaseSelectionAdapter.java +++ b/src/android/app/src/main/java/info/cemu/Cemu/guibasecomponents/BaseSelectionAdapter.java @@ -1,4 +1,4 @@ -package info.cemu.Cemu; +package info.cemu.Cemu.guibasecomponents; import android.view.LayoutInflater; import android.view.View; @@ -7,10 +7,7 @@ import android.widget.BaseAdapter; import com.google.android.material.radiobutton.MaterialRadioButton; -import java.util.ArrayList; -import java.util.List; -import java.util.OptionalInt; -import java.util.stream.IntStream; +import info.cemu.Cemu.R; public abstract class BaseSelectionAdapter extends BaseAdapter { diff --git a/src/android/app/src/main/java/info/cemu/Cemu/BaseSingleSelectionRecyclerViewItem.java b/src/android/app/src/main/java/info/cemu/Cemu/guibasecomponents/BaseSingleSelectionRecyclerViewItem.java similarity index 97% rename from src/android/app/src/main/java/info/cemu/Cemu/BaseSingleSelectionRecyclerViewItem.java rename to src/android/app/src/main/java/info/cemu/Cemu/guibasecomponents/BaseSingleSelectionRecyclerViewItem.java index 94b7c98e..06acc584 100644 --- a/src/android/app/src/main/java/info/cemu/Cemu/BaseSingleSelectionRecyclerViewItem.java +++ b/src/android/app/src/main/java/info/cemu/Cemu/guibasecomponents/BaseSingleSelectionRecyclerViewItem.java @@ -1,4 +1,4 @@ -package info.cemu.Cemu; +package info.cemu.Cemu.guibasecomponents; import android.view.LayoutInflater; import android.view.View; @@ -9,6 +9,8 @@ import androidx.recyclerview.widget.RecyclerView; import com.google.android.material.dialog.MaterialAlertDialogBuilder; +import info.cemu.Cemu.R; + public abstract class BaseSingleSelectionRecyclerViewItem implements RecyclerViewItem { private static class SingleSelectionViewHolder extends RecyclerView.ViewHolder { TextView label; diff --git a/src/android/app/src/main/java/info/cemu/Cemu/ButtonRecyclerViewItem.java b/src/android/app/src/main/java/info/cemu/Cemu/guibasecomponents/ButtonRecyclerViewItem.java similarity index 96% rename from src/android/app/src/main/java/info/cemu/Cemu/ButtonRecyclerViewItem.java rename to src/android/app/src/main/java/info/cemu/Cemu/guibasecomponents/ButtonRecyclerViewItem.java index 4ccb0345..5edbb15f 100644 --- a/src/android/app/src/main/java/info/cemu/Cemu/ButtonRecyclerViewItem.java +++ b/src/android/app/src/main/java/info/cemu/Cemu/guibasecomponents/ButtonRecyclerViewItem.java @@ -1,4 +1,4 @@ -package info.cemu.Cemu; +package info.cemu.Cemu.guibasecomponents; import android.view.LayoutInflater; import android.view.View; @@ -7,6 +7,8 @@ import android.widget.TextView; import androidx.recyclerview.widget.RecyclerView; +import info.cemu.Cemu.R; + public class ButtonRecyclerViewItem implements RecyclerViewItem { public interface OnButtonClickListener { void onButtonClick(); diff --git a/src/android/app/src/main/java/info/cemu/Cemu/CheckboxRecyclerViewItem.java b/src/android/app/src/main/java/info/cemu/Cemu/guibasecomponents/CheckboxRecyclerViewItem.java similarity index 97% rename from src/android/app/src/main/java/info/cemu/Cemu/CheckboxRecyclerViewItem.java rename to src/android/app/src/main/java/info/cemu/Cemu/guibasecomponents/CheckboxRecyclerViewItem.java index 4747f296..688f53cb 100644 --- a/src/android/app/src/main/java/info/cemu/Cemu/CheckboxRecyclerViewItem.java +++ b/src/android/app/src/main/java/info/cemu/Cemu/guibasecomponents/CheckboxRecyclerViewItem.java @@ -1,4 +1,4 @@ -package info.cemu.Cemu; +package info.cemu.Cemu.guibasecomponents; import android.view.LayoutInflater; import android.view.View; @@ -9,6 +9,8 @@ import androidx.recyclerview.widget.RecyclerView; import com.google.android.material.checkbox.MaterialCheckBox; +import info.cemu.Cemu.R; + public class CheckboxRecyclerViewItem implements RecyclerViewItem { public interface OnCheckedChangeListener { void onCheckChanged(boolean checked); diff --git a/src/android/app/src/main/java/info/cemu/Cemu/GenericRecyclerViewAdapter.java b/src/android/app/src/main/java/info/cemu/Cemu/guibasecomponents/GenericRecyclerViewAdapter.java similarity index 96% rename from src/android/app/src/main/java/info/cemu/Cemu/GenericRecyclerViewAdapter.java rename to src/android/app/src/main/java/info/cemu/Cemu/guibasecomponents/GenericRecyclerViewAdapter.java index 3ec8918b..3a1bbd64 100644 --- a/src/android/app/src/main/java/info/cemu/Cemu/GenericRecyclerViewAdapter.java +++ b/src/android/app/src/main/java/info/cemu/Cemu/guibasecomponents/GenericRecyclerViewAdapter.java @@ -1,4 +1,4 @@ -package info.cemu.Cemu; +package info.cemu.Cemu.guibasecomponents; import android.view.ViewGroup; @@ -7,7 +7,6 @@ import androidx.recyclerview.widget.RecyclerView; import java.util.ArrayList; import java.util.List; -import java.util.function.Predicate; public class GenericRecyclerViewAdapter extends RecyclerView.Adapter { diff --git a/src/android/app/src/main/java/info/cemu/Cemu/HeaderRecyclerViewItem.java b/src/android/app/src/main/java/info/cemu/Cemu/guibasecomponents/HeaderRecyclerViewItem.java similarity index 94% rename from src/android/app/src/main/java/info/cemu/Cemu/HeaderRecyclerViewItem.java rename to src/android/app/src/main/java/info/cemu/Cemu/guibasecomponents/HeaderRecyclerViewItem.java index 95f5c610..32dbb06b 100644 --- a/src/android/app/src/main/java/info/cemu/Cemu/HeaderRecyclerViewItem.java +++ b/src/android/app/src/main/java/info/cemu/Cemu/guibasecomponents/HeaderRecyclerViewItem.java @@ -1,4 +1,4 @@ -package info.cemu.Cemu; +package info.cemu.Cemu.guibasecomponents; import android.view.LayoutInflater; import android.view.View; @@ -7,6 +7,8 @@ import android.widget.TextView; import androidx.recyclerview.widget.RecyclerView; +import info.cemu.Cemu.R; + public class HeaderRecyclerViewItem implements RecyclerViewItem { private static class HeaderViewHolder extends RecyclerView.ViewHolder { diff --git a/src/android/app/src/main/java/info/cemu/Cemu/RecyclerViewItem.java b/src/android/app/src/main/java/info/cemu/Cemu/guibasecomponents/RecyclerViewItem.java similarity index 87% rename from src/android/app/src/main/java/info/cemu/Cemu/RecyclerViewItem.java rename to src/android/app/src/main/java/info/cemu/Cemu/guibasecomponents/RecyclerViewItem.java index a2fa95c3..ce348dac 100644 --- a/src/android/app/src/main/java/info/cemu/Cemu/RecyclerViewItem.java +++ b/src/android/app/src/main/java/info/cemu/Cemu/guibasecomponents/RecyclerViewItem.java @@ -1,4 +1,4 @@ -package info.cemu.Cemu; +package info.cemu.Cemu.guibasecomponents; import android.view.ViewGroup; diff --git a/src/android/app/src/main/java/info/cemu/Cemu/SelectionAdapter.java b/src/android/app/src/main/java/info/cemu/Cemu/guibasecomponents/SelectionAdapter.java similarity index 84% rename from src/android/app/src/main/java/info/cemu/Cemu/SelectionAdapter.java rename to src/android/app/src/main/java/info/cemu/Cemu/guibasecomponents/SelectionAdapter.java index 12b320a7..1239a72f 100644 --- a/src/android/app/src/main/java/info/cemu/Cemu/SelectionAdapter.java +++ b/src/android/app/src/main/java/info/cemu/Cemu/guibasecomponents/SelectionAdapter.java @@ -1,20 +1,13 @@ -package info.cemu.Cemu; +package info.cemu.Cemu.guibasecomponents; -import android.view.LayoutInflater; -import android.view.View; -import android.view.ViewGroup; -import android.widget.BaseAdapter; import android.widget.TextView; -import androidx.annotation.StringRes; - import com.google.android.material.radiobutton.MaterialRadioButton; import java.util.ArrayList; import java.util.List; import java.util.OptionalInt; import java.util.function.Consumer; -import java.util.function.Function; import java.util.stream.IntStream; public class SelectionAdapter extends BaseSelectionAdapter { @@ -49,7 +42,7 @@ public class SelectionAdapter extends BaseSelectionAdapter { public int getPositionOf(T value) { OptionalInt optionalInt = IntStream.range(0, choiceItems.size()).filter(position -> choiceItems.get(position).choiceValue.equals(value)).findFirst(); if (!optionalInt.isPresent()) - throw new RuntimeException("value " + value + " was not found in the list of choiceItems"); + throw new IllegalArgumentException("value " + value + " was not found in the list of choiceItems"); return optionalInt.getAsInt(); } diff --git a/src/android/app/src/main/java/info/cemu/Cemu/SimpleButtonRecyclerViewItem.java b/src/android/app/src/main/java/info/cemu/Cemu/guibasecomponents/SimpleButtonRecyclerViewItem.java similarity index 96% rename from src/android/app/src/main/java/info/cemu/Cemu/SimpleButtonRecyclerViewItem.java rename to src/android/app/src/main/java/info/cemu/Cemu/guibasecomponents/SimpleButtonRecyclerViewItem.java index 16fb8607..b0256be3 100644 --- a/src/android/app/src/main/java/info/cemu/Cemu/SimpleButtonRecyclerViewItem.java +++ b/src/android/app/src/main/java/info/cemu/Cemu/guibasecomponents/SimpleButtonRecyclerViewItem.java @@ -1,4 +1,4 @@ -package info.cemu.Cemu; +package info.cemu.Cemu.guibasecomponents; import android.view.LayoutInflater; import android.view.View; @@ -7,6 +7,8 @@ import android.widget.TextView; import androidx.recyclerview.widget.RecyclerView; +import info.cemu.Cemu.R; + public class SimpleButtonRecyclerViewItem implements RecyclerViewItem { public interface OnButtonClickListener { void onButtonClick(); diff --git a/src/android/app/src/main/java/info/cemu/Cemu/SingleSelectionRecyclerViewItem.java b/src/android/app/src/main/java/info/cemu/Cemu/guibasecomponents/SingleSelectionRecyclerViewItem.java similarity index 98% rename from src/android/app/src/main/java/info/cemu/Cemu/SingleSelectionRecyclerViewItem.java rename to src/android/app/src/main/java/info/cemu/Cemu/guibasecomponents/SingleSelectionRecyclerViewItem.java index bb8e4b65..9d4d1b31 100644 --- a/src/android/app/src/main/java/info/cemu/Cemu/SingleSelectionRecyclerViewItem.java +++ b/src/android/app/src/main/java/info/cemu/Cemu/guibasecomponents/SingleSelectionRecyclerViewItem.java @@ -1,4 +1,4 @@ -package info.cemu.Cemu; +package info.cemu.Cemu.guibasecomponents; import android.view.LayoutInflater; import android.view.View; @@ -10,6 +10,8 @@ import androidx.recyclerview.widget.RecyclerView; import com.google.android.material.dialog.MaterialAlertDialogBuilder; +import info.cemu.Cemu.R; + public class SingleSelectionRecyclerViewItem implements RecyclerViewItem { private static class SingleSelectionViewHolder extends RecyclerView.ViewHolder { TextView label; diff --git a/src/android/app/src/main/java/info/cemu/Cemu/SliderRecyclerViewItem.java b/src/android/app/src/main/java/info/cemu/Cemu/guibasecomponents/SliderRecyclerViewItem.java similarity index 97% rename from src/android/app/src/main/java/info/cemu/Cemu/SliderRecyclerViewItem.java rename to src/android/app/src/main/java/info/cemu/Cemu/guibasecomponents/SliderRecyclerViewItem.java index 3d3703ef..adb0ccec 100644 --- a/src/android/app/src/main/java/info/cemu/Cemu/SliderRecyclerViewItem.java +++ b/src/android/app/src/main/java/info/cemu/Cemu/guibasecomponents/SliderRecyclerViewItem.java @@ -1,4 +1,4 @@ -package info.cemu.Cemu; +package info.cemu.Cemu.guibasecomponents; import android.view.LayoutInflater; import android.view.View; @@ -10,6 +10,8 @@ import androidx.recyclerview.widget.RecyclerView; import com.google.android.material.slider.LabelFormatter; import com.google.android.material.slider.Slider; +import info.cemu.Cemu.R; + public class SliderRecyclerViewItem implements RecyclerViewItem { public interface OnChangeListener { void onChange(float value); diff --git a/src/android/app/src/main/java/info/cemu/Cemu/StringSelectionAdapter.java b/src/android/app/src/main/java/info/cemu/Cemu/guibasecomponents/StringSelectionAdapter.java similarity index 88% rename from src/android/app/src/main/java/info/cemu/Cemu/StringSelectionAdapter.java rename to src/android/app/src/main/java/info/cemu/Cemu/guibasecomponents/StringSelectionAdapter.java index 8ae51e4c..65a1c5a5 100644 --- a/src/android/app/src/main/java/info/cemu/Cemu/StringSelectionAdapter.java +++ b/src/android/app/src/main/java/info/cemu/Cemu/guibasecomponents/StringSelectionAdapter.java @@ -1,8 +1,7 @@ -package info.cemu.Cemu; +package info.cemu.Cemu.guibasecomponents; import com.google.android.material.radiobutton.MaterialRadioButton; -import java.util.ArrayList; import java.util.List; import java.util.OptionalInt; import java.util.stream.IntStream; @@ -25,7 +24,7 @@ public class StringSelectionAdapter extends BaseSelectionAdapter { public int getPositionOf(String value) { OptionalInt optionalInt = IntStream.range(0, choices.size()).filter(position -> choices.get(position).equals(value)).findFirst(); if (!optionalInt.isPresent()) - throw new RuntimeException("value " + value + " was not found in the list of choices"); + throw new IllegalArgumentException("value " + value + " was not found in the list of choices"); return optionalInt.getAsInt(); } diff --git a/src/android/app/src/main/java/info/cemu/Cemu/InputManager.java b/src/android/app/src/main/java/info/cemu/Cemu/input/InputManager.java similarity index 97% rename from src/android/app/src/main/java/info/cemu/Cemu/InputManager.java rename to src/android/app/src/main/java/info/cemu/Cemu/input/InputManager.java index 8c34daee..a87d92ea 100644 --- a/src/android/app/src/main/java/info/cemu/Cemu/InputManager.java +++ b/src/android/app/src/main/java/info/cemu/Cemu/input/InputManager.java @@ -1,10 +1,12 @@ -package info.cemu.Cemu; +package info.cemu.Cemu.input; import android.util.Log; import android.view.InputDevice; import android.view.KeyEvent; import android.view.MotionEvent; +import info.cemu.Cemu.NativeLibrary; + public class InputManager { private static class InvalidAxisException extends Exception { public InvalidAxisException(int axis) { @@ -108,13 +110,11 @@ public class InputManager { float axisValue = event.getAxisValue(motionRange.getAxis(), actionPointerIndex); int axis = motionRange.getAxis(); NativeLibrary.onNativeAxis(device.getDescriptor(), device.getName(), axis, axisValue); - Log.i(getClass().getName(), "Axis: " + axis + " value: " + axisValue); } return true; } public boolean mapKeyEventToMappingId(int controllerIndex, int mappingId, KeyEvent event) { - Log.i(getClass().getName(), event.toString()); InputDevice device = event.getDevice(); NativeLibrary.setControllerMapping(device.getDescriptor(), device.getName(), controllerIndex, mappingId, event.getKeyCode()); return true; diff --git a/src/android/app/src/main/java/info/cemu/Cemu/Button.java b/src/android/app/src/main/java/info/cemu/Cemu/inputoverlay/Button.java similarity index 98% rename from src/android/app/src/main/java/info/cemu/Cemu/Button.java rename to src/android/app/src/main/java/info/cemu/Cemu/inputoverlay/Button.java index cee9858b..2cf26b79 100644 --- a/src/android/app/src/main/java/info/cemu/Cemu/Button.java +++ b/src/android/app/src/main/java/info/cemu/Cemu/inputoverlay/Button.java @@ -1,4 +1,4 @@ -package info.cemu.Cemu; +package info.cemu.Cemu.inputoverlay; import android.content.res.Resources; import android.graphics.Canvas; diff --git a/src/android/app/src/main/java/info/cemu/Cemu/ButtonStateChangeListener.java b/src/android/app/src/main/java/info/cemu/Cemu/inputoverlay/ButtonStateChangeListener.java similarity index 78% rename from src/android/app/src/main/java/info/cemu/Cemu/ButtonStateChangeListener.java rename to src/android/app/src/main/java/info/cemu/Cemu/inputoverlay/ButtonStateChangeListener.java index 436a0eec..9075eeb3 100644 --- a/src/android/app/src/main/java/info/cemu/Cemu/ButtonStateChangeListener.java +++ b/src/android/app/src/main/java/info/cemu/Cemu/inputoverlay/ButtonStateChangeListener.java @@ -1,4 +1,4 @@ -package info.cemu.Cemu; +package info.cemu.Cemu.inputoverlay; public interface ButtonStateChangeListener { void onButtonStateChange(InputOverlaySurfaceView.OverlayButton button, boolean state); diff --git a/src/android/app/src/main/java/info/cemu/Cemu/DPadInput.java b/src/android/app/src/main/java/info/cemu/Cemu/inputoverlay/DPadInput.java similarity index 99% rename from src/android/app/src/main/java/info/cemu/Cemu/DPadInput.java rename to src/android/app/src/main/java/info/cemu/Cemu/inputoverlay/DPadInput.java index afaec324..56cb56a6 100644 --- a/src/android/app/src/main/java/info/cemu/Cemu/DPadInput.java +++ b/src/android/app/src/main/java/info/cemu/Cemu/inputoverlay/DPadInput.java @@ -1,4 +1,4 @@ -package info.cemu.Cemu; +package info.cemu.Cemu.inputoverlay; import android.content.res.Resources; import android.graphics.Canvas; diff --git a/src/android/app/src/main/java/info/cemu/Cemu/Input.java b/src/android/app/src/main/java/info/cemu/Cemu/inputoverlay/Input.java similarity index 98% rename from src/android/app/src/main/java/info/cemu/Cemu/Input.java rename to src/android/app/src/main/java/info/cemu/Cemu/inputoverlay/Input.java index cfbe9b4e..8ea980c3 100644 --- a/src/android/app/src/main/java/info/cemu/Cemu/Input.java +++ b/src/android/app/src/main/java/info/cemu/Cemu/inputoverlay/Input.java @@ -1,4 +1,4 @@ -package info.cemu.Cemu; +package info.cemu.Cemu.inputoverlay; import android.graphics.Canvas; import android.graphics.Paint; diff --git a/src/android/app/src/main/java/info/cemu/Cemu/InputOverlayConfigureActivity.java b/src/android/app/src/main/java/info/cemu/Cemu/inputoverlay/InputOverlayConfigureActivity.java similarity index 89% rename from src/android/app/src/main/java/info/cemu/Cemu/InputOverlayConfigureActivity.java rename to src/android/app/src/main/java/info/cemu/Cemu/inputoverlay/InputOverlayConfigureActivity.java index b72aa380..ba8b58a6 100644 --- a/src/android/app/src/main/java/info/cemu/Cemu/InputOverlayConfigureActivity.java +++ b/src/android/app/src/main/java/info/cemu/Cemu/inputoverlay/InputOverlayConfigureActivity.java @@ -1,7 +1,9 @@ -package info.cemu.Cemu; +package info.cemu.Cemu.inputoverlay; -import static info.cemu.Cemu.InputOverlaySurfaceView.InputMode.EDIT_POSITION; -import static info.cemu.Cemu.InputOverlaySurfaceView.InputMode.EDIT_SIZE; + + +import static info.cemu.Cemu.inputoverlay.InputOverlaySurfaceView.InputMode.EDIT_POSITION; +import static info.cemu.Cemu.inputoverlay.InputOverlaySurfaceView.InputMode.EDIT_SIZE; import android.os.Bundle; import android.widget.Toast; @@ -11,6 +13,7 @@ import androidx.core.view.WindowCompat; import androidx.core.view.WindowInsetsCompat; import androidx.core.view.WindowInsetsControllerCompat; +import info.cemu.Cemu.R; import info.cemu.Cemu.databinding.ActivityOverlayConfigureBinding; public class InputOverlayConfigureActivity extends AppCompatActivity { diff --git a/src/android/app/src/main/java/info/cemu/Cemu/InputOverlaySettingsFragment.java b/src/android/app/src/main/java/info/cemu/Cemu/inputoverlay/InputOverlaySettingsFragment.java similarity index 88% rename from src/android/app/src/main/java/info/cemu/Cemu/InputOverlaySettingsFragment.java rename to src/android/app/src/main/java/info/cemu/Cemu/inputoverlay/InputOverlaySettingsFragment.java index cbfe3ae8..8c82e498 100644 --- a/src/android/app/src/main/java/info/cemu/Cemu/InputOverlaySettingsFragment.java +++ b/src/android/app/src/main/java/info/cemu/Cemu/inputoverlay/InputOverlaySettingsFragment.java @@ -1,4 +1,4 @@ -package info.cemu.Cemu; +package info.cemu.Cemu.inputoverlay; import android.content.Context; @@ -15,7 +15,15 @@ import androidx.fragment.app.Fragment; import java.util.stream.Collectors; import java.util.stream.IntStream; +import info.cemu.Cemu.R; import info.cemu.Cemu.databinding.GenericRecyclerViewLayoutBinding; +import info.cemu.Cemu.guibasecomponents.ButtonRecyclerViewItem; +import info.cemu.Cemu.guibasecomponents.CheckboxRecyclerViewItem; +import info.cemu.Cemu.guibasecomponents.GenericRecyclerViewAdapter; +import info.cemu.Cemu.guibasecomponents.SelectionAdapter; +import info.cemu.Cemu.guibasecomponents.SingleSelectionRecyclerViewItem; +import info.cemu.Cemu.guibasecomponents.SliderRecyclerViewItem; +import info.cemu.Cemu.NativeLibrary; public class InputOverlaySettingsFragment extends Fragment { @@ -25,10 +33,7 @@ public class InputOverlaySettingsFragment extends Fragment { public void onCreate(@Nullable Bundle savedInstanceState) { super.onCreate(savedInstanceState); if (overlaySettings == null) { - var context = requireContext(); - var sharedPref = context.getSharedPreferences( - context.getString(R.string.inputoverlaysettings_shared_preferences_name), Context.MODE_PRIVATE); - InputOverlaySettingsProvider inputOverlaySettingsProvider = new InputOverlaySettingsProvider(sharedPref); + InputOverlaySettingsProvider inputOverlaySettingsProvider = new InputOverlaySettingsProvider(requireContext()); overlaySettings = inputOverlaySettingsProvider.getOverlaySettings(); } } diff --git a/src/android/app/src/main/java/info/cemu/Cemu/InputOverlaySettingsProvider.java b/src/android/app/src/main/java/info/cemu/Cemu/inputoverlay/InputOverlaySettingsProvider.java similarity index 97% rename from src/android/app/src/main/java/info/cemu/Cemu/InputOverlaySettingsProvider.java rename to src/android/app/src/main/java/info/cemu/Cemu/inputoverlay/InputOverlaySettingsProvider.java index 9c717388..95d5e14f 100644 --- a/src/android/app/src/main/java/info/cemu/Cemu/InputOverlaySettingsProvider.java +++ b/src/android/app/src/main/java/info/cemu/Cemu/inputoverlay/InputOverlaySettingsProvider.java @@ -1,12 +1,15 @@ -package info.cemu.Cemu; +package info.cemu.Cemu.inputoverlay; +import android.content.Context; import android.content.SharedPreferences; import android.graphics.Rect; import java.util.Optional; import java.util.function.Consumer; +import info.cemu.Cemu.NativeLibrary; + public class InputOverlaySettingsProvider { public enum Input { A, @@ -36,8 +39,8 @@ public class InputOverlaySettingsProvider { private static final int defaultAlpha = 64; - public InputOverlaySettingsProvider(SharedPreferences sharedPreferences) { - this.sharedPreferences = sharedPreferences; + public InputOverlaySettingsProvider(Context context) { + this.sharedPreferences = context.getSharedPreferences("settings", Context.MODE_PRIVATE); } public OverlaySettings getOverlaySettings() { diff --git a/src/android/app/src/main/java/info/cemu/Cemu/InputOverlaySurfaceView.java b/src/android/app/src/main/java/info/cemu/Cemu/inputoverlay/InputOverlaySurfaceView.java similarity index 98% rename from src/android/app/src/main/java/info/cemu/Cemu/InputOverlaySurfaceView.java rename to src/android/app/src/main/java/info/cemu/Cemu/inputoverlay/InputOverlaySurfaceView.java index 188f2cf2..c6b61d58 100644 --- a/src/android/app/src/main/java/info/cemu/Cemu/InputOverlaySurfaceView.java +++ b/src/android/app/src/main/java/info/cemu/Cemu/inputoverlay/InputOverlaySurfaceView.java @@ -1,6 +1,5 @@ -package info.cemu.Cemu; +package info.cemu.Cemu.inputoverlay; -import static info.cemu.Cemu.InputOverlaySurfaceView.InputMode.DEFAULT; import android.content.Context; import android.graphics.Canvas; @@ -14,6 +13,9 @@ import android.view.View; import java.util.ArrayList; import java.util.List; +import info.cemu.Cemu.R; +import info.cemu.Cemu.NativeLibrary; + public class InputOverlaySurfaceView extends SurfaceView implements View.OnTouchListener { public enum InputMode { DEFAULT, @@ -21,7 +23,7 @@ public class InputOverlaySurfaceView extends SurfaceView implements View.OnTouch EDIT_SIZE, } - private InputMode inputMode = DEFAULT; + private InputMode inputMode = InputMode.DEFAULT; public void resetInputs() { int width = getWidth(); @@ -39,7 +41,7 @@ public class InputOverlaySurfaceView extends SurfaceView implements View.OnTouch public void setInputMode(InputMode inputMode) { if (inputs != null) { - if (this.inputMode != DEFAULT) { + if (this.inputMode != InputMode.DEFAULT) { for (var input : inputs) { input.saveConfiguration(); } @@ -100,9 +102,7 @@ public class InputOverlaySurfaceView extends SurfaceView implements View.OnTouch context.getSystemService(Context.VIBRATOR_SERVICE); vibrator = (Vibrator) context.getSystemService(Context.VIBRATOR_SERVICE); setOnTouchListener(this); - var sharedPref = context.getSharedPreferences( - getContext().getString(R.string.inputoverlaysettings_shared_preferences_name), Context.MODE_PRIVATE); - settingsProvider = new InputOverlaySettingsProvider(sharedPref); + settingsProvider = new InputOverlaySettingsProvider(context); var overlaySettings = settingsProvider.getOverlaySettings(); controllerIndex = overlaySettings.getControllerIndex(); vibrateOnTouch = vibrator != null && vibrator.hasVibrator() && overlaySettings.isVibrateOnTouchEnabled(); @@ -550,7 +550,7 @@ public class InputOverlaySurfaceView extends SurfaceView implements View.OnTouch @Override public boolean onTouch(View v, MotionEvent event) { boolean touchEventProcessed = false; - if (inputMode == DEFAULT) { + if (inputMode == InputMode.DEFAULT) { for (var input : inputs) { if (input.onTouch(event)) touchEventProcessed = true; } diff --git a/src/android/app/src/main/java/info/cemu/Cemu/Joystick.java b/src/android/app/src/main/java/info/cemu/Cemu/inputoverlay/Joystick.java similarity index 99% rename from src/android/app/src/main/java/info/cemu/Cemu/Joystick.java rename to src/android/app/src/main/java/info/cemu/Cemu/inputoverlay/Joystick.java index 190de4f7..3539a97f 100644 --- a/src/android/app/src/main/java/info/cemu/Cemu/Joystick.java +++ b/src/android/app/src/main/java/info/cemu/Cemu/inputoverlay/Joystick.java @@ -1,4 +1,4 @@ -package info.cemu.Cemu; +package info.cemu.Cemu.inputoverlay; import android.content.res.Resources; import android.graphics.Canvas; diff --git a/src/android/app/src/main/java/info/cemu/Cemu/RectangleButton.java b/src/android/app/src/main/java/info/cemu/Cemu/inputoverlay/RectangleButton.java similarity index 96% rename from src/android/app/src/main/java/info/cemu/Cemu/RectangleButton.java rename to src/android/app/src/main/java/info/cemu/Cemu/inputoverlay/RectangleButton.java index 58a0d8a9..b199d6f7 100644 --- a/src/android/app/src/main/java/info/cemu/Cemu/RectangleButton.java +++ b/src/android/app/src/main/java/info/cemu/Cemu/inputoverlay/RectangleButton.java @@ -1,4 +1,4 @@ -package info.cemu.Cemu; +package info.cemu.Cemu.inputoverlay; import android.content.res.Resources; diff --git a/src/android/app/src/main/java/info/cemu/Cemu/RoundButton.java b/src/android/app/src/main/java/info/cemu/Cemu/inputoverlay/RoundButton.java similarity index 97% rename from src/android/app/src/main/java/info/cemu/Cemu/RoundButton.java rename to src/android/app/src/main/java/info/cemu/Cemu/inputoverlay/RoundButton.java index fb98bc4c..a4bb0f64 100644 --- a/src/android/app/src/main/java/info/cemu/Cemu/RoundButton.java +++ b/src/android/app/src/main/java/info/cemu/Cemu/inputoverlay/RoundButton.java @@ -1,4 +1,4 @@ -package info.cemu.Cemu; +package info.cemu.Cemu.inputoverlay; import android.content.res.Resources; import android.graphics.Rect; diff --git a/src/android/app/src/main/java/info/cemu/Cemu/OptionsFragment.java b/src/android/app/src/main/java/info/cemu/Cemu/settings/OptionsFragment.java similarity index 81% rename from src/android/app/src/main/java/info/cemu/Cemu/OptionsFragment.java rename to src/android/app/src/main/java/info/cemu/Cemu/settings/OptionsFragment.java index 184f434d..a0e1f9b1 100644 --- a/src/android/app/src/main/java/info/cemu/Cemu/OptionsFragment.java +++ b/src/android/app/src/main/java/info/cemu/Cemu/settings/OptionsFragment.java @@ -1,10 +1,8 @@ -package info.cemu.Cemu; +package info.cemu.Cemu.settings; import static android.app.Activity.RESULT_OK; -import android.content.Context; import android.content.Intent; -import android.content.SharedPreferences; import android.net.Uri; import android.os.Bundle; import android.view.LayoutInflater; @@ -14,14 +12,28 @@ import android.view.ViewGroup; import androidx.activity.result.ActivityResultLauncher; import androidx.activity.result.contract.ActivityResultContracts; import androidx.annotation.NonNull; +import androidx.annotation.Nullable; import androidx.documentfile.provider.DocumentFile; import androidx.fragment.app.Fragment; import androidx.navigation.fragment.NavHostFragment; +import java.util.Objects; + +import info.cemu.Cemu.R; import info.cemu.Cemu.databinding.FragmentOptionsBinding; +import info.cemu.Cemu.guibasecomponents.ButtonRecyclerViewItem; +import info.cemu.Cemu.guibasecomponents.GenericRecyclerViewAdapter; +import info.cemu.Cemu.guibasecomponents.SimpleButtonRecyclerViewItem; public class OptionsFragment extends Fragment { private ActivityResultLauncher folderSelectionLauncher; + private SettingsManager settingsManager; + + @Override + public void onCreate(@Nullable Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + settingsManager = new SettingsManager(requireContext()); + } @Override public View onCreateView(@NonNull LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { @@ -31,15 +43,12 @@ public class OptionsFragment extends Fragment { if (result.getResultCode() == RESULT_OK) { Intent data = result.getData(); if (data != null) { - Uri uri = data.getData(); + Uri uri = Objects.requireNonNull(data.getData()); requireActivity().getContentResolver().takePersistableUriPermission(uri, Intent.FLAG_GRANT_READ_URI_PERMISSION | Intent.FLAG_GRANT_WRITE_URI_PERMISSION); DocumentFile documentFile = DocumentFile.fromTreeUri(requireContext(), uri); if (documentFile == null) return; - String gamePath = documentFile.getUri().toString(); - NativeLibrary.addGamePath(gamePath); - SharedPreferences.Editor preferencesEditor = requireActivity().getSharedPreferences(CemuPreferences.PREFERENCES_NAME, Context.MODE_PRIVATE).edit(); - preferencesEditor.putString(CemuPreferences.GAMES_PATH_KEY, gamePath); - preferencesEditor.apply(); + String gamesPath = documentFile.getUri().toString(); + settingsManager.setGamesPath(gamesPath); } } }); diff --git a/src/android/app/src/main/java/info/cemu/Cemu/SettingsActivity.java b/src/android/app/src/main/java/info/cemu/Cemu/settings/SettingsActivity.java similarity index 93% rename from src/android/app/src/main/java/info/cemu/Cemu/SettingsActivity.java rename to src/android/app/src/main/java/info/cemu/Cemu/settings/SettingsActivity.java index 4a067afb..0648ddfd 100644 --- a/src/android/app/src/main/java/info/cemu/Cemu/SettingsActivity.java +++ b/src/android/app/src/main/java/info/cemu/Cemu/settings/SettingsActivity.java @@ -1,16 +1,14 @@ -package info.cemu.Cemu; +package info.cemu.Cemu.settings; import android.os.Bundle; import androidx.appcompat.app.AppCompatActivity; import androidx.navigation.NavController; -import androidx.navigation.NavGraph; import androidx.navigation.Navigation; import androidx.navigation.ui.AppBarConfiguration; import androidx.navigation.ui.NavigationUI; -import java.util.Objects; - +import info.cemu.Cemu.R; import info.cemu.Cemu.databinding.ActivitySettingsBinding; public class SettingsActivity extends AppCompatActivity { diff --git a/src/android/app/src/main/java/info/cemu/Cemu/settings/SettingsManager.java b/src/android/app/src/main/java/info/cemu/Cemu/settings/SettingsManager.java new file mode 100644 index 00000000..b0d31e45 --- /dev/null +++ b/src/android/app/src/main/java/info/cemu/Cemu/settings/SettingsManager.java @@ -0,0 +1,22 @@ +package info.cemu.Cemu.settings; + +import android.content.Context; +import android.content.SharedPreferences; + +public class SettingsManager { + public static final String PREFERENCES_NAME = "CEMU_PREFERENCES"; + public static final String GAMES_PATH_KEY = "GAME_PATHS_KEY"; + private final SharedPreferences sharedPreferences; + + public SettingsManager(Context context) { + sharedPreferences = context.getSharedPreferences(PREFERENCES_NAME, Context.MODE_PRIVATE); + } + + public String getGamesPath() { + return sharedPreferences.getString(GAMES_PATH_KEY, null); + } + + public void setGamesPath(String gamesPath) { + sharedPreferences.edit().putString(GAMES_PATH_KEY, gamesPath).apply(); + } +} diff --git a/src/android/app/src/main/java/info/cemu/Cemu/AudioSettingsFragment.java b/src/android/app/src/main/java/info/cemu/Cemu/settings/audio/AudioSettingsFragment.java similarity index 75% rename from src/android/app/src/main/java/info/cemu/Cemu/AudioSettingsFragment.java rename to src/android/app/src/main/java/info/cemu/Cemu/settings/audio/AudioSettingsFragment.java index 563c08f7..e0102785 100644 --- a/src/android/app/src/main/java/info/cemu/Cemu/AudioSettingsFragment.java +++ b/src/android/app/src/main/java/info/cemu/Cemu/settings/audio/AudioSettingsFragment.java @@ -1,4 +1,4 @@ -package info.cemu.Cemu; +package info.cemu.Cemu.settings.audio; import android.os.Bundle; import android.view.LayoutInflater; @@ -12,10 +12,25 @@ import java.util.List; import java.util.stream.Collectors; import java.util.stream.Stream; +import info.cemu.Cemu.R; import info.cemu.Cemu.databinding.GenericRecyclerViewLayoutBinding; +import info.cemu.Cemu.guibasecomponents.CheckboxRecyclerViewItem; +import info.cemu.Cemu.guibasecomponents.GenericRecyclerViewAdapter; +import info.cemu.Cemu.guibasecomponents.SelectionAdapter; +import info.cemu.Cemu.guibasecomponents.SingleSelectionRecyclerViewItem; +import info.cemu.Cemu.guibasecomponents.SliderRecyclerViewItem; +import info.cemu.Cemu.NativeLibrary; public class AudioSettingsFragment extends Fragment { + private static int channelsToResourceNameId(int channels) { + return switch (channels) { + case NativeLibrary.AUDIO_CHANNELS_MONO -> R.string.mono; + case NativeLibrary.AUDIO_CHANNELS_STEREO -> R.string.stereo; + case NativeLibrary.AUDIO_CHANNELS_SURROUND -> R.string.surround; + default -> throw new IllegalArgumentException("Invalid channels type: " + channels); + }; + } @Override public View onCreateView(@NonNull LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { var binding = GenericRecyclerViewLayoutBinding.inflate(inflater, container, false); @@ -28,15 +43,15 @@ public class AudioSettingsFragment extends Fragment { genericRecyclerViewAdapter.addRecyclerViewItem(tvDeviceCheckbox); var tvChannelsChoices = Stream.of(NativeLibrary.AUDIO_CHANNELS_MONO, NativeLibrary.AUDIO_CHANNELS_STEREO, NativeLibrary.AUDIO_CHANNELS_SURROUND) - .map(channels -> new SelectionAdapter.ChoiceItem<>(t -> t.setText(NativeLibrary.channelsToResourceNameId(channels)), channels)) + .map(channels -> new SelectionAdapter.ChoiceItem<>(t -> t.setText(channelsToResourceNameId(channels)), channels)) .collect(Collectors.toList()); int tvChannels = NativeLibrary.getAudioDeviceChannels(true); SelectionAdapter tvChannelsSelectionAdapter = new SelectionAdapter<>(tvChannelsChoices, tvChannels); SingleSelectionRecyclerViewItem tvChannelsModeSelection = new SingleSelectionRecyclerViewItem<>(getString(R.string.tv_channels), - getString(NativeLibrary.channelsToResourceNameId(tvChannels)), tvChannelsSelectionAdapter, + getString(channelsToResourceNameId(tvChannels)), tvChannelsSelectionAdapter, (channels, selectionRecyclerViewItem) -> { NativeLibrary.setAudioDeviceChannels(channels, true); - selectionRecyclerViewItem.setDescription(getString(NativeLibrary.channelsToResourceNameId(channels))); + selectionRecyclerViewItem.setDescription(getString(channelsToResourceNameId(channels))); }); genericRecyclerViewAdapter.addRecyclerViewItem(tvChannelsModeSelection); @@ -53,14 +68,14 @@ public class AudioSettingsFragment extends Fragment { checked -> NativeLibrary.setAudioDeviceEnabled(checked, true)); genericRecyclerViewAdapter.addRecyclerViewItem(padDeviceCheckbox); - var gamepadChannelsChoices = List.of(new SelectionAdapter.ChoiceItem<>(t -> t.setText(NativeLibrary.channelsToResourceNameId(NativeLibrary.AUDIO_CHANNELS_STEREO)), NativeLibrary.AUDIO_CHANNELS_STEREO)); + var gamepadChannelsChoices = List.of(new SelectionAdapter.ChoiceItem<>(t -> t.setText(channelsToResourceNameId(NativeLibrary.AUDIO_CHANNELS_STEREO)), NativeLibrary.AUDIO_CHANNELS_STEREO)); int gamepadChannels = NativeLibrary.getAudioDeviceChannels(false); SelectionAdapter gamepadChannelsSelectionAdapter = new SelectionAdapter<>(gamepadChannelsChoices, gamepadChannels); SingleSelectionRecyclerViewItem gamepadChannelsModeSelection = new SingleSelectionRecyclerViewItem<>(getString(R.string.gamepad_channels), - getString(NativeLibrary.channelsToResourceNameId(gamepadChannels)), gamepadChannelsSelectionAdapter, + getString(channelsToResourceNameId(gamepadChannels)), gamepadChannelsSelectionAdapter, (channels, selectionRecyclerViewItem) -> { NativeLibrary.setAudioDeviceChannels(channels, false); - selectionRecyclerViewItem.setDescription(getString(NativeLibrary.channelsToResourceNameId(channels))); + selectionRecyclerViewItem.setDescription(getString(channelsToResourceNameId(channels))); }); genericRecyclerViewAdapter.addRecyclerViewItem(gamepadChannelsModeSelection); diff --git a/src/android/app/src/main/java/info/cemu/Cemu/GraphicPackItemRecyclerViewItem.java b/src/android/app/src/main/java/info/cemu/Cemu/settings/graphicpacks/GraphicPackItemRecyclerViewItem.java similarity index 94% rename from src/android/app/src/main/java/info/cemu/Cemu/GraphicPackItemRecyclerViewItem.java rename to src/android/app/src/main/java/info/cemu/Cemu/settings/graphicpacks/GraphicPackItemRecyclerViewItem.java index 6c957253..f2f02b2e 100644 --- a/src/android/app/src/main/java/info/cemu/Cemu/GraphicPackItemRecyclerViewItem.java +++ b/src/android/app/src/main/java/info/cemu/Cemu/settings/graphicpacks/GraphicPackItemRecyclerViewItem.java @@ -1,4 +1,4 @@ -package info.cemu.Cemu; +package info.cemu.Cemu.settings.graphicpacks; import android.view.LayoutInflater; import android.view.View; @@ -8,6 +8,9 @@ import android.widget.TextView; import androidx.recyclerview.widget.RecyclerView; +import info.cemu.Cemu.R; +import info.cemu.Cemu.guibasecomponents.RecyclerViewItem; + public class GraphicPackItemRecyclerViewItem implements RecyclerViewItem { private static class HeaderViewHolder extends RecyclerView.ViewHolder { diff --git a/src/android/app/src/main/java/info/cemu/Cemu/GraphicPackRecyclerViewItem.java b/src/android/app/src/main/java/info/cemu/Cemu/settings/graphicpacks/GraphicPackRecyclerViewItem.java similarity index 92% rename from src/android/app/src/main/java/info/cemu/Cemu/GraphicPackRecyclerViewItem.java rename to src/android/app/src/main/java/info/cemu/Cemu/settings/graphicpacks/GraphicPackRecyclerViewItem.java index 1a395b8e..b3f24af6 100644 --- a/src/android/app/src/main/java/info/cemu/Cemu/GraphicPackRecyclerViewItem.java +++ b/src/android/app/src/main/java/info/cemu/Cemu/settings/graphicpacks/GraphicPackRecyclerViewItem.java @@ -1,15 +1,17 @@ -package info.cemu.Cemu; +package info.cemu.Cemu.settings.graphicpacks; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.TextView; -import androidx.annotation.NonNull; import androidx.recyclerview.widget.RecyclerView; import com.google.android.material.checkbox.MaterialCheckBox; -import com.google.android.material.dialog.MaterialAlertDialogBuilder; + +import info.cemu.Cemu.R; +import info.cemu.Cemu.guibasecomponents.RecyclerViewItem; +import info.cemu.Cemu.NativeLibrary; public class GraphicPackRecyclerViewItem implements RecyclerViewItem { private static class GraphicPackViewHolder extends RecyclerView.ViewHolder { diff --git a/src/android/app/src/main/java/info/cemu/Cemu/GraphicPacksFragment.java b/src/android/app/src/main/java/info/cemu/Cemu/settings/graphicpacks/GraphicPacksFragment.java similarity index 94% rename from src/android/app/src/main/java/info/cemu/Cemu/GraphicPacksFragment.java rename to src/android/app/src/main/java/info/cemu/Cemu/settings/graphicpacks/GraphicPacksFragment.java index ba02cdc7..fed02901 100644 --- a/src/android/app/src/main/java/info/cemu/Cemu/GraphicPacksFragment.java +++ b/src/android/app/src/main/java/info/cemu/Cemu/settings/graphicpacks/GraphicPacksFragment.java @@ -1,4 +1,4 @@ -package info.cemu.Cemu; +package info.cemu.Cemu.settings.graphicpacks; import android.os.Bundle; import android.view.LayoutInflater; @@ -16,7 +16,12 @@ import java.util.ArrayList; import java.util.Objects; import java.util.stream.IntStream; +import info.cemu.Cemu.R; import info.cemu.Cemu.databinding.GenericRecyclerViewLayoutBinding; +import info.cemu.Cemu.guibasecomponents.GenericRecyclerViewAdapter; +import info.cemu.Cemu.guibasecomponents.SingleSelectionRecyclerViewItem; +import info.cemu.Cemu.guibasecomponents.StringSelectionAdapter; +import info.cemu.Cemu.NativeLibrary; public class GraphicPacksFragment extends Fragment { private final GenericRecyclerViewAdapter genericRecyclerViewAdapter = new GenericRecyclerViewAdapter(); diff --git a/src/android/app/src/main/java/info/cemu/Cemu/GraphicPacksRecyclerViewAdapter.java b/src/android/app/src/main/java/info/cemu/Cemu/settings/graphicpacks/GraphicPacksRecyclerViewAdapter.java similarity index 97% rename from src/android/app/src/main/java/info/cemu/Cemu/GraphicPacksRecyclerViewAdapter.java rename to src/android/app/src/main/java/info/cemu/Cemu/settings/graphicpacks/GraphicPacksRecyclerViewAdapter.java index bdce8cf4..db1b1434 100644 --- a/src/android/app/src/main/java/info/cemu/Cemu/GraphicPacksRecyclerViewAdapter.java +++ b/src/android/app/src/main/java/info/cemu/Cemu/settings/graphicpacks/GraphicPacksRecyclerViewAdapter.java @@ -1,4 +1,4 @@ -package info.cemu.Cemu; +package info.cemu.Cemu.settings.graphicpacks; import static java.util.regex.Pattern.CASE_INSENSITIVE; @@ -17,6 +17,9 @@ import java.util.List; import java.util.regex.Pattern; import java.util.stream.Collectors; +import info.cemu.Cemu.R; +import info.cemu.Cemu.guibasecomponents.RecyclerViewItem; + public class GraphicPacksRecyclerViewAdapter extends RecyclerView.Adapter { private static class GraphicPackSearchItemRecyclerViewItem implements RecyclerViewItem { diff --git a/src/android/app/src/main/java/info/cemu/Cemu/GraphicPacksRootFragment.java b/src/android/app/src/main/java/info/cemu/Cemu/settings/graphicpacks/GraphicPacksRootFragment.java similarity index 98% rename from src/android/app/src/main/java/info/cemu/Cemu/GraphicPacksRootFragment.java rename to src/android/app/src/main/java/info/cemu/Cemu/settings/graphicpacks/GraphicPacksRootFragment.java index efd3dd4a..7016af5d 100644 --- a/src/android/app/src/main/java/info/cemu/Cemu/GraphicPacksRootFragment.java +++ b/src/android/app/src/main/java/info/cemu/Cemu/settings/graphicpacks/GraphicPacksRootFragment.java @@ -1,4 +1,4 @@ -package info.cemu.Cemu; +package info.cemu.Cemu.settings.graphicpacks; import android.os.Bundle; import android.view.LayoutInflater; @@ -38,7 +38,12 @@ import java.util.List; import java.util.Objects; import java.util.Optional; +import info.cemu.Cemu.R; import info.cemu.Cemu.databinding.GenericRecyclerViewLayoutBinding; +import info.cemu.Cemu.guibasecomponents.GenericRecyclerViewAdapter; +import info.cemu.Cemu.NativeLibrary; +import info.cemu.Cemu.utils.FileUtil; +import info.cemu.Cemu.utils.ZipUtil; import okhttp3.Call; import okhttp3.Callback; import okhttp3.OkHttpClient; diff --git a/src/android/app/src/main/java/info/cemu/Cemu/GraphicsSettingsFragment.java b/src/android/app/src/main/java/info/cemu/Cemu/settings/graphics/GraphicsSettingsFragment.java similarity index 68% rename from src/android/app/src/main/java/info/cemu/Cemu/GraphicsSettingsFragment.java rename to src/android/app/src/main/java/info/cemu/Cemu/settings/graphics/GraphicsSettingsFragment.java index e2ded6f4..f1653508 100644 --- a/src/android/app/src/main/java/info/cemu/Cemu/GraphicsSettingsFragment.java +++ b/src/android/app/src/main/java/info/cemu/Cemu/settings/graphics/GraphicsSettingsFragment.java @@ -1,4 +1,4 @@ -package info.cemu.Cemu; +package info.cemu.Cemu.settings.graphics; import android.os.Bundle; import android.view.LayoutInflater; @@ -6,14 +6,29 @@ import android.view.View; import android.view.ViewGroup; import androidx.annotation.NonNull; +import androidx.annotation.StringRes; import androidx.fragment.app.Fragment; import java.util.stream.Collectors; import java.util.stream.Stream; +import info.cemu.Cemu.R; import info.cemu.Cemu.databinding.GenericRecyclerViewLayoutBinding; +import info.cemu.Cemu.guibasecomponents.CheckboxRecyclerViewItem; +import info.cemu.Cemu.guibasecomponents.GenericRecyclerViewAdapter; +import info.cemu.Cemu.guibasecomponents.SelectionAdapter; +import info.cemu.Cemu.guibasecomponents.SingleSelectionRecyclerViewItem; +import info.cemu.Cemu.NativeLibrary; public class GraphicsSettingsFragment extends Fragment { + private static int vsyncModeToResourceNameId(int vsyncMode) { + return switch (vsyncMode) { + case NativeLibrary.VSYNC_MODE_OFF -> R.string.off; + case NativeLibrary.VSYNC_MODE_DOUBLE_BUFFERING -> R.string.double_buffering; + case NativeLibrary.VSYNC_MODE_TRIPLE_BUFFERING -> R.string.triple_buffering; + default -> throw new IllegalArgumentException("Invalid vsync mode: " + vsyncMode); + }; + } @Override public View onCreateView(@NonNull LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { @@ -26,14 +41,14 @@ public class GraphicsSettingsFragment extends Fragment { int vsyncMode = NativeLibrary.getVSyncMode(); var vsyncChoices = Stream.of(NativeLibrary.VSYNC_MODE_OFF, NativeLibrary.VSYNC_MODE_DOUBLE_BUFFERING, NativeLibrary.VSYNC_MODE_TRIPLE_BUFFERING) - .map(vsync -> new SelectionAdapter.ChoiceItem<>(t -> t.setText(NativeLibrary.vsyncModeToResourceNameId(vsync)), vsync)) + .map(vsync -> new SelectionAdapter.ChoiceItem<>(t -> t.setText(vsyncModeToResourceNameId(vsync)), vsync)) .collect(Collectors.toList()); SelectionAdapter vsyncSelectionAdapter = new SelectionAdapter<>(vsyncChoices, vsyncMode); SingleSelectionRecyclerViewItem vsyncModeSelection = new SingleSelectionRecyclerViewItem<>(getString(R.string.vsync), - getString(NativeLibrary.vsyncModeToResourceNameId(vsyncMode)), vsyncSelectionAdapter, + getString(vsyncModeToResourceNameId(vsyncMode)), vsyncSelectionAdapter, (vsync, selectionRecyclerViewItem) -> { NativeLibrary.setVSyncMode(vsync); - selectionRecyclerViewItem.setDescription(getString(NativeLibrary.vsyncModeToResourceNameId(vsync))); + selectionRecyclerViewItem.setDescription(getString(vsyncModeToResourceNameId(vsync))); }); genericRecyclerViewAdapter.addRecyclerViewItem(vsyncModeSelection); diff --git a/src/android/app/src/main/java/info/cemu/Cemu/ControllerInputsDataProvider.java b/src/android/app/src/main/java/info/cemu/Cemu/settings/input/ControllerInputsDataProvider.java similarity index 95% rename from src/android/app/src/main/java/info/cemu/Cemu/ControllerInputsDataProvider.java rename to src/android/app/src/main/java/info/cemu/Cemu/settings/input/ControllerInputsDataProvider.java index 950f7994..e2b7e05d 100644 --- a/src/android/app/src/main/java/info/cemu/Cemu/ControllerInputsDataProvider.java +++ b/src/android/app/src/main/java/info/cemu/Cemu/settings/input/ControllerInputsDataProvider.java @@ -1,10 +1,13 @@ -package info.cemu.Cemu; +package info.cemu.Cemu.settings.input; import java.util.ArrayList; import java.util.List; import java.util.Map; import java.util.stream.Collectors; +import info.cemu.Cemu.R; +import info.cemu.Cemu.NativeLibrary; + public class ControllerInputsDataProvider { private int getButtonResourceIdName(int controllerType, int buttonId) { if (controllerType == NativeLibrary.EMULATED_CONTROLLER_TYPE_VPAD) { @@ -37,7 +40,7 @@ public class ControllerInputsDataProvider { case NativeLibrary.VPAD_BUTTON_SCREEN -> R.string.button_screen; case NativeLibrary.VPAD_BUTTON_HOME -> R.string.button_home; default -> - throw new RuntimeException("Invalid buttonId " + buttonId + " for controllerType " + controllerType); + throw new IllegalArgumentException("Invalid buttonId " + buttonId + " for controllerType " + controllerType); }; } if (controllerType == NativeLibrary.EMULATED_CONTROLLER_TYPE_PRO) { @@ -68,7 +71,7 @@ public class ControllerInputsDataProvider { case NativeLibrary.PRO_BUTTON_STICKR_LEFT -> R.string.button_stickr_left; case NativeLibrary.PRO_BUTTON_STICKR_RIGHT -> R.string.button_stickr_right; default -> - throw new RuntimeException("Invalid buttonId " + buttonId + " for controllerType " + controllerType); + throw new IllegalArgumentException("Invalid buttonId " + buttonId + " for controllerType " + controllerType); }; } if (controllerType == NativeLibrary.EMULATED_CONTROLLER_TYPE_CLASSIC) { @@ -97,7 +100,7 @@ public class ControllerInputsDataProvider { case NativeLibrary.CLASSIC_BUTTON_STICKR_LEFT -> R.string.button_stickr_left; case NativeLibrary.CLASSIC_BUTTON_STICKR_RIGHT -> R.string.button_stickr_right; default -> - throw new RuntimeException("Invalid buttonId " + buttonId + " for controllerType " + controllerType); + throw new IllegalArgumentException("Invalid buttonId " + buttonId + " for controllerType " + controllerType); }; } if (controllerType == NativeLibrary.EMULATED_CONTROLLER_TYPE_WIIMOTE) { @@ -120,10 +123,10 @@ public class ControllerInputsDataProvider { case NativeLibrary.WIIMOTE_BUTTON_NUNCHUCK_RIGHT -> R.string.button_nunchuck_right; case NativeLibrary.WIIMOTE_BUTTON_HOME -> R.string.button_home; default -> - throw new RuntimeException("Invalid buttonId " + buttonId + " for controllerType " + controllerType); + throw new IllegalArgumentException("Invalid buttonId " + buttonId + " for controllerType " + controllerType); }; } - throw new RuntimeException("Invalid controllerType " + controllerType); + throw new IllegalArgumentException("Invalid controllerType " + controllerType); } public static class ControllerInput { diff --git a/src/android/app/src/main/java/info/cemu/Cemu/ControllerInputsFragment.java b/src/android/app/src/main/java/info/cemu/Cemu/settings/input/ControllerInputsFragment.java similarity index 92% rename from src/android/app/src/main/java/info/cemu/Cemu/ControllerInputsFragment.java rename to src/android/app/src/main/java/info/cemu/Cemu/settings/input/ControllerInputsFragment.java index 41a93f32..81fc476a 100644 --- a/src/android/app/src/main/java/info/cemu/Cemu/ControllerInputsFragment.java +++ b/src/android/app/src/main/java/info/cemu/Cemu/settings/input/ControllerInputsFragment.java @@ -1,4 +1,4 @@ -package info.cemu.Cemu; +package info.cemu.Cemu.settings.input; import android.os.Bundle; import android.view.LayoutInflater; @@ -15,7 +15,13 @@ import androidx.fragment.app.Fragment; import java.util.HashMap; import java.util.Map; +import info.cemu.Cemu.R; import info.cemu.Cemu.databinding.GenericRecyclerViewLayoutBinding; +import info.cemu.Cemu.guibasecomponents.GenericRecyclerViewAdapter; +import info.cemu.Cemu.guibasecomponents.HeaderRecyclerViewItem; +import info.cemu.Cemu.guibasecomponents.SingleSelectionRecyclerViewItem; +import info.cemu.Cemu.input.InputManager; +import info.cemu.Cemu.NativeLibrary; public class ControllerInputsFragment extends Fragment { public static final String CONTROLLER_INDEX = "ControllerIndex"; @@ -37,7 +43,7 @@ public class ControllerInputsFragment extends Fragment { private void setControllerInputs(Map inputs) { emulatedControllerTypeAdapter.setSelectedValue(controllerType); emulatedControllerTypeAdapter.setControllerTypeCounts(NativeLibrary.getVPADControllersCount(), NativeLibrary.getWPADControllersCount()); - String controllerTypeName = getString(NativeLibrary.controllerTypeToResourceNameId(controllerType)); + String controllerTypeName = getString(ControllerTypeResourceNameMapper.controllerTypeToResourceNameId(controllerType)); SingleSelectionRecyclerViewItem emulatedControllerSelection = new SingleSelectionRecyclerViewItem<>(getString(R.string.emulated_controller_label), getString(R.string.emulated_controller_selection_description, controllerTypeName), diff --git a/src/android/app/src/main/java/info/cemu/Cemu/settings/input/ControllerTypeResourceNameMapper.java b/src/android/app/src/main/java/info/cemu/Cemu/settings/input/ControllerTypeResourceNameMapper.java new file mode 100644 index 00000000..8ff92075 --- /dev/null +++ b/src/android/app/src/main/java/info/cemu/Cemu/settings/input/ControllerTypeResourceNameMapper.java @@ -0,0 +1,18 @@ +package info.cemu.Cemu.settings.input; + +import info.cemu.Cemu.R; +import info.cemu.Cemu.NativeLibrary; + +public class ControllerTypeResourceNameMapper { + public static int controllerTypeToResourceNameId(int type) { + return switch (type) { + case NativeLibrary.EMULATED_CONTROLLER_TYPE_DISABLED -> R.string.disabled; + case NativeLibrary.EMULATED_CONTROLLER_TYPE_VPAD -> R.string.vpad_controller; + case NativeLibrary.EMULATED_CONTROLLER_TYPE_PRO -> R.string.pro_controller; + case NativeLibrary.EMULATED_CONTROLLER_TYPE_WIIMOTE -> R.string.wiimote_controller; + case NativeLibrary.EMULATED_CONTROLLER_TYPE_CLASSIC -> R.string.classic_controller; + default -> throw new IllegalArgumentException("Invalid controller type: " + type); + }; + } + +} diff --git a/src/android/app/src/main/java/info/cemu/Cemu/EmulatedControllerTypeAdapter.java b/src/android/app/src/main/java/info/cemu/Cemu/settings/input/EmulatedControllerTypeAdapter.java similarity index 85% rename from src/android/app/src/main/java/info/cemu/Cemu/EmulatedControllerTypeAdapter.java rename to src/android/app/src/main/java/info/cemu/Cemu/settings/input/EmulatedControllerTypeAdapter.java index e86a4a25..e398ea52 100644 --- a/src/android/app/src/main/java/info/cemu/Cemu/EmulatedControllerTypeAdapter.java +++ b/src/android/app/src/main/java/info/cemu/Cemu/settings/input/EmulatedControllerTypeAdapter.java @@ -1,9 +1,12 @@ -package info.cemu.Cemu; +package info.cemu.Cemu.settings.input; import java.util.stream.Collectors; import java.util.stream.Stream; +import info.cemu.Cemu.guibasecomponents.SelectionAdapter; +import info.cemu.Cemu.NativeLibrary; + public class EmulatedControllerTypeAdapter extends SelectionAdapter { private int vpadCount = 0; private int wpadCount = 0; @@ -14,7 +17,7 @@ public class EmulatedControllerTypeAdapter extends SelectionAdapter { NativeLibrary.EMULATED_CONTROLLER_TYPE_PRO, NativeLibrary.EMULATED_CONTROLLER_TYPE_CLASSIC, NativeLibrary.EMULATED_CONTROLLER_TYPE_WIIMOTE) - .map(type -> new ChoiceItem<>(t->t.setText(NativeLibrary.controllerTypeToResourceNameId(type)), type)) + .map(type -> new ChoiceItem<>(t->t.setText(ControllerTypeResourceNameMapper.controllerTypeToResourceNameId(type)), type)) .collect(Collectors.toList()); setSelectedValue(NativeLibrary.EMULATED_CONTROLLER_TYPE_DISABLED); } diff --git a/src/android/app/src/main/java/info/cemu/Cemu/InputRecyclerViewItem.java b/src/android/app/src/main/java/info/cemu/Cemu/settings/input/InputRecyclerViewItem.java similarity index 94% rename from src/android/app/src/main/java/info/cemu/Cemu/InputRecyclerViewItem.java rename to src/android/app/src/main/java/info/cemu/Cemu/settings/input/InputRecyclerViewItem.java index e026330a..8a7d549b 100644 --- a/src/android/app/src/main/java/info/cemu/Cemu/InputRecyclerViewItem.java +++ b/src/android/app/src/main/java/info/cemu/Cemu/settings/input/InputRecyclerViewItem.java @@ -1,4 +1,4 @@ -package info.cemu.Cemu; +package info.cemu.Cemu.settings.input; import android.view.LayoutInflater; import android.view.View; @@ -7,6 +7,9 @@ import android.widget.TextView; import androidx.recyclerview.widget.RecyclerView; +import info.cemu.Cemu.R; +import info.cemu.Cemu.guibasecomponents.RecyclerViewItem; + public class InputRecyclerViewItem implements RecyclerViewItem { public interface OnInputClickListener { void onInputClick(InputRecyclerViewItem inputRecyclerViewItem); diff --git a/src/android/app/src/main/java/info/cemu/Cemu/InputSettingsFragment.java b/src/android/app/src/main/java/info/cemu/Cemu/settings/input/InputSettingsFragment.java similarity index 83% rename from src/android/app/src/main/java/info/cemu/Cemu/InputSettingsFragment.java rename to src/android/app/src/main/java/info/cemu/Cemu/settings/input/InputSettingsFragment.java index f60af96b..c29b6c8a 100644 --- a/src/android/app/src/main/java/info/cemu/Cemu/InputSettingsFragment.java +++ b/src/android/app/src/main/java/info/cemu/Cemu/settings/input/InputSettingsFragment.java @@ -1,4 +1,4 @@ -package info.cemu.Cemu; +package info.cemu.Cemu.settings.input; import android.os.Bundle; @@ -11,7 +11,12 @@ import androidx.annotation.Nullable; import androidx.fragment.app.Fragment; import androidx.navigation.fragment.NavHostFragment; +import info.cemu.Cemu.R; import info.cemu.Cemu.databinding.GenericRecyclerViewLayoutBinding; +import info.cemu.Cemu.guibasecomponents.ButtonRecyclerViewItem; +import info.cemu.Cemu.guibasecomponents.GenericRecyclerViewAdapter; +import info.cemu.Cemu.guibasecomponents.SimpleButtonRecyclerViewItem; +import info.cemu.Cemu.NativeLibrary; public class InputSettingsFragment extends Fragment { @@ -26,7 +31,7 @@ public class InputSettingsFragment extends Fragment { for (int index = 0; index < NativeLibrary.MAX_CONTROLLERS; index++) { int controllerIndex = index; int controllerType = NativeLibrary.isControllerDisabled(controllerIndex) ? NativeLibrary.EMULATED_CONTROLLER_TYPE_DISABLED : NativeLibrary.getControllerType(controllerIndex); - String controllerTypeName = getString(NativeLibrary.controllerTypeToResourceNameId(controllerType)); + String controllerTypeName = getString(ControllerTypeResourceNameMapper.controllerTypeToResourceNameId(controllerType)); ButtonRecyclerViewItem buttonRecyclerViewItem = new ButtonRecyclerViewItem( getString(R.string.controller_numbered, controllerIndex + 1), getString(R.string.emulated_controller_with_type, controllerTypeName), diff --git a/src/android/app/src/main/java/info/cemu/Cemu/MotionDialog.java b/src/android/app/src/main/java/info/cemu/Cemu/settings/input/MotionDialog.java similarity index 95% rename from src/android/app/src/main/java/info/cemu/Cemu/MotionDialog.java rename to src/android/app/src/main/java/info/cemu/Cemu/settings/input/MotionDialog.java index a20bc4c4..195b8759 100644 --- a/src/android/app/src/main/java/info/cemu/Cemu/MotionDialog.java +++ b/src/android/app/src/main/java/info/cemu/Cemu/settings/input/MotionDialog.java @@ -1,4 +1,4 @@ -package info.cemu.Cemu; +package info.cemu.Cemu.settings.input; import android.app.AlertDialog; import android.content.Context; diff --git a/src/android/app/src/main/java/info/cemu/Cemu/OverlaySettingsFragment.java b/src/android/app/src/main/java/info/cemu/Cemu/settings/overlay/OverlaySettingsFragment.java similarity index 68% rename from src/android/app/src/main/java/info/cemu/Cemu/OverlaySettingsFragment.java rename to src/android/app/src/main/java/info/cemu/Cemu/settings/overlay/OverlaySettingsFragment.java index d2dabcb5..83535c24 100644 --- a/src/android/app/src/main/java/info/cemu/Cemu/OverlaySettingsFragment.java +++ b/src/android/app/src/main/java/info/cemu/Cemu/settings/overlay/OverlaySettingsFragment.java @@ -1,4 +1,4 @@ -package info.cemu.Cemu; +package info.cemu.Cemu.settings.overlay; import android.os.Bundle; import android.view.LayoutInflater; @@ -8,14 +8,39 @@ import android.view.ViewGroup; import androidx.annotation.NonNull; import androidx.fragment.app.Fragment; -import java.util.List; import java.util.stream.Collectors; import java.util.stream.Stream; +import info.cemu.Cemu.R; import info.cemu.Cemu.databinding.GenericRecyclerViewLayoutBinding; +import info.cemu.Cemu.guibasecomponents.CheckboxRecyclerViewItem; +import info.cemu.Cemu.guibasecomponents.GenericRecyclerViewAdapter; +import info.cemu.Cemu.guibasecomponents.SelectionAdapter; +import info.cemu.Cemu.guibasecomponents.SingleSelectionRecyclerViewItem; +import info.cemu.Cemu.NativeLibrary; public class OverlaySettingsFragment extends Fragment { + private static int overlayScreenPositionToResourceNameId(int overlayScreenPosition) { + return switch (overlayScreenPosition) { + case NativeLibrary.OVERLAY_SCREEN_POSITION_DISABLED -> + R.string.overlay_position_disabled; + case NativeLibrary.OVERLAY_SCREEN_POSITION_TOP_LEFT -> + R.string.overlay_position_top_left; + case NativeLibrary.OVERLAY_SCREEN_POSITION_TOP_CENTER -> + R.string.overlay_position_top_center; + case NativeLibrary.OVERLAY_SCREEN_POSITION_TOP_RIGHT -> + R.string.overlay_position_top_right; + case NativeLibrary.OVERLAY_SCREEN_POSITION_BOTTOM_LEFT -> + R.string.overlay_position_bottom_left; + case NativeLibrary.OVERLAY_SCREEN_POSITION_BOTTOM_CENTER -> + R.string.overlay_position_bottom_center; + case NativeLibrary.OVERLAY_SCREEN_POSITION_BOTTOM_RIGHT -> + R.string.overlay_position_bottom_right; + default -> + throw new IllegalArgumentException("Invalid overlay position: " + overlayScreenPosition); + }; + } @Override public View onCreateView(@NonNull LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { @@ -31,15 +56,15 @@ public class OverlaySettingsFragment extends Fragment { NativeLibrary.OVERLAY_SCREEN_POSITION_BOTTOM_LEFT, NativeLibrary.OVERLAY_SCREEN_POSITION_BOTTOM_CENTER, NativeLibrary.OVERLAY_SCREEN_POSITION_BOTTOM_RIGHT) - .map(position -> new SelectionAdapter.ChoiceItem<>(t -> t.setText(NativeLibrary.overlayScreenPositionToResourceNameId(position)), position)) + .map(position -> new SelectionAdapter.ChoiceItem<>(t -> t.setText(overlayScreenPositionToResourceNameId(position)), position)) .collect(Collectors.toList()); int overlayPosition = NativeLibrary.getOverlayPosition(); SelectionAdapter tvChannelsSelectionAdapter = new SelectionAdapter<>(overlayPositionChoices, overlayPosition); SingleSelectionRecyclerViewItem tvChannelsModeSelection = new SingleSelectionRecyclerViewItem<>(getString(R.string.overlay_position), - getString(NativeLibrary.overlayScreenPositionToResourceNameId(overlayPosition)), tvChannelsSelectionAdapter, + getString(overlayScreenPositionToResourceNameId(overlayPosition)), tvChannelsSelectionAdapter, (position, selectionRecyclerViewItem) -> { NativeLibrary.setOverlayPosition(position); - selectionRecyclerViewItem.setDescription(getString(NativeLibrary.overlayScreenPositionToResourceNameId(position))); + selectionRecyclerViewItem.setDescription(getString(overlayScreenPositionToResourceNameId(position))); }); genericRecyclerViewAdapter.addRecyclerViewItem(tvChannelsModeSelection); diff --git a/src/android/app/src/main/java/info/cemu/Cemu/FileUtil.java b/src/android/app/src/main/java/info/cemu/Cemu/utils/FileUtil.java similarity index 98% rename from src/android/app/src/main/java/info/cemu/Cemu/FileUtil.java rename to src/android/app/src/main/java/info/cemu/Cemu/utils/FileUtil.java index 50af11b5..35ed1a62 100644 --- a/src/android/app/src/main/java/info/cemu/Cemu/FileUtil.java +++ b/src/android/app/src/main/java/info/cemu/Cemu/utils/FileUtil.java @@ -1,4 +1,4 @@ -package info.cemu.Cemu; +package info.cemu.Cemu.utils; import android.database.Cursor; import android.net.Uri; @@ -11,6 +11,8 @@ import java.nio.file.Files; import java.nio.file.Path; import java.util.ArrayList; +import info.cemu.Cemu.CemuApplication; + public class FileUtil { private static final String PATH_SEPARATOR_ENCODED = "%2F"; private static final String PATH_SEPARATOR_DECODED = "/"; diff --git a/src/android/app/src/main/java/info/cemu/Cemu/ProgressResponseBody.java b/src/android/app/src/main/java/info/cemu/Cemu/utils/ProgressResponseBody.java similarity index 98% rename from src/android/app/src/main/java/info/cemu/Cemu/ProgressResponseBody.java rename to src/android/app/src/main/java/info/cemu/Cemu/utils/ProgressResponseBody.java index d3bf43f3..b70935c0 100644 --- a/src/android/app/src/main/java/info/cemu/Cemu/ProgressResponseBody.java +++ b/src/android/app/src/main/java/info/cemu/Cemu/utils/ProgressResponseBody.java @@ -1,4 +1,4 @@ -package info.cemu.Cemu; +package info.cemu.Cemu.utils; import androidx.annotation.NonNull; diff --git a/src/android/app/src/main/java/info/cemu/Cemu/ZipUtil.java b/src/android/app/src/main/java/info/cemu/Cemu/utils/ZipUtil.java similarity index 97% rename from src/android/app/src/main/java/info/cemu/Cemu/ZipUtil.java rename to src/android/app/src/main/java/info/cemu/Cemu/utils/ZipUtil.java index 754ad2bf..6e256d6c 100644 --- a/src/android/app/src/main/java/info/cemu/Cemu/ZipUtil.java +++ b/src/android/app/src/main/java/info/cemu/Cemu/utils/ZipUtil.java @@ -1,4 +1,4 @@ -package info.cemu.Cemu; +package info.cemu.Cemu.utils; import java.io.File; import java.io.FileOutputStream; diff --git a/src/android/app/src/main/res/layout/activity_emulation.xml b/src/android/app/src/main/res/layout/activity_emulation.xml index 7d630bff..072d690d 100644 --- a/src/android/app/src/main/res/layout/activity_emulation.xml +++ b/src/android/app/src/main/res/layout/activity_emulation.xml @@ -4,7 +4,7 @@ android:layout_width="match_parent" android:layout_height="match_parent" android:keepScreenOn="true" - tools:context=".EmulationActivity"> + tools:context=".emulation.EmulationActivity"> + tools:context=".inputoverlay.InputOverlayConfigureActivity"> - diff --git a/src/android/app/src/main/res/layout/activity_settings.xml b/src/android/app/src/main/res/layout/activity_settings.xml index c8f1f585..5ce93921 100644 --- a/src/android/app/src/main/res/layout/activity_settings.xml +++ b/src/android/app/src/main/res/layout/activity_settings.xml @@ -6,7 +6,7 @@ android:layout_height="match_parent" android:fitsSystemWindows="true" android:orientation="vertical" - tools:context=".SettingsActivity"> + tools:context=".settings.SettingsActivity"> + tools:context=".emulation.EmulationFragment"> - diff --git a/src/android/app/src/main/res/layout/fragment_options.xml b/src/android/app/src/main/res/layout/fragment_options.xml index 5929f81d..5efa13c8 100644 --- a/src/android/app/src/main/res/layout/fragment_options.xml +++ b/src/android/app/src/main/res/layout/fragment_options.xml @@ -4,7 +4,7 @@ xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" - tools:context=".OptionsFragment"> + tools:context=".settings.OptionsFragment"> + xmlns:tools="http://schemas.android.com/tools"> + xmlns:tools="http://schemas.android.com/tools"> \ No newline at end of file diff --git a/src/android/app/src/main/res/navigation/nav_settings_graph.xml b/src/android/app/src/main/res/navigation/nav_settings_graph.xml index b5eeb5d1..0fc9a129 100644 --- a/src/android/app/src/main/res/navigation/nav_settings_graph.xml +++ b/src/android/app/src/main/res/navigation/nav_settings_graph.xml @@ -6,9 +6,8 @@ app:startDestination="@id/optionsFragment"> + android:name="info.cemu.Cemu.settings.input.InputSettingsFragment" + android:label="@string/input_settings"> @@ -18,18 +17,16 @@ + android:name="info.cemu.Cemu.settings.graphicpacks.GraphicPacksFragment" + android:label="@string/graphic_packs"> + android:name="info.cemu.Cemu.settings.graphicpacks.GraphicPacksFragment" + android:label="{title}"> @@ -40,7 +37,7 @@ + android:name="info.cemu.Cemu.settings.input.ControllerInputsFragment" /> + android:name="info.cemu.Cemu.settings.graphics.GraphicsSettingsFragment" + android:label="@string/graphics_settings" /> + android:name="info.cemu.Cemu.settings.audio.AudioSettingsFragment" + android:label="@string/audio_settings" /> + android:name="info.cemu.Cemu.settings.overlay.OverlaySettingsFragment" + android:label="@string/overlay_settings" /> + android:name="info.cemu.Cemu.inputoverlay.InputOverlaySettingsFragment" + android:label="@string/input_overlay_settings" /> \ No newline at end of file diff --git a/src/android/app/src/main/res/values/strings.xml b/src/android/app/src/main/res/values/strings.xml index 8767ccc5..b0e2c520 100644 --- a/src/android/app/src/main/res/values/strings.xml +++ b/src/android/app/src/main/res/values/strings.xml @@ -116,9 +116,6 @@ Edit input positions Exited input edit mode Change input mode to move/resize or default - - Hello blank fragment - info.cemu.Cemu.InputOverlaySettings Overlay controller Input overlay Input overlay settings