OSDN Git Service

Tint battery fix icon
authorRaff Tsai <rafftsai@google.com>
Mon, 15 Apr 2019 07:24:38 +0000 (15:24 +0800)
committerRaff Tsai <rafftsai@google.com>
Tue, 16 Apr 2019 09:05:52 +0000 (17:05 +0800)
Fixes: 129492004
Test: manual
Change-Id: I161284619bc47e342d78f1507ae291f7c23ad3ff

src/com/android/settings/fuelgauge/batterytip/tips/BatteryTip.java
src/com/android/settings/homepage/contextualcards/slices/BatteryFixSlice.java
tests/robotests/src/com/android/settings/homepage/contextualcards/slices/BatteryFixSliceTest.java

index 0867a01..ebc4939 100644 (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;
     }
 
index a75f99a..761755c 100644 (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,
index 1027cf1..dcfba42 100644 (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;
+        }
+    }
 }