summaryrefslogtreecommitdiffstats
path: root/services/jni
diff options
context:
space:
mode:
authorAlexander Hofbauer <alex@derhofbauer.at>2012-08-05 22:17:51 +0200
committerAaron Echols <atechols@gmail.com>2013-01-24 15:13:21 -0700
commit034d07e3faa7131038c6c5aa8f0f80c76c6e9c35 (patch)
tree930dfa5173f52616ce58c9fbb4fef2440bade31e /services/jni
parent899f5c240e907d4e31406e600a5d9993dcab31c4 (diff)
downloadframeworks_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.cpp74
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));