From 004f71949037923033ec4f08e6626b18f480870e Mon Sep 17 00:00:00 2001 From: Marcel Hibbe Date: Thu, 23 Feb 2023 18:10:36 +0100 Subject: [PATCH] Use model to pass data to dialog use util to extract common rx requests Signed-off-by: Marcel Hibbe --- .../talk/controllers/ChatController.kt | 71 ++++--------------- .../talk/data/NotificationConfirmDialog.kt | 16 ----- .../talk/data/NotificationDialogData.kt | 16 +++++ .../nextcloud/talk/jobs/NotificationWorker.kt | 41 ++++++++--- .../talk/utils/rx/SendCommonRequestUtil.kt | 60 ++++++++++++++++ 5 files changed, 120 insertions(+), 84 deletions(-) delete mode 100644 app/src/main/java/com/nextcloud/talk/data/NotificationConfirmDialog.kt create mode 100644 app/src/main/java/com/nextcloud/talk/data/NotificationDialogData.kt create mode 100644 app/src/main/java/com/nextcloud/talk/utils/rx/SendCommonRequestUtil.kt diff --git a/app/src/main/java/com/nextcloud/talk/controllers/ChatController.kt b/app/src/main/java/com/nextcloud/talk/controllers/ChatController.kt index 914f0b8db..e09bfbf45 100644 --- a/app/src/main/java/com/nextcloud/talk/controllers/ChatController.kt +++ b/app/src/main/java/com/nextcloud/talk/controllers/ChatController.kt @@ -126,6 +126,7 @@ import com.nextcloud.talk.application.NextcloudTalkApplication import com.nextcloud.talk.callbacks.MentionAutocompleteCallback import com.nextcloud.talk.controllers.base.BaseController import com.nextcloud.talk.controllers.util.viewBinding +import com.nextcloud.talk.data.NotificationDialogData import com.nextcloud.talk.data.user.model.User import com.nextcloud.talk.databinding.ControllerChatBinding import com.nextcloud.talk.events.UserMentionClickEvent @@ -146,7 +147,6 @@ import com.nextcloud.talk.models.json.conversations.RoomOverall import com.nextcloud.talk.models.json.conversations.RoomsOverall import com.nextcloud.talk.models.json.generic.GenericOverall import com.nextcloud.talk.models.json.mention.Mention -import com.nextcloud.talk.models.json.notifications.Notification import com.nextcloud.talk.polls.ui.PollCreateDialogFragment import com.nextcloud.talk.presenters.MentionAutocompletePresenter import com.nextcloud.talk.remotefilebrowser.activities.RemoteFileBrowserActivity @@ -185,6 +185,7 @@ import com.nextcloud.talk.utils.permissions.PlatformPermissionUtil import com.nextcloud.talk.utils.remapchat.ConductorRemapping import com.nextcloud.talk.utils.remapchat.RemapChatModel import com.nextcloud.talk.utils.rx.DisposableSet +import com.nextcloud.talk.utils.rx.SendCommonRequestUtil import com.nextcloud.talk.utils.singletons.ApplicationWideCurrentRoomHolder import com.nextcloud.talk.utils.text.Spans import com.nextcloud.talk.webrtc.WebSocketConnectionHelper @@ -268,7 +269,7 @@ class ChatController(args: Bundle) : private var lookingIntoFuture = false var newMessagesCount = 0 var startCallFromNotification: Boolean? = null - private var recordingAvailableNotification: Notification? = null + private var recordingAvailableNotification: NotificationDialogData? = null var startCallFromRoomSwitch: Boolean = false val roomId: String val voiceOnly: Boolean @@ -936,20 +937,17 @@ class ChatController(args: Bundle) : if (recordingAvailableNotification != null) { binding?.root?.context?.let { context -> val dialogBuilder = MaterialAlertDialogBuilder(context) - dialogBuilder.setTitle(recordingAvailableNotification?.subject) - dialogBuilder.setMessage("Do you want to share the recording to the chat?") + recordingAvailableNotification?.let { + dialogBuilder.setTitle(it.title) + dialogBuilder.setMessage(it.text) - for (action in recordingAvailableNotification?.actions!!) { - if (!action.label.isNullOrEmpty() && !action.link.isNullOrEmpty()) { - if (action.primary) { - dialogBuilder.setPositiveButton(action.label!!) { dialog, which -> - sendRequest(action.type!!, action.link!!) - } - } else { - dialogBuilder.setNegativeButton(action.label!!) { dialog, which -> - sendRequest(action.type!!, action.link!!) - } - } + val requestUtil = SendCommonRequestUtil(ncApi, credentials!!) + + dialogBuilder.setPositiveButton(it.primaryActionDescription) { _, _ -> + requestUtil.sendRequest(it.primaryActionMethod, it.primaryActionUrl) + } + dialogBuilder.setNegativeButton(it.secondaryActionDescription) { _, _ -> + requestUtil.sendRequest(it.secondaryActionMethod, it.secondaryActionUrl) } } @@ -965,49 +963,6 @@ class ChatController(args: Bundle) : super.onViewBound(view) } - private fun sendRequest(type: String, link: String) { - if (type == "POST") { - ncApi.sendCommonPostRequest(credentials, link) - ?.subscribeOn(Schedulers.io()) - ?.observeOn(AndroidSchedulers.mainThread()) - ?.subscribe(object : Observer { - override fun onSubscribe(d: Disposable) { - // unused atm - } - - override fun onNext(genericOverall: GenericOverall) { - } - - override fun onError(e: Throwable) { - } - - override fun onComplete() { - // unused atm - } - }) - } else if (type == "DELETE") { - ncApi.sendCommonDeleteRequest(credentials, link) - ?.subscribeOn(Schedulers.io()) - ?.observeOn(AndroidSchedulers.mainThread()) - ?.subscribe(object : Observer { - override fun onSubscribe(d: Disposable) { - // unused atm - } - - override fun onNext(genericOverall: GenericOverall) { - } - - override fun onError(e: Throwable) { - } - - override fun onComplete() { - // unused atm - } - }) - } - Log.d(TAG, "type=" + type + " link=" + link) - } - private fun switchToRoom(token: String) { if (CallActivity.active) { Log.d(TAG, "CallActivity is running. Ignore to switch chat in ChatController...") diff --git a/app/src/main/java/com/nextcloud/talk/data/NotificationConfirmDialog.kt b/app/src/main/java/com/nextcloud/talk/data/NotificationConfirmDialog.kt deleted file mode 100644 index 2295b6b46..000000000 --- a/app/src/main/java/com/nextcloud/talk/data/NotificationConfirmDialog.kt +++ /dev/null @@ -1,16 +0,0 @@ -package com.nextcloud.talk.data - -import android.os.Parcelable -import kotlinx.parcelize.Parcelize - -@Parcelize -data class NotificationConfirmDialog( - var title: String? = "", - var question: String? = "", - var primaryActionDescription: String? = "", - var primaryActionUrl: String? = "", - var primaryActionMethod: String? = "", - var secondaryActionDescription: String? = "", - var secondaryActionUrl: String? = "", - var secondaryActionMethod: String? = "" -) : Parcelable diff --git a/app/src/main/java/com/nextcloud/talk/data/NotificationDialogData.kt b/app/src/main/java/com/nextcloud/talk/data/NotificationDialogData.kt new file mode 100644 index 000000000..3d2e8db9a --- /dev/null +++ b/app/src/main/java/com/nextcloud/talk/data/NotificationDialogData.kt @@ -0,0 +1,16 @@ +package com.nextcloud.talk.data + +import android.os.Parcelable +import kotlinx.parcelize.Parcelize + +@Parcelize +data class NotificationDialogData( + var title: String = "", + var text: String = "", + var primaryActionDescription: String = "", + var primaryActionUrl: String = "", + var primaryActionMethod: String = "", + var secondaryActionDescription: String = "", + var secondaryActionUrl: String = "", + var secondaryActionMethod: String = "" +) : Parcelable diff --git a/app/src/main/java/com/nextcloud/talk/jobs/NotificationWorker.kt b/app/src/main/java/com/nextcloud/talk/jobs/NotificationWorker.kt index 130aa0a3c..fc5f1b77a 100644 --- a/app/src/main/java/com/nextcloud/talk/jobs/NotificationWorker.kt +++ b/app/src/main/java/com/nextcloud/talk/jobs/NotificationWorker.kt @@ -58,6 +58,7 @@ import com.nextcloud.talk.api.NcApi import com.nextcloud.talk.application.NextcloudTalkApplication import com.nextcloud.talk.application.NextcloudTalkApplication.Companion.sharedApplication import com.nextcloud.talk.arbitrarystorage.ArbitraryStorageManager +import com.nextcloud.talk.data.NotificationDialogData import com.nextcloud.talk.models.SignatureVerification import com.nextcloud.talk.models.json.chat.ChatUtils.Companion.getParsedMessage import com.nextcloud.talk.models.json.conversations.RoomOverall @@ -320,14 +321,15 @@ class NotificationWorker(context: Context, workerParams: WorkerParameters) : Wor override fun onNext(notificationOverall: NotificationOverall) { val ncNotification = notificationOverall.ocs!!.notification - - enrichPushMessageByNcNotificationData(ncNotification) - val newIntent = enrichIntentByNcNotificationData(intent, ncNotification) - showNotification(newIntent) + if (ncNotification != null) { + enrichPushMessageByNcNotificationData(ncNotification) + val newIntent = enrichIntentByNcNotificationData(intent, ncNotification) + showNotification(newIntent) + } } override fun onError(e: Throwable) { - // unused atm + Log.e(TAG, "Failed to get notification", e) } override fun onComplete() { @@ -338,13 +340,30 @@ class NotificationWorker(context: Context, workerParams: WorkerParameters) : Wor private fun enrichIntentByNcNotificationData( intent: Intent, - ncNotification: com.nextcloud.talk.models.json.notifications.Notification? + ncNotification: com.nextcloud.talk.models.json.notifications.Notification ): Intent { val newIntent = Intent(intent) - if ("recording" == ncNotification?.objectType) { + if ("recording" == ncNotification.objectType) { + val notificationDialogData = NotificationDialogData() + + notificationDialogData.title = context?.getString(R.string.record_file_available).orEmpty() + notificationDialogData.text = ncNotification.subject.orEmpty() + + for (action in ncNotification.actions!!) { + if (action.primary) { + notificationDialogData.primaryActionDescription = action.label.orEmpty() + notificationDialogData.primaryActionMethod = action.type.orEmpty() + notificationDialogData.primaryActionUrl = action.link.orEmpty() + } else { + notificationDialogData.secondaryActionDescription = action.label.orEmpty() + notificationDialogData.secondaryActionMethod = action.type.orEmpty() + notificationDialogData.secondaryActionUrl = action.link.orEmpty() + } + } + val bundle = Bundle() - bundle.putParcelable(KEY_NOTIFICATION_RECORDING_NOTIFICATION, ncNotification) + bundle.putParcelable(KEY_NOTIFICATION_RECORDING_NOTIFICATION, notificationDialogData) newIntent.putExtras(bundle) } @@ -376,13 +395,16 @@ class NotificationWorker(context: Context, workerParams: WorkerParameters) : Wor if (callHashMap != null && callHashMap.size > 0 && callHashMap.containsKey("name")) { if (subjectRichParameters.containsKey("reaction")) { pushMessage.subject = "" - pushMessage.text = ncNotification.subject } else if (ncNotification.objectType == "chat") { pushMessage.subject = callHashMap["name"]!! } else { pushMessage.subject = ncNotification.subject!! } + if (subjectRichParameters.containsKey("reaction")) { + pushMessage.text = ncNotification.subject + } + if (callHashMap.containsKey("call-type")) { conversationType = callHashMap["call-type"] } @@ -421,7 +443,6 @@ class NotificationWorker(context: Context, workerParams: WorkerParameters) : Wor when (conversationType) { "recording" -> { - pushMessage.subject = "new Recording available" largeIcon = ContextCompat.getDrawable(context!!, R.drawable.ic_baseline_videocam_24)?.toBitmap()!! } "one2one" -> { diff --git a/app/src/main/java/com/nextcloud/talk/utils/rx/SendCommonRequestUtil.kt b/app/src/main/java/com/nextcloud/talk/utils/rx/SendCommonRequestUtil.kt new file mode 100644 index 000000000..915b4a60d --- /dev/null +++ b/app/src/main/java/com/nextcloud/talk/utils/rx/SendCommonRequestUtil.kt @@ -0,0 +1,60 @@ +package com.nextcloud.talk.utils.rx + +import android.util.Log +import com.nextcloud.talk.api.NcApi +import com.nextcloud.talk.models.json.generic.GenericOverall +import io.reactivex.Observer +import io.reactivex.android.schedulers.AndroidSchedulers +import io.reactivex.disposables.Disposable +import io.reactivex.schedulers.Schedulers + +class SendCommonRequestUtil(val ncApi: NcApi, val credentials: String) { + + fun sendRequest(type: String, link: String) { + if (type == "POST") { + ncApi.sendCommonPostRequest(credentials, link) + ?.subscribeOn(Schedulers.io()) + ?.observeOn(AndroidSchedulers.mainThread()) + ?.subscribe(object : Observer { + override fun onSubscribe(d: Disposable) { + // unused atm + } + + override fun onNext(genericOverall: GenericOverall) { + } + + override fun onError(e: Throwable) { + Log.e(TAG, "Request failed", e) + } + + override fun onComplete() { + // unused atm + } + }) + } else if (type == "DELETE") { + ncApi.sendCommonDeleteRequest(credentials, link) + ?.subscribeOn(Schedulers.io()) + ?.observeOn(AndroidSchedulers.mainThread()) + ?.subscribe(object : Observer { + override fun onSubscribe(d: Disposable) { + // unused atm + } + + override fun onNext(genericOverall: GenericOverall) { + } + + override fun onError(e: Throwable) { + Log.e(TAG, "Request failed", e) + } + + override fun onComplete() { + // unused atm + } + }) + } + } + + companion object { + private val TAG = SendCommonRequestUtil::class.java.simpleName + } +}