From 475b862574bad87b3a6c64f453cdc15a013f740e Mon Sep 17 00:00:00 2001 From: izzy2lost Date: Sat, 13 Sep 2025 04:21:50 -0400 Subject: [PATCH] add right navi drawer quick actions --- app/build.gradle | 4 +- .../psx2/GamesCoverDialogFragment.java | 29 ++- .../java/com/izzy2lost/psx2/MainActivity.java | 129 ++++++++++- .../psx2/QuickActionsDialogFragment.java | 46 ++++ .../main/res/drawable/exit_to_app_24px.xml | 11 + .../res/drawable/ic_launcher_background.xml | 207 ++++-------------- .../main/res/layout-land/activity_main.xml | 7 +- .../main/res/layout-port/activity_main.xml | 7 +- .../main/res/layout/dialog_quick_actions.xml | 33 ++- .../res/layout/drawer_right_quick_actions.xml | 154 +++++++++++++ .../res/values/ic_launcher_background.xml | 2 +- 11 files changed, 448 insertions(+), 181 deletions(-) create mode 100644 app/src/main/res/drawable/exit_to_app_24px.xml create mode 100644 app/src/main/res/layout/drawer_right_quick_actions.xml diff --git a/app/build.gradle b/app/build.gradle index 7d2adc6..d97ab0d 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -11,8 +11,8 @@ android { applicationId "com.izzy2lost.psx2" minSdk 26 targetSdk 36 - versionCode 1 - versionName "1.0.0" + versionCode 2 + versionName "1.0.1" // APK setProperty("archivesBaseName","PSX2_${versionCode}_${new Date().format('yyyyMMddHHmm')}") diff --git a/app/src/main/java/com/izzy2lost/psx2/GamesCoverDialogFragment.java b/app/src/main/java/com/izzy2lost/psx2/GamesCoverDialogFragment.java index fc1da05..77649ab 100644 --- a/app/src/main/java/com/izzy2lost/psx2/GamesCoverDialogFragment.java +++ b/app/src/main/java/com/izzy2lost/psx2/GamesCoverDialogFragment.java @@ -972,7 +972,34 @@ public class GamesCoverDialogFragment extends DialogFragment { if (header != null) { android.content.SharedPreferences prefs = requireContext().getSharedPreferences("app_prefs", Context.MODE_PRIVATE); - // Refresh switch states only (spinners are set up once in setupDialogDrawerSettings) + // Refresh spinner values to reflect current settings + android.widget.Spinner spAspect = header.findViewById(R.id.drawer_sp_aspect_ratio); + if (spAspect != null && spAspect.getAdapter() != null) { + int savedAspect = prefs.getInt("aspect_ratio", 1); + android.widget.ArrayAdapter aspectAdapter = (android.widget.ArrayAdapter) spAspect.getAdapter(); + if (savedAspect >= 0 && savedAspect < aspectAdapter.getCount()) { + spAspect.setSelection(savedAspect); + } + } + + android.widget.Spinner spScale = header.findViewById(R.id.drawer_sp_scale); + if (spScale != null && spScale.getAdapter() != null) { + float savedScale = prefs.getFloat("upscale_multiplier", 1.0f); + android.widget.ArrayAdapter scaleAdapter = (android.widget.ArrayAdapter) spScale.getAdapter(); + int scaleIndex = Math.max(0, Math.min(scaleAdapter.getCount() - 1, Math.round(savedScale) - 1)); + spScale.setSelection(scaleIndex); + } + + android.widget.Spinner spBlending = header.findViewById(R.id.drawer_sp_blending_accuracy); + if (spBlending != null && spBlending.getAdapter() != null) { + int savedBlend = prefs.getInt("blending_accuracy", 1); + android.widget.ArrayAdapter blendAdapter = (android.widget.ArrayAdapter) spBlending.getAdapter(); + if (savedBlend >= 0 && savedBlend < blendAdapter.getCount()) { + spBlending.setSelection(savedBlend); + } + } + + // Refresh switch states com.google.android.material.materialswitch.MaterialSwitch swWide = header.findViewById(R.id.drawer_sw_widescreen); if (swWide != null) { swWide.setChecked(prefs.getBoolean("widescreen_patches", true)); diff --git a/app/src/main/java/com/izzy2lost/psx2/MainActivity.java b/app/src/main/java/com/izzy2lost/psx2/MainActivity.java index 6d5b9aa..09f425b 100644 --- a/app/src/main/java/com/izzy2lost/psx2/MainActivity.java +++ b/app/src/main/java/com/izzy2lost/psx2/MainActivity.java @@ -466,6 +466,9 @@ public class MainActivity extends AppCompatActivity implements GamesCoverDialogF f.setCancelable(false); f.show(getSupportFragmentManager(), "setup_wizard"); } + + // Setup right drawer quick actions + setupRightDrawerActions(); } public void setSetupWizardActive(boolean active) { @@ -1925,7 +1928,34 @@ public class MainActivity extends AppCompatActivity implements GamesCoverDialogF if (header != null) { SharedPreferences prefs = getSharedPreferences("app_prefs", MODE_PRIVATE); - // Refresh switch states only (spinners are set up once in setupDrawerSettings) + // Refresh spinner values to reflect current settings + Spinner spAspect = header.findViewById(R.id.drawer_sp_aspect_ratio); + if (spAspect != null && spAspect.getAdapter() != null) { + int savedAspect = prefs.getInt("aspect_ratio", 1); + ArrayAdapter aspectAdapter = (ArrayAdapter) spAspect.getAdapter(); + if (savedAspect >= 0 && savedAspect < aspectAdapter.getCount()) { + spAspect.setSelection(savedAspect); + } + } + + Spinner spScale = header.findViewById(R.id.drawer_sp_scale); + if (spScale != null && spScale.getAdapter() != null) { + float savedScale = prefs.getFloat("upscale_multiplier", 1.0f); + ArrayAdapter scaleAdapter = (ArrayAdapter) spScale.getAdapter(); + int scaleIndex = Math.max(0, Math.min(scaleAdapter.getCount() - 1, Math.round(savedScale) - 1)); + spScale.setSelection(scaleIndex); + } + + Spinner spBlending = header.findViewById(R.id.drawer_sp_blending_accuracy); + if (spBlending != null && spBlending.getAdapter() != null) { + int savedBlend = prefs.getInt("blending_accuracy", 1); + ArrayAdapter blendAdapter = (ArrayAdapter) spBlending.getAdapter(); + if (savedBlend >= 0 && savedBlend < blendAdapter.getCount()) { + spBlending.setSelection(savedBlend); + } + } + + // Refresh switch states com.google.android.material.materialswitch.MaterialSwitch swWide = header.findViewById(R.id.drawer_sw_widescreen); if (swWide != null) { swWide.setChecked(prefs.getBoolean("widescreen_patches", true)); @@ -2119,4 +2149,101 @@ public class MainActivity extends AppCompatActivity implements GamesCoverDialogF .show(); } + private void setupRightDrawerActions() { + try { + View rightDrawer = findViewById(R.id.end_drawer); + if (rightDrawer != null) { + // Games button + View btnGames = rightDrawer.findViewById(R.id.right_drawer_btn_games); + if (btnGames != null) { + btnGames.setOnClickListener(v -> { + try { + // Close right drawer first + DrawerLayout drawer = findViewById(R.id.drawer_layout); + if (drawer != null) drawer.closeDrawer(androidx.core.view.GravityCompat.END); + // Open games dialog + openGamesDialog(); + } catch (Throwable ignored) {} + }); + } + + // Saves button + View btnSaves = rightDrawer.findViewById(R.id.right_drawer_btn_saves); + if (btnSaves != null) { + btnSaves.setOnClickListener(v -> { + try { + // Close right drawer first + DrawerLayout drawer = findViewById(R.id.drawer_layout); + if (drawer != null) drawer.closeDrawer(androidx.core.view.GravityCompat.END); + // Open saves dialog + SavesDialogFragment dialog = new SavesDialogFragment(); + dialog.show(getSupportFragmentManager(), "saves_dialog"); + } catch (Throwable ignored) {} + }); + } + + // Exit Game button (pause + open games) + View btnExitGame = rightDrawer.findViewById(R.id.right_drawer_btn_exit_game); + if (btnExitGame != null) { + btnExitGame.setOnClickListener(v -> { + try { + // Close right drawer first + DrawerLayout drawer = findViewById(R.id.drawer_layout); + if (drawer != null) drawer.closeDrawer(androidx.core.view.GravityCompat.END); + // Pause the game first + togglePauseState(); + // Then open games dialog after a short delay + findViewById(android.R.id.content).postDelayed(() -> { + openGamesDialog(); + }, 300); + } catch (Throwable ignored) {} + }); + } + + // Restart Game button + View btnRestartGame = rightDrawer.findViewById(R.id.right_drawer_btn_restart_game); + if (btnRestartGame != null) { + btnRestartGame.setOnClickListener(v -> { + try { + // Close right drawer first + DrawerLayout drawer = findViewById(R.id.drawer_layout); + if (drawer != null) drawer.closeDrawer(androidx.core.view.GravityCompat.END); + // Show confirmation dialog + new MaterialAlertDialogBuilder(this) + .setTitle("Restart Game") + .setMessage("Restart the current game?") + .setNegativeButton("Cancel", null) + .setPositiveButton("Restart", (d,w) -> rebootEmu()) + .show(); + } catch (Throwable ignored) {} + }); + } + + // Exit App button + View btnExitApp = rightDrawer.findViewById(R.id.right_drawer_btn_exit_app); + if (btnExitApp != null) { + btnExitApp.setOnClickListener(v -> { + try { + // Close right drawer first + DrawerLayout drawer = findViewById(R.id.drawer_layout); + if (drawer != null) drawer.closeDrawer(androidx.core.view.GravityCompat.END); + // Show confirmation dialog + new MaterialAlertDialogBuilder(this) + .setTitle("Exit App") + .setMessage("Quit PSX2?") + .setNegativeButton("Cancel", null) + .setPositiveButton("Quit", (d,w) -> { + try { NativeApp.shutdown(); } catch (Throwable ignored) {} + finishAffinity(); + finishAndRemoveTask(); + System.exit(0); + }) + .show(); + } catch (Throwable ignored) {} + }); + } + } + } catch (Throwable ignored) {} + } + } diff --git a/app/src/main/java/com/izzy2lost/psx2/QuickActionsDialogFragment.java b/app/src/main/java/com/izzy2lost/psx2/QuickActionsDialogFragment.java index 4d836e7..c38c4e0 100644 --- a/app/src/main/java/com/izzy2lost/psx2/QuickActionsDialogFragment.java +++ b/app/src/main/java/com/izzy2lost/psx2/QuickActionsDialogFragment.java @@ -33,8 +33,10 @@ public class QuickActionsDialogFragment extends DialogFragment { FloatingActionButton btnPausePlay = view.findViewById(R.id.btn_quick_pause_play); MaterialButton btnGames = view.findViewById(R.id.btn_quick_games); MaterialButton btnSaves = view.findViewById(R.id.btn_quick_saves); + MaterialButton btnExitGame = view.findViewById(R.id.btn_quick_exit_game); MaterialButton btnCancel = view.findViewById(R.id.btn_cancel); Spinner spAspect = view.findViewById(R.id.qa_sp_aspect_ratio); + Spinner spResolution = view.findViewById(R.id.qa_sp_resolution_scale); Spinner spBlending = view.findViewById(R.id.qa_sp_blending_accuracy); MaterialSwitch swWide = view.findViewById(R.id.qa_sw_widescreen); MaterialSwitch swNoInt = view.findViewById(R.id.qa_sw_no_interlacing); @@ -133,6 +135,27 @@ public class QuickActionsDialogFragment extends DialogFragment { }); } + // Resolution Scale spinner + if (spResolution != null) { + ArrayAdapter scaleAdapter = ArrayAdapter.createFromResource(requireContext(), + R.array.scale_entries, android.R.layout.simple_spinner_item); + scaleAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item); + spResolution.setAdapter(scaleAdapter); + float savedScale = requireContext().getSharedPreferences("app_prefs", android.content.Context.MODE_PRIVATE) + .getFloat("upscale_multiplier", 1.0f); + int scaleIndex = Math.max(0, Math.min(scaleAdapter.getCount() - 1, Math.round(savedScale) - 1)); + spResolution.setSelection(scaleIndex); + spResolution.setOnItemSelectedListener(new android.widget.AdapterView.OnItemSelectedListener() { + @Override public void onItemSelected(android.widget.AdapterView parent, View view1, int position, long id) { + float scale = Math.max(1, Math.min(8, position + 1)); + requireContext().getSharedPreferences("app_prefs", android.content.Context.MODE_PRIVATE) + .edit().putFloat("upscale_multiplier", scale).apply(); + try { NativeApp.renderUpscalemultiplier(scale); } catch (Throwable ignored) {} + } + @Override public void onNothingSelected(android.widget.AdapterView parent) {} + }); + } + // Blending Accuracy spinner if (spBlending != null) { ArrayAdapter blendAdapter = ArrayAdapter.createFromResource(requireContext(), @@ -209,6 +232,29 @@ public class QuickActionsDialogFragment extends DialogFragment { }); } + // Exit Game: pause game and open games dialog + if (btnExitGame != null) { + btnExitGame.setOnClickListener(v -> { + try { + // Pause the game first + if (requireActivity() instanceof MainActivity) { + ((MainActivity) requireActivity()).togglePauseState(); + } else { + boolean paused = NativeApp.isPaused(); + if (!paused) NativeApp.pause(); + } + // Close this dialog + dismissAllowingStateLoss(); + // Open games dialog after a short delay + if (requireActivity() instanceof MainActivity) { + requireActivity().findViewById(android.R.id.content).postDelayed(() -> { + ((MainActivity) requireActivity()).openGamesDialog(); + }, 300); + } + } catch (Throwable ignored) {} + }); + } + // Cancel button if (btnCancel != null) btnCancel.setOnClickListener(v -> dismissAllowingStateLoss()); diff --git a/app/src/main/res/drawable/exit_to_app_24px.xml b/app/src/main/res/drawable/exit_to_app_24px.xml new file mode 100644 index 0000000..db449d8 --- /dev/null +++ b/app/src/main/res/drawable/exit_to_app_24px.xml @@ -0,0 +1,11 @@ + + + diff --git a/app/src/main/res/drawable/ic_launcher_background.xml b/app/src/main/res/drawable/ic_launcher_background.xml index 07d5da9..5d63709 100644 --- a/app/src/main/res/drawable/ic_launcher_background.xml +++ b/app/src/main/res/drawable/ic_launcher_background.xml @@ -1,170 +1,41 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + xmlns:aapt="http://schemas.android.com/aapt" + android:width="512dp" + android:height="512dp" + android:viewportWidth="512" + android:viewportHeight="512"> + + + + + + + + + + + + + + + + + + + diff --git a/app/src/main/res/layout-land/activity_main.xml b/app/src/main/res/layout-land/activity_main.xml index 90c3be5..5c52a97 100644 --- a/app/src/main/res/layout-land/activity_main.xml +++ b/app/src/main/res/layout-land/activity_main.xml @@ -438,10 +438,11 @@ app:itemTextColor="@color/md_theme_onSurface" app:headerLayout="@layout/drawer_header_settings" /> - - + diff --git a/app/src/main/res/layout-port/activity_main.xml b/app/src/main/res/layout-port/activity_main.xml index 0352770..b2a61fe 100644 --- a/app/src/main/res/layout-port/activity_main.xml +++ b/app/src/main/res/layout-port/activity_main.xml @@ -431,10 +431,11 @@ app:itemTextColor="@color/md_theme_onSurface" app:headerLayout="@layout/drawer_header_settings" /> - - + diff --git a/app/src/main/res/layout/dialog_quick_actions.xml b/app/src/main/res/layout/dialog_quick_actions.xml index e7ffea2..d44a769 100644 --- a/app/src/main/res/layout/dialog_quick_actions.xml +++ b/app/src/main/res/layout/dialog_quick_actions.xml @@ -106,7 +106,7 @@ android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="horizontal" - android:layout_marginBottom="16dp"> + android:layout_marginBottom="8dp"> + + + - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/values/ic_launcher_background.xml b/app/src/main/res/values/ic_launcher_background.xml index beab31f..f6f1f8d 100644 --- a/app/src/main/res/values/ic_launcher_background.xml +++ b/app/src/main/res/values/ic_launcher_background.xml @@ -1,4 +1,4 @@ - #000000 + #12202C \ No newline at end of file