Loading src/com/android/settings/fuelgauge/batterytip/tips/BatteryTip.java +1 −1 Original line number Diff line number Diff line Loading @@ -160,7 +160,7 @@ public abstract class BatteryTip implements Comparable<BatteryTip>, 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; } Loading src/com/android/settings/homepage/contextualcards/slices/BatteryFixSlice.java +10 −2 Original line number Diff line number Diff line Loading @@ -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; Loading @@ -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; Loading Loading @@ -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, Loading tests/robotests/src/com/android/settings/homepage/contextualcards/slices/BatteryFixSliceTest.java +75 −8 Original line number Diff line number Diff line Loading @@ -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; Loading @@ -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; Loading @@ -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; Loading @@ -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<BatteryTip> tips = new ArrayList<>(); tips.add(new LowBatteryTip(BatteryTip.StateType.INVISIBLE, false, "")); Loading @@ -85,10 +93,6 @@ public class BatteryFixSliceTest { } @Test @Config(shadows = { ShadowBatteryStatsHelperLoader.class, ShadowBatteryTipLoader.class }) public void getSlice_unimportantSlice_shouldSkip() { final List<BatteryTip> tips = new ArrayList<>(); tips.add(new LowBatteryTip(BatteryTip.StateType.INVISIBLE, false, "")); Loading @@ -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<BatteryTip> 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 { Loading Loading @@ -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 extends SliceBackgroundWorker> 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; } } } Loading
src/com/android/settings/fuelgauge/batterytip/tips/BatteryTip.java +1 −1 Original line number Diff line number Diff line Loading @@ -160,7 +160,7 @@ public abstract class BatteryTip implements Comparable<BatteryTip>, 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; } Loading
src/com/android/settings/homepage/contextualcards/slices/BatteryFixSlice.java +10 −2 Original line number Diff line number Diff line Loading @@ -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; Loading @@ -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; Loading Loading @@ -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, Loading
tests/robotests/src/com/android/settings/homepage/contextualcards/slices/BatteryFixSliceTest.java +75 −8 Original line number Diff line number Diff line Loading @@ -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; Loading @@ -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; Loading @@ -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; Loading @@ -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<BatteryTip> tips = new ArrayList<>(); tips.add(new LowBatteryTip(BatteryTip.StateType.INVISIBLE, false, "")); Loading @@ -85,10 +93,6 @@ public class BatteryFixSliceTest { } @Test @Config(shadows = { ShadowBatteryStatsHelperLoader.class, ShadowBatteryTipLoader.class }) public void getSlice_unimportantSlice_shouldSkip() { final List<BatteryTip> tips = new ArrayList<>(); tips.add(new LowBatteryTip(BatteryTip.StateType.INVISIBLE, false, "")); Loading @@ -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<BatteryTip> 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 { Loading Loading @@ -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 extends SliceBackgroundWorker> 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; } } }