package com.lody.virtual.server.pm; import android.os.Parcel; import android.os.Parcelable; import android.util.SparseArray; import com.lody.virtual.remote.InstalledAppInfo; /** * @author Lody */ public class PackageSetting implements Parcelable { public static final Parcelable.Creator<PackageSetting> CREATOR = new Parcelable.Creator<PackageSetting>() { @Override public PackageSetting createFromParcel(Parcel source) { return new PackageSetting(source); } @Override public PackageSetting[] newArray(int size) { return new PackageSetting[size]; } }; private static final PackageUserState DEFAULT_USER_STATE = new PackageUserState(); public String packageName; public String apkPath; public String libPath; public boolean dependSystem; /** * In this mode we skip the dex2oat so we can load the class.dex very fast. */ public boolean artFlyMode; public int appId; public long firstInstallTime; public long lastUpdateTime; private SparseArray<PackageUserState> userState = new SparseArray<>(); public PackageSetting() { } protected PackageSetting(Parcel in) { this.packageName = in.readString(); this.apkPath = in.readString(); this.libPath = in.readString(); this.dependSystem = in.readByte() != 0; this.appId = in.readInt(); //noinspection unchecked this.userState = in.readSparseArray(PackageUserState.class.getClassLoader()); this.artFlyMode = in.readByte() != 0; } public InstalledAppInfo getAppInfo() { return new InstalledAppInfo(packageName, apkPath, libPath, dependSystem, artFlyMode, appId); } PackageUserState modifyUserState(int userId) { PackageUserState state = userState.get(userId); if (state == null) { state = new PackageUserState(); userState.put(userId, state); } return state; } void setUserState(int userId, boolean launched, boolean hidden, boolean installed) { PackageUserState state = modifyUserState(userId); state.launched = launched; state.hidden = hidden; state.installed = installed; } PackageUserState readUserState(int userId) { PackageUserState state = userState.get(userId); if (state != null) { return state; } return DEFAULT_USER_STATE; } void removeUser(int userId) { userState.delete(userId); } @Override public int describeContents() { return 0; } @Override public void writeToParcel(Parcel dest, int flags) { dest.writeString(this.packageName); dest.writeString(this.apkPath); dest.writeString(this.libPath); dest.writeByte(this.dependSystem ? (byte) 1 : (byte) 0); dest.writeInt(this.appId); //noinspection unchecked dest.writeSparseArray((SparseArray) this.userState); dest.writeByte(this.artFlyMode ? (byte) 1 : (byte) 0); } public boolean isLaunched(int userId) { return readUserState(userId).launched; } public boolean isHidden(int userId) { return readUserState(userId).hidden; } public boolean isInstalled(int userId) { return readUserState(userId).installed; } public void setLaunched(int userId, boolean launched) { modifyUserState(userId).launched = launched; } public void setHidden(int userId, boolean hidden) { modifyUserState(userId).hidden = hidden; } public void setInstalled(int userId, boolean installed) { modifyUserState(userId).installed = installed; } }