From 94b135ae956781fef1d74aed04220e8c90c8be00 Mon Sep 17 00:00:00 2001
From: Dominic Fischer <dominicfischer7@gmail.com>
Date: Fri, 13 Nov 2020 18:13:13 +0000
Subject: [PATCH 1/3] Convert PushRuleService to suspend functions

Signed-off-by: Dominic Fischer <dominicfischer7@gmail.com>
---
 .../sdk/api/pushrules/PushRuleService.kt      | 10 ++---
 .../notification/DefaultPushRuleService.kt    | 34 ++++----------
 ...sAdvancedNotificationPreferenceFragment.kt | 45 +++++++++----------
 ...rSettingsNotificationPreferenceFragment.kt | 34 +++++++-------
 .../troubleshoot/TestAccountSettings.kt       | 19 ++++----
 5 files changed, 58 insertions(+), 84 deletions(-)

diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/pushrules/PushRuleService.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/pushrules/PushRuleService.kt
index 880a7be9ac..4da1662681 100644
--- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/pushrules/PushRuleService.kt
+++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/pushrules/PushRuleService.kt
@@ -15,11 +15,9 @@
  */
 package org.matrix.android.sdk.api.pushrules
 
-import org.matrix.android.sdk.api.MatrixCallback
 import org.matrix.android.sdk.api.pushrules.rest.PushRule
 import org.matrix.android.sdk.api.pushrules.rest.RuleSet
 import org.matrix.android.sdk.api.session.events.model.Event
