Chromium Code Reviews| Index: content/public/android/java/src/org/chromium/content/browser/PowerSaveBlocker.java |
| diff --git a/content/public/android/java/src/org/chromium/content/browser/PowerSaveBlocker.java b/content/public/android/java/src/org/chromium/content/browser/PowerSaveBlocker.java |
| index 3c561c3c49030d3a1b1d39fd8e754ecf5791318e..4eea4c0c312d3443ab4680f5fe5c4f820463dbf9 100644 |
| --- a/content/public/android/java/src/org/chromium/content/browser/PowerSaveBlocker.java |
| +++ b/content/public/android/java/src/org/chromium/content/browser/PowerSaveBlocker.java |
| @@ -4,17 +4,45 @@ |
| package org.chromium.content.browser; |
| +import android.view.View; |
| + |
| import org.chromium.base.CalledByNative; |
| -import org.chromium.ui.base.ViewAndroid; |
| +import org.chromium.base.JNINamespace; |
| +import org.chromium.ui.base.ViewAndroidDelegate; |
| + |
| +import java.lang.ref.WeakReference; |
| +@JNINamespace("content") |
| class PowerSaveBlocker { |
| + // WeakReference to prevent leaks in Android WebView. |
| + private WeakReference<View> mKeepScreenOnView; |
| + |
| + @CalledByNative |
| + private static PowerSaveBlocker create() { |
| + return new PowerSaveBlocker(); |
| + } |
| + |
| + private PowerSaveBlocker() {} |
| + |
| @CalledByNative |
| - private static void applyBlock(ViewAndroid view) { |
| - view.incrementKeepScreenOnCount(); |
| + private void applyBlock(ContentViewCore contentViewCore) { |
| + assert mKeepScreenOnView == null; |
|
Ted C
2015/04/07 19:53:29
It used to use a counter for incrementing and decr
boliu
2015/04/07 20:03:18
Because there used to be one anchor view per CVC,
|
| + ViewAndroidDelegate delegate = contentViewCore.getViewAndroidDelegate(); |
| + View anchorView = delegate.acquireAnchorView(); |
| + mKeepScreenOnView = new WeakReference<>(anchorView); |
| + delegate.setAnchorViewPosition(anchorView, 0, 0, 0, 0); |
| + anchorView.setKeepScreenOn(true); |
| } |
| @CalledByNative |
| - private static void removeBlock(ViewAndroid view) { |
| - view.decrementKeepScreenOnCount(); |
| + private void removeBlock(ContentViewCore contentViewCore) { |
| + assert mKeepScreenOnView != null; |
| + View anchorView = mKeepScreenOnView.get(); |
| + mKeepScreenOnView = null; |
| + if (anchorView == null) return; |
| + |
| + ViewAndroidDelegate delegate = contentViewCore.getViewAndroidDelegate(); |
| + anchorView.setKeepScreenOn(false); |
| + delegate.releaseAnchorView(anchorView); |
| } |
| } |