summaryrefslogtreecommitdiff
path: root/Source/Android/app/src
diff options
context:
space:
mode:
Diffstat (limited to 'Source/Android/app/src')
-rw-r--r--Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/activities/EmulationActivity.java267
-rw-r--r--Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/dialogs/MotionAlertDialog.java5
-rw-r--r--Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/fragments/MenuFragment.java96
-rw-r--r--Source/Android/app/src/main/res/layout-notouch/fragment_emulation.xml (renamed from Source/Android/app/src/main/res/layout-television/fragment_emulation.xml)0
-rw-r--r--Source/Android/app/src/main/res/layout-port-notouch/fragment_emulation.xml7
-rw-r--r--Source/Android/app/src/main/res/layout-television/activity_emulation.xml38
-rw-r--r--Source/Android/app/src/main/res/layout/activity_emulation.xml25
-rw-r--r--Source/Android/app/src/main/res/layout/fragment_ingame_menu.xml31
-rw-r--r--Source/Android/app/src/main/res/layout/fragment_saveload_state.xml18
-rw-r--r--Source/Android/app/src/main/res/menu/menu_emulation.xml143
-rw-r--r--Source/Android/app/src/main/res/menu/menu_emulation_wii.xml163
-rw-r--r--Source/Android/app/src/main/res/menu/menu_overlay_controls_gc.xml30
-rw-r--r--Source/Android/app/src/main/res/menu/menu_overlay_controls_wii.xml53
-rw-r--r--Source/Android/app/src/main/res/values-w540dp/integers.xml5
-rw-r--r--Source/Android/app/src/main/res/values-w660dp/integers.xml5
-rw-r--r--Source/Android/app/src/main/res/values/integers.xml2
-rw-r--r--Source/Android/app/src/main/res/values/strings.xml4
-rw-r--r--Source/Android/app/src/main/res/values/styles.xml16
18 files changed, 344 insertions, 564 deletions
diff --git a/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/activities/EmulationActivity.java b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/activities/EmulationActivity.java
index 090e22a1bb..2e5430d9ee 100644
--- a/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/activities/EmulationActivity.java
+++ b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/activities/EmulationActivity.java
@@ -5,8 +5,8 @@ import android.content.DialogInterface;
import android.content.Intent;
import android.content.SharedPreferences;
import android.content.pm.ActivityInfo;
+import android.graphics.Rect;
import android.os.Bundle;
-import android.os.Handler;
import android.preference.PreferenceManager;
import android.text.TextUtils;
import android.util.SparseIntArray;
@@ -23,8 +23,10 @@ import android.widget.Toast;
import androidx.annotation.IntDef;
import androidx.annotation.NonNull;
+import androidx.annotation.Nullable;
import androidx.appcompat.app.AlertDialog;
import androidx.appcompat.app.AppCompatActivity;
+import androidx.appcompat.widget.PopupMenu;
import androidx.fragment.app.Fragment;
import androidx.fragment.app.FragmentActivity;
import androidx.fragment.app.FragmentManager;
@@ -62,7 +64,6 @@ public final class EmulationActivity extends AppCompatActivity
private static final String BACKSTACK_NAME_SUBMENU = "submenu";
public static final int REQUEST_CHANGE_DISC = 1;
- private View mDecorView;
private EmulationFragment mEmulationFragment;
private SharedPreferences mPreferences;
@@ -70,9 +71,6 @@ public final class EmulationActivity extends AppCompatActivity
private Settings mSettings;
- private MenuItem mPauseEmulationButton;
- private MenuItem mUnpauseEmulationButton;
-
private boolean mDeviceHasTouchScreen;
private boolean mMenuVisible;
@@ -85,7 +83,6 @@ public final class EmulationActivity extends AppCompatActivity
private int mPlatform;
private String[] mPaths;
private static boolean sUserPausedEmulation;
- private boolean backPressedOnce = false;
public static final String EXTRA_SELECTED_GAMES = "SelectedGames";
public static final String EXTRA_SELECTED_TITLE = "SelectedTitle";
@@ -104,7 +101,7 @@ public final class EmulationActivity extends AppCompatActivity
MENU_ACTION_LOAD_SLOT6, MENU_ACTION_EXIT, MENU_ACTION_CHANGE_DISC,
MENU_ACTION_RESET_OVERLAY, MENU_SET_IR_SENSITIVITY, MENU_ACTION_CHOOSE_DOUBLETAP,
MENU_ACTION_SCREEN_ORIENTATION, MENU_ACTION_MOTION_CONTROLS, MENU_ACTION_PAUSE_EMULATION,
- MENU_ACTION_UNPAUSE_EMULATION})
+ MENU_ACTION_UNPAUSE_EMULATION, MENU_ACTION_OVERLAY_CONTROLS})
public @interface MenuAction
{
}
@@ -142,7 +139,7 @@ public final class EmulationActivity extends AppCompatActivity
public static final int MENU_ACTION_MOTION_CONTROLS = 30;
public static final int MENU_ACTION_PAUSE_EMULATION = 31;
public static final int MENU_ACTION_UNPAUSE_EMULATION = 32;
-
+ public static final int MENU_ACTION_OVERLAY_CONTROLS = 33;
private static SparseIntArray buttonsActionsMap = new SparseIntArray();
@@ -156,33 +153,6 @@ public final class EmulationActivity extends AppCompatActivity
.append(R.id.menu_emulation_adjust_scale, EmulationActivity.MENU_ACTION_ADJUST_SCALE);
buttonsActionsMap.append(R.id.menu_emulation_choose_controller,
EmulationActivity.MENU_ACTION_CHOOSE_CONTROLLER);
- buttonsActionsMap
- .append(R.id.menu_refresh_wiimotes, EmulationActivity.MENU_ACTION_REFRESH_WIIMOTES);
- buttonsActionsMap
- .append(R.id.menu_emulation_pause, EmulationActivity.MENU_ACTION_PAUSE_EMULATION);
- buttonsActionsMap
- .append(R.id.menu_emulation_unpause, EmulationActivity.MENU_ACTION_UNPAUSE_EMULATION);
- buttonsActionsMap
- .append(R.id.menu_emulation_screenshot, EmulationActivity.MENU_ACTION_TAKE_SCREENSHOT);
-
- buttonsActionsMap.append(R.id.menu_quicksave, EmulationActivity.MENU_ACTION_QUICK_SAVE);
- buttonsActionsMap.append(R.id.menu_quickload, EmulationActivity.MENU_ACTION_QUICK_LOAD);
- buttonsActionsMap
- .append(R.id.menu_emulation_save_root, EmulationActivity.MENU_ACTION_SAVE_ROOT);
- buttonsActionsMap
- .append(R.id.menu_emulation_load_root, EmulationActivity.MENU_ACTION_LOAD_ROOT);
- buttonsActionsMap.append(R.id.menu_emulation_save_1, EmulationActivity.MENU_ACTION_SAVE_SLOT1);
- buttonsActionsMap.append(R.id.menu_emulation_save_2, EmulationActivity.MENU_ACTION_SAVE_SLOT2);
- buttonsActionsMap.append(R.id.menu_emulation_save_3, EmulationActivity.MENU_ACTION_SAVE_SLOT3);
- buttonsActionsMap.append(R.id.menu_emulation_save_4, EmulationActivity.MENU_ACTION_SAVE_SLOT4);
- buttonsActionsMap.append(R.id.menu_emulation_save_5, EmulationActivity.MENU_ACTION_SAVE_SLOT5);
- buttonsActionsMap.append(R.id.menu_emulation_load_1, EmulationActivity.MENU_ACTION_LOAD_SLOT1);
- buttonsActionsMap.append(R.id.menu_emulation_load_2, EmulationActivity.MENU_ACTION_LOAD_SLOT2);
- buttonsActionsMap.append(R.id.menu_emulation_load_3, EmulationActivity.MENU_ACTION_LOAD_SLOT3);
- buttonsActionsMap.append(R.id.menu_emulation_load_4, EmulationActivity.MENU_ACTION_LOAD_SLOT4);
- buttonsActionsMap.append(R.id.menu_emulation_load_5, EmulationActivity.MENU_ACTION_LOAD_SLOT5);
- buttonsActionsMap.append(R.id.menu_change_disc, EmulationActivity.MENU_ACTION_CHANGE_DISC);
- buttonsActionsMap.append(R.id.menu_exit, EmulationActivity.MENU_ACTION_EXIT);
buttonsActionsMap.append(R.id.menu_emulation_joystick_rel_center,
EmulationActivity.MENU_ACTION_JOYSTICK_REL_CENTER);
buttonsActionsMap.append(R.id.menu_emulation_rumble, EmulationActivity.MENU_ACTION_RUMBLE);
@@ -192,8 +162,6 @@ public final class EmulationActivity extends AppCompatActivity
EmulationActivity.MENU_SET_IR_SENSITIVITY);
buttonsActionsMap.append(R.id.menu_emulation_choose_doubletap,
EmulationActivity.MENU_ACTION_CHOOSE_DOUBLETAP);
- buttonsActionsMap.append(R.id.menu_screen_orientation,
- EmulationActivity.MENU_ACTION_SCREEN_ORIENTATION);
buttonsActionsMap.append(R.id.menu_emulation_motion_controls,
EmulationActivity.MENU_ACTION_MOTION_CONTROLS);
}
@@ -317,33 +285,10 @@ public final class EmulationActivity extends AppCompatActivity
mDeviceHasTouchScreen = getPackageManager().hasSystemFeature("android.hardware.touchscreen");
mMotionListener = new MotionListener(this);
- int themeId;
- if (mDeviceHasTouchScreen)
- {
- themeId = R.style.DolphinEmulationBase;
-
- // Get a handle to the Window containing the UI.
- mDecorView = getWindow().getDecorView();
- mDecorView.setOnSystemUiVisibilityChangeListener(visibility ->
- {
- if ((visibility & View.SYSTEM_UI_FLAG_FULLSCREEN) == 0)
- {
- // Go back to immersive fullscreen mode in 3s
- Handler handler = new Handler(getMainLooper());
- handler.postDelayed(this::enableFullscreenImmersive, 3000 /* 3s */);
- }
- });
- // Set these options now so that the SurfaceView the game renders into is the right size.
- enableFullscreenImmersive();
- Toast.makeText(this, getString(R.string.emulation_touch_button_help), Toast.LENGTH_LONG)
- .show();
- }
- else
- {
- themeId = R.style.DolphinEmulationTvBase;
- }
+ // Set these options now so that the SurfaceView the game renders into is the right size.
+ enableFullscreenImmersive();
- setTheme(themeId);
+ Toast.makeText(this, getString(R.string.emulation_menu_help), Toast.LENGTH_LONG).show();
Rumble.initRumble(this);
@@ -360,10 +305,7 @@ public final class EmulationActivity extends AppCompatActivity
.commit();
}
- if (mDeviceHasTouchScreen)
- {
- setTitle(mSelectedTitle);
- }
+ setTitle(mSelectedTitle);
}
@Override
@@ -391,9 +333,19 @@ public final class EmulationActivity extends AppCompatActivity
}
@Override
+ public void onWindowFocusChanged(boolean hasFocus)
+ {
+ if (hasFocus)
+ {
+ enableFullscreenImmersive();
+ }
+ }
+
+ @Override
protected void onResume()
{
super.onResume();
+
if (!sIsGameCubeGame && mPreferences.getInt("motionControlsEnabled", 0) != 2)
mMotionListener.enable();
}
@@ -414,29 +366,22 @@ public final class EmulationActivity extends AppCompatActivity
@Override
public void onBackPressed()
{
- if (!mDeviceHasTouchScreen)
+ if (!closeSubmenu())
{
- boolean popResult = getSupportFragmentManager().popBackStackImmediate(
- BACKSTACK_NAME_SUBMENU, FragmentManager.POP_BACK_STACK_INCLUSIVE);
- if (!popResult)
- {
- toggleMenu();
- }
+ toggleMenu();
}
- else
+ }
+
+ @Override
+ public boolean onKeyLongPress(int keyCode, @NonNull KeyEvent event)
+ {
+ if (keyCode == KeyEvent.KEYCODE_BACK)
{
- if (backPressedOnce)
- {
- mEmulationFragment.stopEmulation();
- finish();
- }
- else
- {
- backPressedOnce = true;
- Toast.makeText(this, "Press back again to exit", Toast.LENGTH_LONG).show();
- new Handler().postDelayed(() -> backPressedOnce = false, 3000);
- }
+ mEmulationFragment.stopEmulation();
+ finish();
+ return true;
}
+ return super.onKeyLongPress(keyCode, event);
}
@Override
@@ -459,14 +404,13 @@ public final class EmulationActivity extends AppCompatActivity
private void enableFullscreenImmersive()
{
- // It would be nice to use IMMERSIVE_STICKY, but that doesn't show the toolbar.
- mDecorView.setSystemUiVisibility(
+ getWindow().getDecorView().setSystemUiVisibility(
View.SYSTEM_UI_FLAG_LAYOUT_STABLE |
View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION |
View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN |
View.SYSTEM_UI_FLAG_HIDE_NAVIGATION |
View.SYSTEM_UI_FLAG_FULLSCREEN |
- View.SYSTEM_UI_FLAG_IMMERSIVE);
+ View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY);
}
private void updateOrientation()
@@ -475,13 +419,22 @@ public final class EmulationActivity extends AppCompatActivity
ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE));
}
- private void toggleMenu()
+ private boolean closeSubmenu()
+ {
+ return getSupportFragmentManager().popBackStackImmediate(BACKSTACK_NAME_SUBMENU,
+ FragmentManager.POP_BACK_STACK_INCLUSIVE);
+ }
+
+ private boolean closeMenu()
{
- boolean result = getSupportFragmentManager().popBackStackImmediate(
- BACKSTACK_NAME_MENU, FragmentManager.POP_BACK_STACK_INCLUSIVE);
mMenuVisible = false;
+ return getSupportFragmentManager().popBackStackImmediate(BACKSTACK_NAME_MENU,
+ FragmentManager.POP_BACK_STACK_INCLUSIVE);
+ }
- if (!result)
+ private void toggleMenu()
+ {
+ if (!closeMenu())
{
// Removing the menu failed, so that means it wasn't visible. Add it.
Fragment fragment = MenuFragment.newInstance(mSelectedTitle);
@@ -498,35 +451,13 @@ public final class EmulationActivity extends AppCompatActivity
}
}
- @Override
- public boolean onCreateOptionsMenu(Menu menu)
+ public void showOverlayControlsMenu(@NonNull View anchor)
{
- // Inflate the menu; this adds items to the action bar if it is present.
- if (sIsGameCubeGame)
- {
- getMenuInflater().inflate(R.menu.menu_emulation, menu);
- }
- else
- {
- getMenuInflater().inflate(R.menu.menu_emulation_wii, menu);
- }
-
- mPauseEmulationButton = menu.findItem(R.id.menu_emulation_pause);
- mUnpauseEmulationButton = menu.findItem(R.id.menu_emulation_unpause);
-
- if (sUserPausedEmulation)
- {
- showUnpauseEmulationButton();
- }
+ PopupMenu popup = new PopupMenu(this, anchor);
+ Menu menu = popup.getMenu();
- if (mSettings.getSection(SettingsFile.FILE_NAME_DOLPHIN, Settings.SECTION_INI_CORE)
- .getBoolean(SettingsFile.KEY_ENABLE_SAVE_STATES, false))
- {
- menu.findItem(R.id.menu_quicksave).setVisible(true);
- menu.findItem(R.id.menu_quickload).setVisible(true);
- menu.findItem(R.id.menu_emulation_save_root).setVisible(true);
- menu.findItem(R.id.menu_emulation_load_root).setVisible(true);
- }
+ int id = sIsGameCubeGame ? R.menu.menu_overlay_controls_gc : R.menu.menu_overlay_controls_wii;
+ popup.getMenuInflater().inflate(id, menu);
// Populate the checkbox value for joystick center on touch
menu.findItem(R.id.menu_emulation_joystick_rel_center)
@@ -534,7 +465,9 @@ public final class EmulationActivity extends AppCompatActivity
menu.findItem(R.id.menu_emulation_rumble)
.setChecked(mPreferences.getBoolean("phoneRumble", true));
- return true;
+ popup.setOnMenuItemClickListener(this::onOptionsItemSelected);
+
+ popup.show();
}
@SuppressWarnings("WrongConstant")
@@ -608,13 +541,11 @@ public final class EmulationActivity extends AppCompatActivity
case MENU_ACTION_PAUSE_EMULATION:
sUserPausedEmulation = true;
NativeLibrary.PauseEmulation();
- showUnpauseEmulationButton();
return;
case MENU_ACTION_UNPAUSE_EMULATION:
sUserPausedEmulation = false;
NativeLibrary.UnPauseEmulation();
- showPauseEmulationButton();
return;
// Screenshot capturing
@@ -631,19 +562,12 @@ public final class EmulationActivity extends AppCompatActivity
NativeLibrary.LoadState(9);
return;
- // TV Menu only
case MENU_ACTION_SAVE_ROOT:
- if (!mDeviceHasTouchScreen)
- {
- showSubMenu(SaveLoadStateFragment.SaveOrLoad.SAVE);
- }
+ showSubMenu(SaveLoadStateFragment.SaveOrLoad.SAVE);
return;
case MENU_ACTION_LOAD_ROOT:
- if (!mDeviceHasTouchScreen)
- {
- showSubMenu(SaveLoadStateFragment.SaveOrLoad.LOAD);
- }
+ showSubMenu(SaveLoadStateFragment.SaveOrLoad.LOAD);
return;
// Save state slots
@@ -718,37 +642,17 @@ public final class EmulationActivity extends AppCompatActivity
return;
case MENU_ACTION_EXIT:
- // ATV menu is built using a fragment, this will pop that fragment before emulation ends.
- if (TvUtil.isLeanback(getApplicationContext()))
- toggleMenu(); // Hide the menu (it will be showing since we just clicked it)
mEmulationFragment.stopEmulation();
finish();
return;
}
}
- private void showPauseEmulationButton()
- {
- mUnpauseEmulationButton.setVisible(false);
- mPauseEmulationButton.setVisible(true);
- }
-
- private void showUnpauseEmulationButton()
- {
- mPauseEmulationButton.setVisible(false);
- mUnpauseEmulationButton.setVisible(true);
- }
-
public static boolean getHasUserPausedEmulation()
{
return sUserPausedEmulation;
}
- public static void setHasUserPausedEmulation(boolean value)
- {
- sUserPausedEmulation = value;
- }
-
private void toggleJoystickRelCenter(boolean state)
{
final SharedPreferences.Editor editor = mPreferences.edit();
@@ -764,7 +668,6 @@ public final class EmulationActivity extends AppCompatActivity
Rumble.setPhoneVibrator(state, this);
}
-
private void editControlsPlacement()
{
if (mEmulationFragment.isConfiguringControls())
@@ -773,6 +676,8 @@ public final class EmulationActivity extends AppCompatActivity
}
else
{
+ closeSubmenu();
+ closeMenu();
mEmulationFragment.startConfiguringControls();
}
}
@@ -781,7 +686,7 @@ public final class EmulationActivity extends AppCompatActivity
@Override
public boolean dispatchKeyEvent(KeyEvent event)
{
- if (mMenuVisible)
+ if (mMenuVisible || event.getKeyCode() == KeyEvent.KEYCODE_BACK)
{
return super.dispatchKeyEvent(event);
}
@@ -791,14 +696,6 @@ public final class EmulationActivity extends AppCompatActivity
switch (event.getAction())
{
case KeyEvent.ACTION_DOWN:
- // Handling the case where the back button is pressed.
- if (event.getKeyCode() == KeyEvent.KEYCODE_BACK)
- {
- onBackPressed();
- return true;
- }
-
- // Normal key events.
action = NativeLibrary.ButtonState.PRESSED;
break;
case KeyEvent.ACTION_UP:
@@ -1176,6 +1073,52 @@ public final class EmulationActivity extends AppCompatActivity
.show();
}
+ private static boolean areCoordinatesOutside(@Nullable View view, float x, float y)
+ {
+ if (view == null)
+ {
+ return true;
+ }
+
+ Rect viewBounds = new Rect();
+ view.getGlobalVisibleRect(viewBounds);
+ return !viewBounds.contains(Math.round(x), Math.round(y));
+ }
+
+ @Override
+ public boolean dispatchTouchEvent(MotionEvent event)
+ {
+ if (event.getActionMasked() == MotionEvent.ACTION_DOWN)
+ {
+ boolean anyMenuClosed = false;
+
+ Fragment submenu = getSupportFragmentManager().findFragmentById(R.id.frame_submenu);
+ if (submenu != null && areCoordinatesOutside(submenu.getView(), event.getX(), event.getY()))
+ {
+ closeSubmenu();
+ submenu = null;
+ anyMenuClosed = true;
+ }
+
+ if (submenu == null)
+ {
+ Fragment menu = getSupportFragmentManager().findFragmentById(R.id.frame_menu);
+ if (menu != null && areCoordinatesOutside(menu.getView(), event.getX(), event.getY()))
+ {
+ closeMenu();
+ anyMenuClosed = true;
+ }
+ }
+
+ if (anyMenuClosed)
+ {
+ return true;
+ }
+ }
+
+ return super.dispatchTouchEvent(event);
+ }
+
@Override
public boolean dispatchGenericMotionEvent(MotionEvent event)
{
diff --git a/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/dialogs/MotionAlertDialog.java b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/dialogs/MotionAlertDialog.java
index 39140c4829..6b633e9aec 100644
--- a/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/dialogs/MotionAlertDialog.java
+++ b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/dialogs/MotionAlertDialog.java
@@ -12,7 +12,6 @@ import org.dolphinemu.dolphinemu.features.settings.model.view.InputBindingSettin
import org.dolphinemu.dolphinemu.features.settings.ui.SettingsAdapter;
import org.dolphinemu.dolphinemu.utils.ControllerMappingHelper;
import org.dolphinemu.dolphinemu.utils.Log;
-import org.dolphinemu.dolphinemu.utils.TvUtil;
import java.util.ArrayList;
import java.util.List;
@@ -63,8 +62,8 @@ public final class MotionAlertDialog extends AlertDialog
@Override
public boolean onKeyLongPress(int keyCode, @NonNull KeyEvent event)
{
- // Option to clear by long back is only needed on the TV interface
- if (TvUtil.isLeanback(getContext()) && keyCode == KeyEvent.KEYCODE_BACK)
+ // Intended for devices with no touchscreen or mouse
+ if (keyCode == KeyEvent.KEYCODE_BACK)
{
setting.clearValue(mAdapter.getSettings());
dismiss();
diff --git a/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/fragments/MenuFragment.java b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/fragments/MenuFragment.java
index 2e55d0df70..2d053a99d7 100644
--- a/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/fragments/MenuFragment.java
+++ b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/fragments/MenuFragment.java
@@ -1,5 +1,7 @@
package org.dolphinemu.dolphinemu.fragments;
+import android.content.pm.PackageManager;
+import android.graphics.Rect;
import android.os.Bundle;
import android.util.SparseIntArray;
import android.view.LayoutInflater;
@@ -19,8 +21,10 @@ import org.dolphinemu.dolphinemu.features.settings.utils.SettingsFile;
public final class MenuFragment extends Fragment implements View.OnClickListener
{
+ private TextView mTitleText;
private View mPauseEmulation;
private View mUnpauseEmulation;
+
private static final String KEY_TITLE = "title";
private static SparseIntArray buttonsActionsMap = new SparseIntArray();
@@ -39,7 +43,11 @@ public final class MenuFragment extends Fragment implements View.OnClickListener
buttonsActionsMap
.append(R.id.menu_emulation_load_root, EmulationActivity.MENU_ACTION_LOAD_ROOT);
buttonsActionsMap
+ .append(R.id.menu_overlay_controls, EmulationActivity.MENU_ACTION_OVERLAY_CONTROLS);
+ buttonsActionsMap
.append(R.id.menu_refresh_wiimotes, EmulationActivity.MENU_ACTION_REFRESH_WIIMOTES);
+ buttonsActionsMap
+ .append(R.id.menu_screen_orientation, EmulationActivity.MENU_ACTION_SCREEN_ORIENTATION);
buttonsActionsMap.append(R.id.menu_change_disc, EmulationActivity.MENU_ACTION_CHANGE_DISC);
buttonsActionsMap.append(R.id.menu_exit, EmulationActivity.MENU_ACTION_EXIT);
}
@@ -55,6 +63,14 @@ public final class MenuFragment extends Fragment implements View.OnClickListener
return fragment;
}
+ // This is primarily intended to account for any navigation bar at the bottom of the screen
+ private int getBottomPaddingRequired()
+ {
+ Rect visibleFrame = new Rect();
+ requireActivity().getWindow().getDecorView().getWindowVisibleDisplayFrame(visibleFrame);
+ return visibleFrame.bottom - visibleFrame.top - getResources().getDisplayMetrics().heightPixels;
+ }
+
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState)
{
@@ -65,10 +81,7 @@ public final class MenuFragment extends Fragment implements View.OnClickListener
mPauseEmulation = options.findViewById(R.id.menu_pause_emulation);
mUnpauseEmulation = options.findViewById(R.id.menu_unpause_emulation);
- if (EmulationActivity.getHasUserPausedEmulation())
- {
- showUnpauseEmulationButton();
- }
+ updatePauseUnpauseVisibility();
boolean enableSaveStates = ((EmulationActivity) getActivity()).getSettings()
.getSection(SettingsFile.FILE_NAME_DOLPHIN, Settings.SECTION_INI_CORE)
@@ -82,6 +95,41 @@ public final class MenuFragment extends Fragment implements View.OnClickListener
options.findViewById(R.id.menu_emulation_load_root).setVisibility(View.VISIBLE);
}
+ PackageManager packageManager = requireActivity().getPackageManager();
+
+ if (!packageManager.hasSystemFeature(PackageManager.FEATURE_TOUCHSCREEN))
+ {
+ options.findViewById(R.id.menu_overlay_controls).setVisibility(View.GONE);
+ }
+
+ if (EmulationActivity.isGameCubeGame())
+ {
+ options.findViewById(R.id.menu_refresh_wiimotes).setVisibility(View.GONE);
+ }
+
+ // Old devices which support both portrait and landscape may report support for neither,
+ // so we only hide the orientation button if the device only supports one orientation
+ if (packageManager.hasSystemFeature(PackageManager.FEATURE_SCREEN_PORTRAIT) !=
+ packageManager.hasSystemFeature(PackageManager.FEATURE_SCREEN_LANDSCAPE))
+ {
+ options.findViewById(R.id.menu_screen_orientation).setVisibility(View.GONE);
+ }
+
+ int bottomPaddingRequired = getBottomPaddingRequired();
+
+ // Provide a safe zone between the navigation bar and Exit Emulation to avoid accidental touches
+ float density = getResources().getDisplayMetrics().density;
+ if (bottomPaddingRequired >= 32 * density)
+ {
+ bottomPaddingRequired += 32 * density;
+ }
+
+ if (bottomPaddingRequired > rootView.getPaddingBottom())
+ {
+ rootView.setPadding(rootView.getPaddingLeft(), rootView.getPaddingTop(),
+ rootView.getPaddingRight(), bottomPaddingRequired);
+ }
+
for (int childIndex = 0; childIndex < options.getChildCount(); childIndex++)
{
Button button = (Button) options.getChildAt(childIndex);
@@ -89,26 +137,24 @@ public final class MenuFragment extends Fragment implements View.OnClickListener
button.setOnClickListener(this);
}
- TextView titleText = rootView.findViewById(R.id.text_game_title);
+ rootView.findViewById(R.id.menu_exit).setOnClickListener(this);
+
+ mTitleText = rootView.findViewById(R.id.text_game_title);
String title = getArguments().getString(KEY_TITLE);
if (title != null)
{
- titleText.setText(title);
+ mTitleText.setText(title);
}
return rootView;
}
- private void showPauseEmulationButton()
+ private void updatePauseUnpauseVisibility()
{
- mUnpauseEmulation.setVisibility(View.GONE);
- mPauseEmulation.setVisibility(View.VISIBLE);
- }
+ boolean paused = EmulationActivity.getHasUserPausedEmulation();
- private void showUnpauseEmulationButton()
- {
- mPauseEmulation.setVisibility(View.GONE);
- mUnpauseEmulation.setVisibility(View.VISIBLE);
+ mUnpauseEmulation.setVisibility(paused ? View.VISIBLE : View.GONE);
+ mPauseEmulation.setVisibility(paused ? View.GONE : View.VISIBLE);
}
@SuppressWarnings("WrongConstant")
@@ -116,21 +162,23 @@ public final class MenuFragment extends Fragment implements View.OnClickListener
public void onClick(View button)
{
int action = buttonsActionsMap.get(button.getId());
- if (action == EmulationActivity.MENU_ACTION_PAUSE_EMULATION)
+ EmulationActivity activity = (EmulationActivity) requireActivity();
+
+ if (action == EmulationActivity.MENU_ACTION_OVERLAY_CONTROLS)
{
- EmulationActivity.setHasUserPausedEmulation(true);
- NativeLibrary.PauseEmulation();
- showUnpauseEmulationButton();
+ // We could use the button parameter as the anchor here, but this often results in a tiny menu
+ // (because the button often is in the middle of the screen), so let's use mTitleText instead
+ activity.showOverlayControlsMenu(mTitleText);
}
- else if (action == EmulationActivity.MENU_ACTION_UNPAUSE_EMULATION)
+ else if (action >= 0)
{
- EmulationActivity.setHasUserPausedEmulation(false);
- NativeLibrary.UnPauseEmulation();
- showPauseEmulationButton();
+ activity.handleMenuAction(action);
}
- else if (action >= 0)
+
+ if (action == EmulationActivity.MENU_ACTION_PAUSE_EMULATION ||
+ action == EmulationActivity.MENU_ACTION_UNPAUSE_EMULATION)
{
- ((EmulationActivity) getActivity()).handleMenuAction(action);
+ updatePauseUnpauseVisibility();
}
}
}
diff --git a/Source/Android/app/src/main/res/layout-television/fragment_emulation.xml b/Source/Android/app/src/main/res/layout-notouch/fragment_emulation.xml
index 1766a2c8e6..1766a2c8e6 100644
--- a/Source/Android/app/src/main/res/layout-television/fragment_emulation.xml
+++ b/Source/Android/app/src/main/res/layout-notouch/fragment_emulation.xml
diff --git a/Source/Android/app/src/main/res/layout-port-notouch/fragment_emulation.xml b/Source/Android/app/src/main/res/layout-port-notouch/fragment_emulation.xml
new file mode 100644
index 0000000000..1766a2c8e6
--- /dev/null
+++ b/Source/Android/app/src/main/res/layout-port-notouch/fragment_emulation.xml
@@ -0,0 +1,7 @@
+<SurfaceView xmlns:android="http://schemas.android.com/apk/res/android"
+ android:id="@+id/surface_emulation"
+ android:layout_height="match_parent"
+ android:layout_width="match_parent"
+ android:focusable="false"
+ android:focusableInTouchMode="false"
+ /> \ No newline at end of file
diff --git a/Source/Android/app/src/main/res/layout-television/activity_emulation.xml b/Source/Android/app/src/main/res/layout-television/activity_emulation.xml
deleted file mode 100644
index 5e516d04ad..0000000000
--- a/Source/Android/app/src/main/res/layout-television/activity_emulation.xml
+++ /dev/null
@@ -1,38 +0,0 @@
-<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
- android:layout_width="match_parent"
- android:layout_height="match_parent"
- android:keepScreenOn="true"
- xmlns:tools="http://schemas.android.com/tools"
- android:id="@+id/frame_content">
-
- <FrameLayout
- android:id="@+id/frame_emulation_fragment"
- android:layout_width="match_parent"
- android:layout_height="match_parent"/>
-
- <org.dolphinemu.dolphinemu.ui.NVidiaShieldWorkaroundView
- android:layout_width="match_parent"
- android:layout_height="match_parent"/>
-
- <LinearLayout
- android:layout_width="match_parent"
- android:layout_height="match_parent"
- android:orientation="horizontal"
- android:baselineAligned="false">
-
- <FrameLayout
- android:id="@+id/frame_menu"
- android:layout_width="0dp"
- android:layout_height="match_parent"
- android:layout_weight=".25"
- tools:layout="@layout/fragment_ingame_menu"/>
-
- <FrameLayout
- android:id="@+id/frame_submenu"
- android:layout_width="0dp"
- android:layout_height="match_parent"
- android:layout_weight=".75"/>
-
- </LinearLayout>
-
-</FrameLayout>
diff --git a/Source/Android/app/src/main/res/layout/activity_emulation.xml b/Source/Android/app/src/main/res/layout/activity_emulation.xml
index 2ebea4fc34..c3be452d67 100644
--- a/Source/Android/app/src/main/res/layout/activity_emulation.xml
+++ b/Source/Android/app/src/main/res/layout/activity_emulation.xml
@@ -1,6 +1,8 @@
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
+ android:keepScreenOn="true"
+ xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/frame_content">
<FrameLayout
@@ -8,4 +10,27 @@
android:layout_width="match_parent"
android:layout_height="match_parent"/>
+ <org.dolphinemu.dolphinemu.ui.NVidiaShieldWorkaroundView
+ android:layout_width="match_parent"
+ android:layout_height="match_parent"/>
+
+ <LinearLayout
+ android:layout_width="match_parent"
+ android:layout_height="match_parent"
+ android:orientation="horizontal"
+ android:baselineAligned="false">
+
+ <FrameLayout
+ android:id="@+id/frame_menu"
+ android:layout_width="260dp"
+ android:layout_height="match_parent"
+ tools:layout="@layout/fragment_ingame_menu"/>
+
+ <FrameLayout
+ android:id="@+id/frame_submenu"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent"/>
+
+ </LinearLayout>
+
</FrameLayout>
diff --git a/Source/Android/app/src/main/res/layout/fragment_ingame_menu.xml b/Source/Android/app/src/main/res/layout/fragment_ingame_menu.xml
index aa0f307e91..54295f0eac 100644
--- a/Source/Android/app/src/main/res/layout/fragment_ingame_menu.xml
+++ b/Source/Android/app/src/main/res/layout/fragment_ingame_menu.xml
@@ -4,6 +4,7 @@
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent"
+ android:paddingBottom="16dp"
android:background="@color/dolphin_blue_dark"
tools:layout_width="250dp">
@@ -14,7 +15,9 @@
tools:text="The Legend of Zelda: The Wind Waker"
android:textColor="@android:color/white"
android:textSize="20sp"
- android:layout_margin="32dp"/>
+ android:layout_marginHorizontal="32dp"
+ android:layout_marginTop="32dp"
+ android:layout_marginBottom="16dp"/>
<ScrollView
android:layout_width="match_parent"
@@ -68,22 +71,40 @@
android:visibility="gone"/>
<Button
+ android:id="@+id/menu_overlay_controls"
+ android:text="@string/emulation_overlay_controls"
+ style="@style/InGameMenuOption"/>
+
+ <Button
android:id="@+id/menu_refresh_wiimotes"
android:text="@string/emulation_refresh_wiimotes"
style="@style/InGameMenuOption"/>
<Button
- android:id="@+id/menu_change_disc"
- android:text="@string/emulation_change_disc"
+ android:id="@+id/menu_screen_orientation"
+ android:text="@string/emulation_screen_orientation"
style="@style/InGameMenuOption"/>
<Button
- android:id="@+id/menu_exit"
- android:text="@string/emulation_exit"
+ android:id="@+id/menu_change_disc"
+ android:text="@string/emulation_change_disc"
style="@style/InGameMenuOption"/>
</LinearLayout>
</ScrollView>
+ <View
+ android:id="@+id/divider"
+ android:layout_width="match_parent"
+ android:layout_height="1dp"
+ android:background="#FFFFFF"
+ android:layout_marginTop="24dp"
+ android:layout_marginBottom="16dp"/>
+
+ <Button
+ android:id="@+id/menu_exit"
+ android:text="@string/emulation_exit"
+ style="@style/InGameMenuOption"/>
+
</LinearLayout>
diff --git a/Source/Android/app/src/main/res/layout/fragment_saveload_state.xml b/Source/Android/app/src/main/res/layout/fragment_saveload_state.xml
index 0fb87d44a3..d8c0f6354a 100644
--- a/Source/Android/app/src/main/res/layout/fragment_saveload_state.xml
+++ b/Source/Android/app/src/main/res/layout/fragment_saveload_state.xml
@@ -2,51 +2,51 @@
android:id="@+id/grid_state_slots"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
- android:columnCount="3"
- android:rowCount="2"
+ android:columnCount="@integer/loadsave_state_columns"
+ android:rowCount="@integer/loadsave_state_rows"
android:layout_gravity="center"
android:background="#af000000">
<Button
android:id="@+id/loadsave_state_button_1"
android:layout_width="128dp"
- android:layout_height="128dp"
+ android:layout_height="96dp"
android:text="@string/emulation_slot1"
style="@style/OverlayInGameMenuOption"/>
<Button
android:id="@+id/loadsave_state_button_2"
android:layout_width="128dp"
- android:layout_height="128dp"
+ android:layout_height="96dp"
android:text="@string/emulation_slot2"
style="@style/OverlayInGameMenuOption"/>
<Button
android:id="@+id/loadsave_state_button_3"
android:layout_width="128dp"
- android:layout_height="128dp"
+ android:layout_height="96dp"
android:text="@string/emulation_slot3"
style="@style/OverlayInGameMenuOption"/>
<Button
android:id="@+id/loadsave_state_button_4"
android:layout_width="128dp"
- android:layout_height="128dp"
+ android:layout_height="96dp"
android:text="@string/emulation_slot4"
style="@style/OverlayInGameMenuOption"/>
<Button
android:id="@+id/loadsave_state_button_5"
android:layout_width="128dp"
- android:layout_height="128dp"
+ android:layout_height="96dp"
android:text="@string/emulation_slot5"
style="@style/OverlayInGameMenuOption"/>
<Button
android:id="@+id/loadsave_state_button_6"
android:layout_width="128dp"
- android:layout_height="128dp"
+ android:layout_height="96dp"
android:text="@string/emulation_slot6"
style="@style/OverlayInGameMenuOption"/>
-</GridLayout> \ No newline at end of file
+</GridLayout>
diff --git a/Source/Android/app/src/main/res/menu/menu_emulation.xml b/Source/Android/app/src/main/res/menu/menu_emulation.xml
deleted file mode 100644
index 18755fde34..0000000000
--- a/Source/Android/app/src/main/res/menu/menu_emulation.xml
+++ /dev/null
@@ -1,143 +0,0 @@
-<menu xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:tools="http://schemas.android.com/tools"
- xmlns:app="http://schemas.android.com/apk/res-auto"
- tools:context="org.dolphinemu.dolphinemu.activities.EmulationActivity">
-
- <item
- android:id="@+id/menu_emulation_pause"
- app:showAsAction="ifRoom"
- android:icon="@drawable/lb_ic_pause"
- android:title="@string/pause_emulation"/>
-
- <item
- android:id="@+id/menu_emulation_unpause"
- app:showAsAction="ifRoom"
- android:icon="@drawable/lb_ic_play"
- android:title="@string/unpause_emulation"
- android:visible="false"/>
-
- <item
- android:id="@+id/menu_emulation_screenshot"
- app:showAsAction="ifRoom"
- android:icon="@drawable/ic_screenshot"
- android:title="@string/emulation_screenshot"/>
-
- <item
- android:id="@+id/menu_quicksave"
- app:showAsAction="ifRoom"
- android:icon="@drawable/ic_quicksave"
- android:title="@string/emulation_quicksave"
- android:visible="false"/>
-
- <item
- android:id="@+id/menu_quickload"
- app:showAsAction="ifRoom"
- android:icon="@drawable/ic_quickload"
- android:title="@string/emulation_quickload"
- android:visible="false"/>
-
- <!-- Save State Slots -->
- <item
- android:id="@+id/menu_emulation_save_root"
- app:showAsAction="never"
- android:title="@string/emulation_savestate"
- android:visible="false">
- <menu>
- <item
- android:id="@+id/menu_emulation_save_1"
- android:title="@string/emulation_slot1"/>
-
- <item
- android:id="@+id/menu_emulation_save_2"
- android:title="@string/emulation_slot2"/>
-
- <item
- android:id="@+id/menu_emulation_save_3"
- android:title="@string/emulation_slot3"/>
-
- <item
- android:id="@+id/menu_emulation_save_4"
- android:title="@string/emulation_slot4"/>
-
- <item
- android:id="@+id/menu_emulation_save_5"
- android:title="@string/emulation_slot5"/>
- </menu>
- </item>
-
- <!-- Load State Slots -->
- <item
- android:id="@+id/menu_emulation_load_root"
- app:showAsAction="never"
- android:title="@string/emulation_loadstate"
- android:visible="false">
- <menu>
- <item
- android:id="@+id/menu_emulation_load_1"
- android:title="@string/emulation_slot1"/>
-
- <item
- android:id="@+id/menu_emulation_load_2"
- android:title="@string/emulation_slot2"/>
-
- <item
- android:id="@+id/menu_emulation_load_3"
- android:title="@string/emulation_slot3"/>
-
- <item
- android:id="@+id/menu_emulation_load_4"
- android:title="@string/emulation_slot4"/>
-
- <item
- android:id="@+id/menu_emulation_load_5"
- android:title="@string/emulation_slot5"/>
- </menu>
- </item>
-
- <item
- android:id="@+id/menu_emulation_overlay_controls"
- app:showAsAction="never"
- android:title="@string/emulation_overlay_controls">
- <menu>
- <item
- android:id="@+id/menu_emulation_edit_layout"
- android:title="@string/emulation_edit_layout"/>
-
- <item
- android:id="@+id/menu_emulation_toggle_controls"
- android:title="@string/emulation_toggle_controls"/>
-
- <item
- android:id="@+id/menu_emulation_adjust_scale"
- android:title="@string/emulation_control_scale"/>
-
- <item
- android:id="@+id/menu_emulation_joystick_rel_center"
- android:checkable="true"
- android:title="@string/emulation_control_joystick_rel_center"/>
- <item
- android:id="@+id/menu_emulation_rumble"
- android:checkable="true"
- android:title="@string/emulation_control_rumble"/>
-
- <item
- android:id="@+id/menu_emulation_reset_overlay"
- android:title="@string/emulation_touch_overlay_reset"/>
- </menu>
- </item>
-
- <item
- android:id="@+id/menu_screen_orientation"
- app:showAsAction="never"
- android:title="@string/emulation_screen_orientation"/>
-
- <item
- android:id="@+id/menu_change_disc"
- app:showAsAction="never"
- android:title="@string/emulation_change_disc"/>
-
- <item
- android:id="@+id/menu_exit"
- app:showAsAction="never"
- android:title="@string/emulation_exit"/>
-</menu>
diff --git a/Source/Android/app/src/main/res/menu/menu_emulation_wii.xml b/Source/Android/app/src/main/res/menu/menu_emulation_wii.xml
deleted file mode 100644
index 09d3cbc60b..0000000000
--- a/Source/Android/app/src/main/res/menu/menu_emulation_wii.xml
+++ /dev/null
@@ -1,163 +0,0 @@
-<menu xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:tools="http://schemas.android.com/tools"
- xmlns:app="http://schemas.android.com/apk/res-auto"
- tools:context="org.dolphinemu.dolphinemu.activities.EmulationActivity">
-
- <item
- android:id="@+id/menu_emulation_pause"
- app:showAsAction="ifRoom"
- android:icon="@drawable/lb_ic_pause"
- android:title="@string/pause_emulation"/>
-
- <item
- android:id="@+id/menu_emulation_unpause"
- app:showAsAction="ifRoom"
- android:icon="@drawable/lb_ic_play"
- android:title="@string/unpause_emulation"
- android:visible="false"/>
-
- <item
- android:id="@+id/menu_emulation_screenshot"
- app:showAsAction="ifRoom"
- android:icon="@drawable/ic_screenshot"
- android:title="@string/emulation_screenshot"/>
-
- <item
- android:id="@+id/menu_quicksave"
- app:showAsAction="ifRoom"
- android:icon="@drawable/ic_quicksave"
- android:title="@string/emulation_quicksave"
- android:visible="false"/>
-
- <item
- android:id="@+id/menu_quickload"
- app:showAsAction="ifRoom"
- android:icon="@drawable/ic_quickload"
- android:title="@string/emulation_quickload"
- android:visible="false"/>
-
- <!-- Save State Slots -->
- <item
- android:id="@+id/menu_emulation_save_root"
- app:showAsAction="never"
- android:title="@string/emulation_savestate"
- android:visible="false">
- <menu>
- <item
- android:id="@+id/menu_emulation_save_1"
- android:title="@string/emulation_slot1"/>
-
- <item
- android:id="@+id/menu_emulation_save_2"
- android:title="@string/emulation_slot2"/>
-
- <item
- android:id="@+id/menu_emulation_save_3"
- android:title="@string/emulation_slot3"/>
-
- <item
- android:id="@+id/menu_emulation_save_4"
- android:title="@string/emulation_slot4"/>
-
- <item
- android:id="@+id/menu_emulation_save_5"
- android:title="@string/emulation_slot5"/>
- </menu>
- </item>
-
- <!-- Load State Slots -->
- <item
- android:id="@+id/menu_emulation_load_root"
- app:showAsAction="never"
- android:title="@string/emulation_loadstate"
- android:visible="false">
- <menu>
- <item
- android:id="@+id/menu_emulation_load_1"
- android:title="@string/emulation_slot1"/>
-
- <item
- android:id="@+id/menu_emulation_load_2"
- android:title="@string/emulation_slot2"/>
-
- <item
- android:id="@+id/menu_emulation_load_3"
- android:title="@string/emulation_slot3"/>
-
- <item
- android:id="@+id/menu_emulation_load_4"
- android:title="@string/emulation_slot4"/>
-
- <item
- android:id="@+id/menu_emulation_load_5"
- android:title="@string/emulation_slot5"/>
- </menu>
- </item>
-
- <item
- android:id="@+id/menu_emulation_overlay_controls"
- app:showAsAction="never"
- android:title="@string/emulation_overlay_controls">
- <menu>
- <item
- android:id="@+id/menu_emulation_edit_layout"
- android:title="@string/emulation_edit_layout"/>
-
- <item
- android:id="@+id/menu_emulation_toggle_controls"
- android:title="@string/emulation_toggle_controls"/>
-
- <item
- android:id="@+id/menu_emulation_adjust_scale"
- android:title="@string/emulation_control_scale"/>
-
- <group android:checkableBehavior="all">
- <item
- android:id="@+id/menu_emulation_joystick_rel_center"
- android:checkable="true"
- android:title="@string/emulation_control_joystick_rel_center"/>
- <item
- android:id="@+id/menu_emulation_rumble"
- android:checkable="true"
- android:title="@string/emulation_control_rumble"/>
- </group>
-
- <item
- android:id="@+id/menu_emulation_choose_controller"
- android:title="@string/emulation_choose_controller"/>
- <item
- android:id="@+id/menu_emulation_motion_controls"
- android:title="@string/emulation_motion_controls"/>
-
- <item
- android:id="@+id/menu_emulation_ir_group"
- android:title="@string/emulation_ir_group"
- app:showAsAction="never">
- <menu>
- <item
- android:id="@+id/menu_emulation_set_ir_sensitivity"
- android:title="@string/emulation_ir_sensitivity"
- app:showAsAction="ifRoom"/>
- <item
- android:id="@+id/menu_emulation_choose_doubletap"
- android:title="@string/emulation_choose_doubletap"
- app:showAsAction="ifRoom"/>
- </menu>
- </item>
- <item
- android:id="@+id/menu_emulation_reset_overlay"
- android:title="@string/emulation_touch_overlay_reset"/>
- </menu>
- </item>
-
- <item
- android:id="@+id/menu_screen_orientation"
- app:showAsAction="never"
- android:title="@string/emulation_screen_orientation"/>
-
- <item
- android:id="@+id/menu_change_disc"
- app:showAsAction="never"
- android:title="@string/emulation_change_disc"/>
-
-</menu>
diff --git a/Source/Android/app/src/main/res/menu/menu_overlay_controls_gc.xml b/Source/Android/app/src/main/res/menu/menu_overlay_controls_gc.xml
new file mode 100644
index 0000000000..2d45e7df3b
--- /dev/null
+++ b/Source/Android/app/src/main/res/menu/menu_overlay_controls_gc.xml
@@ -0,0 +1,30 @@
+<menu xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:tools="http://schemas.android.com/tools"
+ tools:context="org.dolphinemu.dolphinemu.activities.EmulationActivity">
+
+ <item
+ android:id="@+id/menu_emulation_edit_layout"
+ android:title="@string/emulation_edit_layout"/>
+
+ <item
+ android:id="@+id/menu_emulation_toggle_controls"
+ android:title="@string/emulation_toggle_controls"/>
+
+ <item
+ android:id="@+id/menu_emulation_adjust_scale"
+ android:title="@string/emulation_control_scale"/>
+
+ <item
+ android:id="@+id/menu_emulation_joystick_rel_center"
+ android:checkable="true"
+ android:title="@string/emulation_control_joystick_rel_center"/>
+
+ <item
+ android:id="@+id/menu_emulation_rumble"
+ android:checkable="true"
+ android:title="@string/emulation_control_rumble"/>
+
+ <item
+ android:id="@+id/menu_emulation_reset_overlay"
+ android:title="@string/emulation_touch_overlay_reset"/>
+</menu>
diff --git a/Source/Android/app/src/main/res/menu/menu_overlay_controls_wii.xml b/Source/Android/app/src/main/res/menu/menu_overlay_controls_wii.xml
new file mode 100644
index 0000000000..62320b0e02
--- /dev/null
+++ b/Source/Android/app/src/main/res/menu/menu_overlay_controls_wii.xml
@@ -0,0 +1,53 @@
+<menu xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:tools="http://schemas.android.com/tools"
+ tools:context="org.dolphinemu.dolphinemu.activities.EmulationActivity">
+
+ <item
+ android:id="@+id/menu_emulation_edit_layout"
+ android:title="@string/emulation_edit_layout"/>
+
+ <item
+ android:id="@+id/menu_emulation_toggle_controls"
+ android:title="@string/emulation_toggle_controls"/>
+
+ <item
+ android:id="@+id/menu_emulation_adjust_scale"
+ android:title="@string/emulation_control_scale"/>
+
+ <group android:checkableBehavior="all">
+ <item
+ android:id="@+id/menu_emulation_joystick_rel_center"
+ android:checkable="true"
+ android:title="@string/emulation_control_joystick_rel_center"/>
+
+ <item
+ android:id="@+id/menu_emulation_rumble"
+ android:checkable="true"
+ android:title="@string/emulation_control_rumble"/>
+ </group>
+
+ <item
+ android:id="@+id/menu_emulation_choose_controller"
+ android:title="@string/emulation_choose_controller"/>
+
+ <item
+ android:id="@+id/menu_emulation_motion_controls"
+ android:title="@string/emulation_motion_controls"/>
+
+ <item
+ android:id="@+id/menu_emulation_ir_group"
+ android:title="@string/emulation_ir_group">
+ <menu>
+ <item
+ android:id="@+id/menu_emulation_set_ir_sensitivity"
+ android:title="@string/emulation_ir_sensitivity"/>
+ <item
+ android:id="@+id/menu_emulation_choose_doubletap"
+ android:title="@string/emulation_choose_doubletap"/>
+ </menu>
+ </item>
+ <item
+ android:id="@+id/menu_emulation_reset_overlay"
+ android:title="@string/emulation_touch_overlay_reset"/>
+
+</menu>
diff --git a/Source/Android/app/src/main/res/values-w540dp/integers.xml b/Source/Android/app/src/main/res/values-w540dp/integers.xml
new file mode 100644
index 0000000000..40860e6906
--- /dev/null
+++ b/Source/Android/app/src/main/res/values-w540dp/integers.xml
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="utf-8"?>
+<resources>
+ <integer name="loadsave_state_columns">2</integer>
+ <integer name="loadsave_state_rows">3</integer>
+</resources>
diff --git a/Source/Android/app/src/main/res/values-w660dp/integers.xml b/Source/Android/app/src/main/res/values-w660dp/integers.xml
new file mode 100644
index 0000000000..e4941c458e
--- /dev/null
+++ b/Source/Android/app/src/main/res/values-w660dp/integers.xml
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="utf-8"?>
+<resources>
+ <integer name="loadsave_state_columns">3</integer>
+ <integer name="loadsave_state_rows">2</integer>
+</resources>
diff --git a/Source/Android/app/src/main/res/values/integers.xml b/Source/Android/app/src/main/res/values/integers.xml
index 1585d38ff4..bbaed0f47a 100644
--- a/Source/Android/app/src/main/res/values/integers.xml
+++ b/Source/Android/app/src/main/res/values/integers.xml
@@ -1,6 +1,8 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<integer name="game_grid_columns">3</integer>
+ <integer name="loadsave_state_columns">1</integer>
+ <integer name="loadsave_state_rows">6</integer>
<!-- Default GameCube landscape layout -->
<integer name="BUTTON_A_X">865</integer>
diff --git a/Source/Android/app/src/main/res/values/strings.xml b/Source/Android/app/src/main/res/values/strings.xml
index 1ced8c6969..356bfc1a62 100644
--- a/Source/Android/app/src/main/res/values/strings.xml
+++ b/Source/Android/app/src/main/res/values/strings.xml
@@ -336,7 +336,7 @@
<string name="emulation_screenshot">Take Screenshot</string>
<string name="emulation_savestate">Save State</string>
<string name="emulation_loadstate">Load State</string>
- <string name="emulation_exit">Exit</string>
+ <string name="emulation_exit">Exit Emulation</string>
<string name="emulation_slot1">Slot 1</string>
<string name="emulation_slot2">Slot 2</string>
<string name="emulation_slot3">Slot 3</string>
@@ -355,7 +355,7 @@
<string name="emulation_control_joystick_rel_center">Relative Stick Center</string>
<string name="emulation_control_rumble">Rumble</string>
<string name="emulation_choose_controller">Choose Controller</string>
- <string name="emulation_touch_button_help">Swipe down from the top of the screen to access the menu.</string>
+ <string name="emulation_menu_help">Press Back to access the menu.\nLong press Back to exit emulation.</string>
<string name="emulation_touch_overlay_reset">Reset Overlay</string>
<string name="emulation_ir_group">Touch IR Pointer</string>
<string name="emulation_ir_sensitivity">IR Sensitivity</string>
diff --git a/Source/Android/app/src/main/res/values/styles.xml b/Source/Android/app/src/main/res/values/styles.xml
index 8a292d4113..5bb491c418 100644
--- a/Source/Android/app/src/main/res/values/styles.xml
+++ b/Source/Android/app/src/main/res/values/styles.xml
@@ -29,21 +29,7 @@
<style name="DolphinDialogBase" parent="Theme.AppCompat.DayNight.Dialog.Alert" />
- <style name="DolphinEmulationBase" parent="Theme.AppCompat.DayNight.DarkActionBar">
- <item name="colorPrimary">@color/dolphin_blue</item>
- <item name="colorPrimaryDark">@color/dolphin_blue_dark</item>
- <item name="colorAccent">@color/dolphin_purple</item>
- <item name="android:windowTranslucentNavigation">true</item>
-
- <item name="android:windowBackground">@android:color/black</item>
-
- <!-- Enable window content transitions -->
- <item name="android:windowContentTransitions">true</item>
- <item name="android:windowAllowEnterTransitionOverlap">true</item>
- <item name="android:windowAllowReturnTransitionOverlap">true</item>
- </style>
-
- <style name="DolphinEmulationTvBase" parent="Theme.AppCompat.DayNight.NoActionBar">
+ <style name="DolphinEmulationBase" parent="Theme.AppCompat.DayNight.NoActionBar">
<item name="colorPrimary">@color/dolphin_blue</item>
<item name="colorPrimaryDark">@color/dolphin_blue_dark</item>
<item name="colorAccent">@color/dolphin_purple</item>