diff options
Diffstat (limited to 'app/src/main/java/moe/yuuta/workmode/suspend/data/TransferableSuspendedApp.kt')
-rw-r--r-- | app/src/main/java/moe/yuuta/workmode/suspend/data/TransferableSuspendedApp.kt | 101 |
1 files changed, 101 insertions, 0 deletions
diff --git a/app/src/main/java/moe/yuuta/workmode/suspend/data/TransferableSuspendedApp.kt b/app/src/main/java/moe/yuuta/workmode/suspend/data/TransferableSuspendedApp.kt new file mode 100644 index 0000000..03bf842 --- /dev/null +++ b/app/src/main/java/moe/yuuta/workmode/suspend/data/TransferableSuspendedApp.kt @@ -0,0 +1,101 @@ +package moe.yuuta.workmode.suspend.data + +import android.annotation.SystemApi +import android.content.pm.PackageManager +import android.graphics.Bitmap +import android.graphics.BitmapFactory +import android.os.Parcel +import android.os.Parcelable +import android.os.Process +import android.text.TextUtils +import com.elvishew.xlog.XLog + +/** + * The data of Suspended app which can be transfered through IPC only + */ +data class TransferableSuspendedApp( + val userId: Int, + val packageName: String, + // Null if it has the same user id with the host + var label: CharSequence?, + // -1 if not available + var uid: Int, + // Null if it has the same user id with the host + var icon: Bitmap? +) : Parcelable { + constructor(parcel: Parcel) : this( + parcel.readInt(), + parcel.readString(), + TextUtils.CHAR_SEQUENCE_CREATOR.createFromParcel(parcel), + parcel.readInt(), + parcel.readParcelable<Bitmap>(Bitmap::class.java.classLoader) + ) + + fun trimToPersistable(): PersistableSuspendedApp = + PersistableSuspendedApp(userId, packageName) + + /** + * Fill all fields. + */ + @SystemApi + fun fillData(pm: PackageManager, ignoreLargeData: Boolean) { + val info = pm.getApplicationInfoAsUser(packageName, + 0, + userId) + label = if (ignoreLargeData) null + else pm.getApplicationLabel(info) + uid = info.uid + if (ignoreLargeData) { + icon = null + } else { + XLog.d("Loading icon for ${info.packageName}") + val res = pm.getResourcesForApplicationAsUser(info.packageName, userId) + icon = BitmapFactory.decodeResource(res, info.icon) + } + } + + /** + * Remove unnecessary data for in-app transaction + */ + fun trimData() { + label = null + uid = -1 + icon = null + } + + companion object { + fun of(packageName: String): TransferableSuspendedApp { + return of(packageName, Process.myUserHandle().hashCode()) + } + + fun of(packageName: String, userId: Int): TransferableSuspendedApp { + return PersistableSuspendedApp(userId, packageName).copyToSimpleTransferableInfo() + } + + @JvmField + val CREATOR = object : Parcelable.Creator<TransferableSuspendedApp> { + override fun createFromParcel(parcel: Parcel): TransferableSuspendedApp { + return TransferableSuspendedApp(parcel) + } + + override fun newArray(size: Int): Array<TransferableSuspendedApp?> { + return arrayOfNulls(size) + } + } + } + + override fun writeToParcel(parcel: Parcel, flags: Int) { + parcel.writeInt(userId) + parcel.writeString(packageName) + TextUtils.writeToParcel(label, parcel, flags) + parcel.writeInt(uid) + parcel.writeParcelable(icon, 0) + } + + override fun describeContents(): Int { + return 0 + } + + fun essentiallyEqual(that: TransferableSuspendedApp): Boolean = that.userId == this.userId && + that.packageName == this.packageName +}
\ No newline at end of file |