Merge "Fix the custom theme page shape bug" into ub-launcher3-master
diff --git a/src/com/android/customization/model/theme/DefaultThemeProvider.java b/src/com/android/customization/model/theme/DefaultThemeProvider.java
index 60eb66d..52a56e1 100644
--- a/src/com/android/customization/model/theme/DefaultThemeProvider.java
+++ b/src/com/android/customization/model/theme/DefaultThemeProvider.java
@@ -31,6 +31,7 @@
 import android.content.pm.ApplicationInfo;
 import android.content.pm.PackageManager.NameNotFoundException;
 import android.content.res.Resources.NotFoundException;
+import android.graphics.drawable.Drawable;
 import android.text.TextUtils;
 import android.util.Log;
 
@@ -209,20 +210,23 @@
             Log.d(TAG, "Didn't find shape overlay for default theme, will use system default");
             mOverlayProvider.addSystemDefaultShape(builder);
         }
+
+        List<Drawable> icons = new ArrayList<>();
+        List<String> names = new ArrayList<>();
         for (String packageName : mOverlayProvider.getShapePreviewIconPackages()) {
             try {
-                builder.addShapePreviewIcon(
-                        mContext.getPackageManager().getApplicationIcon(packageName));
-                // Add the shape icon app name.
+                icons.add(mContext.getPackageManager().getApplicationIcon(packageName));
                 ApplicationInfo appInfo = mContext.getPackageManager()
                         .getApplicationInfo(packageName, /* flag= */ 0);
-                builder.addShapePreviewIconName(
-                        String.valueOf(mContext.getPackageManager().getApplicationLabel(appInfo)));
+                names.add(String.valueOf(
+                        mContext.getPackageManager().getApplicationLabel(appInfo)));
             } catch (NameNotFoundException e) {
                 Log.d(TAG, "Couldn't find app " + packageName + ", won't use it for icon shape"
                         + "preview");
             }
         }
+        builder.setShapePreviewIcons(icons);
+        builder.setShapePreviewIconNames(names);
 
         try {
             String iconAndroidOverlayPackage = getOverlayPackage(ICON_ANDROID_PREFIX,
diff --git a/src/com/android/customization/model/theme/OverlayThemeExtractor.java b/src/com/android/customization/model/theme/OverlayThemeExtractor.java
index f1698f6..389e514 100644
--- a/src/com/android/customization/model/theme/OverlayThemeExtractor.java
+++ b/src/com/android/customization/model/theme/OverlayThemeExtractor.java
@@ -25,7 +25,9 @@
 import com.android.customization.model.theme.ThemeBundle.Builder;
 import com.android.wallpaper.R;
 
+import java.util.ArrayList;
 import java.util.HashMap;
+import java.util.List;
 import java.util.Map;
 import java.util.function.Consumer;
 
@@ -98,21 +100,23 @@
     }
 
     private void addShapePreviewIcons(Builder builder) {
+        List<Drawable> icons = new ArrayList<>();
+        List<String> names = new ArrayList<>();
         for (String packageName : mShapePreviewIconPackages) {
             try {
-                builder.addShapePreviewIcon(
-                        mContext.getPackageManager().getApplicationIcon(
-                                packageName));
+                icons.add(mContext.getPackageManager().getApplicationIcon(packageName));
                 // Add the shape icon app name.
                 ApplicationInfo appInfo = mContext.getPackageManager()
                         .getApplicationInfo(packageName, /* flag= */ 0);
-                builder.addShapePreviewIconName(
-                        String.valueOf(mContext.getPackageManager().getApplicationLabel(appInfo)));
+                names.add(String.valueOf(
+                        mContext.getPackageManager().getApplicationLabel(appInfo)));
             } catch (NameNotFoundException e) {
                 Log.d(TAG, "Couldn't find app " + packageName
                         + ", won't use it for icon shape preview");
             }
         }
+        builder.setShapePreviewIcons(icons);
+        builder.setShapePreviewIconNames(names);
     }
 
     void addNoPreviewIconOverlay(Builder builder, String overlayPackage) {
diff --git a/src/com/android/customization/model/theme/ThemeBundle.java b/src/com/android/customization/model/theme/ThemeBundle.java
index 9928c76..8f15e6d 100644
--- a/src/com/android/customization/model/theme/ThemeBundle.java
+++ b/src/com/android/customization/model/theme/ThemeBundle.java
@@ -387,13 +387,15 @@
             return this;
         }
 
-        public Builder addShapePreviewIcon(Drawable appIcon) {
-            mAppIcons.add(appIcon);
+        public Builder setShapePreviewIcons(List<Drawable> appIcons) {
+            mAppIcons.clear();
+            mAppIcons.addAll(appIcons);
             return this;
         }
 
-        public Builder addShapePreviewIconName(String appIconName) {
-            mAppIconNames.add(appIconName);
+        public Builder setShapePreviewIconNames(List<String> appIconNames) {
+            mAppIconNames.clear();
+            mAppIconNames.addAll(appIconNames);
             return this;
         }
 
diff --git a/src/com/android/customization/model/theme/custom/ShapeOptionsProvider.java b/src/com/android/customization/model/theme/custom/ShapeOptionsProvider.java
index 2206ff4..7357607 100644
--- a/src/com/android/customization/model/theme/custom/ShapeOptionsProvider.java
+++ b/src/com/android/customization/model/theme/custom/ShapeOptionsProvider.java
@@ -22,6 +22,7 @@
 import static com.android.customization.model.ResourceConstants.PATH_SIZE;
 
 import android.content.Context;
+import android.content.pm.ApplicationInfo;
 import android.content.pm.PackageManager;
 import android.content.pm.PackageManager.NameNotFoundException;
 import android.content.res.Resources;
@@ -36,6 +37,7 @@
 
 import androidx.annotation.Dimension;
 import androidx.core.graphics.PathParser;
+import androidx.core.util.Pair;
 
 import com.android.customization.model.ResourceConstants;
 import com.android.customization.model.theme.OverlayManagerCompat;
@@ -74,8 +76,11 @@
                 ShapeDrawable shapeDrawable = createShapeDrawable(path);
                 PackageManager pm = mContext.getPackageManager();
                 String label = pm.getApplicationInfo(overlayPackage, 0).loadLabel(pm).toString();
+                Pair<List<Drawable>, List<String>> shapedIconsAndNames =
+                        getShapedIconsAndNames(path);
                 mOptions.add(new ShapeOption(overlayPackage, label, path,
-                        loadCornerRadius(overlayPackage), shapeDrawable, getShapedIcons(path)));
+                        loadCornerRadius(overlayPackage), shapeDrawable, shapedIconsAndNames.first,
+                        shapedIconsAndNames.second));
             } catch (NameNotFoundException | NotFoundException e) {
                 Log.w(TAG, String.format("Couldn't load shape overlay %s, will skip it",
                         overlayPackage), e);
@@ -87,11 +92,12 @@
         Resources system = Resources.getSystem();
         Path path = loadPath(system, ANDROID_PACKAGE);
         ShapeDrawable shapeDrawable = createShapeDrawable(path);
+        Pair<List<Drawable>, List<String>> shapedIconsAndNames = getShapedIconsAndNames(path);
         mOptions.add(new ShapeOption(null, mContext.getString(R.string.default_theme_title), path,
                 system.getDimensionPixelOffset(
                     system.getIdentifier(ResourceConstants.CONFIG_CORNERRADIUS,
                         "dimen", ResourceConstants.ANDROID_PACKAGE)),
-                shapeDrawable, getShapedIcons(path)));
+                shapeDrawable, shapedIconsAndNames.first, shapedIconsAndNames.second));
     }
 
     private ShapeDrawable createShapeDrawable(Path path) {
@@ -102,8 +108,9 @@
         return shapeDrawable;
     }
 
