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