Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 992fa86d authored by Maurice Lam's avatar Maurice Lam
Browse files

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
parent d392a9bf
Loading
Loading
Loading
Loading
+5 −0
Original line number Diff line number Diff line
@@ -812,6 +812,7 @@
                       android:resource="@string/wallpaper_suggestion_summary" />
            <meta-data android:name="com.android.settings.dismiss"
                       android:value="3,7,30" />
            <meta-data android:name="com.android.settings.icon_tintable" android:value="true" />
        </activity>

        <activity android:name=".support.NewDeviceIntroSuggestionActivity"
@@ -1461,6 +1462,8 @@
            </intent-filter>
            <meta-data android:name="com.android.settings.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"
                android:value="com.android.settings.accessibility.AccessibilitySettingsForSetupWizard" />
            <meta-data android:name="com.android.settings.PRIMARY_PROFILE_CONTROLLED"
@@ -1575,6 +1578,7 @@
                       android:resource="@string/notification_suggestion_title" />
            <meta-data android:name="com.android.settings.summary"
                       android:resource="@string/notification_suggestion_summary" />
            <meta-data android:name="com.android.settings.icon_tintable" android:value="true" />
        </activity>

        <activity android:name=".notification.RedactionInterstitial"
@@ -1682,6 +1686,7 @@
                       android:resource="@string/suggested_lock_settings_title" />
            <meta-data android:name="com.android.settings.summary"
                       android:resource="@string/suggested_lock_settings_summary" />
            <meta-data android:name="com.android.settings.icon_tintable" android:value="true" />
        </activity>

        <activity android:name=".Settings$FingerprintEnrollSuggestionActivity"
+9 −7
Original line number Diff line number Diff line
@@ -15,7 +15,6 @@
 */
package com.android.settings.dashboard;

import android.annotation.AttrRes;
import android.annotation.ColorInt;
import android.app.Activity;
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.ConditionAdapter;
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.SuggestionDismissController;
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.drawer.DashboardCategory;
import com.android.settingslib.drawer.Tile;

import com.android.settingslib.suggestions.SuggestionParser;

import java.util.ArrayList;
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++) {
                    final Tile tile = categories.get(i).tiles.get(j);

                    if (!mContext.getPackageName().equals(
                            tile.intent.getComponent().getPackageName())) {
                        // If this drawable is coming from outside Settings, tint it to match the
                        // color.
                    if (tile.isIconTintable) {
                        // If this drawable is tintable, tint it to match the color.
                        tile.icon.setTint(tintColor);
                    }
                }
            }

            for (Tile suggestion : suggestions) {
                if (suggestion.isIconTintable) {
                    suggestion.icon.setTint(tintColor);
                }
            }
        }

        final DashboardData prevData = mDashboardData;
+25 −4
Original line number Diff line number Diff line
@@ -17,6 +17,8 @@ package com.android.settings.dashboard;

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.doReturn;
import static org.mockito.Mockito.mock;
@@ -31,7 +33,9 @@ import android.content.ComponentName;
import android.content.Context;
import android.content.Intent;
import android.content.res.Resources;
import android.content.res.TypedArray;
import android.graphics.drawable.ColorDrawable;
import android.graphics.drawable.Icon;
import android.view.ContextThemeWrapper;
import android.view.LayoutInflater;
import android.view.View;
@@ -45,10 +49,10 @@ import android.widget.TextView;
import com.android.internal.logging.nano.MetricsProto.MetricsEvent;
import com.android.settings.R;
import com.android.settings.SettingsActivity;
import com.android.settings.testutils.SettingsRobolectricTestRunner;
import com.android.settings.TestConfig;
import com.android.settings.dashboard.conditional.Condition;
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.ShadowDynamicIndexableContentMonitor;
import com.android.settingslib.drawer.DashboardCategory;
@@ -62,8 +66,8 @@ import org.mockito.ArgumentCaptor;
import org.mockito.Captor;
import org.mockito.Mock;
import org.mockito.MockitoAnnotations;
import org.robolectric.annotation.Config;
import org.robolectric.RuntimeEnvironment;
import org.robolectric.annotation.Config;
import org.robolectric.shadows.ShadowApplication;

import java.util.ArrayList;
@@ -102,6 +106,7 @@ public class DashboardAdapterTest {
        MockitoAnnotations.initMocks(this);
        FakeFeatureFactory.setupForTest(mContext);
        mFactory = (FakeFeatureFactory) FakeFeatureFactory.getFactory(mContext);
        when(mFactory.dashboardFeatureProvider.shouldTintIcon()).thenReturn(true);
        when(mFactory.suggestionsFeatureProvider
                .getSuggestionIdentifier(any(Context.class), any(Tile.class)))
                .thenAnswer(invocation -> {
@@ -445,7 +450,7 @@ public class DashboardAdapterTest {
    }

    @Test
    public void testSuggestioDismissed_notOnlySuggestion_doNothing() {
    public void testSuggestionDismissed_notOnlySuggestion_doNothing() {
        final DashboardAdapter adapter = spy(new DashboardAdapter(mContext, null, null));
        adapter.setCategoriesAndSuggestions(
                new ArrayList<>(), makeSuggestions("pkg1", "pkg2", "pkg3"));
@@ -459,7 +464,7 @@ public class DashboardAdapterTest {
    }

    @Test
    public void testSuggestioDismissed_onlySuggestion_updateDashboardData() {
    public void testSuggestionDismissed_onlySuggestion_updateDashboardData() {
        DashboardAdapter adapter = spy(new DashboardAdapter(mContext, null, null));
        adapter.setCategoriesAndSuggestions(new ArrayList<>(), makeSuggestions("pkg1"));
        final DashboardData dashboardData = adapter.mDashboardData;
@@ -471,6 +476,22 @@ public class DashboardAdapterTest {
        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) {
        final List<Tile> suggestions = new ArrayList<>();
        for (String pkgName : pkgNames) {