Support dynamic injected preference icons from raw data

Flag: com.android.settings.flags.support_raw_dynamic_icons
Bug: 351884562
Test: Registered an injected preference in another app locally, providing icon dynamically using new metadata field
Change-Id: I80a5e6804b9beab343c0068753277948a3855865
This commit is contained in:
Chris Antol
2024-07-12 00:51:55 +00:00
parent dc5469cf24
commit 969fc9639b
2 changed files with 30 additions and 4 deletions

View File

@@ -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"
}

View File

@@ -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<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 @@ 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()));
}