Force externally injected tiles to use rounded icon.

Bug: 110405144
Change-Id: Ic65200fce5010ea8077254e7a67bbe4dae886ec3
Fixes: 79748104
Test: robotests
This commit is contained in:
Fan Zhang
2018-08-10 15:37:41 -07:00
parent 7d5a9eebb8
commit fde4f207ff
8 changed files with 116 additions and 99 deletions

View File

@@ -26,6 +26,7 @@
android:title="@string/network_dashboard_title" android:title="@string/network_dashboard_title"
android:summary="@string/summary_placeholder" android:summary="@string/summary_placeholder"
android:icon="@drawable/ic_homepage_network" android:icon="@drawable/ic_homepage_network"
android:order="-110"
android:fragment="com.android.settings.network.NetworkDashboardFragment" android:fragment="com.android.settings.network.NetworkDashboardFragment"
settings:controller="com.android.settings.network.TopLevelNetworkEntryPreferenceController"/> settings:controller="com.android.settings.network.TopLevelNetworkEntryPreferenceController"/>
@@ -34,6 +35,7 @@
android:title="@string/connected_devices_dashboard_title" android:title="@string/connected_devices_dashboard_title"
android:summary="@string/summary_placeholder" android:summary="@string/summary_placeholder"
android:icon="@drawable/ic_homepage_connected_device" android:icon="@drawable/ic_homepage_connected_device"
android:order="-100"
android:fragment="com.android.settings.connecteddevice.ConnectedDeviceDashboardFragment" android:fragment="com.android.settings.connecteddevice.ConnectedDeviceDashboardFragment"
settings:controller="com.android.settings.connecteddevice.TopLevelConnectedDevicesPreferenceController"/> settings:controller="com.android.settings.connecteddevice.TopLevelConnectedDevicesPreferenceController"/>
@@ -42,6 +44,7 @@
android:title="@string/app_and_notification_dashboard_title" android:title="@string/app_and_notification_dashboard_title"
android:summary="@string/app_and_notification_dashboard_summary" android:summary="@string/app_and_notification_dashboard_summary"
android:icon="@drawable/ic_homepage_apps" android:icon="@drawable/ic_homepage_apps"
android:order="-90"
android:fragment="com.android.settings.applications.AppAndNotificationDashboardFragment"/> android:fragment="com.android.settings.applications.AppAndNotificationDashboardFragment"/>
<Preference <Preference
@@ -50,6 +53,7 @@
android:summary="@string/summary_placeholder" android:summary="@string/summary_placeholder"
android:icon="@drawable/ic_homepage_battery" android:icon="@drawable/ic_homepage_battery"
android:fragment="com.android.settings.fuelgauge.PowerUsageSummary" android:fragment="com.android.settings.fuelgauge.PowerUsageSummary"
android:order="-80"
settings:controller="com.android.settings.fuelgauge.TopLevelBatteryPreferenceController"/> settings:controller="com.android.settings.fuelgauge.TopLevelBatteryPreferenceController"/>
<Preference <Preference
@@ -57,6 +61,7 @@
android:title="@string/display_settings" android:title="@string/display_settings"
android:summary="@string/display_dashboard_summary" android:summary="@string/display_dashboard_summary"
android:icon="@drawable/ic_homepage_display" android:icon="@drawable/ic_homepage_display"
android:order="-70"
android:fragment="com.android.settings.DisplaySettings"/> android:fragment="com.android.settings.DisplaySettings"/>
<Preference <Preference
@@ -64,6 +69,7 @@
android:title="@string/sound_settings" android:title="@string/sound_settings"
android:summary="@string/sound_dashboard_summary" android:summary="@string/sound_dashboard_summary"
android:icon="@drawable/ic_homepage_sound" android:icon="@drawable/ic_homepage_sound"
android:order="-60"
android:fragment="com.android.settings.notification.SoundSettings"/> android:fragment="com.android.settings.notification.SoundSettings"/>
<Preference <Preference
@@ -71,6 +77,7 @@
android:title="@string/storage_settings" android:title="@string/storage_settings"
android:summary="@string/summary_placeholder" android:summary="@string/summary_placeholder"
android:icon="@drawable/ic_homepage_storage" android:icon="@drawable/ic_homepage_storage"
android:order="-50"
android:fragment="com.android.settings.deviceinfo.StorageSettings" android:fragment="com.android.settings.deviceinfo.StorageSettings"
settings:controller="com.android.settings.deviceinfo.TopLevelStoragePreferenceController"/> settings:controller="com.android.settings.deviceinfo.TopLevelStoragePreferenceController"/>
@@ -79,6 +86,7 @@
android:title="@string/security_settings_title" android:title="@string/security_settings_title"
android:summary="@string/summary_placeholder" android:summary="@string/summary_placeholder"
android:icon="@drawable/ic_homepage_security" android:icon="@drawable/ic_homepage_security"
android:order="-40"
android:fragment="com.android.settings.security.SecuritySettings" android:fragment="com.android.settings.security.SecuritySettings"
settings:controller="com.android.settings.security.TopLevelSecurityEntryPreferenceController"/> settings:controller="com.android.settings.security.TopLevelSecurityEntryPreferenceController"/>
@@ -87,6 +95,7 @@
android:title="@string/account_dashboard_title" android:title="@string/account_dashboard_title"
android:summary="@string/summary_placeholder" android:summary="@string/summary_placeholder"
android:icon="@drawable/ic_homepage_accounts" android:icon="@drawable/ic_homepage_accounts"
android:order="-30"
android:fragment="com.android.settings.accounts.AccountDashboardFragment" android:fragment="com.android.settings.accounts.AccountDashboardFragment"
settings:controller="com.android.settings.accounts.TopLevelAccountEntryPreferenceController"/> settings:controller="com.android.settings.accounts.TopLevelAccountEntryPreferenceController"/>
@@ -95,6 +104,7 @@
android:title="@string/accessibility_settings" android:title="@string/accessibility_settings"
android:summary="@string/accessibility_settings_summary" android:summary="@string/accessibility_settings_summary"
android:icon="@drawable/ic_homepage_accessibility" android:icon="@drawable/ic_homepage_accessibility"
android:order="-20"
android:fragment="com.android.settings.accessibility.AccessibilitySettings"/> android:fragment="com.android.settings.accessibility.AccessibilitySettings"/>
<Preference <Preference
@@ -102,12 +112,14 @@
android:title="@string/header_category_system" android:title="@string/header_category_system"
android:summary="@string/system_dashboard_summary" android:summary="@string/system_dashboard_summary"
android:icon="@drawable/ic_homepage_system_dashboard" android:icon="@drawable/ic_homepage_system_dashboard"
android:order="-10"
android:fragment="com.android.settings.system.SystemDashboardFragment"/> android:fragment="com.android.settings.system.SystemDashboardFragment"/>
<Preference <Preference
android:key="top_level_support" android:key="top_level_support"
android:summary="@string/support_summary" android:summary="@string/support_summary"
android:title="@string/page_tab_title_support" android:title="@string/page_tab_title_support"
android:icon="@drawable/ic_homepage_support"/> android:icon="@drawable/ic_homepage_support"
android:order="100"/>
</PreferenceScreen> </PreferenceScreen>

