From 4d04065e8d5c6b6bc2bf4eb24fd6250d6d24bc16 Mon Sep 17 00:00:00 2001 From: Suphon Thanakornpakapong Date: Thu, 5 Aug 2021 10:32:12 +0700 Subject: [PATCH] Move icon pack loading logic to IconPack --- .../src/app/lawnchair/iconpack/IconPack.java | 96 +++++++++++++++++-- .../lawnchair/iconpack/IconPackProvider.java | 96 +------------------ 2 files changed, 95 insertions(+), 97 deletions(-) diff --git a/lawnchair/src/app/lawnchair/iconpack/IconPack.java b/lawnchair/src/app/lawnchair/iconpack/IconPack.java index 424a17378d..b0203640ca 100644 --- a/lawnchair/src/app/lawnchair/iconpack/IconPack.java +++ b/lawnchair/src/app/lawnchair/iconpack/IconPack.java @@ -22,7 +22,10 @@ import androidx.annotation.ColorInt; import androidx.core.graphics.ColorUtils; import androidx.palette.graphics.Palette; +import org.xmlpull.v1.XmlPullParser; + import java.util.ArrayList; +import java.util.HashMap; import java.util.List; import java.util.Map; @@ -35,9 +38,14 @@ public class IconPack { http://stackoverflow.com/questions/7205415/getting-resources-of-another-application http://stackoverflow.com/questions/3890012/how-to-access-string-resource-from-another-application */ + public static final String ICON_MASK_TAG = "iconmask"; + public static final String ICON_BACK_TAG = "iconback"; + public static final String ICON_UPON_TAG = "iconupon"; + public static final String ICON_SCALE_TAG = "scale"; + private String packageName; private Context mContext; - private Map mIconPackResources; + private Map mIconPackResources = new HashMap<>(); private List mIconBackStrings; private List mIconBackList; private Drawable mIconUpon, mIconMask; @@ -49,18 +57,94 @@ public class IconPack { mContext = context; } + void parseAppFilter(String packageName, XmlPullParser parser) throws Exception { + List iconBackStrings = new ArrayList(); + + while (parser.next() != XmlPullParser.END_DOCUMENT) { + if (parser.getEventType() != XmlPullParser.START_TAG) { + continue; + } + String name = parser.getName().toLowerCase(); + if (name.equals("item")) { + String component = parser.getAttributeValue(null, "component"); + String drawable = parser.getAttributeValue(null, "drawable"); + // Validate component/drawable exist + + if (TextUtils.isEmpty(component) || TextUtils.isEmpty(drawable)) { + continue; + } + + // Validate format/length of component + if (!component.startsWith("ComponentInfo{") || !component.endsWith("}") + || component.length() < 16) { + continue; + } + + // Sanitize stored value + component = component.substring(14, component.length() - 1); + + Map iconPackResources = mIconPackResources; + if (!component.contains("/")) { + // Package icon reference + iconPackResources.put(component, drawable); + } else { + ComponentName componentName = ComponentName.unflattenFromString(component); + if (componentName != null) { + iconPackResources.put(componentName.getPackageName(), drawable); + iconPackResources.put(component, drawable); + } + } + continue; + } + + if (name.equals(ICON_BACK_TAG)) { + String icon = parser.getAttributeValue(null, "img"); + if (icon == null) { + for (int i = 0; i < parser.getAttributeCount(); i++) { + iconBackStrings.add(parser.getAttributeValue(i)); + } + } + continue; + } + + if (name.equals(ICON_MASK_TAG) || + name.equals(ICON_UPON_TAG)) { + String icon = parser.getAttributeValue(null, "img"); + if (icon == null) { + if (parser.getAttributeCount() > 0) { + icon = parser.getAttributeValue(0); + } + } + mIconPackResources.put(parser.getName().toLowerCase(), icon); + continue; + } + + if (name.equals(ICON_SCALE_TAG)) { + String factor = parser.getAttributeValue(null, "factor"); + if (factor == null) { + if (parser.getAttributeCount() > 0) { + factor = parser.getAttributeValue(0); + } + } + mIconPackResources.put(parser.getName().toLowerCase(), factor); + continue; + } + } + setIcons(mIconPackResources, iconBackStrings); + } + public void setIcons(Map iconPackResources, List iconBackStrings) { mIconPackResources = iconPackResources; mIconBackStrings = iconBackStrings; - mIconBackList = new ArrayList(); + mIconBackList = new ArrayList<>(); try { mLoadedIconPackResource = mContext.getPackageManager().getResourcesForApplication(packageName); } catch (PackageManager.NameNotFoundException e) { // must never happen cause itys checked already in the provider return; } - mIconMask = getDrawableForName(IconPackProvider.ICON_MASK_TAG); - mIconUpon = getDrawableForName(IconPackProvider.ICON_UPON_TAG); + mIconMask = getDrawableForName(ICON_MASK_TAG); + mIconUpon = getDrawableForName(ICON_UPON_TAG); for (int i = 0; i < mIconBackStrings.size(); i++) { String backIconString = mIconBackStrings.get(i); Drawable backIcon = getDrawableWithName(backIconString); @@ -68,10 +152,10 @@ public class IconPack { mIconBackList.add(backIcon); } } - String scale = mIconPackResources.get(IconPackProvider.ICON_SCALE_TAG); + String scale = mIconPackResources.get(ICON_SCALE_TAG); if (scale != null) { try { - mIconScale = Float.valueOf(scale); + mIconScale = Float.parseFloat(scale); } catch (NumberFormatException e) { } } diff --git a/lawnchair/src/app/lawnchair/iconpack/IconPackProvider.java b/lawnchair/src/app/lawnchair/iconpack/IconPackProvider.java index 84538ee65a..c0ea181868 100644 --- a/lawnchair/src/app/lawnchair/iconpack/IconPackProvider.java +++ b/lawnchair/src/app/lawnchair/iconpack/IconPackProvider.java @@ -1,28 +1,19 @@ package app.lawnchair.iconpack; -import android.content.ComponentName; import android.content.Context; import android.content.pm.PackageManager; import android.content.res.Resources; -import android.text.TextUtils; import android.util.ArrayMap; import android.widget.Toast; import org.xmlpull.v1.XmlPullParser; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; import java.util.Map; import app.lawnchair.preferences.PreferenceManager; public class IconPackProvider { - private static Map iconPacks = new ArrayMap<>(); - public static final String ICON_MASK_TAG = "iconmask"; - public static final String ICON_BACK_TAG = "iconback"; - public static final String ICON_UPON_TAG = "iconupon"; - public static final String ICON_SCALE_TAG = "scale"; + private static final Map iconPacks = new ArrayMap<>(); public static IconPack getIconPack(String packageName){ return iconPacks.get(packageName); @@ -35,108 +26,31 @@ public class IconPackProvider { public static IconPack loadAndGetIconPack(Context context) { PreferenceManager prefs = PreferenceManager.getInstance(context); String packageName = prefs.getIconPackPackage().get(); - if("".equals(packageName)){ + if ("".equals(packageName)) { return null; } - if(!iconPacks.containsKey(packageName)){ + if (!iconPacks.containsKey(packageName)) { loadIconPack(context, packageName); } return getIconPack(packageName); } public static void loadIconPack(Context context, String packageName) { - if("".equals(packageName)){ + if ("".equals(packageName)) { iconPacks.put("", null); } try { XmlPullParser appFilter = getAppFilter(context, packageName); if (appFilter != null) { IconPack pack = new IconPack(context, packageName); - parseAppFilter(packageName, appFilter, pack); + pack.parseAppFilter(packageName, appFilter); iconPacks.put(packageName, pack); } } catch (Exception e) { Toast.makeText(context, "Invalid IconPack", Toast.LENGTH_SHORT).show(); - return; } } - private static void parseAppFilter(String packageName, XmlPullParser parser, IconPack pack) throws Exception { - Map iconPackResources = new HashMap(); - List iconBackStrings = new ArrayList(); - - while (parser.next() != XmlPullParser.END_DOCUMENT) { - if (parser.getEventType() != XmlPullParser.START_TAG) { - continue; - } - String name = parser.getName(); - if (name.equals("item")) { - String component = parser.getAttributeValue(null, "component"); - String drawable = parser.getAttributeValue(null, "drawable"); - // Validate component/drawable exist - - if (TextUtils.isEmpty(component) || TextUtils.isEmpty(drawable)) { - continue; - } - - // Validate format/length of component - if (!component.startsWith("ComponentInfo{") || !component.endsWith("}") - || component.length() < 16) { - continue; - } - - // Sanitize stored value - component = component.substring(14, component.length() - 1); - - if (!component.contains("/")) { - // Package icon reference - iconPackResources.put(component, drawable); - } else { - ComponentName componentName = ComponentName.unflattenFromString(component); - if (componentName != null) { - iconPackResources.put(componentName.getPackageName(), drawable); - iconPackResources.put(component, drawable); - } - } - continue; - } - - if (name.equalsIgnoreCase(ICON_BACK_TAG)) { - String icon = parser.getAttributeValue(null, "img"); - if (icon == null) { - for (int i = 0; i < parser.getAttributeCount(); i++) { - iconBackStrings.add(parser.getAttributeValue(i)); - } - } - continue; - } - - if (name.equalsIgnoreCase(ICON_MASK_TAG) || - name.equalsIgnoreCase(ICON_UPON_TAG)) { - String icon = parser.getAttributeValue(null, "img"); - if (icon == null) { - if (parser.getAttributeCount() > 0) { - icon = parser.getAttributeValue(0); - } - } - iconPackResources.put(parser.getName().toLowerCase(), icon); - continue; - } - - if (name.equalsIgnoreCase(ICON_SCALE_TAG)) { - String factor = parser.getAttributeValue(null, "factor"); - if (factor == null) { - if (parser.getAttributeCount() > 0) { - factor = parser.getAttributeValue(0); - } - } - iconPackResources.put(parser.getName().toLowerCase(), factor); - continue; - } - } - pack.setIcons(iconPackResources, iconBackStrings); - } - private static XmlPullParser getAppFilter(Context context, String packageName) { try { Resources res = context.getPackageManager().getResourcesForApplication(packageName);