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:
@@ -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"
|
||||
}
|
||||
|
@@ -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()));
|
||||
}
|
||||
|
||||
|
Reference in New Issue
Block a user