From 04159bfcadbd17467ffaead590239cc0121dbfae Mon Sep 17 00:00:00 2001 From: Sagar Dhawan Date: Thu, 3 Sep 2015 15:33:02 -0700 Subject: Fix system navigationbar covering UI in Immersive Mode Immersive mode appears to be buggy on android L and below. Added a runnable to re-apply immersive mode. Change-Id: I97d0dd7c93ce0713ef39f49862087f329db3ea06 --- src/src/com/android/browser/BaseUi.java | 35 ++++++++++++++++++++++++--------- 1 file changed, 26 insertions(+), 9 deletions(-) diff --git a/src/src/com/android/browser/BaseUi.java b/src/src/com/android/browser/BaseUi.java index f4e7d164..4de34b64 100644 --- a/src/src/com/android/browser/BaseUi.java +++ b/src/src/com/android/browser/BaseUi.java @@ -102,10 +102,29 @@ public abstract class BaseUi implements UI { private NavigationBarBase mNavigationBar; private boolean mBlockFocusAnimations; private boolean mFullscreenModeLocked; + private final static int mFullScreenImmersiveSetting = + 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_STICKY; private EdgeSwipeController mEdgeSwipeController; private EdgeSwipeSettings mEdgeSwipeSettings; + // This Runnable is used to re-set fullscreen mode after resume. + // The immersive mode API on android <6.0 is buggy and will more + // often then not glitch out. Using a runnable really helps reduce + // the repeatability of this framework bug, however some corner cases + // remain. Specifically when interacting with pop-up windows(menu). + private Runnable mFullScreenModeRunnable = new Runnable() { + @Override + public void run() { + if (BrowserSettings.getInstance() != null) + setFullscreen(BrowserSettings.getInstance().useFullscreen()); + } + }; + public BaseUi(Activity browser, UiController controller) { mActivity = browser; mUiController = controller; @@ -138,7 +157,7 @@ public abstract class BaseUi implements UI { new View.OnSystemUiVisibilityChangeListener() { @Override public void onSystemUiVisibilityChange(int visFlags) { - final boolean lostFullscreen = (visFlags & View.SYSTEM_UI_FLAG_FULLSCREEN) == 0; + final boolean lostFullscreen = (visFlags & mFullScreenImmersiveSetting) == 0; if (lostFullscreen) setFullscreen(BrowserSettings.getInstance().useFullscreen()); } @@ -176,6 +195,10 @@ public abstract class BaseUi implements UI { // check if we exited without setting active tab // b: 5188145 setFullscreen(BrowserSettings.getInstance().useFullscreen()); + //Work around for < Android M + if (Build.VERSION.SDK_INT <= 22 && BrowserSettings.getInstance().useFullscreen()) + mHandler.postDelayed(mFullScreenModeRunnable, 500); + final Tab ct = mTabControl.getCurrentTab(); if (ct != null) { setActiveTab(ct); @@ -834,19 +857,13 @@ public abstract class BaseUi implements UI { Window win = mActivity.getWindow(); WindowManager.LayoutParams winParams = win.getAttributes(); final int bits = WindowManager.LayoutParams.FLAG_FULLSCREEN; - final int fullscreenImmersiveSetting = - 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_STICKY; if (mCustomView != null) { mCustomView.setSystemUiVisibility(enabled ? - fullscreenImmersiveSetting : View.SYSTEM_UI_FLAG_VISIBLE); + mFullScreenImmersiveSetting : View.SYSTEM_UI_FLAG_VISIBLE); } else if (Build.VERSION.SDK_INT >= 19) { mContentView.setSystemUiVisibility(enabled ? - fullscreenImmersiveSetting : View.SYSTEM_UI_FLAG_VISIBLE); + mFullScreenImmersiveSetting : View.SYSTEM_UI_FLAG_VISIBLE); } else { mContentView.setSystemUiVisibility(enabled ? View.SYSTEM_UI_FLAG_LOW_PROFILE : View.SYSTEM_UI_FLAG_VISIBLE); -- cgit v1.2.3