-import org.matrix.android.sdk.api.util.Cancelable
 
 interface PushRuleService {
     /**
@@ -29,13 +27,13 @@ interface PushRuleService {
 
     fun getPushRules(scope: String = RuleScope.GLOBAL): RuleSet
 
-    fun updatePushRuleEnableStatus(kind: RuleKind, pushRule: PushRule, enabled: Boolean, callback: MatrixCallback<Unit>): Cancelable
+    suspend fun updatePushRuleEnableStatus(kind: RuleKind, pushRule: PushRule, enabled: Boolean)
 
-    fun addPushRule(kind: RuleKind, pushRule: PushRule, callback: MatrixCallback<Unit>): Cancelable
+    suspend fun addPushRule(kind: RuleKind, pushRule: PushRule)
 
-    fun updatePushRuleActions(kind: RuleKind, oldPushRule: PushRule, newPushRule: PushRule, callback: MatrixCallback<Unit>): Cancelable
+    suspend fun updatePushRuleActions(kind: RuleKind, oldPushRule: PushRule, newPushRule: PushRule)
 
-    fun removePushRule(kind: RuleKind, pushRule: PushRule, callback: MatrixCallback<Unit>): Cancelable
+    suspend fun removePushRule(kind: RuleKind, pushRule: PushRule)
 
     fun addPushRuleListener(listener: PushRuleListener)
 
diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/notification/DefaultPushRuleService.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/notification/DefaultPushRuleService.kt
index 217da269f9..f55835eb62 100644
--- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/notification/DefaultPushRuleService.kt
+++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/notification/DefaultPushRuleService.kt
@@ -16,7 +16,6 @@
 package org.matrix.android.sdk.internal.session.notification
 
 import com.zhuinden.monarchy.Monarchy
-import org.matrix.android.sdk.api.MatrixCallback
 import org.matrix.android.sdk.api.pushrules.PushRuleService
 import org.matrix.android.sdk.api.pushrules.RuleKind
 import org.matrix.android.sdk.api.pushrules.RuleSetKey
@@ -24,7 +23,6 @@ import org.matrix.android.sdk.api.pushrules.getActions
 import org.matrix.android.sdk.api.pushrules.rest.PushRule
 import org.matrix.android.sdk.api.pushrules.rest.RuleSet
 import org.matrix.android.sdk.api.session.events.model.Event
-import org.matrix.android.sdk.api.util.Cancelable
 import org.matrix.android.sdk.internal.database.mapper.PushRulesMapper
 import org.matrix.android.sdk.internal.database.model.PushRulesEntity
 import org.matrix.android.sdk.internal.database.query.where
@@ -103,37 +101,21 @@ internal class DefaultPushRuleService @Inject constructor(
         )
     }
 
-    override fun updatePushRuleEnableStatus(kind: RuleKind, pushRule: PushRule, enabled: Boolean, callback: MatrixCallback<Unit>): Cancelable {
+    override suspend fun updatePushRuleEnableStatus(kind: RuleKind, pushRule: PushRule, enabled: Boolean) {
         // The rules will be updated, and will come back from the next sync response
-        return updatePushRuleEnableStatusTask
-                .configureWith(UpdatePushRuleEnableStatusTask.Params(kind, pushRule, enabled)) {
-                    this.callback = callback
-                }
-                .executeBy(taskExecutor)
+        return updatePushRuleEnableStatusTask.execute(UpdatePushRuleEnableStatusTask.Params(kind, pushRule, enabled))
     }
 
-    override fun addPushRule(kind: RuleKind, pushRule: PushRule, callback: MatrixCallback<Unit>): Cancelable {
-        return addPushRuleTask
-                .configureWith(AddPushRuleTask.Params(kind, pushRule)) {
-                    this.callback = callback
-                }
-                .executeBy(taskExecutor)
+    override suspend fun addPushRule(kind: RuleKind, pushRule: PushRule) {
+        return addPushRuleTask.execute(AddPushRuleTask.Params(kind, pushRule))
     }
 
-    override fun updatePushRuleActions(kind: RuleKind, oldPushRule: PushRule, newPushRule: PushRule, callback: MatrixCallback<Unit>): Cancelable {
-        return updatePushRuleActionsTask
-                .configureWith(UpdatePushRuleActionsTask.Params(kind, oldPushRule, newPushRule)) {
-                    this.callback = callback
-                }
-                .executeBy(taskExecutor)
+    override suspend fun updatePushRuleActions(kind: RuleKind, oldPushRule: PushRule, newPushRule: PushRule) {
+        return updatePushRuleActionsTask.execute(UpdatePushRuleActionsTask.Params(kind, oldPushRule, newPushRule))
     }
 
-    override fun removePushRule(kind: RuleKind, pushRule: PushRule, callback: MatrixCallback<Unit>): Cancelable {
-        return removePushRuleTask
-                .configureWith(RemovePushRuleTask.Params(kind, pushRule)) {
-                    this.callback = callback
-                }
-                .executeBy(taskExecutor)
+    override suspend fun removePushRule(kind: RuleKind, pushRule: PushRule) {
+        return removePushRuleTask.execute(RemovePushRuleTask.Params(kind, pushRule))
     }
 
     override fun removePushRuleListener(listener: PushRuleService.PushRuleListener) {
diff --git a/vector/src/main/java/im/vector/app/features/settings/VectorSettingsAdvancedNotificationPreferenceFragment.kt b/vector/src/main/java/im/vector/app/features/settings/VectorSettingsAdvancedNotificationPreferenceFragment.kt
index 67b5c03638..7e4520e4d4 100644
--- a/vector/src/main/java/im/vector/app/features/settings/VectorSettingsAdvancedNotificationPreferenceFragment.kt
+++ b/vector/src/main/java/im/vector/app/features/settings/VectorSettingsAdvancedNotificationPreferenceFragment.kt
@@ -15,12 +15,13 @@
  */
 package im.vector.app.features.settings
 
+import androidx.lifecycle.lifecycleScope
 import androidx.preference.Preference
 import im.vector.app.R
 import im.vector.app.core.preference.PushRulePreference
 import im.vector.app.core.preference.VectorPreference
 import im.vector.app.core.utils.toast
-import org.matrix.android.sdk.api.MatrixCallback
+import kotlinx.coroutines.launch
 import org.matrix.android.sdk.api.pushrules.RuleIds
 import org.matrix.android.sdk.api.pushrules.rest.PushRuleAndKind
 import javax.inject.Inject
@@ -50,29 +51,25 @@ class VectorSettingsAdvancedNotificationPreferenceFragment @Inject constructor()
                         if (newRule != null) {
                             displayLoadingView()
 
-                            session.updatePushRuleActions(
-                                    ruleAndKind.kind,
-                                    preference.ruleAndKind?.pushRule ?: ruleAndKind.pushRule,
-                                    newRule,
-                                    object : MatrixCallback<Unit> {
-                                        override fun onSuccess(data: Unit) {
-                                            if (!isAdded) {
-                                                return
-                                            }
-                                            preference.setPushRule(ruleAndKind.copy(pushRule = newRule))
-                                            hideLoadingView()
-                                        }
-
-                                        override fun onFailure(failure: Throwable) {
-                                            if (!isAdded) {
-                                                return
-                                            }
-                                            hideLoadingView()
-                                            // Restore the previous value
-                                            refreshDisplay()
-                                            activity?.toast(errorFormatter.toHumanReadable(failure))
-                                        }
-                                    })
+                            lifecycleScope.launch {
+                                val result = runCatching {
+                                    session.updatePushRuleActions(ruleAndKind.kind,
+                                            preference.ruleAndKind?.pushRule ?: ruleAndKind.pushRule,
+                                            newRule)
+                                }
+                                if (!isAdded) {
+                                    return@launch
+                                }
+                                result.onSuccess {
+                                    preference.setPushRule(ruleAndKind.copy(pushRule = newRule))
+                                }
+                                hideLoadingView()
+                                result.onFailure { failure ->
+                                    // Restore the previous value
+                                    refreshDisplay()
+                                    activity?.toast(errorFormatter.toHumanReadable(failure))
+                                }
+                            }
                         }
                         false
                     }
