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 67bd767..3a45d92 100644 --- a/app/src/main/java/io/timelimit/android/logic/BackgroundTaskLogic.kt +++ b/app/src/main/java/io/timelimit/android/logic/BackgroundTaskLogic.kt @@ -37,6 +37,7 @@ import io.timelimit.android.integration.platform.android.AndroidIntegrationApps import io.timelimit.android.livedata.* import io.timelimit.android.sync.actions.UpdateDeviceStatusAction import io.timelimit.android.sync.actions.apply.ApplyActionUtil +import io.timelimit.android.util.AndroidVersion import io.timelimit.android.util.TimeTextUtil import io.timelimit.android.work.PeriodicSyncInBackgroundWorker import kotlinx.coroutines.delay @@ -595,6 +596,7 @@ class BackgroundTaskLogic(val appLogic: AppLogic) { val notificationAccess = appLogic.platformIntegration.getNotificationAccessPermissionStatus() val overlayPermission = appLogic.platformIntegration.getOverlayPermissionStatus() val accessibilityService = appLogic.platformIntegration.isAccessibilityServiceEnabled() + val qOrLater = AndroidVersion.qOrLater var changes = UpdateDeviceStatusAction.empty @@ -632,6 +634,10 @@ class BackgroundTaskLogic(val appLogic: AppLogic) { ) } + if (qOrLater && !deviceEntry.qOrLater) { + changes = changes.copy(isQOrLaterNow = true) + } + if (changes != UpdateDeviceStatusAction.empty) { ApplyActionUtil.applyAppLogicAction( action = changes, diff --git a/app/src/main/java/io/timelimit/android/sync/actions/Actions.kt b/app/src/main/java/io/timelimit/android/sync/actions/Actions.kt index 600348e..0a8cc6a 100644 --- a/app/src/main/java/io/timelimit/android/sync/actions/Actions.kt +++ b/app/src/main/java/io/timelimit/android/sync/actions/Actions.kt @@ -658,7 +658,8 @@ data class UpdateDeviceStatusAction( val newOverlayPermission: RuntimePermissionStatus?, val newAccessibilityServiceEnabled: Boolean?, val newAppVersion: Int?, - val didReboot: Boolean + val didReboot: Boolean, + val isQOrLaterNow: Boolean ): AppLogicAction() { companion object { const val TYPE_VALUE = "UPDATE_DEVICE_STATUS" @@ -669,6 +670,7 @@ data class UpdateDeviceStatusAction( private const val NEW_ACCESSIBILITY_SERVICE_ENABLED = "accessibilityServiceEnabled" private const val NEW_APP_VERSION = "appVersion" private const val DID_REBOOT = "didReboot" + private const val IS_Q_OR_LATER_NOW = "isQOrLaterNow" val empty = UpdateDeviceStatusAction( newProtectionLevel = null, @@ -677,7 +679,34 @@ data class UpdateDeviceStatusAction( newOverlayPermission = null, newAccessibilityServiceEnabled = null, newAppVersion = null, - didReboot = false + didReboot = false, + isQOrLaterNow = false + ) + + fun parse(value: JSONObject) = UpdateDeviceStatusAction( + newProtectionLevel = if (value.has(NEW_PROTECTION_LEVEL)) + ProtectionLevelUtil.parse(value.getString(NEW_PROTECTION_LEVEL)) + else + null, + newUsageStatsPermissionStatus = if (value.has(NEW_USAGE_STATS_PERMISSION_STATUS)) + RuntimePermissionStatusUtil.parse(value.getString(NEW_USAGE_STATS_PERMISSION_STATUS)) + else + null, + newNotificationAccessPermission = if (value.has(NEW_NOTIFICATION_ACCESS_PERMISSION)) + NewPermissionStatusUtil.parse(value.getString(NEW_NOTIFICATION_ACCESS_PERMISSION)) + else + null, + newOverlayPermission = if (value.has(NEW_OVERLAY_PERMISSION)) + RuntimePermissionStatusUtil.parse(value.getString(NEW_OVERLAY_PERMISSION)) + else + null, + newAccessibilityServiceEnabled = if (value.has(NEW_ACCESSIBILITY_SERVICE_ENABLED)) + value.getBoolean(NEW_ACCESSIBILITY_SERVICE_ENABLED) + else + null, + newAppVersion = if (value.has(NEW_APP_VERSION)) value.getInt(NEW_APP_VERSION) else null, + didReboot = if (value.has(DID_REBOOT)) value.getBoolean(DID_REBOOT) else false, + isQOrLaterNow = if (value.has(IS_Q_OR_LATER_NOW)) value.getBoolean(IS_Q_OR_LATER_NOW) else false ) } @@ -730,6 +759,10 @@ data class UpdateDeviceStatusAction( writer.name(DID_REBOOT).value(true) } + if (isQOrLaterNow) { + writer.name(IS_Q_OR_LATER_NOW).value(true) + } + writer.endObject() } } diff --git a/app/src/main/java/io/timelimit/android/sync/actions/Parser.kt b/app/src/main/java/io/timelimit/android/sync/actions/Parser.kt index 242696f..0566dbf 100644 --- a/app/src/main/java/io/timelimit/android/sync/actions/Parser.kt +++ b/app/src/main/java/io/timelimit/android/sync/actions/Parser.kt @@ -25,6 +25,7 @@ object ActionParser { TriedDisablingDeviceAdminAction.TYPE_VALUE -> TriedDisablingDeviceAdminAction SignOutAtDeviceAction.TYPE_VALUE -> SignOutAtDeviceAction UpdateAppActivitiesAction.TYPE_VALUE -> UpdateAppActivitiesAction.parse(action) + UpdateDeviceStatusAction.TYPE_VALUE -> UpdateDeviceStatusAction.parse(action) else -> throw IllegalStateException() } diff --git a/app/src/main/java/io/timelimit/android/sync/actions/dispatch/AppLogicAction.kt b/app/src/main/java/io/timelimit/android/sync/actions/dispatch/AppLogicAction.kt index 5417ca2..e13820c 100644 --- a/app/src/main/java/io/timelimit/android/sync/actions/dispatch/AppLogicAction.kt +++ b/app/src/main/java/io/timelimit/android/sync/actions/dispatch/AppLogicAction.kt @@ -206,6 +206,10 @@ object LocalDatabaseAppLogicActionDispatcher { ) } + if (action.isQOrLaterNow && !device.qOrLater) { + device = device.copy(qOrLater = true) + } + database.device().updateDeviceEntry(device) if (device.hasActiveManipulationWarning) {