Create interface for NotifiableEventResolver

This commit is contained in:
Benoit Marty 2024-05-22 15:44:50 +02:00
parent 41403b7614
commit 839242d7bc
2 changed files with 35 additions and 31 deletions

View file

@ -55,7 +55,7 @@ import io.element.android.services.toolbox.api.systemclock.SystemClock
import timber.log.Timber import timber.log.Timber
import javax.inject.Inject import javax.inject.Inject
private val loggerTag = LoggerTag("NotifiableEventResolver", LoggerTag.NotificationLoggerTag) private val loggerTag = LoggerTag("DefaultNotifiableEventResolver", LoggerTag.NotificationLoggerTag)
/** /**
* The notifiable event resolver is able to create a NotifiableEvent (view model for notifications) from an sdk Event. * The notifiable event resolver is able to create a NotifiableEvent (view model for notifications) from an sdk Event.
@ -63,15 +63,19 @@ private val loggerTag = LoggerTag("NotifiableEventResolver", LoggerTag.Notificat
* The NotifiableEventResolver is the only aware of session/store, the NotificationDrawerManager has no knowledge of that, * The NotifiableEventResolver is the only aware of session/store, the NotificationDrawerManager has no knowledge of that,
* this pattern allow decoupling between the object responsible of displaying notifications and the matrix sdk. * this pattern allow decoupling between the object responsible of displaying notifications and the matrix sdk.
*/ */
class NotifiableEventResolver @Inject constructor( interface NotifiableEventResolver {
suspend fun resolveEvent(sessionId: SessionId, roomId: RoomId, eventId: EventId): NotifiableEvent?
}
class DefaultNotifiableEventResolver @Inject constructor(
private val stringProvider: StringProvider, private val stringProvider: StringProvider,
private val clock: SystemClock, private val clock: SystemClock,
private val matrixClientProvider: MatrixClientProvider, private val matrixClientProvider: MatrixClientProvider,
private val notificationMediaRepoFactory: NotificationMediaRepo.Factory, private val notificationMediaRepoFactory: NotificationMediaRepo.Factory,
@ApplicationContext private val context: Context, @ApplicationContext private val context: Context,
private val permalinkParser: PermalinkParser, private val permalinkParser: PermalinkParser,
) { ) : NotifiableEventResolver {
suspend fun resolveEvent(sessionId: SessionId, roomId: RoomId, eventId: EventId): NotifiableEvent? { override suspend fun resolveEvent(sessionId: SessionId, roomId: RoomId, eventId: EventId): NotifiableEvent? {
// Restore session // Restore session
val client = matrixClientProvider.getOrRestore(sessionId).getOrNull() ?: return null val client = matrixClientProvider.getOrRestore(sessionId).getOrNull() ?: return null
val notificationService = client.notificationService() val notificationService = client.notificationService()

View file

@ -59,17 +59,17 @@ import org.robolectric.RuntimeEnvironment
import org.robolectric.annotation.Config import org.robolectric.annotation.Config
@RunWith(RobolectricTestRunner::class) @RunWith(RobolectricTestRunner::class)
class NotifiableEventResolverTest { class DefaultNotifiableEventResolverTest {
@Test @Test
fun `resolve event no session`() = runTest { fun `resolve event no session`() = runTest {
val sut = createNotifiableEventResolver(notificationService = null) val sut = createDefaultNotifiableEventResolver(notificationService = null)
val result = sut.resolveEvent(A_SESSION_ID, A_ROOM_ID, AN_EVENT_ID) val result = sut.resolveEvent(A_SESSION_ID, A_ROOM_ID, AN_EVENT_ID)
assertThat(result).isNull() assertThat(result).isNull()
} }
@Test @Test
fun `resolve event failure`() = runTest { fun `resolve event failure`() = runTest {
val sut = createNotifiableEventResolver( val sut = createDefaultNotifiableEventResolver(
notificationResult = Result.failure(AN_EXCEPTION) notificationResult = Result.failure(AN_EXCEPTION)
) )
val result = sut.resolveEvent(A_SESSION_ID, A_ROOM_ID, AN_EVENT_ID) val result = sut.resolveEvent(A_SESSION_ID, A_ROOM_ID, AN_EVENT_ID)
@ -78,7 +78,7 @@ class NotifiableEventResolverTest {
@Test @Test
fun `resolve event null`() = runTest { fun `resolve event null`() = runTest {
val sut = createNotifiableEventResolver( val sut = createDefaultNotifiableEventResolver(
notificationResult = Result.success(null) notificationResult = Result.success(null)
) )
val result = sut.resolveEvent(A_SESSION_ID, A_ROOM_ID, AN_EVENT_ID) val result = sut.resolveEvent(A_SESSION_ID, A_ROOM_ID, AN_EVENT_ID)
@ -87,7 +87,7 @@ class NotifiableEventResolverTest {
@Test @Test
fun `resolve event message text`() = runTest { fun `resolve event message text`() = runTest {
val sut = createNotifiableEventResolver( val sut = createDefaultNotifiableEventResolver(
notificationResult = Result.success( notificationResult = Result.success(
createNotificationData( createNotificationData(
content = NotificationContent.MessageLike.RoomMessage( content = NotificationContent.MessageLike.RoomMessage(
@ -105,7 +105,7 @@ class NotifiableEventResolverTest {
@Test @Test
@Config(qualifiers = "en") @Config(qualifiers = "en")
fun `resolve event message with mention`() = runTest { fun `resolve event message with mention`() = runTest {
val sut = createNotifiableEventResolver( val sut = createDefaultNotifiableEventResolver(
notificationResult = Result.success( notificationResult = Result.success(
createNotificationData( createNotificationData(
content = NotificationContent.MessageLike.RoomMessage( content = NotificationContent.MessageLike.RoomMessage(
@ -123,7 +123,7 @@ class NotifiableEventResolverTest {
@Test @Test
fun `resolve HTML formatted event message text takes plain text version`() = runTest { fun `resolve HTML formatted event message text takes plain text version`() = runTest {
val sut = createNotifiableEventResolver( val sut = createDefaultNotifiableEventResolver(
notificationResult = Result.success( notificationResult = Result.success(
createNotificationData( createNotificationData(
content = NotificationContent.MessageLike.RoomMessage( content = NotificationContent.MessageLike.RoomMessage(
@ -146,7 +146,7 @@ class NotifiableEventResolverTest {
@Test @Test
fun `resolve incorrectly formatted event message text uses fallback`() = runTest { fun `resolve incorrectly formatted event message text uses fallback`() = runTest {
val sut = createNotifiableEventResolver( val sut = createDefaultNotifiableEventResolver(
notificationResult = Result.success( notificationResult = Result.success(
createNotificationData( createNotificationData(
content = NotificationContent.MessageLike.RoomMessage( content = NotificationContent.MessageLike.RoomMessage(
@ -169,7 +169,7 @@ class NotifiableEventResolverTest {
@Test @Test
fun `resolve event message audio`() = runTest { fun `resolve event message audio`() = runTest {
val sut = createNotifiableEventResolver( val sut = createDefaultNotifiableEventResolver(
notificationResult = Result.success( notificationResult = Result.success(
createNotificationData( createNotificationData(
content = NotificationContent.MessageLike.RoomMessage( content = NotificationContent.MessageLike.RoomMessage(
@ -186,7 +186,7 @@ class NotifiableEventResolverTest {
@Test @Test
fun `resolve event message video`() = runTest { fun `resolve event message video`() = runTest {
val sut = createNotifiableEventResolver( val sut = createDefaultNotifiableEventResolver(
notificationResult = Result.success( notificationResult = Result.success(
createNotificationData( createNotificationData(
content = NotificationContent.MessageLike.RoomMessage( content = NotificationContent.MessageLike.RoomMessage(
@ -203,7 +203,7 @@ class NotifiableEventResolverTest {
@Test @Test
fun `resolve event message voice`() = runTest { fun `resolve event message voice`() = runTest {
val sut = createNotifiableEventResolver( val sut = createDefaultNotifiableEventResolver(
notificationResult = Result.success( notificationResult = Result.success(
createNotificationData( createNotificationData(
content = NotificationContent.MessageLike.RoomMessage( content = NotificationContent.MessageLike.RoomMessage(
@ -220,7 +220,7 @@ class NotifiableEventResolverTest {
@Test @Test
fun `resolve event message image`() = runTest { fun `resolve event message image`() = runTest {
val sut = createNotifiableEventResolver( val sut = createDefaultNotifiableEventResolver(
notificationResult = Result.success( notificationResult = Result.success(
createNotificationData( createNotificationData(
content = NotificationContent.MessageLike.RoomMessage( content = NotificationContent.MessageLike.RoomMessage(
@ -237,7 +237,7 @@ class NotifiableEventResolverTest {
@Test @Test
fun `resolve event message sticker`() = runTest { fun `resolve event message sticker`() = runTest {
val sut = createNotifiableEventResolver( val sut = createDefaultNotifiableEventResolver(
notificationResult = Result.success( notificationResult = Result.success(
createNotificationData( createNotificationData(
content = NotificationContent.MessageLike.RoomMessage( content = NotificationContent.MessageLike.RoomMessage(
@ -254,7 +254,7 @@ class NotifiableEventResolverTest {
@Test @Test
fun `resolve event message file`() = runTest { fun `resolve event message file`() = runTest {
val sut = createNotifiableEventResolver( val sut = createDefaultNotifiableEventResolver(
notificationResult = Result.success( notificationResult = Result.success(
createNotificationData( createNotificationData(
content = NotificationContent.MessageLike.RoomMessage( content = NotificationContent.MessageLike.RoomMessage(
@ -271,7 +271,7 @@ class NotifiableEventResolverTest {
@Test @Test
fun `resolve event message location`() = runTest { fun `resolve event message location`() = runTest {
val sut = createNotifiableEventResolver( val sut = createDefaultNotifiableEventResolver(
notificationResult = Result.success( notificationResult = Result.success(
createNotificationData( createNotificationData(
content = NotificationContent.MessageLike.RoomMessage( content = NotificationContent.MessageLike.RoomMessage(
@ -288,7 +288,7 @@ class NotifiableEventResolverTest {
@Test @Test
fun `resolve event message notice`() = runTest { fun `resolve event message notice`() = runTest {
val sut = createNotifiableEventResolver( val sut = createDefaultNotifiableEventResolver(
notificationResult = Result.success( notificationResult = Result.success(
createNotificationData( createNotificationData(
content = NotificationContent.MessageLike.RoomMessage( content = NotificationContent.MessageLike.RoomMessage(
@ -305,7 +305,7 @@ class NotifiableEventResolverTest {
@Test @Test
fun `resolve event message emote`() = runTest { fun `resolve event message emote`() = runTest {
val sut = createNotifiableEventResolver( val sut = createDefaultNotifiableEventResolver(
notificationResult = Result.success( notificationResult = Result.success(
createNotificationData( createNotificationData(
content = NotificationContent.MessageLike.RoomMessage( content = NotificationContent.MessageLike.RoomMessage(
@ -322,7 +322,7 @@ class NotifiableEventResolverTest {
@Test @Test
fun `resolve poll`() = runTest { fun `resolve poll`() = runTest {
val sut = createNotifiableEventResolver( val sut = createDefaultNotifiableEventResolver(
notificationResult = Result.success( notificationResult = Result.success(
createNotificationData( createNotificationData(
content = NotificationContent.MessageLike.Poll( content = NotificationContent.MessageLike.Poll(
@ -339,7 +339,7 @@ class NotifiableEventResolverTest {
@Test @Test
fun `resolve RoomMemberContent invite room`() = runTest { fun `resolve RoomMemberContent invite room`() = runTest {
val sut = createNotifiableEventResolver( val sut = createDefaultNotifiableEventResolver(
notificationResult = Result.success( notificationResult = Result.success(
createNotificationData( createNotificationData(
content = NotificationContent.StateEvent.RoomMemberContent( content = NotificationContent.StateEvent.RoomMemberContent(
@ -372,7 +372,7 @@ class NotifiableEventResolverTest {
@Test @Test
fun `resolve RoomMemberContent invite direct`() = runTest { fun `resolve RoomMemberContent invite direct`() = runTest {
val sut = createNotifiableEventResolver( val sut = createDefaultNotifiableEventResolver(
notificationResult = Result.success( notificationResult = Result.success(
createNotificationData( createNotificationData(
content = NotificationContent.StateEvent.RoomMemberContent( content = NotificationContent.StateEvent.RoomMemberContent(
@ -405,7 +405,7 @@ class NotifiableEventResolverTest {
@Test @Test
fun `resolve RoomMemberContent other`() = runTest { fun `resolve RoomMemberContent other`() = runTest {
val sut = createNotifiableEventResolver( val sut = createDefaultNotifiableEventResolver(
notificationResult = Result.success( notificationResult = Result.success(
createNotificationData( createNotificationData(
content = NotificationContent.StateEvent.RoomMemberContent( content = NotificationContent.StateEvent.RoomMemberContent(
@ -421,7 +421,7 @@ class NotifiableEventResolverTest {
@Test @Test
fun `resolve RoomEncrypted`() = runTest { fun `resolve RoomEncrypted`() = runTest {
val sut = createNotifiableEventResolver( val sut = createDefaultNotifiableEventResolver(
notificationResult = Result.success( notificationResult = Result.success(
createNotificationData( createNotificationData(
content = NotificationContent.MessageLike.RoomEncrypted content = NotificationContent.MessageLike.RoomEncrypted
@ -445,7 +445,7 @@ class NotifiableEventResolverTest {
@Test @Test
fun `resolve CallInvite`() = runTest { fun `resolve CallInvite`() = runTest {
val sut = createNotifiableEventResolver( val sut = createDefaultNotifiableEventResolver(
notificationResult = Result.success( notificationResult = Result.success(
createNotificationData( createNotificationData(
content = NotificationContent.MessageLike.CallInvite(A_USER_ID_2) content = NotificationContent.MessageLike.CallInvite(A_USER_ID_2)
@ -517,7 +517,7 @@ class NotifiableEventResolverTest {
} }
private fun testNull(content: NotificationContent) = runTest { private fun testNull(content: NotificationContent) = runTest {
val sut = createNotifiableEventResolver( val sut = createDefaultNotifiableEventResolver(
notificationResult = Result.success( notificationResult = Result.success(
createNotificationData( createNotificationData(
content = content content = content
@ -528,10 +528,10 @@ class NotifiableEventResolverTest {
assertThat(result).isNull() assertThat(result).isNull()
} }
private fun createNotifiableEventResolver( private fun createDefaultNotifiableEventResolver(
notificationService: FakeNotificationService? = FakeNotificationService(), notificationService: FakeNotificationService? = FakeNotificationService(),
notificationResult: Result<NotificationData?> = Result.success(null), notificationResult: Result<NotificationData?> = Result.success(null),
): NotifiableEventResolver { ): DefaultNotifiableEventResolver {
val context = RuntimeEnvironment.getApplication() as Context val context = RuntimeEnvironment.getApplication() as Context
notificationService?.givenGetNotificationResult(notificationResult) notificationService?.givenGetNotificationResult(notificationResult)
val matrixClientProvider = FakeMatrixClientProvider(getClient = { val matrixClientProvider = FakeMatrixClientProvider(getClient = {
@ -544,7 +544,7 @@ class NotifiableEventResolverTest {
val notificationMediaRepoFactory = NotificationMediaRepo.Factory { val notificationMediaRepoFactory = NotificationMediaRepo.Factory {
FakeNotificationMediaRepo() FakeNotificationMediaRepo()
} }
return NotifiableEventResolver( return DefaultNotifiableEventResolver(
stringProvider = AndroidStringProvider(context.resources), stringProvider = AndroidStringProvider(context.resources),
clock = FakeSystemClock(), clock = FakeSystemClock(),
matrixClientProvider = matrixClientProvider, matrixClientProvider = matrixClientProvider,