Tint battery fix icon

Fixes: 129492004
Test: manual
Change-Id: I161284619bc47e342d78f1507ae291f7c23ad3ff
This commit is contained in:
Raff Tsai
2019-04-15 15:24:38 +08:00
parent 86b6be0784
commit 006582b48e
3 changed files with 86 additions and 11 deletions

View File

@@ -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;
}

View File

@@ -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,

View File

@@ -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<BatteryTip> 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<BatteryTip> 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<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 {
@@ -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;
}
}
}