summaryrefslogtreecommitdiffstats
path: root/services/jni
diff options
context:
space:
mode:
authorSteve <sjpirri@gmail.com>2012-03-19 21:21:39 +0000
committerGerrit Code Review <gerrit@review.cyanogenmod.com>2013-01-17 10:12:17 -0800
commit4bfdaf9e1436dd6a5c5bbb102fec633d66c2617d (patch)
tree840968211f988963742415b8945a41dd8b6b1b53 /services/jni
parentceabe5b1376eaf0a20c93504cd8f244ed51f7db5 (diff)
downloadframeworks_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.mk4
-rw-r--r--services/jni/com_android_server_BatteryService.cpp72
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));
}