From ded451bc9d22d70e8490ad54cb51ea01bd490cc2 Mon Sep 17 00:00:00 2001 From: bunnei Date: Sat, 31 Aug 2019 15:26:23 -0400 Subject: [PATCH] android: frontend: menu: Improve in game options, make check boxes. --- .../citra/citra_android/NativeLibrary.java | 6 +- .../activities/EmulationActivity.java | 101 ++++++++++-------- .../fragments/EmulationFragment.java | 77 +++++-------- .../citra_android/fragments/MenuFragment.java | 6 +- .../citra_android/overlay/InputOverlay.java | 5 +- .../utils/EmulationMenuSettings.java | 58 ++++++++++ src/android/app/src/main/jni/config.cpp | 1 - src/android/app/src/main/jni/native.cpp | 7 +- src/android/app/src/main/jni/native.h | 2 +- .../main/res/layout/fragment_emulation.xml | 2 +- .../app/src/main/res/menu/menu_emulation.xml | 20 ++-- .../app/src/main/res/values/strings.xml | 6 +- 12 files changed, 172 insertions(+), 119 deletions(-) create mode 100644 src/android/app/src/main/java/org/citra/citra_android/utils/EmulationMenuSettings.java diff --git a/src/android/app/src/main/java/org/citra/citra_android/NativeLibrary.java b/src/android/app/src/main/java/org/citra/citra_android/NativeLibrary.java index 762c95c25..043f935cb 100644 --- a/src/android/app/src/main/java/org/citra/citra_android/NativeLibrary.java +++ b/src/android/app/src/main/java/org/citra/citra_android/NativeLibrary.java @@ -15,6 +15,7 @@ import android.widget.EditText; import android.widget.FrameLayout; import org.citra.citra_android.activities.EmulationActivity; +import org.citra.citra_android.utils.EmulationMenuSettings; import org.citra.citra_android.utils.Log; import java.lang.ref.WeakReference; @@ -287,7 +288,7 @@ public final class NativeLibrary { /** * Swaps the top and bottom screens. */ - public static native void SwapScreens(boolean is_portrait_mode); + public static native void SwapScreens(boolean swap_screens, boolean is_portrait_mode); public static boolean isPortraitMode() { return CitraApplication.getAppContext().getResources().getConfiguration().orientation == @@ -295,8 +296,7 @@ public final class NativeLibrary { } public static int landscapeScreenLayout() { - return PreferenceManager.getDefaultSharedPreferences(CitraApplication.getAppContext()) - .getInt("LandscapeScreenLayout", EmulationActivity.LayoutOption_MobileLandscape); + return EmulationMenuSettings.getLandscapeScreenLayout(); } public static boolean displayAlertMsg(final String caption, final String text, diff --git a/src/android/app/src/main/java/org/citra/citra_android/activities/EmulationActivity.java b/src/android/app/src/main/java/org/citra/citra_android/activities/EmulationActivity.java index f9f90a03a..783e8f0ac 100644 --- a/src/android/app/src/main/java/org/citra/citra_android/activities/EmulationActivity.java +++ b/src/android/app/src/main/java/org/citra/citra_android/activities/EmulationActivity.java @@ -1,5 +1,6 @@ package org.citra.citra_android.activities; +import android.app.Activity; import android.app.AlertDialog; import android.content.Intent; import android.content.SharedPreferences; @@ -38,18 +39,14 @@ import org.citra.citra_android.model.settings.view.InputBindingSetting; import org.citra.citra_android.ui.main.MainPresenter; import org.citra.citra_android.utils.Animations; import org.citra.citra_android.utils.ControllerMappingHelper; +import org.citra.citra_android.utils.EmulationMenuSettings; import java.lang.annotation.Retention; import java.util.List; -import static android.view.MotionEvent.AXIS_RZ; -import static android.view.MotionEvent.AXIS_X; -import static android.view.MotionEvent.AXIS_Y; -import static android.view.MotionEvent.AXIS_Z; import static java.lang.annotation.RetentionPolicy.SOURCE; public final class EmulationActivity extends AppCompatActivity { - public static final int REQUEST_CHANGE_DISC = 1; public static final String EXTRA_SELECTED_GAME = "SelectedGame"; public static final String EXTRA_SELECTED_TITLE = "SelectedTitle"; public static final String EXTRA_SCREEN_PATH = "ScreenPath"; @@ -58,13 +55,14 @@ public final class EmulationActivity extends AppCompatActivity { public static final int MENU_ACTION_TOGGLE_CONTROLS = 1; public static final int MENU_ACTION_ADJUST_SCALE = 2; public static final int MENU_ACTION_EXIT = 3; - public static final int MENU_ACTION_TOGGLE_PREF_STATS = 4; + public static final int MENU_ACTION_SHOW_FPS = 4; public static final int MENU_ACTION_SCREEN_LAYOUT_LANDSCAPE = 5; public static final int MENU_ACTION_SCREEN_LAYOUT_PORTRAIT = 6; public static final int MENU_ACTION_SCREEN_LAYOUT_SINGLE = 7; public static final int MENU_ACTION_SCREEN_LAYOUT_SIDEBYSIDE = 8; public static final int MENU_ACTION_SWAP_SCREENS = 9; public static final int MENU_ACTION_RESET_OVERLAY = 10; + public static final int MENU_ACTION_SHOW_OVERLAY = 11; private static final int EMULATION_RUNNING_NOTIFICATION = 0x1000; private static final String BACKSTACK_NAME_MENU = "menu"; @@ -78,8 +76,8 @@ public final class EmulationActivity extends AppCompatActivity { EmulationActivity.MENU_ACTION_TOGGLE_CONTROLS); buttonsActionsMap .append(R.id.menu_emulation_adjust_scale, EmulationActivity.MENU_ACTION_ADJUST_SCALE); - buttonsActionsMap.append(R.id.menu_emulation_toggle_perf_stats, - EmulationActivity.MENU_ACTION_TOGGLE_PREF_STATS); + buttonsActionsMap.append(R.id.menu_emulation_show_fps, + EmulationActivity.MENU_ACTION_SHOW_FPS); buttonsActionsMap.append(R.id.menu_exit, EmulationActivity.MENU_ACTION_EXIT); buttonsActionsMap.append(R.id.menu_screen_layout_landscape, EmulationActivity.MENU_ACTION_SCREEN_LAYOUT_LANDSCAPE); @@ -93,6 +91,8 @@ public final class EmulationActivity extends AppCompatActivity { EmulationActivity.MENU_ACTION_SWAP_SCREENS); buttonsActionsMap .append(R.id.menu_emulation_reset_overlay, EmulationActivity.MENU_ACTION_RESET_OVERLAY); + buttonsActionsMap + .append(R.id.menu_emulation_show_overlay, EmulationActivity.MENU_ACTION_SHOW_OVERLAY); } private View mDecorView; @@ -248,6 +248,10 @@ public final class EmulationActivity extends AppCompatActivity { mPreferences = PreferenceManager.getDefaultSharedPreferences(this); showRunningNotification(); + + // Override Citra core INI with the one set by our in game menu + NativeLibrary.SwapScreens(EmulationMenuSettings.getSwapScreens(), + getResources().getConfiguration().orientation == Configuration.ORIENTATION_PORTRAIT); } @Override @@ -365,37 +369,28 @@ public final class EmulationActivity extends AppCompatActivity { .withEndAction(afterShowingScreenshot); } - // These must match what is defined in src/core/settings.h - public static final int LayoutOption_Default = 0; - public static final int LayoutOption_SingleScreen = 1; - public static final int LayoutOption_LargeScreen = 2; - public static final int LayoutOption_SideScreen = 3; - public static final int LayoutOption_MobilePortrait = 4; - public static final int LayoutOption_MobileLandscape = 5; - @Override public boolean onCreateOptionsMenu(Menu menu) { // Inflate the menu; this adds items to the action bar if it is present. getMenuInflater().inflate(R.menu.menu_emulation, menu); - - // mPreferences = PreferenceManager.getDefaultSharedPreferences(getContext()); - int layoutOption = mPreferences.getInt("LandscapeScreenLayout", LayoutOption_MobileLandscape); - - int menuItemId = R.id.menu_screen_layout_landscape; - switch (layoutOption) { - case LayoutOption_SingleScreen: - menuItemId = R.id.menu_screen_layout_single; + int layoutOptionMenuItem = R.id.menu_screen_layout_landscape; + switch (EmulationMenuSettings.getLandscapeScreenLayout()) { + case EmulationMenuSettings.LayoutOption_SingleScreen: + layoutOptionMenuItem = R.id.menu_screen_layout_single; break; - case LayoutOption_SideScreen: - menuItemId = R.id.menu_screen_layout_sidebyside; + case EmulationMenuSettings.LayoutOption_SideScreen: + layoutOptionMenuItem = R.id.menu_screen_layout_sidebyside; break; - case LayoutOption_MobilePortrait: - menuItemId = R.id.menu_screen_layout_portrait; + case EmulationMenuSettings.LayoutOption_MobilePortrait: + layoutOptionMenuItem = R.id.menu_screen_layout_portrait; break; } - menu.findItem(menuItemId).setChecked(true); + menu.findItem(layoutOptionMenuItem).setChecked(true); + menu.findItem(R.id.menu_emulation_show_fps).setChecked(EmulationMenuSettings.getShowFps()); + menu.findItem(R.id.menu_emulation_swap_screens).setChecked(EmulationMenuSettings.getSwapScreens()); + menu.findItem(R.id.menu_emulation_show_overlay).setChecked(EmulationMenuSettings.getShowOverlay()); return true; } @@ -422,40 +417,59 @@ public final class EmulationActivity extends AppCompatActivity { break; // Toggle the visibility of the Performance stats TextView - case MENU_ACTION_TOGGLE_PREF_STATS: - mEmulationFragment.togglePerfStatsVisibility(); - break; + case MENU_ACTION_SHOW_FPS: { + final boolean isEnabled = !EmulationMenuSettings.getShowFps(); + EmulationMenuSettings.setShowFps(isEnabled); + item.setChecked(isEnabled); + mEmulationFragment.updateShowFpsOverlay(); + break; + } // Sets the screen layout to Landscape case MENU_ACTION_SCREEN_LAYOUT_LANDSCAPE: - changeScreenOrientation(LayoutOption_MobileLandscape, item); + changeScreenOrientation(EmulationMenuSettings.LayoutOption_MobileLandscape, item); break; // Sets the screen layout to Portrait case MENU_ACTION_SCREEN_LAYOUT_PORTRAIT: - changeScreenOrientation(LayoutOption_MobilePortrait, item); + changeScreenOrientation(EmulationMenuSettings.LayoutOption_MobilePortrait, item); break; // Sets the screen layout to Single case MENU_ACTION_SCREEN_LAYOUT_SINGLE: - changeScreenOrientation(LayoutOption_SingleScreen, item); + changeScreenOrientation(EmulationMenuSettings.LayoutOption_SingleScreen, item); break; // Sets the screen layout to Side by Side case MENU_ACTION_SCREEN_LAYOUT_SIDEBYSIDE: - changeScreenOrientation(LayoutOption_SideScreen, item); + changeScreenOrientation(EmulationMenuSettings.LayoutOption_SideScreen, item); break; // Swap the top and bottom screen locations - case MENU_ACTION_SWAP_SCREENS: - NativeLibrary.SwapScreens(getResources().getConfiguration().orientation == Configuration.ORIENTATION_PORTRAIT); + case MENU_ACTION_SWAP_SCREENS: { + final boolean isEnabled = !EmulationMenuSettings.getSwapScreens(); + EmulationMenuSettings.setSwapScreens(isEnabled); + item.setChecked(isEnabled); + + NativeLibrary.SwapScreens(isEnabled, getResources().getConfiguration().orientation == Configuration.ORIENTATION_PORTRAIT); break; + } // Reset overlay placement case MENU_ACTION_RESET_OVERLAY: resetOverlay(); break; + // Show or hide overlay + case MENU_ACTION_SHOW_OVERLAY: { + final boolean isEnabled = !EmulationMenuSettings.getShowOverlay(); + EmulationMenuSettings.setShowOverlay(isEnabled); + item.setChecked(isEnabled); + + mEmulationFragment.refreshInputOverlay(); + break; + } + case MENU_ACTION_EXIT: toggleMenu(); // Hide the menu (it will be showing since we just clicked it) mEmulationFragment.stopEmulation(); @@ -468,13 +482,9 @@ public final class EmulationActivity extends AppCompatActivity { private void changeScreenOrientation(int layoutOption, MenuItem item) { item.setChecked(true); - NativeLibrary.NotifyOrientationChange(layoutOption, getResources().getConfiguration().orientation == Configuration.ORIENTATION_PORTRAIT); - - final SharedPreferences.Editor editor = mPreferences.edit(); - editor.putInt("LandscapeScreenLayout", layoutOption); - editor.apply(); + EmulationMenuSettings.setLandscapeScreenLayout(layoutOption); } private void editControlsPlacement() { @@ -538,7 +548,6 @@ public final class EmulationActivity extends AppCompatActivity { builder.setMultiChoiceItems(R.array.n3dsButtons, enabledButtons, (dialog, indexSelected, isChecked) -> editor .putBoolean("buttonToggle" + indexSelected, isChecked)); - builder.setPositiveButton(android.R.string.ok, (dialogInterface, i) -> { editor.apply(); @@ -705,9 +714,9 @@ public final class EmulationActivity extends AppCompatActivity { @Retention(SOURCE) @IntDef({MENU_ACTION_EDIT_CONTROLS_PLACEMENT, MENU_ACTION_TOGGLE_CONTROLS, MENU_ACTION_ADJUST_SCALE, - MENU_ACTION_EXIT, MENU_ACTION_TOGGLE_PREF_STATS, MENU_ACTION_SCREEN_LAYOUT_LANDSCAPE, + MENU_ACTION_EXIT, MENU_ACTION_SHOW_FPS, MENU_ACTION_SCREEN_LAYOUT_LANDSCAPE, MENU_ACTION_SCREEN_LAYOUT_PORTRAIT, MENU_ACTION_SCREEN_LAYOUT_SINGLE, MENU_ACTION_SCREEN_LAYOUT_SIDEBYSIDE, - MENU_ACTION_SWAP_SCREENS, MENU_ACTION_RESET_OVERLAY}) + MENU_ACTION_SWAP_SCREENS, MENU_ACTION_RESET_OVERLAY, MENU_ACTION_SHOW_OVERLAY}) public @interface MenuAction { } } diff --git a/src/android/app/src/main/java/org/citra/citra_android/fragments/EmulationFragment.java b/src/android/app/src/main/java/org/citra/citra_android/fragments/EmulationFragment.java index 345571149..7d7bc5bcc 100644 --- a/src/android/app/src/main/java/org/citra/citra_android/fragments/EmulationFragment.java +++ b/src/android/app/src/main/java/org/citra/citra_android/fragments/EmulationFragment.java @@ -27,6 +27,7 @@ import org.citra.citra_android.overlay.InputOverlay; import org.citra.citra_android.services.DirectoryInitializationService; import org.citra.citra_android.services.DirectoryInitializationService.DirectoryInitializationState; import org.citra.citra_android.utils.DirectoryStateReceiver; +import org.citra.citra_android.utils.EmulationMenuSettings; import org.citra.citra_android.utils.Log; public final class EmulationFragment extends Fragment implements SurfaceHolder.Callback { @@ -97,30 +98,17 @@ public final class EmulationFragment extends Fragment implements SurfaceHolder.C surfaceView.getHolder().addCallback(this); mInputOverlay = contents.findViewById(R.id.surface_input_overlay); - if (mInputOverlay != null) { - // If the input overlay was previously disabled, then don't show it. - if (!mPreferences.getBoolean("showInputOverlay", true)) { - mInputOverlay.setVisibility(View.GONE); - } - } + mPerfStats = contents.findViewById(R.id.show_fps_text); Button doneButton = contents.findViewById(R.id.done_control_config); if (doneButton != null) { doneButton.setOnClickListener(v -> stopConfiguringControls()); } - mPerfStats = contents.findViewById(R.id.perf_stats_text); - if (mPerfStats != null) { - // If the overlay was previously disabled, then don't show it. - if (!mPreferences.getBoolean("showPerfStats", true)) { - mPerfStats.setVisibility(View.GONE); - } else { - updatePerfStats(); - } - } + // Show/hide the "Show FPS" overlay + updateShowFpsOverlay(); // The new Surface created here will get passed to the native code via onSurfaceChanged. - return contents; } @@ -193,46 +181,31 @@ public final class EmulationFragment extends Fragment implements SurfaceHolder.C mInputOverlay.resetButtonPlacement(); } - public void togglePerfStatsVisibility() { - SharedPreferences.Editor editor = mPreferences.edit(); + public void updateShowFpsOverlay() { + if (EmulationMenuSettings.getShowFps()) { + final int SYSTEM_FPS = 0; + final int FPS = 1; + final int FRAMETIME = 2; + final int SPEED = 3; + + perfStatsUpdater = () -> + { + final DecimalFormat df = new DecimalFormat("#.#"); + double[] perfStats = NativeLibrary.GetPerfStats(); + mPerfStats.setText(String.format("FPS: %s Speed: %s%%", df.format(perfStats[FPS]), + df.format(perfStats[SPEED] * 100.0))); + + perfStatsUpdateHandler.postDelayed(perfStatsUpdater, 2000 /* 1s */); + }; + perfStatsUpdateHandler.post(perfStatsUpdater); - // If the overlay is currently set to INVISIBLE - if (!mPreferences.getBoolean("showPerfStats", false)) { - updatePerfStats(); - // Set it to VISIBLE mPerfStats.setVisibility(View.VISIBLE); - editor.putBoolean("showPerfStats", true); } else { - stopPerfStatsUpdates(); - // Set it to INVISIBLE + if (perfStatsUpdater != null) { + perfStatsUpdateHandler.removeCallbacks(perfStatsUpdater); + } + mPerfStats.setVisibility(View.GONE); - editor.putBoolean("showPerfStats", false); - } - - editor.apply(); - } - - private void updatePerfStats() { - final int SYSTEM_FPS = 0; - final int FPS = 1; - final int FRAMETIME = 2; - final int SPEED = 3; - - perfStatsUpdater = () -> - { - final DecimalFormat df = new DecimalFormat("#.#"); - double[] perfStats = NativeLibrary.GetPerfStats(); - mPerfStats.setText(String.format("FPS: %s Speed: %s%%", df.format(perfStats[FPS]), - df.format(perfStats[SPEED] * 100.0))); - - perfStatsUpdateHandler.postDelayed(perfStatsUpdater, 2000 /* 1s */); - }; - perfStatsUpdateHandler.post(perfStatsUpdater); - } - - private void stopPerfStatsUpdates() { - if (perfStatsUpdater != null) { - perfStatsUpdateHandler.removeCallbacks(perfStatsUpdater); } } diff --git a/src/android/app/src/main/java/org/citra/citra_android/fragments/MenuFragment.java b/src/android/app/src/main/java/org/citra/citra_android/fragments/MenuFragment.java index 1c6d0564c..424ca5ded 100644 --- a/src/android/app/src/main/java/org/citra/citra_android/fragments/MenuFragment.java +++ b/src/android/app/src/main/java/org/citra/citra_android/fragments/MenuFragment.java @@ -19,8 +19,8 @@ public final class MenuFragment extends Fragment implements View.OnClickListener private static SparseIntArray buttonsActionsMap = new SparseIntArray(); static { - buttonsActionsMap.append(R.id.menu_emulation_toggle_perf_stats, - EmulationActivity.MENU_ACTION_TOGGLE_PREF_STATS); + buttonsActionsMap.append(R.id.menu_emulation_show_fps, + EmulationActivity.MENU_ACTION_SHOW_FPS); buttonsActionsMap.append(R.id.menu_exit, EmulationActivity.MENU_ACTION_EXIT); buttonsActionsMap.append(R.id.menu_screen_layout_landscape, EmulationActivity.MENU_ACTION_SCREEN_LAYOUT_LANDSCAPE); @@ -32,6 +32,8 @@ public final class MenuFragment extends Fragment implements View.OnClickListener EmulationActivity.MENU_ACTION_SCREEN_LAYOUT_SIDEBYSIDE); buttonsActionsMap.append(R.id.menu_emulation_swap_screens, EmulationActivity.MENU_ACTION_SWAP_SCREENS); + buttonsActionsMap.append(R.id.menu_emulation_show_overlay, + EmulationActivity.MENU_ACTION_SHOW_OVERLAY); } public static MenuFragment newInstance(String title) { diff --git a/src/android/app/src/main/java/org/citra/citra_android/overlay/InputOverlay.java b/src/android/app/src/main/java/org/citra/citra_android/overlay/InputOverlay.java index 20adcc3f3..bdbf378b9 100644 --- a/src/android/app/src/main/java/org/citra/citra_android/overlay/InputOverlay.java +++ b/src/android/app/src/main/java/org/citra/citra_android/overlay/InputOverlay.java @@ -29,6 +29,7 @@ import org.citra.citra_android.NativeLibrary; import org.citra.citra_android.NativeLibrary.ButtonState; import org.citra.citra_android.NativeLibrary.ButtonType; import org.citra.citra_android.R; +import org.citra.citra_android.utils.EmulationMenuSettings; import java.util.HashSet; import java.util.Set; @@ -648,8 +649,8 @@ public final class InputOverlay extends SurfaceView implements OnTouchListener { getResources().getConfiguration().orientation == Configuration.ORIENTATION_PORTRAIT ? "-Portrait" : ""; - if (mPreferences.getBoolean("showInputOverlay", true)) { - // Add all the enabled overlay items back to the HashSet. + // Add all the enabled overlay items back to the HashSet. + if (EmulationMenuSettings.getShowOverlay()) { addOverlayControls(orientation); } diff --git a/src/android/app/src/main/java/org/citra/citra_android/utils/EmulationMenuSettings.java b/src/android/app/src/main/java/org/citra/citra_android/utils/EmulationMenuSettings.java new file mode 100644 index 000000000..1a7ed8a08 --- /dev/null +++ b/src/android/app/src/main/java/org/citra/citra_android/utils/EmulationMenuSettings.java @@ -0,0 +1,58 @@ +package org.citra.citra_android.utils; + +import android.content.SharedPreferences; +import android.preference.PreferenceManager; + +import org.citra.citra_android.CitraApplication; + +public class EmulationMenuSettings { + private static SharedPreferences mPreferences = PreferenceManager.getDefaultSharedPreferences(CitraApplication.getAppContext()); + + // These must match what is defined in src/core/settings.h + public static final int LayoutOption_Default = 0; + public static final int LayoutOption_SingleScreen = 1; + public static final int LayoutOption_LargeScreen = 2; + public static final int LayoutOption_SideScreen = 3; + public static final int LayoutOption_MobilePortrait = 4; + public static final int LayoutOption_MobileLandscape = 5; + + public static int getLandscapeScreenLayout() { + return mPreferences.getInt("EmulationMenuSettings_LandscapeScreenLayout", LayoutOption_MobileLandscape); + } + + public static void setLandscapeScreenLayout(int value) { + final SharedPreferences.Editor editor = mPreferences.edit(); + editor.putInt("EmulationMenuSettings_LandscapeScreenLayout", value); + editor.apply(); + } + + public static boolean getShowFps() { + return mPreferences.getBoolean("EmulationMenuSettings_ShowFps", false); + } + + public static void setShowFps(boolean value) { + final SharedPreferences.Editor editor = mPreferences.edit(); + editor.putBoolean("EmulationMenuSettings_ShowFps", value); + editor.apply(); + } + + public static boolean getSwapScreens() { + return mPreferences.getBoolean("EmulationMenuSettings_SwapScreens", false); + } + + public static void setSwapScreens(boolean value) { + final SharedPreferences.Editor editor = mPreferences.edit(); + editor.putBoolean("EmulationMenuSettings_SwapScreens", value); + editor.apply(); + } + + public static boolean getShowOverlay() { + return mPreferences.getBoolean("EmulationMenuSettings_ShowOverylay", true); + } + + public static void setShowOverlay(boolean value) { + final SharedPreferences.Editor editor = mPreferences.edit(); + editor.putBoolean("EmulationMenuSettings_ShowOverylay", value); + editor.apply(); + } +} diff --git a/src/android/app/src/main/jni/config.cpp b/src/android/app/src/main/jni/config.cpp index f18f1e13a..b76d5e567 100644 --- a/src/android/app/src/main/jni/config.cpp +++ b/src/android/app/src/main/jni/config.cpp @@ -124,7 +124,6 @@ void Config::ReadValues() { // Layout Settings::values.layout_option = static_cast(sdl2_config->GetInteger( "Layout", "layout_option", static_cast(Settings::LayoutOption::MobileLandscape))); - Settings::values.swap_screen = sdl2_config->GetBoolean("Layout", "swap_screen", false); Settings::values.custom_layout = sdl2_config->GetBoolean("Layout", "custom_layout", false); Settings::values.custom_top_left = static_cast(sdl2_config->GetInteger("Layout", "custom_top_left", 0)); diff --git a/src/android/app/src/main/jni/native.cpp b/src/android/app/src/main/jni/native.cpp index 3bd2d4940..d75b841cf 100644 --- a/src/android/app/src/main/jni/native.cpp +++ b/src/android/app/src/main/jni/native.cpp @@ -215,9 +215,12 @@ void Java_org_citra_citra_1android_NativeLibrary_NotifyOrientationChange( } void Java_org_citra_citra_1android_NativeLibrary_SwapScreens(JNIEnv* env, jobject obj, + jboolean swap_screens, jboolean is_portrait_mode) { - Settings::values.swap_screen = !Settings::values.swap_screen; - VideoCore::g_renderer->UpdateCurrentFramebufferLayout(is_portrait_mode); + Settings::values.swap_screen = swap_screens; + if (VideoCore::g_renderer) { + VideoCore::g_renderer->UpdateCurrentFramebufferLayout(is_portrait_mode); + } } void Java_org_citra_citra_1android_NativeLibrary_SetUserDirectory(JNIEnv* env, jobject obj, diff --git a/src/android/app/src/main/jni/native.h b/src/android/app/src/main/jni/native.h index 64929da8f..b732788b4 100644 --- a/src/android/app/src/main/jni/native.h +++ b/src/android/app/src/main/jni/native.h @@ -139,7 +139,7 @@ JNIEXPORT void JNICALL Java_org_citra_citra_1android_NativeLibrary_NotifyOrienta JNIEnv* env, jobject obj, jint layout_option, jboolean is_portrait_mode); JNIEXPORT void JNICALL Java_org_citra_citra_1android_NativeLibrary_SwapScreens( - JNIEnv* env, jobject obj, jboolean is_portrait_mode); + JNIEnv* env, jobject obj, jboolean swap_screens, jboolean is_portrait_mode); JNIEXPORT void JNICALL Java_org_citra_citra_1android_NativeLibrary_Run__Ljava_lang_String_2( JNIEnv* env, jclass type, jstring path_); diff --git a/src/android/app/src/main/res/layout/fragment_emulation.xml b/src/android/app/src/main/res/layout/fragment_emulation.xml index efb726e6a..7c1a3ce36 100644 --- a/src/android/app/src/main/res/layout/fragment_emulation.xml +++ b/src/android/app/src/main/res/layout/fragment_emulation.xml @@ -22,7 +22,7 @@ android:focusableInTouchMode="true"/> - - + android:title="@string/emulation_swap_screens" + android:checkable="true"/> + + + + \ 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 05224978e..6782d9015 100644 --- a/src/android/app/src/main/res/values/strings.xml +++ b/src/android/app/src/main/res/values/strings.xml @@ -55,8 +55,6 @@ Emulated region - Show FPS - Show the number of frames rendered per second as a measure of emulation speed. Enable V-Sync Synchronizes the game frame rate to the refresh rate of your device. Enable linear filtering @@ -110,11 +108,12 @@ Take Screenshot Exit - Toggle Perf Stats + Show FPS Configure Controls Edit Layout Done Toggle Controls + Toggle All Adjust Scale Choose Controller You may have to reload the game after changing extensions. @@ -125,6 +124,7 @@ Side by Side Screens Swap Screens Reset Overlay + Show Overlay Close Game Are you sure that you would like to close the current game?