diff --git a/src/android/app/src/main/java/org/citra/citra_emu/activities/EmulationActivity.java b/src/android/app/src/main/java/org/citra/citra_emu/activities/EmulationActivity.java
index 34ab49c96..b5e547266 100644
--- a/src/android/app/src/main/java/org/citra/citra_emu/activities/EmulationActivity.java
+++ b/src/android/app/src/main/java/org/citra/citra_emu/activities/EmulationActivity.java
@@ -12,6 +12,7 @@ import android.view.InputDevice;
import android.view.KeyEvent;
import android.view.LayoutInflater;
import android.view.Menu;
+import android.view.MenuInflater;
import android.view.MenuItem;
import android.view.MotionEvent;
import android.view.SubMenu;
@@ -19,11 +20,13 @@ import android.view.View;
import android.widget.CheckBox;
import android.widget.SeekBar;
import android.widget.TextView;
+import android.widget.Toast;
import androidx.annotation.IntDef;
import androidx.annotation.NonNull;
import androidx.appcompat.app.AlertDialog;
import androidx.appcompat.app.AppCompatActivity;
+import androidx.appcompat.widget.PopupMenu;
import androidx.core.app.NotificationManagerCompat;
import androidx.fragment.app.FragmentActivity;
@@ -74,6 +77,7 @@ public final class EmulationActivity extends AppCompatActivity {
public static final int MENU_ACTION_JOYSTICK_REL_CENTER = 15;
public static final int MENU_ACTION_DPAD_SLIDE_ENABLE = 16;
public static final int MENU_ACTION_OPEN_CHEATS = 17;
+ public static final int MENU_ACTION_CLOSE_GAME = 18;
public static final int REQUEST_SELECT_AMIIBO = 2;
private static final int EMULATION_RUNNING_NOTIFICATION = 0x1000;
@@ -114,6 +118,8 @@ public final class EmulationActivity extends AppCompatActivity {
EmulationActivity.MENU_ACTION_DPAD_SLIDE_ENABLE);
buttonsActionsMap
.append(R.id.menu_emulation_open_cheats, EmulationActivity.MENU_ACTION_OPEN_CHEATS);
+ buttonsActionsMap
+ .append(R.id.menu_emulation_close_game, EmulationActivity.MENU_ACTION_CLOSE_GAME);
}
private View mDecorView;
@@ -223,21 +229,12 @@ public final class EmulationActivity extends AppCompatActivity {
@Override
public void onBackPressed() {
- NativeLibrary.PauseEmulation();
- new AlertDialog.Builder(this)
- .setTitle(R.string.emulation_close_game)
- .setMessage(R.string.emulation_close_game_message)
- .setPositiveButton(android.R.string.yes, (dialogInterface, i) ->
- {
- mEmulationFragment.stopEmulation();
- finish();
- })
- .setNegativeButton(android.R.string.cancel, (dialogInterface, i) ->
- NativeLibrary.UnPauseEmulation())
- .setOnCancelListener(dialogInterface ->
- NativeLibrary.UnPauseEmulation())
- .create()
- .show();
+ View anchor = findViewById(R.id.menu_anchor);
+ PopupMenu popupMenu = new PopupMenu(this, anchor);
+ onCreateOptionsMenu(popupMenu.getMenu(), popupMenu.getMenuInflater());
+ updateSavestateMenuOptions(popupMenu.getMenu());
+ popupMenu.setOnMenuItemClickListener(this::onOptionsItemSelected);
+ popupMenu.show();
}
@Override
@@ -271,6 +268,10 @@ public final class EmulationActivity extends AppCompatActivity {
}
}
+ public void onEmulationStarted() {
+ Toast.makeText(this, getString(R.string.emulation_menu_help), Toast.LENGTH_LONG).show();
+ }
+
private void enableFullscreenImmersive() {
// It would be nice to use IMMERSIVE_STICKY, but that doesn't show the toolbar.
mDecorView.setSystemUiVisibility(
@@ -285,7 +286,12 @@ public final class EmulationActivity extends AppCompatActivity {
@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);
+ onCreateOptionsMenu(menu, getMenuInflater());
+ return true;
+ }
+
+ private void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
+ inflater.inflate(R.menu.menu_emulation, menu);
int layoutOptionMenuItem = R.id.menu_screen_layout_landscape;
switch (EmulationMenuSettings.getLandscapeScreenLayout()) {
@@ -306,8 +312,6 @@ public final class EmulationActivity extends AppCompatActivity {
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;
}
private void DisplaySavestateWarning() {
@@ -333,12 +337,16 @@ public final class EmulationActivity extends AppCompatActivity {
@Override
public boolean onPrepareOptionsMenu(Menu menu) {
super.onPrepareOptionsMenu(menu);
+ updateSavestateMenuOptions(menu);
+ return true;
+ }
+ private void updateSavestateMenuOptions(Menu menu) {
final NativeLibrary.SavestateInfo[] savestates = NativeLibrary.GetSavestateInfo();
if (savestates == null) {
menu.findItem(R.id.menu_emulation_save_state).setVisible(false);
menu.findItem(R.id.menu_emulation_load_state).setVisible(false);
- return true;
+ return;
}
menu.findItem(R.id.menu_emulation_save_state).setVisible(true);
menu.findItem(R.id.menu_emulation_load_state).setVisible(true);
@@ -367,7 +375,6 @@ public final class EmulationActivity extends AppCompatActivity {
saveStateMenu.getItem(info.slot - 1).setTitle(text);
loadStateMenu.getItem(info.slot - 1).setTitle(text).setEnabled(true);
}
- return true;
}
@SuppressWarnings("WrongConstant")
@@ -480,6 +487,24 @@ public final class EmulationActivity extends AppCompatActivity {
case MENU_ACTION_OPEN_CHEATS:
CheatsActivity.launch(this);
break;
+
+ case MENU_ACTION_CLOSE_GAME:
+ NativeLibrary.PauseEmulation();
+ new AlertDialog.Builder(this)
+ .setTitle(R.string.emulation_close_game)
+ .setMessage(R.string.emulation_close_game_message)
+ .setPositiveButton(android.R.string.yes, (dialogInterface, i) ->
+ {
+ mEmulationFragment.stopEmulation();
+ finish();
+ })
+ .setNegativeButton(android.R.string.cancel, (dialogInterface, i) ->
+ NativeLibrary.UnPauseEmulation())
+ .setOnCancelListener(dialogInterface ->
+ NativeLibrary.UnPauseEmulation())
+ .create()
+ .show();
+ break;
}
return true;
diff --git a/src/android/app/src/main/java/org/citra/citra_emu/disk_shader_cache/DiskShaderCacheProgress.java b/src/android/app/src/main/java/org/citra/citra_emu/disk_shader_cache/DiskShaderCacheProgress.java
index 8f9d215a3..e71c2cfc1 100644
--- a/src/android/app/src/main/java/org/citra/citra_emu/disk_shader_cache/DiskShaderCacheProgress.java
+++ b/src/android/app/src/main/java/org/citra/citra_emu/disk_shader_cache/DiskShaderCacheProgress.java
@@ -133,6 +133,8 @@ public class DiskShaderCacheProgress {
case Complete:
// Workaround for when dialog is dismissed when the app is in the background
fragment.dismissAllowingStateLoss();
+
+ emulationActivity.runOnUiThread(emulationActivity::onEmulationStarted);
break;
}
}
diff --git a/src/android/app/src/main/res/layout/activity_emulation.xml b/src/android/app/src/main/res/layout/activity_emulation.xml
index 7d7f36925..5f5ff777d 100644
--- a/src/android/app/src/main/res/layout/activity_emulation.xml
+++ b/src/android/app/src/main/res/layout/activity_emulation.xml
@@ -14,4 +14,10 @@
android:layout_height="match_parent"
android:transitionName="image_game_icon" />
-
\ No newline at end of file
+
+
+
diff --git a/src/android/app/src/main/res/menu/menu_emulation.xml b/src/android/app/src/main/res/menu/menu_emulation.xml
index b6c0d7cc4..8492dfdb9 100644
--- a/src/android/app/src/main/res/menu/menu_emulation.xml
+++ b/src/android/app/src/main/res/menu/menu_emulation.xml
@@ -115,4 +115,9 @@
app:showAsAction="never"
android:title="@string/emulation_open_settings" />
+
+
diff --git a/src/android/app/src/main/res/values/strings.xml b/src/android/app/src/main/res/values/strings.xml
index b72357eb0..7a7a59a79 100644
--- a/src/android/app/src/main/res/values/strings.xml
+++ b/src/android/app/src/main/res/values/strings.xml
@@ -157,6 +157,7 @@
Invalid ROM format
+ Press Back to access the menu.
Save State
Load State
Slot %1$d