Index: chrome/android/java/src/org/chromium/chrome/browser/webapps/FullScreenActivity.java |
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/webapps/FullScreenActivity.java b/chrome/android/java/src/org/chromium/chrome/browser/webapps/FullScreenActivity.java |
index 901b62b51f70f11bef575b192284684282548dd1..81ad6d55d2c0b05429f62a5a593df61d4125eaa2 100644 |
--- a/chrome/android/java/src/org/chromium/chrome/browser/webapps/FullScreenActivity.java |
+++ b/chrome/android/java/src/org/chromium/chrome/browser/webapps/FullScreenActivity.java |
@@ -5,8 +5,10 @@ |
package org.chromium.chrome.browser.webapps; |
import android.content.Intent; |
+import android.os.Build; |
import android.util.Pair; |
import android.view.View; |
+import android.view.View.OnSystemUiVisibilityChangeListener; |
import android.view.ViewGroup; |
import org.chromium.base.annotations.SuppressFBWarnings; |
@@ -46,6 +48,20 @@ public abstract class FullScreenActivity extends ChromeActivity { |
protected static final String BUNDLE_TAB_URL = "tabUrl"; |
private static final String TAG = "FullScreenActivity"; |
+ private static final int ENTER_IMMERSIVE_MODE_DELAY_MILLIS = 300; |
+ private static final int RESTORE_IMMERSIVE_MODE_DELAY_MILLIS = 3000; |
+ private static final int IMMERSIVE_MODE_UI_FLAGS = |
+ View.SYSTEM_UI_FLAG_LAYOUT_STABLE |
+ | View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN |
+ | View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION |
+ | View.SYSTEM_UI_FLAG_HIDE_NAVIGATION // hide nav bar |
+ | View.SYSTEM_UI_FLAG_FULLSCREEN // hide status bar |
+ | View.SYSTEM_UI_FLAG_LOW_PROFILE |
+ | View.SYSTEM_UI_FLAG_IMMERSIVE; |
+ |
+ private boolean mEnableImmersive; |
+ private boolean mEnteredImmersive; |
+ |
private Tab mTab; |
private WebContents mWebContents; |
@@ -179,6 +195,50 @@ public abstract class FullScreenActivity extends ChromeActivity { |
}; |
} |
+ @Override |
+ public void onWindowFocusChanged(boolean hasFocus) { |
+ super.onWindowFocusChanged(hasFocus); |
+ |
+ if (hasFocus && mEnableImmersive) { |
+ enterImmersiveMode(getWindow().getDecorView()); |
+ } |
+ } |
+ |
+ /** |
+ * Ensure the given {@link View} is in fullscreen immersion if this device supports. |
+ */ |
+ protected void enterImmersiveMode(final View decor) { |
+ if (!supportsImmersiveMode()) { |
+ return; |
+ } |
+ mEnableImmersive = true; |
+ |
+ // Register a SystemUiVisibilityChangeListener to restore immersive mode. |
dominickn
2017/01/16 22:49:01
Can these comments be a little more descriptive? S
|
+ if (!mEnteredImmersive) { |
+ decor.setOnSystemUiVisibilityChangeListener(new OnSystemUiVisibilityChangeListener() { |
+ @Override |
+ public void onSystemUiVisibilityChange(int newFlags) { |
+ delaySetImmersive(decor, newFlags, RESTORE_IMMERSIVE_MODE_DELAY_MILLIS); |
+ } |
+ }); |
+ } |
+ // Set Immersive mode on demand. |
dominickn
2017/01/16 22:49:01
Nit: add a newline above this comment, and explain
Leo
2017/01/18 05:09:40
Actually I just follow the sample codes created by
dominickn
2017/01/18 05:56:17
Ah, I see, that makes sense.
|
+ delaySetImmersive(decor, decor.getSystemUiVisibility(), ENTER_IMMERSIVE_MODE_DELAY_MILLIS); |
+ mEnteredImmersive = true; |
+ } |
+ |
+ private void delaySetImmersive(final View decor, final int flags, int delayInMills) { |
+ mHandler.postDelayed(new Runnable() { |
+ @Override |
+ public void run() { |
+ int desiredFlags = flags | IMMERSIVE_MODE_UI_FLAGS; |
+ if (flags != desiredFlags) { |
+ decor.setSystemUiVisibility(desiredFlags); |
+ } |
+ } |
+ }, delayInMills); |
+ } |
+ |
/** |
* @return {@link TabDelegateFactory} to be used while creating the associated {@link Tab}. |
*/ |
@@ -206,4 +266,11 @@ public abstract class FullScreenActivity extends ChromeActivity { |
@Override |
public void onCheckForUpdate(boolean updateAvailable) { |
} |
+ |
+ /** |
+ ** @return true if this device supports immersive mode functionality. |
+ **/ |
+ public static boolean supportsImmersiveMode() { |
+ return Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT; |
+ } |
} |