Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 969fc963 authored by Chris Antol's avatar Chris Antol
Browse files

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
parent dc5469cf
Loading
Loading
Loading
Loading
+7 −0
Original line number Diff line number Diff line
@@ -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"
}
+23 −4
Original line number Diff line number Diff line
@@ -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()));
        }