Merge "Support customizing icon color for externally items." into pi-dev am: 98a2064b61

am: 08becf87f4

Change-Id: I9392c7e8c00145437a2383864993a0b53791289b
This commit is contained in:
Fan Zhang
2018-04-13 12:10:46 -07:00
committed by android-build-merger
4 changed files with 80 additions and 7 deletions

View File

@@ -17,6 +17,7 @@ package com.android.settings.dashboard;
import android.app.Activity; import android.app.Activity;
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.os.Bundle; import android.os.Bundle;
import android.service.settings.suggestions.Suggestion; import android.service.settings.suggestions.Suggestion;
@@ -47,6 +48,7 @@ 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.SuggestionControllerMixin; import com.android.settingslib.suggestions.SuggestionControllerMixin;
import com.android.settingslib.utils.IconCache; import com.android.settingslib.utils.IconCache;
@@ -316,6 +318,20 @@ public class DashboardAdapter extends RecyclerView.Adapter<DashboardAdapter.Dash
if (!TextUtils.equals(tile.icon.getResPackage(), mContext.getPackageName()) if (!TextUtils.equals(tile.icon.getResPackage(), mContext.getPackageName())
&& !(icon instanceof RoundedHomepageIcon)) { && !(icon instanceof RoundedHomepageIcon)) {
icon = new RoundedHomepageIcon(mContext, icon); icon = new RoundedHomepageIcon(mContext, icon);
try {
if (tile.metaData != null) {
final int colorRes = tile.metaData.getInt(
TileUtils.META_DATA_PREFERENCE_ICON_BACKGROUND_HINT, 0 /* default */);
if (colorRes != 0) {
final int bgColor = mContext.getPackageManager()
.getResourcesForApplication(tile.icon.getResPackage())
.getColor(colorRes, null /* theme */);
((RoundedHomepageIcon) icon).setBackgroundColor(bgColor);
}
}
} catch (PackageManager.NameNotFoundException e) {
Log.e(TAG, "Failed to set background color for " + tile.intent.getPackage());
}
mCache.updateIcon(tile.icon, icon); mCache.updateIcon(tile.icon, icon);
} }
holder.icon.setImageDrawable(icon); holder.icon.setImageDrawable(icon);

View File

@@ -16,14 +16,21 @@
package com.android.settings.dashboard; package com.android.settings.dashboard;
import static android.support.annotation.VisibleForTesting.NONE;
import android.content.Context; import android.content.Context;
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.support.annotation.VisibleForTesting;
import com.android.settings.R; import com.android.settings.R;
public class RoundedHomepageIcon extends LayerDrawable { public class RoundedHomepageIcon extends LayerDrawable {
@VisibleForTesting(otherwise = NONE)
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),
@@ -33,4 +40,9 @@ public class RoundedHomepageIcon extends LayerDrawable {
.getDimensionPixelSize(R.dimen.dashboard_tile_foreground_image_inset); .getDimensionPixelSize(R.dimen.dashboard_tile_foreground_image_inset);
setLayerInset(1 /* index */, insetPx, insetPx, insetPx, insetPx); setLayerInset(1 /* index */, insetPx, insetPx, insetPx, insetPx);
} }
public void setBackgroundColor(int color) {
mBackgroundColor = color;
getDrawable(0).setColorFilter(color, PorterDuff.Mode.SRC_ATOP);
}
} }

View File

