Tint suggestion icons

If the suggestion is marked as isIconTintable, tint the icon with
colorControlNormal.

Test: cd tests/robotests && mma
Bug: 62258845
Change-Id: I2a76181d9b8b4d9fbf496a8fc605cb762bba87c0
This commit is contained in:
Maurice Lam
2017-06-09 16:14:36 -07:00
parent d392a9bfbb
commit 992fa86d52
3 changed files with 39 additions and 11 deletions

View File

@@ -812,6 +812,7 @@
android:resource="@string/wallpaper_suggestion_summary" /> android:resource="@string/wallpaper_suggestion_summary" />
<meta-data android:name="com.android.settings.dismiss" <meta-data android:name="com.android.settings.dismiss"
android:value="3,7,30" /> android:value="3,7,30" />
<meta-data android:name="com.android.settings.icon_tintable" android:value="true" />
</activity> </activity>
<activity android:name=".support.NewDeviceIntroSuggestionActivity" <activity android:name=".support.NewDeviceIntroSuggestionActivity"
@@ -1461,6 +1462,8 @@
</intent-filter> </intent-filter>
<meta-data android:name="com.android.settings.title" <meta-data android:name="com.android.settings.title"
android:resource="@string/vision_settings_suggestion_title" /> android:resource="@string/vision_settings_suggestion_title" />
<meta-data android:name="com.android.settings.icon_tintable"
android:value="true" />
<meta-data android:name="com.android.settings.FRAGMENT_CLASS" <meta-data android:name="com.android.settings.FRAGMENT_CLASS"
android:value="com.android.settings.accessibility.AccessibilitySettingsForSetupWizard" /> android:value="com.android.settings.accessibility.AccessibilitySettingsForSetupWizard" />
<meta-data android:name="com.android.settings.PRIMARY_PROFILE_CONTROLLED" <meta-data android:name="com.android.settings.PRIMARY_PROFILE_CONTROLLED"
@@ -1575,6 +1578,7 @@
android:resource="@string/notification_suggestion_title" /> android:resource="@string/notification_suggestion_title" />
<meta-data android:name="com.android.settings.summary" <meta-data android:name="com.android.settings.summary"
android:resource="@string/notification_suggestion_summary" /> android:resource="@string/notification_suggestion_summary" />
<meta-data android:name="com.android.settings.icon_tintable" android:value="true" />
</activity> </activity>
<activity android:name=".notification.RedactionInterstitial" <activity android:name=".notification.RedactionInterstitial"
@@ -1682,6 +1686,7 @@
android:resource="@string/suggested_lock_settings_title" /> android:resource="@string/suggested_lock_settings_title" />
<meta-data android:name="com.android.settings.summary" <meta-data android:name="com.android.settings.summary"
android:resource="@string/suggested_lock_settings_summary" /> android:resource="@string/suggested_lock_settings_summary" />
<meta-data android:name="com.android.settings.icon_tintable" android:value="true" />
</activity> </activity>
<activity android:name=".Settings$FingerprintEnrollSuggestionActivity" <activity android:name=".Settings$FingerprintEnrollSuggestionActivity"

View File

