1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
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
}
}
|