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

Commit 7087fd92 authored by Doris Ling's avatar Doris Ling
Browse files

Check the tintable metadata before tinting tile icon.

When determining whether to tint the tile icon, first check whether the
tintable metadata set for the tile. If no metadata set, will then follow
the default logic that tint the tile icon if it is not coming from the
Settings package.

Change-Id: Idf0863e0c6ab063aeaa6d013fa620508ced31fdb
Fix: 62473193
Test: make RunSettingsRoboTests
parent d88a7681
Loading
Loading
Loading
Loading
+16 −4
Original line number Diff line number Diff line
@@ -38,6 +38,7 @@ import com.android.settingslib.core.AbstractPreferenceController;
import com.android.settingslib.drawer.DashboardCategory;
import com.android.settingslib.drawer.SettingsDrawerActivity;
import com.android.settingslib.drawer.Tile;
import com.android.settingslib.drawer.TileUtils;

import java.util.ArrayList;
import java.util.Collection;
@@ -227,6 +228,20 @@ public abstract class DashboardFragment extends SettingsPreferenceFragment
        return true;
    }

    @VisibleForTesting
    boolean tintTileIcon(Tile tile) {
        // First check if the tile has set the icon tintable metadata.
        final Bundle metadata = tile.metaData;
        if (metadata != null
                && metadata.containsKey(TileUtils.META_DATA_PREFERENCE_ICON_TINTABLE)) {
            return metadata.getBoolean(TileUtils.META_DATA_PREFERENCE_ICON_TINTABLE);
        }
        final String pkgName = getContext().getPackageName();
        // If this drawable is coming from outside Settings, tint it to match the color.
        return pkgName != null && tile.intent != null
                && !pkgName.equals(tile.intent.getComponent().getPackageName());
    }

    /**
     * Displays resource based tiles.
     */
@@ -315,7 +330,6 @@ public abstract class DashboardFragment extends SettingsPreferenceFragment
                android.R.attr.colorControlNormal});
        final int tintColor = a.getColor(0, context.getColor(android.R.color.white));
        a.recycle();
        final String pkgName = context.getPackageName();
        // Install dashboard tiles.
        for (Tile tile : tiles) {
            final String key = mDashboardFeatureProvider.getDashboardKeyForTile(tile);
@@ -326,9 +340,7 @@ public abstract class DashboardFragment extends SettingsPreferenceFragment
            if (!displayTile(tile)) {
                continue;
            }
            if (pkgName != null && tile.intent != null
                    && !pkgName.equals(tile.intent.getComponent().getPackageName())) {
                // If this drawable is coming from outside Settings, tint it to match the color.
            if (tintTileIcon(tile)) {
                tile.icon.setTint(tintColor);
            }
            if (mDashboardTilePrefKeys.contains(key)) {
+32 −0
Original line number Diff line number Diff line
@@ -24,7 +24,9 @@ import static org.mockito.Mockito.never;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;

import android.content.ComponentName;
import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
import android.support.v7.preference.Preference;
import android.support.v7.preference.PreferenceManager;
@@ -39,6 +41,7 @@ import com.android.settings.testutils.FakeFeatureFactory;
import com.android.settingslib.core.AbstractPreferenceController;
import com.android.settingslib.drawer.DashboardCategory;
import com.android.settingslib.drawer.Tile;
import com.android.settingslib.drawer.TileUtils;

import org.junit.Before;
import org.junit.Test;
@@ -152,6 +155,35 @@ public class DashboardFragmentTest {
        verify(mockController2).getPreferenceKey();
    }

    @Test
    public void tintTileIcon_hasMetadata_shouldReturnIconTintableMetadata() {
        final Tile tile = new Tile();
        final Bundle metaData = new Bundle();
        tile.metaData = metaData;

        metaData.putBoolean(TileUtils.META_DATA_PREFERENCE_ICON_TINTABLE, false);
        assertThat(mTestFragment.tintTileIcon(tile)).isFalse();

        metaData.putBoolean(TileUtils.META_DATA_PREFERENCE_ICON_TINTABLE, true);
        assertThat(mTestFragment.tintTileIcon(tile)).isTrue();
    }


    @Test
    public void tintTileIcon_noMetadata_shouldReturnPackageNameCheck() {
        final Tile tile = new Tile();
        final Intent intent = new Intent();
        tile.intent = intent;

        intent.setComponent(new ComponentName(
                ShadowApplication.getInstance().getApplicationContext().getPackageName(),
                "TestClass"));
        assertThat(mTestFragment.tintTileIcon(tile)).isFalse();

        intent.setComponent(new ComponentName("OtherPackage", "TestClass"));
        assertThat(mTestFragment.tintTileIcon(tile)).isTrue();
    }

    public static class TestPreferenceController extends AbstractPreferenceController
            implements PreferenceControllerMixin {