Loading packages/SettingsLib/src/com/android/settingslib/drawer/DashboardCategory.java +11 −16 Original line number Diff line number Diff line Loading @@ -31,19 +31,26 @@ public class DashboardCategory implements Parcelable { /** * Key used for placing external tiles. */ public String key; public final String key; /** * List of the category's children */ private List<Tile> mTiles = new ArrayList<>(); public DashboardCategory() { // Empty public DashboardCategory(String key) { this.key = key; } DashboardCategory(Parcel in) { readFromParcel(in); key = in.readString(); final int count = in.readInt(); for (int n = 0; n < count; n++) { Tile tile = Tile.CREATOR.createFromParcel(in); mTiles.add(tile); } } /** Loading Loading @@ -128,18 +135,6 @@ public class DashboardCategory implements Parcelable { } } public void readFromParcel(Parcel in) { key = in.readString(); final int count = in.readInt(); for (int n = 0; n < count; n++) { Tile tile = Tile.CREATOR.createFromParcel(in); mTiles.add(tile); } } public static final Creator<DashboardCategory> CREATOR = new Creator<DashboardCategory>() { public DashboardCategory createFromParcel(Parcel source) { return new DashboardCategory(source); Loading packages/SettingsLib/src/com/android/settingslib/drawer/Tile.java +51 −24 Original line number Diff line number Diff line Loading @@ -59,12 +59,6 @@ public class Tile implements Parcelable { */ public CharSequence summary; /** * Whether the icon can be tinted. This should be set to true for monochrome (single-color) * icons that can be tinted to match the design. */ public boolean isIconTintable; /** * Intent to launch when the preference is selected. */ Loading @@ -75,10 +69,7 @@ public class Tile implements Parcelable { */ public ArrayList<UserHandle> userHandle = new ArrayList<>(); /** * Category in which the tile should be placed. */ public String category; private String mCategory; /** * Priority of the intent filter that created this tile, used for display ordering. Loading @@ -88,22 +79,23 @@ public class Tile implements Parcelable { /** * The metaData from the activity that defines this tile. */ public Bundle metaData; private Bundle mMetaData; /** * Optional key to use for this tile. */ public String key; private final String mActivityPackage; private final String mActivityName; private ActivityInfo mActivityInfo; public Tile(ActivityInfo activityInfo) { public Tile(ActivityInfo activityInfo, String category) { mActivityInfo = activityInfo; mActivityPackage = mActivityInfo.packageName; mActivityName = mActivityInfo.name; mMetaData = activityInfo.metaData; mCategory = category; } @Override Loading @@ -128,11 +120,32 @@ public class Tile implements Parcelable { for (int i = 0; i < N; i++) { userHandle.get(i).writeToParcel(dest, flags); } dest.writeString(category); dest.writeString(mCategory); dest.writeInt(priority); dest.writeBundle(metaData); dest.writeBundle(mMetaData); dest.writeString(key); dest.writeBoolean(isIconTintable); } /** * Category in which the tile should be placed. */ public String getCategory() { return mCategory; } public void setCategory(String newCategoryKey) { mCategory = newCategoryKey; } /** * Priority of the intent filter that created this tile, used for display ordering. */ public int getPriority() { return 0; } public Bundle getMetaData() { return mMetaData; } /** Loading @@ -141,17 +154,17 @@ public class Tile implements Parcelable { * @attr ref android.R.styleable#PreferenceHeader_icon */ public Icon getIcon(Context context) { if (context == null || metaData == null) { if (context == null || mMetaData == null) { return null; } int iconResId = metaData.getInt(META_DATA_PREFERENCE_ICON); int iconResId = mMetaData.getInt(META_DATA_PREFERENCE_ICON); // Set the icon if (iconResId == 0) { // Only fallback to activityinfo.icon if metadata does not contain ICON_URI. // ICON_URI should be loaded in app UI when need the icon object. Handling IPC at this // level is too complex because we don't have a strong threading contract for this class if (!metaData.containsKey(META_DATA_PREFERENCE_ICON_URI)) { if (!mMetaData.containsKey(META_DATA_PREFERENCE_ICON_URI)) { iconResId = getActivityInfo(context).icon; } } Loading @@ -162,6 +175,21 @@ public class Tile implements Parcelable { } } /** * Whether the icon can be tinted. This is true when icon needs to be monochrome (single-color) */ public boolean isIconTintable(Context context) { if (mMetaData != null && mMetaData.containsKey(TileUtils.META_DATA_PREFERENCE_ICON_TINTABLE)) { return mMetaData.getBoolean(TileUtils.META_DATA_PREFERENCE_ICON_TINTABLE); } final String pkgName = context.getPackageName(); // If this drawable is coming from outside Settings, tint it to match the color. final ActivityInfo activityInfo = getActivityInfo(context); return activityInfo != null && !TextUtils.equals(pkgName, activityInfo.packageName); } Tile(Parcel in) { mActivityPackage = in.readString(); mActivityName = in.readString(); Loading @@ -174,11 +202,10 @@ public class Tile implements Parcelable { for (int i = 0; i < N; i++) { userHandle.add(UserHandle.CREATOR.createFromParcel(in)); } category = in.readString(); mCategory = in.readString(); priority = in.readInt(); metaData = in.readBundle(); mMetaData = in.readBundle(); key = in.readString(); isIconTintable = in.readBoolean(); } private ActivityInfo getActivityInfo(Context context) { Loading @@ -205,8 +232,8 @@ public class Tile implements Parcelable { }; public boolean isPrimaryProfileOnly() { String profile = metaData != null ? metaData.getString(META_DATA_KEY_PROFILE) : PROFILE_ALL; String profile = mMetaData != null ? mMetaData.getString(META_DATA_KEY_PROFILE) : PROFILE_ALL; profile = (profile != null ? profile : PROFILE_ALL); return TextUtils.equals(profile, PROFILE_PRIMARY); } Loading packages/SettingsLib/src/com/android/settingslib/drawer/TileUtils.java +9 −27 Original line number Diff line number Diff line Loading @@ -228,16 +228,16 @@ public class TileUtils { HashMap<String, DashboardCategory> categoryMap = new HashMap<>(); for (Tile tile : tiles) { DashboardCategory category = categoryMap.get(tile.category); final String categoryKey = tile.getCategory(); DashboardCategory category = categoryMap.get(categoryKey); if (category == null) { category = new DashboardCategory(); category.key = tile.category; category = new DashboardCategory(categoryKey); if (category == null) { Log.w(LOG_TAG, "Couldn't find category " + tile.category); Log.w(LOG_TAG, "Couldn't find category " + categoryKey); continue; } categoryMap.put(category.key, category); categoryMap.put(categoryKey, category); } category.addTile(tile); } Loading Loading @@ -269,13 +269,13 @@ public class TileUtils { intent.setPackage(SETTING_PKG); } getTilesForIntent(context, user, intent, addedCache, defaultCategory, outTiles, usePriority, true); usePriority); } public static void getTilesForIntent( Context context, UserHandle user, Intent intent, Map<Pair<String, String>, Tile> addedCache, String defaultCategory, List<Tile> outTiles, boolean usePriority, boolean checkCategory) { boolean usePriority) { PackageManager pm = context.getPackageManager(); List<ResolveInfo> results = pm.queryIntentActivitiesAsUser(intent, PackageManager.GET_META_DATA, user.getIdentifier()); Loading @@ -289,7 +289,7 @@ public class TileUtils { String categoryKey = defaultCategory; // Load category if (checkCategory && ((metaData == null) || !metaData.containsKey(EXTRA_CATEGORY_KEY)) if ((metaData == null || !metaData.containsKey(EXTRA_CATEGORY_KEY)) && categoryKey == null) { Log.w(LOG_TAG, "Found " + resolved.activityInfo.name + " for intent " + intent + " missing metadata " Loading @@ -302,12 +302,10 @@ public class TileUtils { Pair<String, String> key = new Pair<>(activityInfo.packageName, activityInfo.name); Tile tile = addedCache.get(key); if (tile == null) { tile = new Tile(activityInfo); tile = new Tile(activityInfo, categoryKey); tile.intent = new Intent().setClassName( activityInfo.packageName, activityInfo.name); tile.category = categoryKey; tile.priority = usePriority ? resolved.priority : 0; tile.metaData = activityInfo.metaData; updateTileData(context, tile, activityInfo, activityInfo.applicationInfo, pm); if (DEBUG) Log.d(LOG_TAG, "Adding tile " + tile.title); addedCache.put(key, tile); Loading @@ -325,31 +323,16 @@ public class TileUtils { private static boolean updateTileData(Context context, Tile tile, ActivityInfo activityInfo, ApplicationInfo applicationInfo, PackageManager pm) { if (applicationInfo.isSystemApp()) { boolean forceTintIcon = false; CharSequence title = null; String summary = null; String keyHint = null; boolean isIconTintable = false; // Get the activity's meta-data try { Resources res = pm.getResourcesForApplication(applicationInfo.packageName); Bundle metaData = activityInfo.metaData; if (!context.getPackageName().equals(applicationInfo.packageName)) { isIconTintable = true; forceTintIcon = true; } if (res != null && metaData != null) { if (metaData.containsKey(META_DATA_PREFERENCE_ICON_TINTABLE)) { if (forceTintIcon) { Log.w(LOG_TAG, "Ignoring icon tintable for " + activityInfo); } else { isIconTintable = metaData.getBoolean(META_DATA_PREFERENCE_ICON_TINTABLE); } } if (metaData.containsKey(META_DATA_PREFERENCE_TITLE)) { if (metaData.get(META_DATA_PREFERENCE_TITLE) instanceof Integer) { title = res.getString(metaData.getInt(META_DATA_PREFERENCE_TITLE)); Loading Loading @@ -390,7 +373,6 @@ public class TileUtils { activityInfo.name); // Suggest a key for this tile tile.key = keyHint; tile.isIconTintable = isIconTintable; return true; } Loading packages/SettingsLib/tests/robotests/src/com/android/settingslib/drawer/TileTest.java +39 −9 Original line number Diff line number Diff line Loading @@ -31,19 +31,19 @@ public class TileTest { mActivityInfo = new ActivityInfo(); mActivityInfo.packageName = RuntimeEnvironment.application.getPackageName(); mActivityInfo.icon = R.drawable.ic_plus; mTile = new Tile(mActivityInfo); mTile.metaData = new Bundle(); mActivityInfo.metaData = new Bundle(); mTile = new Tile(mActivityInfo, "category"); } @Test public void isPrimaryProfileOnly_profilePrimary_shouldReturnTrue() { mTile.metaData.putString(META_DATA_KEY_PROFILE, PROFILE_PRIMARY); mActivityInfo.metaData.putString(META_DATA_KEY_PROFILE, PROFILE_PRIMARY); assertThat(mTile.isPrimaryProfileOnly()).isTrue(); } @Test public void isPrimaryProfileOnly_profileAll_shouldReturnFalse() { mTile.metaData.putString(META_DATA_KEY_PROFILE, PROFILE_ALL); mActivityInfo.metaData.putString(META_DATA_KEY_PROFILE, PROFILE_ALL); assertThat(mTile.isPrimaryProfileOnly()).isFalse(); } Loading @@ -54,27 +54,27 @@ public class TileTest { @Test public void isPrimaryProfileOnly_nullMetadata_shouldReturnFalse() { mTile.metaData = null; mActivityInfo.metaData = null; assertThat(mTile.isPrimaryProfileOnly()).isFalse(); } @Test public void getIcon_noContextOrMetadata_returnNull() { final Tile tile = new Tile(new ActivityInfo()); final Tile tile = new Tile(new ActivityInfo(), "category"); assertThat(tile.getIcon(null)).isNull(); assertThat(tile.getIcon(RuntimeEnvironment.application)).isNull(); } @Test public void getIcon_providedByUri_returnNull() { mTile.metaData.putString(META_DATA_PREFERENCE_ICON_URI, "content://foobar/icon"); mActivityInfo.metaData.putString(META_DATA_PREFERENCE_ICON_URI, "content://foobar/icon"); assertThat(mTile.getIcon(RuntimeEnvironment.application)).isNull(); } @Test public void getIcon_hasIconMetadata_returnIcon() { mTile.metaData.putInt(META_DATA_PREFERENCE_ICON, R.drawable.ic_info); mActivityInfo.metaData.putInt(META_DATA_PREFERENCE_ICON, R.drawable.ic_info); assertThat(mTile.getIcon(RuntimeEnvironment.application).getResId()) .isEqualTo(R.drawable.ic_info); Loading @@ -82,9 +82,39 @@ public class TileTest { @Test public void getIcon_noIconMetadata_returnActivityIcon() { mTile.metaData.putInt(META_DATA_PREFERENCE_ICON, 0); mActivityInfo.metaData.putInt(META_DATA_PREFERENCE_ICON, 0); assertThat(mTile.getIcon(RuntimeEnvironment.application).getResId()) .isEqualTo(mActivityInfo.icon); } @Test public void isIconTintable_hasMetadata_shouldReturnIconTintableMetadata() { final Tile tile = new Tile(mActivityInfo, "category"); mActivityInfo.metaData.putBoolean(TileUtils.META_DATA_PREFERENCE_ICON_TINTABLE, false); assertThat(tile.isIconTintable(RuntimeEnvironment.application)).isFalse(); mActivityInfo.metaData.putBoolean(TileUtils.META_DATA_PREFERENCE_ICON_TINTABLE, true); assertThat(tile.isIconTintable(RuntimeEnvironment.application)).isTrue(); } @Test public void isIconTintable_noIcon_shouldReturnFalse() { final Tile tile = new Tile(mActivityInfo, "category"); assertThat(tile.isIconTintable(RuntimeEnvironment.application)).isFalse(); } @Test public void isIconTintable_noMetadata_shouldReturnPackageNameCheck() { final Tile tile1 = new Tile(mActivityInfo, "category"); assertThat(tile1.isIconTintable(RuntimeEnvironment.application)).isFalse(); final ActivityInfo activityInfo = new ActivityInfo(); activityInfo.packageName = "blah"; final Tile tile2 = new Tile(activityInfo, "category"); assertThat(tile2.isIconTintable(RuntimeEnvironment.application)).isTrue(); } } packages/SettingsLib/tests/robotests/src/com/android/settingslib/drawer/TileUtilsTest.java +15 −28 Original line number Diff line number Diff line Loading @@ -108,11 +108,10 @@ public class TileUtilsTest { .thenReturn(info); TileUtils.getTilesForIntent(mContext, UserHandle.CURRENT, intent, addedCache, null /* defaultCategory */, outTiles, false /* usePriority */, false /* checkCategory */); null /* defaultCategory */, outTiles, false /* usePriority */); assertThat(outTiles.size()).isEqualTo(1); assertThat(outTiles.get(0).category).isEqualTo(testCategory); assertThat(outTiles.get(0).getCategory()).isEqualTo(testCategory); } @Test Loading @@ -129,8 +128,7 @@ public class TileUtilsTest { .thenReturn(info); TileUtils.getTilesForIntent(mContext, UserHandle.CURRENT, intent, addedCache, null /* defaultCategory */, outTiles, false /* usePriority */, false /* checkCategory */); null /* defaultCategory */, outTiles, false /* usePriority */); assertThat(outTiles.size()).isEqualTo(1); assertThat(outTiles.get(0).key).isEqualTo(keyHint); Loading @@ -149,8 +147,7 @@ public class TileUtilsTest { .thenReturn(info); TileUtils.getTilesForIntent(mContext, UserHandle.CURRENT, intent, addedCache, null /* defaultCategory */, outTiles, false /* usePriority */, false /* checkCategory */); null /* defaultCategory */, outTiles, false /* usePriority */); assertThat(outTiles.isEmpty()).isTrue(); } Loading @@ -173,7 +170,7 @@ public class TileUtilsTest { .thenReturn(info); List<DashboardCategory> categoryList = TileUtils.getCategories(mContext, cache, testAction); assertThat(categoryList.get(0).getTile(0).category).isEqualTo(testCategory); assertThat(categoryList.get(0).getTile(0).getCategory()).isEqualTo(testCategory); } @Test Loading Loading @@ -209,8 +206,7 @@ public class TileUtilsTest { .thenReturn(info); TileUtils.getTilesForIntent(mContext, UserHandle.CURRENT, intent, addedCache, null /* defaultCategory */, outTiles, false /* usePriority */, false /* checkCategory */); null /* defaultCategory */, outTiles, false /* usePriority */); assertThat(outTiles.size()).isEqualTo(1); assertThat(outTiles.get(0).title).isEqualTo("my title"); Loading @@ -233,15 +229,13 @@ public class TileUtilsTest { .thenReturn("my localized title"); TileUtils.getTilesForIntent(mContext, UserHandle.CURRENT, intent, addedCache, null /* defaultCategory */, outTiles, false /* usePriority */, false /* checkCategory */); null /* defaultCategory */, outTiles, false /* usePriority */); assertThat(outTiles.size()).isEqualTo(1); assertThat(outTiles.get(0).title).isEqualTo("my localized title"); // Icon should be tintable because the tile is not from settings package, and // "forceTintExternalIcon" is set assertThat(outTiles.get(0).isIconTintable).isTrue(); assertThat(outTiles.get(0).isIconTintable(mContext)).isTrue(); } @Test Loading @@ -260,11 +254,9 @@ public class TileUtilsTest { .thenReturn(info); TileUtils.getTilesForIntent(mContext, UserHandle.CURRENT, intent, addedCache, null /* defaultCategory */, outTiles, false /* usePriority */, false /* checkCategory */); null /* defaultCategory */, outTiles, false /* usePriority */); assertThat(outTiles.size()).isEqualTo(1); assertThat(outTiles.get(0).isIconTintable).isFalse(); assertThat(outTiles.get(0).isIconTintable(mContext)).isFalse(); } @Test Loading @@ -283,11 +275,9 @@ public class TileUtilsTest { .thenReturn(info); TileUtils.getTilesForIntent(mContext, UserHandle.CURRENT, intent, addedCache, null /* defaultCategory */, outTiles, false /* usePriority */, false /* checkCategory */); null /* defaultCategory */, outTiles, false /* usePriority */); assertThat(outTiles.size()).isEqualTo(1); assertThat(outTiles.get(0).isIconTintable).isTrue(); assertThat(outTiles.get(0).isIconTintable(mContext)).isTrue(); } @Test Loading @@ -305,8 +295,7 @@ public class TileUtilsTest { // Case 1: No provider associated with the uri specified. TileUtils.getTilesForIntent(mContext, UserHandle.CURRENT, intent, addedCache, null /* defaultCategory */, outTiles, false /* usePriority */, false /* checkCategory */); null /* defaultCategory */, outTiles, false /* usePriority */); assertThat(outTiles.size()).isEqualTo(1); assertThat(outTiles.get(0).getIcon(mContext).getResId()).isEqualTo(314159); Loading @@ -323,8 +312,7 @@ public class TileUtilsTest { .thenReturn(mIContentProvider); TileUtils.getTilesForIntent(mContext, UserHandle.CURRENT, intent, addedCache, null /* defaultCategory */, outTiles, false /* usePriority */, false /* checkCategory */); null /* defaultCategory */, outTiles, false /* usePriority */); assertThat(outTiles.size()).isEqualTo(1); assertThat(outTiles.get(0).getIcon(mContext).getResId()).isEqualTo(314159); Loading @@ -345,8 +333,7 @@ public class TileUtilsTest { .thenReturn(info); TileUtils.getTilesForIntent(mContext, UserHandle.CURRENT, intent, addedCache, null /* defaultCategory */, outTiles, false /* usePriority */, false /* checkCategory */); null /* defaultCategory */, outTiles, false /* usePriority */); assertThat(outTiles.size()).isEqualTo(1); } Loading Loading
packages/SettingsLib/src/com/android/settingslib/drawer/DashboardCategory.java +11 −16 Original line number Diff line number Diff line Loading @@ -31,19 +31,26 @@ public class DashboardCategory implements Parcelable { /** * Key used for placing external tiles. */ public String key; public final String key; /** * List of the category's children */ private List<Tile> mTiles = new ArrayList<>(); public DashboardCategory() { // Empty public DashboardCategory(String key) { this.key = key; } DashboardCategory(Parcel in) { readFromParcel(in); key = in.readString(); final int count = in.readInt(); for (int n = 0; n < count; n++) { Tile tile = Tile.CREATOR.createFromParcel(in); mTiles.add(tile); } } /** Loading Loading @@ -128,18 +135,6 @@ public class DashboardCategory implements Parcelable { } } public void readFromParcel(Parcel in) { key = in.readString(); final int count = in.readInt(); for (int n = 0; n < count; n++) { Tile tile = Tile.CREATOR.createFromParcel(in); mTiles.add(tile); } } public static final Creator<DashboardCategory> CREATOR = new Creator<DashboardCategory>() { public DashboardCategory createFromParcel(Parcel source) { return new DashboardCategory(source); Loading
packages/SettingsLib/src/com/android/settingslib/drawer/Tile.java +51 −24 Original line number Diff line number Diff line Loading @@ -59,12 +59,6 @@ public class Tile implements Parcelable { */ public CharSequence summary; /** * Whether the icon can be tinted. This should be set to true for monochrome (single-color) * icons that can be tinted to match the design. */ public boolean isIconTintable; /** * Intent to launch when the preference is selected. */ Loading @@ -75,10 +69,7 @@ public class Tile implements Parcelable { */ public ArrayList<UserHandle> userHandle = new ArrayList<>(); /** * Category in which the tile should be placed. */ public String category; private String mCategory; /** * Priority of the intent filter that created this tile, used for display ordering. Loading @@ -88,22 +79,23 @@ public class Tile implements Parcelable { /** * The metaData from the activity that defines this tile. */ public Bundle metaData; private Bundle mMetaData; /** * Optional key to use for this tile. */ public String key; private final String mActivityPackage; private final String mActivityName; private ActivityInfo mActivityInfo; public Tile(ActivityInfo activityInfo) { public Tile(ActivityInfo activityInfo, String category) { mActivityInfo = activityInfo; mActivityPackage = mActivityInfo.packageName; mActivityName = mActivityInfo.name; mMetaData = activityInfo.metaData; mCategory = category; } @Override Loading @@ -128,11 +120,32 @@ public class Tile implements Parcelable { for (int i = 0; i < N; i++) { userHandle.get(i).writeToParcel(dest, flags); } dest.writeString(category); dest.writeString(mCategory); dest.writeInt(priority); dest.writeBundle(metaData); dest.writeBundle(mMetaData); dest.writeString(key); dest.writeBoolean(isIconTintable); } /** * Category in which the tile should be placed. */ public String getCategory() { return mCategory; } public void setCategory(String newCategoryKey) { mCategory = newCategoryKey; } /** * Priority of the intent filter that created this tile, used for display ordering. */ public int getPriority() { return 0; } public Bundle getMetaData() { return mMetaData; } /** Loading @@ -141,17 +154,17 @@ public class Tile implements Parcelable { * @attr ref android.R.styleable#PreferenceHeader_icon */ public Icon getIcon(Context context) { if (context == null || metaData == null) { if (context == null || mMetaData == null) { return null; } int iconResId = metaData.getInt(META_DATA_PREFERENCE_ICON); int iconResId = mMetaData.getInt(META_DATA_PREFERENCE_ICON); // Set the icon if (iconResId == 0) { // Only fallback to activityinfo.icon if metadata does not contain ICON_URI. // ICON_URI should be loaded in app UI when need the icon object. Handling IPC at this // level is too complex because we don't have a strong threading contract for this class if (!metaData.containsKey(META_DATA_PREFERENCE_ICON_URI)) { if (!mMetaData.containsKey(META_DATA_PREFERENCE_ICON_URI)) { iconResId = getActivityInfo(context).icon; } } Loading @@ -162,6 +175,21 @@ public class Tile implements Parcelable { } } /** * Whether the icon can be tinted. This is true when icon needs to be monochrome (single-color) */ public boolean isIconTintable(Context context) { if (mMetaData != null && mMetaData.containsKey(TileUtils.META_DATA_PREFERENCE_ICON_TINTABLE)) { return mMetaData.getBoolean(TileUtils.META_DATA_PREFERENCE_ICON_TINTABLE); } final String pkgName = context.getPackageName(); // If this drawable is coming from outside Settings, tint it to match the color. final ActivityInfo activityInfo = getActivityInfo(context); return activityInfo != null && !TextUtils.equals(pkgName, activityInfo.packageName); } Tile(Parcel in) { mActivityPackage = in.readString(); mActivityName = in.readString(); Loading @@ -174,11 +202,10 @@ public class Tile implements Parcelable { for (int i = 0; i < N; i++) { userHandle.add(UserHandle.CREATOR.createFromParcel(in)); } category = in.readString(); mCategory = in.readString(); priority = in.readInt(); metaData = in.readBundle(); mMetaData = in.readBundle(); key = in.readString(); isIconTintable = in.readBoolean(); } private ActivityInfo getActivityInfo(Context context) { Loading @@ -205,8 +232,8 @@ public class Tile implements Parcelable { }; public boolean isPrimaryProfileOnly() { String profile = metaData != null ? metaData.getString(META_DATA_KEY_PROFILE) : PROFILE_ALL; String profile = mMetaData != null ? mMetaData.getString(META_DATA_KEY_PROFILE) : PROFILE_ALL; profile = (profile != null ? profile : PROFILE_ALL); return TextUtils.equals(profile, PROFILE_PRIMARY); } Loading
packages/SettingsLib/src/com/android/settingslib/drawer/TileUtils.java +9 −27 Original line number Diff line number Diff line Loading @@ -228,16 +228,16 @@ public class TileUtils { HashMap<String, DashboardCategory> categoryMap = new HashMap<>(); for (Tile tile : tiles) { DashboardCategory category = categoryMap.get(tile.category); final String categoryKey = tile.getCategory(); DashboardCategory category = categoryMap.get(categoryKey); if (category == null) { category = new DashboardCategory(); category.key = tile.category; category = new DashboardCategory(categoryKey); if (category == null) { Log.w(LOG_TAG, "Couldn't find category " + tile.category); Log.w(LOG_TAG, "Couldn't find category " + categoryKey); continue; } categoryMap.put(category.key, category); categoryMap.put(categoryKey, category); } category.addTile(tile); } Loading Loading @@ -269,13 +269,13 @@ public class TileUtils { intent.setPackage(SETTING_PKG); } getTilesForIntent(context, user, intent, addedCache, defaultCategory, outTiles, usePriority, true); usePriority); } public static void getTilesForIntent( Context context, UserHandle user, Intent intent, Map<Pair<String, String>, Tile> addedCache, String defaultCategory, List<Tile> outTiles, boolean usePriority, boolean checkCategory) { boolean usePriority) { PackageManager pm = context.getPackageManager(); List<ResolveInfo> results = pm.queryIntentActivitiesAsUser(intent, PackageManager.GET_META_DATA, user.getIdentifier()); Loading @@ -289,7 +289,7 @@ public class TileUtils { String categoryKey = defaultCategory; // Load category if (checkCategory && ((metaData == null) || !metaData.containsKey(EXTRA_CATEGORY_KEY)) if ((metaData == null || !metaData.containsKey(EXTRA_CATEGORY_KEY)) && categoryKey == null) { Log.w(LOG_TAG, "Found " + resolved.activityInfo.name + " for intent " + intent + " missing metadata " Loading @@ -302,12 +302,10 @@ public class TileUtils { Pair<String, String> key = new Pair<>(activityInfo.packageName, activityInfo.name); Tile tile = addedCache.get(key); if (tile == null) { tile = new Tile(activityInfo); tile = new Tile(activityInfo, categoryKey); tile.intent = new Intent().setClassName( activityInfo.packageName, activityInfo.name); tile.category = categoryKey; tile.priority = usePriority ? resolved.priority : 0; tile.metaData = activityInfo.metaData; updateTileData(context, tile, activityInfo, activityInfo.applicationInfo, pm); if (DEBUG) Log.d(LOG_TAG, "Adding tile " + tile.title); addedCache.put(key, tile); Loading @@ -325,31 +323,16 @@ public class TileUtils { private static boolean updateTileData(Context context, Tile tile, ActivityInfo activityInfo, ApplicationInfo applicationInfo, PackageManager pm) { if (applicationInfo.isSystemApp()) { boolean forceTintIcon = false; CharSequence title = null; String summary = null; String keyHint = null; boolean isIconTintable = false; // Get the activity's meta-data try { Resources res = pm.getResourcesForApplication(applicationInfo.packageName); Bundle metaData = activityInfo.metaData; if (!context.getPackageName().equals(applicationInfo.packageName)) { isIconTintable = true; forceTintIcon = true; } if (res != null && metaData != null) { if (metaData.containsKey(META_DATA_PREFERENCE_ICON_TINTABLE)) { if (forceTintIcon) { Log.w(LOG_TAG, "Ignoring icon tintable for " + activityInfo); } else { isIconTintable = metaData.getBoolean(META_DATA_PREFERENCE_ICON_TINTABLE); } } if (metaData.containsKey(META_DATA_PREFERENCE_TITLE)) { if (metaData.get(META_DATA_PREFERENCE_TITLE) instanceof Integer) { title = res.getString(metaData.getInt(META_DATA_PREFERENCE_TITLE)); Loading Loading @@ -390,7 +373,6 @@ public class TileUtils { activityInfo.name); // Suggest a key for this tile tile.key = keyHint; tile.isIconTintable = isIconTintable; return true; } Loading
packages/SettingsLib/tests/robotests/src/com/android/settingslib/drawer/TileTest.java +39 −9 Original line number Diff line number Diff line Loading @@ -31,19 +31,19 @@ public class TileTest { mActivityInfo = new ActivityInfo(); mActivityInfo.packageName = RuntimeEnvironment.application.getPackageName(); mActivityInfo.icon = R.drawable.ic_plus; mTile = new Tile(mActivityInfo); mTile.metaData = new Bundle(); mActivityInfo.metaData = new Bundle(); mTile = new Tile(mActivityInfo, "category"); } @Test public void isPrimaryProfileOnly_profilePrimary_shouldReturnTrue() { mTile.metaData.putString(META_DATA_KEY_PROFILE, PROFILE_PRIMARY); mActivityInfo.metaData.putString(META_DATA_KEY_PROFILE, PROFILE_PRIMARY); assertThat(mTile.isPrimaryProfileOnly()).isTrue(); } @Test public void isPrimaryProfileOnly_profileAll_shouldReturnFalse() { mTile.metaData.putString(META_DATA_KEY_PROFILE, PROFILE_ALL); mActivityInfo.metaData.putString(META_DATA_KEY_PROFILE, PROFILE_ALL); assertThat(mTile.isPrimaryProfileOnly()).isFalse(); } Loading @@ -54,27 +54,27 @@ public class TileTest { @Test public void isPrimaryProfileOnly_nullMetadata_shouldReturnFalse() { mTile.metaData = null; mActivityInfo.metaData = null; assertThat(mTile.isPrimaryProfileOnly()).isFalse(); } @Test public void getIcon_noContextOrMetadata_returnNull() { final Tile tile = new Tile(new ActivityInfo()); final Tile tile = new Tile(new ActivityInfo(), "category"); assertThat(tile.getIcon(null)).isNull(); assertThat(tile.getIcon(RuntimeEnvironment.application)).isNull(); } @Test public void getIcon_providedByUri_returnNull() { mTile.metaData.putString(META_DATA_PREFERENCE_ICON_URI, "content://foobar/icon"); mActivityInfo.metaData.putString(META_DATA_PREFERENCE_ICON_URI, "content://foobar/icon"); assertThat(mTile.getIcon(RuntimeEnvironment.application)).isNull(); } @Test public void getIcon_hasIconMetadata_returnIcon() { mTile.metaData.putInt(META_DATA_PREFERENCE_ICON, R.drawable.ic_info); mActivityInfo.metaData.putInt(META_DATA_PREFERENCE_ICON, R.drawable.ic_info); assertThat(mTile.getIcon(RuntimeEnvironment.application).getResId()) .isEqualTo(R.drawable.ic_info); Loading @@ -82,9 +82,39 @@ public class TileTest { @Test public void getIcon_noIconMetadata_returnActivityIcon() { mTile.metaData.putInt(META_DATA_PREFERENCE_ICON, 0); mActivityInfo.metaData.putInt(META_DATA_PREFERENCE_ICON, 0); assertThat(mTile.getIcon(RuntimeEnvironment.application).getResId()) .isEqualTo(mActivityInfo.icon); } @Test public void isIconTintable_hasMetadata_shouldReturnIconTintableMetadata() { final Tile tile = new Tile(mActivityInfo, "category"); mActivityInfo.metaData.putBoolean(TileUtils.META_DATA_PREFERENCE_ICON_TINTABLE, false); assertThat(tile.isIconTintable(RuntimeEnvironment.application)).isFalse(); mActivityInfo.metaData.putBoolean(TileUtils.META_DATA_PREFERENCE_ICON_TINTABLE, true); assertThat(tile.isIconTintable(RuntimeEnvironment.application)).isTrue(); } @Test public void isIconTintable_noIcon_shouldReturnFalse() { final Tile tile = new Tile(mActivityInfo, "category"); assertThat(tile.isIconTintable(RuntimeEnvironment.application)).isFalse(); } @Test public void isIconTintable_noMetadata_shouldReturnPackageNameCheck() { final Tile tile1 = new Tile(mActivityInfo, "category"); assertThat(tile1.isIconTintable(RuntimeEnvironment.application)).isFalse(); final ActivityInfo activityInfo = new ActivityInfo(); activityInfo.packageName = "blah"; final Tile tile2 = new Tile(activityInfo, "category"); assertThat(tile2.isIconTintable(RuntimeEnvironment.application)).isTrue(); } }
packages/SettingsLib/tests/robotests/src/com/android/settingslib/drawer/TileUtilsTest.java +15 −28 Original line number Diff line number Diff line Loading @@ -108,11 +108,10 @@ public class TileUtilsTest { .thenReturn(info); TileUtils.getTilesForIntent(mContext, UserHandle.CURRENT, intent, addedCache, null /* defaultCategory */, outTiles, false /* usePriority */, false /* checkCategory */); null /* defaultCategory */, outTiles, false /* usePriority */); assertThat(outTiles.size()).isEqualTo(1); assertThat(outTiles.get(0).category).isEqualTo(testCategory); assertThat(outTiles.get(0).getCategory()).isEqualTo(testCategory); } @Test Loading @@ -129,8 +128,7 @@ public class TileUtilsTest { .thenReturn(info); TileUtils.getTilesForIntent(mContext, UserHandle.CURRENT, intent, addedCache, null /* defaultCategory */, outTiles, false /* usePriority */, false /* checkCategory */); null /* defaultCategory */, outTiles, false /* usePriority */); assertThat(outTiles.size()).isEqualTo(1); assertThat(outTiles.get(0).key).isEqualTo(keyHint); Loading @@ -149,8 +147,7 @@ public class TileUtilsTest { .thenReturn(info); TileUtils.getTilesForIntent(mContext, UserHandle.CURRENT, intent, addedCache, null /* defaultCategory */, outTiles, false /* usePriority */, false /* checkCategory */); null /* defaultCategory */, outTiles, false /* usePriority */); assertThat(outTiles.isEmpty()).isTrue(); } Loading @@ -173,7 +170,7 @@ public class TileUtilsTest { .thenReturn(info); List<DashboardCategory> categoryList = TileUtils.getCategories(mContext, cache, testAction); assertThat(categoryList.get(0).getTile(0).category).isEqualTo(testCategory); assertThat(categoryList.get(0).getTile(0).getCategory()).isEqualTo(testCategory); } @Test Loading Loading @@ -209,8 +206,7 @@ public class TileUtilsTest { .thenReturn(info); TileUtils.getTilesForIntent(mContext, UserHandle.CURRENT, intent, addedCache, null /* defaultCategory */, outTiles, false /* usePriority */, false /* checkCategory */); null /* defaultCategory */, outTiles, false /* usePriority */); assertThat(outTiles.size()).isEqualTo(1); assertThat(outTiles.get(0).title).isEqualTo("my title"); Loading @@ -233,15 +229,13 @@ public class TileUtilsTest { .thenReturn("my localized title"); TileUtils.getTilesForIntent(mContext, UserHandle.CURRENT, intent, addedCache, null /* defaultCategory */, outTiles, false /* usePriority */, false /* checkCategory */); null /* defaultCategory */, outTiles, false /* usePriority */); assertThat(outTiles.size()).isEqualTo(1); assertThat(outTiles.get(0).title).isEqualTo("my localized title"); // Icon should be tintable because the tile is not from settings package, and // "forceTintExternalIcon" is set assertThat(outTiles.get(0).isIconTintable).isTrue(); assertThat(outTiles.get(0).isIconTintable(mContext)).isTrue(); } @Test Loading @@ -260,11 +254,9 @@ public class TileUtilsTest { .thenReturn(info); TileUtils.getTilesForIntent(mContext, UserHandle.CURRENT, intent, addedCache, null /* defaultCategory */, outTiles, false /* usePriority */, false /* checkCategory */); null /* defaultCategory */, outTiles, false /* usePriority */); assertThat(outTiles.size()).isEqualTo(1); assertThat(outTiles.get(0).isIconTintable).isFalse(); assertThat(outTiles.get(0).isIconTintable(mContext)).isFalse(); } @Test Loading @@ -283,11 +275,9 @@ public class TileUtilsTest { .thenReturn(info); TileUtils.getTilesForIntent(mContext, UserHandle.CURRENT, intent, addedCache, null /* defaultCategory */, outTiles, false /* usePriority */, false /* checkCategory */); null /* defaultCategory */, outTiles, false /* usePriority */); assertThat(outTiles.size()).isEqualTo(1); assertThat(outTiles.get(0).isIconTintable).isTrue(); assertThat(outTiles.get(0).isIconTintable(mContext)).isTrue(); } @Test Loading @@ -305,8 +295,7 @@ public class TileUtilsTest { // Case 1: No provider associated with the uri specified. TileUtils.getTilesForIntent(mContext, UserHandle.CURRENT, intent, addedCache, null /* defaultCategory */, outTiles, false /* usePriority */, false /* checkCategory */); null /* defaultCategory */, outTiles, false /* usePriority */); assertThat(outTiles.size()).isEqualTo(1); assertThat(outTiles.get(0).getIcon(mContext).getResId()).isEqualTo(314159); Loading @@ -323,8 +312,7 @@ public class TileUtilsTest { .thenReturn(mIContentProvider); TileUtils.getTilesForIntent(mContext, UserHandle.CURRENT, intent, addedCache, null /* defaultCategory */, outTiles, false /* usePriority */, false /* checkCategory */); null /* defaultCategory */, outTiles, false /* usePriority */); assertThat(outTiles.size()).isEqualTo(1); assertThat(outTiles.get(0).getIcon(mContext).getResId()).isEqualTo(314159); Loading @@ -345,8 +333,7 @@ public class TileUtilsTest { .thenReturn(info); TileUtils.getTilesForIntent(mContext, UserHandle.CURRENT, intent, addedCache, null /* defaultCategory */, outTiles, false /* usePriority */, false /* checkCategory */); null /* defaultCategory */, outTiles, false /* usePriority */); assertThat(outTiles.size()).isEqualTo(1); } Loading