diff --git a/src/com/android/settings/Utils.java b/src/com/android/settings/Utils.java index 84183154236..031fb8a9d92 100644 --- a/src/com/android/settings/Utils.java +++ b/src/com/android/settings/Utils.java @@ -48,6 +48,7 @@ import android.content.res.TypedArray; import android.database.Cursor; import android.graphics.Bitmap; import android.graphics.Canvas; +import android.graphics.drawable.AdaptiveIconDrawable; import android.graphics.drawable.BitmapDrawable; import android.graphics.drawable.Drawable; import android.graphics.drawable.VectorDrawable; @@ -94,6 +95,7 @@ import android.widget.EditText; import android.widget.ListView; import android.widget.TabWidget; +import androidx.annotation.ColorInt; import androidx.annotation.NonNull; import androidx.annotation.StringRes; import androidx.core.graphics.drawable.IconCompat; @@ -111,6 +113,7 @@ import com.android.settings.dashboard.profileselector.ProfileFragmentBridge; import com.android.settings.dashboard.profileselector.ProfileSelectFragment; import com.android.settings.password.ChooseLockSettingsHelper; import com.android.settingslib.widget.ActionBarShadowController; +import com.android.settingslib.widget.AdaptiveIcon; import java.util.Iterator; import java.util.List; @@ -967,15 +970,36 @@ public final class Utils extends com.android.settingslib.Utils { } /** - * Sets the preference icon with a drawable that is scaled down to to avoid crashing Settings if - * it's too big. + * Gets the adaptive icon with a drawable that wrapped with an adaptive background using {@code + * backgroundColor} if it is not a {@link AdaptiveIconDrawable} + * + * If the given {@code icon} is too big, it will be auto scaled down to to avoid crashing + * Settings. */ - public static void setSafeIcon(Preference pref, Drawable icon) { + public static Drawable getAdaptiveIcon(Context context, Drawable icon, + @ColorInt int backgroundColor) { + Drawable adaptiveIcon = getSafeIcon(icon); + + if (!(adaptiveIcon instanceof AdaptiveIconDrawable)) { + adaptiveIcon = new AdaptiveIcon(context, adaptiveIcon); + ((AdaptiveIcon) adaptiveIcon).setBackgroundColor(backgroundColor); + } + + return adaptiveIcon; + } + + /** + * Gets the icon with a drawable that is scaled down to to avoid crashing Settings if it's too + * big and not a {@link VectorDrawable}. + */ + public static Drawable getSafeIcon(Drawable icon) { Drawable safeIcon = icon; + if ((icon != null) && !(icon instanceof VectorDrawable)) { safeIcon = getSafeDrawable(icon, 500, 500); } - pref.setIcon(safeIcon); + + return safeIcon; } /** @@ -985,7 +1009,7 @@ public final class Utils extends com.android.settingslib.Utils { * @param maxWidth maximum width, in pixels. * @param maxHeight maximum height, in pixels. */ - public static Drawable getSafeDrawable(Drawable original, int maxWidth, int maxHeight) { + private static Drawable getSafeDrawable(Drawable original, int maxWidth, int maxHeight) { final int actualWidth = original.getMinimumWidth(); final int actualHeight = original.getMinimumHeight(); diff --git a/src/com/android/settings/accessibility/AccessibilitySettings.java b/src/com/android/settings/accessibility/AccessibilitySettings.java index af8bf47036f..d4db3953f79 100644 --- a/src/com/android/settings/accessibility/AccessibilitySettings.java +++ b/src/com/android/settings/accessibility/AccessibilitySettings.java @@ -28,6 +28,7 @@ import android.content.pm.ActivityInfo; import android.content.pm.PackageManager; import android.content.pm.ResolveInfo; import android.content.pm.ServiceInfo; +import android.graphics.Color; import android.graphics.drawable.Drawable; import android.net.Uri; import android.os.Bundle; @@ -663,7 +664,7 @@ public class AccessibilitySettings extends DashboardFragment { preference.setKey(key); preference.setTitle(title); preference.setSummary(summary); - Utils.setSafeIcon(preference, icon); + preference.setIcon(Utils.getAdaptiveIcon(mContext, icon, Color.WHITE)); preference.setFragment(fragment); preference.setIconSize(ICON_SIZE_MEDIUM); preference.setPersistent(false); // Disable SharedPreferences. diff --git a/src/com/android/settings/applications/autofill/PasswordsPreferenceController.java b/src/com/android/settings/applications/autofill/PasswordsPreferenceController.java index 47882ded46e..a9d1572b7e5 100644 --- a/src/com/android/settings/applications/autofill/PasswordsPreferenceController.java +++ b/src/com/android/settings/applications/autofill/PasswordsPreferenceController.java @@ -124,7 +124,7 @@ public class PasswordsPreferenceController extends BasePreferenceController serviceInfo, serviceInfo.applicationInfo, user); - Utils.setSafeIcon(pref, icon); + pref.setIcon(Utils.getSafeIcon(icon)); pref.setIntent( new Intent(Intent.ACTION_MAIN) .setClassName(serviceInfo.packageName, service.getPasswordsActivity())); diff --git a/src/com/android/settings/applications/defaultapps/DefaultAppPreferenceController.java b/src/com/android/settings/applications/defaultapps/DefaultAppPreferenceController.java index 8e8e072a017..fd6f4c243e7 100644 --- a/src/com/android/settings/applications/defaultapps/DefaultAppPreferenceController.java +++ b/src/com/android/settings/applications/defaultapps/DefaultAppPreferenceController.java @@ -66,7 +66,7 @@ public abstract class DefaultAppPreferenceController extends AbstractPreferenceC } if (!TextUtils.isEmpty(defaultAppLabel)) { preference.setSummary(defaultAppLabel); - Utils.setSafeIcon(preference, getDefaultAppIcon()); + preference.setIcon(Utils.getSafeIcon(getDefaultAppIcon())); } else { Log.d(TAG, "No default app"); preference.setSummary(R.string.app_list_preference_none); diff --git a/src/com/android/settings/dream/CurrentDreamPreferenceController.java b/src/com/android/settings/dream/CurrentDreamPreferenceController.java index a73898fdc0a..c267921fd2a 100644 --- a/src/com/android/settings/dream/CurrentDreamPreferenceController.java +++ b/src/com/android/settings/dream/CurrentDreamPreferenceController.java @@ -88,6 +88,6 @@ public class CurrentDreamPreferenceController extends BasePreferenceController { } final GearPreference gearPref = (GearPreference) preference; gearPref.setIconSize(RestrictedPreference.ICON_SIZE_SMALL); - Utils.setSafeIcon(gearPref, mBackend.getActiveIcon()); + gearPref.setIcon(Utils.getSafeIcon(mBackend.getActiveIcon())); } } diff --git a/src/com/android/settings/widget/RadioButtonPickerFragment.java b/src/com/android/settings/widget/RadioButtonPickerFragment.java index 0f4fbc3433b..7d765df60fc 100644 --- a/src/com/android/settings/widget/RadioButtonPickerFragment.java +++ b/src/com/android/settings/widget/RadioButtonPickerFragment.java @@ -205,7 +205,7 @@ public abstract class RadioButtonPickerFragment extends InstrumentedPreferenceFr public RadioButtonPreference bindPreference(RadioButtonPreference pref, String key, CandidateInfo info, String defaultKey) { pref.setTitle(info.loadLabel()); - Utils.setSafeIcon(pref, info.loadIcon()); + pref.setIcon(Utils.getSafeIcon(info.loadIcon())); pref.setKey(key); if (TextUtils.equals(defaultKey, key)) { pref.setChecked(true);