diff --git a/vector/src/main/java/im/vector/app/features/settings/VectorSettingsNotificationPreferenceFragment.kt b/vector/src/main/java/im/vector/app/features/settings/VectorSettingsNotificationPreferenceFragment.kt
index 4bee1ac0c8..47868eed51 100644
--- a/vector/src/main/java/im/vector/app/features/settings/VectorSettingsNotificationPreferenceFragment.kt
+++ b/vector/src/main/java/im/vector/app/features/settings/VectorSettingsNotificationPreferenceFragment.kt
@@ -23,6 +23,7 @@ import android.media.RingtoneManager
 import android.net.Uri
 import android.os.Parcelable
 import android.widget.Toast
+import androidx.lifecycle.lifecycleScope
 import androidx.preference.Preference
 import androidx.preference.SwitchPreference
 import im.vector.app.R
@@ -37,6 +38,7 @@ import im.vector.app.core.utils.isIgnoringBatteryOptimizations
 import im.vector.app.core.utils.requestDisablingBatteryOptimization
 import im.vector.app.features.notifications.NotificationUtils
 import im.vector.app.push.fcm.FcmHelper
+import kotlinx.coroutines.launch
 import org.matrix.android.sdk.api.MatrixCallback
 import org.matrix.android.sdk.api.extensions.tryOrNull
 import org.matrix.android.sdk.api.pushrules.RuleIds
@@ -318,24 +320,22 @@ class VectorSettingsNotificationPreferenceFragment @Inject constructor(
                 .find { it.ruleId == RuleIds.RULE_ID_DISABLE_ALL }
                 ?.let {
                     // Trick, we must enable this room to disable notifications
-                    pushRuleService.updatePushRuleEnableStatus(RuleKind.OVERRIDE,
-                            it,
-                            !switchPref.isChecked,
-                            object : MatrixCallback<Unit> {
-                                override fun onSuccess(data: Unit) {
-                                    // Push rules will be updated from the sync
-                                }
+                    lifecycleScope.launch {
+                        try {
+                            pushRuleService.updatePushRuleEnableStatus(RuleKind.OVERRIDE,
+                                    it,
+                                    !switchPref.isChecked)
+                            // Push rules will be updated from the sync
+                        } catch (failure: Throwable) {
+                            if (!isAdded) {
+                                return@launch
+                            }
 
-                                override fun onFailure(failure: Throwable) {
-                                    if (!isAdded) {
-                                        return
-                                    }
-
-                                    // revert the check box
-                                    switchPref.isChecked = !switchPref.isChecked
-                                    Toast.makeText(activity, R.string.unknown_error, Toast.LENGTH_SHORT).show()
-                                }
-                            })
+                            // revert the check box
+                            switchPref.isChecked = !switchPref.isChecked
+                            Toast.makeText(activity, R.string.unknown_error, Toast.LENGTH_SHORT).show()
+                        }
+                    }
                 }
     }
 }
diff --git a/vector/src/main/java/im/vector/app/features/settings/troubleshoot/TestAccountSettings.kt b/vector/src/main/java/im/vector/app/features/settings/troubleshoot/TestAccountSettings.kt
index 0c3390d0b0..b78dba07f5 100644
--- a/vector/src/main/java/im/vector/app/features/settings/troubleshoot/TestAccountSettings.kt
+++ b/vector/src/main/java/im/vector/app/features/settings/troubleshoot/TestAccountSettings.kt
@@ -20,7 +20,8 @@ import androidx.activity.result.ActivityResultLauncher
 import im.vector.app.R
 import im.vector.app.core.di.ActiveSessionHolder
 import im.vector.app.core.resources.StringProvider
-import org.matrix.android.sdk.api.MatrixCallback
+import kotlinx.coroutines.GlobalScope
+import kotlinx.coroutines.launch
 import org.matrix.android.sdk.api.pushrules.RuleIds
 import org.matrix.android.sdk.api.pushrules.RuleKind
 import javax.inject.Inject
