Skip to content

Commit c6c1c32

Browse files
authored
Merge pull request #5303 from element-hq/feature/bma/5192.clenup
Improve management of shortcut ids.
2 parents d1b8f31 + 36b1b13 commit c6c1c32

File tree

4 files changed

+28
-5
lines changed

4 files changed

+28
-5
lines changed

libraries/push/impl/src/main/kotlin/io/element/android/libraries/push/impl/notifications/conversations/DefaultNotificationConversationService.kt

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,8 @@ import io.element.android.libraries.matrix.ui.media.InitialsAvatarBitmapGenerato
3333
import io.element.android.libraries.push.api.notifications.NotificationBitmapLoader
3434
import io.element.android.libraries.push.api.notifications.conversations.NotificationConversationService
3535
import io.element.android.libraries.push.impl.intent.IntentProvider
36+
import io.element.android.libraries.push.impl.notifications.shortcut.createShortcutId
37+
import io.element.android.libraries.push.impl.notifications.shortcut.filterBySession
3638
import io.element.android.libraries.sessionstorage.api.observer.SessionListener
3739
import io.element.android.libraries.sessionstorage.api.observer.SessionObserver
3840
import io.element.android.libraries.ui.strings.CommonStrings
@@ -106,7 +108,7 @@ class DefaultNotificationConversationService(
106108
.generateBitmap(defaultShortcutIconSize, AvatarData(id = roomId.value, name = roomName, size = AvatarSize.RoomHeader))
107109
?.let(IconCompat::createWithAdaptiveBitmap)
108110

109-
val shortcutInfo = ShortcutInfoCompat.Builder(context, "$sessionId-$roomId")
111+
val shortcutInfo = ShortcutInfoCompat.Builder(context, createShortcutId(sessionId, roomId))
110112
.setShortLabel(roomName)
111113
.setIcon(icon)
112114
.setIntent(intentProvider.getViewRoomIntent(sessionId, roomId, threadId = null))
@@ -127,7 +129,7 @@ class DefaultNotificationConversationService(
127129
}
128130

129131
override suspend fun onLeftRoom(sessionId: SessionId, roomId: RoomId) {
130-
val shortcutsToRemove = listOf("$sessionId-$roomId")
132+
val shortcutsToRemove = listOf(createShortcutId(sessionId, roomId))
131133
runCatchingExceptions {
132134
ShortcutManagerCompat.removeDynamicShortcuts(context, shortcutsToRemove)
133135
if (isRequestPinShortcutSupported) {
@@ -181,7 +183,7 @@ class DefaultNotificationConversationService(
181183
private fun onSessionLogOut(sessionId: SessionId) {
182184
runCatchingExceptions {
183185
val shortcuts = ShortcutManagerCompat.getDynamicShortcuts(context)
184-
val shortcutIdsToRemove = shortcuts.filter { it.id.startsWith(sessionId.value) }.map { it.id }
186+
val shortcutIdsToRemove = shortcuts.filterBySession(sessionId).map { it.id }
185187
ShortcutManagerCompat.removeDynamicShortcuts(context, shortcutIdsToRemove)
186188

187189
if (isRequestPinShortcutSupported) {

libraries/push/impl/src/main/kotlin/io/element/android/libraries/push/impl/notifications/factories/NotificationCreator.kt

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,7 @@ import io.element.android.libraries.push.impl.notifications.model.FallbackNotifi
4141
import io.element.android.libraries.push.impl.notifications.model.InviteNotifiableEvent
4242
import io.element.android.libraries.push.impl.notifications.model.NotifiableMessageEvent
4343
import io.element.android.libraries.push.impl.notifications.model.SimpleNotifiableEvent
44+
import io.element.android.libraries.push.impl.notifications.shortcut.createShortcutId
4445
import io.element.android.services.toolbox.api.strings.StringProvider
4546

4647
interface NotificationCreator {
@@ -140,7 +141,7 @@ class DefaultNotificationCreator(
140141
// Must match those created in the ShortcutInfoCompat.Builder()
141142
// for the notification to appear as a "Conversation":
142143
// https://developer.android.com/develop/ui/views/notifications/conversations
143-
.setShortcutId("${roomInfo.sessionId.value}-${roomInfo.roomId.value}")
144+
.setShortcutId(createShortcutId(roomInfo.sessionId, roomInfo.roomId))
144145
// Auto-bundling is enabled for 4 or more notifications on API 24+ (N+)
145146
// devices and all Wear devices. But we want a custom grouping, so we specify the groupID
146147
.setGroup(roomInfo.sessionId.value)
Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
/*
2+
* Copyright 2025 New Vector Ltd.
3+
*
4+
* SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial
5+
* Please see LICENSE files in the repository root for full details.
6+
*/
7+
8+
package io.element.android.libraries.push.impl.notifications.shortcut
9+
10+
import androidx.core.content.pm.ShortcutInfoCompat
11+
import io.element.android.libraries.matrix.api.core.RoomId
12+
import io.element.android.libraries.matrix.api.core.SessionId
13+
14+
internal fun createShortcutId(sessionId: SessionId, roomId: RoomId) = "$sessionId-$roomId"
15+
16+
internal fun Iterable<ShortcutInfoCompat>.filterBySession(sessionId: SessionId): Iterable<ShortcutInfoCompat> {
17+
val prefix = "$sessionId-"
18+
return filter { it.id.startsWith(prefix) }
19+
}

libraries/push/impl/src/test/kotlin/io/element/android/libraries/push/impl/notifications/conversations/DefaultNotificationConversationServiceTest.kt

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@ import io.element.android.libraries.matrix.test.A_SESSION_ID
2121
import io.element.android.libraries.matrix.test.A_SESSION_ID_2
2222
import io.element.android.libraries.matrix.test.FakeMatrixClientProvider
2323
import io.element.android.libraries.push.impl.notifications.factories.FakeIntentProvider
24+
import io.element.android.libraries.push.impl.notifications.shortcut.createShortcutId
2425
import io.element.android.libraries.push.test.notifications.FakeImageLoaderHolder
2526
import io.element.android.libraries.push.test.notifications.push.FakeNotificationBitmapLoader
2627
import io.element.android.libraries.sessionstorage.test.observer.FakeSessionObserver
@@ -58,7 +59,7 @@ class DefaultNotificationConversationServiceTest {
5859
val context = InstrumentationRegistry.getInstrumentation().context
5960
val service = createService(context)
6061

61-
val shortcutId = "$A_SESSION_ID-$A_ROOM_ID"
62+
val shortcutId = createShortcutId(A_SESSION_ID, A_ROOM_ID)
6263
val shortcutInfo = ShortcutInfoCompat.Builder(context, shortcutId)
6364
.setShortLabel("Room title")
6465
.setIntent(Intent(Intent.ACTION_VIEW))

0 commit comments

Comments
 (0)