From 048b46805495cfda944fe97105dded6fc222c406 Mon Sep 17 00:00:00 2001 From: Torsten Grote <t@grobox.de> Date: Tue, 22 Feb 2022 09:38:58 -0300 Subject: [PATCH] Split PowerUtils into logical pieces --- .../android/dontkillmelib/DozeHelperImpl.kt | 8 +- .../android/dontkillmelib/DozeUtils.kt | 30 +++++ .../android/dontkillmelib/HuaweiUtils.kt | 52 +++++++++ .../android/dontkillmelib/PowerUtils.kt | 107 ------------------ .../android/dontkillmelib/XiaomiUtils.kt | 41 +++++++ 5 files changed, 127 insertions(+), 111 deletions(-) create mode 100644 lib/src/main/java/org/briarproject/android/dontkillmelib/DozeUtils.kt create mode 100644 lib/src/main/java/org/briarproject/android/dontkillmelib/HuaweiUtils.kt delete mode 100644 lib/src/main/java/org/briarproject/android/dontkillmelib/PowerUtils.kt create mode 100644 lib/src/main/java/org/briarproject/android/dontkillmelib/XiaomiUtils.kt diff --git a/lib/src/main/java/org/briarproject/android/dontkillmelib/DozeHelperImpl.kt b/lib/src/main/java/org/briarproject/android/dontkillmelib/DozeHelperImpl.kt index 100c25d..690eb7e 100644 --- a/lib/src/main/java/org/briarproject/android/dontkillmelib/DozeHelperImpl.kt +++ b/lib/src/main/java/org/briarproject/android/dontkillmelib/DozeHelperImpl.kt @@ -5,9 +5,9 @@ import android.content.Context public class DozeHelperImpl : DozeHelper { override fun needToShowDoNotKillMeFragment(context: Context): Boolean { val appContext = context.applicationContext - return PowerUtils.needsDozeWhitelisting(appContext) || - PowerUtils.huaweiProtectedAppsNeedsToBeShown(appContext) || - PowerUtils.huaweiAppLaunchNeedsToBeShown(appContext) || - PowerUtils.isXiaomiOrRedmiDevice + return DozeUtils.needsDozeWhitelisting(appContext) || + HuaweiUtils.protectedAppsNeedsToBeShown(appContext) || + HuaweiUtils.appLaunchNeedsToBeShown(appContext) || + XiaomiUtils.isXiaomiOrRedmiDevice } } diff --git a/lib/src/main/java/org/briarproject/android/dontkillmelib/DozeUtils.kt b/lib/src/main/java/org/briarproject/android/dontkillmelib/DozeUtils.kt new file mode 100644 index 0000000..d961e97 --- /dev/null +++ b/lib/src/main/java/org/briarproject/android/dontkillmelib/DozeUtils.kt @@ -0,0 +1,30 @@ +package org.briarproject.android.dontkillmelib + +import android.annotation.SuppressLint +import android.annotation.TargetApi +import android.content.Context +import android.content.Context.POWER_SERVICE +import android.content.Intent +import android.net.Uri +import android.os.Build.VERSION.SDK_INT +import android.os.PowerManager +import android.provider.Settings.ACTION_REQUEST_IGNORE_BATTERY_OPTIMIZATIONS + +public object DozeUtils { + + @JvmStatic + public fun needsDozeWhitelisting(ctx: Context): Boolean { + if (SDK_INT < 23) return false + val pm = ctx.getSystemService(POWER_SERVICE) as PowerManager + return !pm.isIgnoringBatteryOptimizations(ctx.packageName) + } + + @JvmStatic + @TargetApi(23) + @SuppressLint("BatteryLife") + public fun getDozeWhitelistingIntent(ctx: Context): Intent = Intent().apply { + action = ACTION_REQUEST_IGNORE_BATTERY_OPTIMIZATIONS + data = Uri.parse("package:" + ctx.packageName) + } + +} diff --git a/lib/src/main/java/org/briarproject/android/dontkillmelib/HuaweiUtils.kt b/lib/src/main/java/org/briarproject/android/dontkillmelib/HuaweiUtils.kt new file mode 100644 index 0000000..0bca226 --- /dev/null +++ b/lib/src/main/java/org/briarproject/android/dontkillmelib/HuaweiUtils.kt @@ -0,0 +1,52 @@ +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.VERSION.SDK_INT + +public object HuaweiUtils { + + private const val PACKAGE_NAME_HUAWEI = "com.huawei.systemmanager" + private const val CLASS_NAME_POWER_MANAGER = + "${PACKAGE_NAME_HUAWEI}.power.ui.HwPowerManagerActivity" + private const val CLASS_NAME_PROTECTED_APPS = + "${PACKAGE_NAME_HUAWEI}.optimize.process.ProtectActivity" + + /** + * Determine whether a Huawei "Protected apps" feature is available on the + * device. + */ + @JvmStatic + public fun appLaunchNeedsToBeShown(context: Context): Boolean { + // "App launch" was introduced in EMUI 8 (Android 8.0) + if (SDK_INT < 26) return false + val pm = context.packageManager + val resolveInfos = pm.queryIntentActivities(huaweiProtectedAppsIntent, MATCH_DEFAULT_ONLY) + return resolveInfos.isNotEmpty() + } + + /** + * Determine whether a Huawei "Protected apps" feature is available on the + * device. + */ + @JvmStatic + public fun protectedAppsNeedsToBeShown(context: Context): Boolean { + // "Protected apps" no longer exists on Huawei EMUI 5.0 (Android 7.0) + if (SDK_INT >= 24) return false + val pm = context.packageManager + val resolveInfos = pm.queryIntentActivities(huaweiPowerManagerIntent, MATCH_DEFAULT_ONLY) + return resolveInfos.isNotEmpty() + } + + @JvmStatic + public val huaweiPowerManagerIntent: Intent = Intent().apply { + setClassName(PACKAGE_NAME_HUAWEI, CLASS_NAME_POWER_MANAGER) + } + + @JvmStatic + public val huaweiProtectedAppsIntent: Intent = Intent().apply { + setClassName(PACKAGE_NAME_HUAWEI, CLASS_NAME_PROTECTED_APPS) + } + +} diff --git a/lib/src/main/java/org/briarproject/android/dontkillmelib/PowerUtils.kt b/lib/src/main/java/org/briarproject/android/dontkillmelib/PowerUtils.kt deleted file mode 100644 index d97c633..0000000 --- a/lib/src/main/java/org/briarproject/android/dontkillmelib/PowerUtils.kt +++ /dev/null @@ -1,107 +0,0 @@ -package org.briarproject.android.dontkillmelib - -import android.annotation.SuppressLint -import android.annotation.TargetApi -import android.content.Context -import android.content.Context.POWER_SERVICE -import android.content.Intent -import android.content.pm.PackageManager.MATCH_DEFAULT_ONLY -import android.net.Uri -import android.os.Build -import android.os.Build.VERSION.SDK_INT -import android.os.PowerManager -import android.provider.Settings.ACTION_REQUEST_IGNORE_BATTERY_OPTIMIZATIONS -import java.io.IOException -import java.util.Scanner - -public object PowerUtils { - - private const val PACKAGE_NAME_HUAWEI = "com.huawei.systemmanager" - private const val CLASS_NAME_POWER_MANAGER = - "$PACKAGE_NAME_HUAWEI.power.ui.HwPowerManagerActivity" - private const val CLASS_NAME_PROTECTED_APPS = - "$PACKAGE_NAME_HUAWEI.optimize.process.ProtectActivity" - - @JvmStatic - public fun needsDozeWhitelisting(ctx: Context): Boolean { - if (SDK_INT < 23) return false - val pm = ctx.getSystemService(POWER_SERVICE) as PowerManager - return !pm.isIgnoringBatteryOptimizations(ctx.packageName) - } - - @JvmStatic - @TargetApi(23) - @SuppressLint("BatteryLife") - public fun getDozeWhitelistingIntent(ctx: Context): Intent = Intent().apply { - action = ACTION_REQUEST_IGNORE_BATTERY_OPTIMIZATIONS - data = Uri.parse("package:" + ctx.packageName) - } - - /** - * Determine whether a Huawei "Protected apps" feature is available on the - * device. - */ - @JvmStatic - public fun huaweiAppLaunchNeedsToBeShown(context: Context): Boolean { - // "App launch" was introduced in EMUI 8 (Android 8.0) - if (SDK_INT < 26) return false - val pm = context.packageManager - val resolveInfos = pm.queryIntentActivities(huaweiProtectedAppsIntent, MATCH_DEFAULT_ONLY) - return resolveInfos.isNotEmpty() - } - - /** - * Determine whether a Huawei "Protected apps" feature is available on the - * device. - */ - @JvmStatic - public fun huaweiProtectedAppsNeedsToBeShown(context: Context): Boolean { - // "Protected apps" no longer exists on Huawei EMUI 5.0 (Android 7.0) - if (SDK_INT >= 24) return false - val pm = context.packageManager - val resolveInfos = pm.queryIntentActivities(huaweiPowerManagerIntent, MATCH_DEFAULT_ONLY) - return resolveInfos.isNotEmpty() - } - - @JvmStatic - public val huaweiPowerManagerIntent: Intent = Intent().apply { - setClassName(PACKAGE_NAME_HUAWEI, CLASS_NAME_POWER_MANAGER) - } - - @JvmStatic - public val huaweiProtectedAppsIntent: Intent = Intent().apply { - setClassName(PACKAGE_NAME_HUAWEI, CLASS_NAME_PROTECTED_APPS) - } - - @JvmStatic - public val isXiaomiOrRedmiDevice: Boolean - get() = "Xiaomi".equals(Build.BRAND, ignoreCase = true) || - "Redmi".equals(Build.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 - } catch (e: NumberFormatException) { - 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 - } - } -} diff --git a/lib/src/main/java/org/briarproject/android/dontkillmelib/XiaomiUtils.kt b/lib/src/main/java/org/briarproject/android/dontkillmelib/XiaomiUtils.kt new file mode 100644 index 0000000..415b822 --- /dev/null +++ b/lib/src/main/java/org/briarproject/android/dontkillmelib/XiaomiUtils.kt @@ -0,0 +1,41 @@ +package org.briarproject.android.dontkillmelib + +import android.os.Build.BRAND +import java.io.IOException +import java.util.Scanner + +public object XiaomiUtils { + + @JvmStatic + public val isXiaomiOrRedmiDevice: Boolean + get() = "Xiaomi".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 + } catch (e: NumberFormatException) { + 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 + } + } + +} -- GitLab