diff --git a/lib/src/main/AndroidManifest.xml b/lib/src/main/AndroidManifest.xml index c186d0bf284be39acf21c7b1ac285096800e9281..991f46dfd32f349b27a605cf7bd23f8365d47ed8 100644 --- a/lib/src/main/AndroidManifest.xml +++ b/lib/src/main/AndroidManifest.xml @@ -8,6 +8,7 @@ <package android:name="com.huawei.systemmanager" /> <package android:name="com.huawei.powergenie" /> <package android:name="com.evenwell.PowerMonitor" /> + <package android:name="com.miui.securitycenter" /> </queries> </manifest> diff --git a/lib/src/main/java/org/briarproject/android/dontkillmelib/XiaomiUtils.kt b/lib/src/main/java/org/briarproject/android/dontkillmelib/XiaomiUtils.kt index 415b82203f7bdacaf5cb94bbead5803ac7c453b7..2b025930882f609cef68ba07c02d605ea85f2bef 100644 --- a/lib/src/main/java/org/briarproject/android/dontkillmelib/XiaomiUtils.kt +++ b/lib/src/main/java/org/briarproject/android/dontkillmelib/XiaomiUtils.kt @@ -1,41 +1,63 @@ package org.briarproject.android.dontkillmelib +import android.content.Context +import android.content.Intent +import android.content.pm.PackageManager.MATCH_DEFAULT_ONLY import android.os.Build.BRAND -import java.io.IOException -import java.util.Scanner +import android.os.Build.VERSION.INCREMENTAL +import android.util.Log public object XiaomiUtils { + private const val TAG = "XiaomiUtils" + + private const val PACKAGE_NAME = "com.miui.securitycenter" + private const val CLASS_NAME = "com.miui.securityscan.ui.settings.SettingsActivity" + @JvmStatic public val isXiaomiOrRedmiDevice: Boolean get() = "Xiaomi".equals(BRAND, ignoreCase = true) || - "Redmi".equals(BRAND, ignoreCase = true) + "Redmi".equals(BRAND, ignoreCase = true) @JvmStatic public val isMiuiTenOrLater: Boolean - get() { - var version = getSystemProperty("ro.miui.ui.version.name") - if (version == null || version == "") return false - version = version.replace("[^\\d]".toRegex(), "") - return try { - version.toInt() >= 10 + get() = isMiuiVersionAtLeast(10, 0) + + @JvmStatic + public fun isMiuiVersionAtLeast(major: Int, minor: Int): Boolean { + // E.g. "V12.5.3.0.QFGMIXM" + var version = INCREMENTAL + Log.i(TAG, "MIUI version $version") + version = version.replace("[^\\d.]".toRegex(), "") + val parts = version.split("\\.") + if (parts.size >= 2) { + try { + val maj = parts[0].toInt() + val min = parts[1].toInt() + Log.i(TAG, "Parsed version $maj.$min") + return maj > major || (maj == major && min >= minor) } catch (e: NumberFormatException) { - false + // Fall through } } + Log.w(TAG, "Could not parse MIUI version") + return false + } - private fun getSystemProperty(propName: String): String? { - return try { - val p = Runtime.getRuntime().exec("getprop $propName") - val s = Scanner(p.inputStream) - val line = s.nextLine() - s.close() - line - } catch (e: SecurityException) { - null - } catch (e: IOException) { - null - } + @JvmStatic + public val xiaomiRecentAppsNeedsToBeShown: Boolean + get() = isXiaomiOrRedmiDevice && !isMiuiVersionAtLeast(12, 5) + + @JvmStatic + public fun xiaomiLockAppsNeedsToBeShown(context: Context): Boolean { + if (!isXiaomiOrRedmiDevice || !isMiuiVersionAtLeast(12, 5)) return false + val pm = context.packageManager + val resolveInfos = pm.queryIntentActivities(xiaomiLockAppsIntent, MATCH_DEFAULT_ONLY) + return resolveInfos.isNotEmpty() } + @JvmStatic + public val xiaomiLockAppsIntent: Intent = Intent().apply { + setClassName(PACKAGE_NAME, CLASS_NAME) + } }