Chromium Code Reviews| Index: chrome/android/java/src/org/chromium/chrome/browser/webapps/WebappActivity.java |
| diff --git a/chrome/android/java/src/org/chromium/chrome/browser/webapps/WebappActivity.java b/chrome/android/java/src/org/chromium/chrome/browser/webapps/WebappActivity.java |
| index 7a35c67a8ce7a90cbdfc875aec890b77f31d55d4..4602ad331eea2e80475d08cf9c2c52f322ee14e4 100644 |
| --- a/chrome/android/java/src/org/chromium/chrome/browser/webapps/WebappActivity.java |
| +++ b/chrome/android/java/src/org/chromium/chrome/browser/webapps/WebappActivity.java |
| @@ -9,12 +9,14 @@ import android.graphics.Bitmap; |
| import android.graphics.Color; |
| import android.graphics.drawable.Drawable; |
| import android.net.Uri; |
| +import android.os.Build; |
| import android.os.Bundle; |
| import android.os.StrictMode; |
| import android.os.SystemClock; |
| import android.text.TextUtils; |
| import android.view.LayoutInflater; |
| import android.view.View; |
| +import android.view.View.OnSystemUiVisibilityChangeListener; |
| import android.view.ViewGroup; |
| import android.widget.FrameLayout; |
| import android.widget.ImageView; |
| @@ -30,6 +32,7 @@ import org.chromium.blink_public.platform.WebDisplayMode; |
| import org.chromium.chrome.R; |
| import org.chromium.chrome.browser.TabState; |
| import org.chromium.chrome.browser.document.DocumentUtils; |
| +import org.chromium.chrome.browser.fullscreen.ChromeFullscreenManager; |
| import org.chromium.chrome.browser.metrics.WebappUma; |
| import org.chromium.chrome.browser.tab.EmptyTabObserver; |
| import org.chromium.chrome.browser.tab.Tab; |
| @@ -54,6 +57,16 @@ public class WebappActivity extends FullScreenActivity { |
| private static final String TAG = "WebappActivity"; |
| private static final long MS_BEFORE_NAVIGATING_BACK_FROM_INTERSTITIAL = 1000; |
| + 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 final WebappDirectoryManager mDirectoryManager; |
| protected WebappInfo mWebappInfo; |
| @@ -68,6 +81,8 @@ public class WebappActivity extends FullScreenActivity { |
| private Bitmap mLargestFavicon; |
| + private Runnable mSetImmersiveRunnable; |
| + |
| /** |
| * Construct all the variables that shouldn't change. We do it here both to clarify when the |
| * objects are created and to ensure that they exist throughout the parallelized initialization |
| @@ -92,8 +107,6 @@ public class WebappActivity extends FullScreenActivity { |
| mWebappInfo = newWebappInfo; |
| resetSavedInstanceState(); |
| if (mIsInitialized) initializeUI(null); |
| - // TODO(dominickn): send the web app into fullscreen if mDisplayMode is |
| - // WebDisplayMode.Fullscreen. See crbug.com/581522 |
| } |
| } |
| @@ -118,9 +131,10 @@ public class WebappActivity extends FullScreenActivity { |
| getActivityTab().addObserver(createTabObserver()); |
| getActivityTab().getTabWebContentsDelegateAndroid().setDisplayMode( |
| - WebDisplayMode.Standalone); |
| - // TODO(dominickn): send the web app into fullscreen if mDisplayMode is |
| - // WebDisplayMode.Fullscreen. See crbug.com/581522 |
| + mWebappInfo.displayMode()); |
| + if (mWebappInfo.displayMode() == WebDisplayMode.Fullscreen) { |
| + enterImmersiveMode(); |
| + } |
| } |
| @Override |
| @@ -203,6 +217,65 @@ public class WebappActivity extends FullScreenActivity { |
| } |
| @Override |
| + public void onWindowFocusChanged(boolean hasFocus) { |
| + super.onWindowFocusChanged(hasFocus); |
| + |
| + // Re-enter immersive mode after users switch back to this Activity. |
| + if (hasFocus) { |
| + asyncSetImmersive(ENTER_IMMERSIVE_MODE_DELAY_MILLIS); |
| + } |
| + } |
| + |
| + /** |
| + * Sets activity's decor view into an immersive mode. |
| + * If immersive mode is not supported, this method no-ops. |
| + */ |
| + private void enterImmersiveMode() { |
| + // Immersive mode is only supported in API 19+. |
| + if (Build.VERSION.SDK_INT < Build.VERSION_CODES.KITKAT) return; |
| + |
| + if (mSetImmersiveRunnable == null) { |
| + |
| + final View decor = getWindow().getDecorView(); |
| + |
| + 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 mode. |
| + decor.setOnSystemUiVisibilityChangeListener(new OnSystemUiVisibilityChangeListener() { |
| + @Override |
| + public void onSystemUiVisibilityChange(int newFlags) { |
| + if ((newFlags & View.SYSTEM_UI_FLAG_FULLSCREEN) == 0) { |
| + asyncSetImmersive(RESTORE_IMMERSIVE_MODE_DELAY_MILLIS); |
| + } |
| + } |
| + }); |
| + } |
| + |
| + asyncSetImmersive(ENTER_IMMERSIVE_MODE_DELAY_MILLIS); |
| + } |
| + |
| + /** |
| + * This method no-ops before {@link enterImmersiveMode()) is called explicitly. |
| + */ |
| + private void asyncSetImmersive(int delayInMills) { |
| + if (mSetImmersiveRunnable == null) return; |
| + |
| + mHandler.removeCallbacks(mSetImmersiveRunnable); |
| + mHandler.postDelayed(mSetImmersiveRunnable, delayInMills); |
| + } |
| + |
| + @Override |
| public void onResume() { |
| if (!isFinishing()) { |
| if (getIntent() != null) { |
| @@ -372,6 +445,24 @@ public class WebappActivity extends FullScreenActivity { |
| getActivityTab().getUrl(), getWebappInfo().uri().toString(), true); |
| } |
| + @Override |
| + protected ChromeFullscreenManager createFullscreenManager() { |
| + // Disable HTML5 fullscreen in PWA fullscreen mode. |
| + return new ChromeFullscreenManager(this, false) { |
|
Ted C
2017/02/17 05:51:50
I'm also not against returning null here assuming
Leo
2017/02/17 07:03:08
I prefer your suggestion. Even returning null is c
|
| + @Override |
| + public void setPersistentFullscreenMode(boolean enabled) { |
| + if (mWebappInfo.displayMode() == WebDisplayMode.Fullscreen) return; |
| + super.setPersistentFullscreenMode(enabled); |
| + } |
| + |
| + @Override |
| + public boolean getPersistentFullscreenMode() { |
| + if (mWebappInfo.displayMode() == WebDisplayMode.Fullscreen) return false; |
| + return super.getPersistentFullscreenMode(); |
| + } |
| + }; |
| + } |
| + |
| protected TabObserver createTabObserver() { |
| return new EmptyTabObserver() { |