From 7087fd92a18b46f9b76fdb2a4e2bb62b5ae9fd0d Mon Sep 17 00:00:00 2001 From: Doris Ling Date: Mon, 17 Jul 2017 15:04:36 -0700 Subject: [PATCH] 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 --- .../settings/dashboard/DashboardFragment.java | 20 +++++++++--- .../dashboard/DashboardFragmentTest.java | 32 +++++++++++++++++++ 2 files changed, 48 insertions(+), 4 deletions(-) diff --git a/src/com/android/settings/dashboard/DashboardFragment.java b/src/com/android/settings/dashboard/DashboardFragment.java index ba42222b8d3..e8970ecd697 100644 --- a/src/com/android/settings/dashboard/DashboardFragment.java +++ b/src/com/android/settings/dashboard/DashboardFragment.java @@ -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)) { diff --git a/tests/robotests/src/com/android/settings/dashboard/DashboardFragmentTest.java b/tests/robotests/src/com/android/settings/dashboard/DashboardFragmentTest.java index 1c57dc32c18..2687714a959 100644 --- a/tests/robotests/src/com/android/settings/dashboard/DashboardFragmentTest.java +++ b/tests/robotests/src/com/android/settings/dashboard/DashboardFragmentTest.java @@ -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 {