aboutsummaryrefslogtreecommitdiff
path: root/app/src/main/java/moe/yuuta/workmode/utils/Utils.kt
blob: 2ac68e9caa68c4f2e2792894478c76f9c3acc5e4 (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
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
package moe.yuuta.workmode.utils

import android.content.Context
import android.content.Intent
import android.content.pm.ApplicationInfo
import android.os.Bundle
import android.os.Process
import android.view.ViewGroup
import android.widget.LinearLayout
import androidx.core.view.children
import com.google.android.material.tabs.TabLayout
import moe.yuuta.workmode.BuildConfig
import java.util.function.Predicate
import java.util.stream.Collectors


object Utils {
    private val PROTECTED_UIDS = arrayOf(Process.SYSTEM_UID,
            Process.myUid(),
            Process.PHONE_UID,
            0,
            2000,
            1007,
            1010,
            1013,
            1019,
            1016,
            1017,
            1027,
            1002,
            1023,
            1032,
            1037,
            1041,
            1047,
            1053,
            1061,
            1067,
            1068,
            9999)

    private val PROTECTED_PACKAGES = arrayOf(
            "android",
            BuildConfig.APPLICATION_ID
    )

    private val PROTECTED_PACKAGES_WIDE_MATCH = arrayOf(
            "com.android."
    )

    private val WHITELIST_PKGS = arrayOf(
            "com.android.chrome"
    )

    fun buildGeneralApplicationInfoFilter(context: Context): Predicate<ApplicationInfo> {
        val i = Intent(Intent.ACTION_MAIN)
        i.addCategory(Intent.CATEGORY_HOME)
        val launchers = context.packageManager.queryIntentActivities(i, 0)
                .stream()
                .map {
                    return@map it.resolvePackageName
                }
                .collect(Collectors.toList())
        return object : Predicate<ApplicationInfo> {
            override fun test(it: ApplicationInfo): Boolean {
                for (pkg in WHITELIST_PKGS)
                    if (pkg == it.packageName) {
                        return true
                    }
                for (pkg in PROTECTED_PACKAGES)
                    if (pkg == it.packageName) {
                        return false
                    }
                for (pkg in PROTECTED_PACKAGES_WIDE_MATCH)
                    if (it.packageName.startsWith(pkg)) {
                        return false
                    }
                for (uid in PROTECTED_UIDS)
                    if (uid == it.uid) {
                        return false
                    }
                if (launchers.contains(it.packageName)) {
                    return false
                }
                if (it.uid < Process.FIRST_APPLICATION_UID || it.uid > Process.LAST_APPLICATION_UID) {
                    return false
                }
                return context.packageManager.getLaunchIntentForPackage(it.packageName) != null
            }
        }
    }

    fun dumpExtras(bundle: Bundle?): String {
        val builder = StringBuilder()
        if (bundle != null) {
            for (key in bundle.keySet()) {
                val value = bundle.get(key)
                builder.append("value: ")
                builder.append(value?.toString())
                builder.append(" key: ")
                builder.append(key)
                builder.append(" type: ")
                builder.append(value.javaClass.name)
            }
        }
        return builder.toString()
    }

    fun setViewTreeEnable(viewGroup: ViewGroup, isEnabled: Boolean) {
        for (child in viewGroup.children) {
            if (child is ViewGroup)
                setViewTreeEnable(child, isEnabled)
            else
                child.isEnabled = isEnabled
        }
    }

    /**
     * Thanks to https://stackoverflow.com/questions/31702725/disable-tablayout
     */
    fun makeTabLayoutDisable(tabLayout: TabLayout, enable: Boolean) {
        val tabStrip = tabLayout.getChildAt(0) as LinearLayout
        for (i in 0 until tabStrip.childCount) {
            tabStrip.getChildAt(i).setOnTouchListener { v, event -> !enable }
        }
    }
}