@@ -15,7 +15,6 @@
*/ */
package com.android.settings.dashboard; package com.android.settings.dashboard;
import android.annotation.AttrRes;
import android.annotation.ColorInt; import android.annotation.ColorInt;
import android.app.Activity; import android.app.Activity;
import android.content.Context; import android.content.Context;
@@ -47,7 +46,6 @@ import com.android.settings.dashboard.DashboardData.SuggestionConditionHeaderDat
import com.android.settings.dashboard.conditional.Condition; import com.android.settings.dashboard.conditional.Condition;
import com.android.settings.dashboard.conditional.ConditionAdapter; import com.android.settings.dashboard.conditional.ConditionAdapter;
import com.android.settings.dashboard.conditional.ConditionAdapterUtils; import com.android.settings.dashboard.conditional.ConditionAdapterUtils;
import com.android.settings.dashboard.conditional.FocusRecyclerView;
import com.android.settings.dashboard.suggestions.SuggestionAdapter; import com.android.settings.dashboard.suggestions.SuggestionAdapter;
import com.android.settings.dashboard.suggestions.SuggestionDismissController; import com.android.settings.dashboard.suggestions.SuggestionDismissController;
import com.android.settings.dashboard.suggestions.SuggestionFeatureProvider; import com.android.settings.dashboard.suggestions.SuggestionFeatureProvider;
@@ -55,8 +53,8 @@ import com.android.settings.overlay.FeatureFactory;
import com.android.settingslib.Utils; import com.android.settingslib.Utils;
import com.android.settingslib.drawer.DashboardCategory; import com.android.settingslib.drawer.DashboardCategory;
import com.android.settingslib.drawer.Tile; import com.android.settingslib.drawer.Tile;
import com.android.settingslib.suggestions.SuggestionParser; import com.android.settingslib.suggestions.SuggestionParser;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List; import java.util.List;
@@ -192,14 +190,18 @@ public class DashboardAdapter extends RecyclerView.Adapter<DashboardAdapter.Dash
for (int j = 0; j < categories.get(i).tiles.size(); j++) { for (int j = 0; j < categories.get(i).tiles.size(); j++) {
final Tile tile = categories.get(i).tiles.get(j); final Tile tile = categories.get(i).tiles.get(j);
if (!mContext.getPackageName().equals( if (tile.isIconTintable) {
tile.intent.getComponent().getPackageName())) { // If this drawable is tintable, tint it to match the color.
// If this drawable is coming from outside Settings, tint it to match the
// color.
tile.icon.setTint(tintColor); tile.icon.setTint(tintColor);
} }
} }
} }
for (Tile suggestion : suggestions) {
if (suggestion.isIconTintable) {
suggestion.icon.setTint(tintColor);
}
}
} }
final DashboardData prevData = mDashboardData; final DashboardData prevData = mDashboardData;

View File

