diff --git a/aconfig/settings_flag_declarations.aconfig b/aconfig/settings_flag_declarations.aconfig index b90ff9f27d2..2c8eadeff4e 100644 --- a/aconfig/settings_flag_declarations.aconfig +++ b/aconfig/settings_flag_declarations.aconfig @@ -42,3 +42,10 @@ flag { 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 ffc97dc722c..791b6296389 100644 --- a/src/com/android/settings/dashboard/DashboardFeatureProviderImpl.java +++ b/src/com/android/settings/dashboard/DashboardFeatureProviderImpl.java @@ -52,6 +52,7 @@ import android.util.Log; 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.Utils; 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 @@ public class DashboardFeatureProviderImpl implements DashboardFeatureProvider { METHOD_GET_PROVIDER_ICON); final Pair 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 @@ public class DashboardFeatureProviderImpl implements DashboardFeatureProvider { } 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())); }