Commit 89133a80 authored by Bo Liu's avatar Bo Liu Committed by Chromium LUCI CQ

weblayer: Fix shell fullscreen

The shell unsets the FullscreenCallback when the activity is destroyed,
to avoid leaks, and also to avoid callbacks hitting null because the
activity no longer exists.

However unsetting FullscreenCallback has the side effect of exiting
fullscreen, which is not desired. Instead, create a
static FullscreenCallbackImpl that can unset its reference to the
Activity when it's destroyed.

Bug: 1159529
Change-Id: Ide0d440ada7d32c806b0c715538624e310e4fd8d
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/2601667Reviewed-by: default avatarScott Violet <sky@chromium.org>
Commit-Queue: Bo <boliu@chromium.org>
Cr-Commit-Position: refs/heads/master@{#840229}
parent b75f7028
...@@ -184,6 +184,52 @@ public class WebLayerShellActivity extends AppCompatActivity { ...@@ -184,6 +184,52 @@ public class WebLayerShellActivity extends AppCompatActivity {
} }
} }
private static final class FullscreenCallbackImpl extends FullscreenCallback {
private WebLayerShellActivity mActivity;
private int mSystemVisibilityToRestore;
public FullscreenCallbackImpl(WebLayerShellActivity activity) {
mActivity = activity;
}
public void setActivity(WebLayerShellActivity activity) {
mActivity = activity;
}
@Override
public void onEnterFullscreen(Runnable exitFullscreenRunnable) {
if (mActivity == null) return;
// This comes from Chrome code to avoid an extra resize.
final WindowManager.LayoutParams attrs = mActivity.getWindow().getAttributes();
attrs.flags |= WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS;
mActivity.getWindow().setAttributes(attrs);
View decorView = mActivity.getWindow().getDecorView();
// Caching the system ui visibility is ok for shell, but likely not ok for
// real code.
mSystemVisibilityToRestore = decorView.getSystemUiVisibility();
decorView.setSystemUiVisibility(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_STICKY);
}
@Override
public void onExitFullscreen() {
if (mActivity == null) return;
View decorView = mActivity.getWindow().getDecorView();
decorView.setSystemUiVisibility(mSystemVisibilityToRestore);
final WindowManager.LayoutParams attrs = mActivity.getWindow().getAttributes();
if ((attrs.flags & WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS) != 0) {
attrs.flags &= ~WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS;
mActivity.getWindow().setAttributes(attrs);
}
}
}
private static final String TAG = "WebLayerShell"; private static final String TAG = "WebLayerShell";
private static final float DEFAULT_TEXT_SIZE = 15.0F; private static final float DEFAULT_TEXT_SIZE = 15.0F;
private static final int EDITABLE_URL_TEXT_VIEW = 0; private static final int EDITABLE_URL_TEXT_VIEW = 0;
...@@ -199,12 +245,11 @@ public class WebLayerShellActivity extends AppCompatActivity { ...@@ -199,12 +245,11 @@ public class WebLayerShellActivity extends AppCompatActivity {
private View mAltTopContentsContainer; private View mAltTopContentsContainer;
private TabListCallback mTabListCallback; private TabListCallback mTabListCallback;
private NewTabCallback mNewTabCallback; private NewTabCallback mNewTabCallback;
private FullscreenCallback mFullscreenCallback; private FullscreenCallbackImpl mFullscreenCallback;
private NavigationCallback mNavigationCallback; private NavigationCallback mNavigationCallback;
private ErrorPageCallback mErrorPageCallback; private ErrorPageCallback mErrorPageCallback;
private List<Tab> mPreviousTabList = new ArrayList<>(); private List<Tab> mPreviousTabList = new ArrayList<>();
private Map<Tab, PerTabState> mTabToPerTabState = new HashMap<>(); private Map<Tab, PerTabState> mTabToPerTabState = new HashMap<>();
private Runnable mExitFullscreenRunnable;
private boolean mIsTopViewVisible = true; private boolean mIsTopViewVisible = true;
private View mBottomView; private View mBottomView;
private int mTopViewMinHeight; private int mTopViewMinHeight;
...@@ -437,6 +482,9 @@ public class WebLayerShellActivity extends AppCompatActivity { ...@@ -437,6 +482,9 @@ public class WebLayerShellActivity extends AppCompatActivity {
if (mTabListCallback != null) { if (mTabListCallback != null) {
unregisterBrowserAndTabCallbacks(); unregisterBrowserAndTabCallbacks();
} }
if (mFullscreenCallback != null) {
mFullscreenCallback.setActivity(null);
}
} }
private void unregisterBrowserAndTabCallbacks() { private void unregisterBrowserAndTabCallbacks() {
...@@ -578,43 +626,6 @@ public class WebLayerShellActivity extends AppCompatActivity { ...@@ -578,43 +626,6 @@ public class WebLayerShellActivity extends AppCompatActivity {
} }
}; };
mFullscreenCallback = new FullscreenCallback() {
private int mSystemVisibilityToRestore;
@Override
public void onEnterFullscreen(Runnable exitFullscreenRunnable) {
mExitFullscreenRunnable = exitFullscreenRunnable;
// This comes from Chrome code to avoid an extra resize.
final WindowManager.LayoutParams attrs = getWindow().getAttributes();
attrs.flags |= WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS;
getWindow().setAttributes(attrs);
View decorView = getWindow().getDecorView();
// Caching the system ui visibility is ok for shell, but likely not ok for
// real code.
mSystemVisibilityToRestore = decorView.getSystemUiVisibility();
decorView.setSystemUiVisibility(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_STICKY);
}
@Override
public void onExitFullscreen() {
mExitFullscreenRunnable = null;
View decorView = getWindow().getDecorView();
decorView.setSystemUiVisibility(mSystemVisibilityToRestore);
final WindowManager.LayoutParams attrs = getWindow().getAttributes();
if ((attrs.flags & WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS) != 0) {
attrs.flags &= ~WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS;
getWindow().setAttributes(attrs);
}
}
};
mNavigationCallback = new NavigationCallback() { mNavigationCallback = new NavigationCallback() {
@Override @Override
public void onLoadStateChanged(boolean isLoading, boolean toDifferentDocument) { public void onLoadStateChanged(boolean isLoading, boolean toDifferentDocument) {
...@@ -639,7 +650,17 @@ public class WebLayerShellActivity extends AppCompatActivity { ...@@ -639,7 +650,17 @@ public class WebLayerShellActivity extends AppCompatActivity {
private void registerTabCallbacks(Tab tab) { private void registerTabCallbacks(Tab tab) {
tab.setNewTabCallback(mNewTabCallback); tab.setNewTabCallback(mNewTabCallback);
tab.setFullscreenCallback(mFullscreenCallback);
if (mFullscreenCallback != null) {
tab.setFullscreenCallback(mFullscreenCallback);
} else if (tab.getFullscreenCallback() != null) {
mFullscreenCallback = (FullscreenCallbackImpl) tab.getFullscreenCallback();
mFullscreenCallback.setActivity(this);
} else {
mFullscreenCallback = new FullscreenCallbackImpl(this);
tab.setFullscreenCallback(mFullscreenCallback);
}
tab.getNavigationController().registerNavigationCallback(mNavigationCallback); tab.getNavigationController().registerNavigationCallback(mNavigationCallback);
tab.setErrorPageCallback(mErrorPageCallback); tab.setErrorPageCallback(mErrorPageCallback);
TabCallback tabCallback = new TabCallback() { TabCallback tabCallback = new TabCallback() {
...@@ -681,8 +702,9 @@ public class WebLayerShellActivity extends AppCompatActivity { ...@@ -681,8 +702,9 @@ public class WebLayerShellActivity extends AppCompatActivity {
} }
private void unregisterTabCallbacks(Tab tab) { private void unregisterTabCallbacks(Tab tab) {
// Do not unset FullscreenCallback here which is called from onDestroy, since
// unsetting FullscreenCallback also exits fullscreen.
tab.setNewTabCallback(null); tab.setNewTabCallback(null);
tab.setFullscreenCallback(null);
tab.getNavigationController().unregisterNavigationCallback(mNavigationCallback); tab.getNavigationController().unregisterNavigationCallback(mNavigationCallback);
tab.setErrorPageCallback(null); tab.setErrorPageCallback(null);
PerTabState perTabState = mTabToPerTabState.get(tab); PerTabState perTabState = mTabToPerTabState.get(tab);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment