diff options
author | timvolodine@chromium.org <timvolodine@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2014-04-16 17:59:05 +0000 |
---|---|---|
committer | timvolodine@chromium.org <timvolodine@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2014-04-16 17:59:05 +0000 |
commit | cc7924385d0ecd27f81959f4c62645e14d713855 (patch) | |
tree | 953fcc9aac390e534d6d7e5a699990e8cd6c7967 /content | |
parent | 13805fe770b1d9fa5cd889fcee860b66ba3207a6 (diff) | |
download | chromium_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')
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 |