@@ -48,16 +49,12 @@ class TestAccountSettings @Inject constructor(private val stringProvider: String
                     override fun doFix() {
                         if (manager?.diagStatus == TestStatus.RUNNING) return // wait before all is finished
 
-                        session.updatePushRuleEnableStatus(RuleKind.OVERRIDE, defaultRule, !defaultRule.enabled,
-                                object : MatrixCallback<Unit> {
-                                    override fun onSuccess(data: Unit) {
-                                        manager?.retry(activityResultLauncher)
-                                    }
-
-                                    override fun onFailure(failure: Throwable) {
-                                        manager?.retry(activityResultLauncher)
-                                    }
-                                })
+                        GlobalScope.launch {
+                            runCatching {
+                                session.updatePushRuleEnableStatus(RuleKind.OVERRIDE, defaultRule, !defaultRule.enabled)
+                            }
+                            manager?.retry(activityResultLauncher)
+                        }
                     }
                 }
                 status = TestStatus.FAILED

From 92a6e9ea5ae0ac0bbb759fec31a88d30eae396ac Mon Sep 17 00:00:00 2001
From: Dominic Fischer <dominicfischer7@gmail.com>
Date: Wed, 18 Nov 2020 14:23:59 +0000
Subject: [PATCH 2/3] Remove redundant return

Signed-off-by: Dominic Fischer <dominicfischer7@gmail.com>
---
 .../session/notification/DefaultPushRuleService.kt        | 8 ++++----
 1 file changed, 4 insertions(+), 4 deletions(-)

diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/notification/DefaultPushRuleService.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/notification/DefaultPushRuleService.kt
index f55835eb62..e00d2ff26c 100644
--- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/notification/DefaultPushRuleService.kt
+++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/notification/DefaultPushRuleService.kt
@@ -103,19 +103,19 @@ internal class DefaultPushRuleService @Inject constructor(
 
     override suspend fun updatePushRuleEnableStatus(kind: RuleKind, pushRule: PushRule, enabled: Boolean) {
         // The rules will be updated, and will come back from the next sync response
-        return updatePushRuleEnableStatusTask.execute(UpdatePushRuleEnableStatusTask.Params(kind, pushRule, enabled))
+        updatePushRuleEnableStatusTask.execute(UpdatePushRuleEnableStatusTask.Params(kind, pushRule, enabled))
     }
 
     override suspend fun addPushRule(kind: RuleKind, pushRule: PushRule) {
-        return addPushRuleTask.execute(AddPushRuleTask.Params(kind, pushRule))
+        addPushRuleTask.execute(AddPushRuleTask.Params(kind, pushRule))
     }
 
     override suspend fun updatePushRuleActions(kind: RuleKind, oldPushRule: PushRule, newPushRule: PushRule) {
-        return updatePushRuleActionsTask.execute(UpdatePushRuleActionsTask.Params(kind, oldPushRule, newPushRule))
+        updatePushRuleActionsTask.execute(UpdatePushRuleActionsTask.Params(kind, oldPushRule, newPushRule))
     }
 
     override suspend fun removePushRule(kind: RuleKind, pushRule: PushRule) {
-        return removePushRuleTask.execute(RemovePushRuleTask.Params(kind, pushRule))
+        removePushRuleTask.execute(RemovePushRuleTask.Params(kind, pushRule))
     }
 
     override fun removePushRuleListener(listener: PushRuleService.PushRuleListener) {

From 796ba72bde39a298caa5bfe8a11f918c5d696529 Mon Sep 17 00:00:00 2001
From: Dominic Fischer <dominicfischer7@gmail.com>
Date: Wed, 18 Nov 2020 14:27:46 +0000
Subject: [PATCH 3/3] Reorder

Signed-off-by: Dominic Fischer <dominicfischer7@gmail.com>
---
 .../VectorSettingsAdvancedNotificationPreferenceFragment.kt     | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/vector/src/main/java/im/vector/app/features/settings/VectorSettingsAdvancedNotificationPreferenceFragment.kt b/vector/src/main/java/im/vector/app/features/settings/VectorSettingsAdvancedNotificationPreferenceFragment.kt
index 7e4520e4d4..8d9f8d7170 100644
--- a/vector/src/main/java/im/vector/app/features/settings/VectorSettingsAdvancedNotificationPreferenceFragment.kt
+++ b/vector/src/main/java/im/vector/app/features/settings/VectorSettingsAdvancedNotificationPreferenceFragment.kt
@@ -60,10 +60,10 @@ class VectorSettingsAdvancedNotificationPreferenceFragment @Inject constructor()
                                 if (!isAdded) {
                                     return@launch
                                 }
+                                hideLoadingView()
                                 result.onSuccess {
                                     preference.setPushRule(ruleAndKind.copy(pushRule = newRule))
                                 }
-                                hideLoadingView()
                                 result.onFailure { failure ->
                                     // Restore the previous value
                                     refreshDisplay()