Pass in context when loading icons from Tile

Bug: 111860183
Test: robotests
Change-Id: I836ad66eb420f4e0bd0bbded541f4dfe947c9b18
This commit is contained in:
Fan Zhang
2018-07-26 11:26:11 -07:00
parent 4329792198
commit 1c61a58f0d
6 changed files with 30 additions and 26 deletions

View File

@@ -315,7 +315,7 @@ public class DashboardAdapter extends RecyclerView.Adapter<DashboardAdapter.Dash
@VisibleForTesting @VisibleForTesting
void onBindTile(DashboardItemHolder holder, Tile tile) { void onBindTile(DashboardItemHolder holder, Tile tile) {
Icon tileIcon = tile.getIcon(); Icon tileIcon = tile.getIcon(mContext);
Drawable icon = mCache.getIcon(tileIcon); Drawable icon = mCache.getIcon(tileIcon);
if (!TextUtils.equals(tileIcon.getResPackage(), mContext.getPackageName()) if (!TextUtils.equals(tileIcon.getResPackage(), mContext.getPackageName())
&& !(icon instanceof RoundedHomepageIcon)) { && !(icon instanceof RoundedHomepageIcon)) {

View File

@@ -34,6 +34,9 @@ import android.util.ArrayMap;
import android.util.Log; import android.util.Log;
import android.util.Pair; import android.util.Pair;
import androidx.annotation.VisibleForTesting;
import androidx.preference.Preference;
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;
@@ -50,9 +53,6 @@ import java.util.ArrayList;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
import androidx.annotation.VisibleForTesting;
import androidx.preference.Preference;
/** /**
* Impl for {@code DashboardFeatureProvider}. * Impl for {@code DashboardFeatureProvider}.
*/ */
@@ -238,7 +238,7 @@ public class DashboardFeatureProviderImpl implements DashboardFeatureProvider {
@VisibleForTesting @VisibleForTesting
void bindIcon(Preference preference, Tile tile) { void bindIcon(Preference preference, Tile tile) {
final Icon tileIcon = tile.getIcon(); final Icon tileIcon = tile.getIcon(mContext);
if (tileIcon != null) { if (tileIcon != null) {
preference.setIcon(tileIcon.loadDrawable(preference.getContext())); preference.setIcon(tileIcon.loadDrawable(preference.getContext()));
} else if (tile.metaData != null } else if (tile.metaData != null

View File

@@ -24,6 +24,11 @@ import android.util.ArrayMap;
import android.util.ArraySet; import android.util.ArraySet;
import android.util.Log; import android.util.Log;
import androidx.annotation.VisibleForTesting;
import androidx.preference.Preference;
import androidx.preference.PreferenceManager;
import androidx.preference.PreferenceScreen;
import com.android.settings.SettingsPreferenceFragment; import com.android.settings.SettingsPreferenceFragment;
import com.android.settings.core.BasePreferenceController; import com.android.settings.core.BasePreferenceController;
import com.android.settings.core.PreferenceControllerListHelper; import com.android.settings.core.PreferenceControllerListHelper;
@@ -43,11 +48,6 @@ import java.util.List;
import java.util.Map; import java.util.Map;
import java.util.Set; import java.util.Set;
import androidx.annotation.VisibleForTesting;
import androidx.preference.Preference;
import androidx.preference.PreferenceManager;
import androidx.preference.PreferenceScreen;
/** /**
* Base fragment for dashboard style UI containing a list of static and dynamic setting items. * Base fragment for dashboard style UI containing a list of static and dynamic setting items.
*/ */
@@ -256,7 +256,8 @@ public abstract class DashboardFragment extends SettingsPreferenceFragment
@VisibleForTesting @VisibleForTesting
boolean tintTileIcon(Tile tile) { boolean tintTileIcon(Tile tile) {
if (tile.getIcon() == null) { final Context context = getContext();
if (tile.getIcon(context) == null) {
return false; return false;
} }
// First check if the tile has set the icon tintable metadata. // First check if the tile has set the icon tintable metadata.
@@ -265,7 +266,7 @@ public abstract class DashboardFragment extends SettingsPreferenceFragment
&& metadata.containsKey(TileUtils.META_DATA_PREFERENCE_ICON_TINTABLE)) { && metadata.containsKey(TileUtils.META_DATA_PREFERENCE_ICON_TINTABLE)) {
return metadata.getBoolean(TileUtils.META_DATA_PREFERENCE_ICON_TINTABLE); return metadata.getBoolean(TileUtils.META_DATA_PREFERENCE_ICON_TINTABLE);
} }
final String pkgName = getContext().getPackageName(); final String pkgName = context.getPackageName();
// If this drawable is coming from outside Settings, tint it to match the color. // If this drawable is coming from outside Settings, tint it to match the color.
return pkgName != null && tile.intent != null return pkgName != null && tile.intent != null
&& !pkgName.equals(tile.intent.getComponent().getPackageName()); && !pkgName.equals(tile.intent.getComponent().getPackageName());
@@ -370,7 +371,7 @@ public abstract class DashboardFragment extends SettingsPreferenceFragment
continue; continue;
} }
if (tintTileIcon(tile)) { if (tintTileIcon(tile)) {
tile.getIcon().setTint(tintColor); tile.getIcon(context).setTint(tintColor);
} }
if (mDashboardTilePrefKeys.contains(key)) { if (mDashboardTilePrefKeys.contains(key)) {
// Have the key already, will rebind. // Have the key already, will rebind.

View File

@@ -203,9 +203,9 @@ public class DashboardAdapterTest {
new DashboardAdapter.DashboardItemHolder(view); new DashboardAdapter.DashboardItemHolder(view);
final Tile tile = spy(new Tile(mActivityInfo)); final Tile tile = spy(new Tile(mActivityInfo));
doReturn(Icon.createWithResource(context, R.drawable.ic_settings)) doReturn(Icon.createWithResource(context, R.drawable.ic_settings))
.when(tile).getIcon(); .when(tile).getIcon(context);
final IconCache iconCache = mock(IconCache.class); final IconCache iconCache = mock(IconCache.class);
when(iconCache.getIcon(tile.getIcon())) when(iconCache.getIcon(tile.getIcon(context)))
.thenReturn(context.getDrawable(R.drawable.ic_settings)); .thenReturn(context.getDrawable(R.drawable.ic_settings));
mDashboardAdapter = new DashboardAdapter(context, null /* savedInstanceState */, mDashboardAdapter = new DashboardAdapter(context, null /* savedInstanceState */,
@@ -224,7 +224,7 @@ public class DashboardAdapterTest {
new DashboardAdapter.DashboardItemHolder(view); new DashboardAdapter.DashboardItemHolder(view);
final Tile tile = spy(new Tile(mActivityInfo)); final Tile tile = spy(new Tile(mActivityInfo));
final Icon icon = Icon.createWithResource(context, R.drawable.ic_settings); final Icon icon = Icon.createWithResource(context, R.drawable.ic_settings);
doReturn(icon).when(tile).getIcon(); doReturn(icon).when(tile).getIcon(context);
final IconCache iconCache = new IconCache(context); final IconCache iconCache = new IconCache(context);
@@ -235,7 +235,8 @@ public class DashboardAdapterTest {
doReturn("another.package").when(context).getPackageName(); doReturn("another.package").when(context).getPackageName();
mDashboardAdapter.onBindTile(holder, tile); mDashboardAdapter.onBindTile(holder, tile);
assertThat(iconCache.getIcon(tile.getIcon())).isInstanceOf(RoundedHomepageIcon.class); assertThat(iconCache.getIcon(tile.getIcon(context)))
.isInstanceOf(RoundedHomepageIcon.class);
} }
@Test @Test
@@ -249,7 +250,7 @@ public class DashboardAdapterTest {
tile.metaData.putInt(TileUtils.META_DATA_PREFERENCE_ICON_BACKGROUND_HINT, tile.metaData.putInt(TileUtils.META_DATA_PREFERENCE_ICON_BACKGROUND_HINT,
R.color.memory_critical); R.color.memory_critical);
doReturn(Icon.createWithResource(context, R.drawable.ic_settings)) doReturn(Icon.createWithResource(context, R.drawable.ic_settings))
.when(tile).getIcon(); .when(tile).getIcon(context);
final IconCache iconCache = new IconCache(context); final IconCache iconCache = new IconCache(context);
mDashboardAdapter = new DashboardAdapter(context, null /* savedInstanceState */, mDashboardAdapter = new DashboardAdapter(context, null /* savedInstanceState */,
null /* conditions */, null /* suggestionControllerMixin */, null /* lifecycle */); null /* conditions */, null /* suggestionControllerMixin */, null /* lifecycle */);
@@ -259,7 +260,7 @@ public class DashboardAdapterTest {
mDashboardAdapter.onBindTile(holder, tile); mDashboardAdapter.onBindTile(holder, tile);
final RoundedHomepageIcon homepageIcon = (RoundedHomepageIcon) iconCache.getIcon( final RoundedHomepageIcon homepageIcon = (RoundedHomepageIcon) iconCache.getIcon(
tile.getIcon()); tile.getIcon(context));
assertThat(homepageIcon.mBackgroundColor) assertThat(homepageIcon.mBackgroundColor)
.isEqualTo(RuntimeEnvironment.application.getColor(R.color.memory_critical)); .isEqualTo(RuntimeEnvironment.application.getColor(R.color.memory_critical));
} }
@@ -271,11 +272,11 @@ public class DashboardAdapterTest {
final DashboardAdapter.DashboardItemHolder holder = final DashboardAdapter.DashboardItemHolder holder =
new DashboardAdapter.DashboardItemHolder(view); new DashboardAdapter.DashboardItemHolder(view);
final Tile tile = spy(new Tile(mActivityInfo)); final Tile tile = spy(new Tile(mActivityInfo));
doReturn(mock(Icon.class)).when(tile).getIcon(); doReturn(mock(Icon.class)).when(tile).getIcon(context);
when(tile.getIcon().getResPackage()).thenReturn("another.package"); when(tile.getIcon(context).getResPackage()).thenReturn("another.package");
final IconCache iconCache = mock(IconCache.class); final IconCache iconCache = mock(IconCache.class);
when(iconCache.getIcon(tile.getIcon())).thenReturn(mock(RoundedHomepageIcon.class)); when(iconCache.getIcon(tile.getIcon(context))).thenReturn(mock(RoundedHomepageIcon.class));
mDashboardAdapter = new DashboardAdapter(context, null /* savedInstanceState */, mDashboardAdapter = new DashboardAdapter(context, null /* savedInstanceState */,
null /* conditions */, null /* suggestionControllerMixin */, null /* lifecycle */); null /* conditions */, null /* suggestionControllerMixin */, null /* lifecycle */);
@@ -283,7 +284,8 @@ public class DashboardAdapterTest {
mDashboardAdapter.onBindTile(holder, tile); mDashboardAdapter.onBindTile(holder, tile);
verify(iconCache, never()).updateIcon(eq(tile.getIcon()), any(RoundedHomepageIcon.class)); verify(iconCache, never()).updateIcon(eq(tile.getIcon(context)),
any(RoundedHomepageIcon.class));
} }
private List<Suggestion> makeSuggestionsV2(String... pkgNames) { private List<Suggestion> makeSuggestionsV2(String... pkgNames) {

View File

@@ -120,7 +120,7 @@ public class DashboardFeatureProviderImplTest {
tile.title = "title"; tile.title = "title";
tile.summary = "summary"; tile.summary = "summary";
doReturn(Icon.createWithBitmap(Bitmap.createBitmap(1, 1, Bitmap.Config.RGB_565))) doReturn(Icon.createWithBitmap(Bitmap.createBitmap(1, 1, Bitmap.Config.RGB_565)))
.when(tile).getIcon(); .when(tile).getIcon(any(Context.class));
tile.metaData = new Bundle(); tile.metaData = new Bundle();
tile.metaData.putString(SettingsActivity.META_DATA_KEY_FRAGMENT_CLASS, "HI"); tile.metaData.putString(SettingsActivity.META_DATA_KEY_FRAGMENT_CLASS, "HI");
tile.priority = 10; tile.priority = 10;

View File

@@ -17,6 +17,7 @@ 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.any;
import static org.mockito.ArgumentMatchers.nullable; import static org.mockito.ArgumentMatchers.nullable;
import static org.mockito.Mockito.doReturn; import static org.mockito.Mockito.doReturn;
import static org.mockito.Mockito.mock; import static org.mockito.Mockito.mock;
@@ -183,7 +184,7 @@ public class DashboardFragmentTest {
@Test @Test
public void tintTileIcon_hasMetadata_shouldReturnIconTintableMetadata() { public void tintTileIcon_hasMetadata_shouldReturnIconTintableMetadata() {
final Tile tile = spy(new Tile(mActivityInfo)); final Tile tile = spy(new Tile(mActivityInfo));
doReturn(mock(Icon.class)).when(tile).getIcon(); doReturn(mock(Icon.class)).when(tile).getIcon(any(Context.class));
final Bundle metaData = new Bundle(); final Bundle metaData = new Bundle();
tile.metaData = metaData; tile.metaData = metaData;
@@ -205,7 +206,7 @@ public class DashboardFragmentTest {
@Test @Test
public void tintTileIcon_noMetadata_shouldReturnPackageNameCheck() { public void tintTileIcon_noMetadata_shouldReturnPackageNameCheck() {
final Tile tile = spy(new Tile(mActivityInfo)); final Tile tile = spy(new Tile(mActivityInfo));
doReturn(mock(Icon.class)).when(tile).getIcon(); doReturn(mock(Icon.class)).when(tile).getIcon(any(Context.class));
final Intent intent = new Intent(); final Intent intent = new Intent();
tile.intent = intent; tile.intent = intent;
intent.setComponent( intent.setComponent(