Index: chrome/android/java/src/org/chromium/chrome/browser/fullscreen/FullscreenHtmlApiHandler.java |
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/fullscreen/FullscreenHtmlApiHandler.java b/chrome/android/java/src/org/chromium/chrome/browser/fullscreen/FullscreenHtmlApiHandler.java |
index 82ade48aa8e68a7dfc1c7dafe9e39f33a98028a7..9e66d3278d449efa435cacf894b860ee6732b1f8 100644 |
--- a/chrome/android/java/src/org/chromium/chrome/browser/fullscreen/FullscreenHtmlApiHandler.java |
+++ b/chrome/android/java/src/org/chromium/chrome/browser/fullscreen/FullscreenHtmlApiHandler.java |
@@ -23,6 +23,8 @@ import org.chromium.chrome.R; |
import org.chromium.chrome.browser.widget.TextBubble; |
import org.chromium.content.browser.ContentViewCore; |
+import java.lang.ref.WeakReference; |
+ |
/** |
* Handles updating the UI based on requests to the HTML Fullscreen API. |
*/ |
@@ -104,6 +106,83 @@ public class FullscreenHtmlApiHandler { |
boolean shouldShowNotificationBubble(); |
} |
+ // This static inner class holds a WeakReference to the outer object, to avoid triggering the |
+ // lint HandlerLeak warning. |
+ private static class FullscreenHandler extends Handler { |
+ private final WeakReference<FullscreenHtmlApiHandler> mFullscreenHtmlApiHandler; |
+ |
+ public FullscreenHandler(FullscreenHtmlApiHandler fullscreenHtmlApiHandler) { |
+ mFullscreenHtmlApiHandler = new WeakReference<FullscreenHtmlApiHandler>( |
+ fullscreenHtmlApiHandler); |
+ } |
+ |
+ @Override |
+ public void handleMessage(Message msg) { |
+ if (msg == null) return; |
+ FullscreenHtmlApiHandler fullscreenHtmlApiHandler = mFullscreenHtmlApiHandler.get(); |
+ if (fullscreenHtmlApiHandler == null) return; |
+ switch (msg.what) { |
+ case MSG_ID_HIDE_NOTIFICATION_BUBBLE: |
+ fullscreenHtmlApiHandler.hideNotificationBubble(); |
+ break; |
+ case MSG_ID_SET_FULLSCREEN_SYSTEM_UI_FLAGS: { |
+ assert fullscreenHtmlApiHandler.getPersistentFullscreenMode() : |
+ "Calling after we exited fullscreen"; |
+ final ContentViewCore contentViewCore = |
+ fullscreenHtmlApiHandler.mContentViewCoreInFullscreen; |
+ if (contentViewCore == null) return; |
+ final View contentView = contentViewCore.getContainerView(); |
+ int systemUiVisibility = contentView.getSystemUiVisibility(); |
+ if ((systemUiVisibility & SYSTEM_UI_FLAG_FULLSCREEN) |
+ == SYSTEM_UI_FLAG_FULLSCREEN) { |
+ return; |
+ } |
+ systemUiVisibility |= SYSTEM_UI_FLAG_FULLSCREEN; |
+ systemUiVisibility |= SYSTEM_UI_FLAG_LOW_PROFILE; |
+ contentView.setSystemUiVisibility(systemUiVisibility); |
+ |
+ // Trigger a update to clear the SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN flag |
+ // once the view has been laid out after this system UI update. Without |
+ // clearing this flag, the keyboard appearing will not trigger a relayout |
+ // of the contents, which prevents updating the overdraw amount to the |
+ // renderer. |
+ contentView.addOnLayoutChangeListener(new OnLayoutChangeListener() { |
+ @Override |
+ public void onLayoutChange(View v, int left, int top, int right, |
+ int bottom, int oldLeft, int oldTop, int oldRight, |
+ int oldBottom) { |
+ sendEmptyMessageDelayed(MSG_ID_CLEAR_LAYOUT_FULLSCREEN_FLAG, |
+ CLEAR_LAYOUT_FULLSCREEN_DELAY_MS); |
+ contentView.removeOnLayoutChangeListener(this); |
+ } |
+ }); |
+ break; |
+ } |
+ case MSG_ID_CLEAR_LAYOUT_FULLSCREEN_FLAG: { |
+ // Change this assert to simply ignoring the message to work around |
+ // http://crbug/365638 |
+ // TODO(aberent): Fix bug |
+ // assert mIsPersistentMode : "Calling after we exited fullscreen"; |
+ if (!fullscreenHtmlApiHandler.getPersistentFullscreenMode()) return; |
+ final ContentViewCore contentViewCore = |
+ fullscreenHtmlApiHandler.mContentViewCoreInFullscreen; |
+ if (contentViewCore == null) return; |
+ final View view = contentViewCore.getContainerView(); |
+ int systemUiVisibility = view.getSystemUiVisibility(); |
+ if ((systemUiVisibility & SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN) == 0) { |
+ return; |
+ } |
+ systemUiVisibility &= ~SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN; |
+ view.setSystemUiVisibility(systemUiVisibility); |
+ break; |
+ } |
+ default: |
+ assert false : "Unexpected message for ID: " + msg.what; |
+ break; |
+ } |
+ } |
+ } |
+ |
/** |
* Constructs the handler that will manage the UI transitions from the HTML fullscreen API. |
* |
@@ -116,69 +195,7 @@ public class FullscreenHtmlApiHandler { |
mWindow = window; |
mDelegate = delegate; |
mPersistentFullscreenSupported = persistentFullscreenSupported; |
- |
- mHandler = new Handler() { |
- @Override |
- public void handleMessage(Message msg) { |
- if (msg == null) return; |
- switch (msg.what) { |
- case MSG_ID_HIDE_NOTIFICATION_BUBBLE: |
- hideNotificationBubble(); |
- break; |
- case MSG_ID_SET_FULLSCREEN_SYSTEM_UI_FLAGS: { |
- assert mIsPersistentMode : "Calling after we exited fullscreen"; |
- final ContentViewCore contentViewCore = mContentViewCoreInFullscreen; |
- if (contentViewCore == null) return; |
- final View contentView = contentViewCore.getContainerView(); |
- int systemUiVisibility = contentView.getSystemUiVisibility(); |
- if ((systemUiVisibility & SYSTEM_UI_FLAG_FULLSCREEN) |
- == SYSTEM_UI_FLAG_FULLSCREEN) { |
- return; |
- } |
- systemUiVisibility |= SYSTEM_UI_FLAG_FULLSCREEN; |
- systemUiVisibility |= SYSTEM_UI_FLAG_LOW_PROFILE; |
- contentView.setSystemUiVisibility(systemUiVisibility); |
- |
- // Trigger a update to clear the SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN flag |
- // once the view has been laid out after this system UI update. Without |
- // clearing this flag, the keyboard appearing will not trigger a relayout |
- // of the contents, which prevents updating the overdraw amount to the |
- // renderer. |
- contentView.addOnLayoutChangeListener(new OnLayoutChangeListener() { |
- @Override |
- public void onLayoutChange(View v, int left, int top, int right, |
- int bottom, int oldLeft, int oldTop, int oldRight, |
- int oldBottom) { |
- sendEmptyMessageDelayed(MSG_ID_CLEAR_LAYOUT_FULLSCREEN_FLAG, |
- CLEAR_LAYOUT_FULLSCREEN_DELAY_MS); |
- contentView.removeOnLayoutChangeListener(this); |
- } |
- }); |
- break; |
- } |
- case MSG_ID_CLEAR_LAYOUT_FULLSCREEN_FLAG: { |
- // Change this assert to simply ignoring the message to work around |
- // http://crbug/365638 |
- // TODO(aberent): Fix bug |
- // assert mIsPersistentMode : "Calling after we exited fullscreen"; |
- if (!mIsPersistentMode) return; |
- if (mContentViewCoreInFullscreen == null) return; |
- final View view = mContentViewCoreInFullscreen.getContainerView(); |
- int systemUiVisibility = view.getSystemUiVisibility(); |
- if ((systemUiVisibility & SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN) == 0) { |
- return; |
- } |
- systemUiVisibility &= ~SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN; |
- view.setSystemUiVisibility(systemUiVisibility); |
- break; |
- } |
- default: |
- assert false : "Unexpected message for ID: " + msg.what; |
- break; |
- } |
- } |
- }; |
- |
+ mHandler = new FullscreenHandler(this); |
Resources resources = mWindow.getContext().getResources(); |
float density = resources.getDisplayMetrics().density; |
mNotificationMaxDimension = (int) (density * MAX_NOTIFICATION_DIMENSION_DP); |