summaryrefslogtreecommitdiffstats
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
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
-rw-r--r--core/java/android/os/BatteryManager.java33
-rwxr-xr-xcore/res/res/values/config.xml3
-rw-r--r--core/res/res/values/symbols.xml1
-rw-r--r--services/java/com/android/server/BatteryService.java26
-rw-r--r--services/jni/Android.mk4
-rw-r--r--services/jni/com_android_server_BatteryService.cpp72
6 files changed, 139 insertions, 0 deletions
diff --git a/core/java/android/os/BatteryManager.java b/core/java/android/os/BatteryManager.java
index 2e38960..9636b98 100644
--- a/core/java/android/os/BatteryManager.java
+++ b/core/java/android/os/BatteryManager.java
@@ -26,6 +26,12 @@ public class BatteryManager {
* integer containing the current status constant.
*/
public static final String EXTRA_STATUS = "status";
+
+ /**
+ * Integer containing the current status constant for the dock battery.
+ * @hide
+ */
+ public static final String EXTRA_DOCK_STATUS = "dock_status";
/**
* Extra for {@link android.content.Intent#ACTION_BATTERY_CHANGED}:
@@ -45,6 +51,18 @@ public class BatteryManager {
* {@link #EXTRA_SCALE}.
*/
public static final String EXTRA_LEVEL = "level";
+
+ /**
+ * Integer field containing the current dock battery level.
+ * @hide
+ */
+ public static final String EXTRA_DOCK_LEVEL = "dock_level";
+
+ /**
+ * Boolean field containing the current dock battery AC status.
+ * @hide
+ */
+ public static final String EXTRA_DOCK_AC_ONLINE = "dock_ac_online";
/**
* Extra for {@link android.content.Intent#ACTION_BATTERY_CHANGED}:
@@ -109,6 +127,21 @@ public class BatteryManager {
public static final int BATTERY_HEALTH_UNSPECIFIED_FAILURE = 6;
public static final int BATTERY_HEALTH_COLD = 7;
+ /** @hide */
+ public static final int DOCK_STATE_UNKNOWN = 0;
+
+ /** @hide */
+ public static final int DOCK_STATE_UNDOCKED = 1;
+
+ /** @hide */
+ public static final int DOCK_STATE_CHARGING = 2;
+
+ /** @hide */
+ public static final int DOCK_STATE_DOCKED = 3;
+
+ /** @hide */
+ public static final int DOCK_STATE_DISCHARGING = 4;
+
// values of the "plugged" field in the ACTION_BATTERY_CHANGED intent.
// These must be powers of 2.
/** Power source is an AC charger. */
diff --git a/core/res/res/values/config.xml b/core/res/res/values/config.xml
index 76fa164..532249e 100755
--- a/core/res/res/values/config.xml
+++ b/core/res/res/values/config.xml
@@ -1089,6 +1089,9 @@
the GPU to handle. -->
<integer name="config_wallpaperMaxWidth">-1</integer>
+ <!-- Asus dock compatibility disabled by default -->
+ <bool name="config_hasDockBattery">false</bool>
+
<!-- LUN file to be used by legacy USB manager.
The existence of this file will be used to determine in the
legacy USB manager should be started. -->
diff --git a/core/res/res/values/symbols.xml b/core/res/res/values/symbols.xml
index b399050..18f7ebf 100644
--- a/core/res/res/values/symbols.xml
+++ b/core/res/res/values/symbols.xml
@@ -1838,6 +1838,7 @@
<java-symbol type="integer" name="config_wallpaperMaxWidth" />
<java-symbol type="string" name="config_legacyUmsLunFile" />
<java-symbol type="bool" name="config_hasRemovableLid" />
+ <java-symbol type="bool" name="config_hasDockBattery" />
<!-- Telephony -->
<java-symbol type="bool" name="config_smsSamsungCdmaAlternateMessageIDEncoding" />
diff --git a/services/java/com/android/server/BatteryService.java b/services/java/com/android/server/BatteryService.java
index 030d127..e0ce8ac 100644
--- a/services/java/com/android/server/BatteryService.java
+++ b/services/java/com/android/server/BatteryService.java
@@ -119,6 +119,10 @@ public final class BatteryService extends Binder {
private boolean mBatteryLevelCritical;
/* End native fields. */
+ private int mDockBatteryStatus;
+ private int mDockBatteryLevel;
+ private String mDockBatteryPresent;
+
private int mLastBatteryStatus;
private int mLastBatteryHealth;
private boolean mLastBatteryPresent;
@@ -134,6 +138,8 @@ public final class BatteryService extends Binder {
private int mLowBatteryCloseWarningLevel;
private int mShutdownBatteryTemperature;
+ private boolean mHasDockBattery;
+
private int mPlugType;
private int mLastPlugType = -1; // Extra state so we can detect first run
@@ -174,6 +180,9 @@ public final class BatteryService extends Binder {
mShutdownBatteryTemperature = mContext.getResources().getInteger(
com.android.internal.R.integer.config_shutdownBatteryTemperature);
+ mHasDockBattery = mContext.getResources().getBoolean(
+ com.android.internal.R.bool.config_hasDockBattery);
+
mPowerSupplyObserver.startObserving("SUBSYSTEM=power_supply");
// watch for invalid charger messages if the invalid_charger switch exists
@@ -508,6 +517,23 @@ public final class BatteryService extends Binder {
", icon:" + icon + ", invalid charger:" + mInvalidCharger);
}
+ if (mHasDockBattery){
+ intent.putExtra(BatteryManager.EXTRA_DOCK_STATUS, mDockBatteryStatus);
+ intent.putExtra(BatteryManager.EXTRA_DOCK_LEVEL, mDockBatteryLevel);
+ intent.putExtra(BatteryManager.EXTRA_DOCK_AC_ONLINE, false);
+ }
+
+ if (false) {
+ Slog.d(TAG, "level:" + mBatteryLevel +
+ " scale:" + BATTERY_SCALE + " status:" + mBatteryStatus +
+ " health:" + mBatteryHealth + " present:" + mBatteryPresent +
+ " voltage: " + mBatteryVoltage +
+ " temperature: " + mBatteryTemperature +
+ " technology: " + mBatteryTechnology +
+ " AC powered:" + mAcOnline + " USB powered:" + mUsbOnline +
+ " icon:" + icon + " invalid charger:" + mInvalidCharger);
+ }
+
mHandler.post(new Runnable() {
@Override
public void run() {
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));
}