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 | |
| 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
| -rw-r--r-- | core/java/android/os/BatteryManager.java | 33 | ||||
| -rwxr-xr-x | core/res/res/values/config.xml | 3 | ||||
| -rw-r--r-- | core/res/res/values/symbols.xml | 1 | ||||
| -rw-r--r-- | services/java/com/android/server/BatteryService.java | 26 | ||||
| -rw-r--r-- | services/jni/Android.mk | 4 | ||||
| -rw-r--r-- | services/jni/com_android_server_BatteryService.cpp | 72 |
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)); } |
