From 31357bb9a877db18cba99a7643723d0a60c3010c Mon Sep 17 00:00:00 2001 From: Shahriyar Amini Date: Wed, 18 Jan 2017 19:00:56 -0800 Subject: [PATCH] Consider res package when updating security icons. Bug: 31002801 Test: make RunSettingsRoboTests Change-Id: Icef83cbe18d4b48c4091bdf421018bc817bcf33c --- .../security/SecurityFeatureProviderImpl.java | 37 ++++++------------- .../SecurityFeatureProviderImplTest.java | 5 ++- 2 files changed, 15 insertions(+), 27 deletions(-) diff --git a/src/com/android/settings/security/SecurityFeatureProviderImpl.java b/src/com/android/settings/security/SecurityFeatureProviderImpl.java index 91659fd275d..c2585b1e1d4 100644 --- a/src/com/android/settings/security/SecurityFeatureProviderImpl.java +++ b/src/com/android/settings/security/SecurityFeatureProviderImpl.java @@ -28,6 +28,7 @@ import android.support.v7.preference.Preference; import android.support.v7.preference.PreferenceScreen; import android.text.TextUtils; import android.util.ArrayMap; +import android.util.Pair; import com.android.settingslib.drawer.Tile; import com.android.settingslib.drawer.TileUtils; @@ -64,37 +65,23 @@ public class SecurityFeatureProviderImpl implements SecurityFeatureProvider { String summaryUri = tile.metaData.getString(TileUtils.META_DATA_PREFERENCE_SUMMARY_URI, null); if (!TextUtils.isEmpty(iconUri)) { - int icon = TileUtils.getIconFromUri(context, iconUri, providerMap); - boolean updateIcon = true; String packageName = null; - // Dynamic icon has to come from the same package that the preference launches. if (tile.intent != null) { - Intent intent = tile.intent; - if (!TextUtils.isEmpty(intent.getPackage())) { - packageName = intent.getPackage(); - } else if (intent.getComponent() != null) { - packageName = intent.getComponent().getPackageName(); - } - } - if (TextUtils.isEmpty(packageName)) { - updateIcon = false; - } else { - if (tile.icon == null) { - // If the tile does not have an icon already, only update if the suggested - // icon is non-zero. - updateIcon = (icon != 0); - } else { - // If the existing icon has the same resource package and resource id, the - // icon does not need to be updated. - updateIcon = !(packageName.equals(tile.icon.getResPackage()) - && (icon == tile.icon.getResId())); + Intent intent = tile.intent; + if (!TextUtils.isEmpty(intent.getPackage())) { + packageName = intent.getPackage(); + } else if (intent.getComponent() != null) { + packageName = intent.getComponent().getPackageName(); } } - if (updateIcon) { + Pair icon = + TileUtils.getIconFromUri(context, packageName, iconUri, providerMap); + if (icon != null) { + // Icon is only returned if the icon belongs to Settings or the target app. try { matchingPref.setIcon(context.getPackageManager() - .getResourcesForApplication(packageName) - .getDrawable(icon, context.getTheme())); + .getResourcesForApplication(icon.first /* package name */) + .getDrawable(icon.second /* res id */, context.getTheme())); } catch (PackageManager.NameNotFoundException | Resources.NotFoundException e) { // Intentionally ignored. If icon resources cannot be found, do not update. } diff --git a/tests/robotests/src/com/android/settings/security/SecurityFeatureProviderImplTest.java b/tests/robotests/src/com/android/settings/security/SecurityFeatureProviderImplTest.java index f64054c6e2a..293c0aef709 100644 --- a/tests/robotests/src/com/android/settings/security/SecurityFeatureProviderImplTest.java +++ b/tests/robotests/src/com/android/settings/security/SecurityFeatureProviderImplTest.java @@ -25,6 +25,7 @@ import android.graphics.drawable.Drawable; import android.os.Bundle; import android.support.v7.preference.Preference; import android.support.v7.preference.PreferenceScreen; +import android.util.Pair; import com.android.settings.SettingsRobolectricTestRunner; import com.android.settings.TestConfig; @@ -77,9 +78,9 @@ public class SecurityFeatureProviderImplTest { @Implements(com.android.settingslib.drawer.TileUtils.class) public static class TileUtilsMock { @Implementation - public static int getIconFromUri(Context context, String uriString, + public static Pair getIconFromUri(Context context, String packageName, String uriString, Map providerMap) { - return 161803; + return Pair.create("package", 161803); } @Implementation