Wrap a white adaptive background if it is not an AdaptiveIcon

Bug: 183501919
Test: manual test
Change-Id: I6a899aa0fcb724d5318274190f359080fc2d0615
diff --git a/src/com/android/settings/Utils.java b/src/com/android/settings/Utils.java
index 8418315..031fb8a 100644
--- a/src/com/android/settings/Utils.java
+++ b/src/com/android/settings/Utils.java
@@ -48,6 +48,7 @@
 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.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.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 @@
     }
 
     /**
-     * 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 @@
      * @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 af8bf47..d4db395 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.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 @@
             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 47882de..a9d1572 100644
--- a/src/com/android/settings/applications/autofill/PasswordsPreferenceController.java
+++ b/src/com/android/settings/applications/autofill/PasswordsPreferenceController.java
@@ -124,7 +124,7 @@
                             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 8e8e072..fd6f4c2 100644
--- a/src/com/android/settings/applications/defaultapps/DefaultAppPreferenceController.java
+++ b/src/com/android/settings/applications/defaultapps/DefaultAppPreferenceController.java
@@ -66,7 +66,7 @@
         }
         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 a73898f..c267921 100644
--- a/src/com/android/settings/dream/CurrentDreamPreferenceController.java
+++ b/src/com/android/settings/dream/CurrentDreamPreferenceController.java
@@ -88,6 +88,6 @@
         }
         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 0f4fbc3..7d765df 100644
--- a/src/com/android/settings/widget/RadioButtonPickerFragment.java
+++ b/src/com/android/settings/widget/RadioButtonPickerFragment.java
@@ -205,7 +205,7 @@
     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);