From 006582b48e770a93dff9e9eb947478612b4902aa Mon Sep 17 00:00:00 2001 From: Raff Tsai Date: Mon, 15 Apr 2019 15:24:38 +0800 Subject: [PATCH] Tint battery fix icon Fixes: 129492004 Test: manual Change-Id: I161284619bc47e342d78f1507ae291f7c23ad3ff --- .../fuelgauge/batterytip/tips/BatteryTip.java | 2 +- .../contextualcards/slices/BatteryFixSlice.java | 12 +++- .../slices/BatteryFixSliceTest.java | 83 +++++++++++++++++++--- 3 files changed, 86 insertions(+), 11 deletions(-) diff --git a/src/com/android/settings/fuelgauge/batterytip/tips/BatteryTip.java b/src/com/android/settings/fuelgauge/batterytip/tips/BatteryTip.java index 0867a01260..ebc493967e 100644 --- a/src/com/android/settings/fuelgauge/batterytip/tips/BatteryTip.java +++ b/src/com/android/settings/fuelgauge/batterytip/tips/BatteryTip.java @@ -160,7 +160,7 @@ public abstract class BatteryTip implements Comparable, Parcelable { } /** Returns the color resid for tinting {@link #getIconId()} or {@link View#NO_ID} if none. */ - protected @IdRes int getIconTintColorId() { + public @IdRes int getIconTintColorId() { return View.NO_ID; } diff --git a/src/com/android/settings/homepage/contextualcards/slices/BatteryFixSlice.java b/src/com/android/settings/homepage/contextualcards/slices/BatteryFixSlice.java index a75f99a54f..761755c60f 100644 --- a/src/com/android/settings/homepage/contextualcards/slices/BatteryFixSlice.java +++ b/src/com/android/settings/homepage/contextualcards/slices/BatteryFixSlice.java @@ -25,6 +25,9 @@ import android.app.settings.SettingsEnums; import android.content.Context; import android.content.Intent; import android.content.SharedPreferences; +import android.graphics.PorterDuff; +import android.graphics.PorterDuffColorFilter; +import android.graphics.drawable.Drawable; import android.net.Uri; import android.util.ArrayMap; @@ -39,6 +42,7 @@ import androidx.slice.builders.SliceAction; import com.android.internal.os.BatteryStatsHelper; import com.android.settings.R; import com.android.settings.SubSettings; +import com.android.settings.Utils; import com.android.settings.fuelgauge.BatteryStatsHelperLoader; import com.android.settings.fuelgauge.PowerUsageSummary; import com.android.settings.fuelgauge.batterytip.BatteryTipLoader; @@ -107,8 +111,12 @@ public class BatteryFixSlice implements CustomSliceable { if (batteryTip.getState() == BatteryTip.StateType.INVISIBLE) { continue; } - final IconCompat icon = IconCompat.createWithResource(mContext, - batteryTip.getIconId()); + final Drawable drawable = mContext.getDrawable(batteryTip.getIconId()); + drawable.setColorFilter(new PorterDuffColorFilter( + mContext.getResources().getColor(batteryTip.getIconTintColorId()), + PorterDuff.Mode.SRC_IN)); + + final IconCompat icon = Utils.createIconWithDrawable(drawable); final SliceAction primaryAction = SliceAction.createDeeplink(getPrimaryAction(), icon, ListBuilder.ICON_IMAGE, diff --git a/tests/robotests/src/com/android/settings/homepage/contextualcards/slices/BatteryFixSliceTest.java b/tests/robotests/src/com/android/settings/homepage/contextualcards/slices/BatteryFixSliceTest.java index 1027cf1d0c..dcfba42c78 100644 --- a/tests/robotests/src/com/android/settings/homepage/contextualcards/slices/BatteryFixSliceTest.java +++ b/tests/robotests/src/com/android/settings/homepage/contextualcards/slices/BatteryFixSliceTest.java @@ -18,7 +18,11 @@ package com.android.settings.homepage.contextualcards.slices; import static com.google.common.truth.Truth.assertThat; +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.when; + import android.content.Context; +import android.net.Uri; import androidx.slice.Slice; import androidx.slice.SliceMetadata; @@ -26,11 +30,13 @@ import androidx.slice.SliceProvider; import androidx.slice.widget.SliceLiveData; import com.android.internal.os.BatteryStatsHelper; +import com.android.settings.R; import com.android.settings.fuelgauge.BatteryStatsHelperLoader; import com.android.settings.fuelgauge.batterytip.BatteryTipLoader; import com.android.settings.fuelgauge.batterytip.tips.BatteryTip; import com.android.settings.fuelgauge.batterytip.tips.EarlyWarningTip; import com.android.settings.fuelgauge.batterytip.tips.LowBatteryTip; +import com.android.settings.slices.SliceBackgroundWorker; import org.junit.After; import org.junit.Before; @@ -48,6 +54,10 @@ import java.util.ArrayList; import java.util.List; @RunWith(RobolectricTestRunner.class) +@Config(shadows = { + BatteryFixSliceTest.ShadowBatteryStatsHelperLoader.class, + BatteryFixSliceTest.ShadowBatteryTipLoader.class +}) public class BatteryFixSliceTest { private Context mContext; @@ -66,13 +76,11 @@ public class BatteryFixSliceTest { @After public void tearDown() { ShadowBatteryTipLoader.reset(); + ShadowSliceBackgroundWorker.reset(); + ShadowEarlyWarningTip.reset(); } @Test - @Config(shadows = { - ShadowBatteryStatsHelperLoader.class, - ShadowBatteryTipLoader.class - }) public void updateBatteryTipAvailabilityCache_hasImportantTip_shouldReturnTrue() { final List tips = new ArrayList<>(); tips.add(new LowBatteryTip(BatteryTip.StateType.INVISIBLE, false, "")); @@ -85,10 +93,6 @@ public class BatteryFixSliceTest { } @Test - @Config(shadows = { - ShadowBatteryStatsHelperLoader.class, - ShadowBatteryTipLoader.class - }) public void getSlice_unimportantSlice_shouldSkip() { final List tips = new ArrayList<>(); tips.add(new LowBatteryTip(BatteryTip.StateType.INVISIBLE, false, "")); @@ -101,6 +105,28 @@ public class BatteryFixSliceTest { assertThat(SliceMetadata.from(mContext, slice).isErrorSlice()).isTrue(); } + @Test + @Config(shadows = { + BatteryFixSliceTest.ShadowEarlyWarningTip.class, + BatteryFixSliceTest.ShadowSliceBackgroundWorker.class + }) + public void getSlice_hasImportantTip_shouldTintIcon() { + final List tips = new ArrayList<>(); + tips.add(new EarlyWarningTip(BatteryTip.StateType.NEW, false)); + // Create fake cache data + ShadowBatteryTipLoader.setBatteryTips(tips); + BatteryFixSlice.updateBatteryTipAvailabilityCache(mContext); + // Create fake background worker data + BatteryFixSlice.BatteryTipWorker batteryTipWorker = mock( + BatteryFixSlice.BatteryTipWorker.class); + when(batteryTipWorker.getResults()).thenReturn(tips); + ShadowSliceBackgroundWorker.setBatteryTipWorkerWorker(batteryTipWorker); + + final Slice slice = mSlice.getSlice(); + + assertThat(ShadowEarlyWarningTip.isIconTintColorIdCalled()).isTrue(); + } + @Implements(BatteryStatsHelperLoader.class) public static class ShadowBatteryStatsHelperLoader { @@ -129,4 +155,45 @@ public class BatteryFixSliceTest { sBatteryTips = tips; } } + + @Implements(SliceBackgroundWorker.class) + public static class ShadowSliceBackgroundWorker { + + private static BatteryFixSlice.BatteryTipWorker sBatteryTipWorkerWorker; + + @Resetter + public static void reset() { + sBatteryTipWorkerWorker = null; + } + + @Implementation + protected static T getInstance(Uri uri) { + return (T) sBatteryTipWorkerWorker; + } + + public static void setBatteryTipWorkerWorker(BatteryFixSlice.BatteryTipWorker worker) { + sBatteryTipWorkerWorker = worker; + } + } + + @Implements(EarlyWarningTip.class) + public static class ShadowEarlyWarningTip { + + private static boolean mIsGetIconTintColorIdCalled; + + @Resetter + public static void reset() { + mIsGetIconTintColorIdCalled = false; + } + + @Implementation + protected int getIconTintColorId() { + mIsGetIconTintColorIdCalled = true; + return R.color.battery_bad_color_light; + } + + public static boolean isIconTintColorIdCalled() { + return mIsGetIconTintColorIdCalled; + } + } } -- 2.11.0