From fe3a8f7153adc4d9214479c5843c4bf9867fa24e Mon Sep 17 00:00:00 2001 From: Jonas L Date: Mon, 22 Apr 2019 00:00:00 +0000 Subject: [PATCH] Allow switching to the default user from the notification area --- .../platform/PlatformIntegration.kt | 7 +++- .../platform/android/BackgroundService.kt | 40 +++++++++++++++++++ .../platform/android/Notification.kt | 1 + .../android/logic/BackgroundTaskLogic.kt | 3 +- 4 files changed, 49 insertions(+), 2 deletions(-) diff --git a/app/src/main/java/io/timelimit/android/integration/platform/PlatformIntegration.kt b/app/src/main/java/io/timelimit/android/integration/platform/PlatformIntegration.kt index 581caa6..2e63d0d 100644 --- a/app/src/main/java/io/timelimit/android/integration/platform/PlatformIntegration.kt +++ b/app/src/main/java/io/timelimit/android/integration/platform/PlatformIntegration.kt @@ -183,4 +183,9 @@ class NewPermissionStatusConverter { } @Parcelize -data class AppStatusMessage(val title: String, val text: String, val subtext: String? = null): Parcelable +data class AppStatusMessage( + val title: String, + val text: String, + val subtext: String? = null, + val showSwitchToDefaultUserOption: Boolean = false +): Parcelable diff --git a/app/src/main/java/io/timelimit/android/integration/platform/android/BackgroundService.kt b/app/src/main/java/io/timelimit/android/integration/platform/android/BackgroundService.kt index 4b45ef4..69aa706 100644 --- a/app/src/main/java/io/timelimit/android/integration/platform/android/BackgroundService.kt +++ b/app/src/main/java/io/timelimit/android/integration/platform/android/BackgroundService.kt @@ -21,12 +21,16 @@ import android.app.Service import android.content.Context import android.content.Intent import android.os.IBinder +import android.widget.Toast import androidx.core.app.NotificationCompat import androidx.core.content.ContextCompat import io.timelimit.android.R import io.timelimit.android.coroutines.runAsync import io.timelimit.android.integration.platform.AppStatusMessage +import io.timelimit.android.livedata.waitForNonNullValue import io.timelimit.android.logic.DefaultAppLogic +import io.timelimit.android.sync.actions.SignOutAtDeviceAction +import io.timelimit.android.sync.actions.apply.ApplyActionUtil import io.timelimit.android.ui.MainActivity class BackgroundService: Service() { @@ -34,6 +38,7 @@ class BackgroundService: Service() { private const val ACTION = "a" private const val ACTION_SET_NOTIFICATION = "a" private const val ACTION_REVOKE_TEMPORARILY_ALLOWED_APPS = "b" + private const val ACTION_SWITCH_TO_DEFAULT_USER = "c" private const val EXTRA_NOTIFICATION = "b" fun setStatusMessage(status: AppStatusMessage?, context: Context) { @@ -53,6 +58,9 @@ class BackgroundService: Service() { fun prepareRevokeTemporarilyAllowed(context: Context) = Intent(context, BackgroundService::class.java) .putExtra(ACTION, ACTION_REVOKE_TEMPORARILY_ALLOWED_APPS) + + fun prepareSwitchToDefaultUser(context: Context) = Intent(context, BackgroundService::class.java) + .putExtra(ACTION, ACTION_SWITCH_TO_DEFAULT_USER) } private val notificationManager: NotificationManager by lazy { @@ -99,6 +107,24 @@ class BackgroundService: Service() { .setAutoCancel(false) .setOngoing(true) .setPriority(NotificationCompat.PRIORITY_LOW) + .let { builder -> + if (appStatusMessage.showSwitchToDefaultUserOption) { + builder.addAction( + NotificationCompat.Action.Builder( + R.drawable.ic_account_circle_black_24dp, + getString(R.string.manage_device_default_user_switch_btn), + PendingIntent.getService( + this@BackgroundService, + PendingIntentIds.SWITCH_TO_DEFAULT_USER, + prepareSwitchToDefaultUser(this@BackgroundService), + PendingIntent.FLAG_UPDATE_CURRENT + ) + ).build() + ) + } + + builder + } .build() if (didPostNotification) { @@ -111,6 +137,20 @@ class BackgroundService: Service() { runAsync { DefaultAppLogic.with(this@BackgroundService).backgroundTaskLogic.resetTemporarilyAllowedApps() } + } else if (action == ACTION_SWITCH_TO_DEFAULT_USER) { + runAsync { + val logic = DefaultAppLogic.with(this@BackgroundService) + + if (logic.fullVersion.shouldProvideFullVersionFunctions.waitForNonNullValue()) { + ApplyActionUtil.applyAppLogicAction( + appLogic = logic, + action = SignOutAtDeviceAction, + ignoreIfDeviceIsNotConfigured = true + ) + } else { + Toast.makeText(this@BackgroundService, R.string.purchase_required_dialog_title, Toast.LENGTH_LONG).show() + } + } } } diff --git a/app/src/main/java/io/timelimit/android/integration/platform/android/Notification.kt b/app/src/main/java/io/timelimit/android/integration/platform/android/Notification.kt index 7113558..b89e6c0 100644 --- a/app/src/main/java/io/timelimit/android/integration/platform/android/Notification.kt +++ b/app/src/main/java/io/timelimit/android/integration/platform/android/Notification.kt @@ -68,4 +68,5 @@ object NotificationChannels { object PendingIntentIds { const val OPEN_MAIN_APP = 1 const val REVOKE_TEMPORARILY_ALLOWED = 2 + const val SWITCH_TO_DEFAULT_USER = 3 } 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 4734d86..721908f 100644 --- a/app/src/main/java/io/timelimit/android/logic/BackgroundTaskLogic.kt +++ b/app/src/main/java/io/timelimit/android/logic/BackgroundTaskLogic.kt @@ -187,7 +187,8 @@ class BackgroundTaskLogic(val appLogic: AppLogic) { appLogic.platformIntegration.setAppStatusMessage( AppStatusMessage( title = appLogic.context.getString(R.string.background_logic_timeout_title), - text = appLogic.context.getString(R.string.background_logic_timeout_text) + text = appLogic.context.getString(R.string.background_logic_timeout_text), + showSwitchToDefaultUserOption = true ) ) appLogic.platformIntegration.setShowBlockingOverlay(false)