Loading core/java/android/os/BatteryManager.java +33 −0 Original line number Diff line number Diff line Loading @@ -27,6 +27,12 @@ public class BatteryManager { */ 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}: * integer containing the current health constant. Loading @@ -46,6 +52,18 @@ public class BatteryManager { */ 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}: * integer containing the maximum battery level. Loading Loading @@ -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. */ Loading core/res/res/values/config.xml +3 −0 Original line number Diff line number Diff line Loading @@ -768,4 +768,7 @@ <!-- Workaround for devices with broken keyboards --> <bool name="config_forceDisableHardwareKeyboard">false</bool> <!-- Asus dock compatibility disabled by default --> <bool name="config_hasDockBattery">false</bool> </resources> services/java/com/android/server/BatteryService.java +15 −0 Original line number Diff line number Diff line Loading @@ -105,6 +105,10 @@ class BatteryService extends Binder { private boolean mBatteryLevelCritical; private int mInvalidCharger; private int mDockBatteryStatus; private int mDockBatteryLevel; private String mDockBatteryPresent; private int mLastBatteryStatus; private int mLastBatteryHealth; private boolean mLastBatteryPresent; Loading @@ -117,6 +121,8 @@ class BatteryService extends Binder { private int mLowBatteryWarningLevel; private int mLowBatteryCloseWarningLevel; private boolean mHasDockBattery; private int mPlugType; private int mLastPlugType = -1; // Extra state so we can detect first run Loading @@ -140,6 +146,9 @@ class BatteryService extends Binder { mLowBatteryCloseWarningLevel = mContext.getResources().getInteger( com.android.internal.R.integer.config_lowBatteryCloseWarningLevel); 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 Loading Loading @@ -396,6 +405,12 @@ class BatteryService extends Binder { intent.putExtra(BatteryManager.EXTRA_TECHNOLOGY, mBatteryTechnology); intent.putExtra(BatteryManager.EXTRA_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 + Loading services/jni/Android.mk +4 −0 Original line number Diff line number Diff line Loading @@ -41,6 +41,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) services/jni/com_android_server_BatteryService.cpp +72 −0 Original line number Diff line number Diff line Loading @@ -49,6 +49,11 @@ struct FieldIds { jfieldID mBatteryVoltage; jfieldID mBatteryTemperature; jfieldID mBatteryTechnology; #ifdef HAS_DOCK_BATTERY jfieldID mDockBatteryStatus; jfieldID mDockBatteryLevel; jfieldID mDockBatteryPresent; #endif }; static FieldIds gFieldIds; Loading @@ -65,6 +70,11 @@ struct BatteryManagerConstants { jint healthOverVoltage; jint healthUnspecifiedFailure; jint healthCold; #ifdef HAS_DOCK_BATTERY jint dockstatusCharging; jint dockstatusNotCharging; jint dockstatusUndocked; #endif }; static BatteryManagerConstants gConstants; Loading @@ -78,6 +88,11 @@ struct PowerSupplyPaths { char* batteryVoltagePath; char* batteryTemperaturePath; char* batteryTechnologyPath; #ifdef HAS_DOCK_BATTERY char* dockbatteryStatusPath; char* dockbatteryCapacityPath; char* dockbatteryPresentPath; #endif }; static PowerSupplyPaths gPaths; Loading @@ -99,6 +114,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: { LOGW("Unknown battery status '%s'", status); return gConstants.dockstatusUndocked; } } } #endif static jint getBatteryHealth(const char* status) { switch (status[0]) { Loading Loading @@ -219,6 +249,10 @@ static void android_server_BatteryService_update(JNIEnv* env, jobject obj) setBooleanField(env, obj, gPaths.usbOnlinePath, gFieldIds.mUsbOnline); setBooleanField(env, obj, gPaths.batteryPresentPath, gFieldIds.mBatteryPresent); #ifdef HAS_DOCK_BATTERY setIntField(env, obj, gPaths.dockbatteryCapacityPath, gFieldIds.mDockBatteryLevel); #endif setPercentageField(env, obj, gPaths.batteryCapacityPath, gFieldIds.mBatteryLevel); setVoltageField(env, obj, gPaths.batteryVoltagePath, gFieldIds.mBatteryVoltage); setIntField(env, obj, gPaths.batteryTemperaturePath, gFieldIds.mBatteryTemperature); Loading @@ -232,6 +266,14 @@ static void android_server_BatteryService_update(JNIEnv* env, jobject obj) 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)); Loading Loading @@ -318,6 +360,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); Loading Loading @@ -358,6 +413,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.mBatteryStatus == NULL, "Unable to find BatteryService.BATTERY_STATUS_PATH"); Loading Loading @@ -411,6 +472,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)); } Loading Loading
core/java/android/os/BatteryManager.java +33 −0 Original line number Diff line number Diff line Loading @@ -27,6 +27,12 @@ public class BatteryManager { */ 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}: * integer containing the current health constant. Loading @@ -46,6 +52,18 @@ public class BatteryManager { */ 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}: * integer containing the maximum battery level. Loading Loading @@ -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. */ Loading
core/res/res/values/config.xml +3 −0 Original line number Diff line number Diff line Loading @@ -768,4 +768,7 @@ <!-- Workaround for devices with broken keyboards --> <bool name="config_forceDisableHardwareKeyboard">false</bool> <!-- Asus dock compatibility disabled by default --> <bool name="config_hasDockBattery">false</bool> </resources>
services/java/com/android/server/BatteryService.java +15 −0 Original line number Diff line number Diff line Loading @@ -105,6 +105,10 @@ class BatteryService extends Binder { private boolean mBatteryLevelCritical; private int mInvalidCharger; private int mDockBatteryStatus; private int mDockBatteryLevel; private String mDockBatteryPresent; private int mLastBatteryStatus; private int mLastBatteryHealth; private boolean mLastBatteryPresent; Loading @@ -117,6 +121,8 @@ class BatteryService extends Binder { private int mLowBatteryWarningLevel; private int mLowBatteryCloseWarningLevel; private boolean mHasDockBattery; private int mPlugType; private int mLastPlugType = -1; // Extra state so we can detect first run Loading @@ -140,6 +146,9 @@ class BatteryService extends Binder { mLowBatteryCloseWarningLevel = mContext.getResources().getInteger( com.android.internal.R.integer.config_lowBatteryCloseWarningLevel); 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 Loading Loading @@ -396,6 +405,12 @@ class BatteryService extends Binder { intent.putExtra(BatteryManager.EXTRA_TECHNOLOGY, mBatteryTechnology); intent.putExtra(BatteryManager.EXTRA_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 + Loading
services/jni/Android.mk +4 −0 Original line number Diff line number Diff line Loading @@ -41,6 +41,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)
services/jni/com_android_server_BatteryService.cpp +72 −0 Original line number Diff line number Diff line Loading @@ -49,6 +49,11 @@ struct FieldIds { jfieldID mBatteryVoltage; jfieldID mBatteryTemperature; jfieldID mBatteryTechnology; #ifdef HAS_DOCK_BATTERY jfieldID mDockBatteryStatus; jfieldID mDockBatteryLevel; jfieldID mDockBatteryPresent; #endif }; static FieldIds gFieldIds; Loading @@ -65,6 +70,11 @@ struct BatteryManagerConstants { jint healthOverVoltage; jint healthUnspecifiedFailure; jint healthCold; #ifdef HAS_DOCK_BATTERY jint dockstatusCharging; jint dockstatusNotCharging; jint dockstatusUndocked; #endif }; static BatteryManagerConstants gConstants; Loading @@ -78,6 +88,11 @@ struct PowerSupplyPaths { char* batteryVoltagePath; char* batteryTemperaturePath; char* batteryTechnologyPath; #ifdef HAS_DOCK_BATTERY char* dockbatteryStatusPath; char* dockbatteryCapacityPath; char* dockbatteryPresentPath; #endif }; static PowerSupplyPaths gPaths; Loading @@ -99,6 +114,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: { LOGW("Unknown battery status '%s'", status); return gConstants.dockstatusUndocked; } } } #endif static jint getBatteryHealth(const char* status) { switch (status[0]) { Loading Loading @@ -219,6 +249,10 @@ static void android_server_BatteryService_update(JNIEnv* env, jobject obj) setBooleanField(env, obj, gPaths.usbOnlinePath, gFieldIds.mUsbOnline); setBooleanField(env, obj, gPaths.batteryPresentPath, gFieldIds.mBatteryPresent); #ifdef HAS_DOCK_BATTERY setIntField(env, obj, gPaths.dockbatteryCapacityPath, gFieldIds.mDockBatteryLevel); #endif setPercentageField(env, obj, gPaths.batteryCapacityPath, gFieldIds.mBatteryLevel); setVoltageField(env, obj, gPaths.batteryVoltagePath, gFieldIds.mBatteryVoltage); setIntField(env, obj, gPaths.batteryTemperaturePath, gFieldIds.mBatteryTemperature); Loading @@ -232,6 +266,14 @@ static void android_server_BatteryService_update(JNIEnv* env, jobject obj) 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)); Loading Loading @@ -318,6 +360,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); Loading Loading @@ -358,6 +413,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.mBatteryStatus == NULL, "Unable to find BatteryService.BATTERY_STATUS_PATH"); Loading Loading @@ -411,6 +472,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)); } Loading