From 4c10c8fdf9cb14b88c8bd8ad69e1c1c82b0204c0 Mon Sep 17 00:00:00 2001 From: Benoit Marty Date: Fri, 14 Apr 2023 17:26:01 +0200 Subject: [PATCH] Create PendingIntentFactory --- .../impl/notifications/NotificationUtils.kt | 93 +++------------- .../factories/PendingIntentFactory.kt | 100 ++++++++++++++++++ .../AcceptInvitationActionFactory.kt | 2 +- .../{ => action}/MarkAsReadActionFactory.kt | 2 +- .../{ => action}/QuickReplyActionFactory.kt | 2 +- .../RejectInvitationActionFactory.kt | 2 +- 6 files changed, 117 insertions(+), 84 deletions(-) create mode 100644 libraries/push/impl/src/main/kotlin/io/element/android/libraries/push/impl/notifications/factories/PendingIntentFactory.kt rename libraries/push/impl/src/main/kotlin/io/element/android/libraries/push/impl/notifications/factories/{ => action}/AcceptInvitationActionFactory.kt (99%) rename libraries/push/impl/src/main/kotlin/io/element/android/libraries/push/impl/notifications/factories/{ => action}/MarkAsReadActionFactory.kt (99%) rename libraries/push/impl/src/main/kotlin/io/element/android/libraries/push/impl/notifications/factories/{ => action}/QuickReplyActionFactory.kt (99%) rename libraries/push/impl/src/main/kotlin/io/element/android/libraries/push/impl/notifications/factories/{ => action}/RejectInvitationActionFactory.kt (99%) diff --git a/libraries/push/impl/src/main/kotlin/io/element/android/libraries/push/impl/notifications/NotificationUtils.kt b/libraries/push/impl/src/main/kotlin/io/element/android/libraries/push/impl/notifications/NotificationUtils.kt index 83bf1fb414..4d5ae8880f 100755 --- a/libraries/push/impl/src/main/kotlin/io/element/android/libraries/push/impl/notifications/NotificationUtils.kt +++ b/libraries/push/impl/src/main/kotlin/io/element/android/libraries/push/impl/notifications/NotificationUtils.kt @@ -24,9 +24,7 @@ import android.app.Activity import android.app.Notification import android.app.NotificationChannel import android.app.NotificationManager -import android.app.PendingIntent import android.content.Context -import android.content.Intent import android.content.pm.PackageManager import android.graphics.Bitmap import android.graphics.Canvas @@ -40,37 +38,31 @@ import androidx.core.content.ContextCompat import androidx.core.content.getSystemService import androidx.core.content.res.ResourcesCompat import io.element.android.libraries.androidutils.system.startNotificationChannelSettingsIntent -import io.element.android.libraries.androidutils.uri.createIgnoredUri import io.element.android.libraries.core.meta.BuildMeta import io.element.android.libraries.di.AppScope import io.element.android.libraries.di.ApplicationContext import io.element.android.libraries.di.SingleIn -import io.element.android.libraries.matrix.api.core.RoomId import io.element.android.libraries.matrix.api.core.SessionId import io.element.android.libraries.matrix.api.core.ThreadId import io.element.android.libraries.push.impl.R -import io.element.android.libraries.push.impl.intent.IntentProvider -import io.element.android.libraries.push.impl.notifications.factories.AcceptInvitationActionFactory -import io.element.android.libraries.push.impl.notifications.factories.MarkAsReadActionFactory -import io.element.android.libraries.push.impl.notifications.factories.QuickReplyActionFactory -import io.element.android.libraries.push.impl.notifications.factories.RejectInvitationActionFactory +import io.element.android.libraries.push.impl.notifications.factories.PendingIntentFactory +import io.element.android.libraries.push.impl.notifications.factories.action.AcceptInvitationActionFactory +import io.element.android.libraries.push.impl.notifications.factories.action.MarkAsReadActionFactory +import io.element.android.libraries.push.impl.notifications.factories.action.QuickReplyActionFactory +import io.element.android.libraries.push.impl.notifications.factories.action.RejectInvitationActionFactory import io.element.android.libraries.push.impl.notifications.model.InviteNotifiableEvent import io.element.android.libraries.push.impl.notifications.model.SimpleNotifiableEvent import io.element.android.services.toolbox.api.strings.StringProvider -import io.element.android.services.toolbox.api.systemclock.SystemClock import timber.log.Timber import javax.inject.Inject -// TODO EAx Split into factories @SingleIn(AppScope::class) class NotificationUtils @Inject constructor( @ApplicationContext private val context: Context, // private val vectorPreferences: VectorPreferences, private val stringProvider: StringProvider, - private val clock: SystemClock, - private val actionIds: NotificationActionIds, - private val intentProvider: IntentProvider, private val buildMeta: BuildMeta, + private val pendingIntentFactory: PendingIntentFactory, private val markAsReadActionFactory: MarkAsReadActionFactory, private val quickReplyActionFactory: QuickReplyActionFactory, private val rejectInvitationActionFactory: RejectInvitationActionFactory, @@ -237,9 +229,9 @@ class NotificationUtils @Inject constructor( threadId != null && true /** TODO EAx vectorPreferences.areThreadMessagesEnabled() */ - -> buildOpenThreadIntent(roomInfo, threadId) + -> pendingIntentFactory.createOpenThreadPendingIntent(roomInfo, threadId) - else -> buildOpenRoomIntent(roomInfo.sessionId, roomInfo.roomId) + else -> pendingIntentFactory.createOpenRoomPendingIntent(roomInfo.sessionId, roomInfo.roomId) } val smallIcon = R.drawable.ic_notification @@ -306,7 +298,7 @@ class NotificationUtils @Inject constructor( if (largeIcon != null) { setLargeIcon(largeIcon) } - setDeleteIntent(getDismissRoomPendingIntent(roomInfo.sessionId, roomInfo.roomId)) + setDeleteIntent(pendingIntentFactory.createDismissRoomPendingIntent(roomInfo.sessionId, roomInfo.roomId)) } .setTicker(tickerText) .build() @@ -351,7 +343,6 @@ class NotificationUtils @Inject constructor( vectorPreferences.getNotificationRingTone()?.let { setSound(it) } - */ setLights(accentColor, 500, 500) } else { @@ -379,7 +370,7 @@ class NotificationUtils @Inject constructor( .setSmallIcon(smallIcon) .setColor(accentColor) .setAutoCancel(true) - .setContentIntent(buildOpenRoomIntent(simpleNotifiableEvent.sessionId, simpleNotifiableEvent.roomId)) + .setContentIntent(pendingIntentFactory.createOpenRoomPendingIntent(simpleNotifiableEvent.sessionId, simpleNotifiableEvent.roomId)) .apply { if (simpleNotifiableEvent.noisy) { // Compat @@ -388,7 +379,6 @@ class NotificationUtils @Inject constructor( vectorPreferences.getNotificationRingTone()?.let { setSound(it) } - */ setLights(accentColor, 500, 500) } else { @@ -399,28 +389,6 @@ class NotificationUtils @Inject constructor( .build() } - private fun buildOpenSessionIntent(sessionId: SessionId): PendingIntent? { - return getPendingIntent(sessionId = sessionId, roomId = null, threadId = null) - } - - private fun buildOpenRoomIntent(sessionId: SessionId, roomId: RoomId): PendingIntent? { - return getPendingIntent(sessionId = sessionId, roomId = roomId, threadId = null) - } - - private fun buildOpenThreadIntent(roomInfo: RoomEventGroupInfo, threadId: ThreadId?): PendingIntent? { - return getPendingIntent(sessionId = roomInfo.sessionId, roomId = roomInfo.roomId, threadId = threadId) - } - - private fun getPendingIntent(sessionId: SessionId, roomId: RoomId?, threadId: ThreadId?): PendingIntent? { - val intent = intentProvider.getViewIntent(sessionId = sessionId, roomId = roomId, threadId = threadId) - return PendingIntent.getActivity( - context, - clock.epochMillis().toInt(), - intent, - PendingIntent.FLAG_UPDATE_CURRENT or PendingIntent.FLAG_IMMUTABLE - ) - } - /** * Build the summary notification. */ @@ -463,38 +431,11 @@ class NotificationUtils @Inject constructor( priority = NotificationCompat.PRIORITY_LOW } } - .setContentIntent(buildOpenSessionIntent(sessionId)) - .setDeleteIntent(getDismissSummaryPendingIntent(sessionId)) + .setContentIntent(pendingIntentFactory.createOpenSessionPendingIntent(sessionId)) + .setDeleteIntent(pendingIntentFactory.createDismissSummaryPendingIntent(sessionId)) .build() } - private fun getDismissSummaryPendingIntent(sessionId: SessionId): PendingIntent { - val intent = Intent(context, NotificationBroadcastReceiver::class.java) - intent.action = actionIds.dismissSummary - intent.data = createIgnoredUri("deleteSummary?${sessionId.value}") - intent.putExtra(NotificationBroadcastReceiver.KEY_SESSION_ID, sessionId) - return PendingIntent.getBroadcast( - context, - 0, - intent, - PendingIntent.FLAG_UPDATE_CURRENT or PendingIntent.FLAG_IMMUTABLE - ) - } - - private fun getDismissRoomPendingIntent(sessionId: SessionId, roomId: RoomId): PendingIntent { - val intent = Intent(context, NotificationBroadcastReceiver::class.java) - intent.action = actionIds.dismissRoom - intent.data = createIgnoredUri("deleteRoom?${sessionId.value}&${roomId.value}") - intent.putExtra(NotificationBroadcastReceiver.KEY_SESSION_ID, sessionId) - intent.putExtra(NotificationBroadcastReceiver.KEY_ROOM_ID, roomId) - return PendingIntent.getBroadcast( - context, - clock.epochMillis().toInt(), - intent, - PendingIntent.FLAG_UPDATE_CURRENT or PendingIntent.FLAG_IMMUTABLE - ) - } - /** * Cancel the foreground notification service. */ @@ -520,14 +461,6 @@ class NotificationUtils @Inject constructor( Timber.w("Not allowed to notify.") return } - val testActionIntent = Intent(context, TestNotificationReceiver::class.java) - testActionIntent.action = actionIds.diagnostic - val testPendingIntent = PendingIntent.getBroadcast( - context, - 0, - testActionIntent, - PendingIntent.FLAG_UPDATE_CURRENT or PendingIntent.FLAG_IMMUTABLE - ) notificationManager.notify( "DIAGNOSTIC", 888, @@ -540,7 +473,7 @@ class NotificationUtils @Inject constructor( .setPriority(NotificationCompat.PRIORITY_MAX) .setCategory(NotificationCompat.CATEGORY_STATUS) .setAutoCancel(true) - .setContentIntent(testPendingIntent) + .setContentIntent(pendingIntentFactory.createTestPendingIntent()) .build() ) } diff --git a/libraries/push/impl/src/main/kotlin/io/element/android/libraries/push/impl/notifications/factories/PendingIntentFactory.kt b/libraries/push/impl/src/main/kotlin/io/element/android/libraries/push/impl/notifications/factories/PendingIntentFactory.kt new file mode 100644 index 0000000000..ca662afe17 --- /dev/null +++ b/libraries/push/impl/src/main/kotlin/io/element/android/libraries/push/impl/notifications/factories/PendingIntentFactory.kt @@ -0,0 +1,100 @@ +/* + * Copyright (c) 2023 New Vector Ltd + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package io.element.android.libraries.push.impl.notifications.factories + +import android.app.PendingIntent +import android.content.Context +import android.content.Intent +import io.element.android.libraries.androidutils.uri.createIgnoredUri +import io.element.android.libraries.di.ApplicationContext +import io.element.android.libraries.matrix.api.core.RoomId +import io.element.android.libraries.matrix.api.core.SessionId +import io.element.android.libraries.matrix.api.core.ThreadId +import io.element.android.libraries.push.impl.intent.IntentProvider +import io.element.android.libraries.push.impl.notifications.NotificationActionIds +import io.element.android.libraries.push.impl.notifications.NotificationBroadcastReceiver +import io.element.android.libraries.push.impl.notifications.RoomEventGroupInfo +import io.element.android.libraries.push.impl.notifications.TestNotificationReceiver +import io.element.android.services.toolbox.api.systemclock.SystemClock +import javax.inject.Inject + +class PendingIntentFactory @Inject constructor( + @ApplicationContext private val context: Context, + private val intentProvider: IntentProvider, + private val clock: SystemClock, + private val actionIds: NotificationActionIds, +) { + fun createOpenSessionPendingIntent(sessionId: SessionId): PendingIntent? { + return createPendingIntent(sessionId = sessionId, roomId = null, threadId = null) + } + + fun createOpenRoomPendingIntent(sessionId: SessionId, roomId: RoomId): PendingIntent? { + return createPendingIntent(sessionId = sessionId, roomId = roomId, threadId = null) + } + + fun createOpenThreadPendingIntent(roomInfo: RoomEventGroupInfo, threadId: ThreadId?): PendingIntent? { + return createPendingIntent(sessionId = roomInfo.sessionId, roomId = roomInfo.roomId, threadId = threadId) + } + + private fun createPendingIntent(sessionId: SessionId, roomId: RoomId?, threadId: ThreadId?): PendingIntent? { + val intent = intentProvider.getViewIntent(sessionId = sessionId, roomId = roomId, threadId = threadId) + return PendingIntent.getActivity( + context, + clock.epochMillis().toInt(), + intent, + PendingIntent.FLAG_UPDATE_CURRENT or PendingIntent.FLAG_IMMUTABLE + ) + } + + fun createDismissSummaryPendingIntent(sessionId: SessionId): PendingIntent { + val intent = Intent(context, NotificationBroadcastReceiver::class.java) + intent.action = actionIds.dismissSummary + intent.data = createIgnoredUri("deleteSummary?${sessionId.value}") + intent.putExtra(NotificationBroadcastReceiver.KEY_SESSION_ID, sessionId) + return PendingIntent.getBroadcast( + context, + 0, + intent, + PendingIntent.FLAG_UPDATE_CURRENT or PendingIntent.FLAG_IMMUTABLE + ) + } + + fun createDismissRoomPendingIntent(sessionId: SessionId, roomId: RoomId): PendingIntent { + val intent = Intent(context, NotificationBroadcastReceiver::class.java) + intent.action = actionIds.dismissRoom + intent.data = createIgnoredUri("deleteRoom?${sessionId.value}&${roomId.value}") + intent.putExtra(NotificationBroadcastReceiver.KEY_SESSION_ID, sessionId) + intent.putExtra(NotificationBroadcastReceiver.KEY_ROOM_ID, roomId) + return PendingIntent.getBroadcast( + context, + clock.epochMillis().toInt(), + intent, + PendingIntent.FLAG_UPDATE_CURRENT or PendingIntent.FLAG_IMMUTABLE + ) + } + + fun createTestPendingIntent(): PendingIntent? { + val testActionIntent = Intent(context, TestNotificationReceiver::class.java) + testActionIntent.action = actionIds.diagnostic + return PendingIntent.getBroadcast( + context, + 0, + testActionIntent, + PendingIntent.FLAG_UPDATE_CURRENT or PendingIntent.FLAG_IMMUTABLE + ) + } +} diff --git a/libraries/push/impl/src/main/kotlin/io/element/android/libraries/push/impl/notifications/factories/AcceptInvitationActionFactory.kt b/libraries/push/impl/src/main/kotlin/io/element/android/libraries/push/impl/notifications/factories/action/AcceptInvitationActionFactory.kt similarity index 99% rename from libraries/push/impl/src/main/kotlin/io/element/android/libraries/push/impl/notifications/factories/AcceptInvitationActionFactory.kt rename to libraries/push/impl/src/main/kotlin/io/element/android/libraries/push/impl/notifications/factories/action/AcceptInvitationActionFactory.kt index e9be6aafb7..580c36c162 100644 --- a/libraries/push/impl/src/main/kotlin/io/element/android/libraries/push/impl/notifications/factories/AcceptInvitationActionFactory.kt +++ b/libraries/push/impl/src/main/kotlin/io/element/android/libraries/push/impl/notifications/factories/action/AcceptInvitationActionFactory.kt @@ -14,7 +14,7 @@ * limitations under the License. */ -package io.element.android.libraries.push.impl.notifications.factories +package io.element.android.libraries.push.impl.notifications.factories.action import android.app.PendingIntent import android.content.Context diff --git a/libraries/push/impl/src/main/kotlin/io/element/android/libraries/push/impl/notifications/factories/MarkAsReadActionFactory.kt b/libraries/push/impl/src/main/kotlin/io/element/android/libraries/push/impl/notifications/factories/action/MarkAsReadActionFactory.kt similarity index 99% rename from libraries/push/impl/src/main/kotlin/io/element/android/libraries/push/impl/notifications/factories/MarkAsReadActionFactory.kt rename to libraries/push/impl/src/main/kotlin/io/element/android/libraries/push/impl/notifications/factories/action/MarkAsReadActionFactory.kt index 52b01dd8f9..4a5e0aa7f3 100644 --- a/libraries/push/impl/src/main/kotlin/io/element/android/libraries/push/impl/notifications/factories/MarkAsReadActionFactory.kt +++ b/libraries/push/impl/src/main/kotlin/io/element/android/libraries/push/impl/notifications/factories/action/MarkAsReadActionFactory.kt @@ -14,7 +14,7 @@ * limitations under the License. */ -package io.element.android.libraries.push.impl.notifications.factories +package io.element.android.libraries.push.impl.notifications.factories.action import android.app.PendingIntent import android.content.Context diff --git a/libraries/push/impl/src/main/kotlin/io/element/android/libraries/push/impl/notifications/factories/QuickReplyActionFactory.kt b/libraries/push/impl/src/main/kotlin/io/element/android/libraries/push/impl/notifications/factories/action/QuickReplyActionFactory.kt similarity index 99% rename from libraries/push/impl/src/main/kotlin/io/element/android/libraries/push/impl/notifications/factories/QuickReplyActionFactory.kt rename to libraries/push/impl/src/main/kotlin/io/element/android/libraries/push/impl/notifications/factories/action/QuickReplyActionFactory.kt index 07e3053b4d..4f454f2855 100644 --- a/libraries/push/impl/src/main/kotlin/io/element/android/libraries/push/impl/notifications/factories/QuickReplyActionFactory.kt +++ b/libraries/push/impl/src/main/kotlin/io/element/android/libraries/push/impl/notifications/factories/action/QuickReplyActionFactory.kt @@ -14,7 +14,7 @@ * limitations under the License. */ -package io.element.android.libraries.push.impl.notifications.factories +package io.element.android.libraries.push.impl.notifications.factories.action import android.app.PendingIntent import android.content.Context diff --git a/libraries/push/impl/src/main/kotlin/io/element/android/libraries/push/impl/notifications/factories/RejectInvitationActionFactory.kt b/libraries/push/impl/src/main/kotlin/io/element/android/libraries/push/impl/notifications/factories/action/RejectInvitationActionFactory.kt similarity index 99% rename from libraries/push/impl/src/main/kotlin/io/element/android/libraries/push/impl/notifications/factories/RejectInvitationActionFactory.kt rename to libraries/push/impl/src/main/kotlin/io/element/android/libraries/push/impl/notifications/factories/action/RejectInvitationActionFactory.kt index b49115b4e5..b30297295e 100644 --- a/libraries/push/impl/src/main/kotlin/io/element/android/libraries/push/impl/notifications/factories/RejectInvitationActionFactory.kt +++ b/libraries/push/impl/src/main/kotlin/io/element/android/libraries/push/impl/notifications/factories/action/RejectInvitationActionFactory.kt @@ -14,7 +14,7 @@ * limitations under the License. */ -package io.element.android.libraries.push.impl.notifications.factories +package io.element.android.libraries.push.impl.notifications.factories.action import android.app.PendingIntent import android.content.Context