-    private List<Drawable> getShapedIcons(Path path) {
+    private Pair<List<Drawable>, List<String>> getShapedIconsAndNames(Path path) {
         List<Drawable> icons = new ArrayList<>();
+        List<String> names = new ArrayList<>();
         for (String packageName : mShapePreviewIconPackages) {
             try {
                 Drawable appIcon = mContext.getPackageManager().getApplicationIcon(packageName);
@@ -111,13 +118,18 @@
                     AdaptiveIconDrawable adaptiveIcon = (AdaptiveIconDrawable) appIcon;
                     icons.add(new DynamicAdaptiveIconDrawable(adaptiveIcon.getBackground(),
                             adaptiveIcon.getForeground(), path));
+
+                    ApplicationInfo appInfo = mContext.getPackageManager()
+                            .getApplicationInfo(packageName, /* flag= */ 0);
+                    names.add(String.valueOf(
+                            mContext.getPackageManager().getApplicationLabel(appInfo)));
                 }
             } catch (NameNotFoundException e) {
                 Log.d(TAG, "Couldn't find app " + packageName
                         + ", won't use it for icon shape preview");
             }
         }
-        return icons;
+        return Pair.create(icons, names);
     }
 
     private Path loadPath(Resources overlayRes, String packageName) {
diff --git a/src/com/android/customization/model/theme/custom/ThemeComponentOption.java b/src/com/android/customization/model/theme/custom/ThemeComponentOption.java
index 6583433..fed641f 100644
--- a/src/com/android/customization/model/theme/custom/ThemeComponentOption.java
+++ b/src/com/android/customization/model/theme/custom/ThemeComponentOption.java
@@ -417,6 +417,7 @@
 
         private final LayerDrawable mShape;
         private final List<Drawable> mAppIcons;
+        private final List<String> mAppIconNames;
         private final String mLabel;
         private final Path mPath;
         private final int mCornerRadius;
@@ -427,10 +428,11 @@
 
         ShapeOption(String packageName, String label, Path path,
                 @Dimension int cornerRadius, Drawable shapeDrawable,
-                List<Drawable> appIcons) {
+                List<Drawable> appIcons, List<String> appIconNames) {
             addOverlayPackage(OVERLAY_CATEGORY_SHAPE, packageName);
             mLabel = label;
             mAppIcons = appIcons;
+            mAppIconNames = appIconNames;
             mPath = path;
             mCornerRadius = cornerRadius;
             Drawable background = shapeDrawable.getConstantState().newDrawable();
@@ -495,10 +497,10 @@
 
         @Override
         public Builder buildStep(Builder builder) {
-            builder.setShapePath(mPath).setBottomSheetCornerRadius(mCornerRadius);
-            for (Drawable appIcon : mAppIcons) {
-                builder.addShapePreviewIcon(appIcon);
-            }
+            builder.setShapePath(mPath)
+                    .setBottomSheetCornerRadius(mCornerRadius)
+                    .setShapePreviewIcons(mAppIcons)
+                    .setShapePreviewIconNames(mAppIconNames);
             return super.buildStep(builder);
         }
     }