aboutsummaryrefslogtreecommitdiff
path: root/app/src/main/java/moe/yuuta/workmode/suspend/data/TransferableSuspendedApp.kt
diff options
context:
space:
mode:
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.kt101
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