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); |
} |
} |