diff options
Diffstat (limited to 'services/java/com/android/server/BatteryService.java')
| -rw-r--r-- | services/java/com/android/server/BatteryService.java | 105 |
1 files changed, 62 insertions, 43 deletions
diff --git a/services/java/com/android/server/BatteryService.java b/services/java/com/android/server/BatteryService.java index 5dbc2e4..08d9ffa 100644 --- a/services/java/com/android/server/BatteryService.java +++ b/services/java/com/android/server/BatteryService.java @@ -17,18 +17,23 @@ package com.android.server; import com.android.internal.app.IBatteryStats; +import com.android.internal.os.DeviceDockBatteryHandler; +import com.android.internal.os.IDeviceHandler; import com.android.server.am.BatteryStatsService; import android.app.ActivityManagerNative; +import android.content.BroadcastReceiver; import android.content.ContentResolver; import android.content.Context; import android.content.Intent; +import android.content.IntentFilter; import android.content.pm.PackageManager; import android.content.res.Resources; import android.database.ContentObserver; import android.graphics.Color; import android.os.BatteryManager; import android.os.Binder; +import android.os.Bundle; import android.os.FileUtils; import android.os.Handler; import android.os.IBinder; @@ -65,7 +70,7 @@ import java.util.Calendar; * <p>"present" - boolean, true if the battery is present<br /> * <p>"icon-small" - int, suggested small icon to use for this state</p> * <p>"plugged" - int, 0 if the device is not plugged in; 1 if plugged - * into an AC power adapter; 2 if plugged in via USB.</p> + * into an AC power adapter; 2 if plugged in via USB; 4 if plugged in via Wireless.</p> * <p>"voltage" - int, current battery voltage in millivolts</p> * <p>"temperature" - int, current battery temperature in tenths of * a degree Centigrade</p> @@ -129,15 +134,9 @@ public final class BatteryService extends Binder { private boolean mLastBatteryLevelCritical; private int mLastInvalidCharger; + // Device specific handler for extra dock battery private boolean mHasDockBattery; - - private int mDockBatteryStatus; - private int mDockBatteryLevel; - private boolean mDockBatteryPresent; - - private int mLastDockBatteryStatus; - private int mLastDockBatteryLevel; - private boolean mLastDockBatteryPresent; + private DeviceDockBatteryHandler mDeviceDockBattery; private int mLowBatteryWarningLevel; private int mLowBatteryCloseWarningLevel; @@ -168,7 +167,7 @@ public final class BatteryService extends Binder { private int mQuietHoursEnd = 0; private boolean mQuietHoursDim = true; - public BatteryService(Context context, LightsService lights) { + public BatteryService(Context context, LightsService lights, IDeviceHandler deviceHandler) { mContext = context; mHandler = new Handler(true /*async*/); mLed = new Led(context, lights); @@ -183,8 +182,19 @@ public final class BatteryService extends Binder { mShutdownBatteryTemperature = mContext.getResources().getInteger( com.android.internal.R.integer.config_shutdownBatteryTemperature); + // Has Dock battery? and device specific handler? mHasDockBattery = mContext.getResources().getBoolean( com.android.internal.R.bool.config_hasDockBattery); + if (mHasDockBattery) { + if (deviceHandler != null) { + mDeviceDockBattery = deviceHandler.getDeviceDockBatteryHandler(); + + // Force an update of the data when dock state change + IntentFilter filter = new IntentFilter(); + filter.addAction(Intent.ACTION_DOCK_EVENT); + context.registerReceiver(mDockReceiver, filter); + } + } mPowerSupplyObserver.startObserving("SUBSYSTEM=power_supply"); @@ -226,6 +236,7 @@ public final class BatteryService extends Binder { if (mBatteryStatus == BatteryManager.BATTERY_STATUS_UNKNOWN) { return true; } + // mAcOnline is used for main ac and dock battery ac if ((plugTypeSet & BatteryManager.BATTERY_PLUGGED_AC) != 0 && mAcOnline) { return true; } @@ -306,6 +317,9 @@ public final class BatteryService extends Binder { if (!mUpdatesStopped) { // Update the values of mAcOnline, et. all. native_update(); + if (mDeviceDockBattery != null) { + mDeviceDockBattery.update(); + } // Process the new values. processValuesLocked(); @@ -316,8 +330,14 @@ public final class BatteryService extends Binder { boolean logOutlier = false; long dischargeDuration = 0; + // Process the dock battery values + if (mDeviceDockBattery != null) { + mDeviceDockBattery.process(); + } + mBatteryLevelCritical = (mBatteryLevel <= mCriticalBatteryLevel); - if (mAcOnline) { + if (mAcOnline || + (mDeviceDockBattery != null && mDeviceDockBattery.isPlugged())) { mPlugType = BatteryManager.BATTERY_PLUGGED_AC; } else if (mUsbOnline) { mPlugType = BatteryManager.BATTERY_PLUGGED_USB; @@ -328,6 +348,7 @@ public final class BatteryService extends Binder { } if (DEBUG) { + String dockValues = String.valueOf(mDeviceDockBattery); Slog.d(TAG, "Processing new values: " + "mAcOnline=" + mAcOnline + ", mUsbOnline=" + mUsbOnline @@ -340,7 +361,9 @@ public final class BatteryService extends Binder { + ", mBatteryVoltage=" + mBatteryVoltage + ", mBatteryTemperature=" + mBatteryTemperature + ", mBatteryLevelCritical=" + mBatteryLevelCritical - + ", mPlugType=" + mPlugType); + + ", mPlugType=" + mPlugType + + ", mHasDockBattery=" + mHasDockBattery + + ", mDeviceDockBattery=[" + dockValues + "]"); } // Let the battery stats keep track of the current level. @@ -355,12 +378,9 @@ public final class BatteryService extends Binder { shutdownIfNoPowerLocked(); shutdownIfOverTempLocked(); - boolean dockBatteryChanged = false; - if (mHasDockBattery && - (mDockBatteryLevel != mLastDockBatteryLevel || - mDockBatteryStatus != mLastDockBatteryStatus || - mDockBatteryPresent != mLastDockBatteryPresent)) { - dockBatteryChanged = true; + boolean dockBatteryHasNewData = false; + if (mDeviceDockBattery != null) { + dockBatteryHasNewData = mDeviceDockBattery.hasNewData(); } if (mBatteryStatus != mLastBatteryStatus || @@ -371,7 +391,7 @@ public final class BatteryService extends Binder { mBatteryVoltage != mLastBatteryVoltage || mBatteryTemperature != mLastBatteryTemperature || mInvalidCharger != mLastInvalidCharger || - dockBatteryChanged) { + dockBatteryHasNewData) { if (mPlugType != mLastPlugType) { if (mLastPlugType == BATTERY_PLUGGED_NONE) { @@ -494,12 +514,6 @@ public final class BatteryService extends Binder { mLastBatteryTemperature = mBatteryTemperature; mLastBatteryLevelCritical = mBatteryLevelCritical; mLastInvalidCharger = mInvalidCharger; - - if (mHasDockBattery) { - mLastDockBatteryLevel = mDockBatteryLevel; - mLastDockBatteryStatus = mDockBatteryStatus; - mLastDockBatteryPresent = mDockBatteryPresent; - } } } @@ -509,6 +523,11 @@ public final class BatteryService extends Binder { intent.addFlags(Intent.FLAG_RECEIVER_REGISTERED_ONLY | Intent.FLAG_RECEIVER_REPLACE_PENDING); + Bundle dockData = new Bundle(); + if (mDeviceDockBattery != null) { + dockData = mDeviceDockBattery.getNotifyData(); + } + int icon = getIconLocked(mBatteryLevel); intent.putExtra(BatteryManager.EXTRA_STATUS, mBatteryStatus); @@ -522,8 +541,13 @@ public final class BatteryService extends Binder { intent.putExtra(BatteryManager.EXTRA_TEMPERATURE, mBatteryTemperature); intent.putExtra(BatteryManager.EXTRA_TECHNOLOGY, mBatteryTechnology); intent.putExtra(BatteryManager.EXTRA_INVALID_CHARGER, mInvalidCharger); + intent.putExtras(dockData); if (DEBUG) { + String dockDebug = ""; + for (String key : dockData.keySet()) { + dockDebug += ", " + key + ": " + String.valueOf(dockData.get(key)); + } Slog.d(TAG, "Sending ACTION_BATTERY_CHANGED. level:" + mBatteryLevel + ", scale:" + BATTERY_SCALE + ", status:" + mBatteryStatus + ", health:" + mBatteryHealth + ", present:" + mBatteryPresent + @@ -532,24 +556,8 @@ public final class BatteryService extends Binder { ", technology: " + mBatteryTechnology + ", AC powered:" + mAcOnline + ", USB powered:" + mUsbOnline + ", Wireless powered:" + mWirelessOnline + - ", icon:" + icon + ", invalid charger:" + mInvalidCharger); - } - - if (mHasDockBattery){ - intent.putExtra(BatteryManager.EXTRA_DOCK_PRESENT, mDockBatteryPresent); - intent.putExtra(BatteryManager.EXTRA_DOCK_STATUS, mDockBatteryStatus); - intent.putExtra(BatteryManager.EXTRA_DOCK_LEVEL, mDockBatteryLevel); - } - - 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); + ", icon:" + icon + ", invalid charger:" + mInvalidCharger + + dockDebug); } mHandler.post(new Runnable() { @@ -711,6 +719,17 @@ public final class BatteryService extends Binder { } } + private final BroadcastReceiver mDockReceiver = new BroadcastReceiver() { + @Override + public void onReceive(Context context, Intent intent) { + if (Intent.ACTION_DOCK_EVENT.equals(intent.getAction())) { + synchronized (mLock) { + updateLocked(); + } + } + } + }; + private final UEventObserver mPowerSupplyObserver = new UEventObserver() { @Override public void onUEvent(UEventObserver.UEvent event) { |
