diff options
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.kt | 102 |
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 |