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 }
}
}
}
|