diff options
| author | Alexander Hofbauer <alex@derhofbauer.at> | 2012-08-05 22:17:51 +0200 |
|---|---|---|
| committer | Aaron Echols <atechols@gmail.com> | 2013-01-24 15:13:21 -0700 |
| commit | 034d07e3faa7131038c6c5aa8f0f80c76c6e9c35 (patch) | |
| tree | 930dfa5173f52616ce58c9fbb4fef2440bade31e /services/jni | |
| parent | 899f5c240e907d4e31406e600a5d9993dcab31c4 (diff) | |
| download | frameworks_base-034d07e3faa7131038c6c5aa8f0f80c76c6e9c35.zip frameworks_base-034d07e3faa7131038c6c5aa8f0f80c76c6e9c35.tar.gz frameworks_base-034d07e3faa7131038c6c5aa8f0f80c76c6e9c35.tar.bz2 | |
Cleanup dock battery support
Send an intent as soon as the device is undocked to get a timely update
of the SystemUI.
Adds a proper implementation of dock detection in BatteryService via
"dock_battery/device/ec_dock". This will probably have to be rewritten
in a more generic way to support other manufacturers as well (once we
support other docks at all).
Change-Id: Ib1088c118c8695fd93ba085d976ca1eb374ae71e
Conflicts:
packages/SystemUI/src/com/android/systemui/statusbar/policy/DockBatteryController.java
Diffstat (limited to 'services/jni')
| -rw-r--r-- | services/jni/com_android_server_BatteryService.cpp | 74 |
1 files changed, 41 insertions, 33 deletions
diff --git a/services/jni/com_android_server_BatteryService.cpp b/services/jni/com_android_server_BatteryService.cpp index f41b25d..c6fe620 100644 --- a/services/jni/com_android_server_BatteryService.cpp +++ b/services/jni/com_android_server_BatteryService.cpp @@ -72,9 +72,9 @@ struct BatteryManagerConstants { jint healthUnspecifiedFailure; jint healthCold; #ifdef HAS_DOCK_BATTERY - jint dockstatusCharging; - jint dockstatusNotCharging; - jint dockstatusUndocked; + jint dockStatusUnknown; + jint dockStatusCharging; + jint dockStatusNotCharging; #endif }; static BatteryManagerConstants gConstants; @@ -91,9 +91,9 @@ struct PowerSupplyPaths { char* batteryTemperaturePath; char* batteryTechnologyPath; #ifdef HAS_DOCK_BATTERY - char* dockbatteryStatusPath; - char* dockbatteryCapacityPath; - char* dockbatteryPresentPath; + char* dockBatteryStatusPath; + char* dockBatteryCapacityPath; + char* dockBatteryPresentPath; #endif }; static PowerSupplyPaths gPaths; @@ -120,12 +120,12 @@ static jint getBatteryStatus(const char* status) static jint getDockBatteryStatus(const char* status) { switch (status[0]) { - case 'C': return gConstants.dockstatusCharging; // Charging - case 'N': return gConstants.dockstatusNotCharging; // Not charging + case 'C': return gConstants.dockStatusCharging; // Charging + case 'N': return gConstants.dockStatusNotCharging; // Not charging default: { ALOGW("Unknown dock battery status '%s'", status); - return gConstants.dockstatusUndocked; + return gConstants.dockStatusUnknown; } } } @@ -233,36 +233,44 @@ static void android_server_BatteryService_update(JNIEnv* env, jobject obj) 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); setIntField(env, obj, gPaths.batteryTemperaturePath, gFieldIds.mBatteryTemperature); - + const int SIZE = 128; char buf[SIZE]; - + if (readFromFile(gPaths.batteryStatusPath, buf, SIZE) > 0) env->SetIntField(obj, gFieldIds.mBatteryStatus, getBatteryStatus(buf)); 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)); if (readFromFile(gPaths.batteryTechnologyPath, buf, SIZE) > 0) env->SetObjectField(obj, gFieldIds.mBatteryTechnology, env->NewStringUTF(buf)); + +#ifdef HAS_DOCK_BATTERY + jboolean present = false; + if (readFromFile(gPaths.dockBatteryPresentPath, buf, SIZE) >= 15) { + // should return "dock detect = 1" + if (buf[14] == '1') { + present = true; + } + } + env->SetBooleanField(obj, gFieldIds.mDockBatteryPresent, present); + + setIntField(env, obj, gPaths.dockBatteryCapacityPath, gFieldIds.mDockBatteryLevel); + + if (readFromFile(gPaths.dockBatteryStatusPath, buf, SIZE) > 0) + env->SetIntField(obj, gFieldIds.mDockBatteryStatus, + getDockBatteryStatus(buf)); + else + env->SetIntField(obj, gFieldIds.mDockBatteryStatus, + gConstants.dockStatusUnknown); +#endif } static JNINativeMethod sMethods[] = { @@ -352,13 +360,13 @@ int register_android_server_BatteryService(JNIEnv* env) 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); + 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); + 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); + gPaths.dockBatteryPresentPath = strdup(path); } #endif } @@ -408,7 +416,7 @@ int register_android_server_BatteryService(JNIEnv* env) #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;"); + gFieldIds.mDockBatteryPresent = env->GetFieldID(clazz, "mDockBatteryPresent", "Z"); #endif LOG_FATAL_IF(gFieldIds.mAcOnline == NULL, "Unable to find BatteryService.AC_ONLINE_PATH"); @@ -466,14 +474,14 @@ int register_android_server_BatteryService(JNIEnv* env) env->GetStaticFieldID(clazz, "BATTERY_HEALTH_COLD", "I")); #ifdef HAS_DOCK_BATTERY - gConstants.dockstatusCharging = env->GetStaticIntField(clazz, - env->GetStaticFieldID(clazz, "DOCK_STATE_CHARGING", "I")); + gConstants.dockStatusUnknown = env->GetStaticIntField(clazz, + env->GetStaticFieldID(clazz, "DOCK_BATTERY_STATUS_UNKNOWN", "I")); - gConstants.dockstatusNotCharging = env->GetStaticIntField(clazz, - env->GetStaticFieldID(clazz, "DOCK_STATE_DISCHARGING", "I")); + gConstants.dockStatusCharging = env->GetStaticIntField(clazz, + env->GetStaticFieldID(clazz, "DOCK_BATTERY_STATUS_CHARGING", "I")); - gConstants.dockstatusUndocked = env->GetStaticIntField(clazz, - env->GetStaticFieldID(clazz, "DOCK_STATE_UNDOCKED", "I")); + gConstants.dockStatusNotCharging = env->GetStaticIntField(clazz, + env->GetStaticFieldID(clazz, "DOCK_BATTERY_STATUS_NOT_CHARGING", "I")); #endif return jniRegisterNativeMethods(env, "com/android/server/BatteryService", sMethods, NELEM(sMethods)); |
