diff options
| author | Steve <sjpirri@gmail.com> | 2012-03-19 21:21:39 +0000 |
|---|---|---|
| committer | Gerrit Code Review <gerrit@review.cyanogenmod.com> | 2013-01-17 10:12:17 -0800 |
| commit | 4bfdaf9e1436dd6a5c5bbb102fec633d66c2617d (patch) | |
| tree | 840968211f988963742415b8945a41dd8b6b1b53 /services/jni | |
| parent | ceabe5b1376eaf0a20c93504cd8f244ed51f7db5 (diff) | |
| download | frameworks_base-4bfdaf9e1436dd6a5c5bbb102fec633d66c2617d.zip frameworks_base-4bfdaf9e1436dd6a5c5bbb102fec633d66c2617d.tar.gz frameworks_base-4bfdaf9e1436dd6a5c5bbb102fec633d66c2617d.tar.bz2 | |
Add support for external dock batteries
Allows the external battery status to be read via framework.
Change-Id: I1340071cecab8f1733e58e4f3ba0d304f861f311
Diffstat (limited to 'services/jni')
| -rw-r--r-- | services/jni/Android.mk | 4 | ||||
| -rw-r--r-- | services/jni/com_android_server_BatteryService.cpp | 72 |
2 files changed, 76 insertions, 0 deletions
diff --git a/services/jni/Android.mk b/services/jni/Android.mk index c3b6539..70413d8 100644 --- a/services/jni/Android.mk +++ b/services/jni/Android.mk @@ -56,6 +56,10 @@ ifeq ($(WITH_MALLOC_LEAK_CHECK),true) LOCAL_CFLAGS += -DMALLOC_LEAK_CHECK endif +ifeq ($(TARGET_HAS_DOCK_BATTERY),true) + LOCAL_CFLAGS += -DHAS_DOCK_BATTERY +endif + LOCAL_MODULE:= libandroid_servers include $(BUILD_SHARED_LIBRARY) diff --git a/services/jni/com_android_server_BatteryService.cpp b/services/jni/com_android_server_BatteryService.cpp index e6133af..f41b25d 100644 --- a/services/jni/com_android_server_BatteryService.cpp +++ b/services/jni/com_android_server_BatteryService.cpp @@ -50,6 +50,11 @@ struct FieldIds { jfieldID mBatteryVoltage; jfieldID mBatteryTemperature; jfieldID mBatteryTechnology; +#ifdef HAS_DOCK_BATTERY + jfieldID mDockBatteryStatus; + jfieldID mDockBatteryLevel; + jfieldID mDockBatteryPresent; +#endif }; static FieldIds gFieldIds; @@ -66,6 +71,11 @@ struct BatteryManagerConstants { jint healthOverVoltage; jint healthUnspecifiedFailure; jint healthCold; +#ifdef HAS_DOCK_BATTERY + jint dockstatusCharging; + jint dockstatusNotCharging; + jint dockstatusUndocked; +#endif }; static BatteryManagerConstants gConstants; @@ -80,6 +90,11 @@ struct PowerSupplyPaths { char* batteryVoltagePath; char* batteryTemperaturePath; char* batteryTechnologyPath; +#ifdef HAS_DOCK_BATTERY + char* dockbatteryStatusPath; + char* dockbatteryCapacityPath; + char* dockbatteryPresentPath; +#endif }; static PowerSupplyPaths gPaths; @@ -101,6 +116,21 @@ static jint getBatteryStatus(const char* status) } } +#ifdef HAS_DOCK_BATTERY +static jint getDockBatteryStatus(const char* status) +{ + switch (status[0]) { + case 'C': return gConstants.dockstatusCharging; // Charging + case 'N': return gConstants.dockstatusNotCharging; // Not charging + + default: { + ALOGW("Unknown dock battery status '%s'", status); + return gConstants.dockstatusUndocked; + } + } +} +#endif + static jint getBatteryHealth(const char* status) { switch (status[0]) { @@ -202,6 +232,10 @@ static void android_server_BatteryService_update(JNIEnv* env, jobject obj) setBooleanField(env, obj, gPaths.usbOnlinePath, gFieldIds.mUsbOnline); setBooleanField(env, obj, gPaths.wirelessOnlinePath, gFieldIds.mWirelessOnline); setBooleanField(env, obj, gPaths.batteryPresentPath, gFieldIds.mBatteryPresent); + +#ifdef HAS_DOCK_BATTERY + setIntField(env, obj, gPaths.dockbatteryCapacityPath, gFieldIds.mDockBatteryLevel); +#endif setIntField(env, obj, gPaths.batteryCapacityPath, gFieldIds.mBatteryLevel); setVoltageField(env, obj, gPaths.batteryVoltagePath, gFieldIds.mBatteryVoltage); @@ -215,6 +249,14 @@ static void android_server_BatteryService_update(JNIEnv* env, jobject obj) else env->SetIntField(obj, gFieldIds.mBatteryStatus, gConstants.statusUnknown); + +#ifdef HAS_DOCK_BATTERY + if (readFromFile(gPaths.dockbatteryStatusPath, buf, SIZE) > 0) + env->SetIntField(obj, gFieldIds.mDockBatteryStatus, getDockBatteryStatus(buf)); + else + env->SetIntField(obj, gFieldIds.mDockBatteryStatus, + gConstants.dockstatusUndocked); +#endif if (readFromFile(gPaths.batteryHealthPath, buf, SIZE) > 0) env->SetIntField(obj, gFieldIds.mBatteryHealth, getBatteryHealth(buf)); @@ -306,6 +348,19 @@ int register_android_server_BatteryService(JNIEnv* env) if (access(path, R_OK) == 0) gPaths.batteryTechnologyPath = strdup(path); } +#ifdef HAS_DOCK_BATTERY + else if(strcmp(buf, "DockBattery") == 0) { + snprintf(path, sizeof(path), "%s/%s/status", POWER_SUPPLY_PATH, name); + if (access(path, R_OK) == 0) + gPaths.dockbatteryStatusPath = strdup(path); + snprintf(path, sizeof(path), "%s/%s/capacity", POWER_SUPPLY_PATH, name); + if (access(path, R_OK) == 0) + gPaths.dockbatteryCapacityPath = strdup(path); + snprintf(path, sizeof(path), "%s/%s/device/ec_dock", POWER_SUPPLY_PATH, name); + if (access(path, R_OK) == 0) + gPaths.dockbatteryPresentPath = strdup(path); + } +#endif } } closedir(dir); @@ -350,6 +405,12 @@ int register_android_server_BatteryService(JNIEnv* env) gFieldIds.mBatteryVoltage = env->GetFieldID(clazz, "mBatteryVoltage", "I"); gFieldIds.mBatteryTemperature = env->GetFieldID(clazz, "mBatteryTemperature", "I"); +#ifdef HAS_DOCK_BATTERY + gFieldIds.mDockBatteryStatus = env->GetFieldID(clazz, "mDockBatteryStatus", "I"); + gFieldIds.mDockBatteryLevel = env->GetFieldID(clazz, "mDockBatteryLevel", "I"); + gFieldIds.mDockBatteryPresent = env->GetFieldID(clazz, "mDockBatteryPresent", "Ljava/lang/String;"); +#endif + LOG_FATAL_IF(gFieldIds.mAcOnline == NULL, "Unable to find BatteryService.AC_ONLINE_PATH"); LOG_FATAL_IF(gFieldIds.mUsbOnline == NULL, "Unable to find BatteryService.USB_ONLINE_PATH"); LOG_FATAL_IF(gFieldIds.mWirelessOnline == NULL, "Unable to find BatteryService.WIRELESS_ONLINE_PATH"); @@ -404,6 +465,17 @@ int register_android_server_BatteryService(JNIEnv* env) gConstants.healthCold = env->GetStaticIntField(clazz, env->GetStaticFieldID(clazz, "BATTERY_HEALTH_COLD", "I")); +#ifdef HAS_DOCK_BATTERY + gConstants.dockstatusCharging = env->GetStaticIntField(clazz, + env->GetStaticFieldID(clazz, "DOCK_STATE_CHARGING", "I")); + + gConstants.dockstatusNotCharging = env->GetStaticIntField(clazz, + env->GetStaticFieldID(clazz, "DOCK_STATE_DISCHARGING", "I")); + + gConstants.dockstatusUndocked = env->GetStaticIntField(clazz, + env->GetStaticFieldID(clazz, "DOCK_STATE_UNDOCKED", "I")); +#endif + return jniRegisterNativeMethods(env, "com/android/server/BatteryService", sMethods, NELEM(sMethods)); } |
