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 {