aboutsummaryrefslogtreecommitdiff
path: root/app/src/main/java/moe/yuuta/workmode/access/AccessLayerUtil.kt
blob: 4bfee586731129fe8963ba80d3fb468a32bea33d (plain)
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
    }
}