package com.pitchedapps.butler.iconrequest; import android.content.ComponentName; import android.content.Context; import android.content.pm.ActivityInfo; import android.content.pm.ApplicationInfo; import android.content.pm.PackageManager; import android.content.res.Resources; import android.graphics.drawable.Drawable; import android.os.Build; import android.os.Parcel; import android.os.Parcelable; import android.support.annotation.Nullable; import android.support.v4.content.res.ResourcesCompat; import android.util.DisplayMetrics; import android.widget.ImageView; import com.bumptech.glide.Priority; import com.pitchedapps.butler.iconrequest.glide.AppIconLoader; import com.pitchedapps.butler.iconrequest.utils.IRUtils; /** * Created by Allan Wang on 2016-08-20. */ public class App implements Parcelable { private String mName; private String mCode; private String mPkg; private transient Drawable mIcon; private transient Drawable mIconHighRes; public App(String name, String code, String pkg) { mName = name; mCode = code; mPkg = pkg; } public Drawable getHighResIcon(Context context) { if (mIconHighRes == null) { ApplicationInfo ai = getAppInfo(context); if (ai == null || ai.icon == 0) return getIcon(context); Resources mRes = getResources(context, ai); if (mRes == null) return getIcon(context); mIconHighRes = getAppIcon(mRes, ai.icon); } return mIconHighRes; } public Drawable getIcon(Context context) { if (mIcon == null) { final ApplicationInfo ai = getAppInfo(context); if (ai != null) mIcon = ai.loadIcon(context.getPackageManager()); } return mIcon; } public Drawable getAppIcon(Resources resources, int iconId) { Drawable d; try { int iconDpi; if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR2) { iconDpi = DisplayMetrics.DENSITY_XXXHIGH; } else { iconDpi = DisplayMetrics.DENSITY_XXHIGH; } d = ResourcesCompat.getDrawableForDensity(resources, iconId, iconDpi, null); } catch (Resources.NotFoundException e) { d = null; } return (d != null) ? d : getAppDefaultIcon(); } public Drawable getAppDefaultIcon() { return getAppIcon(Resources.getSystem(), android.R.mipmap.sym_def_app_icon); } public void loadIcon(ImageView into, Priority priority) { if (IRUtils.inClassPath("com.bumptech.glide.load.model.ModelLoader")) { AppIconLoader.display(into, this, priority, getAppDefaultIcon()); } else { into.setImageDrawable(getIcon(into.getContext())); } } public String getName() { return mName; } public String getCode() { return mCode; } public String getPackage() { return mPkg; } @Nullable public ApplicationInfo getAppInfo(Context context) { try { return context.getPackageManager().getApplicationInfo(mPkg, 0); } catch (PackageManager.NameNotFoundException e) { return null; } } @Nullable public ActivityInfo getActivityInfo(Context context) { try { return context.getPackageManager().getActivityInfo(new ComponentName(mCode.split("/") [0], mCode.split("/")[1]), PackageManager.GET_META_DATA); } catch (PackageManager.NameNotFoundException e) { return null; } } @Nullable public Resources getResources(Context context, ApplicationInfo ai) { try { return context.getPackageManager().getResourcesForApplication(ai); } catch (PackageManager.NameNotFoundException e) { return null; } } @Override public String toString() { return mCode; } @Override public boolean equals(Object o) { return o instanceof App && ((App) o).getCode().equals(getCode()); } protected App(Parcel in) { mName = in.readString(); mCode = in.readString(); mPkg = in.readString(); } @Override public int describeContents() { return 0; } @Override public void writeToParcel(Parcel dest, int flags) { dest.writeString(mName); dest.writeString(mCode); dest.writeString(mPkg); } @SuppressWarnings("unused") public static final Parcelable.Creator<App> CREATOR = new Parcelable.Creator<App>() { @Override public App createFromParcel(Parcel in) { return new App(in); } @Override public App[] newArray(int size) { return new App[size]; } }; }