aboutsummaryrefslogtreecommitdiff
path: root/app/src/main/java/moe/yuuta/workmode/access/AccessLayerUtil.kt
diff options
context:
space:
mode:
Diffstat (limited to 'app/src/main/java/moe/yuuta/workmode/access/AccessLayerUtil.kt')
-rw-r--r--app/src/main/java/moe/yuuta/workmode/access/AccessLayerUtil.kt102
1 files changed, 102 insertions, 0 deletions
diff --git a/app/src/main/java/moe/yuuta/workmode/access/AccessLayerUtil.kt b/app/src/main/java/moe/yuuta/workmode/access/AccessLayerUtil.kt
new file mode 100644
index 0000000..4bfee58
--- /dev/null
+++ b/app/src/main/java/moe/yuuta/workmode/access/AccessLayerUtil.kt
@@ -0,0 +1,102 @@
+package moe.yuuta.workmode.access
+
+import android.content.pm.ApplicationInfo
+import android.os.BaseBundle
+import android.os.Bundle
+import android.os.PersistableBundle
+import android.os.UserManager
+import com.elvishew.xlog.XLog
+import moe.yuuta.workmode.R
+import moe.yuuta.workmode.suspend.data.TransferableSuspendedApp
+import moe.yuuta.workmode.utils.BundleUtils
+import java.util.stream.Collectors
+
+/**
+ * Provides some quick accesses of AccessLayer
+ */
+internal class AccessLayerUtil(private val accessLayer: AccessLayer) {
+ private val logger = XLog.tag("ALUtil").build()
+
+ fun collectUserIDs(packages: List<TransferableSuspendedApp>): Map<Int /* user id */, List<TransferableSuspendedApp>> {
+ // Collect them with specified user ids
+ val packagesWithUserIds = mutableMapOf<Int /* user id */, List<TransferableSuspendedApp>>()
+ packages.stream()
+ .forEach {
+ val list = packagesWithUserIds[it.userId]?.toMutableList() ?: mutableListOf()
+ list.add(it)
+ packagesWithUserIds[it.userId] = list
+ }
+ return packagesWithUserIds
+ }
+
+ fun suspend(packages: List<TransferableSuspendedApp>,
+ suspended: Boolean,
+ appExtras: BaseBundle,
+ launcherExtras: BaseBundle,
+ dialogMessage: String): Array<String> {
+ val packagesWithUserIds = collectUserIDs(packages)
+
+ val result = mutableListOf<String>()
+ for (userId in packagesWithUserIds.keys) {
+ result.addAll(accessLayer.setPackagesSuspended(
+ packagesWithUserIds[userId]!!.stream()
+ .map { return@map it.packageName }
+ .collect(Collectors.toList()).toTypedArray(),
+ suspended,
+ when (appExtras) {
+ is PersistableBundle -> appExtras
+ is Bundle -> BundleUtils.toPersistableBundle(appExtras)
+ else -> PersistableBundle()
+ },
+ when (launcherExtras) {
+ is PersistableBundle -> launcherExtras
+ is Bundle -> BundleUtils.toPersistableBundle(launcherExtras)
+ else -> PersistableBundle()
+ }, dialogMessage, userId))
+ }
+ return result.toTypedArray()
+ }
+
+ fun suspend(packages: List<TransferableSuspendedApp>, suspended: Boolean): Array<String> =
+ suspend(packages,
+ suspended,
+ Bundle(),
+ PersistableBundle(), // Removed because there is an unknown bug which prevents from writing launcher extras from the owner (?)
+ accessLayer.mContext.getString(R.string.suspended_message))
+
+ fun getSuspendedPackageAppExtras(packageInfo: TransferableSuspendedApp): PersistableBundle? =
+ accessLayer.getSuspendedPackageAppExtras(packageName = packageInfo.packageName,
+ userId = packageInfo.userId)
+
+ fun isPackageSuspended(packageInfo: TransferableSuspendedApp): Boolean =
+ accessLayer.isPackageSuspended(packageName = packageInfo.packageName,
+ userId = packageInfo.userId)
+
+ fun getSuspendedPackageLauncherExtras(packageInfo: TransferableSuspendedApp): Bundle? =
+ accessLayer.getSuspendedPackageLauncherExtras(packageName = packageInfo.packageName,
+ userId = packageInfo.userId)
+
+ fun getInstalledApplicationsAsUser(flags: Int, userId: Int): List<ApplicationInfo> =
+ accessLayer.getInstalledApplicationsAsUser(flags, userId)
+
+ fun getInstalledApplicationsAnyUser(flags: Int): List<ApplicationInfo> {
+ val userManager = accessLayer.mContext.getSystemService(UserManager::class.java)
+ val finalResult = mutableListOf<ApplicationInfo>()
+ val ids = userManager.getUsers(false)
+ .stream()
+ .map {
+ return@map it.id
+ }
+ .collect(Collectors.toList())
+ .toTypedArray()
+
+ for (userHandle in ids) {
+ finalResult.addAll(getInstalledApplicationsAsUser(flags,
+ userHandle.hashCode()))
+ }
+ // val result = accessLayer.getInstalledApplicationsAsUser(flags or
+ // PackageManager::class.java.getDeclaredField("MATCH_ANY_USER").getInt(null),
+ // 0 /* System */)
+ return finalResult
+ }
+} \ No newline at end of file