View File

@@ -16,7 +16,6 @@
package com.android.settings.dashboard; package com.android.settings.dashboard;
import android.content.Context; import android.content.Context;
import android.content.pm.PackageManager;
import android.graphics.drawable.Drawable; import android.graphics.drawable.Drawable;
import android.graphics.drawable.Icon; import android.graphics.drawable.Icon;
import android.os.Bundle; import android.os.Bundle;
@@ -51,7 +50,6 @@ import com.android.settingslib.core.lifecycle.LifecycleObserver;
import com.android.settingslib.core.lifecycle.events.OnSaveInstanceState; import com.android.settingslib.core.lifecycle.events.OnSaveInstanceState;
import com.android.settingslib.drawer.DashboardCategory; import com.android.settingslib.drawer.DashboardCategory;
import com.android.settingslib.drawer.Tile; import com.android.settingslib.drawer.Tile;
import com.android.settingslib.drawer.TileUtils;
import com.android.settingslib.suggestions.SuggestionControllerMixinCompat; import com.android.settingslib.suggestions.SuggestionControllerMixinCompat;
import com.android.settingslib.utils.IconCache; import com.android.settingslib.utils.IconCache;
@@ -65,7 +63,7 @@ public class DashboardAdapter extends RecyclerView.Adapter<DashboardAdapter.Dash
@VisibleForTesting @VisibleForTesting
static final String STATE_CONDITION_EXPANDED = "condition_expanded"; static final String STATE_CONDITION_EXPANDED = "condition_expanded";
static final String META_DATA_PREFERENCE_ICON_BACKGROUND_ARGB = "com.android.settings.bg.argb";
private final IconCache mCache; private final IconCache mCache;
private final Context mContext; private final Context mContext;
private final MetricsFeatureProvider mMetricsFeatureProvider; private final MetricsFeatureProvider mMetricsFeatureProvider;
@@ -248,10 +246,6 @@ public class DashboardAdapter extends RecyclerView.Adapter<DashboardAdapter.Dash
return mDashboardData.getItemEntityById(itemId); return mDashboardData.getItemEntityById(itemId);
} }
public Suggestion getSuggestion(int position) {
return mSuggestionAdapter.getSuggestion(position);
}
@VisibleForTesting @VisibleForTesting
void notifyDashboardDataChanged(DashboardData prevData) { void notifyDashboardDataChanged(DashboardData prevData) {
if (mFirstFrameDrawn && prevData != null) { if (mFirstFrameDrawn && prevData != null) {
@@ -322,31 +316,7 @@ public class DashboardAdapter extends RecyclerView.Adapter<DashboardAdapter.Dash
if (!TextUtils.equals(tileIcon.getResPackage(), mContext.getPackageName()) if (!TextUtils.equals(tileIcon.getResPackage(), mContext.getPackageName())
&& !(icon instanceof RoundedHomepageIcon)) { && !(icon instanceof RoundedHomepageIcon)) {
icon = new RoundedHomepageIcon(mContext, icon); icon = new RoundedHomepageIcon(mContext, icon);
final Bundle metaData = tile.getMetaData(); ((RoundedHomepageIcon) icon).setBackgroundColor(mContext, tile);
try {
if (metaData != null) {
// Load from bg.argb first
int bgColor = metaData.getInt(META_DATA_PREFERENCE_ICON_BACKGROUND_ARGB,
0 /* default */);
// Not found, load from bg.hint
if (bgColor == 0) {
final int colorRes = metaData.getInt(
TileUtils.META_DATA_PREFERENCE_ICON_BACKGROUND_HINT,
0 /* default */);
if (colorRes != 0) {
bgColor = mContext.getPackageManager()
.getResourcesForApplication(tileIcon.getResPackage())
.getColor(colorRes, null /* theme */);
}
}
// If found anything, use it.
if (bgColor != 0) {
((RoundedHomepageIcon) icon).setBackgroundColor(bgColor);
}
}
} catch (PackageManager.NameNotFoundException e) {
Log.e(TAG, "Failed to set background color for " + tile.getPackageName());
}
mCache.updateIcon(tileIcon, icon); mCache.updateIcon(tileIcon, icon);
} }
holder.icon.setImageDrawable(icon); holder.icon.setImageDrawable(icon);

View File

@@ -25,6 +25,7 @@ import android.content.Context;
import android.content.IContentProvider; import android.content.IContentProvider;
import android.content.Intent; import android.content.Intent;
import android.content.pm.PackageManager; import android.content.pm.PackageManager;
import android.graphics.drawable.Drawable;
import android.graphics.drawable.Icon; import android.graphics.drawable.Icon;
import android.os.Bundle; import android.os.Bundle;
import android.provider.Settings; import android.provider.Settings;
@@ -42,6 +43,7 @@ import com.android.settings.R;
import com.android.settings.SettingsActivity; import com.android.settings.SettingsActivity;
import com.android.settings.dashboard.profileselector.ProfileSelectDialog; import com.android.settings.dashboard.profileselector.ProfileSelectDialog;
import com.android.settings.overlay.FeatureFactory; import com.android.settings.overlay.FeatureFactory;
import com.android.settings.widget.RoundedHomepageIcon;
import com.android.settingslib.core.instrumentation.MetricsFeatureProvider; import com.android.settingslib.core.instrumentation.MetricsFeatureProvider;
import com.android.settingslib.core.instrumentation.VisibilityLoggerMixin; import com.android.settingslib.core.instrumentation.VisibilityLoggerMixin;
import com.android.settingslib.drawer.DashboardCategory; import com.android.settingslib.drawer.DashboardCategory;
@@ -49,7 +51,6 @@ import com.android.settingslib.drawer.Tile;
import com.android.settingslib.drawer.TileUtils; import com.android.settingslib.drawer.TileUtils;
import com.android.settingslib.utils.ThreadUtils; import com.android.settingslib.utils.ThreadUtils;
import java.util.ArrayList;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
@@ -112,7 +113,7 @@ public class DashboardFeatureProviderImpl implements DashboardFeatureProvider {
pref.setKey(getDashboardKeyForTile(tile)); pref.setKey(getDashboardKeyForTile(tile));
} }
bindSummary(pref, tile); bindSummary(pref, tile);
bindIcon(pref, tile); bindIcon(pref, tile, forceRoundedIcon);
final Bundle metadata = tile.getMetaData(); final Bundle metadata = tile.getMetaData();
String clsName = null; String clsName = null;
String action = null; String action = null;
@@ -192,10 +193,16 @@ public class DashboardFeatureProviderImpl implements DashboardFeatureProvider {
} }
@VisibleForTesting @VisibleForTesting
void bindIcon(Preference preference, Tile tile) { void bindIcon(Preference preference, Tile tile, boolean forceRoundedIcon) {
final Icon tileIcon = tile.getIcon(mContext); final Icon tileIcon = tile.getIcon(mContext);
if (tileIcon != null) { if (tileIcon != null) {
preference.setIcon(tileIcon.loadDrawable(preference.getContext())); Drawable iconDrawable = tileIcon.loadDrawable(preference.getContext());
if (forceRoundedIcon
&& !TextUtils.equals(mContext.getPackageName(), tile.getPackageName())) {
iconDrawable = new RoundedHomepageIcon(mContext, iconDrawable);
((RoundedHomepageIcon) iconDrawable).setBackgroundColor(mContext, tile);
}
preference.setIcon(iconDrawable);
} else if (tile.getMetaData() != null } else if (tile.getMetaData() != null
&& tile.getMetaData().containsKey(META_DATA_PREFERENCE_ICON_URI)) { && tile.getMetaData().containsKey(META_DATA_PREFERENCE_ICON_URI)) {
ThreadUtils.postOnBackgroundThread(() -> { ThreadUtils.postOnBackgroundThread(() -> {

View File

@@ -62,8 +62,9 @@ public class DashboardFragmentRegistry {
static { static {
PARENT_TO_CATEGORY_KEY_MAP = new ArrayMap<>(); PARENT_TO_CATEGORY_KEY_MAP = new ArrayMap<>();
PARENT_TO_CATEGORY_KEY_MAP.put(TopLevelSettings.class.getName(), // TODO(b/110405144): Add the mapping when IA.homepage intent-filter is is removed.
CategoryKey.CATEGORY_HOMEPAGE); // PARENT_TO_CATEGORY_KEY_MAP.put(TopLevelSettings.class.getName(),
// CategoryKey.CATEGORY_HOMEPAGE);
PARENT_TO_CATEGORY_KEY_MAP.put( PARENT_TO_CATEGORY_KEY_MAP.put(
NetworkDashboardFragment.class.getName(), CategoryKey.CATEGORY_NETWORK); NetworkDashboardFragment.class.getName(), CategoryKey.CATEGORY_NETWORK);
PARENT_TO_CATEGORY_KEY_MAP.put(ConnectedDeviceDashboardFragment.class.getName(), PARENT_TO_CATEGORY_KEY_MAP.put(ConnectedDeviceDashboardFragment.class.getName(),

View File

@@ -18,25 +18,31 @@ package com.android.settings.widget;
import static androidx.annotation.VisibleForTesting.NONE; import static androidx.annotation.VisibleForTesting.NONE;
import static com.android.settingslib.drawer.TileUtils.META_DATA_PREFERENCE_ICON_BACKGROUND_ARGB;
import static com.android.settingslib.drawer.TileUtils.META_DATA_PREFERENCE_ICON_BACKGROUND_HINT;
import android.content.Context; import android.content.Context;
import android.content.pm.PackageManager;
import android.graphics.PorterDuff; import android.graphics.PorterDuff;
import android.graphics.drawable.Drawable; import android.graphics.drawable.Drawable;
import android.graphics.drawable.LayerDrawable; import android.graphics.drawable.LayerDrawable;
import android.os.Bundle;
import android.util.Log; import android.util.Log;
import com.android.settings.R;
import androidx.annotation.VisibleForTesting; import androidx.annotation.VisibleForTesting;
import com.android.settings.R;
import com.android.settingslib.drawer.Tile;
public class RoundedHomepageIcon extends LayerDrawable { public class RoundedHomepageIcon extends LayerDrawable {
private static final String TAG = "RoundedHomepageIcon"; private static final String TAG = "RoundedHomepageIcon";
@VisibleForTesting(otherwise = NONE) @VisibleForTesting(otherwise = NONE)
public int mBackgroundColor = -1; int mBackgroundColor = -1;
public RoundedHomepageIcon(Context context, Drawable foreground) { public RoundedHomepageIcon(Context context, Drawable foreground) {
super(new Drawable[] { super(new Drawable[]{
context.getDrawable(R.drawable.ic_homepage_generic_background), context.getDrawable(R.drawable.ic_homepage_generic_background),
foreground foreground
}); });
@@ -45,6 +51,33 @@ public class RoundedHomepageIcon extends LayerDrawable {
setLayerInset(1 /* index */, insetPx, insetPx, insetPx, insetPx); setLayerInset(1 /* index */, insetPx, insetPx, insetPx, insetPx);
} }
public void setBackgroundColor(Context context, Tile tile) {
final Bundle metaData = tile.getMetaData();
try {
if (metaData != null) {
// Load from bg.argb first
int bgColor = metaData.getInt(META_DATA_PREFERENCE_ICON_BACKGROUND_ARGB,
0 /* default */);
// Not found, load from bg.hint
if (bgColor == 0) {
final int colorRes = metaData.getInt(META_DATA_PREFERENCE_ICON_BACKGROUND_HINT,
0 /* default */);
if (colorRes != 0) {
bgColor = context.getPackageManager()
.getResourcesForApplication(tile.getPackageName())
.getColor(colorRes, null /* theme */);
}
}
// If found anything, use it.
if (bgColor != 0) {
setBackgroundColor(bgColor);
}
}
} catch (PackageManager.NameNotFoundException e) {
Log.e(TAG, "Failed to set background color for " + tile.getPackageName());
}
}
public void setBackgroundColor(int color) { public void setBackgroundColor(int color) {
mBackgroundColor = color; mBackgroundColor = color;
getDrawable(0).setColorFilter(color, PorterDuff.Mode.SRC_ATOP); getDrawable(0).setColorFilter(color, PorterDuff.Mode.SRC_ATOP);

View File

@@ -53,7 +53,6 @@ import com.android.settings.testutils.shadow.SettingsShadowResources;
import com.android.settings.widget.RoundedHomepageIcon; import com.android.settings.widget.RoundedHomepageIcon;
import com.android.settingslib.drawer.CategoryKey; import com.android.settingslib.drawer.CategoryKey;
import com.android.settingslib.drawer.Tile; import com.android.settingslib.drawer.Tile;
import com.android.settingslib.drawer.TileUtils;
import com.android.settingslib.utils.IconCache; import com.android.settingslib.utils.IconCache;
import org.junit.Before; import org.junit.Before;
@@ -115,7 +114,7 @@ public class DashboardAdapterTest {
spy(new DashboardAdapter(mContext, null /* savedInstanceState */, spy(new DashboardAdapter(mContext, null /* savedInstanceState */,
null /* conditions */, null /* suggestionControllerMixin */, null /* conditions */, null /* suggestionControllerMixin */,
null /* lifecycle */)); null /* lifecycle */));
final List<Suggestion> suggestions = makeSuggestionsV2("pkg1", "pkg2", "pkg3"); final List<Suggestion> suggestions = makeSuggestions("pkg1", "pkg2", "pkg3");
adapter.setSuggestions(suggestions); adapter.setSuggestions(suggestions);
final RecyclerView data = mock(RecyclerView.class); final RecyclerView data = mock(RecyclerView.class);
@@ -147,7 +146,7 @@ public class DashboardAdapterTest {
spy(new DashboardAdapter(mContext, null /* savedInstanceState */, spy(new DashboardAdapter(mContext, null /* savedInstanceState */,
null /* conditions */, null /* suggestionControllerMixin */, null /* conditions */, null /* suggestionControllerMixin */,
null /* lifecycle */)); null /* lifecycle */));
final List<Suggestion> suggestions = makeSuggestionsV2("pkg1"); final List<Suggestion> suggestions = makeSuggestions("pkg1");
adapter.setSuggestions(suggestions); adapter.setSuggestions(suggestions);
final DashboardData dashboardData = adapter.mDashboardData; final DashboardData dashboardData = adapter.mDashboardData;
reset(adapter); // clear interactions tracking reset(adapter); // clear interactions tracking
@@ -164,7 +163,7 @@ public class DashboardAdapterTest {
spy(new DashboardAdapter(mContext, null /* savedInstanceState */, spy(new DashboardAdapter(mContext, null /* savedInstanceState */,
null /* conditions */, null /* suggestionControllerMixin */, null /* conditions */, null /* suggestionControllerMixin */,
null /* lifecycle */)); null /* lifecycle */));
final List<Suggestion> suggestions = makeSuggestionsV2("pkg1"); final List<Suggestion> suggestions = makeSuggestions("pkg1");
adapter.setSuggestions(suggestions); adapter.setSuggestions(suggestions);
reset(adapter); // clear interactions tracking reset(adapter); // clear interactions tracking
@@ -178,7 +177,7 @@ public class DashboardAdapterTest {
public void onBindSuggestion_shouldSetSuggestionAdapterAndNoCrash() { public void onBindSuggestion_shouldSetSuggestionAdapterAndNoCrash() {
mDashboardAdapter = new DashboardAdapter(mContext, null /* savedInstanceState */, mDashboardAdapter = new DashboardAdapter(mContext, null /* savedInstanceState */,
null /* conditions */, null /* suggestionControllerMixin */, null /* lifecycle */); null /* conditions */, null /* suggestionControllerMixin */, null /* lifecycle */);
final List<Suggestion> suggestions = makeSuggestionsV2("pkg1"); final List<Suggestion> suggestions = makeSuggestions("pkg1");
mDashboardAdapter.setSuggestions(suggestions); mDashboardAdapter.setSuggestions(suggestions);
@@ -243,55 +242,6 @@ public class DashboardAdapterTest {
.isInstanceOf(RoundedHomepageIcon.class); .isInstanceOf(RoundedHomepageIcon.class);
} }
@Test
public void onBindTile_externalTileWithBackgroundColorRawValue_shouldUpdateIcon() {
final Context context = spy(RuntimeEnvironment.application);
final View view = LayoutInflater.from(context).inflate(R.layout.dashboard_tile, null);
final DashboardAdapter.DashboardItemHolder holder =
new DashboardAdapter.DashboardItemHolder(view);
final Tile tile = spy(new Tile(mActivityInfo, CategoryKey.CATEGORY_HOMEPAGE));
tile.getMetaData().putInt(DashboardAdapter.META_DATA_PREFERENCE_ICON_BACKGROUND_ARGB,
0xff0000);
doReturn(Icon.createWithResource(context, R.drawable.ic_settings))
.when(tile).getIcon(context);
final IconCache iconCache = new IconCache(context);
mDashboardAdapter = new DashboardAdapter(context, null /* savedInstanceState */,
null /* conditions */, null /* suggestionControllerMixin */, null /* lifecycle */);
ReflectionHelpers.setField(mDashboardAdapter, "mCache", iconCache);
doReturn("another.package").when(context).getPackageName();
mDashboardAdapter.onBindTile(holder, tile);
final RoundedHomepageIcon homepageIcon = (RoundedHomepageIcon) iconCache.getIcon(
tile.getIcon(context));
assertThat(homepageIcon.mBackgroundColor).isEqualTo(0xff0000);
}
@Test
public void onBindTile_externalTileWithBackgroundColorHint_shouldUpdateIcon() {
final Context context = spy(RuntimeEnvironment.application);
final View view = LayoutInflater.from(context).inflate(R.layout.dashboard_tile, null);
final DashboardAdapter.DashboardItemHolder holder =
new DashboardAdapter.DashboardItemHolder(view);
final Tile tile = spy(new Tile(mActivityInfo, CategoryKey.CATEGORY_HOMEPAGE));
tile.getMetaData().putInt(TileUtils.META_DATA_PREFERENCE_ICON_BACKGROUND_HINT,
R.color.memory_critical);
doReturn(Icon.createWithResource(context, R.drawable.ic_settings))
.when(tile).getIcon(context);
final IconCache iconCache = new IconCache(context);
mDashboardAdapter = new DashboardAdapter(context, null /* savedInstanceState */,
null /* conditions */, null /* suggestionControllerMixin */, null /* lifecycle */);
ReflectionHelpers.setField(mDashboardAdapter, "mCache", iconCache);
doReturn("another.package").when(context).getPackageName();
mDashboardAdapter.onBindTile(holder, tile);
final RoundedHomepageIcon homepageIcon = (RoundedHomepageIcon) iconCache.getIcon(
tile.getIcon(context));
assertThat(homepageIcon.mBackgroundColor)
.isEqualTo(RuntimeEnvironment.application.getColor(R.color.memory_critical));
}
@Test @Test
public void onBindTile_externalTile_usingRoundedHomepageIcon_shouldNotUpdateIcon() { public void onBindTile_externalTile_usingRoundedHomepageIcon_shouldNotUpdateIcon() {
final Context context = RuntimeEnvironment.application; final Context context = RuntimeEnvironment.application;
@@ -315,7 +265,7 @@ public class DashboardAdapterTest {
any(RoundedHomepageIcon.class)); any(RoundedHomepageIcon.class));
} }
private List<Suggestion> makeSuggestionsV2(String... pkgNames) { private List<Suggestion> makeSuggestions(String... pkgNames) {
final List<Suggestion> suggestions = new ArrayList<>(); final List<Suggestion> suggestions = new ArrayList<>();
for (String pkgName : pkgNames) { for (String pkgName : pkgNames) {
final Suggestion suggestion = new Suggestion.Builder(pkgName) final Suggestion suggestion = new Suggestion.Builder(pkgName)

View File

@@ -291,7 +291,7 @@ public class DashboardFeatureProviderImplTest {
mActivityInfo.metaData.putString(META_DATA_PREFERENCE_KEYHINT, "key"); mActivityInfo.metaData.putString(META_DATA_PREFERENCE_KEYHINT, "key");
mActivityInfo.metaData.putString(TileUtils.META_DATA_PREFERENCE_ICON_URI, mActivityInfo.metaData.putString(TileUtils.META_DATA_PREFERENCE_ICON_URI,
"content://com.android.settings/tile_icon"); "content://com.android.settings/tile_icon");
mImpl.bindIcon(preference, tile); mImpl.bindIcon(preference, tile, false /* forceRoundedIcon */);
assertThat(preference.getIcon()).isNotNull(); assertThat(preference.getIcon()).isNotNull();
} }

View File

@@ -16,21 +16,30 @@
package com.android.settings.widget; package com.android.settings.widget;
import static com.android.settingslib.drawer.TileUtils.META_DATA_PREFERENCE_ICON_BACKGROUND_ARGB;
import static com.android.settingslib.drawer.TileUtils.META_DATA_PREFERENCE_ICON_BACKGROUND_HINT;
import static com.google.common.truth.Truth.assertThat; import static com.google.common.truth.Truth.assertThat;
import static org.mockito.Mockito.doReturn;
import static org.mockito.Mockito.mock; import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.spy; import static org.mockito.Mockito.spy;
import static org.mockito.Mockito.verify; import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when; import static org.mockito.Mockito.when;
import android.content.Context; import android.content.Context;
import android.content.pm.ActivityInfo;
import android.graphics.Color; import android.graphics.Color;
import android.graphics.PorterDuff; import android.graphics.PorterDuff;
import android.graphics.drawable.ColorDrawable; import android.graphics.drawable.ColorDrawable;
import android.graphics.drawable.Icon;
import android.graphics.drawable.ShapeDrawable; import android.graphics.drawable.ShapeDrawable;
import android.os.Bundle;
import com.android.settings.R; import com.android.settings.R;
import com.android.settings.testutils.SettingsRobolectricTestRunner; import com.android.settings.testutils.SettingsRobolectricTestRunner;
import com.android.settingslib.drawer.CategoryKey;
import com.android.settingslib.drawer.Tile;
import org.junit.Before; import org.junit.Before;
import org.junit.Test; import org.junit.Test;
@@ -41,10 +50,15 @@ import org.robolectric.RuntimeEnvironment;
public class RoundedHomepageIconTest { public class RoundedHomepageIconTest {
private Context mContext; private Context mContext;
private ActivityInfo mActivityInfo;
@Before @Before
public void setUp() { public void setUp() {
mContext = RuntimeEnvironment.application; mContext = RuntimeEnvironment.application;
mActivityInfo = new ActivityInfo();
mActivityInfo.packageName = mContext.getPackageName();
mActivityInfo.name = "class";
mActivityInfo.metaData = new Bundle();
} }
@Test @Test
@@ -68,4 +82,34 @@ public class RoundedHomepageIconTest {
verify(background).setColorFilter(Color.BLUE, PorterDuff.Mode.SRC_ATOP); verify(background).setColorFilter(Color.BLUE, PorterDuff.Mode.SRC_ATOP);
} }
@Test
public void setBackgroundColor_externalTileWithBackgroundColorRawValue_shouldUpdateIcon() {
final Tile tile = spy(new Tile(mActivityInfo, CategoryKey.CATEGORY_HOMEPAGE));
mActivityInfo.metaData.putInt(META_DATA_PREFERENCE_ICON_BACKGROUND_ARGB, 0xff0000);
doReturn(Icon.createWithResource(mContext, R.drawable.ic_settings))
.when(tile).getIcon(mContext);
final RoundedHomepageIcon icon =
new RoundedHomepageIcon(mContext, new ColorDrawable(Color.BLACK));
icon.setBackgroundColor(mContext, tile);
assertThat(icon.mBackgroundColor).isEqualTo(0xff0000);
}
@Test
public void onBindTile_externalTileWithBackgroundColorHint_shouldUpdateIcon() {
final Tile tile = spy(new Tile(mActivityInfo, CategoryKey.CATEGORY_HOMEPAGE));
mActivityInfo.metaData.putInt(META_DATA_PREFERENCE_ICON_BACKGROUND_HINT,
R.color.memory_critical);
doReturn(Icon.createWithResource(mContext, R.drawable.ic_settings))
.when(tile).getIcon(mContext);
final RoundedHomepageIcon icon =
new RoundedHomepageIcon(mContext, new ColorDrawable(Color.BLACK));
icon.setBackgroundColor(mContext, tile);
assertThat(icon.mBackgroundColor)
.isEqualTo(mContext.getColor(R.color.memory_critical));
}
} }