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

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

Issue 2636833003: Support "display": "fullscreen" for sites added to the home screen. (Closed)
Patch Set: refactoring code for performance Created 3 years, 11 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
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;
+ }
}

Powered by Google App Engine
This is Rietveld 408576698