android: frontend: menu: Improve in game options, make check boxes.

This commit is contained in:
bunnei 2019-08-31 15:26:23 -04:00
parent d17dff9bfb
commit 7538244a03
12 changed files with 172 additions and 119 deletions

View File

@ -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,

View File

@ -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 {
}
}

View File

@ -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);
}
}

View File

@ -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) {

View File

@ -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);
}

View File

@ -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();
}
}

View File

@ -124,7 +124,6 @@ void Config::ReadValues() {
// Layout
Settings::values.layout_option = static_cast<Settings::LayoutOption>(sdl2_config->GetInteger(
"Layout", "layout_option", static_cast<int>(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<u16>(sdl2_config->GetInteger("Layout", "custom_top_left", 0));

View File

@ -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,

View File

@ -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_);

View File

@ -22,7 +22,7 @@
android:focusableInTouchMode="true"/>
<TextView
android:id="@+id/perf_stats_text"
android:id="@+id/show_fps_text"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:clickable="false"

View File

@ -25,11 +25,6 @@
</menu>
</item>
<item
android:id="@+id/menu_emulation_toggle_perf_stats"
app:showAsAction="never"
android:title="@string/emulation_toggle_perf_stats"/>
<item
android:id="@+id/menu_emulation_switch_screen_layout"
app:showAsAction="never"
@ -58,6 +53,19 @@
<item
android:id="@+id/menu_emulation_swap_screens"
app:showAsAction="never"
android:title="@string/emulation_swap_screens"/>
android:title="@string/emulation_swap_screens"
android:checkable="true"/>
<item
android:id="@+id/menu_emulation_show_fps"
app:showAsAction="never"
android:title="@string/emulation_show_fps"
android:checkable="true"/>
<item
android:id="@+id/menu_emulation_show_overlay"
app:showAsAction="never"
android:title="@string/emulation_show_overlay"
android:checkable="true"/>
</menu>

View File

@ -55,8 +55,6 @@
<string name="region">Emulated region</string>
<!-- Graphics settings strings -->
<string name="show_fps">Show FPS</string>
<string name="show_fps_description">Show the number of frames rendered per second as a measure of emulation speed.</string>
<string name="vsync">Enable V-Sync</string>
<string name="vsync_description">Synchronizes the game frame rate to the refresh rate of your device.</string>
<string name="linear_filtering">Enable linear filtering</string>
@ -110,11 +108,12 @@
<!-- Emulation Menu -->
<string name="emulation_screenshot">Take Screenshot</string>
<string name="emulation_exit">Exit</string>
<string name="emulation_toggle_perf_stats">Toggle Perf Stats</string>
<string name="emulation_show_fps">Show FPS</string>
<string name="emulation_configure_controls">Configure Controls</string>
<string name="emulation_edit_layout">Edit Layout</string>
<string name="emulation_done">Done</string>
<string name="emulation_toggle_controls">Toggle Controls</string>
<string name="emulation_toggle_all">Toggle All</string>
<string name="emulation_control_scale">Adjust Scale</string>
<string name="emulation_choose_controller">Choose Controller</string>
<string name="emulation_controller_changed">You may have to reload the game after changing extensions.</string>
@ -125,6 +124,7 @@
<string name="emulation_screen_layout_sidebyside">Side by Side Screens</string>
<string name="emulation_swap_screens">Swap Screens</string>
<string name="emulation_touch_overlay_reset">Reset Overlay</string>
<string name="emulation_show_overlay">Show Overlay</string>
<string name="emulation_close_game">Close Game</string>
<string name="emulation_close_game_message">Are you sure that you would like to close the current game?</string>