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

Commit 97abcc21 authored by chihhangchuang's avatar chihhangchuang
Browse files

Fix the custom theme page shape bug

- Issue: Press previous button at the custom theme naming page, and then change the app icon shape, then go nxet to the naming page, the app icon does not change.
- Issue video: https://drive.google.com/file/d/1A6NLrtQxrT6fNEYZdll_IFDqXWemHfAE/view?usp=sharing
- Issue screenshot: https://screenshot.googleplex.com/WsYaV0XkL7p.png

- Root cause: the shape app icons are added to the end of the app icon list, and then the UI still get the ahead icons.
- Solution: Replace the whole shape app icon list instead of appending icons.
    Video: https://drive.google.com/file/d/1y4bPYU7Y4Ej0cTyxzvOfNXvIQjm-eXqM/view?usp=sharing

Also add app name for custom theme page...

Test: Manually
Bug: 151285476
Change-Id: I7e6def1e7d18d0ef2e5e4fa198348fbdc20ee746
parent 20fb9b61
Loading
Loading
Loading
Loading
+9 −5
Original line number Diff line number Diff line
@@ -31,6 +31,7 @@ import android.content.Context;
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 @@ public class DefaultThemeProvider extends ResourcesApkProvider implements ThemeB
            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,
+9 −5
Original line number Diff line number Diff line
@@ -25,7 +25,9 @@ import com.android.customization.model.ResourceConstants;
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 @@ class OverlayThemeExtractor {
    }

    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) {
+6 −4
Original line number Diff line number Diff line
@@ -387,13 +387,15 @@ public class ThemeBundle implements CustomizationOption<ThemeBundle> {
            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;
        }

+16 −4
Original line number Diff line number Diff line
@@ -22,6 +22,7 @@ import static com.android.customization.model.ResourceConstants.OVERLAY_CATEGORY
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 android.util.Log;

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 @@ public class ShapeOptionsProvider extends ThemeComponentOptionProvider<ShapeOpti
                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 @@ public class ShapeOptionsProvider extends ThemeComponentOptionProvider<ShapeOpti
        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 @@ public class ShapeOptionsProvider extends ThemeComponentOptionProvider<ShapeOpti
        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 @@ public class ShapeOptionsProvider extends ThemeComponentOptionProvider<ShapeOpti
                    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) {
+7 −5
Original line number Diff line number Diff line
@@ -417,6 +417,7 @@ public abstract class ThemeComponentOption implements CustomizationOption<ThemeC

        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 @@ public abstract class ThemeComponentOption implements CustomizationOption<ThemeC

        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 @@ public abstract class ThemeComponentOption implements CustomizationOption<ThemeC

        @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);
        }
    }