Merge "Support dynamic injected preference icons from raw data" into main
diff --git a/aconfig/settings_flag_declarations.aconfig b/aconfig/settings_flag_declarations.aconfig
index b90ff9f..2c8eade 100644
--- a/aconfig/settings_flag_declarations.aconfig
+++ b/aconfig/settings_flag_declarations.aconfig
@@ -42,3 +42,10 @@
description: "Feature flag to remove relevant slices dependencies."
bug: "297367302"
}
+
+flag {
+ name: "support_raw_dynamic_icons"
+ namespace: "android_settings"
+ description: "Flag to gate support of injected preference icons containing raw data"
+ bug: "351884562"
+}
diff --git a/src/com/android/settings/dashboard/DashboardFeatureProviderImpl.java b/src/com/android/settings/dashboard/DashboardFeatureProviderImpl.java
index ffc97dc..791b629 100644
--- a/src/com/android/settings/dashboard/DashboardFeatureProviderImpl.java
+++ b/src/com/android/settings/dashboard/DashboardFeatureProviderImpl.java
@@ -52,6 +52,7 @@
import android.util.Pair;
import android.widget.Toast;
+import androidx.annotation.Nullable;
import androidx.annotation.VisibleForTesting;
import androidx.fragment.app.FragmentActivity;
import androidx.preference.Preference;
@@ -63,6 +64,7 @@
import com.android.settings.activityembedding.ActivityEmbeddingRulesController;
import com.android.settings.activityembedding.ActivityEmbeddingUtils;
import com.android.settings.dashboard.profileselector.ProfileSelectDialog;
+import com.android.settings.flags.Flags;
import com.android.settings.homepage.TopLevelHighlightMixin;
import com.android.settings.homepage.TopLevelSettings;
import com.android.settings.overlay.FeatureFactory;
@@ -413,13 +415,23 @@
METHOD_GET_PROVIDER_ICON);
final Pair<String, Integer> iconInfo = TileUtils.getIconFromUri(
mContext, packageName, uri, providerMap);
- if (iconInfo == null) {
+ final Icon icon;
+ if (iconInfo != null) {
+ icon = Icon.createWithResource(iconInfo.first, iconInfo.second);
+ } else if (Flags.supportRawDynamicIcons()) {
+ icon = TileUtils.getRawIconFromUri(mContext, uri, providerMap);
+ } else {
+ icon = null;
+ }
+ if (icon == null) {
Log.w(TAG, "Failed to get icon from uri " + uri);
return;
}
- final Icon icon = Icon.createWithResource(iconInfo.first, iconInfo.second);
+
+ final String iconPackage = (iconInfo != null) ? iconInfo.first : null;
+
ThreadUtils.postOnMainThread(() -> {
- setPreferenceIcon(preference, tile, forceRoundedIcon, iconInfo.first, icon);
+ setPreferenceIcon(preference, tile, forceRoundedIcon, iconPackage, icon);
});
});
return;
@@ -435,14 +447,21 @@
}
private void setPreferenceIcon(Preference preference, Tile tile, boolean forceRoundedIcon,
- String iconPackage, Icon icon) {
+ @Nullable String iconPackage, Icon icon) {
Drawable iconDrawable = icon.loadDrawable(preference.getContext());
if (iconDrawable == null) {
Log.w(TAG, "Set null preference icon for: " + iconPackage);
preference.setIcon(null);
return;
}
+ // Tint homepage icons
if (TextUtils.equals(tile.getCategory(), CategoryKey.CATEGORY_HOMEPAGE)) {
+ // Skip tinting and Adaptive Icon transformation for homepage account type raw icons
+ if (TextUtils.equals(tile.getGroupKey(), "top_level_account_category")
+ && iconPackage == null) {
+ preference.setIcon(iconDrawable);
+ return;
+ }
iconDrawable.setTint(Utils.getHomepageIconColor(preference.getContext()));
}