Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(3608)

Unified Diff: chrome/android/java/src/org/chromium/chrome/browser/webapps/WebappActivity.java

Issue 2636833003: Support "display": "fullscreen" for sites added to the home screen. (Closed)
Patch Set: disable html5 fullscreen Created 3 years, 10 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « chrome/android/java/src/org/chromium/chrome/browser/webapps/FullScreenActivity.java ('k') | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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() {
« no previous file with comments | « chrome/android/java/src/org/chromium/chrome/browser/webapps/FullScreenActivity.java ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698