summaryrefslogtreecommitdiffstats
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
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
-rw-r--r--core/java/android/os/BatteryManager.java28
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/policy/DockBatteryController.java83
-rw-r--r--services/java/com/android/server/BatteryService.java38
-rw-r--r--services/jni/com_android_server_BatteryService.cpp74
4 files changed, 125 insertions, 98 deletions
diff --git a/core/java/android/os/BatteryManager.java b/core/java/android/os/BatteryManager.java
index 9636b98..9822219 100644
--- a/core/java/android/os/BatteryManager.java
+++ b/core/java/android/os/BatteryManager.java
@@ -44,7 +44,13 @@ public class BatteryManager {
* boolean indicating whether a battery is present.
*/
public static final String EXTRA_PRESENT = "present";
-
+
+ /**
+ * Integer containing the current status constant for the dock battery.
+ * @hide
+ */
+ public static final String EXTRA_DOCK_PRESENT = "dock_present";
+
/**
* Extra for {@link android.content.Intent#ACTION_BATTERY_CHANGED}:
* integer field containing the current battery level, from 0 to
@@ -59,12 +65,6 @@ public class BatteryManager {
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.
*/
@@ -128,19 +128,11 @@ public class BatteryManager {
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;
-
+ public static final int DOCK_BATTERY_STATUS_UNKNOWN = 1;
/** @hide */
- public static final int DOCK_STATE_DOCKED = 3;
-
+ public static final int DOCK_BATTERY_STATUS_CHARGING = 2;
/** @hide */
- public static final int DOCK_STATE_DISCHARGING = 4;
+ public static final int DOCK_BATTERY_STATUS_NOT_CHARGING = 4;
// values of the "plugged" field in the ACTION_BATTERY_CHANGED intent.
// These must be powers of 2.
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/policy/DockBatteryController.java b/packages/SystemUI/src/com/android/systemui/statusbar/policy/DockBatteryController.java
index 2266b12..f022839 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/policy/DockBatteryController.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/policy/DockBatteryController.java
@@ -40,22 +40,22 @@ public class DockBatteryController extends BroadcastReceiver {
private ArrayList<ImageView> mIconViews = new ArrayList<ImageView>();
private ArrayList<TextView> mLabelViews = new ArrayList<TextView>();
- private static final int BATTERY_STYLE_NORMAL = 0;
- private static final int BATTERY_STYLE_TEXT = 1;
- private static final int BATTERY_STYLE_GONE = 2;
+ private static final int BATTERY_STYLE_NORMAL = 0;
+ private static final int BATTERY_STYLE_TEXT = 1;
+ private static final int BATTERY_STYLE_HIDE = 2;
- private static final int BATTERY_ICON_STYLE_NORMAL = R.drawable.stat_sys_kb_battery;
- private static final int BATTERY_ICON_STYLE_CHARGE = R.drawable.stat_sys_kb_battery_charge;
+ private static final int BATTERY_ICON_STYLE_UNKNOWN = R.drawable.stat_sys_kb_battery_unknown;
+ private static final int BATTERY_ICON_STYLE_NORMAL = R.drawable.stat_sys_kb_battery;
+ private static final int BATTERY_ICON_STYLE_CHARGE = R.drawable.stat_sys_kb_battery_charge;
- private boolean mDockStatus = false;
- private boolean mDockCharging = false;
+ private int mDockStatus = BatteryManager.DOCK_BATTERY_STATUS_UNKNOWN;
+ private boolean mDockPresent = false;
private int mBatteryStyle;
- private int mBatteryIcon = BATTERY_ICON_STYLE_NORMAL;
- private static final int BATTERY_TEXT_STYLE_NORMAL = R.string.status_bar_settings_battery_meter_format;
- private static final int BATTERY_TEXT_STYLE_MIN = R.string.status_bar_settings_battery_meter_min_format;
+ private static final int BATTERY_TEXT_STYLE_MIN =
+ R.string.status_bar_settings_battery_meter_min_format;
- Handler mHandler;
+ private Handler mHandler;
class SettingsObserver extends ContentObserver {
SettingsObserver(Handler handler) {
@@ -68,7 +68,8 @@ public class DockBatteryController extends BroadcastReceiver {
Settings.System.STATUS_BAR_BATTERY), false, this);
}
- @Override public void onChange(boolean selfChange) {
+ @Override
+ public void onChange(boolean selfChange) {
updateSettings();
}
}
@@ -98,52 +99,59 @@ public class DockBatteryController extends BroadcastReceiver {
final String action = intent.getAction();
if (action.equals(Intent.ACTION_BATTERY_CHANGED)) {
final int level = intent.getIntExtra(BatteryManager.EXTRA_DOCK_LEVEL, 0);
- mDockCharging = intent.getIntExtra(BatteryManager.EXTRA_DOCK_STATUS, 0) == BatteryManager.DOCK_STATE_CHARGING;
- mDockStatus = intent.getIntExtra(BatteryManager.EXTRA_DOCK_STATUS, 0) != BatteryManager.DOCK_STATE_UNDOCKED;
+ mDockStatus = intent.getIntExtra(BatteryManager.EXTRA_DOCK_STATUS,
+ BatteryManager.DOCK_BATTERY_STATUS_UNKNOWN);
+ mDockPresent = intent.getBooleanExtra(BatteryManager.EXTRA_DOCK_PRESENT,
+ false);
int N = mIconViews.size();
- for (int i=0; i<N; i++) {
+ for (int i = 0; i < N; i++) {
ImageView v = mIconViews.get(i);
v.setImageLevel(level);
v.setContentDescription(mContext.getString(R.string.accessibility_battery_level,
level));
}
+
N = mLabelViews.size();
- for (int i=0; i<N; i++) {
+ for (int i = 0; i < N; i++) {
TextView v = mLabelViews.get(i);
- v.setText(mContext.getString(BATTERY_TEXT_STYLE_MIN,
- level));
+ v.setText(mContext.getString(BATTERY_TEXT_STYLE_MIN, level));
}
+
updateBattery();
}
}
private void updateBattery() {
- int mIcon = View.GONE;
- int mText = View.GONE;
- int mIconStyle = BATTERY_ICON_STYLE_NORMAL;
-
- if (mBatteryStyle == 0) {
- mIcon = mDockStatus ? (View.VISIBLE) : (View.GONE);
- mIconStyle = mDockCharging ? BATTERY_ICON_STYLE_CHARGE
- : BATTERY_ICON_STYLE_NORMAL;
- } else if(mBatteryStyle == 1){
- mIcon = mDockStatus ? (View.VISIBLE) : (View.GONE);
- mText = mDockStatus ? (View.VISIBLE) : (View.GONE);
- mIconStyle = mDockCharging ? BATTERY_ICON_STYLE_CHARGE
- : BATTERY_ICON_STYLE_NORMAL;
+ int icon = View.GONE;
+ int text = View.GONE;
+ int iconStyle = BATTERY_ICON_STYLE_UNKNOWN;
+
+ if (mDockPresent && mBatteryStyle != BATTERY_STYLE_HIDE) {
+ icon = View.VISIBLE;
+
+ if (mBatteryStyle == BATTERY_STYLE_TEXT) {
+ text = View.VISIBLE;
+ }
+
+ if (mDockStatus == BatteryManager.DOCK_BATTERY_STATUS_NOT_CHARGING) {
+ iconStyle = BATTERY_ICON_STYLE_NORMAL;
+ } else if (mDockStatus == BatteryManager.DOCK_BATTERY_STATUS_CHARGING) {
+ iconStyle = BATTERY_ICON_STYLE_CHARGE;
+ }
}
int N = mIconViews.size();
- for (int i=0; i<N; i++) {
+ for (int i = 0; i < N; i++) {
ImageView v = mIconViews.get(i);
- v.setVisibility(mIcon);
- v.setImageResource(mIconStyle);
+ v.setVisibility(icon);
+ v.setImageResource(iconStyle);
}
+
N = mLabelViews.size();
- for (int i=0; i<N; i++) {
+ for (int i = 0; i < N; i++) {
TextView v = mLabelViews.get(i);
- v.setVisibility(mText);
+ v.setVisibility(text);
}
}
@@ -151,7 +159,8 @@ public class DockBatteryController extends BroadcastReceiver {
ContentResolver resolver = mContext.getContentResolver();
mBatteryStyle = (Settings.System.getInt(resolver,
- Settings.System.STATUS_BAR_BATTERY, 0));
+ Settings.System.STATUS_BAR_BATTERY, BATTERY_STYLE_NORMAL));
+
updateBattery();
}
}
diff --git a/services/java/com/android/server/BatteryService.java b/services/java/com/android/server/BatteryService.java
index e0ce8ac..73f9fc3 100644
--- a/services/java/com/android/server/BatteryService.java
+++ b/services/java/com/android/server/BatteryService.java
@@ -117,12 +117,9 @@ public final class BatteryService extends Binder {
private int mBatteryTemperature;
private String mBatteryTechnology;
private boolean mBatteryLevelCritical;
+ private int mInvalidCharger;
/* End native fields. */
- private int mDockBatteryStatus;
- private int mDockBatteryLevel;
- private String mDockBatteryPresent;
-
private int mLastBatteryStatus;
private int mLastBatteryHealth;
private boolean mLastBatteryPresent;
@@ -130,16 +127,22 @@ public final class BatteryService extends Binder {
private int mLastBatteryVoltage;
private int mLastBatteryTemperature;
private boolean mLastBatteryLevelCritical;
-
- private int mInvalidCharger;
private int mLastInvalidCharger;
+ private boolean mHasDockBattery;
+
+ private int mDockBatteryStatus;
+ private int mDockBatteryLevel;
+ private boolean mDockBatteryPresent;
+
+ private int mLastDockBatteryStatus;
+ private int mLastDockBatteryLevel;
+ private boolean mLastDockBatteryPresent;
+
private int mLowBatteryWarningLevel;
private int mLowBatteryCloseWarningLevel;
private int mShutdownBatteryTemperature;
- private boolean mHasDockBattery;
-
private int mPlugType;
private int mLastPlugType = -1; // Extra state so we can detect first run
@@ -352,6 +355,14 @@ public final class BatteryService extends Binder {
shutdownIfNoPowerLocked();
shutdownIfOverTempLocked();
+ boolean dockBatteryChanged = false;
+ if (mHasDockBattery &&
+ (mDockBatteryLevel != mLastDockBatteryLevel ||
+ mDockBatteryStatus != mLastDockBatteryStatus ||
+ mDockBatteryPresent != mLastDockBatteryPresent)) {
+ dockBatteryChanged = true;
+ }
+
if (mBatteryStatus != mLastBatteryStatus ||
mBatteryHealth != mLastBatteryHealth ||
mBatteryPresent != mLastBatteryPresent ||
@@ -359,7 +370,8 @@ public final class BatteryService extends Binder {
mPlugType != mLastPlugType ||
mBatteryVoltage != mLastBatteryVoltage ||
mBatteryTemperature != mLastBatteryTemperature ||
- mInvalidCharger != mLastInvalidCharger) {
+ mInvalidCharger != mLastInvalidCharger ||
+ dockBatteryChanged) {
if (mPlugType != mLastPlugType) {
if (mLastPlugType == BATTERY_PLUGGED_NONE) {
@@ -482,6 +494,12 @@ public final class BatteryService extends Binder {
mLastBatteryTemperature = mBatteryTemperature;
mLastBatteryLevelCritical = mBatteryLevelCritical;
mLastInvalidCharger = mInvalidCharger;
+
+ if (mHasDockBattery) {
+ mLastDockBatteryLevel = mDockBatteryLevel;
+ mLastDockBatteryStatus = mDockBatteryStatus;
+ mLastDockBatteryPresent = mDockBatteryPresent;
+ }
}
}
@@ -518,9 +536,9 @@ public final class BatteryService extends Binder {
}
if (mHasDockBattery){
+ intent.putExtra(BatteryManager.EXTRA_DOCK_PRESENT, mDockBatteryPresent);
intent.putExtra(BatteryManager.EXTRA_DOCK_STATUS, mDockBatteryStatus);
intent.putExtra(BatteryManager.EXTRA_DOCK_LEVEL, mDockBatteryLevel);
- intent.putExtra(BatteryManager.EXTRA_DOCK_AC_ONLINE, false);
}
if (false) {
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));