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;
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;
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,
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;
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;
import java.util.List;
@RunWith(RobolectricTestRunner.class)
+@Config(shadows = {
+ BatteryFixSliceTest.ShadowBatteryStatsHelperLoader.class,
+ BatteryFixSliceTest.ShadowBatteryTipLoader.class
+})
public class BatteryFixSliceTest {
private Context mContext;
@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, ""));
}
@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, ""));
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 {
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;
+ }
+ }
}