diff --git a/app/src/main/java/io/timelimit/android/integration/platform/android/Apps.kt b/app/src/main/java/io/timelimit/android/integration/platform/android/Apps.kt index 664cbb5..8402764 100644 --- a/app/src/main/java/io/timelimit/android/integration/platform/android/Apps.kt +++ b/app/src/main/java/io/timelimit/android/integration/platform/android/Apps.kt @@ -37,14 +37,19 @@ object AndroidIntegrationApps { .addCategory(Intent.CATEGORY_DEFAULT) .addCategory(Intent.CATEGORY_HOME) - val ignoredApps = HashSet() + enum class IgnoredAppHandling { + Ignore, + IgnoreOnStoreOtherwiseWhitelistAndDontDisable + } + + val ignoredApps = mutableMapOf() init { - ignoredApps.add("com.android.systemui") - ignoredApps.add("android") - ignoredApps.add("com.android.packageinstaller") - ignoredApps.add("com.google.android.packageinstaller") - ignoredApps.add("com.android.bluetooth") - ignoredApps.add("com.android.nfc") + ignoredApps["com.android.systemui"] = AndroidIntegrationApps.IgnoredAppHandling.Ignore + ignoredApps["android"] = AndroidIntegrationApps.IgnoredAppHandling.Ignore + ignoredApps["com.android.bluetooth"] = AndroidIntegrationApps.IgnoredAppHandling.Ignore + ignoredApps["com.android.nfc"] = AndroidIntegrationApps.IgnoredAppHandling.Ignore + ignoredApps["com.android.packageinstaller"] = AndroidIntegrationApps.IgnoredAppHandling.IgnoreOnStoreOtherwiseWhitelistAndDontDisable + ignoredApps["com.google.android.packageinstaller"] = AndroidIntegrationApps.IgnoredAppHandling.IgnoreOnStoreOtherwiseWhitelistAndDontDisable } fun getLocalApps(deviceId: String, context: Context): Collection { @@ -82,16 +87,30 @@ object AndroidIntegrationApps { for (applicationInfo in installedPackages) { val packageName = applicationInfo.packageName + val ignoreConfig = ignoredApps[packageName] - if (!result.containsKey(packageName) && !ignoredApps.contains(packageName)) { - result[packageName] = App( - deviceId = deviceId, - packageName = packageName, - title = applicationInfo.loadLabel(packageManager).toString(), - isLaunchable = false, - recommendation = AppRecommendation.None - ) + if (result.containsKey(packageName)) { + continue } + + if (when (ignoreConfig) { + null -> false + AndroidIntegrationApps.IgnoredAppHandling.Ignore -> true + AndroidIntegrationApps.IgnoredAppHandling.IgnoreOnStoreOtherwiseWhitelistAndDontDisable -> BuildConfig.storeCompilant + }) { + continue + } + + result[packageName] = App( + deviceId = deviceId, + packageName = packageName, + title = applicationInfo.loadLabel(packageManager).toString(), + isLaunchable = false, + recommendation = if (ignoreConfig == AndroidIntegrationApps.IgnoredAppHandling.IgnoreOnStoreOtherwiseWhitelistAndDontDisable) + AppRecommendation.Whitelist + else + AppRecommendation.None + ) } return result.values @@ -117,7 +136,9 @@ object AndroidIntegrationApps { for (info in resolveInfoList) { val packageName = info.activityInfo.applicationInfo.packageName - if (ignoredApps.contains(packageName)) { + val ignoreConfig = ignoredApps[packageName] + + if (ignoreConfig != null && BuildConfig.storeCompilant) { continue } @@ -127,7 +148,10 @@ object AndroidIntegrationApps { packageName = packageName, title = info.activityInfo.applicationInfo.loadLabel(packageManager).toString(), isLaunchable = true, - recommendation = recommendation + recommendation = if (ignoreConfig == AndroidIntegrationApps.IgnoredAppHandling.IgnoreOnStoreOtherwiseWhitelistAndDontDisable) + AppRecommendation.Whitelist + else + recommendation ) } } @@ -140,7 +164,9 @@ object AndroidIntegrationApps { return } - if (ignoredApps.contains(packageName)) { + val ignoreConfig = ignoredApps[packageName] + + if (ignoreConfig != null && BuildConfig.storeCompilant) { return } @@ -156,7 +182,10 @@ object AndroidIntegrationApps { packageName = packageName, title = packageInfo.loadLabel(packageManager).toString(), isLaunchable = true, - recommendation = recommendation + recommendation = if (ignoreConfig == AndroidIntegrationApps.IgnoredAppHandling.IgnoreOnStoreOtherwiseWhitelistAndDontDisable) + AppRecommendation.Whitelist + else + recommendation ) } catch (ex: PackageManager.NameNotFoundException) { // ignore diff --git a/app/src/main/java/io/timelimit/android/logic/BackgroundTaskLogic.kt b/app/src/main/java/io/timelimit/android/logic/BackgroundTaskLogic.kt index 6afaf1c..4734d86 100644 --- a/app/src/main/java/io/timelimit/android/logic/BackgroundTaskLogic.kt +++ b/app/src/main/java/io/timelimit/android/logic/BackgroundTaskLogic.kt @@ -270,7 +270,13 @@ class BackgroundTaskLogic(val appLogic: AppLogic) { if ( (foregroundAppPackageName == BuildConfig.APPLICATION_ID) || - (foregroundAppPackageName != null && AndroidIntegrationApps.ignoredApps.contains(foregroundAppPackageName)) + (foregroundAppPackageName != null && AndroidIntegrationApps.ignoredApps[foregroundAppPackageName].let { + when (it) { + null -> false + AndroidIntegrationApps.IgnoredAppHandling.Ignore -> true + AndroidIntegrationApps.IgnoredAppHandling.IgnoreOnStoreOtherwiseWhitelistAndDontDisable -> BuildConfig.storeCompilant + } + }) ) { usedTimeUpdateHelper?.commit(appLogic) showStatusMessageWithCurrentAppTitle( @@ -303,7 +309,11 @@ class BackgroundTaskLogic(val appLogic: AppLogic) { if (category == null) { usedTimeUpdateHelper?.commit(appLogic) - appLogic.platformIntegration.setSuspendedApps(listOf(foregroundAppPackageName), true) + if (AndroidIntegrationApps.ignoredApps[foregroundAppPackageName] == null) { + // don't suspend system apps which are whitelisted in any version + appLogic.platformIntegration.setSuspendedApps(listOf(foregroundAppPackageName), true) + } + openLockscreen(foregroundAppPackageName, foregroundAppActivityName) } else if (category.temporarilyBlocked or (parentCategory?.temporarilyBlocked == true)) { usedTimeUpdateHelper?.commit(appLogic) diff --git a/app/src/main/java/io/timelimit/android/logic/BlockingReason.kt b/app/src/main/java/io/timelimit/android/logic/BlockingReason.kt index 34c7f17..9fb1bf3 100644 --- a/app/src/main/java/io/timelimit/android/logic/BlockingReason.kt +++ b/app/src/main/java/io/timelimit/android/logic/BlockingReason.kt @@ -105,7 +105,13 @@ class BlockingReasonUtil(private val appLogic: AppLogic) { // check internal whitelist if (packageName == BuildConfig.APPLICATION_ID) { return liveDataFromValue(NoBlockingReason.getInstance(areNotificationsBlocked = false)) - } else if (AndroidIntegrationApps.ignoredApps.contains(packageName)) { + } else if (AndroidIntegrationApps.ignoredApps[packageName].let { + when (it) { + null -> false + AndroidIntegrationApps.IgnoredAppHandling.Ignore -> true + AndroidIntegrationApps.IgnoredAppHandling.IgnoreOnStoreOtherwiseWhitelistAndDontDisable -> BuildConfig.storeCompilant + } + }) { return liveDataFromValue(NoBlockingReason.getInstance(areNotificationsBlocked = false)) } else { return getBlockingReasonStep3(packageName, activityName, child, timeZone)