Merge "Refine BatteryInfo and battery drawable" into oc-dev

am: 57af565fb7

Change-Id: Ie9fce326b23293e9f66d71f4be4b166aae310eb0
This commit is contained in:
Lei Yu
2017-04-13 21:52:40 +00:00
committed by android-build-merger
7 changed files with 60 additions and 33 deletions

View File

@@ -25,22 +25,21 @@ import android.os.BatteryStats.HistoryItem;
import android.os.Bundle; import android.os.Bundle;
import android.os.SystemClock; import android.os.SystemClock;
import android.text.format.Formatter; import android.text.format.Formatter;
import android.util.Log;
import android.util.SparseIntArray; import android.util.SparseIntArray;
import com.android.internal.os.BatteryStatsHelper; import com.android.internal.os.BatteryStatsHelper;
import com.android.settingslib.graph.UsageView; import com.android.settingslib.graph.UsageView;
public class BatteryInfo { public class BatteryInfo {
public String mChargeLabelString; public String chargeLabelString;
public int mBatteryLevel; public int batteryLevel;
public boolean mDischarging = true; public boolean discharging = true;
public long remainingTimeUs = 0; public long remainingTimeUs = 0;
public String batteryPercentString; public String batteryPercentString;
public String remainingLabel; public String remainingLabel;
public String statusLabel; public String statusLabel;
private BatteryStats mStats;
private boolean mCharging; private boolean mCharging;
private BatteryStats mStats;
private long timePeriod; private long timePeriod;
public interface Callback { public interface Callback {
@@ -132,10 +131,11 @@ public class BatteryInfo {
BatteryStats stats, long elapsedRealtimeUs, boolean shortString) { BatteryStats stats, long elapsedRealtimeUs, boolean shortString) {
BatteryInfo info = new BatteryInfo(); BatteryInfo info = new BatteryInfo();
info.mStats = stats; info.mStats = stats;
info.mBatteryLevel = Utils.getBatteryLevel(batteryBroadcast); info.batteryLevel = Utils.getBatteryLevel(batteryBroadcast);
info.batteryPercentString = Utils.formatPercentage(info.mBatteryLevel); info.batteryPercentString = Utils.formatPercentage(info.batteryLevel);
info.mCharging = batteryBroadcast.getIntExtra(BatteryManager.EXTRA_PLUGGED, 0) != 0; info.mCharging = batteryBroadcast.getIntExtra(BatteryManager.EXTRA_PLUGGED, 0) != 0;
final Resources resources = context.getResources(); final Resources resources = context.getResources();
info.statusLabel = Utils.getBatteryStatus(resources, batteryBroadcast); info.statusLabel = Utils.getBatteryStatus(resources, batteryBroadcast);
if (!info.mCharging) { if (!info.mCharging) {
final long drainTime = stats.computeBatteryTimeRemaining(elapsedRealtimeUs); final long drainTime = stats.computeBatteryTimeRemaining(elapsedRealtimeUs);
@@ -147,20 +147,20 @@ public class BatteryInfo {
shortString ? R.string.power_remaining_duration_only_short shortString ? R.string.power_remaining_duration_only_short
: R.string.power_remaining_duration_only, : R.string.power_remaining_duration_only,
timeString); timeString);
info.mChargeLabelString = resources.getString( info.chargeLabelString = resources.getString(
shortString ? R.string.power_discharging_duration_short shortString ? R.string.power_discharging_duration_short
: R.string.power_discharging_duration, : R.string.power_discharging_duration,
info.batteryPercentString, timeString); info.batteryPercentString, timeString);
} else { } else {
info.remainingLabel = null; info.remainingLabel = null;
info.mChargeLabelString = info.batteryPercentString; info.chargeLabelString = info.batteryPercentString;
} }
} else { } else {
final long chargeTime = stats.computeChargeTimeRemaining(elapsedRealtimeUs); final long chargeTime = stats.computeChargeTimeRemaining(elapsedRealtimeUs);
final int status = batteryBroadcast.getIntExtra(BatteryManager.EXTRA_STATUS, final int status = batteryBroadcast.getIntExtra(BatteryManager.EXTRA_STATUS,
BatteryManager.BATTERY_STATUS_UNKNOWN); BatteryManager.BATTERY_STATUS_UNKNOWN);
info.discharging = false;
if (chargeTime > 0 && status != BatteryManager.BATTERY_STATUS_FULL) { if (chargeTime > 0 && status != BatteryManager.BATTERY_STATUS_FULL) {
info.mDischarging = false;
info.remainingTimeUs = chargeTime; info.remainingTimeUs = chargeTime;
String timeString = Formatter.formatShortElapsedTime(context, String timeString = Formatter.formatShortElapsedTime(context,
chargeTime / 1000); chargeTime / 1000);
@@ -168,13 +168,13 @@ public class BatteryInfo {
: R.string.power_charging_duration; : R.string.power_charging_duration;
info.remainingLabel = resources.getString( info.remainingLabel = resources.getString(
R.string.power_remaining_charging_duration_only, timeString); R.string.power_remaining_charging_duration_only, timeString);
info.mChargeLabelString = resources.getString(resId, info.batteryPercentString, info.chargeLabelString = resources.getString(
timeString); resId, info.batteryPercentString, timeString);
} else { } else {
final String chargeStatusLabel = resources.getString( final String chargeStatusLabel = resources.getString(
R.string.battery_info_status_charging_lower); R.string.battery_info_status_charging_lower);
info.remainingLabel = null; info.remainingLabel = null;
info.mChargeLabelString = resources.getString( info.chargeLabelString = resources.getString(
R.string.power_charging, info.batteryPercentString, chargeStatusLabel); R.string.power_charging, info.batteryPercentString, chargeStatusLabel);
} }
} }

View File

@@ -40,9 +40,15 @@ public class BatteryMeterDrawableBase extends Drawable {
public static final String TAG = BatteryMeterDrawableBase.class.getSimpleName(); public static final String TAG = BatteryMeterDrawableBase.class.getSimpleName();
protected final Context mContext; protected final Context mContext;
protected final Paint mFramePaint;
protected final Paint mBatteryPaint;
protected final Paint mWarningTextPaint;
protected final Paint mTextPaint;
protected final Paint mBoltPaint;
protected final Paint mPlusPaint;
private int mLevel = -1; private int mLevel = -1;
private boolean mPluggedIn; private boolean mCharging;
private boolean mPowerSaveEnabled; private boolean mPowerSaveEnabled;
private boolean mShowPercent; private boolean mShowPercent;
@@ -59,8 +65,6 @@ public class BatteryMeterDrawableBase extends Drawable {
private float mButtonHeightFraction; private float mButtonHeightFraction;
private float mSubpixelSmoothingLeft; private float mSubpixelSmoothingLeft;
private float mSubpixelSmoothingRight; private float mSubpixelSmoothingRight;
private final Paint mFramePaint, mBatteryPaint, mWarningTextPaint, mTextPaint, mBoltPaint,
mPlusPaint;
private float mTextHeight, mWarningTextHeight; private float mTextHeight, mWarningTextHeight;
private int mIconTint = Color.WHITE; private int mIconTint = Color.WHITE;
private float mOldDarkIntensity = -1f; private float mOldDarkIntensity = -1f;
@@ -180,16 +184,24 @@ public class BatteryMeterDrawableBase extends Drawable {
postInvalidate(); postInvalidate();
} }
public void setPluggedIn(boolean val) { public void setCharging(boolean val) {
mPluggedIn = val; mCharging = val;
postInvalidate(); postInvalidate();
} }
public boolean getCharging() {
return mCharging;
}
public void setBatteryLevel(int val) { public void setBatteryLevel(int val) {
mLevel = val; mLevel = val;
postInvalidate(); postInvalidate();
} }
public int getBatteryLevel() {
return mLevel;
}
public void setPowerSave(boolean val) { public void setPowerSave(boolean val) {
mPowerSaveEnabled = val; mPowerSaveEnabled = val;
postInvalidate(); postInvalidate();
@@ -314,7 +326,7 @@ public class BatteryMeterDrawableBase extends Drawable {
mFrame.bottom -= mSubpixelSmoothingRight; mFrame.bottom -= mSubpixelSmoothingRight;
// set the battery charging color // set the battery charging color
mBatteryPaint.setColor(mPluggedIn ? mChargeColor : getColorForLevel(level)); mBatteryPaint.setColor(mCharging ? mChargeColor : getColorForLevel(level));
if (level >= FULL) { if (level >= FULL) {
drawFrac = 1f; drawFrac = 1f;
@@ -337,7 +349,7 @@ public class BatteryMeterDrawableBase extends Drawable {
mShapePath.lineTo(mButtonFrame.left, mFrame.top); mShapePath.lineTo(mButtonFrame.left, mFrame.top);
mShapePath.lineTo(mButtonFrame.left, mButtonFrame.top); mShapePath.lineTo(mButtonFrame.left, mButtonFrame.top);
if (mPluggedIn) { if (mCharging) {
// define the bolt shape // define the bolt shape
final float bl = mFrame.left + mFrame.width() / 4f; final float bl = mFrame.left + mFrame.width() / 4f;
final float bt = mFrame.top + mFrame.height() / 6f; final float bt = mFrame.top + mFrame.height() / 6f;
@@ -408,7 +420,7 @@ public class BatteryMeterDrawableBase extends Drawable {
boolean pctOpaque = false; boolean pctOpaque = false;
float pctX = 0, pctY = 0; float pctX = 0, pctY = 0;
String pctText = null; String pctText = null;
if (!mPluggedIn && !mPowerSaveEnabled && level > mCriticalLevel && mShowPercent) { if (!mCharging && !mPowerSaveEnabled && level > mCriticalLevel && mShowPercent) {
mTextPaint.setColor(getColorForLevel(level)); mTextPaint.setColor(getColorForLevel(level));
mTextPaint.setTextSize(height * mTextPaint.setTextSize(height *
(SINGLE_DIGIT_PERCENT ? 0.75f (SINGLE_DIGIT_PERCENT ? 0.75f
@@ -436,7 +448,7 @@ public class BatteryMeterDrawableBase extends Drawable {
mShapePath.op(mClipPath, Path.Op.INTERSECT); mShapePath.op(mClipPath, Path.Op.INTERSECT);
c.drawPath(mShapePath, mBatteryPaint); c.drawPath(mShapePath, mBatteryPaint);
if (!mPluggedIn && !mPowerSaveEnabled) { if (!mCharging && !mPowerSaveEnabled) {
if (level <= mCriticalLevel) { if (level <= mCriticalLevel) {
// draw the warning text // draw the warning text
final float x = mWidth * 0.5f; final float x = mWidth * 0.5f;
@@ -467,4 +479,8 @@ public class BatteryMeterDrawableBase extends Drawable {
public int getOpacity() { public int getOpacity() {
return 0; return 0;
} }
public int getCriticalLevel() {
return mCriticalLevel;
}
} }

View File

@@ -55,12 +55,12 @@ public class BatteryMeterDrawableBaseTest {
final int levels[] = { 0, 1, 5, 10, 25, 50, 75, 90, 95, 99, 100 }; final int levels[] = { 0, 1, 5, 10, 25, 50, 75, 90, 95, 99, 100 };
final boolean bools[] = { false, true }; final boolean bools[] = { false, true };
for (int l : levels) { for (int l : levels) {
for (boolean plugged : bools) { for (boolean charging : bools) {
for (boolean saver : bools) { for (boolean saver : bools) {
for (boolean percent : bools) { for (boolean percent : bools) {
mBatteryDrawable.setBatteryLevel(l); mBatteryDrawable.setBatteryLevel(l);
mBatteryDrawable.setPowerSave(saver); mBatteryDrawable.setPowerSave(saver);
mBatteryDrawable.setPluggedIn(plugged); mBatteryDrawable.setCharging(charging);
mBatteryDrawable.setShowPercent(percent); mBatteryDrawable.setShowPercent(percent);
mBatteryDrawable.draw(canvas); mBatteryDrawable.draw(canvas);
} }

View File

@@ -32,6 +32,7 @@ import org.robolectric.RobolectricTestRunner;
import org.robolectric.annotation.Config; import org.robolectric.annotation.Config;
import static com.google.common.truth.Truth.assertThat; import static com.google.common.truth.Truth.assertThat;
import static org.mockito.Matchers.any; import static org.mockito.Matchers.any;
import static org.mockito.Matchers.anyLong; import static org.mockito.Matchers.anyLong;
import static org.mockito.Matchers.eq; import static org.mockito.Matchers.eq;
@@ -44,10 +45,12 @@ public class BatteryInfoTest {
private static final String STATUS_FULL = "Full"; private static final String STATUS_FULL = "Full";
private static final String STATUS_CHARGING_NO_TIME = "Charging"; private static final String STATUS_CHARGING_NO_TIME = "Charging";
private static final String STATUS_CHARGING_TIME = "Charging - 2h left"; private static final String STATUS_CHARGING_TIME = "Charging - 2h left";
private static final int PLUGGED_IN = 1;
private static final long REMAINING_TIME_NULL = -1; private static final long REMAINING_TIME_NULL = -1;
private static final long REMAINING_TIME = 2; private static final long REMAINING_TIME = 2;
private Intent mDisChargingBatteryBroadcast; private Intent mDisChargingBatteryBroadcast;
private Intent mChargingBatteryBroadcast; private Intent mChargingBatteryBroadcast;
@Mock(answer = Answers.RETURNS_DEEP_STUBS) @Mock(answer = Answers.RETURNS_DEEP_STUBS)
private BatteryStats mBatteryStats; private BatteryStats mBatteryStats;
@Mock(answer = Answers.RETURNS_DEEP_STUBS) @Mock(answer = Answers.RETURNS_DEEP_STUBS)
@@ -95,7 +98,7 @@ public class BatteryInfoTest {
BatteryInfo info = BatteryInfo.getBatteryInfo(mContext, mChargingBatteryBroadcast, BatteryInfo info = BatteryInfo.getBatteryInfo(mContext, mChargingBatteryBroadcast,
mBatteryStats, SystemClock.elapsedRealtime() * 1000, false); mBatteryStats, SystemClock.elapsedRealtime() * 1000, false);
assertThat(info.mChargeLabelString).isEqualTo(STATUS_CHARGING_TIME); assertThat(info.chargeLabelString).isEqualTo(STATUS_CHARGING_TIME);
} }
@Test @Test
@@ -104,6 +107,14 @@ public class BatteryInfoTest {
BatteryInfo info = BatteryInfo.getBatteryInfo(mContext, mChargingBatteryBroadcast, BatteryInfo info = BatteryInfo.getBatteryInfo(mContext, mChargingBatteryBroadcast,
mBatteryStats, SystemClock.elapsedRealtime() * 1000, false); mBatteryStats, SystemClock.elapsedRealtime() * 1000, false);
assertThat(info.mChargeLabelString).isEqualTo(STATUS_CHARGING_NO_TIME); assertThat(info.chargeLabelString).isEqualTo(STATUS_CHARGING_NO_TIME);
}
@Test
public void testGetBatteryInfo_pluggedIn_dischargingFalse() {
BatteryInfo info = BatteryInfo.getBatteryInfo(mContext, mChargingBatteryBroadcast,
mBatteryStats, SystemClock.elapsedRealtime() * 1000, true);
assertThat(info.discharging).isEqualTo(false);
} }
} }

View File

@@ -149,7 +149,7 @@ public class BatteryMeterView extends LinearLayout implements
@Override @Override
public void onBatteryLevelChanged(int level, boolean pluggedIn, boolean charging) { public void onBatteryLevelChanged(int level, boolean pluggedIn, boolean charging) {
mDrawable.setBatteryLevel(level); mDrawable.setBatteryLevel(level);
mDrawable.setPluggedIn(pluggedIn); mDrawable.setCharging(pluggedIn);
mLevel = level; mLevel = level;
updatePercentText(); updatePercentText();
setContentDescription( setContentDescription(

View File

@@ -181,7 +181,7 @@ public class BatterySaverTile extends QSTileImpl<BooleanState> implements
return; return;
} }
mDrawable.setBatteryLevel(100); mDrawable.setBatteryLevel(100);
mDrawable.setPluggedIn(false); mDrawable.setCharging(false);
mDrawable.setPowerSave(true); mDrawable.setPowerSave(true);
mDrawable.setShowPercent(false); mDrawable.setShowPercent(false);
((ImageView) mCurrentView.findViewById(android.R.id.icon)).setImageDrawable(mDrawable); ((ImageView) mCurrentView.findViewById(android.R.id.icon)).setImageDrawable(mDrawable);

View File

@@ -53,7 +53,7 @@ public class BatteryMeterDrawableTest extends SysuiTestCase {
@Test @Test
public void testDrawImageButNoTextIfPluggedIn() { public void testDrawImageButNoTextIfPluggedIn() {
mBatteryMeter.setBatteryLevel(0); mBatteryMeter.setBatteryLevel(0);
mBatteryMeter.setPluggedIn(true); mBatteryMeter.setCharging(true);
final Canvas canvas = mock(Canvas.class); final Canvas canvas = mock(Canvas.class);
mBatteryMeter.draw(canvas); mBatteryMeter.draw(canvas);
verify(canvas, atLeastOnce()).drawPath(any(), any()); verify(canvas, atLeastOnce()).drawPath(any(), any());
@@ -63,7 +63,7 @@ public class BatteryMeterDrawableTest extends SysuiTestCase {
@Test @Test
public void testDrawTextIfNotPluggedIn() { public void testDrawTextIfNotPluggedIn() {
mBatteryMeter.setBatteryLevel(0); mBatteryMeter.setBatteryLevel(0);
mBatteryMeter.setPluggedIn(false); mBatteryMeter.setCharging(false);
final Canvas canvas = mock(Canvas.class); final Canvas canvas = mock(Canvas.class);
mBatteryMeter.draw(canvas); mBatteryMeter.draw(canvas);
verify(canvas, times(1)).drawText(anyString(), anyFloat(), anyFloat(), any()); verify(canvas, times(1)).drawText(anyString(), anyFloat(), anyFloat(), any());
@@ -72,7 +72,7 @@ public class BatteryMeterDrawableTest extends SysuiTestCase {
@Test @Test
public void testDrawNoTextIfPowerSaveEnabled() { public void testDrawNoTextIfPowerSaveEnabled() {
mBatteryMeter.setBatteryLevel(0); mBatteryMeter.setBatteryLevel(0);
mBatteryMeter.setPluggedIn(false); mBatteryMeter.setCharging(false);
mBatteryMeter.setPowerSave(true); mBatteryMeter.setPowerSave(true);
final Canvas canvas = mock(Canvas.class); final Canvas canvas = mock(Canvas.class);
mBatteryMeter.draw(canvas); mBatteryMeter.draw(canvas);
@@ -84,7 +84,7 @@ public class BatteryMeterDrawableTest extends SysuiTestCase {
int criticalLevel = mResources.getInteger( int criticalLevel = mResources.getInteger(
com.android.internal.R.integer.config_criticalBatteryWarningLevel); com.android.internal.R.integer.config_criticalBatteryWarningLevel);
mBatteryMeter.setBatteryLevel(criticalLevel); mBatteryMeter.setBatteryLevel(criticalLevel);
mBatteryMeter.setPluggedIn(false); mBatteryMeter.setCharging(false);
final Canvas canvas = mock(Canvas.class); final Canvas canvas = mock(Canvas.class);
mBatteryMeter.draw(canvas); mBatteryMeter.draw(canvas);
String warningString = mResources.getString(R.string.battery_meter_very_low_overlay_symbol); String warningString = mResources.getString(R.string.battery_meter_very_low_overlay_symbol);
@@ -96,7 +96,7 @@ public class BatteryMeterDrawableTest extends SysuiTestCase {
int criticalLevel = mResources.getInteger( int criticalLevel = mResources.getInteger(
com.android.internal.R.integer.config_criticalBatteryWarningLevel); com.android.internal.R.integer.config_criticalBatteryWarningLevel);
mBatteryMeter.setBatteryLevel(criticalLevel + 1); mBatteryMeter.setBatteryLevel(criticalLevel + 1);
mBatteryMeter.setPluggedIn(false); mBatteryMeter.setCharging(false);
final Canvas canvas = mock(Canvas.class); final Canvas canvas = mock(Canvas.class);
mBatteryMeter.draw(canvas); mBatteryMeter.draw(canvas);
String warningString = mResources.getString(R.string.battery_meter_very_low_overlay_symbol); String warningString = mResources.getString(R.string.battery_meter_very_low_overlay_symbol);