diff options
4 files changed, 131 insertions, 17 deletions
diff --git a/packages/SystemUI/src/com/android/systemui/BatteryMeterDrawable.java b/packages/SystemUI/src/com/android/systemui/BatteryMeterDrawable.java index 076b5bcd0861..e1d6a94fcf07 100755 --- a/packages/SystemUI/src/com/android/systemui/BatteryMeterDrawable.java +++ b/packages/SystemUI/src/com/android/systemui/BatteryMeterDrawable.java @@ -31,10 +31,9 @@ import android.graphics.RectF; import android.graphics.Typeface; import android.graphics.drawable.Drawable; import android.net.Uri; -import android.os.Bundle; import android.os.Handler; +import android.os.Looper; import android.provider.Settings; - import com.android.systemui.statusbar.policy.BatteryController; public class BatteryMeterDrawable extends Drawable implements @@ -92,18 +91,17 @@ public class BatteryMeterDrawable extends Drawable implements private int mLightModeBackgroundColor; private int mLightModeFillColor; - private final SettingObserver mSettingObserver = new SettingObserver(); + private final SettingObserver mSettingObserver; private final Context mContext; - private final Handler mHandler; private int mLevel = -1; private boolean mPluggedIn; private boolean mListening; - public BatteryMeterDrawable(Context context, Handler handler, int frameColor) { + public BatteryMeterDrawable(Context context, int frameColor) { mContext = context; - mHandler = handler; + mSettingObserver = new SettingObserver(new Handler(mContext.getMainLooper())); final Resources res = context.getResources(); TypedArray levels = res.obtainTypedArray(R.array.batterymeter_color_levels); TypedArray colors = res.obtainTypedArray(R.array.batterymeter_color_values); @@ -199,12 +197,7 @@ public class BatteryMeterDrawable extends Drawable implements } private void postInvalidate() { - mHandler.post(new Runnable() { - @Override - public void run() { - invalidateSelf(); - } - }); + scheduleSelf(this::invalidateSelf, 0); } public void setBatteryController(BatteryController batteryController) { @@ -506,8 +499,8 @@ public class BatteryMeterDrawable extends Drawable implements } private final class SettingObserver extends ContentObserver { - public SettingObserver() { - super(new Handler()); + public SettingObserver(Handler handler) { + super(handler); } @Override diff --git a/packages/SystemUI/src/com/android/systemui/BatteryMeterView.java b/packages/SystemUI/src/com/android/systemui/BatteryMeterView.java index d8b95cc28b57..4f3ffde06294 100644 --- a/packages/SystemUI/src/com/android/systemui/BatteryMeterView.java +++ b/packages/SystemUI/src/com/android/systemui/BatteryMeterView.java @@ -49,7 +49,7 @@ public class BatteryMeterView extends ImageView implements defStyle, 0); final int frameColor = atts.getColor(R.styleable.BatteryMeterView_frameColor, context.getColor(R.color.batterymeter_frame_color)); - mDrawable = new BatteryMeterDrawable(context, new Handler(), frameColor); + mDrawable = new BatteryMeterDrawable(context, frameColor); atts.recycle(); mSlotBattery = context.getString( diff --git a/packages/SystemUI/src/com/android/systemui/qs/tiles/BatteryTile.java b/packages/SystemUI/src/com/android/systemui/qs/tiles/BatteryTile.java index b61a81cbfdcc..d89fbfd3c8df 100644 --- a/packages/SystemUI/src/com/android/systemui/qs/tiles/BatteryTile.java +++ b/packages/SystemUI/src/com/android/systemui/qs/tiles/BatteryTile.java @@ -118,7 +118,7 @@ public class BatteryTile extends QSTile<QSTile.State> implements BatteryControll @Override public Drawable getDrawable(Context context) { BatteryMeterDrawable drawable = - new BatteryMeterDrawable(context, new Handler(Looper.getMainLooper()), + new BatteryMeterDrawable(context, context.getColor(R.color.batterymeter_frame_color)); drawable.onBatteryLevelChanged(mLevel, mPluggedIn, mCharging); drawable.onPowerSaveChanged(mPowerSave); @@ -165,7 +165,7 @@ public class BatteryTile extends QSTile<QSTile.State> implements BatteryControll private final class BatteryDetail implements DetailAdapter, OnClickListener, OnAttachStateChangeListener { private final BatteryMeterDrawable mDrawable = new BatteryMeterDrawable(mHost.getContext(), - new Handler(), mHost.getContext().getColor(R.color.batterymeter_frame_color)); + mHost.getContext().getColor(R.color.batterymeter_frame_color)); private View mCurrentView; @Override diff --git a/packages/SystemUI/tests/src/com/android/systemui/BatteryMeterDrawableTest.java b/packages/SystemUI/tests/src/com/android/systemui/BatteryMeterDrawableTest.java new file mode 100644 index 000000000000..5cb5e68fe6f8 --- /dev/null +++ b/packages/SystemUI/tests/src/com/android/systemui/BatteryMeterDrawableTest.java @@ -0,0 +1,121 @@ +/* + * Copyright (C) 2016 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.systemui; + +import static junit.framework.Assert.assertEquals; +import static junit.framework.Assert.assertTrue; +import static org.mockito.Mockito.any; +import static org.mockito.Mockito.anyFloat; +import static org.mockito.Mockito.anyString; +import static org.mockito.Mockito.atLeastOnce; +import static org.mockito.Mockito.eq; +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.never; +import static org.mockito.Mockito.times; +import static org.mockito.Mockito.verify; + +import android.content.Context; +import android.content.res.Resources; +import android.graphics.Canvas; +import android.support.test.InstrumentationRegistry; +import android.support.test.runner.AndroidJUnit4; +import android.test.suitebuilder.annotation.SmallTest; +import org.junit.Before; +import org.junit.Test; +import org.junit.runner.RunWith; + +@SmallTest +@RunWith(AndroidJUnit4.class) +public class BatteryMeterDrawableTest { + + private Context mContext; + private Resources mResources; + private BatteryMeterDrawable mBatteryMeter; + + @Before + public void setUp() throws Exception { + mContext = InstrumentationRegistry.getTargetContext(); + mResources = mContext.getResources(); + mBatteryMeter = new BatteryMeterDrawable(mContext, 0); + } + + @Test + public void testGetIntrinsicSize() { + assertEquals( + mResources.getDimensionPixelSize(R.dimen.battery_width), + mBatteryMeter.getIntrinsicWidth()); + assertEquals( + mResources.getDimensionPixelSize(R.dimen.battery_height), + mBatteryMeter.getIntrinsicHeight()); + } + + @Test + public void testDrawNothingBeforeOnBatteryLevelChanged() { + final Canvas canvas = mock(Canvas.class); + mBatteryMeter.draw(canvas); + verify(canvas, never()).drawPath(any(), any()); + verify(canvas, never()).drawText(anyString(), anyFloat(), anyFloat(), any()); + } + + @Test + public void testDrawImageButNoTextIfPluggedIn() { + mBatteryMeter.onBatteryLevelChanged(0, true, true); + final Canvas canvas = mock(Canvas.class); + mBatteryMeter.draw(canvas); + verify(canvas, atLeastOnce()).drawPath(any(), any()); + verify(canvas, never()).drawText(anyString(), anyFloat(), anyFloat(), any()); + } + + @Test + public void testDrawTextIfNotPluggedIn() { + mBatteryMeter.onBatteryLevelChanged(0, false, false); + final Canvas canvas = mock(Canvas.class); + mBatteryMeter.draw(canvas); + verify(canvas, times(1)).drawText(anyString(), anyFloat(), anyFloat(), any()); + } + + @Test + public void testDrawNoTextIfPowerSaveEnabled() { + mBatteryMeter.onBatteryLevelChanged(0, false, false); + mBatteryMeter.onPowerSaveChanged(true); + final Canvas canvas = mock(Canvas.class); + mBatteryMeter.draw(canvas); + verify(canvas, never()).drawText(anyString(), anyFloat(), anyFloat(), any()); + } + + @Test + public void testDrawTextWarningAtCriticalLevel() { + int criticalLevel = mResources.getInteger( + com.android.internal.R.integer.config_criticalBatteryWarningLevel); + mBatteryMeter.onBatteryLevelChanged(criticalLevel, false, false); + final Canvas canvas = mock(Canvas.class); + mBatteryMeter.draw(canvas); + String warningString = mResources.getString(R.string.battery_meter_very_low_overlay_symbol); + verify(canvas, times(1)).drawText(eq(warningString), anyFloat(), anyFloat(), any()); + } + + @Test + public void testDrawTextNoWarningAboveCriticalLevel() { + int criticalLevel = mResources.getInteger( + com.android.internal.R.integer.config_criticalBatteryWarningLevel); + mBatteryMeter.onBatteryLevelChanged(criticalLevel + 1, false, false); + final Canvas canvas = mock(Canvas.class); + mBatteryMeter.draw(canvas); + String warningString = mResources.getString(R.string.battery_meter_very_low_overlay_symbol); + verify(canvas, never()).drawText(eq(warningString), anyFloat(), anyFloat(), any()); + } +} |