diff options
author | Dianne Hackborn <hackbod@google.com> | 2011-03-09 15:47:24 -0800 |
---|---|---|
committer | Android (Google) Code Review <android-gerrit@google.com> | 2011-03-09 15:47:24 -0800 |
commit | 7b5cb3c033f758368580664a8bdad43b47f3682d (patch) | |
tree | 1e33377e614c80a3a4c1b23359e6d62a8ac4bc92 /core/java/com | |
parent | 564f12ebe409bead467eee04dfd719e97367e520 (diff) | |
parent | 32de2f67ea8276086ae91cbda1d0ef06caf4b3cb (diff) | |
download | frameworks_base-7b5cb3c033f758368580664a8bdad43b47f3682d.zip frameworks_base-7b5cb3c033f758368580664a8bdad43b47f3682d.tar.gz frameworks_base-7b5cb3c033f758368580664a8bdad43b47f3682d.tar.bz2 |
Merge "Fix issue #4068088: NPE at com.android.internal.os.BatteryStatsImpl..." into honeycomb-mr1
Diffstat (limited to 'core/java/com')
-rw-r--r-- | core/java/com/android/internal/os/BatteryStatsImpl.java | 244 |
1 files changed, 125 insertions, 119 deletions
diff --git a/core/java/com/android/internal/os/BatteryStatsImpl.java b/core/java/com/android/internal/os/BatteryStatsImpl.java index 1cca21d..d86504d 100644 --- a/core/java/com/android/internal/os/BatteryStatsImpl.java +++ b/core/java/com/android/internal/os/BatteryStatsImpl.java @@ -1581,7 +1581,7 @@ public final class BatteryStatsImpl extends BatteryStats { // Update discharge amounts. if (mOnBatteryInternal) { - updateDischargeScreenLevels(false, true); + updateDischargeScreenLevelsLocked(false, true); } } } @@ -1602,7 +1602,7 @@ public final class BatteryStatsImpl extends BatteryStats { // Update discharge amounts. if (mOnBatteryInternal) { - updateDischargeScreenLevels(true, false); + updateDischargeScreenLevelsLocked(true, false); } } } @@ -4030,7 +4030,7 @@ public final class BatteryStatsImpl extends BatteryStats { clearHistoryLocked(); } - void updateDischargeScreenLevels(boolean oldScreenOn, boolean newScreenOn) { + void updateDischargeScreenLevelsLocked(boolean oldScreenOn, boolean newScreenOn) { if (oldScreenOn) { int diff = mDischargeScreenOnUnplugLevel - mDischargeCurrentLevel; if (diff > 0) { @@ -4055,69 +4055,73 @@ public final class BatteryStatsImpl extends BatteryStats { void setOnBattery(boolean onBattery, int oldStatus, int level) { synchronized(this) { - boolean doWrite = false; - Message m = mHandler.obtainMessage(MSG_REPORT_POWER_CHANGE); - m.arg1 = onBattery ? 1 : 0; - mHandler.sendMessage(m); - mOnBattery = mOnBatteryInternal = onBattery; - - long uptime = SystemClock.uptimeMillis() * 1000; - long mSecRealtime = SystemClock.elapsedRealtime(); - long realtime = mSecRealtime * 1000; - if (onBattery) { - // We will reset our status if we are unplugging after the - // battery was last full, or the level is at 100, or - // we have gone through a significant charge (from a very low - // level to a now very high level). - if (oldStatus == BatteryManager.BATTERY_STATUS_FULL - || level >= 90 - || (mDischargeCurrentLevel < 20 && level >= 80)) { - doWrite = true; - resetAllStatsLocked(); - mDischargeStartLevel = level; - } - updateKernelWakelocksLocked(); - mHistoryCur.batteryLevel = (byte)level; - mHistoryCur.states &= ~HistoryItem.STATE_BATTERY_PLUGGED_FLAG; - if (DEBUG_HISTORY) Slog.v(TAG, "Battery unplugged to: " - + Integer.toHexString(mHistoryCur.states)); - addHistoryRecordLocked(mSecRealtime); - mTrackBatteryUptimeStart = uptime; - mTrackBatteryRealtimeStart = realtime; - mUnpluggedBatteryUptime = getBatteryUptimeLocked(uptime); - mUnpluggedBatteryRealtime = getBatteryRealtimeLocked(realtime); - mDischargeCurrentLevel = mDischargeUnplugLevel = level; - if (mScreenOn) { - mDischargeScreenOnUnplugLevel = level; - mDischargeScreenOffUnplugLevel = 0; - } else { - mDischargeScreenOnUnplugLevel = 0; - mDischargeScreenOffUnplugLevel = level; - } - mDischargeAmountScreenOn = 0; - mDischargeAmountScreenOff = 0; - doUnplugLocked(mUnpluggedBatteryUptime, mUnpluggedBatteryRealtime); + setOnBatteryLocked(onBattery, oldStatus, level); + } + } + + void setOnBatteryLocked(boolean onBattery, int oldStatus, int level) { + boolean doWrite = false; + Message m = mHandler.obtainMessage(MSG_REPORT_POWER_CHANGE); + m.arg1 = onBattery ? 1 : 0; + mHandler.sendMessage(m); + mOnBattery = mOnBatteryInternal = onBattery; + + long uptime = SystemClock.uptimeMillis() * 1000; + long mSecRealtime = SystemClock.elapsedRealtime(); + long realtime = mSecRealtime * 1000; + if (onBattery) { + // We will reset our status if we are unplugging after the + // battery was last full, or the level is at 100, or + // we have gone through a significant charge (from a very low + // level to a now very high level). + if (oldStatus == BatteryManager.BATTERY_STATUS_FULL + || level >= 90 + || (mDischargeCurrentLevel < 20 && level >= 80)) { + doWrite = true; + resetAllStatsLocked(); + mDischargeStartLevel = level; + } + updateKernelWakelocksLocked(); + mHistoryCur.batteryLevel = (byte)level; + mHistoryCur.states &= ~HistoryItem.STATE_BATTERY_PLUGGED_FLAG; + if (DEBUG_HISTORY) Slog.v(TAG, "Battery unplugged to: " + + Integer.toHexString(mHistoryCur.states)); + addHistoryRecordLocked(mSecRealtime); + mTrackBatteryUptimeStart = uptime; + mTrackBatteryRealtimeStart = realtime; + mUnpluggedBatteryUptime = getBatteryUptimeLocked(uptime); + mUnpluggedBatteryRealtime = getBatteryRealtimeLocked(realtime); + mDischargeCurrentLevel = mDischargeUnplugLevel = level; + if (mScreenOn) { + mDischargeScreenOnUnplugLevel = level; + mDischargeScreenOffUnplugLevel = 0; } else { - updateKernelWakelocksLocked(); - mHistoryCur.batteryLevel = (byte)level; - mHistoryCur.states |= HistoryItem.STATE_BATTERY_PLUGGED_FLAG; - if (DEBUG_HISTORY) Slog.v(TAG, "Battery plugged to: " - + Integer.toHexString(mHistoryCur.states)); - addHistoryRecordLocked(mSecRealtime); - mTrackBatteryPastUptime += uptime - mTrackBatteryUptimeStart; - mTrackBatteryPastRealtime += realtime - mTrackBatteryRealtimeStart; - mDischargeCurrentLevel = level; - if (level < mDischargeUnplugLevel) { - mLowDischargeAmountSinceCharge += mDischargeUnplugLevel-level-1; - mHighDischargeAmountSinceCharge += mDischargeUnplugLevel-level; - } - updateDischargeScreenLevels(mScreenOn, mScreenOn); - doPlugLocked(getBatteryUptimeLocked(uptime), getBatteryRealtimeLocked(realtime)); + mDischargeScreenOnUnplugLevel = 0; + mDischargeScreenOffUnplugLevel = level; } - if (doWrite || (mLastWriteTime + (60 * 1000)) < mSecRealtime) { - if (mFile != null) { - writeAsyncLocked(); - } + mDischargeAmountScreenOn = 0; + mDischargeAmountScreenOff = 0; + doUnplugLocked(mUnpluggedBatteryUptime, mUnpluggedBatteryRealtime); + } else { + updateKernelWakelocksLocked(); + mHistoryCur.batteryLevel = (byte)level; + mHistoryCur.states |= HistoryItem.STATE_BATTERY_PLUGGED_FLAG; + if (DEBUG_HISTORY) Slog.v(TAG, "Battery plugged to: " + + Integer.toHexString(mHistoryCur.states)); + addHistoryRecordLocked(mSecRealtime); + mTrackBatteryPastUptime += uptime - mTrackBatteryUptimeStart; + mTrackBatteryPastRealtime += realtime - mTrackBatteryRealtimeStart; + mDischargeCurrentLevel = level; + if (level < mDischargeUnplugLevel) { + mLowDischargeAmountSinceCharge += mDischargeUnplugLevel-level-1; + mHighDischargeAmountSinceCharge += mDischargeUnplugLevel-level; + } + updateDischargeScreenLevelsLocked(mScreenOn, mScreenOn); + doPlugLocked(getBatteryUptimeLocked(uptime), getBatteryRealtimeLocked(realtime)); + } + if (doWrite || (mLastWriteTime + (60 * 1000)) < mSecRealtime) { + if (mFile != null) { + writeAsyncLocked(); } } } @@ -4127,72 +4131,74 @@ public final class BatteryStatsImpl extends BatteryStats { public void setBatteryState(int status, int health, int plugType, int level, int temp, int volt) { - boolean onBattery = plugType == BATTERY_PLUGGED_NONE; - int oldStatus = mHistoryCur.batteryStatus; - if (!mHaveBatteryLevel) { - mHaveBatteryLevel = true; - // We start out assuming that the device is plugged in (not - // on battery). If our first report is now that we are indeed - // plugged in, then twiddle our state to correctly reflect that - // since we won't be going through the full setOnBattery(). - if (onBattery == mOnBattery) { - if (onBattery) { - mHistoryCur.states &= ~HistoryItem.STATE_BATTERY_PLUGGED_FLAG; - } else { - mHistoryCur.states |= HistoryItem.STATE_BATTERY_PLUGGED_FLAG; + synchronized(this) { + boolean onBattery = plugType == BATTERY_PLUGGED_NONE; + int oldStatus = mHistoryCur.batteryStatus; + if (!mHaveBatteryLevel) { + mHaveBatteryLevel = true; + // We start out assuming that the device is plugged in (not + // on battery). If our first report is now that we are indeed + // plugged in, then twiddle our state to correctly reflect that + // since we won't be going through the full setOnBattery(). + if (onBattery == mOnBattery) { + if (onBattery) { + mHistoryCur.states &= ~HistoryItem.STATE_BATTERY_PLUGGED_FLAG; + } else { + mHistoryCur.states |= HistoryItem.STATE_BATTERY_PLUGGED_FLAG; + } } + oldStatus = status; } - oldStatus = status; - } - if (onBattery) { - mDischargeCurrentLevel = level; - mRecordingHistory = true; - } - if (onBattery != mOnBattery) { - mHistoryCur.batteryLevel = (byte)level; - mHistoryCur.batteryStatus = (byte)status; - mHistoryCur.batteryHealth = (byte)health; - mHistoryCur.batteryPlugType = (byte)plugType; - mHistoryCur.batteryTemperature = (char)temp; - mHistoryCur.batteryVoltage = (char)volt; - setOnBattery(onBattery, oldStatus, level); - } else { - boolean changed = false; - if (mHistoryCur.batteryLevel != level) { - mHistoryCur.batteryLevel = (byte)level; - changed = true; + if (onBattery) { + mDischargeCurrentLevel = level; + mRecordingHistory = true; } - if (mHistoryCur.batteryStatus != status) { + if (onBattery != mOnBattery) { + mHistoryCur.batteryLevel = (byte)level; mHistoryCur.batteryStatus = (byte)status; - changed = true; - } - if (mHistoryCur.batteryHealth != health) { mHistoryCur.batteryHealth = (byte)health; - changed = true; - } - if (mHistoryCur.batteryPlugType != plugType) { mHistoryCur.batteryPlugType = (byte)plugType; - changed = true; - } - if (temp >= (mHistoryCur.batteryTemperature+10) - || temp <= (mHistoryCur.batteryTemperature-10)) { mHistoryCur.batteryTemperature = (char)temp; - changed = true; - } - if (volt > (mHistoryCur.batteryVoltage+20) - || volt < (mHistoryCur.batteryVoltage-20)) { mHistoryCur.batteryVoltage = (char)volt; - changed = true; + setOnBatteryLocked(onBattery, oldStatus, level); + } else { + boolean changed = false; + if (mHistoryCur.batteryLevel != level) { + mHistoryCur.batteryLevel = (byte)level; + changed = true; + } + if (mHistoryCur.batteryStatus != status) { + mHistoryCur.batteryStatus = (byte)status; + changed = true; + } + if (mHistoryCur.batteryHealth != health) { + mHistoryCur.batteryHealth = (byte)health; + changed = true; + } + if (mHistoryCur.batteryPlugType != plugType) { + mHistoryCur.batteryPlugType = (byte)plugType; + changed = true; + } + if (temp >= (mHistoryCur.batteryTemperature+10) + || temp <= (mHistoryCur.batteryTemperature-10)) { + mHistoryCur.batteryTemperature = (char)temp; + changed = true; + } + if (volt > (mHistoryCur.batteryVoltage+20) + || volt < (mHistoryCur.batteryVoltage-20)) { + mHistoryCur.batteryVoltage = (char)volt; + changed = true; + } + if (changed) { + addHistoryRecordLocked(SystemClock.elapsedRealtime()); + } } - if (changed) { - addHistoryRecordLocked(SystemClock.elapsedRealtime()); + if (!onBattery && status == BatteryManager.BATTERY_STATUS_FULL) { + // We don't record history while we are plugged in and fully charged. + // The next time we are unplugged, history will be cleared. + mRecordingHistory = false; } } - if (!onBattery && status == BatteryManager.BATTERY_STATUS_FULL) { - // We don't record history while we are plugged in and fully charged. - // The next time we are unplugged, history will be cleared. - mRecordingHistory = false; - } } public void updateKernelWakelocksLocked() { |