Rewrite the Android implementation of BatteryMonitor directly in Java.
This patch introduces a standalone Android implementation of the BatteryMonitor service. New implementation is written in Java without any JNI code, and is made available in the render process host using the Java ServiceRegistry. BUG=420623 Review URL: https://codereview.chromium.org/641703002 Cr-Commit-Position: refs/heads/master@{#309029}
This commit is contained in:
android_webview
content
app
android
browser
android
mojo
mojo_application_host.hservice_registrar_android.ccservice_registrar_android.hservice_registry_android.h
renderer_host
public
android
shell
device/battery
BUILD.gn
android
BUILD.gnbattery_jni_registrar.ccbattery_jni_registrar.h
battery.gypbattery_status_manager_android.ccbattery_status_manager_android.hjava
src
org
chromium
javatests
src
org
chromium
device
@ -19,6 +19,7 @@ LOCAL_SRC_FILES += \
|
||||
../net/android/java/src/org/chromium/net/IRemoteAndroidKeyStoreCallbacks.aidl \
|
||||
../net/android/java/src/org/chromium/net/IRemoteAndroidKeyStore.aidl \
|
||||
$(call all-java-files-under, ../base/android/java/src) \
|
||||
$(call all-java-files-under, ../device/battery/android/java/src) \
|
||||
$(call all-java-files-under, ../media/base/android/java/src) \
|
||||
$(call all-java-files-under, ../mojo/android/system/src) \
|
||||
$(call all-java-files-under, ../mojo/public/java/bindings/src) \
|
||||
@ -71,6 +72,11 @@ $(call intermediates-dir-for,GYP,shared)/enums/text_input_type_java/org/chromium
|
||||
$(call intermediates-dir-for,GYP,shared)/enums/touch_device_types_java/org/chromium/ui/base/HoverType.java \
|
||||
$(call intermediates-dir-for,GYP,shared)/enums/touch_device_types_java/org/chromium/ui/base/PointerType.java \
|
||||
$(call intermediates-dir-for,GYP,shared)/templates/net_errors_java/org/chromium/net/NetError.java \
|
||||
$(call intermediates-dir-for,GYP,shared)/java_mojo/device_battery_mojo_bindings/src/org/chromium/mojom/device/BatteryMonitor.java \
|
||||
$(call intermediates-dir-for,GYP,shared)/java_mojo/device_battery_mojo_bindings/src/org/chromium/mojom/device/BatteryMonitor_Internal.java \
|
||||
$(call intermediates-dir-for,GYP,shared)/java_mojo/device_battery_mojo_bindings/src/org/chromium/mojom/device/BatteryStatus.java \
|
||||
$(call intermediates-dir-for,GYP,shared)/java_mojo/device_battery_mojo_bindings/src/org/chromium/mojom/device/BatteryStatusObserver.java \
|
||||
$(call intermediates-dir-for,GYP,shared)/java_mojo/device_battery_mojo_bindings/src/org/chromium/mojom/device/BatteryStatusObserver_Internal.java
|
||||
|
||||
# content dependencies on java components that are provided by the system on
|
||||
# android
|
||||
|
@ -9,10 +9,10 @@
|
||||
],
|
||||
'conditions': [
|
||||
[ 'android_webview_build==1', {
|
||||
# When building inside the android tree we also need to depend on all
|
||||
# the java sources generated from templates which will be needed by
|
||||
# android_webview_java in android_webview/java_library_common.mk.
|
||||
'dependencies': [
|
||||
# When building inside the android tree we also need to depend on all
|
||||
# the java sources generated from templates which will be needed by
|
||||
# android_webview_java in android_webview/java_library_common.mk.
|
||||
'../base/base.gyp:base_java_application_state',
|
||||
'../base/base.gyp:base_java_library_load_from_apk_status_codes',
|
||||
'../base/base.gyp:base_java_memory_pressure_level',
|
||||
@ -37,6 +37,8 @@
|
||||
'../ui/android/ui_android.gyp:window_open_disposition_java',
|
||||
'../ui/android/ui_android.gyp:text_input_type_java',
|
||||
'../ui/touch_selection/ui_touch_selection.gyp:selection_event_type_java',
|
||||
# We also need to depend on the Java bindings generated from the .mojom files.
|
||||
'../device/battery/battery.gyp:device_battery_mojo_bindings_for_webview',
|
||||
],
|
||||
# Enable feedback-directed optimisation for the library when building in
|
||||
# android.
|
||||
|
@ -22,7 +22,6 @@
|
||||
#include "content/common/content_constants_internal.h"
|
||||
#include "content/public/common/content_switches.h"
|
||||
#include "content/public/common/result_codes.h"
|
||||
#include "device/battery/android/battery_jni_registrar.h"
|
||||
#include "device/vibration/android/vibration_jni_registrar.h"
|
||||
#include "media/base/android/media_jni_registrar.h"
|
||||
#include "net/android/net_jni_registrar.h"
|
||||
@ -65,9 +64,6 @@ bool EnsureJniRegistered(JNIEnv* env) {
|
||||
if (!content::android::RegisterAppJni(env))
|
||||
return false;
|
||||
|
||||
if (!device::android::RegisterBatteryJni(env))
|
||||
return false;
|
||||
|
||||
if (!device::android::RegisterVibrationJni(env))
|
||||
return false;
|
||||
|
||||
|
@ -30,6 +30,7 @@
|
||||
#include "content/browser/geolocation/location_api_adapter_android.h"
|
||||
#include "content/browser/media/android/media_drm_credential_manager.h"
|
||||
#include "content/browser/media/android/media_resource_getter_impl.h"
|
||||
#include "content/browser/mojo/service_registrar_android.h"
|
||||
#include "content/browser/mojo/service_registry_android.h"
|
||||
#include "content/browser/power_save_blocker_android.h"
|
||||
#include "content/browser/renderer_host/ime_adapter_android.h"
|
||||
@ -84,6 +85,7 @@ base::android::RegistrationMethod kContentRegisteredMethods[] = {
|
||||
{"ScreenOrientationProvider",
|
||||
content::ScreenOrientationDelegateAndroid::Register},
|
||||
{"SensorManagerAndroid", content::SensorManagerAndroid::Register},
|
||||
{"ServiceRegistrarAndroid", content::ServiceRegistrarAndroid::Register},
|
||||
{"ServiceRegistryAndroid", content::ServiceRegistryAndroid::Register},
|
||||
{"SpeechRecognizerImplAndroid",
|
||||
content::SpeechRecognizerImplAndroid::RegisterSpeechRecognizer},
|
||||
|
@ -41,6 +41,12 @@ class CONTENT_EXPORT MojoApplicationHost {
|
||||
|
||||
ServiceRegistry* service_registry() { return &service_registry_; }
|
||||
|
||||
#if defined(OS_ANDROID)
|
||||
ServiceRegistryAndroid* service_registry_android() {
|
||||
return service_registry_android_.get();
|
||||
}
|
||||
#endif
|
||||
|
||||
private:
|
||||
mojo::embedder::ChannelInit channel_init_;
|
||||
mojo::embedder::ScopedPlatformHandle client_handle_;
|
||||
|
26
content/browser/mojo/service_registrar_android.cc
Normal file
26
content/browser/mojo/service_registrar_android.cc
Normal file
@ -0,0 +1,26 @@
|
||||
// Copyright 2014 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/mojo/service_registrar_android.h"
|
||||
|
||||
#include "base/android/jni_android.h"
|
||||
#include "content/browser/mojo/service_registry_android.h"
|
||||
#include "jni/ServiceRegistrar_jni.h"
|
||||
|
||||
namespace content {
|
||||
|
||||
// static
|
||||
bool ServiceRegistrarAndroid::Register(JNIEnv* env) {
|
||||
return RegisterNativesImpl(env);
|
||||
}
|
||||
|
||||
// static
|
||||
void ServiceRegistrarAndroid::RegisterProcessHostServices(
|
||||
ServiceRegistryAndroid* registry) {
|
||||
JNIEnv* env = base::android::AttachCurrentThread();
|
||||
Java_ServiceRegistrar_registerProcessHostServices(env,
|
||||
registry->GetObj().obj());
|
||||
}
|
||||
|
||||
} // namespace content
|
24
content/browser/mojo/service_registrar_android.h
Normal file
24
content/browser/mojo/service_registrar_android.h
Normal file
@ -0,0 +1,24 @@
|
||||
// Copyright 2014 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.
|
||||
|
||||
#ifndef CONTENT_BROWSER_MOJO_SERVICE_REGISTRAR_ANDROID_H_
|
||||
#define CONTENT_BROWSER_MOJO_SERVICE_REGISTRAR_ANDROID_H_
|
||||
|
||||
#include <jni.h>
|
||||
|
||||
namespace content {
|
||||
|
||||
class ServiceRegistryAndroid;
|
||||
|
||||
// Registrar for mojo services in Java exposed by the browser. This calls into
|
||||
// Java where the services are registered with the indicated registry.
|
||||
class ServiceRegistrarAndroid {
|
||||
public:
|
||||
static bool Register(JNIEnv* env);
|
||||
static void RegisterProcessHostServices(ServiceRegistryAndroid* registry);
|
||||
};
|
||||
|
||||
} // namespace content
|
||||
|
||||
#endif // CONTENT_BROWSER_MOJO_SERVICE_REGISTRAR_ANDROID_H_
|
@ -37,9 +37,7 @@ class CONTENT_EXPORT ServiceRegistryAndroid {
|
||||
jstring j_name,
|
||||
jint handle);
|
||||
|
||||
const base::android::ScopedJavaGlobalRef<jobject>& GetObjForTesting() {
|
||||
return obj_;
|
||||
}
|
||||
const base::android::ScopedJavaGlobalRef<jobject>& GetObj() { return obj_; }
|
||||
|
||||
private:
|
||||
ServiceRegistryImpl* service_registry_;
|
||||
|
@ -157,6 +157,7 @@
|
||||
#if defined(OS_ANDROID)
|
||||
#include "content/browser/android/child_process_launcher_android.h"
|
||||
#include "content/browser/media/android/browser_demuxer_android.h"
|
||||
#include "content/browser/mojo/service_registrar_android.h"
|
||||
#include "content/browser/screen_orientation/screen_orientation_message_filter_android.h"
|
||||
#endif
|
||||
|
||||
@ -904,6 +905,11 @@ void RenderProcessHostImpl::RegisterMojoServices() {
|
||||
base::Bind(&PermissionServiceContext::CreateService,
|
||||
base::Unretained(permission_service_context_.get())));
|
||||
|
||||
#if defined(OS_ANDROID)
|
||||
ServiceRegistrarAndroid::RegisterProcessHostServices(
|
||||
mojo_application_host_->service_registry_android());
|
||||
#endif
|
||||
|
||||
GetContentClient()->browser()->OverrideRenderProcessMojoServices(
|
||||
mojo_application_host_->service_registry());
|
||||
}
|
||||
|
@ -937,6 +937,8 @@
|
||||
'browser/mime_registry_message_filter.h',
|
||||
'browser/mojo/mojo_application_host.cc',
|
||||
'browser/mojo/mojo_application_host.h',
|
||||
'browser/mojo/service_registrar_android.cc',
|
||||
'browser/mojo/service_registrar_android.h',
|
||||
'browser/mojo/service_registry_android.cc',
|
||||
'browser/mojo/service_registry_android.h',
|
||||
'browser/navigator_connect/navigator_connect_dispatcher_host.cc',
|
||||
|
@ -31,6 +31,7 @@
|
||||
'public/android/java/src/org/chromium/content/browser/MediaDrmCredentialManager.java',
|
||||
'public/android/java/src/org/chromium/content/browser/MediaResourceGetter.java',
|
||||
'public/android/java/src/org/chromium/content/browser/PowerSaveBlocker.java',
|
||||
'public/android/java/src/org/chromium/content/browser/ServiceRegistrar.java',
|
||||
'public/android/java/src/org/chromium/content/browser/ServiceRegistry.java',
|
||||
'public/android/java/src/org/chromium/content/browser/ScreenOrientationProvider.java',
|
||||
'public/android/java/src/org/chromium/content/browser/SpeechRecognition.java',
|
||||
|
@ -1381,6 +1381,9 @@
|
||||
'sources': [
|
||||
'shell/android/browsertests_apk/content_browser_tests_android.cc',
|
||||
],
|
||||
'sources!': [
|
||||
'browser/battery_status/battery_monitor_impl_browsertest.cc',
|
||||
],
|
||||
'dependencies': [
|
||||
'content_shell_jni_headers',
|
||||
'content_shell_lib',
|
||||
|
@ -32,6 +32,8 @@ android_library("content_java") {
|
||||
deps = [
|
||||
":content_java_resources",
|
||||
"//base:base_java",
|
||||
"//device/battery/android:battery_monitor_android",
|
||||
"//device/battery:mojo_bindings_java",
|
||||
"//media/base/android:media_java",
|
||||
"//mojo/android:system_java",
|
||||
"//mojo/public/java:bindings",
|
||||
|
@ -5,6 +5,8 @@ include_rules = [
|
||||
"+content/public/test/android",
|
||||
# ContentShellActivity is needed for running ContentView.
|
||||
"+content/shell/android",
|
||||
# Needed for device APIs implemented as Mojo services in Java.
|
||||
"+device",
|
||||
# Mojo is needed for Mojo service registry kept in the browser.
|
||||
"+mojo/android",
|
||||
]
|
||||
|
@ -0,0 +1,34 @@
|
||||
// Copyright 2014 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.
|
||||
|
||||
package org.chromium.content.browser;
|
||||
|
||||
import org.chromium.base.CalledByNative;
|
||||
import org.chromium.base.JNINamespace;
|
||||
import org.chromium.content.browser.ServiceRegistry.ImplementationFactory;
|
||||
import org.chromium.device.battery.BatteryMonitorFactory;
|
||||
import org.chromium.mojom.device.BatteryMonitor;
|
||||
|
||||
/**
|
||||
* Registers mojo services exposed by the browser in the given registry.
|
||||
*/
|
||||
@JNINamespace("content")
|
||||
class ServiceRegistrar {
|
||||
// BatteryMonitorFactory can't implement ImplementationFactory itself, as we don't depend on
|
||||
// /content in /device. Hence we use BatteryMonitorImplementationFactory as a wrapper.
|
||||
private static class BatteryMonitorImplementationFactory
|
||||
implements ImplementationFactory<BatteryMonitor> {
|
||||
private final BatteryMonitorFactory mFactory = new BatteryMonitorFactory();
|
||||
|
||||
@Override
|
||||
public BatteryMonitor createImpl() {
|
||||
return mFactory.createMonitor();
|
||||
}
|
||||
}
|
||||
|
||||
@CalledByNative
|
||||
static void registerProcessHostServices(ServiceRegistry registry) {
|
||||
registry.addService(BatteryMonitor.MANAGER, new BatteryMonitorImplementationFactory());
|
||||
}
|
||||
}
|
@ -57,10 +57,8 @@ static jobject CreateServiceRegistryPair(JNIEnv* env,
|
||||
new ServiceRegistryAndroid(registry_b);
|
||||
test_environment->wrappers.push_back(wrapper_b);
|
||||
|
||||
return Java_ShellMojoTestUtils_makePair(env,
|
||||
wrapper_a->GetObjForTesting().obj(),
|
||||
wrapper_b->GetObjForTesting().obj())
|
||||
.Release();
|
||||
return Java_ShellMojoTestUtils_makePair(env, wrapper_a->GetObj().obj(),
|
||||
wrapper_b->GetObj().obj()).Release();
|
||||
}
|
||||
|
||||
static void RunLoop(JNIEnv* env, jclass jcaller, jlong timeout_ms) {
|
||||
|
@ -12,8 +12,6 @@ component("battery") {
|
||||
"battery_export.h",
|
||||
"battery_monitor_impl.cc",
|
||||
"battery_monitor_impl.h",
|
||||
"battery_status_manager_android.cc",
|
||||
"battery_status_manager_android.h",
|
||||
"battery_status_manager_chromeos.cc",
|
||||
"battery_status_manager_default.cc",
|
||||
"battery_status_manager_linux.cc",
|
||||
@ -36,15 +34,6 @@ component("battery") {
|
||||
"//mojo/edk/system",
|
||||
]
|
||||
|
||||
if (is_android) {
|
||||
deps += [ "//device/battery/android:battery_jni_headers" ]
|
||||
sources += [
|
||||
"android/battery_jni_registrar.h",
|
||||
"android/battery_jni_registrar.cc",
|
||||
]
|
||||
sources -= [ "battery_status_manager_default.cc" ]
|
||||
}
|
||||
|
||||
if (is_chromeos) {
|
||||
configs += [ "//build/config/linux:dbus" ]
|
||||
deps += [ "//chromeos:power_manager_proto" ]
|
||||
|
@ -5,9 +5,17 @@
|
||||
import("//build/config/android/config.gni")
|
||||
import("//build/config/android/rules.gni")
|
||||
|
||||
generate_jni("battery_jni_headers") {
|
||||
jni_package = "battery"
|
||||
sources = [
|
||||
android_library("battery_monitor_android") {
|
||||
java_files = [
|
||||
"java/src/org/chromium/device/battery/BatteryStatusManager.java",
|
||||
"java/src/org/chromium/device/battery/BatteryMonitorImpl.java",
|
||||
"java/src/org/chromium/device/battery/BatteryMonitorFactory.java",
|
||||
]
|
||||
|
||||
deps = [
|
||||
"//base:base_java",
|
||||
"//device/battery:mojo_bindings_java",
|
||||
"//mojo/public/java:bindings",
|
||||
"//mojo/public/java:system",
|
||||
]
|
||||
}
|
||||
|
@ -1,27 +0,0 @@
|
||||
// Copyright 2014 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 "device/battery/android/battery_jni_registrar.h"
|
||||
|
||||
#include "base/android/jni_android.h"
|
||||
#include "base/android/jni_registrar.h"
|
||||
#include "device/battery/battery_status_manager_android.h"
|
||||
|
||||
namespace device {
|
||||
namespace android {
|
||||
namespace {
|
||||
|
||||
base::android::RegistrationMethod kRegisteredMethods[] = {
|
||||
{ "BatteryStatusManager", BatteryStatusManagerAndroid::Register },
|
||||
};
|
||||
|
||||
} // namespace
|
||||
|
||||
bool RegisterBatteryJni(JNIEnv* env) {
|
||||
return RegisterNativeMethods(
|
||||
env, kRegisteredMethods, arraysize(kRegisteredMethods));
|
||||
}
|
||||
|
||||
} // namespace android
|
||||
} // namespace device
|
@ -1,20 +0,0 @@
|
||||
// Copyright 2014 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.
|
||||
|
||||
#ifndef DEVICE_BATTERY_ANDROID_BATTERY_JNI_REGISTRAR_H_
|
||||
#define DEVICE_BATTERY_ANDROID_BATTERY_JNI_REGISTRAR_H_
|
||||
|
||||
#include <jni.h>
|
||||
|
||||
#include "device/battery/battery_export.h"
|
||||
|
||||
namespace device {
|
||||
namespace android {
|
||||
|
||||
DEVICE_BATTERY_EXPORT bool RegisterBatteryJni(JNIEnv* env);
|
||||
|
||||
} // namespace android
|
||||
} // namespace device
|
||||
|
||||
#endif // DEVICE_BATTERY_ANDROID_BATTERY_JNI_REGISTRAR_H_
|
71
device/battery/android/java/src/org/chromium/device/battery/BatteryMonitorFactory.java
Normal file
71
device/battery/android/java/src/org/chromium/device/battery/BatteryMonitorFactory.java
Normal file
@ -0,0 +1,71 @@
|
||||
// Copyright 2014 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.
|
||||
|
||||
package org.chromium.device.battery;
|
||||
|
||||
import android.content.Context;
|
||||
import android.util.Log;
|
||||
|
||||
import org.chromium.base.ApplicationStatus;
|
||||
import org.chromium.base.ThreadUtils;
|
||||
import org.chromium.device.battery.BatteryStatusManager.BatteryStatusCallback;
|
||||
import org.chromium.mojom.device.BatteryMonitor;
|
||||
import org.chromium.mojom.device.BatteryStatus;
|
||||
|
||||
import java.util.HashSet;
|
||||
|
||||
/**
|
||||
* Factory that creates instances of BatteryMonitor implementations and notifies them about battery
|
||||
* status changes.
|
||||
*/
|
||||
public class BatteryMonitorFactory {
|
||||
static final String TAG = "BatteryMonitorFactory";
|
||||
|
||||
// Backing source of battery information.
|
||||
private final BatteryStatusManager mManager;
|
||||
// Monitors currently interested in the battery status notifications.
|
||||
private final HashSet<BatteryMonitorImpl> mSubscribedMonitors =
|
||||
new HashSet<BatteryMonitorImpl>();
|
||||
|
||||
private final BatteryStatusCallback mCallback = new BatteryStatusCallback() {
|
||||
@Override
|
||||
public void onBatteryStatusChanged(BatteryStatus batteryStatus) {
|
||||
ThreadUtils.assertOnUiThread();
|
||||
|
||||
for (BatteryMonitorImpl monitor : mSubscribedMonitors) {
|
||||
monitor.didChange(batteryStatus);
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
public BatteryMonitorFactory() {
|
||||
Context applicationContext = ApplicationStatus.getApplicationContext();
|
||||
assert applicationContext != null;
|
||||
mManager = new BatteryStatusManager(applicationContext, mCallback);
|
||||
}
|
||||
|
||||
public BatteryMonitor createMonitor() {
|
||||
ThreadUtils.assertOnUiThread();
|
||||
|
||||
if (mSubscribedMonitors.isEmpty() && !mManager.start()) {
|
||||
Log.e(TAG, "BatteryStatusManager failed to start.");
|
||||
}
|
||||
// TODO(ppi): record the "BatteryStatus.StartAndroid" histogram here once we have a Java API
|
||||
// for UMA - http://crbug.com/442300.
|
||||
|
||||
BatteryMonitorImpl monitor = new BatteryMonitorImpl(this);
|
||||
mSubscribedMonitors.add(monitor);
|
||||
return monitor;
|
||||
}
|
||||
|
||||
void unsubscribe(BatteryMonitorImpl monitor) {
|
||||
ThreadUtils.assertOnUiThread();
|
||||
|
||||
assert mSubscribedMonitors.contains(monitor);
|
||||
mSubscribedMonitors.remove(monitor);
|
||||
if (mSubscribedMonitors.isEmpty()) {
|
||||
mManager.stop();
|
||||
}
|
||||
}
|
||||
}
|
@ -0,0 +1,58 @@
|
||||
// Copyright 2014 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.
|
||||
|
||||
package org.chromium.device.battery;
|
||||
|
||||
import org.chromium.mojo.system.MojoException;
|
||||
import org.chromium.mojom.device.BatteryMonitor;
|
||||
import org.chromium.mojom.device.BatteryStatus;
|
||||
import org.chromium.mojom.device.BatteryStatusObserver;
|
||||
|
||||
/**
|
||||
* Android implementation of the battery monitor service defined in
|
||||
* device/battery/battery_monitor.mojom.
|
||||
*/
|
||||
public class BatteryMonitorImpl implements BatteryMonitor {
|
||||
// Factory that created this instance and notifies it about battery status changes.
|
||||
private final BatteryMonitorFactory mFactory;
|
||||
private boolean mSubscribed;
|
||||
|
||||
private BatteryStatusObserver mClient;
|
||||
|
||||
public BatteryMonitorImpl(BatteryMonitorFactory batteryMonitorFactory) {
|
||||
mFactory = batteryMonitorFactory;
|
||||
mSubscribed = true;
|
||||
}
|
||||
|
||||
private void unsubscribe() {
|
||||
if (mSubscribed) {
|
||||
mFactory.unsubscribe(this);
|
||||
mSubscribed = false;
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void setClient(BatteryStatusObserver client) {
|
||||
mClient = client;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void close() {
|
||||
unsubscribe();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onConnectionError(MojoException e) {
|
||||
unsubscribe();
|
||||
}
|
||||
|
||||
/**
|
||||
* Notifies the client passing the given battery status information.
|
||||
*/
|
||||
void didChange(BatteryStatus batteryStatus) {
|
||||
if (mClient != null) {
|
||||
mClient.didChange(batteryStatus);
|
||||
}
|
||||
};
|
||||
}
|
@ -12,20 +12,25 @@ import android.os.BatteryManager;
|
||||
import android.os.Build;
|
||||
import android.util.Log;
|
||||
|
||||
import org.chromium.base.CalledByNative;
|
||||
import org.chromium.base.JNINamespace;
|
||||
import org.chromium.base.VisibleForTesting;
|
||||
import org.chromium.mojom.device.BatteryStatus;
|
||||
|
||||
/**
|
||||
* Android implementation of the battery status APIs.
|
||||
* Data source for battery status information. This class registers for battery status notifications
|
||||
* from the system and calls the callback passed on construction whenever a notification is
|
||||
* received.
|
||||
*/
|
||||
@JNINamespace("device")
|
||||
class BatteryStatusManager {
|
||||
|
||||
private static final String TAG = "BatteryStatusManager";
|
||||
|
||||
interface BatteryStatusCallback {
|
||||
void onBatteryStatusChanged(BatteryStatus batteryStatus);
|
||||
}
|
||||
|
||||
// A reference to the application context in order to acquire the SensorService.
|
||||
private final Context mAppContext;
|
||||
private final BatteryStatusCallback mCallback;
|
||||
private final IntentFilter mFilter = new IntentFilter(Intent.ACTION_BATTERY_CHANGED);
|
||||
private final BroadcastReceiver mReceiver = new BroadcastReceiver() {
|
||||
@Override
|
||||
@ -34,50 +39,52 @@ class BatteryStatusManager {
|
||||
}
|
||||
};
|
||||
|
||||
// Non-zero if and only if we're listening for events.
|
||||
// To avoid race conditions on the C++ side, access must be synchronized.
|
||||
private long mNativePtr;
|
||||
// The lock to access the mNativePtr.
|
||||
private final Object mNativePtrLock = new Object();
|
||||
// This is to workaround a Galaxy Nexus bug, see the comment in the constructor.
|
||||
private final boolean mIgnoreBatteryPresentState;
|
||||
|
||||
private boolean mEnabled = false;
|
||||
|
||||
protected BatteryStatusManager(Context context) {
|
||||
private BatteryStatusManager(
|
||||
Context context, BatteryStatusCallback callback, boolean ignoreBatteryPresentState) {
|
||||
mAppContext = context.getApplicationContext();
|
||||
mCallback = callback;
|
||||
mIgnoreBatteryPresentState = ignoreBatteryPresentState;
|
||||
}
|
||||
|
||||
@CalledByNative
|
||||
static BatteryStatusManager getInstance(Context appContext) {
|
||||
return new BatteryStatusManager(appContext);
|
||||
BatteryStatusManager(Context context, BatteryStatusCallback callback) {
|
||||
// BatteryManager.EXTRA_PRESENT appears to be unreliable on Galaxy Nexus,
|
||||
// Android 4.2.1, it always reports false. See http://crbug.com/384348.
|
||||
this(context, callback, Build.MODEL.equals("Galaxy Nexus"));
|
||||
}
|
||||
|
||||
/**
|
||||
* Start listening for intents
|
||||
* Creates a BatteryStatusManager without the Galaxy Nexus workaround for consistency in
|
||||
* testing.
|
||||
*/
|
||||
static BatteryStatusManager createBatteryStatusManagerForTesting(
|
||||
Context context, BatteryStatusCallback callback) {
|
||||
return new BatteryStatusManager(context, callback, false);
|
||||
}
|
||||
|
||||
/**
|
||||
* Starts listening for intents.
|
||||
* @return True on success.
|
||||
*/
|
||||
@CalledByNative
|
||||
boolean start(long nativePtr) {
|
||||
synchronized (mNativePtrLock) {
|
||||
if (!mEnabled && mAppContext.registerReceiver(mReceiver, mFilter) != null) {
|
||||
// success
|
||||
mNativePtr = nativePtr;
|
||||
mEnabled = true;
|
||||
}
|
||||
boolean start() {
|
||||
if (!mEnabled && mAppContext.registerReceiver(mReceiver, mFilter) != null) {
|
||||
// success
|
||||
mEnabled = true;
|
||||
}
|
||||
return mEnabled;
|
||||
}
|
||||
|
||||
/**
|
||||
* Stop listening to intents.
|
||||
* Stops listening to intents.
|
||||
*/
|
||||
@CalledByNative
|
||||
void stop() {
|
||||
synchronized (mNativePtrLock) {
|
||||
if (mEnabled) {
|
||||
mAppContext.unregisterReceiver(mReceiver);
|
||||
mNativePtr = 0;
|
||||
mEnabled = false;
|
||||
}
|
||||
if (mEnabled) {
|
||||
mAppContext.unregisterReceiver(mReceiver);
|
||||
mEnabled = false;
|
||||
}
|
||||
}
|
||||
|
||||
@ -88,20 +95,17 @@ class BatteryStatusManager {
|
||||
return;
|
||||
}
|
||||
|
||||
boolean present = ignoreBatteryPresentState()
|
||||
? true : intent.getBooleanExtra(BatteryManager.EXTRA_PRESENT, false);
|
||||
boolean present = mIgnoreBatteryPresentState
|
||||
? true
|
||||
: intent.getBooleanExtra(BatteryManager.EXTRA_PRESENT, false);
|
||||
int pluggedStatus = intent.getIntExtra(BatteryManager.EXTRA_PLUGGED, -1);
|
||||
|
||||
if (!present || pluggedStatus == -1) {
|
||||
// No battery or no plugged status: return default values.
|
||||
gotBatteryStatus(true, 0, Double.POSITIVE_INFINITY, 1);
|
||||
mCallback.onBatteryStatusChanged(new BatteryStatus());
|
||||
return;
|
||||
}
|
||||
|
||||
boolean charging = pluggedStatus != 0;
|
||||
int status = intent.getIntExtra(BatteryManager.EXTRA_STATUS, -1);
|
||||
boolean batteryFull = status == BatteryManager.BATTERY_STATUS_FULL;
|
||||
|
||||
int current = intent.getIntExtra(BatteryManager.EXTRA_LEVEL, -1);
|
||||
int max = intent.getIntExtra(BatteryManager.EXTRA_SCALE, -1);
|
||||
double level = (double) current / (double) max;
|
||||
@ -114,35 +118,17 @@ class BatteryStatusManager {
|
||||
// we could compute it manually based on level delta.
|
||||
// TODO(timvolodine): add proper projection for chargingTime, dischargingTime
|
||||
// (see crbug.com/401553).
|
||||
boolean charging = pluggedStatus != 0;
|
||||
int status = intent.getIntExtra(BatteryManager.EXTRA_STATUS, -1);
|
||||
boolean batteryFull = status == BatteryManager.BATTERY_STATUS_FULL;
|
||||
double chargingTime = (charging & batteryFull) ? 0 : Double.POSITIVE_INFINITY;
|
||||
double dischargingTime = Double.POSITIVE_INFINITY;
|
||||
|
||||
gotBatteryStatus(charging, chargingTime, dischargingTime, level);
|
||||
BatteryStatus batteryStatus = new BatteryStatus();
|
||||
batteryStatus.charging = charging;
|
||||
batteryStatus.chargingTime = chargingTime;
|
||||
batteryStatus.dischargingTime = dischargingTime;
|
||||
batteryStatus.level = level;
|
||||
mCallback.onBatteryStatusChanged(batteryStatus);
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns whether the BatteryStatusManager should ignore the battery present state.
|
||||
* It is required for some devices that incorrectly set the EXTRA_PRESENT property.
|
||||
*/
|
||||
protected boolean ignoreBatteryPresentState() {
|
||||
// BatteryManager.EXTRA_PRESENT appears to be unreliable on Galaxy Nexus,
|
||||
// Android 4.2.1, it always reports false. See crbug.com/384348.
|
||||
return Build.MODEL.equals("Galaxy Nexus");
|
||||
}
|
||||
|
||||
protected void gotBatteryStatus(boolean charging, double chargingTime,
|
||||
double dischargingTime, double level) {
|
||||
synchronized (mNativePtrLock) {
|
||||
if (mNativePtr != 0) {
|
||||
nativeGotBatteryStatus(mNativePtr, charging, chargingTime, dischargingTime, level);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Native JNI call
|
||||
* see device/battery/battery_status_manager_android.cc
|
||||
*/
|
||||
private native void nativeGotBatteryStatus(long nativeBatteryStatusManagerAndroid,
|
||||
boolean charging, double chargingTime, double dischargingTime, double level);
|
||||
}
|
||||
|
@ -4,25 +4,49 @@
|
||||
|
||||
package org.chromium.device.battery;
|
||||
|
||||
import android.content.Context;
|
||||
import android.content.Intent;
|
||||
|
||||
import android.os.BatteryManager;
|
||||
|
||||
import android.test.AndroidTestCase;
|
||||
import android.test.suitebuilder.annotation.SmallTest;
|
||||
|
||||
import org.chromium.mojom.device.BatteryStatus;
|
||||
|
||||
/**
|
||||
* Test suite for BatteryStatusManager.
|
||||
*/
|
||||
public class BatteryStatusManagerTest extends AndroidTestCase {
|
||||
// Values reported in the most recent callback from |mManager|.
|
||||
private boolean mCharging = false;
|
||||
private double mChargingTime = 0;
|
||||
private double mDischargingTime = 0;
|
||||
private double mLevel = 0;
|
||||
|
||||
private BatteryStatusManagerForTests mBatteryStatusManager;
|
||||
private BatteryStatusManager.BatteryStatusCallback mCallback =
|
||||
new BatteryStatusManager.BatteryStatusCallback() {
|
||||
@Override
|
||||
public void onBatteryStatusChanged(BatteryStatus batteryStatus) {
|
||||
mCharging = batteryStatus.charging;
|
||||
mChargingTime = batteryStatus.chargingTime;
|
||||
mDischargingTime = batteryStatus.dischargingTime;
|
||||
mLevel = batteryStatus.level;
|
||||
}
|
||||
};
|
||||
|
||||
private BatteryStatusManager mManager;
|
||||
|
||||
private void verifyValues(
|
||||
boolean charging, double chargingTime, double dischargingTime, double level) {
|
||||
assertEquals(charging, mCharging);
|
||||
assertEquals(chargingTime, mChargingTime);
|
||||
assertEquals(dischargingTime, mDischargingTime);
|
||||
assertEquals(level, mLevel);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void setUp() throws Exception {
|
||||
protected void setUp() throws Exception {
|
||||
super.setUp();
|
||||
mBatteryStatusManager = BatteryStatusManagerForTests.getInstance(getContext());
|
||||
mManager =
|
||||
BatteryStatusManager.createBatteryStatusManagerForTesting(getContext(), mCallback);
|
||||
}
|
||||
|
||||
@SmallTest
|
||||
@ -34,11 +58,8 @@ public class BatteryStatusManagerTest extends AndroidTestCase {
|
||||
intent.putExtra(BatteryManager.EXTRA_SCALE, 100);
|
||||
intent.putExtra(BatteryManager.EXTRA_STATUS, BatteryManager.BATTERY_STATUS_NOT_CHARGING);
|
||||
|
||||
mBatteryStatusManager.onReceive(intent);
|
||||
|
||||
mBatteryStatusManager.verifyCalls("gotBatteryStatus");
|
||||
mBatteryStatusManager.verifyValues(false, Double.POSITIVE_INFINITY,
|
||||
Double.POSITIVE_INFINITY, 0.1);
|
||||
mManager.onReceive(intent);
|
||||
verifyValues(false, Double.POSITIVE_INFINITY, Double.POSITIVE_INFINITY, 0.1);
|
||||
}
|
||||
|
||||
@SmallTest
|
||||
@ -50,11 +71,8 @@ public class BatteryStatusManagerTest extends AndroidTestCase {
|
||||
intent.putExtra(BatteryManager.EXTRA_SCALE, 100);
|
||||
intent.putExtra(BatteryManager.EXTRA_STATUS, BatteryManager.BATTERY_STATUS_CHARGING);
|
||||
|
||||
mBatteryStatusManager.onReceive(intent);
|
||||
|
||||
mBatteryStatusManager.verifyCalls("gotBatteryStatus");
|
||||
mBatteryStatusManager.verifyValues(true, Double.POSITIVE_INFINITY,
|
||||
Double.POSITIVE_INFINITY, 0.5);
|
||||
mManager.onReceive(intent);
|
||||
verifyValues(true, Double.POSITIVE_INFINITY, Double.POSITIVE_INFINITY, 0.5);
|
||||
}
|
||||
|
||||
@SmallTest
|
||||
@ -66,11 +84,8 @@ public class BatteryStatusManagerTest extends AndroidTestCase {
|
||||
intent.putExtra(BatteryManager.EXTRA_SCALE, 100);
|
||||
intent.putExtra(BatteryManager.EXTRA_STATUS, BatteryManager.BATTERY_STATUS_NOT_CHARGING);
|
||||
|
||||
mBatteryStatusManager.onReceive(intent);
|
||||
|
||||
mBatteryStatusManager.verifyCalls("gotBatteryStatus");
|
||||
mBatteryStatusManager.verifyValues(true, Double.POSITIVE_INFINITY,
|
||||
Double.POSITIVE_INFINITY, 0.5);
|
||||
mManager.onReceive(intent);
|
||||
verifyValues(true, Double.POSITIVE_INFINITY, Double.POSITIVE_INFINITY, 0.5);
|
||||
}
|
||||
|
||||
@SmallTest
|
||||
@ -82,10 +97,8 @@ public class BatteryStatusManagerTest extends AndroidTestCase {
|
||||
intent.putExtra(BatteryManager.EXTRA_SCALE, 100);
|
||||
intent.putExtra(BatteryManager.EXTRA_STATUS, BatteryManager.BATTERY_STATUS_FULL);
|
||||
|
||||
mBatteryStatusManager.onReceive(intent);
|
||||
|
||||
mBatteryStatusManager.verifyCalls("gotBatteryStatus");
|
||||
mBatteryStatusManager.verifyValues(true, 0, Double.POSITIVE_INFINITY, 1);
|
||||
mManager.onReceive(intent);
|
||||
verifyValues(true, 0, Double.POSITIVE_INFINITY, 1);
|
||||
}
|
||||
|
||||
@SmallTest
|
||||
@ -94,10 +107,8 @@ public class BatteryStatusManagerTest extends AndroidTestCase {
|
||||
intent.putExtra(BatteryManager.EXTRA_PRESENT, false);
|
||||
intent.putExtra(BatteryManager.EXTRA_PLUGGED, BatteryManager.BATTERY_PLUGGED_USB);
|
||||
|
||||
mBatteryStatusManager.onReceive(intent);
|
||||
|
||||
mBatteryStatusManager.verifyCalls("gotBatteryStatus");
|
||||
mBatteryStatusManager.verifyValues(true, 0, Double.POSITIVE_INFINITY, 1);
|
||||
mManager.onReceive(intent);
|
||||
verifyValues(true, 0, Double.POSITIVE_INFINITY, 1);
|
||||
}
|
||||
|
||||
@SmallTest
|
||||
@ -105,62 +116,13 @@ public class BatteryStatusManagerTest extends AndroidTestCase {
|
||||
Intent intent = new Intent(Intent.ACTION_BATTERY_CHANGED);
|
||||
intent.putExtra(BatteryManager.EXTRA_PRESENT, true);
|
||||
|
||||
mBatteryStatusManager.onReceive(intent);
|
||||
|
||||
mBatteryStatusManager.verifyCalls("gotBatteryStatus");
|
||||
mBatteryStatusManager.verifyValues(true, 0, Double.POSITIVE_INFINITY, 1);
|
||||
mManager.onReceive(intent);
|
||||
verifyValues(true, 0, Double.POSITIVE_INFINITY, 1);
|
||||
}
|
||||
|
||||
@SmallTest
|
||||
public void testStartStopSucceeds() {
|
||||
assertTrue(mBatteryStatusManager.start(0));
|
||||
mBatteryStatusManager.stop();
|
||||
assertTrue(mManager.start());
|
||||
mManager.stop();
|
||||
}
|
||||
|
||||
// Helper class for testing.
|
||||
|
||||
private static class BatteryStatusManagerForTests extends BatteryStatusManager {
|
||||
|
||||
private boolean mCharging = false;
|
||||
private double mChargingTime = 0;
|
||||
private double mDischargingTime = 0;
|
||||
private double mLevel = 0;
|
||||
private String mCalls = "";
|
||||
|
||||
private BatteryStatusManagerForTests(Context context) {
|
||||
super(context);
|
||||
}
|
||||
|
||||
static BatteryStatusManagerForTests getInstance(Context context) {
|
||||
return new BatteryStatusManagerForTests(context);
|
||||
}
|
||||
|
||||
private void verifyValues(boolean charging, double chargingTime,
|
||||
double dischargingTime, double level) {
|
||||
assertEquals(charging, mCharging);
|
||||
assertEquals(chargingTime, mChargingTime);
|
||||
assertEquals(dischargingTime, mDischargingTime);
|
||||
assertEquals(level, mLevel);
|
||||
}
|
||||
|
||||
private void verifyCalls(String names) {
|
||||
assertEquals(mCalls, names);
|
||||
}
|
||||
|
||||
@Override
|
||||
protected boolean ignoreBatteryPresentState() {
|
||||
return false;
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void gotBatteryStatus(boolean charging, double chargingTime,
|
||||
double dischargingTime, double level) {
|
||||
mCharging = charging;
|
||||
mChargingTime = chargingTime;
|
||||
mDischargingTime = dischargingTime;
|
||||
mLevel = level;
|
||||
mCalls = mCalls.concat("gotBatteryStatus");
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
@ -19,6 +19,35 @@
|
||||
'battery_status.mojom',
|
||||
],
|
||||
},
|
||||
{
|
||||
# This is needed only for a build within Android tree. TODO(ppi): remove
|
||||
# when Android tree build is deprecated.
|
||||
'target_name': 'device_battery_mojo_bindings_for_webview',
|
||||
'type': 'none',
|
||||
'dependencies': [
|
||||
'device_battery_mojo_bindings',
|
||||
],
|
||||
'actions': [
|
||||
{
|
||||
# Dummy action that triggers the bindings generation and explicitly
|
||||
# declares the java outputs, so that they are discoverable to make.
|
||||
'action_name': 'device_battery_mojo_bindings_dummy_action',
|
||||
'inputs': [
|
||||
'<(SHARED_INTERMEDIATE_DIR)/device/battery/battery_monitor.mojom.h',
|
||||
'<(SHARED_INTERMEDIATE_DIR)/device/battery/battery_status.mojom.h',
|
||||
],
|
||||
'outputs': [
|
||||
'<(SHARED_INTERMEDIATE_DIR)/java_mojo/device_battery_mojo_bindings/src/org/chromium/mojom/device/BatteryMonitor.java',
|
||||
'<(SHARED_INTERMEDIATE_DIR)/java_mojo/device_battery_mojo_bindings/src/org/chromium/mojom/device/BatteryMonitor_Internal.java',
|
||||
'<(SHARED_INTERMEDIATE_DIR)/java_mojo/device_battery_mojo_bindings/src/org/chromium/mojom/device/BatteryStatusObserver.java',
|
||||
'<(SHARED_INTERMEDIATE_DIR)/java_mojo/device_battery_mojo_bindings/src/org/chromium/mojom/device/BatteryStatusObserver_Internal.java',
|
||||
'<(SHARED_INTERMEDIATE_DIR)/java_mojo/device_battery_mojo_bindings/src/org/chromium/mojom/device/BatteryStatus.java',
|
||||
],
|
||||
'action': ['touch', '<@(_outputs)'],
|
||||
},
|
||||
],
|
||||
'hard_dependency': 1,
|
||||
},
|
||||
{
|
||||
# GN version: //device/battery
|
||||
'target_name': 'device_battery',
|
||||
@ -35,12 +64,8 @@
|
||||
'DEVICE_BATTERY_IMPLEMENTATION',
|
||||
],
|
||||
'sources': [
|
||||
'android/battery_jni_registrar.cc',
|
||||
'android/battery_jni_registrar.h',
|
||||
'battery_monitor_impl.cc',
|
||||
'battery_monitor_impl.h',
|
||||
'battery_status_manager_android.cc',
|
||||
'battery_status_manager_android.h',
|
||||
'battery_status_manager_chromeos.cc',
|
||||
'battery_status_manager_default.cc',
|
||||
'battery_status_manager_linux.cc',
|
||||
@ -53,14 +78,6 @@
|
||||
'battery_status_service.h',
|
||||
],
|
||||
'conditions': [
|
||||
['OS == "android"', {
|
||||
'dependencies': [
|
||||
'device_battery_jni_headers',
|
||||
],
|
||||
'sources!': [
|
||||
'battery_status_manager_default.cc',
|
||||
],
|
||||
}],
|
||||
['chromeos==1', {
|
||||
'dependencies': [
|
||||
'../../build/linux/system.gyp:dbus',
|
||||
@ -100,22 +117,13 @@
|
||||
'conditions': [
|
||||
['OS == "android"', {
|
||||
'targets': [
|
||||
{
|
||||
'target_name': 'device_battery_jni_headers',
|
||||
'type': 'none',
|
||||
'sources': [
|
||||
'android/java/src/org/chromium/device/battery/BatteryStatusManager.java',
|
||||
],
|
||||
'variables': {
|
||||
'jni_gen_package': 'device_battery',
|
||||
},
|
||||
'includes': [ '../../build/jni_generator.gypi' ],
|
||||
},
|
||||
{
|
||||
'target_name': 'device_battery_java',
|
||||
'type': 'none',
|
||||
'dependencies': [
|
||||
'../../base/base.gyp:base',
|
||||
'../../mojo/mojo_public.gyp:mojo_bindings_java',
|
||||
'device_battery_mojo_bindings',
|
||||
],
|
||||
'variables': {
|
||||
'java_in_dir': '../../device/battery/android/java',
|
||||
|
@ -1,65 +0,0 @@
|
||||
// Copyright 2014 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 "device/battery/battery_status_manager_android.h"
|
||||
|
||||
#include "base/android/jni_android.h"
|
||||
#include "base/android/scoped_java_ref.h"
|
||||
#include "base/metrics/histogram.h"
|
||||
#include "jni/BatteryStatusManager_jni.h"
|
||||
|
||||
using base::android::AttachCurrentThread;
|
||||
|
||||
namespace device {
|
||||
|
||||
BatteryStatusManagerAndroid::BatteryStatusManagerAndroid(
|
||||
const BatteryStatusService::BatteryUpdateCallback& callback)
|
||||
: callback_(callback) {
|
||||
j_manager_.Reset(
|
||||
Java_BatteryStatusManager_getInstance(
|
||||
AttachCurrentThread(), base::android::GetApplicationContext()));
|
||||
}
|
||||
|
||||
BatteryStatusManagerAndroid::~BatteryStatusManagerAndroid() {
|
||||
}
|
||||
|
||||
// static
|
||||
bool BatteryStatusManagerAndroid::Register(JNIEnv* env) {
|
||||
return RegisterNativesImpl(env);
|
||||
}
|
||||
|
||||
void BatteryStatusManagerAndroid::GotBatteryStatus(JNIEnv*,
|
||||
jobject,
|
||||
jboolean charging,
|
||||
jdouble charging_time,
|
||||
jdouble discharging_time,
|
||||
jdouble level) {
|
||||
BatteryStatus status;
|
||||
status.charging = charging;
|
||||
status.charging_time = charging_time;
|
||||
status.discharging_time = discharging_time;
|
||||
status.level = level;
|
||||
callback_.Run(status);
|
||||
}
|
||||
|
||||
bool BatteryStatusManagerAndroid::StartListeningBatteryChange() {
|
||||
bool result = Java_BatteryStatusManager_start(AttachCurrentThread(),
|
||||
j_manager_.obj(), reinterpret_cast<intptr_t>(this));
|
||||
UMA_HISTOGRAM_BOOLEAN("BatteryStatus.StartAndroid", result);
|
||||
return result;
|
||||
}
|
||||
|
||||
void BatteryStatusManagerAndroid::StopListeningBatteryChange() {
|
||||
Java_BatteryStatusManager_stop(
|
||||
AttachCurrentThread(), j_manager_.obj());
|
||||
}
|
||||
|
||||
// static
|
||||
scoped_ptr<BatteryStatusManager> BatteryStatusManager::Create(
|
||||
const BatteryStatusService::BatteryUpdateCallback& callback) {
|
||||
return scoped_ptr<BatteryStatusManager>(
|
||||
new BatteryStatusManagerAndroid(callback));
|
||||
}
|
||||
|
||||
} // namespace device
|
@ -1,45 +0,0 @@
|
||||
// Copyright 2014 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 "base/android/scoped_java_ref.h"
|
||||
#include "base/macros.h"
|
||||
#include "device/battery/battery_status_manager.h"
|
||||
|
||||
#ifndef DEVICE_BATTERY_BATTERY_STATUS_MANAGER_ANDROID_H_
|
||||
#define DEVICE_BATTERY_BATTERY_STATUS_MANAGER_ANDROID_H_
|
||||
|
||||
namespace device {
|
||||
|
||||
class BatteryStatusManagerAndroid : public BatteryStatusManager {
|
||||
public:
|
||||
explicit BatteryStatusManagerAndroid(
|
||||
const BatteryStatusService::BatteryUpdateCallback& callback);
|
||||
virtual ~BatteryStatusManagerAndroid();
|
||||
|
||||
// Must be called at startup.
|
||||
static bool Register(JNIEnv* env);
|
||||
|
||||
// Called from Java via JNI.
|
||||
void GotBatteryStatus(JNIEnv*,
|
||||
jobject,
|
||||
jboolean charging,
|
||||
jdouble charging_time,
|
||||
jdouble discharging_time,
|
||||
jdouble level);
|
||||
|
||||
private:
|
||||
// BatteryStatusManager:
|
||||
virtual bool StartListeningBatteryChange() override;
|
||||
virtual void StopListeningBatteryChange() override;
|
||||
|
||||
BatteryStatusService::BatteryUpdateCallback callback_;
|
||||
// Java provider of battery status info.
|
||||
base::android::ScopedJavaGlobalRef<jobject> j_manager_;
|
||||
|
||||
DISALLOW_COPY_AND_ASSIGN(BatteryStatusManagerAndroid);
|
||||
};
|
||||
|
||||
} // namespace device
|
||||
|
||||
#endif // DEVICE_BATTERY_BATTERY_STATUS_MANAGER_ANDROID_H_
|
Reference in New Issue
Block a user