 Chromium Code Reviews
 Chromium Code Reviews Issue 2636833003:
  Support "display": "fullscreen" for sites added to the home screen.  (Closed)
    
  
    Issue 2636833003:
  Support "display": "fullscreen" for sites added to the home screen.  (Closed) 
  | 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..9d1054d7bd50ddcabb070bcadac20d210071cbba 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 mEnteredImmersive; | 
| + private Runnable mSetImmersiveRunnable; | 
| + | 
| private Tab mTab; | 
| private WebContents mWebContents; | 
| @@ -179,6 +195,62 @@ public abstract class FullScreenActivity extends ChromeActivity { | 
| }; | 
| } | 
| + @Override | 
| + public void onWindowFocusChanged(boolean hasFocus) { | 
| + super.onWindowFocusChanged(hasFocus); | 
| + | 
| + if (hasFocus && (mSetImmersiveRunnable != null)) { | 
| + enterImmersiveMode(getWindow().getDecorView()); | 
| + } | 
| + } | 
| + | 
| + /** | 
| + * Ensure the given {@link View} is in fullscreen immersion if this device supports. | 
| + */ | 
| + protected void enterImmersiveMode(final View decor) { | 
| + if (!supportsImmersiveMode()) { | 
| 
dominickn
2017/01/18 05:56:17
Minor nit: the style guide lets you do this for sh
 
Leo
2017/01/18 23:03:12
Done.
 | 
| + return; | 
| + } | 
| + | 
| + if (mSetImmersiveRunnable == null) { | 
| + mSetImmersiveRunnable = new Runnable() { | 
| + @Override | 
| + public void run() { | 
| + int currentFlags = decor.getSystemUiVisibility(); | 
| + int desiredFlags = currentFlags | IMMERSIVE_MODE_UI_FLAGS; | 
| + if (currentFlags != desiredFlags) { | 
| + decor.setSystemUiVisibility(desiredFlags); | 
| + } | 
| + } | 
| + }; | 
| + } | 
| + | 
| + // When we enter immersive mode for the first time, register a | 
| + // SystemUiVisibilityChangeListener that restores immersive mode. This is necessary | 
| + // because user actions like focusing a keyboard will break out of immersive. | 
| + if (!mEnteredImmersive) { | 
| + decor.setOnSystemUiVisibilityChangeListener(new OnSystemUiVisibilityChangeListener() { | 
| + @Override | 
| + public void onSystemUiVisibilityChange(int newFlags) { | 
| + if ((newFlags & View.SYSTEM_UI_FLAG_FULLSCREEN) == 0) { | 
| + asyncSetImmersive(decor, RESTORE_IMMERSIVE_MODE_DELAY_MILLIS); | 
| + } | 
| + } | 
| + }); | 
| + } | 
| + // Set immersive mode asynchronously. | 
| 
dominickn
2017/01/18 05:56:17
Minor nit: you can probably remove this comment be
 
Leo
2017/01/18 23:03:12
Done.
 | 
| + asyncSetImmersive(decor, ENTER_IMMERSIVE_MODE_DELAY_MILLIS); | 
| + mEnteredImmersive = true; | 
| + } | 
| + | 
| + private void asyncSetImmersive(final View decor, int delayInMills) { | 
| + if (mSetImmersiveRunnable == null) { | 
| 
dominickn
2017/01/18 05:56:17
Minor style nit: you can inline the return here.
 
Leo
2017/01/18 23:03:12
Done. And remove unused decor.
 | 
| + return; | 
| + } | 
| + mHandler.removeCallbacks(mSetImmersiveRunnable); | 
| + mHandler.postDelayed(mSetImmersiveRunnable, delayInMills); | 
| + } | 
| + | 
| /** | 
| * @return {@link TabDelegateFactory} to be used while creating the associated {@link Tab}. | 
| */ | 
| @@ -206,4 +278,11 @@ public abstract class FullScreenActivity extends ChromeActivity { | 
| @Override | 
| public void onCheckForUpdate(boolean updateAvailable) { | 
| } | 
| + | 
| + /** | 
| + ** @return true if this device supports immersive mode functionality. | 
| 
dominickn
2017/01/18 05:56:17
Minor style nit: single * after the first line of
 
Leo
2017/01/18 23:03:12
Thanks for the correction. I found this method is
 | 
| + **/ | 
| + public static boolean supportsImmersiveMode() { | 
| + return Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT; | 
| + } | 
| } |