summaryrefslogtreecommitdiffstats
path: root/content
diff options
context:
space:
mode:
authortimvolodine@chromium.org <timvolodine@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2014-04-16 17:59:05 +0000
committertimvolodine@chromium.org <timvolodine@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2014-04-16 17:59:05 +0000
commitcc7924385d0ecd27f81959f4c62645e14d713855 (patch)
tree953fcc9aac390e534d6d7e5a699990e8cd6c7967 /content
parent13805fe770b1d9fa5cd889fcee860b66ba3207a6 (diff)
downloadchromium_src-cc7924385d0ecd27f81959f4c62645e14d713855.zip
chromium_src-cc7924385d0ecd27f81959f4c62645e14d713855.tar.gz
chromium_src-cc7924385d0ecd27f81959f4c62645e14d713855.tar.bz2
Android: Java-side Battery Status API + JNI
Initial java-side impementation of the Battery Status API and the skeleton for the browser-side manager class with the JNI bindings. BUG=360068 Review URL: https://codereview.chromium.org/225403007 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@264249 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'content')
-rw-r--r--content/browser/android/browser_jni_registrar.cc5
-rw-r--r--content/browser/battery_status/OWNERS1
-rw-r--r--content/browser/battery_status/battery_status_manager_android.cc47
-rw-r--r--content/browser/battery_status/battery_status_manager_android.h40
-rw-r--r--content/content_browser.gypi2
-rw-r--r--content/content_jni.gypi1
-rw-r--r--content/public/android/java/src/org/chromium/content/browser/BatteryStatusManager.java116
-rw-r--r--content/public/android/java/src/org/chromium/content/browser/OWNERS3
-rw-r--r--content/public/android/javatests/src/org/chromium/content/browser/BatteryStatusManagerTest.java127
-rw-r--r--content/public/android/javatests/src/org/chromium/content/browser/OWNERS3
10 files changed, 344 insertions, 1 deletions
diff --git a/content/browser/android/browser_jni_registrar.cc b/content/browser/android/browser_jni_registrar.cc
index bf4540e..53c19b6 100644
--- a/content/browser/android/browser_jni_registrar.cc
+++ b/content/browser/android/browser_jni_registrar.cc
@@ -22,6 +22,7 @@
#include "content/browser/android/surface_texture_peer_browser_impl.h"
#include "content/browser/android/tracing_controller_android.h"
#include "content/browser/android/web_contents_observer_android.h"
+#include "content/browser/battery_status/battery_status_manager_android.h"
#include "content/browser/device_orientation/sensor_manager_android.h"
#include "content/browser/frame_host/navigation_controller_android.h"
#include "content/browser/geolocation/location_api_adapter_android.h"
@@ -80,7 +81,9 @@ base::android::RegistrationMethod kContentRegisteredMethods[] = {
{"VibrationProvider", content::VibrationProviderAndroid::Register},
{"WebContentsAndroid", content::WebContentsAndroid::Register},
{"WebContentsObserverAndroid", content::RegisterWebContentsObserverAndroid},
- {"WebViewStatics", content::RegisterWebViewStatics}, };
+ {"WebViewStatics", content::RegisterWebViewStatics},
+ {"BatterStatusManagerAndroid",
+ content::BatteryStatusManagerAndroid::Register}, };
} // namespace
diff --git a/content/browser/battery_status/OWNERS b/content/browser/battery_status/OWNERS
new file mode 100644
index 0000000..1fd89e0
--- /dev/null
+++ b/content/browser/battery_status/OWNERS
@@ -0,0 +1 @@
+timvolodine@chromium.org
diff --git a/content/browser/battery_status/battery_status_manager_android.cc b/content/browser/battery_status/battery_status_manager_android.cc
new file mode 100644
index 0000000..e7769ca
--- /dev/null
+++ b/content/browser/battery_status/battery_status_manager_android.cc
@@ -0,0 +1,47 @@
+// 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/battery_status/battery_status_manager_android.h"
+
+#include <string.h>
+
+#include "base/android/jni_android.h"
+#include "jni/BatteryStatusManager_jni.h"
+
+using base::android::AttachCurrentThread;
+
+namespace content {
+
+BatteryStatusManagerAndroid::BatteryStatusManagerAndroid() {
+ j_manager_.Reset(
+ Java_BatteryStatusManager_getInstance(
+ AttachCurrentThread(), base::android::GetApplicationContext()));
+}
+
+BatteryStatusManagerAndroid::~BatteryStatusManagerAndroid() {
+ StopListeningBatteryChange();
+}
+
+bool BatteryStatusManagerAndroid::Register(JNIEnv* env) {
+ return RegisterNativesImpl(env);
+}
+
+void BatteryStatusManagerAndroid::GotBatteryStatus(JNIEnv*, jobject,
+ jboolean charging, jdouble chargingTime, jdouble dischargingTime,
+ jdouble level) {
+ NOTIMPLEMENTED();
+}
+
+bool BatteryStatusManagerAndroid::StartListeningBatteryChange() {
+ return Java_BatteryStatusManager_start(
+ AttachCurrentThread(), j_manager_.obj(),
+ reinterpret_cast<intptr_t>(this));
+}
+
+void BatteryStatusManagerAndroid::StopListeningBatteryChange() {
+ Java_BatteryStatusManager_stop(
+ AttachCurrentThread(), j_manager_.obj());
+}
+
+} // namespace content
diff --git a/content/browser/battery_status/battery_status_manager_android.h b/content/browser/battery_status/battery_status_manager_android.h
new file mode 100644
index 0000000..04746de
--- /dev/null
+++ b/content/browser/battery_status/battery_status_manager_android.h
@@ -0,0 +1,40 @@
+// 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 CHROME_BROWSER_BATTERY_STATUS_BATTERY_STATUS_MANAGER_ANDROID_H_
+#define CHROME_BROWSER_BATTERY_STATUS_BATTERY_STATUS_MANAGER_ANDROID_H_
+
+#include "base/android/scoped_java_ref.h"
+#include "content/common/content_export.h"
+
+namespace content {
+
+// Android implementation of Battery Status API.
+class CONTENT_EXPORT BatteryStatusManagerAndroid {
+ public:
+ // Must be called at startup.
+ static bool Register(JNIEnv* env);
+
+ // Called from Java via JNI.
+ void GotBatteryStatus(JNIEnv*, jobject, jboolean charging,
+ jdouble chargingTime, jdouble dischargingTime,
+ jdouble level);
+
+ bool StartListeningBatteryChange();
+ void StopListeningBatteryChange();
+
+ protected:
+ BatteryStatusManagerAndroid();
+ virtual ~BatteryStatusManagerAndroid();
+
+ private:
+ // Java provider of battery status info.
+ base::android::ScopedJavaGlobalRef<jobject> j_manager_;
+
+ DISALLOW_COPY_AND_ASSIGN(BatteryStatusManagerAndroid);
+};
+
+} // namespace content
+
+#endif // CHROME_BROWSER_BATTERY_STATUS_BATTERY_STATUS_MANAGER_ANDROID_H_
diff --git a/content/content_browser.gypi b/content/content_browser.gypi
index 8392f1e..d2c32d5 100644
--- a/content/content_browser.gypi
+++ b/content/content_browser.gypi
@@ -309,6 +309,8 @@
'browser/appcache/chrome_appcache_service.h',
'browser/appcache/view_appcache_internals_job.h',
'browser/appcache/view_appcache_internals_job.cc',
+ 'browser/battery_status/battery_status_manager_android.cc',
+ 'browser/battery_status/battery_status_manager_android.h',
'browser/browser_child_process_host_impl.cc',
'browser/browser_child_process_host_impl.h',
'browser/browser_context.cc',
diff --git a/content/content_jni.gypi b/content/content_jni.gypi
index ef9bb62..520e533 100644
--- a/content/content_jni.gypi
+++ b/content/content_jni.gypi
@@ -19,6 +19,7 @@
'public/android/java/src/org/chromium/content/browser/ContentViewRenderView.java',
'public/android/java/src/org/chromium/content/browser/ContentViewStatics.java',
'public/android/java/src/org/chromium/content/browser/DeviceMotionAndOrientation.java',
+ 'public/android/java/src/org/chromium/content/browser/BatteryStatusManager.java',
'public/android/java/src/org/chromium/content/browser/DownloadController.java',
'public/android/java/src/org/chromium/content/browser/input/ImeAdapter.java',
'public/android/java/src/org/chromium/content/browser/input/DateTimeChooserAndroid.java',
diff --git a/content/public/android/java/src/org/chromium/content/browser/BatteryStatusManager.java b/content/public/android/java/src/org/chromium/content/browser/BatteryStatusManager.java
new file mode 100644
index 0000000..f4357fa
--- /dev/null
+++ b/content/public/android/java/src/org/chromium/content/browser/BatteryStatusManager.java
@@ -0,0 +1,116 @@
+// 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 android.content.BroadcastReceiver;
+import android.content.Context;
+import android.content.Intent;
+import android.content.IntentFilter;
+import android.os.BatteryManager;
+import android.util.Log;
+
+import org.chromium.base.CalledByNative;
+import org.chromium.base.JNINamespace;
+
+/**
+ * Android implementation of the battery status APIs.
+ */
+@JNINamespace("content")
+class BatteryStatusManager extends BroadcastReceiver {
+
+ private static final String TAG = "BatteryStatusManager";
+
+ // A reference to the application context in order to acquire the SensorService.
+ private final Context mAppContext;
+ private final IntentFilter mFilter = new IntentFilter(Intent.ACTION_BATTERY_CHANGED);
+
+ // 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();
+
+ private boolean mEnabled = false;
+
+ protected BatteryStatusManager(Context context) {
+ mAppContext = context.getApplicationContext();
+ }
+
+ @CalledByNative
+ static BatteryStatusManager getInstance(Context appContext) {
+ return new BatteryStatusManager(appContext);
+ }
+
+ /**
+ * Start listening for intents
+ * @return True on success.
+ */
+ @CalledByNative
+ boolean start(long nativePtr) {
+ synchronized (mNativePtrLock) {
+ if (!mEnabled && mAppContext.registerReceiver(this, mFilter) != null) {
+ // success
+ mNativePtr = nativePtr;
+ mEnabled = true;
+ }
+ }
+ return mEnabled;
+ }
+
+ /**
+ * Stop listening to intents.
+ */
+ @CalledByNative
+ void stop() {
+ synchronized (mNativePtrLock) {
+ if (mEnabled) {
+ mAppContext.unregisterReceiver(this);
+ mNativePtr = 0;
+ mEnabled = false;
+ }
+ }
+ }
+
+ @Override
+ public void onReceive(Context context, Intent intent) {
+ if (!intent.getAction().equals(Intent.ACTION_BATTERY_CHANGED)) {
+ Log.e(TAG, "Unexpected intent.");
+ return;
+ }
+
+ int current = intent.getIntExtra(BatteryManager.EXTRA_LEVEL, -1);
+ int max = intent.getIntExtra(BatteryManager.EXTRA_SCALE, -1);
+ double level = (double)current / (double)max;
+
+ int status = intent.getIntExtra(BatteryManager.EXTRA_STATUS, -1);
+ // by default assume a battery is present
+ boolean present = intent.getBooleanExtra(BatteryManager.EXTRA_PRESENT, true);
+ boolean charging = (present && status == BatteryManager.BATTERY_STATUS_DISCHARGING)
+ ? false : true;
+
+ //TODO(timvolodine) : add proper projection for chargingTime, dischargingTime.
+ double chargingTime = (!present || status == BatteryManager.BATTERY_STATUS_FULL)
+ ? 0 : Double.POSITIVE_INFINITY;
+ double dischargingTime = Double.POSITIVE_INFINITY;
+
+ gotBatteryStatus(charging, chargingTime, dischargingTime, level);
+ }
+
+ 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 content/browser/battery_status/battery_status_manager_android.cc
+ */
+ private native void nativeGotBatteryStatus(long nativeBatteryStatusManagerAndroid,
+ boolean charging, double chargingTime, double dischargingTime, double level);
+}
diff --git a/content/public/android/java/src/org/chromium/content/browser/OWNERS b/content/public/android/java/src/org/chromium/content/browser/OWNERS
index a6e34fb..830b57d 100644
--- a/content/public/android/java/src/org/chromium/content/browser/OWNERS
+++ b/content/public/android/java/src/org/chromium/content/browser/OWNERS
@@ -9,5 +9,8 @@ per-file LocationProvider.java=timvolodine@chromium.org
# Screen Orientation API related
per-file ScreenOrientation*.java=mlamouri@chromium.org
+# Battery Status API related
+per-file BatteryStatusManager.java=timvolodine@chromium.org
+
# Input handling related
jdduke@chromium.org
diff --git a/content/public/android/javatests/src/org/chromium/content/browser/BatteryStatusManagerTest.java b/content/public/android/javatests/src/org/chromium/content/browser/BatteryStatusManagerTest.java
new file mode 100644
index 0000000..e13512a
--- /dev/null
+++ b/content/public/android/javatests/src/org/chromium/content/browser/BatteryStatusManagerTest.java
@@ -0,0 +1,127 @@
+// 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 android.content.Context;
+import android.content.Intent;
+
+import android.os.BatteryManager;
+
+import android.test.AndroidTestCase;
+import android.test.suitebuilder.annotation.SmallTest;
+
+/**
+ * Test suite for BatteryStatusManager.
+ */
+public class BatteryStatusManagerTest extends AndroidTestCase {
+
+ private BatteryStatusManagerForTests mBatteryStatusManager;
+
+ @Override
+ public void setUp() throws Exception {
+ super.setUp();
+ mBatteryStatusManager = BatteryStatusManagerForTests.getInstance(getContext());
+ }
+
+ @SmallTest
+ public void testOnReceiveBatteryDischarging() {
+ Intent intent = new Intent(Intent.ACTION_BATTERY_CHANGED);
+ intent.putExtra(BatteryManager.EXTRA_LEVEL, 10);
+ intent.putExtra(BatteryManager.EXTRA_SCALE, 100);
+ intent.putExtra(BatteryManager.EXTRA_STATUS, BatteryManager.BATTERY_STATUS_DISCHARGING);
+
+ mBatteryStatusManager.onReceive(getContext(), intent);
+
+ mBatteryStatusManager.verifyCalls("gotBatteryStatus");
+ mBatteryStatusManager.verifyValues(false, Double.POSITIVE_INFINITY,
+ Double.POSITIVE_INFINITY, 0.1);
+ }
+
+ @SmallTest
+ public void testOnReceiveBatteryCharging() {
+ Intent intent = new Intent(Intent.ACTION_BATTERY_CHANGED);
+ intent.putExtra(BatteryManager.EXTRA_LEVEL, 50);
+ intent.putExtra(BatteryManager.EXTRA_SCALE, 100);
+ intent.putExtra(BatteryManager.EXTRA_STATUS, BatteryManager.BATTERY_STATUS_CHARGING);
+
+ mBatteryStatusManager.onReceive(getContext(), intent);
+
+ mBatteryStatusManager.verifyCalls("gotBatteryStatus");
+ mBatteryStatusManager.verifyValues(true, Double.POSITIVE_INFINITY,
+ Double.POSITIVE_INFINITY, 0.5);
+ }
+
+ @SmallTest
+ public void testOnReceiveBatteryFull() {
+ Intent intent = new Intent(Intent.ACTION_BATTERY_CHANGED);
+ intent.putExtra(BatteryManager.EXTRA_LEVEL, 100);
+ intent.putExtra(BatteryManager.EXTRA_SCALE, 100);
+ intent.putExtra(BatteryManager.EXTRA_STATUS, BatteryManager.BATTERY_STATUS_FULL);
+
+ mBatteryStatusManager.onReceive(getContext(), intent);
+
+ mBatteryStatusManager.verifyCalls("gotBatteryStatus");
+ mBatteryStatusManager.verifyValues(true, 0, Double.POSITIVE_INFINITY, 1);
+ }
+
+ @SmallTest
+ public void testOnReceiveNoBattery() {
+ Intent intent = new Intent(Intent.ACTION_BATTERY_CHANGED);
+ intent.putExtra(BatteryManager.EXTRA_PRESENT, false);
+
+ mBatteryStatusManager.onReceive(getContext(), intent);
+
+ mBatteryStatusManager.verifyCalls("gotBatteryStatus");
+ mBatteryStatusManager.verifyValues(true, 0, Double.POSITIVE_INFINITY, 1);
+ }
+
+ @SmallTest
+ public void testStartStopSucceeds() {
+ assertTrue(mBatteryStatusManager.start(0));
+ mBatteryStatusManager.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 void gotBatteryStatus(boolean charging, double chargingTime,
+ double dischargingTime, double level) {
+ mCharging = charging;
+ mChargingTime = chargingTime;
+ mDischargingTime = dischargingTime;
+ mLevel = level;
+ mCalls = mCalls.concat("gotBatteryStatus");
+ }
+ }
+
+}
diff --git a/content/public/android/javatests/src/org/chromium/content/browser/OWNERS b/content/public/android/javatests/src/org/chromium/content/browser/OWNERS
index bec75bfe..74d679d 100644
--- a/content/public/android/javatests/src/org/chromium/content/browser/OWNERS
+++ b/content/public/android/javatests/src/org/chromium/content/browser/OWNERS
@@ -9,5 +9,8 @@ per-file LocationProviderTest.java=timvolodine@chromium.org
# Screen Orientation API related
per-file ScreenOrientation*.java=mlamouri@chromium.org
+# Battery Status API related
+per-file BatteryStatusManagerTest.java=timvolodine@chromium.org
+
# Input handling related
jdduke@chromium.org