116c440a377b7ec8b722a2e2c7c864f75c95bd305Ted Kremenek// Copyright (c) 2012 The Chromium Authors. All rights reserved. 216c440a377b7ec8b722a2e2c7c864f75c95bd305Ted Kremenek// Use of this source code is governed by a BSD-style license that can be 316c440a377b7ec8b722a2e2c7c864f75c95bd305Ted Kremenek// found in the LICENSE file. 416c440a377b7ec8b722a2e2c7c864f75c95bd305Ted Kremenek 516c440a377b7ec8b722a2e2c7c864f75c95bd305Ted Kremenek#include "content/browser/power_save_blocker_android.h" 616c440a377b7ec8b722a2e2c7c864f75c95bd305Ted Kremenek 716c440a377b7ec8b722a2e2c7c864f75c95bd305Ted Kremenek#include "base/android/jni_android.h" 816c440a377b7ec8b722a2e2c7c864f75c95bd305Ted Kremenek#include "base/android/jni_weak_ref.h" 916c440a377b7ec8b722a2e2c7c864f75c95bd305Ted Kremenek#include "base/logging.h" 102e331b938b38057e333fab0ba841130ea8467794Douglas Gregor#include "content/browser/power_save_blocker_impl.h" 112e331b938b38057e333fab0ba841130ea8467794Douglas Gregor#include "content/public/browser/android/content_view_core.h" 122e331b938b38057e333fab0ba841130ea8467794Douglas Gregor#include "content/public/browser/browser_thread.h" 1316c440a377b7ec8b722a2e2c7c864f75c95bd305Ted Kremenek#include "jni/PowerSaveBlocker_jni.h" 1416c440a377b7ec8b722a2e2c7c864f75c95bd305Ted Kremenek#include "ui/base/android/view_android.h" 1516c440a377b7ec8b722a2e2c7c864f75c95bd305Ted Kremenek 160a90d32523bfe5fa63e11b648686c9699f786d15Ted Kremenekusing base::android::AttachCurrentThread; 1716c440a377b7ec8b722a2e2c7c864f75c95bd305Ted Kremenekusing base::android::ScopedJavaLocalRef; 18ed122735639d83c10f18c28c7fd117bfcd0f62cbTed Kremenekusing gfx::NativeView; 197eaa8ae8692c5cd3eed8cb334fe5346470522091Douglas Gregor 2016c440a377b7ec8b722a2e2c7c864f75c95bd305Ted Kremeneknamespace content { 216931900f43cea558c6974075256c07728dbfecc6Douglas Gregor 22283cae37b03047c14ef918503bc46b08405c3b69Douglas Gregorclass PowerSaveBlockerImpl::Delegate 23aed123ec3cc37e457fe20a6158fdadf8849ad916Argyrios Kyrtzidis : public base::RefCountedThreadSafe<PowerSaveBlockerImpl::Delegate> { 24283cae37b03047c14ef918503bc46b08405c3b69Douglas Gregor public: 251f60d9ea523fc321d811fe880ba9a1ec74fa8f9bDouglas Gregor explicit Delegate(NativeView view_android) { 26aed123ec3cc37e457fe20a6158fdadf8849ad916Argyrios Kyrtzidis j_view_android_ = JavaObjectWeakGlobalRef( 27007a7c9d8dcdb2e9cd94b6075108bfc4c90e6ccdTed Kremenek AttachCurrentThread(), view_android->GetJavaObject().obj()); 28edc8aa68ef91aeea686c5aadf64ef902c38318ddTed Kremenek } 2916c440a377b7ec8b722a2e2c7c864f75c95bd305Ted Kremenek 3016c440a377b7ec8b722a2e2c7c864f75c95bd305Ted Kremenek // Does the actual work to apply or remove the desired power save block. 311f60d9ea523fc321d811fe880ba9a1ec74fa8f9bDouglas Gregor void ApplyBlock(); 3216c440a377b7ec8b722a2e2c7c864f75c95bd305Ted Kremenek void RemoveBlock(); 335bfb8c128c2ac8eb4032afc180cdc400a0f953caDouglas Gregor 345bfb8c128c2ac8eb4032afc180cdc400a0f953caDouglas Gregor private: 35aed123ec3cc37e457fe20a6158fdadf8849ad916Argyrios Kyrtzidis friend class base::RefCountedThreadSafe<Delegate>; 365bfb8c128c2ac8eb4032afc180cdc400a0f953caDouglas Gregor ~Delegate() {} 3716c440a377b7ec8b722a2e2c7c864f75c95bd305Ted Kremenek 3816c440a377b7ec8b722a2e2c7c864f75c95bd305Ted Kremenek JavaObjectWeakGlobalRef j_view_android_; 39e77f443dbca8cdc23e5aa94a2653367e4a7cbe47Ted Kremenek 40e77f443dbca8cdc23e5aa94a2653367e4a7cbe47Ted Kremenek DISALLOW_COPY_AND_ASSIGN(Delegate); 41e77f443dbca8cdc23e5aa94a2653367e4a7cbe47Ted Kremenek}; 42e77f443dbca8cdc23e5aa94a2653367e4a7cbe47Ted Kremenek 43387475d0c18aaeb022108de9d33b6c9fb7998843Sean Huntvoid PowerSaveBlockerImpl::Delegate::ApplyBlock() { 44387475d0c18aaeb022108de9d33b6c9fb7998843Sean Hunt DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); 45387475d0c18aaeb022108de9d33b6c9fb7998843Sean Hunt JNIEnv* env = AttachCurrentThread(); 466639e9255489ad8e10278d5658fdd4b3c0e1e4cdArgyrios Kyrtzidis ScopedJavaLocalRef<jobject> j_object = j_view_android_.get(env); 476639e9255489ad8e10278d5658fdd4b3c0e1e4cdArgyrios Kyrtzidis if (j_object.obj()) 485f1c822def3efffe1d8f7299fbbbc3b1cdd4833dErik Verbruggen Java_PowerSaveBlocker_applyBlock(env, j_object.obj()); 4984b796492de8a708150dd3f86ae191041d42eef9Argyrios Kyrtzidis} 50e77f443dbca8cdc23e5aa94a2653367e4a7cbe47Ted Kremenek 51e77f443dbca8cdc23e5aa94a2653367e4a7cbe47Ted Kremenekvoid PowerSaveBlockerImpl::Delegate::RemoveBlock() { 52e77f443dbca8cdc23e5aa94a2653367e4a7cbe47Ted Kremenek DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); 53e77f443dbca8cdc23e5aa94a2653367e4a7cbe47Ted Kremenek JNIEnv* env = AttachCurrentThread(); 54e77f443dbca8cdc23e5aa94a2653367e4a7cbe47Ted Kremenek ScopedJavaLocalRef<jobject> j_object = j_view_android_.get(env); 55a60ed47da13393796d8552b9fdca12abbb3eea42Ted Kremenek if (j_object.obj()) 56a60ed47da13393796d8552b9fdca12abbb3eea42Ted Kremenek Java_PowerSaveBlocker_removeBlock(env, j_object.obj()); 57e77f443dbca8cdc23e5aa94a2653367e4a7cbe47Ted Kremenek} 58aed123ec3cc37e457fe20a6158fdadf8849ad916Argyrios Kyrtzidis 59e77f443dbca8cdc23e5aa94a2653367e4a7cbe47Ted KremenekPowerSaveBlockerImpl::PowerSaveBlockerImpl(PowerSaveBlockerType type, 60e77f443dbca8cdc23e5aa94a2653367e4a7cbe47Ted Kremenek const std::string& reason) { 61e77f443dbca8cdc23e5aa94a2653367e4a7cbe47Ted Kremenek // Don't support kPowerSaveBlockPreventAppSuspension 62a60ed47da13393796d8552b9fdca12abbb3eea42Ted Kremenek} 63aed123ec3cc37e457fe20a6158fdadf8849ad916Argyrios Kyrtzidis 64007a7c9d8dcdb2e9cd94b6075108bfc4c90e6ccdTed KremenekPowerSaveBlockerImpl::~PowerSaveBlockerImpl() { 6554d67caeee4fdce81f07163832f1163d5f2af5d2Daniel Dunbar if (delegate_) { 66aed123ec3cc37e457fe20a6158fdadf8849ad916Argyrios Kyrtzidis BrowserThread::PostTask( 67aed123ec3cc37e457fe20a6158fdadf8849ad916Argyrios Kyrtzidis BrowserThread::UI, FROM_HERE, 68aed123ec3cc37e457fe20a6158fdadf8849ad916Argyrios Kyrtzidis base::Bind(&Delegate::RemoveBlock, delegate_)); 69aed123ec3cc37e457fe20a6158fdadf8849ad916Argyrios Kyrtzidis } 70aed123ec3cc37e457fe20a6158fdadf8849ad916Argyrios Kyrtzidis} 71aed123ec3cc37e457fe20a6158fdadf8849ad916Argyrios Kyrtzidis 72aed123ec3cc37e457fe20a6158fdadf8849ad916Argyrios Kyrtzidisvoid PowerSaveBlockerImpl::InitDisplaySleepBlocker(NativeView view_android) { 73aed123ec3cc37e457fe20a6158fdadf8849ad916Argyrios Kyrtzidis if (!view_android) 74aed123ec3cc37e457fe20a6158fdadf8849ad916Argyrios Kyrtzidis return; 75aed123ec3cc37e457fe20a6158fdadf8849ad916Argyrios Kyrtzidis 76aed123ec3cc37e457fe20a6158fdadf8849ad916Argyrios Kyrtzidis delegate_ = new Delegate(view_android); 77aed123ec3cc37e457fe20a6158fdadf8849ad916Argyrios Kyrtzidis // This may be called on any thread. 78aed123ec3cc37e457fe20a6158fdadf8849ad916Argyrios Kyrtzidis BrowserThread::PostTask( 79aed123ec3cc37e457fe20a6158fdadf8849ad916Argyrios Kyrtzidis BrowserThread::UI, FROM_HERE, 80aed123ec3cc37e457fe20a6158fdadf8849ad916Argyrios Kyrtzidis base::Bind(&Delegate::ApplyBlock, delegate_)); 81aed123ec3cc37e457fe20a6158fdadf8849ad916Argyrios Kyrtzidis} 82aed123ec3cc37e457fe20a6158fdadf8849ad916Argyrios Kyrtzidis 83aed123ec3cc37e457fe20a6158fdadf8849ad916Argyrios Kyrtzidisbool RegisterPowerSaveBlocker(JNIEnv* env) { 84aed123ec3cc37e457fe20a6158fdadf8849ad916Argyrios Kyrtzidis return RegisterNativesImpl(env); 85aed123ec3cc37e457fe20a6158fdadf8849ad916Argyrios Kyrtzidis} 86aed123ec3cc37e457fe20a6158fdadf8849ad916Argyrios Kyrtzidis 87aed123ec3cc37e457fe20a6158fdadf8849ad916Argyrios Kyrtzidis} // namespace content 885bfb8c128c2ac8eb4032afc180cdc400a0f953caDouglas Gregor