@@ -17,6 +17,8 @@ package com.android.settings.dashboard;
import static com.google.common.truth.Truth.assertThat; import static com.google.common.truth.Truth.assertThat;
import static org.mockito.ArgumentMatchers.anyInt;
import static org.mockito.ArgumentMatchers.eq;
import static org.mockito.Mockito.any; import static org.mockito.Mockito.any;
import static org.mockito.Mockito.doReturn; import static org.mockito.Mockito.doReturn;
import static org.mockito.Mockito.mock; import static org.mockito.Mockito.mock;
@@ -31,7 +33,9 @@ import android.content.ComponentName;
import android.content.Context; import android.content.Context;
import android.content.Intent; import android.content.Intent;
import android.content.res.Resources; import android.content.res.Resources;
import android.content.res.TypedArray;
import android.graphics.drawable.ColorDrawable; import android.graphics.drawable.ColorDrawable;
import android.graphics.drawable.Icon;
import android.view.ContextThemeWrapper; import android.view.ContextThemeWrapper;
import android.view.LayoutInflater; import android.view.LayoutInflater;
import android.view.View; import android.view.View;
@@ -45,10 +49,10 @@ import android.widget.TextView;
import com.android.internal.logging.nano.MetricsProto.MetricsEvent; import com.android.internal.logging.nano.MetricsProto.MetricsEvent;
import com.android.settings.R; import com.android.settings.R;
import com.android.settings.SettingsActivity; import com.android.settings.SettingsActivity;
import com.android.settings.testutils.SettingsRobolectricTestRunner;
import com.android.settings.TestConfig; import com.android.settings.TestConfig;
import com.android.settings.dashboard.conditional.Condition; import com.android.settings.dashboard.conditional.Condition;
import com.android.settings.testutils.FakeFeatureFactory; import com.android.settings.testutils.FakeFeatureFactory;
import com.android.settings.testutils.SettingsRobolectricTestRunner;
import com.android.settings.testutils.shadow.SettingsShadowResources; import com.android.settings.testutils.shadow.SettingsShadowResources;
import com.android.settings.testutils.shadow.ShadowDynamicIndexableContentMonitor; import com.android.settings.testutils.shadow.ShadowDynamicIndexableContentMonitor;
import com.android.settingslib.drawer.DashboardCategory; import com.android.settingslib.drawer.DashboardCategory;
@@ -62,8 +66,8 @@ import org.mockito.ArgumentCaptor;
import org.mockito.Captor; import org.mockito.Captor;
import org.mockito.Mock; import org.mockito.Mock;
import org.mockito.MockitoAnnotations; import org.mockito.MockitoAnnotations;
import org.robolectric.annotation.Config;
import org.robolectric.RuntimeEnvironment; import org.robolectric.RuntimeEnvironment;
import org.robolectric.annotation.Config;
import org.robolectric.shadows.ShadowApplication; import org.robolectric.shadows.ShadowApplication;
import java.util.ArrayList; import java.util.ArrayList;
@@ -102,6 +106,7 @@ public class DashboardAdapterTest {
MockitoAnnotations.initMocks(this); MockitoAnnotations.initMocks(this);
FakeFeatureFactory.setupForTest(mContext); FakeFeatureFactory.setupForTest(mContext);
mFactory = (FakeFeatureFactory) FakeFeatureFactory.getFactory(mContext); mFactory = (FakeFeatureFactory) FakeFeatureFactory.getFactory(mContext);
when(mFactory.dashboardFeatureProvider.shouldTintIcon()).thenReturn(true);
when(mFactory.suggestionsFeatureProvider when(mFactory.suggestionsFeatureProvider
.getSuggestionIdentifier(any(Context.class), any(Tile.class))) .getSuggestionIdentifier(any(Context.class), any(Tile.class)))
.thenAnswer(invocation -> { .thenAnswer(invocation -> {
@@ -445,7 +450,7 @@ public class DashboardAdapterTest {
} }
@Test @Test
public void testSuggestioDismissed_notOnlySuggestion_doNothing() { public void testSuggestionDismissed_notOnlySuggestion_doNothing() {
final DashboardAdapter adapter = spy(new DashboardAdapter(mContext, null, null)); final DashboardAdapter adapter = spy(new DashboardAdapter(mContext, null, null));
adapter.setCategoriesAndSuggestions( adapter.setCategoriesAndSuggestions(
new ArrayList<>(), makeSuggestions("pkg1", "pkg2", "pkg3")); new ArrayList<>(), makeSuggestions("pkg1", "pkg2", "pkg3"));
@@ -459,7 +464,7 @@ public class DashboardAdapterTest {
} }
@Test @Test
public void testSuggestioDismissed_onlySuggestion_updateDashboardData() { public void testSuggestionDismissed_onlySuggestion_updateDashboardData() {
DashboardAdapter adapter = spy(new DashboardAdapter(mContext, null, null)); DashboardAdapter adapter = spy(new DashboardAdapter(mContext, null, null));
adapter.setCategoriesAndSuggestions(new ArrayList<>(), makeSuggestions("pkg1")); adapter.setCategoriesAndSuggestions(new ArrayList<>(), makeSuggestions("pkg1"));
final DashboardData dashboardData = adapter.mDashboardData; final DashboardData dashboardData = adapter.mDashboardData;
@@ -471,6 +476,22 @@ public class DashboardAdapterTest {
verify(adapter).notifyDashboardDataChanged(any()); verify(adapter).notifyDashboardDataChanged(any());
} }
@Test
public void testSetCategoriesAndSuggestions_iconTinted() {
TypedArray mockTypedArray = mock(TypedArray.class);
doReturn(mockTypedArray).when(mContext).obtainStyledAttributes(any(int[].class));
doReturn(0x89000000).when(mockTypedArray).getColor(anyInt(), anyInt());
List<Tile> packages = makeSuggestions("pkg1");
Icon mockIcon = mock(Icon.class);
packages.get(0).isIconTintable = true;
packages.get(0).icon = mockIcon;
mDashboardAdapter.setCategoriesAndSuggestions(Collections.emptyList(), packages);
verify(mockIcon).setTint(eq(0x89000000));
}
private List<Tile> makeSuggestions(String... pkgNames) { private List<Tile> makeSuggestions(String... pkgNames) {
final List<Tile> suggestions = new ArrayList<>(); final List<Tile> suggestions = new ArrayList<>();
for (String pkgName : pkgNames) { for (String pkgName : pkgNames) {