package com.lody.virtual.server.pm.parser; import android.content.ComponentName; import android.content.IntentFilter; import android.content.pm.ActivityInfo; import android.content.pm.ApplicationInfo; import android.content.pm.ConfigurationInfo; import android.content.pm.FeatureInfo; import android.content.pm.InstrumentationInfo; import android.content.pm.PackageParser; import android.content.pm.PermissionGroupInfo; import android.content.pm.PermissionInfo; import android.content.pm.ProviderInfo; import android.content.pm.ServiceInfo; import android.content.pm.Signature; import android.os.Build; import android.os.Bundle; import android.os.Parcel; import android.os.Parcelable; import java.util.ArrayList; /** * @author Lody */ public class VPackage implements Parcelable { public static final Creator<VPackage> CREATOR = new Creator<VPackage>() { @Override public VPackage createFromParcel(Parcel source) { return new VPackage(source); } @Override public VPackage[] newArray(int size) { return new VPackage[size]; } }; public ArrayList<ActivityComponent> activities; public ArrayList<ActivityComponent> receivers; public ArrayList<ProviderComponent> providers; public ArrayList<ServiceComponent> services; public ArrayList<InstrumentationComponent> instrumentation; public ArrayList<PermissionComponent> permissions; public ArrayList<PermissionGroupComponent> permissionGroups; public ArrayList<String> requestedPermissions; public ArrayList<String> protectedBroadcasts; public ApplicationInfo applicationInfo; public Signature[] mSignatures; public Bundle mAppMetaData; public String packageName; public int mPreferredOrder; public String mVersionName; public String mSharedUserId; public ArrayList<String> usesLibraries; public int mVersionCode; public int mSharedUserLabel; // Applications hardware preferences public ArrayList<ConfigurationInfo> configPreferences = null; // Applications requested features public ArrayList<FeatureInfo> reqFeatures = null; public Object mExtras; public VPackage() { } protected VPackage(Parcel in) { int N = in.readInt(); this.activities = new ArrayList<>(N); while (N-- > 0) { activities.add(new ActivityComponent(in)); } N = in.readInt(); this.receivers = new ArrayList<>(N); while (N-- > 0) { receivers.add(new ActivityComponent(in)); } N = in.readInt(); this.providers = new ArrayList<>(N); while (N-- > 0) { providers.add(new ProviderComponent(in)); } N = in.readInt(); this.services = new ArrayList<>(N); while (N-- > 0) { services.add(new ServiceComponent(in)); } N = in.readInt(); this.instrumentation = new ArrayList<>(N); while (N-- > 0) { instrumentation.add(new InstrumentationComponent(in)); } N = in.readInt(); this.permissions = new ArrayList<>(N); while (N-- > 0) { permissions.add(new PermissionComponent(in)); } N = in.readInt(); this.permissionGroups = new ArrayList<>(N); while (N-- > 0) { permissionGroups.add(new PermissionGroupComponent(in)); } this.requestedPermissions = in.createStringArrayList(); this.protectedBroadcasts = in.createStringArrayList(); this.applicationInfo = in.readParcelable(ApplicationInfo.class.getClassLoader()); this.mAppMetaData = in.readBundle(Bundle.class.getClassLoader()); this.packageName = in.readString(); this.mPreferredOrder = in.readInt(); this.mVersionName = in.readString(); this.mSharedUserId = in.readString(); this.usesLibraries = in.createStringArrayList(); this.mVersionCode = in.readInt(); this.mSharedUserLabel = in.readInt(); this.configPreferences = in.createTypedArrayList(ConfigurationInfo.CREATOR); this.reqFeatures = in.createTypedArrayList(FeatureInfo.CREATOR); } @Override public int describeContents() { return 0; } @Override public void writeToParcel(Parcel dest, int flags) { dest.writeInt(this.activities.size()); for (ActivityComponent component : activities) { dest.writeParcelable(component.info, 0); dest.writeString(component.className); dest.writeBundle(component.metaData); dest.writeInt(component.intents != null ? component.intents.size() : 0); if (component.intents != null) { for (ActivityIntentInfo info : component.intents) { info.writeToParcel(dest, flags); } } } dest.writeInt(this.receivers.size()); for (ActivityComponent component : receivers) { dest.writeParcelable(component.info, 0); dest.writeString(component.className); dest.writeBundle(component.metaData); dest.writeInt(component.intents != null ? component.intents.size() : 0); if (component.intents != null) { for (ActivityIntentInfo info : component.intents) { info.writeToParcel(dest, flags); } } } dest.writeInt(this.providers.size()); for (ProviderComponent component : providers) { dest.writeParcelable(component.info, 0); dest.writeString(component.className); dest.writeBundle(component.metaData); dest.writeInt(component.intents != null ? component.intents.size() : 0); if (component.intents != null) { for (ProviderIntentInfo info : component.intents) { info.writeToParcel(dest, flags); } } } dest.writeInt(this.services.size()); for (ServiceComponent component : services) { dest.writeParcelable(component.info, 0); dest.writeString(component.className); dest.writeBundle(component.metaData); dest.writeInt(component.intents != null ? component.intents.size() : 0); if (component.intents != null) { for (ServiceIntentInfo info : component.intents) { info.writeToParcel(dest, flags); } } } dest.writeInt(this.instrumentation.size()); for (InstrumentationComponent component : instrumentation) { dest.writeParcelable(component.info, 0); dest.writeString(component.className); dest.writeBundle(component.metaData); dest.writeInt(component.intents != null ? component.intents.size() : 0); if (component.intents != null) { for (IntentInfo info : component.intents) { info.writeToParcel(dest, flags); } } } dest.writeInt(this.permissions.size()); for (PermissionComponent component : permissions) { dest.writeParcelable(component.info, 0); dest.writeString(component.className); dest.writeBundle(component.metaData); dest.writeInt(component.intents != null ? component.intents.size() : 0); if (component.intents != null) { for (IntentInfo info : component.intents) { info.writeToParcel(dest, flags); } } } dest.writeInt(this.permissionGroups.size()); for (PermissionGroupComponent component : permissionGroups) { dest.writeParcelable(component.info, 0); dest.writeString(component.className); dest.writeBundle(component.metaData); dest.writeInt(component.intents != null ? component.intents.size() : 0); if (component.intents != null) { for (IntentInfo info : component.intents) { info.writeToParcel(dest, flags); } } } dest.writeStringList(this.requestedPermissions); dest.writeStringList(this.protectedBroadcasts); dest.writeParcelable(this.applicationInfo, flags); dest.writeBundle(this.mAppMetaData); dest.writeString(this.packageName); dest.writeInt(this.mPreferredOrder); dest.writeString(this.mVersionName); dest.writeString(this.mSharedUserId); dest.writeStringList(this.usesLibraries); dest.writeInt(this.mVersionCode); dest.writeInt(this.mSharedUserLabel); dest.writeTypedList(this.configPreferences); dest.writeTypedList(this.reqFeatures); } public static class ActivityIntentInfo extends IntentInfo { public ActivityComponent activity; public ActivityIntentInfo(PackageParser.IntentInfo info) { super(info); } protected ActivityIntentInfo(Parcel in) { super(in); } } public static class ServiceIntentInfo extends IntentInfo { public ServiceComponent service; public ServiceIntentInfo(PackageParser.IntentInfo info) { super(info); } protected ServiceIntentInfo(Parcel in) { super(in); } } public static class ProviderIntentInfo extends IntentInfo { public ProviderComponent provider; public ProviderIntentInfo(PackageParser.IntentInfo info) { super(info); } protected ProviderIntentInfo(Parcel in) { super(in); } } public static class IntentInfo implements Parcelable { public static final Creator<IntentInfo> CREATOR = new Creator<IntentInfo>() { @Override public IntentInfo createFromParcel(Parcel source) { return new IntentInfo(source); } @Override public IntentInfo[] newArray(int size) { return new IntentInfo[size]; } }; public IntentFilter filter; public boolean hasDefault; public int labelRes; public String nonLocalizedLabel; public int icon; public int logo; public int banner; public IntentInfo(PackageParser.IntentInfo info) { this.filter = info; this.hasDefault = info.hasDefault; this.labelRes = info.labelRes; if (info.nonLocalizedLabel != null) { this.nonLocalizedLabel = info.nonLocalizedLabel.toString(); } this.icon = info.icon; this.logo = info.logo; if (Build.VERSION.SDK_INT > Build.VERSION_CODES.KITKAT) { this.banner = info.banner; } } protected IntentInfo(Parcel in) { this.filter = in.readParcelable(VPackage.class.getClassLoader()); this.hasDefault = in.readByte() != 0; this.labelRes = in.readInt(); this.nonLocalizedLabel = in.readString(); this.icon = in.readInt(); this.logo = in.readInt(); this.banner = in.readInt(); } @Override public int describeContents() { return 0; } @Override public void writeToParcel(Parcel dest, int flags) { dest.writeParcelable(this.filter, flags); dest.writeByte(this.hasDefault ? (byte) 1 : (byte) 0); dest.writeInt(this.labelRes); dest.writeString(this.nonLocalizedLabel); dest.writeInt(this.icon); dest.writeInt(this.logo); dest.writeInt(this.banner); } } public static class Component<II extends IntentInfo> { public VPackage owner; public ArrayList<II> intents; public String className; public Bundle metaData; private ComponentName componentName; protected Component() { } public Component(PackageParser.Component component) { this.className = component.className; this.metaData = component.metaData; } public ComponentName getComponentName() { if (componentName != null) { return componentName; } if (className != null) { componentName = new ComponentName(owner.packageName, className); } return componentName; } } public static class ActivityComponent extends Component<ActivityIntentInfo> { public ActivityInfo info; public ActivityComponent(PackageParser.Activity activity) { super(activity); if (activity.intents != null) { this.intents = new ArrayList<>(activity.intents.size()); for (Object o : activity.intents) { intents.add(new ActivityIntentInfo((PackageParser.IntentInfo) o)); } } info = activity.info; } protected ActivityComponent(Parcel src) { info = src.readParcelable(ActivityInfo.class.getClassLoader()); className = src.readString(); metaData = src.readBundle(Bundle.class.getClassLoader()); int N = src.readInt(); intents = new ArrayList<>(N); while (N-- > 0) { intents.add(new ActivityIntentInfo(src)); } } } public static class ServiceComponent extends Component<ServiceIntentInfo> { public ServiceInfo info; public ServiceComponent(PackageParser.Service service) { super(service); if (service.intents != null) { this.intents = new ArrayList<>(service.intents.size()); for (Object o : service.intents) { intents.add(new ServiceIntentInfo((PackageParser.IntentInfo) o)); } } this.info = service.info; } protected ServiceComponent(Parcel src) { info = src.readParcelable(ActivityInfo.class.getClassLoader()); className = src.readString(); metaData = src.readBundle(Bundle.class.getClassLoader()); int N = src.readInt(); intents = new ArrayList<>(N); while (N-- > 0) { intents.add(new ServiceIntentInfo(src)); } } } public static class ProviderComponent extends Component<ProviderIntentInfo> { public ProviderInfo info; public ProviderComponent(PackageParser.Provider provider) { super(provider); if (provider.intents != null) { this.intents = new ArrayList<>(provider.intents.size()); for (Object o : provider.intents) { intents.add(new ProviderIntentInfo((PackageParser.IntentInfo) o)); } } this.info = provider.info; } protected ProviderComponent(Parcel src) { info = src.readParcelable(ActivityInfo.class.getClassLoader()); className = src.readString(); metaData = src.readBundle(Bundle.class.getClassLoader()); int N = src.readInt(); intents = new ArrayList<>(N); while (N-- > 0) { intents.add(new ProviderIntentInfo(src)); } } } public static class InstrumentationComponent extends Component<IntentInfo> { public InstrumentationInfo info; public InstrumentationComponent(PackageParser.Instrumentation i) { super(i); this.info = i.info; } protected InstrumentationComponent(Parcel src) { info = src.readParcelable(ActivityInfo.class.getClassLoader()); className = src.readString(); metaData = src.readBundle(Bundle.class.getClassLoader()); int N = src.readInt(); intents = new ArrayList<>(N); while (N-- > 0) { intents.add(new IntentInfo(src)); } } } public static class PermissionComponent extends Component<IntentInfo> { public PermissionInfo info; public PermissionComponent(PackageParser.Permission p) { super(p); this.info = p.info; } protected PermissionComponent(Parcel src) { info = src.readParcelable(ActivityInfo.class.getClassLoader()); className = src.readString(); metaData = src.readBundle(Bundle.class.getClassLoader()); int N = src.readInt(); intents = new ArrayList<>(N); while (N-- > 0) { intents.add(new IntentInfo(src)); } } } public static class PermissionGroupComponent extends Component<IntentInfo> { public PermissionGroupInfo info; public PermissionGroupComponent(PackageParser.PermissionGroup p) { super(p); this.info = p.info; } protected PermissionGroupComponent(Parcel src) { info = src.readParcelable(ActivityInfo.class.getClassLoader()); className = src.readString(); metaData = src.readBundle(Bundle.class.getClassLoader()); int N = src.readInt(); intents = new ArrayList<>(N); while (N-- > 0) { intents.add(new IntentInfo(src)); } } } }