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