Android: Use the system "immersive" mode for fullscreen, and simplify how it's

called.

The user will get a brief system popup tutorial the first time it's
used, so we don't need to show them the menu every time. Once they
enable it by pulling down, hide again after 3s.
This commit is contained in:
Mike 2017-10-08 00:35:26 -07:00
parent e29cd19f73
commit 0fb3cb2f56
1 changed files with 30 additions and 101 deletions

View File

@ -8,7 +8,6 @@ import android.content.SharedPreferences;
import android.hardware.usb.UsbManager; import android.hardware.usb.UsbManager;
import android.os.Bundle; import android.os.Bundle;
import android.os.Handler; import android.os.Handler;
import android.os.Message;
import android.preference.PreferenceManager; import android.preference.PreferenceManager;
import android.support.annotation.IntDef; import android.support.annotation.IntDef;
import android.support.v4.app.ActivityOptionsCompat; import android.support.v4.app.ActivityOptionsCompat;
@ -62,24 +61,10 @@ public final class EmulationActivity extends AppCompatActivity
private int mPosition; private int mPosition;
private boolean mDeviceHasTouchScreen; private boolean mDeviceHasTouchScreen;
private boolean mSystemUiVisible;
private boolean mMenuVisible; private boolean mMenuVisible;
private static boolean sIsGameCubeGame; private static boolean sIsGameCubeGame;
/**
* Handlers are a way to pass a message to an Activity telling it to do something
* on the UI thread. This Handler responds to any message, even blank ones, by
* hiding the system UI.
*/
private Handler mSystemUiHider = new Handler()
{
@Override
public void handleMessage(Message msg)
{
hideSystemUI();
}
};
private String mScreenPath; private String mScreenPath;
private String mSelectedTitle; private String mSelectedTitle;
@ -186,32 +171,28 @@ public final class EmulationActivity extends AppCompatActivity
// Get a handle to the Window containing the UI. // Get a handle to the Window containing the UI.
mDecorView = getWindow().getDecorView(); mDecorView = getWindow().getDecorView();
mDecorView.setOnSystemUiVisibilityChangeListener
// Set these options now so that the SurfaceView the game renders into is the right size. (new View.OnSystemUiVisibilityChangeListener() {
mDecorView.setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_STABLE | @Override
View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION | public void onSystemUiVisibilityChange(int visibility) {
View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN); if ((visibility & View.SYSTEM_UI_FLAG_FULLSCREEN) == 0)
// Set the ActionBar to follow the navigation/status bar's visibility changes.
mDecorView.setOnSystemUiVisibilityChangeListener(
new View.OnSystemUiVisibilityChangeListener()
{ {
@Override // Go back to immersive fullscreen mode in 3s
public void onSystemUiVisibilityChange(int flags) Handler handler = new Handler(getMainLooper());
handler.postDelayed(new Runnable()
{ {
mSystemUiVisible = (flags & View.SYSTEM_UI_FLAG_HIDE_NAVIGATION) == 0; @Override
public void run()
if (mSystemUiVisible)
{ {
getSupportActionBar().show(); enableFullscreenImmersive();
hideSystemUiAfterDelay();
} }
else },
{ 3000 /* 3s */);
getSupportActionBar().hide(); }
} }
} });
}); // Set these options now so that the SurfaceView the game renders into is the right size.
enableFullscreenImmersive();
} }
else else
{ {
@ -283,38 +264,6 @@ public final class EmulationActivity extends AppCompatActivity
} }
@Override
protected void onPostCreate(Bundle savedInstanceState)
{
super.onPostCreate(savedInstanceState);
if (mDeviceHasTouchScreen)
{
// Give the user a few seconds to see what the controls look like, then hide them.
hideSystemUiAfterDelay();
}
}
@Override
public void onWindowFocusChanged(boolean hasFocus)
{
super.onWindowFocusChanged(hasFocus);
if (mDeviceHasTouchScreen)
{
if (hasFocus)
{
hideSystemUiAfterDelay();
}
else
{
// If the window loses focus (i.e. a dialog box, or a popup menu is on screen
// stop hiding the UI.
mSystemUiHider.removeMessages(0);
}
}
}
@Override @Override
public void onBackPressed() public void onBackPressed()
{ {
@ -335,6 +284,18 @@ 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(
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);
}
private void toggleMenu() private void toggleMenu()
{ {
boolean result = getSupportFragmentManager().popBackStackImmediate( boolean result = getSupportFragmentManager().popBackStackImmediate(
@ -767,38 +728,6 @@ public final class EmulationActivity extends AppCompatActivity
return true; return true;
} }
private void hideSystemUiAfterDelay()
{
// Clear any pending hide events.
mSystemUiHider.removeMessages(0);
// Add a new hide event, to occur 3 seconds from now.
mSystemUiHider.sendEmptyMessageDelayed(0, 3000);
}
private void hideSystemUI()
{
mSystemUiVisible = false;
mDecorView.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);
}
private void showSystemUI()
{
mSystemUiVisible = true;
mDecorView.setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_STABLE |
View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION |
View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN);
hideSystemUiAfterDelay();
}
private void showSubMenu(SaveLoadStateFragment.SaveOrLoad saveOrLoad) private void showSubMenu(SaveLoadStateFragment.SaveOrLoad saveOrLoad)
{ {
// Get rid of any visible submenu // Get rid of any visible submenu