Android: Use dialog menu instead of appbar
Fixes it getting messed up in landscape orientation.
This commit is contained in:
parent
d274c553c5
commit
a520be5208
|
@ -18,7 +18,7 @@
|
||||||
android:configChanges="orientation|keyboardHidden|screenSize"
|
android:configChanges="orientation|keyboardHidden|screenSize"
|
||||||
android:label="@string/title_activity_emulation"
|
android:label="@string/title_activity_emulation"
|
||||||
android:parentActivityName=".MainActivity"
|
android:parentActivityName=".MainActivity"
|
||||||
android:theme="@style/FullscreenTheme"
|
android:theme="@style/Theme.AppCompat.DayNight.NoActionBar"
|
||||||
android:immersive="true">
|
android:immersive="true">
|
||||||
<meta-data
|
<meta-data
|
||||||
android:name="android.support.PARENT_ACTIVITY"
|
android:name="android.support.PARENT_ACTIVITY"
|
||||||
|
|
|
@ -8,6 +8,7 @@ import androidx.appcompat.app.ActionBar;
|
||||||
import androidx.appcompat.app.AlertDialog;
|
import androidx.appcompat.app.AlertDialog;
|
||||||
import androidx.appcompat.app.AppCompatActivity;
|
import androidx.appcompat.app.AppCompatActivity;
|
||||||
|
|
||||||
|
import android.content.DialogInterface;
|
||||||
import android.content.Intent;
|
import android.content.Intent;
|
||||||
import android.content.SharedPreferences;
|
import android.content.SharedPreferences;
|
||||||
import android.content.res.Configuration;
|
import android.content.res.Configuration;
|
||||||
|
@ -22,6 +23,7 @@ import android.view.MenuItem;
|
||||||
import android.widget.FrameLayout;
|
import android.widget.FrameLayout;
|
||||||
import android.widget.Toast;
|
import android.widget.Toast;
|
||||||
|
|
||||||
|
import androidx.appcompat.widget.PopupMenu;
|
||||||
import androidx.preference.PreferenceManager;
|
import androidx.preference.PreferenceManager;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -36,6 +38,8 @@ public class EmulationActivity extends AppCompatActivity implements SurfaceHolde
|
||||||
private boolean mWasDestroyed = false;
|
private boolean mWasDestroyed = false;
|
||||||
private boolean mWasPausedOnSurfaceLoss = false;
|
private boolean mWasPausedOnSurfaceLoss = false;
|
||||||
private boolean mApplySettingsOnSurfaceRestored = false;
|
private boolean mApplySettingsOnSurfaceRestored = false;
|
||||||
|
private String mGameTitle = null;
|
||||||
|
private EmulationSurfaceView mContentView;
|
||||||
|
|
||||||
private boolean getBooleanSetting(String key, boolean defaultValue) {
|
private boolean getBooleanSetting(String key, boolean defaultValue) {
|
||||||
return mPreferences.getBoolean(key, defaultValue);
|
return mPreferences.getBoolean(key, defaultValue);
|
||||||
|
@ -97,7 +101,7 @@ public class EmulationActivity extends AppCompatActivity implements SurfaceHolde
|
||||||
|
|
||||||
public void onGameTitleChanged(String title) {
|
public void onGameTitleChanged(String title) {
|
||||||
runOnUiThread(() -> {
|
runOnUiThread(() -> {
|
||||||
setTitle(title);
|
mGameTitle = title;
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -164,22 +168,11 @@ public class EmulationActivity extends AppCompatActivity implements SurfaceHolde
|
||||||
mPreferences = PreferenceManager.getDefaultSharedPreferences(this);
|
mPreferences = PreferenceManager.getDefaultSharedPreferences(this);
|
||||||
Log.i("EmulationActivity", "OnCreate");
|
Log.i("EmulationActivity", "OnCreate");
|
||||||
|
|
||||||
|
enableFullscreenImmersive();
|
||||||
setContentView(R.layout.activity_emulation);
|
setContentView(R.layout.activity_emulation);
|
||||||
ActionBar actionBar = getSupportActionBar();
|
|
||||||
if (actionBar != null) {
|
|
||||||
actionBar.setDisplayHomeAsUpEnabled(true);
|
|
||||||
}
|
|
||||||
|
|
||||||
mSystemUIVisible = true;
|
|
||||||
mContentView = findViewById(R.id.fullscreen_content);
|
mContentView = findViewById(R.id.fullscreen_content);
|
||||||
mContentView.getHolder().addCallback(this);
|
mContentView.getHolder().addCallback(this);
|
||||||
mContentView.setOnClickListener(new View.OnClickListener() {
|
|
||||||
@Override
|
|
||||||
public void onClick(View view) {
|
|
||||||
if (mSystemUIVisible)
|
|
||||||
hideSystemUI();
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
// Hook up controller input.
|
// Hook up controller input.
|
||||||
final String controllerType = getStringSetting("Controller1/Type", "DigitalController");
|
final String controllerType = getStringSetting("Controller1/Type", "DigitalController");
|
||||||
|
@ -197,83 +190,30 @@ public class EmulationActivity extends AppCompatActivity implements SurfaceHolde
|
||||||
@Override
|
@Override
|
||||||
protected void onPostCreate(Bundle savedInstanceState) {
|
protected void onPostCreate(Bundle savedInstanceState) {
|
||||||
super.onPostCreate(savedInstanceState);
|
super.onPostCreate(savedInstanceState);
|
||||||
hideSystemUI();
|
enableFullscreenImmersive();
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected void onPostResume() {
|
protected void onPostResume() {
|
||||||
super.onPostResume();
|
super.onPostResume();
|
||||||
if (!mSystemUIVisible)
|
enableFullscreenImmersive();
|
||||||
hideSystemUI();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected void onDestroy() {
|
protected void onDestroy() {
|
||||||
super.onDestroy();
|
super.onDestroy();
|
||||||
Log.i("EmulationActivity", "OnStop");
|
Log.i("EmulationActivity", "OnStop");
|
||||||
showSystemUI(false);
|
|
||||||
|
|
||||||
if (AndroidHostInterface.getInstance().isEmulationThreadRunning()) {
|
if (AndroidHostInterface.getInstance().isEmulationThreadRunning()) {
|
||||||
mWasDestroyed = true;
|
mWasDestroyed = true;
|
||||||
AndroidHostInterface.getInstance().stopEmulationThread();
|
AndroidHostInterface.getInstance().stopEmulationThread();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@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);
|
|
||||||
menu.findItem(R.id.show_controller).setChecked(mTouchscreenControllerVisible);
|
|
||||||
menu.findItem(R.id.enable_speed_limiter).setChecked(getBooleanSetting("Main/SpeedLimiterEnabled", true));
|
|
||||||
menu.findItem(R.id.show_controller).setChecked(getBooleanSetting("Controller1/EnableTouchscreenController", true));
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
private static final int REQUEST_CODE_SETTINGS = 0;
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public boolean onOptionsItemSelected(MenuItem item) {
|
|
||||||
// Handle action bar item clicks here. The action bar will
|
|
||||||
// automatically handle clicks on the Home/Up button, so long
|
|
||||||
// as you specify a parent activity in AndroidManifest.xml.
|
|
||||||
int id = item.getItemId();
|
|
||||||
|
|
||||||
//noinspection SimplifiableIfStatement
|
|
||||||
if (id == R.id.action_settings) {
|
|
||||||
Intent intent = new Intent(this, SettingsActivity.class);
|
|
||||||
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
|
|
||||||
startActivityForResult(intent, REQUEST_CODE_SETTINGS);
|
|
||||||
return true;
|
|
||||||
} else if (id == R.id.show_controller) {
|
|
||||||
setTouchscreenControllerVisibility(!mTouchscreenControllerVisible);
|
|
||||||
item.setChecked(mTouchscreenControllerVisible);
|
|
||||||
return true;
|
|
||||||
} else if (id == R.id.enable_speed_limiter) {
|
|
||||||
boolean newSetting = !getBooleanSetting("Main/SpeedLimiterEnabled", true);
|
|
||||||
setBooleanSetting("Main/SpeedLimiterEnabled", newSetting);
|
|
||||||
item.setChecked(newSetting);
|
|
||||||
applySettings();
|
|
||||||
return true;
|
|
||||||
} else if (id == R.id.reset) {
|
|
||||||
AndroidHostInterface.getInstance().resetSystem();
|
|
||||||
} else if (id == R.id.quick_load) {
|
|
||||||
AndroidHostInterface.getInstance().loadState(false, 0);
|
|
||||||
} else if (id == R.id.quick_save) {
|
|
||||||
AndroidHostInterface.getInstance().saveState(false, 0);
|
|
||||||
} else if (id == R.id.quit) {
|
|
||||||
finish();
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
return super.onOptionsItemSelected(item);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
|
protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
|
||||||
super.onActivityResult(requestCode, resultCode, data);
|
super.onActivityResult(requestCode, resultCode, data);
|
||||||
|
|
||||||
if (requestCode == REQUEST_CODE_SETTINGS) {
|
if (requestCode == REQUEST_CODE_SETTINGS) {
|
||||||
// TODO: Sync any menu settings.
|
|
||||||
if (AndroidHostInterface.getInstance().isEmulationThreadRunning())
|
if (AndroidHostInterface.getInstance().isEmulationThreadRunning())
|
||||||
applySettings();
|
applySettings();
|
||||||
}
|
}
|
||||||
|
@ -281,12 +221,7 @@ public class EmulationActivity extends AppCompatActivity implements SurfaceHolde
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void onBackPressed() {
|
public void onBackPressed() {
|
||||||
if (mSystemUIVisible) {
|
showMenu();
|
||||||
finish();
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
showSystemUI(true);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
@ -310,73 +245,89 @@ public class EmulationActivity extends AppCompatActivity implements SurfaceHolde
|
||||||
AndroidHostInterface.getInstance().setDisplayAlignment(AndroidHostInterface.DISPLAY_ALIGNMENT_CENTER);
|
AndroidHostInterface.getInstance().setDisplayAlignment(AndroidHostInterface.DISPLAY_ALIGNMENT_CENTER);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
private void enableFullscreenImmersive()
|
||||||
* Some older devices needs a small delay between UI widget updates
|
{
|
||||||
* and a change of the status and navigation bar.
|
getWindow().getDecorView().setSystemUiVisibility(
|
||||||
*/
|
View.SYSTEM_UI_FLAG_LAYOUT_STABLE |
|
||||||
private static final int UI_ANIMATION_DELAY = 300;
|
View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION |
|
||||||
private final Handler mSystemUIHideHandler = new Handler();
|
View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN |
|
||||||
private EmulationSurfaceView mContentView;
|
View.SYSTEM_UI_FLAG_HIDE_NAVIGATION |
|
||||||
private final Runnable mHidePart2Runnable = new Runnable() {
|
View.SYSTEM_UI_FLAG_FULLSCREEN |
|
||||||
@SuppressLint("InlinedApi")
|
View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY);
|
||||||
@Override
|
|
||||||
public void run() {
|
|
||||||
// Delayed removal of status and navigation bar
|
|
||||||
|
|
||||||
// Note that some of these constants are new as of API 16 (Jelly Bean)
|
|
||||||
// and API 19 (KitKat). It is safe to use them, as they are inlined
|
|
||||||
// at compile-time and do nothing on earlier devices.
|
|
||||||
mContentView.setSystemUiVisibility(View.SYSTEM_UI_FLAG_LOW_PROFILE
|
|
||||||
| View.SYSTEM_UI_FLAG_FULLSCREEN
|
|
||||||
| View.SYSTEM_UI_FLAG_LAYOUT_STABLE
|
|
||||||
| View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY
|
|
||||||
| View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION
|
|
||||||
| View.SYSTEM_UI_FLAG_HIDE_NAVIGATION);
|
|
||||||
}
|
|
||||||
};
|
|
||||||
private final Runnable mShowPart2Runnable = new Runnable() {
|
|
||||||
@Override
|
|
||||||
public void run() {
|
|
||||||
// Delayed display of UI elements
|
|
||||||
ActionBar actionBar = getSupportActionBar();
|
|
||||||
if (actionBar != null) {
|
|
||||||
actionBar.show();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
};
|
|
||||||
private boolean mSystemUIVisible;
|
|
||||||
private final Runnable mHideRunnable = new Runnable() {
|
|
||||||
@Override
|
|
||||||
public void run() {
|
|
||||||
hideSystemUI();
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
private void hideSystemUI() {
|
|
||||||
// Hide UI first
|
|
||||||
ActionBar actionBar = getSupportActionBar();
|
|
||||||
if (actionBar != null) {
|
|
||||||
actionBar.hide();
|
|
||||||
}
|
|
||||||
mSystemUIVisible = false;
|
|
||||||
|
|
||||||
// Schedule a runnable to remove the status and navigation bar after a delay
|
|
||||||
mSystemUIHideHandler.removeCallbacks(mShowPart2Runnable);
|
|
||||||
mSystemUIHideHandler.postDelayed(mHidePart2Runnable, UI_ANIMATION_DELAY);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@SuppressLint("InlinedApi")
|
private static final int REQUEST_CODE_SETTINGS = 0;
|
||||||
private void showSystemUI(boolean delay) {
|
|
||||||
// Show the system bar
|
|
||||||
mContentView.setSystemUiVisibility(0);
|
|
||||||
mSystemUIVisible = true;
|
|
||||||
|
|
||||||
// Schedule a runnable to display UI elements after a delay
|
private void showMenu() {
|
||||||
mSystemUIHideHandler.removeCallbacks(mHidePart2Runnable);
|
AlertDialog.Builder builder = new AlertDialog.Builder(this);
|
||||||
if (delay)
|
if (mGameTitle != null && !mGameTitle.isEmpty())
|
||||||
mSystemUIHideHandler.postDelayed(mShowPart2Runnable, UI_ANIMATION_DELAY);
|
builder.setTitle(mGameTitle);
|
||||||
else
|
|
||||||
mShowPart2Runnable.run();
|
builder.setItems(R.array.emulation_menu, new DialogInterface.OnClickListener() {
|
||||||
|
@Override
|
||||||
|
public void onClick(DialogInterface dialogInterface, int i) {
|
||||||
|
switch (i)
|
||||||
|
{
|
||||||
|
case 0: // Quick Load
|
||||||
|
{
|
||||||
|
AndroidHostInterface.getInstance().loadState(false, 0);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
case 1: // Quick Save
|
||||||
|
{
|
||||||
|
AndroidHostInterface.getInstance().saveState(false, 0);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
case 2: // Reset
|
||||||
|
{
|
||||||
|
AndroidHostInterface.getInstance().resetSystem();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
case 3: // Change Disc
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
case 4: // Toggle Speed Limiter
|
||||||
|
{
|
||||||
|
boolean newSetting = !getBooleanSetting("Main/SpeedLimiterEnabled", true);
|
||||||
|
setBooleanSetting("Main/SpeedLimiterEnabled", newSetting);
|
||||||
|
applySettings();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
case 5: // Toggle Touchscreen Controller
|
||||||
|
{
|
||||||
|
setTouchscreenControllerVisibility(!mTouchscreenControllerVisible);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
case 6: // Settings
|
||||||
|
{
|
||||||
|
Intent intent = new Intent(EmulationActivity.this, SettingsActivity.class);
|
||||||
|
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
|
||||||
|
startActivityForResult(intent, REQUEST_CODE_SETTINGS);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
case 7: // Quit
|
||||||
|
{
|
||||||
|
finish();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
builder.setOnDismissListener(new DialogInterface.OnDismissListener() {
|
||||||
|
@Override
|
||||||
|
public void onDismiss(DialogInterface dialogInterface) {
|
||||||
|
enableFullscreenImmersive();
|
||||||
|
}
|
||||||
|
});
|
||||||
|
builder.create().show();
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
|
@ -22,6 +22,7 @@
|
||||||
android:layout_height="wrap_content"
|
android:layout_height="wrap_content"
|
||||||
android:layout_marginLeft="10dp"
|
android:layout_marginLeft="10dp"
|
||||||
android:layout_marginTop="8dp"
|
android:layout_marginTop="8dp"
|
||||||
|
android:layout_marginRight="64dp"
|
||||||
android:focusable="false"
|
android:focusable="false"
|
||||||
android:focusableInTouchMode="false"
|
android:focusableInTouchMode="false"
|
||||||
android:text="Game Title"
|
android:text="Game Title"
|
||||||
|
@ -35,6 +36,7 @@
|
||||||
android:layout_width="0dp"
|
android:layout_width="0dp"
|
||||||
android:layout_height="wrap_content"
|
android:layout_height="wrap_content"
|
||||||
android:layout_marginLeft="10dp"
|
android:layout_marginLeft="10dp"
|
||||||
|
android:layout_marginRight="64dp"
|
||||||
android:focusable="false"
|
android:focusable="false"
|
||||||
android:focusableInTouchMode="false"
|
android:focusableInTouchMode="false"
|
||||||
android:paddingBottom="8px"
|
android:paddingBottom="8px"
|
||||||
|
|
|
@ -1,38 +0,0 @@
|
||||||
<?xml version="1.0" encoding="utf-8"?>
|
|
||||||
<menu xmlns:android="http://schemas.android.com/apk/res/android"
|
|
||||||
xmlns:app="http://schemas.android.com/apk/res-auto">
|
|
||||||
|
|
||||||
<group android:id="@+id/actions">
|
|
||||||
<item
|
|
||||||
android:id="@+id/reset"
|
|
||||||
android:title="Reset" />
|
|
||||||
<item
|
|
||||||
android:id="@+id/quick_load"
|
|
||||||
android:title="Quick Load" />
|
|
||||||
<item
|
|
||||||
android:id="@+id/quick_save"
|
|
||||||
android:title="Quick Save" />
|
|
||||||
</group>
|
|
||||||
<group android:id="@+id/quick_settings">
|
|
||||||
<item
|
|
||||||
android:id="@+id/change_disc"
|
|
||||||
android:title="Change Disc" />
|
|
||||||
<item
|
|
||||||
android:id="@+id/enable_speed_limiter"
|
|
||||||
android:title="Enable Speed Limiter"
|
|
||||||
android:checkable="true" />
|
|
||||||
<item
|
|
||||||
android:id="@+id/show_controller"
|
|
||||||
android:checkable="true"
|
|
||||||
android:title="Show Controller" />
|
|
||||||
</group>
|
|
||||||
|
|
||||||
<group>
|
|
||||||
<item
|
|
||||||
android:id="@+id/action_settings"
|
|
||||||
android:title="Settings" />
|
|
||||||
<item
|
|
||||||
android:id="@+id/quit"
|
|
||||||
android:title="Quit" />
|
|
||||||
</group>
|
|
||||||
</menu>
|
|
|
@ -125,4 +125,14 @@
|
||||||
<item>PerGame</item>
|
<item>PerGame</item>
|
||||||
<item>PerGameTitle</item>
|
<item>PerGameTitle</item>
|
||||||
</string-array>
|
</string-array>
|
||||||
|
<string-array name="emulation_menu">
|
||||||
|
<item>Quick Load</item>
|
||||||
|
<item>Quick Save</item>
|
||||||
|
<item>Reset</item>
|
||||||
|
<item>Change Disc</item>
|
||||||
|
<item>Toggle Speed Limiter</item>
|
||||||
|
<item>Toggle Touch Controller</item>
|
||||||
|
<item>Settings</item>
|
||||||
|
<item>Quit</item>
|
||||||
|
</string-array>
|
||||||
</resources>
|
</resources>
|
||||||
|
|
Loading…
Reference in New Issue