@@ -18,6 +18,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.any;
import static org.mockito.ArgumentMatchers.eq; import static org.mockito.ArgumentMatchers.eq;
import static org.mockito.Mockito.doReturn;
import static org.mockito.Mockito.mock; import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.never; import static org.mockito.Mockito.never;
import static org.mockito.Mockito.reset; import static org.mockito.Mockito.reset;
@@ -30,6 +31,7 @@ import android.content.Context;
import android.content.res.Resources; import android.content.res.Resources;
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.service.settings.suggestions.Suggestion; import android.service.settings.suggestions.Suggestion;
import android.support.v7.widget.RecyclerView; import android.support.v7.widget.RecyclerView;
import android.util.DisplayMetrics; import android.util.DisplayMetrics;
@@ -46,6 +48,7 @@ import com.android.settings.testutils.FakeFeatureFactory;
import com.android.settings.testutils.SettingsRobolectricTestRunner; import com.android.settings.testutils.SettingsRobolectricTestRunner;
import com.android.settings.testutils.shadow.SettingsShadowResources; import com.android.settings.testutils.shadow.SettingsShadowResources;
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;
@@ -193,24 +196,48 @@ public class DashboardAdapterTest {
@Test @Test
public void onBindTile_externalTile_shouldUpdateIcon() { public void onBindTile_externalTile_shouldUpdateIcon() {
final Context context = RuntimeEnvironment.application; final Context context = spy(RuntimeEnvironment.application);
final View view = LayoutInflater.from(context).inflate(R.layout.dashboard_tile, null); final View view = LayoutInflater.from(context).inflate(R.layout.dashboard_tile, null);
final DashboardAdapter.DashboardItemHolder holder = final DashboardAdapter.DashboardItemHolder holder =
new DashboardAdapter.DashboardItemHolder(view); new DashboardAdapter.DashboardItemHolder(view);
final Tile tile = new Tile(); final Tile tile = new Tile();
tile.icon = mock(Icon.class); tile.icon = Icon.createWithResource(context, R.drawable.ic_settings);
when(tile.icon.getResPackage()).thenReturn("another.package"); when(tile.icon.getResPackage()).thenReturn("another.package");
final IconCache iconCache = mock(IconCache.class); final IconCache iconCache = new IconCache(context);
when(iconCache.getIcon(tile.icon)).thenReturn(context.getDrawable(R.drawable.ic_settings));
mDashboardAdapter = new DashboardAdapter(context, null /* savedInstanceState */, mDashboardAdapter = new DashboardAdapter(context, null /* savedInstanceState */,
null /* conditions */, null /* suggestionControllerMixin */, null /* lifecycle */); null /* conditions */, null /* suggestionControllerMixin */, null /* lifecycle */);
ReflectionHelpers.setField(mDashboardAdapter, "mCache", iconCache); ReflectionHelpers.setField(mDashboardAdapter, "mCache", iconCache);
doReturn("another.package").when(context).getPackageName();
mDashboardAdapter.onBindTile(holder, tile); mDashboardAdapter.onBindTile(holder, tile);
verify(iconCache).updateIcon(eq(tile.icon), any(RoundedHomepageIcon.class)); assertThat(iconCache.getIcon(tile.icon)).isInstanceOf(RoundedHomepageIcon.class);
}
@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 = new Tile();
tile.metaData = new Bundle();
tile.metaData.putInt(TileUtils.META_DATA_PREFERENCE_ICON_BACKGROUND_HINT,
R.color.memory_critical);
tile.icon = Icon.createWithResource(context, R.drawable.ic_settings);
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.icon);
assertThat(homepageIcon.mBackgroundColor)
.isEqualTo(RuntimeEnvironment.application.getColor(R.color.memory_critical));
} }
@Test @Test

View File

@@ -17,10 +17,16 @@
package com.android.settings.dashboard; 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.Mockito.mock;
import static org.mockito.Mockito.spy;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
import android.content.Context; import android.content.Context;
import android.graphics.Color; import android.graphics.Color;
import android.graphics.PorterDuff;
import android.graphics.drawable.ColorDrawable; import android.graphics.drawable.ColorDrawable;
import android.graphics.drawable.ShapeDrawable;
import com.android.settings.R; import com.android.settings.R;
import com.android.settings.testutils.SettingsRobolectricTestRunner; import com.android.settings.testutils.SettingsRobolectricTestRunner;
@@ -49,4 +55,16 @@ public class RoundedHomepageIconTest {
assertThat(icon.getDrawable(0)) assertThat(icon.getDrawable(0))
.isEqualTo(mContext.getDrawable(R.drawable.ic_homepage_generic_background)); .isEqualTo(mContext.getDrawable(R.drawable.ic_homepage_generic_background));
} }
@Test
public void setBackgroundColor_shouldUpdateColorFilter() {
final RoundedHomepageIcon icon =
spy(new RoundedHomepageIcon(mContext, new ColorDrawable(Color.BLACK)));
final ShapeDrawable background = mock(ShapeDrawable.class);
when(icon.getDrawable(0)).thenReturn(background);
icon.setBackgroundColor(Color.BLUE);
verify(background).setColorFilter(Color.BLUE, PorterDuff.Mode.SRC_ATOP);
}
} }