| Index: content/browser/power_save_blocker_android.cc
|
| diff --git a/content/browser/power_save_blocker_android.cc b/content/browser/power_save_blocker_android.cc
|
| index 1e91625e19c295a5544f1adfe7f0cffdbac33b16..20ea63ccc58e1c53a10bc036aff8f9008a3e50cc 100644
|
| --- a/content/browser/power_save_blocker_android.cc
|
| +++ b/content/browser/power_save_blocker_android.cc
|
| @@ -2,30 +2,26 @@
|
| // Use of this source code is governed by a BSD-style license that can be
|
| // found in the LICENSE file.
|
|
|
| -#include "content/browser/power_save_blocker_android.h"
|
| -
|
| #include "base/android/jni_android.h"
|
| -#include "base/android/jni_weak_ref.h"
|
| #include "base/logging.h"
|
| +#include "content/browser/android/content_view_core_impl.h"
|
| #include "content/browser/power_save_blocker_impl.h"
|
| +#include "content/browser/web_contents/web_contents_impl.h"
|
| #include "content/public/browser/android/content_view_core.h"
|
| #include "content/public/browser/browser_thread.h"
|
| +#include "content/public/browser/web_contents_observer.h"
|
| #include "jni/PowerSaveBlocker_jni.h"
|
| #include "ui/android/view_android.h"
|
|
|
| -using base::android::AttachCurrentThread;
|
| -using base::android::ScopedJavaLocalRef;
|
| -using gfx::NativeView;
|
| -
|
| namespace content {
|
|
|
| +using base::android::AttachCurrentThread;
|
| +
|
| class PowerSaveBlockerImpl::Delegate
|
| - : public base::RefCountedThreadSafe<PowerSaveBlockerImpl::Delegate> {
|
| + : public base::RefCountedThreadSafe<PowerSaveBlockerImpl::Delegate>,
|
| + public WebContentsObserver {
|
| public:
|
| - explicit Delegate(NativeView view_android) {
|
| - j_view_android_ = JavaObjectWeakGlobalRef(
|
| - AttachCurrentThread(), view_android->GetJavaObject().obj());
|
| - }
|
| + explicit Delegate(WebContents* web_contents);
|
|
|
| // Does the actual work to apply or remove the desired power save block.
|
| void ApplyBlock();
|
| @@ -33,27 +29,61 @@ class PowerSaveBlockerImpl::Delegate
|
|
|
| private:
|
| friend class base::RefCountedThreadSafe<Delegate>;
|
| - ~Delegate() {}
|
| + ~Delegate() override;
|
|
|
| - JavaObjectWeakGlobalRef j_view_android_;
|
| + base::android::ScopedJavaLocalRef<jobject> GetContentViewCore();
|
| +
|
| + base::android::ScopedJavaGlobalRef<jobject> java_power_save_blocker_;
|
|
|
| DISALLOW_COPY_AND_ASSIGN(Delegate);
|
| };
|
|
|
| +PowerSaveBlockerImpl::Delegate::Delegate(WebContents* web_contents)
|
| + : WebContentsObserver(web_contents) {
|
| + JNIEnv* env = AttachCurrentThread();
|
| + java_power_save_blocker_.Reset(Java_PowerSaveBlocker_create(env));
|
| +}
|
| +
|
| +PowerSaveBlockerImpl::Delegate::~Delegate() {
|
| +}
|
| +
|
| void PowerSaveBlockerImpl::Delegate::ApplyBlock() {
|
| DCHECK_CURRENTLY_ON(BrowserThread::UI);
|
| + base::android::ScopedJavaLocalRef<jobject> java_content_view_core =
|
| + GetContentViewCore();
|
| + if (java_content_view_core.is_null())
|
| + return;
|
| +
|
| + ScopedJavaLocalRef<jobject> obj(java_power_save_blocker_);
|
| JNIEnv* env = AttachCurrentThread();
|
| - ScopedJavaLocalRef<jobject> j_object = j_view_android_.get(env);
|
| - if (j_object.obj())
|
| - Java_PowerSaveBlocker_applyBlock(env, j_object.obj());
|
| + Java_PowerSaveBlocker_applyBlock(env, obj.obj(),
|
| + java_content_view_core.obj());
|
| }
|
|
|
| void PowerSaveBlockerImpl::Delegate::RemoveBlock() {
|
| DCHECK_CURRENTLY_ON(BrowserThread::UI);
|
| + base::android::ScopedJavaLocalRef<jobject> java_content_view_core =
|
| + GetContentViewCore();
|
| + if (java_content_view_core.is_null())
|
| + return;
|
| +
|
| + ScopedJavaLocalRef<jobject> obj(java_power_save_blocker_);
|
| JNIEnv* env = AttachCurrentThread();
|
| - ScopedJavaLocalRef<jobject> j_object = j_view_android_.get(env);
|
| - if (j_object.obj())
|
| - Java_PowerSaveBlocker_removeBlock(env, j_object.obj());
|
| + Java_PowerSaveBlocker_removeBlock(env, obj.obj(),
|
| + java_content_view_core.obj());
|
| +}
|
| +
|
| +base::android::ScopedJavaLocalRef<jobject>
|
| +PowerSaveBlockerImpl::Delegate::GetContentViewCore() {
|
| + if (!web_contents())
|
| + return base::android::ScopedJavaLocalRef<jobject>();
|
| +
|
| + ContentViewCoreImpl* content_view_core_impl =
|
| + ContentViewCoreImpl::FromWebContents(web_contents());
|
| + if (!content_view_core_impl)
|
| + return base::android::ScopedJavaLocalRef<jobject>();
|
| +
|
| + return content_view_core_impl->GetJavaObject();
|
| }
|
|
|
| PowerSaveBlockerImpl::PowerSaveBlockerImpl(PowerSaveBlockerType type,
|
| @@ -70,15 +100,13 @@ PowerSaveBlockerImpl::~PowerSaveBlockerImpl() {
|
| }
|
| }
|
|
|
| -void PowerSaveBlockerImpl::InitDisplaySleepBlocker(NativeView view_android) {
|
| - if (!view_android)
|
| +void PowerSaveBlockerImpl::InitDisplaySleepBlocker(WebContents* web_contents) {
|
| + DCHECK_CURRENTLY_ON(BrowserThread::UI);
|
| + if (!web_contents)
|
| return;
|
|
|
| - delegate_ = new Delegate(view_android);
|
| - // This may be called on any thread.
|
| - BrowserThread::PostTask(
|
| - BrowserThread::UI, FROM_HERE,
|
| - base::Bind(&Delegate::ApplyBlock, delegate_));
|
| + delegate_ = new Delegate(web_contents);
|
| + delegate_->ApplyBlock();
|
| }
|
|
|
| bool RegisterPowerSaveBlocker(JNIEnv* env) {
|
|
|