// Copyright (c) 2012 The Chromium Authors. All rights reserved. // 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_helper.h" #include "base/logging.h" #include "content/browser/power_save_blocker_impl.h" #include "content/public/browser/android/content_view_core.h" #include "content/public/browser/browser_thread.h" #include "jni/PowerSaveBlocker_jni.h" #include "ui/base/android/view_android.h" using base::android::AttachCurrentThread; using base::android::ScopedJavaLocalRef; using gfx::NativeView; namespace content { class PowerSaveBlockerImpl::Delegate : public base::RefCountedThreadSafe<PowerSaveBlockerImpl::Delegate> { public: explicit Delegate(NativeView view_android) { j_view_android_ = JavaObjectWeakGlobalRef( AttachCurrentThread(), view_android->GetJavaObject().obj()); } // Does the actual work to apply or remove the desired power save block. void ApplyBlock(); void RemoveBlock(); private: friend class base::RefCountedThreadSafe<Delegate>; ~Delegate() {} JavaObjectWeakGlobalRef j_view_android_; DISALLOW_COPY_AND_ASSIGN(Delegate); }; void PowerSaveBlockerImpl::Delegate::ApplyBlock() { DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); JNIEnv* env = AttachCurrentThread(); ScopedJavaLocalRef<jobject> j_object = j_view_android_.get(env); if (j_object.obj()) Java_PowerSaveBlocker_applyBlock(env, j_object.obj()); } void PowerSaveBlockerImpl::Delegate::RemoveBlock() { DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); JNIEnv* env = AttachCurrentThread(); ScopedJavaLocalRef<jobject> j_object = j_view_android_.get(env); if (j_object.obj()) Java_PowerSaveBlocker_removeBlock(env, j_object.obj()); } PowerSaveBlockerImpl::PowerSaveBlockerImpl(PowerSaveBlockerType type, const std::string& reason) { // Don't support kPowerSaveBlockPreventAppSuspension } PowerSaveBlockerImpl::~PowerSaveBlockerImpl() { if (delegate_) { BrowserThread::PostTask( BrowserThread::UI, FROM_HERE, base::Bind(&Delegate::RemoveBlock, delegate_)); } } void PowerSaveBlockerImpl::InitDisplaySleepBlocker(NativeView view_android) { if (!view_android) return; delegate_ = new Delegate(view_android); // This may be called on any thread. BrowserThread::PostTask( BrowserThread::UI, FROM_HERE, base::Bind(&Delegate::ApplyBlock, delegate_)); } bool RegisterPowerSaveBlocker(JNIEnv* env) { return RegisterNativesImpl(env); } } // namespace content