diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index dc3cbc5e8..279b00951 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -198,6 +198,8 @@ + + (KEY_USER_ENTITY)!!.id!!, - intent.getStringExtra(KEY_ROOM_TOKEN)!!, - intent.extras!!, - true, - true - ) - logRouterBackStack(router!!) } } 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 e09bfbf45..01badf1ab 100644 --- a/app/src/main/java/com/nextcloud/talk/controllers/ChatController.kt +++ b/app/src/main/java/com/nextcloud/talk/controllers/ChatController.kt @@ -126,7 +126,6 @@ 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 @@ -185,7 +184,6 @@ 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 @@ -269,7 +267,6 @@ class ChatController(args: Bundle) : private var lookingIntoFuture = false var newMessagesCount = 0 var startCallFromNotification: Boolean? = null - private var recordingAvailableNotification: NotificationDialogData? = null var startCallFromRoomSwitch: Boolean = false val roomId: String val voiceOnly: Boolean @@ -346,10 +343,6 @@ class ChatController(args: Bundle) : startCallFromNotification = args.getBoolean(BundleKeys.KEY_FROM_NOTIFICATION_START_CALL) } - if (args.containsKey(BundleKeys.KEY_NOTIFICATION_RECORDING_NOTIFICATION)) { - recordingAvailableNotification = args.getParcelable(BundleKeys.KEY_NOTIFICATION_RECORDING_NOTIFICATION) - } - if (args.containsKey(BundleKeys.KEY_SWITCH_TO_ROOM_AND_START_CALL)) { startCallFromRoomSwitch = args.getBoolean(BundleKeys.KEY_SWITCH_TO_ROOM_AND_START_CALL) } @@ -933,33 +926,6 @@ class ChatController(args: Bundle) : getRoomInfo() } } - - if (recordingAvailableNotification != null) { - binding?.root?.context?.let { context -> - val dialogBuilder = MaterialAlertDialogBuilder(context) - recordingAvailableNotification?.let { - dialogBuilder.setTitle(it.title) - dialogBuilder.setMessage(it.text) - - 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) - } - } - - viewThemeUtils.dialog.colorMaterialAlertDialogBackground(context, dialogBuilder) - val dialog = dialogBuilder.show() - - viewThemeUtils.platform.colorTextButtons( - dialog.getButton(AlertDialog.BUTTON_POSITIVE), - dialog.getButton(AlertDialog.BUTTON_NEGATIVE) - ) - } - } super.onViewBound(view) } diff --git a/app/src/main/java/com/nextcloud/talk/data/NotificationDialogData.kt b/app/src/main/java/com/nextcloud/talk/data/NotificationDialogData.kt deleted file mode 100644 index 3d2e8db9a..000000000 --- a/app/src/main/java/com/nextcloud/talk/data/NotificationDialogData.kt +++ /dev/null @@ -1,16 +0,0 @@ -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 4be297f76..731d47be5 100644 --- a/app/src/main/java/com/nextcloud/talk/jobs/NotificationWorker.kt +++ b/app/src/main/java/com/nextcloud/talk/jobs/NotificationWorker.kt @@ -4,7 +4,7 @@ * @author Andy Scherzinger * @author Mario Danic * @author Marcel Hibbe - * Copyright (C) 2022 Marcel Hibbe + * Copyright (C) 2022-2023 Marcel Hibbe * Copyright (C) 2022 Andy Scherzinger * Copyright (C) 2017-2018 Mario Danic * @@ -58,7 +58,6 @@ 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 @@ -68,7 +67,9 @@ import com.nextcloud.talk.models.json.participants.ParticipantsOverall import com.nextcloud.talk.models.json.push.DecryptedPushMessage import com.nextcloud.talk.models.json.push.NotificationUser import com.nextcloud.talk.receivers.DirectReplyReceiver +import com.nextcloud.talk.receivers.DismissRecordingAvailableReceiver import com.nextcloud.talk.receivers.MarkAsReadReceiver +import com.nextcloud.talk.receivers.ShareRecordingToChatReceiver import com.nextcloud.talk.utils.ApiUtils import com.nextcloud.talk.utils.DoNotDisturbUtils.shouldPlaySound import com.nextcloud.talk.utils.NotificationUtils @@ -80,14 +81,15 @@ import com.nextcloud.talk.utils.NotificationUtils.getMessageRingtoneUri import com.nextcloud.talk.utils.NotificationUtils.loadAvatarSync import com.nextcloud.talk.utils.PushUtils import com.nextcloud.talk.utils.bundle.BundleKeys +import com.nextcloud.talk.utils.bundle.BundleKeys.KEY_DISMISS_RECORDING_URL import com.nextcloud.talk.utils.bundle.BundleKeys.KEY_FROM_NOTIFICATION_START_CALL import com.nextcloud.talk.utils.bundle.BundleKeys.KEY_INTERNAL_USER_ID import com.nextcloud.talk.utils.bundle.BundleKeys.KEY_MESSAGE_ID import com.nextcloud.talk.utils.bundle.BundleKeys.KEY_NOTIFICATION_ID -import com.nextcloud.talk.utils.bundle.BundleKeys.KEY_NOTIFICATION_RECORDING_NOTIFICATION import com.nextcloud.talk.utils.bundle.BundleKeys.KEY_NOTIFICATION_RESTRICT_DELETION import com.nextcloud.talk.utils.bundle.BundleKeys.KEY_NOTIFICATION_TIMESTAMP import com.nextcloud.talk.utils.bundle.BundleKeys.KEY_ROOM_TOKEN +import com.nextcloud.talk.utils.bundle.BundleKeys.KEY_SHARE_RECORDING_TO_CHAT_URL import com.nextcloud.talk.utils.bundle.BundleKeys.KEY_SYSTEM_NOTIFICATION_ID import com.nextcloud.talk.utils.bundle.BundleKeys.KEY_USER_ENTITY import com.nextcloud.talk.utils.preferences.AppPreferences @@ -183,7 +185,7 @@ class NotificationWorker(context: Context, workerParams: WorkerParameters) : Wor if (pushMessage.notificationId != Long.MIN_VALUE) { getNcDataAndShowNotification(mainActivityIntent) } else { - showNotification(mainActivityIntent) + showNotification(mainActivityIntent, null) } } @@ -313,8 +315,8 @@ class NotificationWorker(context: Context, workerParams: WorkerParameters) : Wor val ncNotification = notificationOverall.ocs!!.notification if (ncNotification != null) { enrichPushMessageByNcNotificationData(ncNotification) - val newIntent = enrichIntentByNcNotificationData(intent, ncNotification) - showNotification(newIntent) + // val newIntent = enrichIntentByNcNotificationData(intent, ncNotification) + showNotification(intent, ncNotification) } } @@ -334,29 +336,6 @@ class NotificationWorker(context: Context, workerParams: WorkerParameters) : Wor ): Intent { val newIntent = Intent(intent) - if ("recording" == ncNotification.objectType) { - val notificationDialogData = NotificationDialogData() - - notificationDialogData.title = pushMessage.subject - notificationDialogData.text = pushMessage.text.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, notificationDialogData) - newIntent.putExtras(bundle) - } - return newIntent } @@ -417,7 +396,10 @@ class NotificationWorker(context: Context, workerParams: WorkerParameters) : Wor } @Suppress("MagicNumber") - private fun showNotification(intent: Intent) { + private fun showNotification( + intent: Intent, + ncNotification: com.nextcloud.talk.models.json.notifications.Notification? + ) { var category = "" when (pushMessage.type) { TYPE_CHAT, TYPE_ROOM, TYPE_RECORDING -> category = Notification.CATEGORY_MESSAGE @@ -447,6 +429,8 @@ class NotificationWorker(context: Context, workerParams: WorkerParameters) : Wor contentText = EmojiCompat.get().process(pushMessage.text!!) } + val autoCancelOnClick = TYPE_RECORDING != pushMessage.type + val notificationBuilder = NotificationCompat.Builder(context!!, "1") .setPriority(NotificationCompat.PRIORITY_HIGH) .setCategory(category) @@ -458,7 +442,7 @@ class NotificationWorker(context: Context, workerParams: WorkerParameters) : Wor .setWhen(pushMessage.timestamp) .setShowWhen(true) .setContentIntent(pendingIntent) - .setAutoCancel(true) + .setAutoCancel(autoCancelOnClick) .setColor(context!!.resources.getColor(R.color.colorPrimary)) val notificationInfoBundle = Bundle() @@ -511,25 +495,17 @@ class NotificationWorker(context: Context, workerParams: WorkerParameters) : Wor if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N && TYPE_RECORDING == pushMessage.type && - pushMessage.notificationUser != null + ncNotification != null ) { - prepareChatNotification(notificationBuilder, activeStatusBarNotification, systemNotificationId) - // addDiscardRecordingAvailableAction(notificationBuilder, systemNotificationId) - // addShareRecordingToChatAction(notificationBuilder, systemNotificationId) - } - - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N && - TYPE_RECORDING == pushMessage.type && - pushMessage.notificationUser != null // null - ) { - prepareChatNotification(notificationBuilder, activeStatusBarNotification, systemNotificationId) + addDismissRecordingAvailableAction(notificationBuilder, systemNotificationId, ncNotification) + addShareRecordingToChatAction(notificationBuilder, systemNotificationId, ncNotification) } sendNotification(systemNotificationId, notificationBuilder.build()) } private fun getLargeIcon(): Bitmap { val largeIcon: Bitmap - if (pushMessage.type == "recording") { + if (pushMessage.type == TYPE_RECORDING) { largeIcon = ContextCompat.getDrawable(context!!, R.drawable.ic_baseline_videocam_24)?.toBitmap()!! } else { when (conversationType) { @@ -662,50 +638,82 @@ class NotificationWorker(context: Context, workerParams: WorkerParameters) : Wor notificationBuilder.addAction(replyAction) } - // @RequiresApi(api = Build.VERSION_CODES.N) - // private fun addDiscardRecordingAvailableAction(notificationBuilder: NotificationCompat.Builder, - // systemNotificationId: - // Int) { - // val replyLabel = context!!.resources.getString(R.string.nc_reply) - // val remoteInput = RemoteInput.Builder(NotificationUtils.KEY_DIRECT_REPLY) - // .setLabel(replyLabel) - // .build() - // - // val replyPendingIntent = buildIntentForAction( - // DirectReplyReceiver::class.java, - // systemNotificationId, - // 0 - // ) - // val replyAction = NotificationCompat.Action.Builder(R.drawable.ic_reply, replyLabel, replyPendingIntent) - // .setSemanticAction(NotificationCompat.Action.SEMANTIC_ACTION_REPLY) - // .setShowsUserInterface(false) - // .setAllowGeneratedReplies(true) - // .addRemoteInput(remoteInput) - // .build() - // notificationBuilder.addAction(replyAction) - // } - // - // @RequiresApi(api = Build.VERSION_CODES.N) - // private fun addShareRecordingToChatAction(notificationBuilder: NotificationCompat.Builder, systemNotificationId: - // Int) { - // val replyLabel = context!!.resources.getString(R.string.nc_reply) - // val remoteInput = RemoteInput.Builder(NotificationUtils.KEY_DIRECT_REPLY) - // .setLabel(replyLabel) - // .build() - // - // val replyPendingIntent = buildIntentForAction( - // DirectReplyReceiver::class.java, - // systemNotificationId, - // 0 - // ) - // val replyAction = NotificationCompat.Action.Builder(R.drawable.ic_reply, replyLabel, replyPendingIntent) - // .setSemanticAction(NotificationCompat.Action.SEMANTIC_ACTION_REPLY) - // .setShowsUserInterface(false) - // .setAllowGeneratedReplies(true) - // .addRemoteInput(remoteInput) - // .build() - // notificationBuilder.addAction(replyAction) - // } + @RequiresApi(api = Build.VERSION_CODES.N) + private fun addDismissRecordingAvailableAction( + notificationBuilder: NotificationCompat.Builder, + systemNotificationId: Int, + ncNotification: com.nextcloud.talk.models.json.notifications.Notification + ) { + var dismissLabel = "" + var dismissRecordingUrl = "" + + for (action in ncNotification.actions!!) { + if (!action.primary) { + dismissLabel = action.label.orEmpty() + dismissRecordingUrl = action.link.orEmpty() + } + } + + val dismissIntent = Intent(context, DismissRecordingAvailableReceiver::class.java) + dismissIntent.putExtra(KEY_SYSTEM_NOTIFICATION_ID, systemNotificationId) + dismissIntent.putExtra(KEY_DISMISS_RECORDING_URL, dismissRecordingUrl) + + val intentFlag: Int = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.S) { + PendingIntent.FLAG_MUTABLE or PendingIntent.FLAG_UPDATE_CURRENT + } else { + PendingIntent.FLAG_UPDATE_CURRENT + } + val dismissPendingIntent = PendingIntent.getBroadcast(context, systemNotificationId, dismissIntent, intentFlag) + + val dismissAction = NotificationCompat.Action.Builder(R.drawable.ic_delete, dismissLabel, dismissPendingIntent) + .setShowsUserInterface(false) + .setAllowGeneratedReplies(true) + .build() + notificationBuilder.addAction(dismissAction) + } + + @RequiresApi(api = Build.VERSION_CODES.N) + private fun addShareRecordingToChatAction( + notificationBuilder: NotificationCompat.Builder, + systemNotificationId: Int, + ncNotification: com.nextcloud.talk.models.json.notifications.Notification + ) { + var shareToChatLabel = "" + var shareToChatUrl = "" + + for (action in ncNotification.actions!!) { + if (action.primary) { + shareToChatLabel = action.label.orEmpty() + shareToChatUrl = action.link.orEmpty() + } + } + + val shareRecordingIntent = Intent(context, ShareRecordingToChatReceiver::class.java) + shareRecordingIntent.putExtra(KEY_SYSTEM_NOTIFICATION_ID, systemNotificationId) + shareRecordingIntent.putExtra(KEY_SHARE_RECORDING_TO_CHAT_URL, shareToChatUrl) + + val intentFlag: Int = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.S) { + PendingIntent.FLAG_MUTABLE or PendingIntent.FLAG_UPDATE_CURRENT + } else { + PendingIntent.FLAG_UPDATE_CURRENT + } + val shareRecordingPendingIntent = PendingIntent.getBroadcast( + context, + systemNotificationId, + shareRecordingIntent, + intentFlag + ) + + val shareRecordingAction = NotificationCompat.Action.Builder( + R.drawable.ic_delete, + shareToChatLabel, + shareRecordingPendingIntent + ) + .setShowsUserInterface(false) + .setAllowGeneratedReplies(true) + .build() + notificationBuilder.addAction(shareRecordingAction) + } @RequiresApi(api = Build.VERSION_CODES.N) private fun getStyle(person: Person, style: NotificationCompat.MessagingStyle?): NotificationCompat.MessagingStyle { diff --git a/app/src/main/java/com/nextcloud/talk/receivers/DismissRecordingAvailableReceiver.kt b/app/src/main/java/com/nextcloud/talk/receivers/DismissRecordingAvailableReceiver.kt new file mode 100644 index 000000000..8edea6242 --- /dev/null +++ b/app/src/main/java/com/nextcloud/talk/receivers/DismissRecordingAvailableReceiver.kt @@ -0,0 +1,109 @@ +/* + * Nextcloud Talk application + * + * @author Marcel Hibbe + * Copyright (C) 2022-2023 Marcel Hibbe + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +package com.nextcloud.talk.receivers + +import android.app.NotificationManager +import android.content.BroadcastReceiver +import android.content.Context +import android.content.Intent +import android.util.Log +import autodagger.AutoInjector +import com.nextcloud.talk.api.NcApi +import com.nextcloud.talk.application.NextcloudTalkApplication +import com.nextcloud.talk.data.user.model.User +import com.nextcloud.talk.models.json.generic.GenericOverall +import com.nextcloud.talk.users.UserManager +import com.nextcloud.talk.utils.ApiUtils +import com.nextcloud.talk.utils.bundle.BundleKeys +import com.nextcloud.talk.utils.bundle.BundleKeys.KEY_INTERNAL_USER_ID +import com.nextcloud.talk.utils.bundle.BundleKeys.KEY_SYSTEM_NOTIFICATION_ID +import io.reactivex.Observer +import io.reactivex.android.schedulers.AndroidSchedulers +import io.reactivex.disposables.Disposable +import io.reactivex.schedulers.Schedulers +import javax.inject.Inject + +@AutoInjector(NextcloudTalkApplication::class) +class DismissRecordingAvailableReceiver : BroadcastReceiver() { + + @Inject + lateinit var userManager: UserManager + + @Inject + lateinit var ncApi: NcApi + + lateinit var context: Context + lateinit var currentUser: User + private var systemNotificationId: Int? = null + private var link: String? = null + + init { + NextcloudTalkApplication.sharedApplication!!.componentApplication.inject(this) + } + + override fun onReceive(receiveContext: Context, intent: Intent?) { + context = receiveContext + + // NOTE - systemNotificationId is an internal ID used on the device only. + // It is NOT the same as the notification ID used in communication with the server. + systemNotificationId = intent!!.getIntExtra(KEY_SYSTEM_NOTIFICATION_ID, 0) + link = intent.getStringExtra(BundleKeys.KEY_DISMISS_RECORDING_URL) + + val id = intent.getLongExtra(KEY_INTERNAL_USER_ID, userManager.currentUser.blockingGet().id!!) + currentUser = userManager.getUserWithId(id).blockingGet() + + dismissNcRecordingAvailableNotification() + } + + private fun dismissNcRecordingAvailableNotification() { + val credentials = ApiUtils.getCredentials(currentUser.username, currentUser.token) + + 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) { + cancelNotification(systemNotificationId!!) + } + + override fun onError(e: Throwable) { + Log.e(TAG, "Failed to send dismiss for recording available", e) + } + + override fun onComplete() { + // unused atm + } + }) + } + + private fun cancelNotification(notificationId: Int) { + val notificationManager = context.getSystemService(Context.NOTIFICATION_SERVICE) as NotificationManager + notificationManager.cancel(notificationId) + } + + companion object { + private val TAG = DismissRecordingAvailableReceiver::class.java.simpleName + } +} diff --git a/app/src/main/java/com/nextcloud/talk/receivers/ShareRecordingToChatReceiver.kt b/app/src/main/java/com/nextcloud/talk/receivers/ShareRecordingToChatReceiver.kt new file mode 100644 index 000000000..b6b977b5d --- /dev/null +++ b/app/src/main/java/com/nextcloud/talk/receivers/ShareRecordingToChatReceiver.kt @@ -0,0 +1,109 @@ +/* + * Nextcloud Talk application + * + * @author Marcel Hibbe + * Copyright (C) 2022-2023 Marcel Hibbe + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +package com.nextcloud.talk.receivers + +import android.app.NotificationManager +import android.content.BroadcastReceiver +import android.content.Context +import android.content.Intent +import android.util.Log +import autodagger.AutoInjector +import com.nextcloud.talk.api.NcApi +import com.nextcloud.talk.application.NextcloudTalkApplication +import com.nextcloud.talk.data.user.model.User +import com.nextcloud.talk.models.json.generic.GenericOverall +import com.nextcloud.talk.users.UserManager +import com.nextcloud.talk.utils.ApiUtils +import com.nextcloud.talk.utils.bundle.BundleKeys +import com.nextcloud.talk.utils.bundle.BundleKeys.KEY_INTERNAL_USER_ID +import com.nextcloud.talk.utils.bundle.BundleKeys.KEY_SYSTEM_NOTIFICATION_ID +import io.reactivex.Observer +import io.reactivex.android.schedulers.AndroidSchedulers +import io.reactivex.disposables.Disposable +import io.reactivex.schedulers.Schedulers +import javax.inject.Inject + +@AutoInjector(NextcloudTalkApplication::class) +class ShareRecordingToChatReceiver : BroadcastReceiver() { + + @Inject + lateinit var userManager: UserManager + + @Inject + lateinit var ncApi: NcApi + + lateinit var context: Context + lateinit var currentUser: User + private var systemNotificationId: Int? = null + private var link: String? = null + + init { + NextcloudTalkApplication.sharedApplication!!.componentApplication.inject(this) + } + + override fun onReceive(receiveContext: Context, intent: Intent?) { + context = receiveContext + + // NOTE - systemNotificationId is an internal ID used on the device only. + // It is NOT the same as the notification ID used in communication with the server. + systemNotificationId = intent!!.getIntExtra(KEY_SYSTEM_NOTIFICATION_ID, 0) + link = intent.getStringExtra(BundleKeys.KEY_SHARE_RECORDING_TO_CHAT_URL) + + val id = intent.getLongExtra(KEY_INTERNAL_USER_ID, userManager.currentUser.blockingGet().id!!) + currentUser = userManager.getUserWithId(id).blockingGet() + + shareRecordingToChat() + } + + private fun shareRecordingToChat() { + val credentials = ApiUtils.getCredentials(currentUser.username, currentUser.token) + + 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) { + cancelNotification(systemNotificationId!!) + } + + override fun onError(e: Throwable) { + Log.e(TAG, "Failed to share recording to chat request", e) + } + + override fun onComplete() { + // unused atm + } + }) + } + + private fun cancelNotification(notificationId: Int) { + val notificationManager = context.getSystemService(Context.NOTIFICATION_SERVICE) as NotificationManager + notificationManager.cancel(notificationId) + } + + companion object { + private val TAG = ShareRecordingToChatReceiver::class.java.simpleName + } +} diff --git a/app/src/main/java/com/nextcloud/talk/utils/bundle/BundleKeys.kt b/app/src/main/java/com/nextcloud/talk/utils/bundle/BundleKeys.kt index 63c740bc8..efd7ee0df 100644 --- a/app/src/main/java/com/nextcloud/talk/utils/bundle/BundleKeys.kt +++ b/app/src/main/java/com/nextcloud/talk/utils/bundle/BundleKeys.kt @@ -82,6 +82,7 @@ object BundleKeys { const val KEY_IS_MODERATOR = "KEY_IS_MODERATOR" const val KEY_SWITCH_TO_ROOM_AND_START_CALL = "KEY_SWITCH_TO_ROOM_AND_START_CALL" const val KEY_IS_BREAKOUT_ROOM = "KEY_IS_BREAKOUT_ROOM" - const val KEY_NOTIFICATION_RECORDING_NOTIFICATION = "KEY_NOTIFICATION_RECORDING_NOTIFICATION" const val KEY_NOTIFICATION_RESTRICT_DELETION = "KEY_NOTIFICATION_RESTRICT_DELETION" + const val KEY_DISMISS_RECORDING_URL = "KEY_DISMISS_RECORDING_URL" + const val KEY_SHARE_RECORDING_TO_CHAT_URL = "KEY_SHARE_RECORDING_TO_CHAT_URL" } 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 deleted file mode 100644 index 915b4a60d..000000000 --- a/app/src/main/java/com/nextcloud/talk/utils/rx/SendCommonRequestUtil.kt +++ /dev/null @@ -1,60 +0,0 @@ -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 - } -}