diff --git a/app/src/main/kotlin/app/dapk/st/graph/AppModule.kt b/app/src/main/kotlin/app/dapk/st/graph/AppModule.kt index 7c58486..29abfe9 100644 --- a/app/src/main/kotlin/app/dapk/st/graph/AppModule.kt +++ b/app/src/main/kotlin/app/dapk/st/graph/AppModule.kt @@ -191,6 +191,7 @@ internal class FeatureModules internal constructor( context, base64, imageContentReader, + storeModule.value.messageStore(), ) } val homeModule by unsafeLazy { HomeModule(storeModule.value, matrixModules.profile, matrixModules.sync, buildMeta) } @@ -206,6 +207,7 @@ internal class FeatureModules internal constructor( coroutineDispatchers, coreAndroidModule.themeStore(), storeModule.value.loggingStore(), + storeModule.value.messageStore(), ) } val profileModule by unsafeLazy { ProfileModule(matrixModules.profile, matrixModules.sync, matrixModules.room, trackingModule.errorTracker) } diff --git a/domains/store/build.gradle b/domains/store/build.gradle index 7b6db9a..79da21b 100644 --- a/domains/store/build.gradle +++ b/domains/store/build.gradle @@ -25,4 +25,5 @@ dependencies { implementation "com.squareup.sqldelight:coroutines-extensions:1.5.3" kotlinFixtures(it) -} \ No newline at end of file + testImplementation(testFixtures(project(":core"))) + testFixturesImplementation(testFixtures(project(":core")))} \ No newline at end of file diff --git a/domains/store/src/main/kotlin/app/dapk/st/domain/StoreModule.kt b/domains/store/src/main/kotlin/app/dapk/st/domain/StoreModule.kt index 427ac9c..aa8b1ef 100644 --- a/domains/store/src/main/kotlin/app/dapk/st/domain/StoreModule.kt +++ b/domains/store/src/main/kotlin/app/dapk/st/domain/StoreModule.kt @@ -5,8 +5,9 @@ import app.dapk.st.core.CoroutineDispatchers import app.dapk.st.core.Preferences import app.dapk.st.core.extensions.ErrorTracker import app.dapk.st.core.extensions.unsafeLazy -import app.dapk.st.domain.eventlog.EventLogPersistence -import app.dapk.st.domain.eventlog.LoggingStore +import app.dapk.st.domain.application.eventlog.EventLogPersistence +import app.dapk.st.domain.application.eventlog.LoggingStore +import app.dapk.st.domain.application.message.MessageOptionsStore import app.dapk.st.domain.localecho.LocalEchoPersistence import app.dapk.st.domain.preference.CachingPreferences import app.dapk.st.domain.preference.PropertyCache @@ -65,6 +66,8 @@ class StoreModule( fun loggingStore(): LoggingStore = LoggingStore(cachingPreferences) + fun messageStore(): MessageOptionsStore = MessageOptionsStore(cachingPreferences) + fun memberStore(): MemberStore { return MemberPersistence(database, coroutineDispatchers) } diff --git a/domains/store/src/main/kotlin/app/dapk/st/domain/eventlog/EventLogPersistence.kt b/domains/store/src/main/kotlin/app/dapk/st/domain/application/eventlog/EventLogPersistence.kt similarity index 97% rename from domains/store/src/main/kotlin/app/dapk/st/domain/eventlog/EventLogPersistence.kt rename to domains/store/src/main/kotlin/app/dapk/st/domain/application/eventlog/EventLogPersistence.kt index 4cd41ec..718e34a 100644 --- a/domains/store/src/main/kotlin/app/dapk/st/domain/eventlog/EventLogPersistence.kt +++ b/domains/store/src/main/kotlin/app/dapk/st/domain/application/eventlog/EventLogPersistence.kt @@ -1,4 +1,4 @@ -package app.dapk.st.domain.eventlog +package app.dapk.st.domain.application.eventlog import app.dapk.db.DapkDb import app.dapk.st.core.CoroutineDispatchers diff --git a/domains/store/src/main/kotlin/app/dapk/st/domain/eventlog/LoggingStore.kt b/domains/store/src/main/kotlin/app/dapk/st/domain/application/eventlog/LoggingStore.kt similarity index 90% rename from domains/store/src/main/kotlin/app/dapk/st/domain/eventlog/LoggingStore.kt rename to domains/store/src/main/kotlin/app/dapk/st/domain/application/eventlog/LoggingStore.kt index 2b9299a..a4b4f22 100644 --- a/domains/store/src/main/kotlin/app/dapk/st/domain/eventlog/LoggingStore.kt +++ b/domains/store/src/main/kotlin/app/dapk/st/domain/application/eventlog/LoggingStore.kt @@ -1,4 +1,4 @@ -package app.dapk.st.domain.eventlog +package app.dapk.st.domain.application.eventlog import app.dapk.st.core.CachedPreferences import app.dapk.st.core.readBoolean diff --git a/domains/store/src/main/kotlin/app/dapk/st/domain/application/message/MessageOptionsStore.kt b/domains/store/src/main/kotlin/app/dapk/st/domain/application/message/MessageOptionsStore.kt new file mode 100644 index 0000000..bf4584d --- /dev/null +++ b/domains/store/src/main/kotlin/app/dapk/st/domain/application/message/MessageOptionsStore.kt @@ -0,0 +1,17 @@ +package app.dapk.st.domain.application.message + +import app.dapk.st.core.CachedPreferences +import app.dapk.st.core.readBoolean +import app.dapk.st.core.store + +private const val KEY_READ_RECEIPTS_DISABLED = "key_read_receipts_disabled" + +class MessageOptionsStore(private val cachedPreferences: CachedPreferences) { + + suspend fun isReadReceiptsDisabled() = cachedPreferences.readBoolean(KEY_READ_RECEIPTS_DISABLED, defaultValue = true) + + suspend fun setReadReceiptsDisabled(isDisabled: Boolean) { + cachedPreferences.store(KEY_READ_RECEIPTS_DISABLED, isDisabled) + } + +} \ No newline at end of file diff --git a/features/settings/src/test/kotlin/app/dapk/st/settings/FakeLoggingStore.kt b/domains/store/src/testFixtures/kotlin/fake/FakeLoggingStore.kt similarity index 74% rename from features/settings/src/test/kotlin/app/dapk/st/settings/FakeLoggingStore.kt rename to domains/store/src/testFixtures/kotlin/fake/FakeLoggingStore.kt index 6a3595f..78cc176 100644 --- a/features/settings/src/test/kotlin/app/dapk/st/settings/FakeLoggingStore.kt +++ b/domains/store/src/testFixtures/kotlin/fake/FakeLoggingStore.kt @@ -1,6 +1,6 @@ -package app.dapk.st.settings +package fake -import app.dapk.st.domain.eventlog.LoggingStore +import app.dapk.st.domain.application.eventlog.LoggingStore import io.mockk.coEvery import io.mockk.mockk import test.delegateReturn @@ -9,4 +9,4 @@ class FakeLoggingStore { val instance = mockk() fun givenLoggingIsEnabled() = coEvery { instance.isEnabled() }.delegateReturn() -} \ No newline at end of file +} diff --git a/domains/store/src/testFixtures/kotlin/fake/FakeMessageOptionsStore.kt b/domains/store/src/testFixtures/kotlin/fake/FakeMessageOptionsStore.kt new file mode 100644 index 0000000..d9ad43e --- /dev/null +++ b/domains/store/src/testFixtures/kotlin/fake/FakeMessageOptionsStore.kt @@ -0,0 +1,12 @@ +package fake + +import app.dapk.st.domain.application.message.MessageOptionsStore +import io.mockk.coEvery +import io.mockk.mockk +import test.delegateReturn + +class FakeMessageOptionsStore { + val instance = mockk() + + fun givenReadReceiptsDisabled() = coEvery { instance.isReadReceiptsDisabled() }.delegateReturn() +} \ No newline at end of file diff --git a/domains/store/src/testFixtures/kotlin/fixture/FakeStoreCleaner.kt b/domains/store/src/testFixtures/kotlin/fake/FakeStoreCleaner.kt similarity index 87% rename from domains/store/src/testFixtures/kotlin/fixture/FakeStoreCleaner.kt rename to domains/store/src/testFixtures/kotlin/fake/FakeStoreCleaner.kt index 19ac519..ea2c635 100644 --- a/domains/store/src/testFixtures/kotlin/fixture/FakeStoreCleaner.kt +++ b/domains/store/src/testFixtures/kotlin/fake/FakeStoreCleaner.kt @@ -1,4 +1,4 @@ -package fixture +package fake import app.dapk.st.domain.StoreCleaner import io.mockk.mockk diff --git a/features/messenger/build.gradle b/features/messenger/build.gradle index e5686f7..9d31472 100644 --- a/features/messenger/build.gradle +++ b/features/messenger/build.gradle @@ -8,6 +8,7 @@ dependencies { implementation project(":matrix:services:room") implementation project(":domains:android:compose-core") implementation project(":domains:android:viewmodel") + implementation project(":domains:store") implementation project(":core") implementation project(":features:navigator") implementation project(":design-library") diff --git a/features/messenger/src/main/kotlin/app/dapk/st/messenger/MessengerModule.kt b/features/messenger/src/main/kotlin/app/dapk/st/messenger/MessengerModule.kt index 4caff56..9b48609 100644 --- a/features/messenger/src/main/kotlin/app/dapk/st/messenger/MessengerModule.kt +++ b/features/messenger/src/main/kotlin/app/dapk/st/messenger/MessengerModule.kt @@ -3,6 +3,7 @@ package app.dapk.st.messenger import android.content.Context import app.dapk.st.core.Base64 import app.dapk.st.core.ProvidableModule +import app.dapk.st.domain.application.message.MessageOptionsStore import app.dapk.st.matrix.common.CredentialsStore import app.dapk.st.matrix.common.RoomId import app.dapk.st.matrix.message.MessageService @@ -22,10 +23,21 @@ class MessengerModule( private val context: Context, private val base64: Base64, private val imageMetaReader: ImageContentReader, + private val messageOptionsStore: MessageOptionsStore, ) : ProvidableModule { internal fun messengerViewModel(): MessengerViewModel { - return MessengerViewModel(messageService, roomService, roomStore, credentialsStore, timelineUseCase(), LocalIdFactory(), imageMetaReader, clock) + return MessengerViewModel( + messageService, + roomService, + roomStore, + credentialsStore, + timelineUseCase(), + LocalIdFactory(), + imageMetaReader, + messageOptionsStore, + clock + ) } private fun timelineUseCase(): TimelineUseCaseImpl { diff --git a/features/messenger/src/main/kotlin/app/dapk/st/messenger/MessengerViewModel.kt b/features/messenger/src/main/kotlin/app/dapk/st/messenger/MessengerViewModel.kt index 95dc503..d780da5 100644 --- a/features/messenger/src/main/kotlin/app/dapk/st/messenger/MessengerViewModel.kt +++ b/features/messenger/src/main/kotlin/app/dapk/st/messenger/MessengerViewModel.kt @@ -3,6 +3,7 @@ package app.dapk.st.messenger import androidx.lifecycle.viewModelScope import app.dapk.st.core.Lce import app.dapk.st.core.extensions.takeIfContent +import app.dapk.st.domain.application.message.MessageOptionsStore import app.dapk.st.matrix.common.CredentialsStore import app.dapk.st.matrix.common.EventId import app.dapk.st.matrix.common.RoomId @@ -30,6 +31,7 @@ internal class MessengerViewModel( private val observeTimeline: ObserveTimelineUseCase, private val localIdFactory: LocalIdFactory, private val imageContentReader: ImageContentReader, + private val messageOptionsStore: MessageOptionsStore, private val clock: Clock, factory: MutableStateFactory = defaultStateFactory(), ) : DapkViewModel( @@ -101,7 +103,7 @@ internal class MessengerViewModel( private fun CoroutineScope.updateRoomReadStateAsync(latestReadEvent: EventId, state: MessengerState): Deferred { return async { runCatching { - roomService.markFullyRead(state.roomState.roomOverview.roomId, latestReadEvent, isPrivate = true) + roomService.markFullyRead(state.roomState.roomOverview.roomId, latestReadEvent, isPrivate = messageOptionsStore.isReadReceiptsDisabled()) roomStore.markRead(state.roomState.roomOverview.roomId) } } diff --git a/features/messenger/src/test/kotlin/app/dapk/st/messenger/MessengerViewModelTest.kt b/features/messenger/src/test/kotlin/app/dapk/st/messenger/MessengerViewModelTest.kt index 5162a2a..e2449e3 100644 --- a/features/messenger/src/test/kotlin/app/dapk/st/messenger/MessengerViewModelTest.kt +++ b/features/messenger/src/test/kotlin/app/dapk/st/messenger/MessengerViewModelTest.kt @@ -11,6 +11,7 @@ import app.dapk.st.matrix.room.RoomService import app.dapk.st.matrix.sync.RoomState import app.dapk.st.matrix.sync.SyncService import fake.FakeCredentialsStore +import fake.FakeMessageOptionsStore import fake.FakeRoomStore import fixture.* import internalfake.FakeLocalIdFactory @@ -25,6 +26,7 @@ import java.time.Instant import java.time.ZoneOffset private const val A_CURRENT_TIMESTAMP = 10000L +private const val READ_RECEIPTS_ARE_DISABLED = true private val A_ROOM_ID = aRoomId("messenger state room id") private const val A_MESSAGE_CONTENT = "message content" private const val A_LOCAL_ID = "local.1111-2222-3333" @@ -40,6 +42,7 @@ class MessengerViewModelTest { private val fakeRoomStore = FakeRoomStore() private val fakeCredentialsStore = FakeCredentialsStore().also { it.givenCredentials().returns(aUserCredentials(userId = A_SELF_ID)) } private val fakeObserveTimelineUseCase = FakeObserveTimelineUseCase() + private val fakeMessageOptionsStore = FakeMessageOptionsStore() private val viewModel = MessengerViewModel( fakeMessageService, @@ -49,6 +52,7 @@ class MessengerViewModelTest { fakeObserveTimelineUseCase, localIdFactory = FakeLocalIdFactory().also { it.givenCreate().returns(A_LOCAL_ID) }.instance, imageContentReader = FakeImageContentReader(), + messageOptionsStore = fakeMessageOptionsStore.instance, clock = fixedClock(A_CURRENT_TIMESTAMP), factory = runViewModelTest.testMutableStateFactory(), ) @@ -68,8 +72,9 @@ class MessengerViewModelTest { @Test fun `given timeline emits state, when starting, then updates state and marks room and events as read`() = runViewModelTest { + fakeMessageOptionsStore.givenReadReceiptsDisabled().returns(READ_RECEIPTS_ARE_DISABLED) fakeRoomStore.expectUnit(times = 2) { it.markRead(A_ROOM_ID) } - fakeRoomService.expectUnit { it.markFullyRead(A_ROOM_ID, AN_EVENT_ID, isPrivate = true) } + fakeRoomService.expectUnit { it.markFullyRead(A_ROOM_ID, AN_EVENT_ID, isPrivate = READ_RECEIPTS_ARE_DISABLED) } val state = aMessengerStateWithEvent(AN_EVENT_ID, A_SELF_ID) fakeObserveTimelineUseCase.given(A_ROOM_ID, A_SELF_ID).returns(flowOf(state)) @@ -153,4 +158,4 @@ class FakeRoomService : RoomService by mockk() { fun fixedClock(timestamp: Long = 0) = Clock.fixed(Instant.ofEpochMilli(timestamp), ZoneOffset.UTC) -class FakeImageContentReader: ImageContentReader by mockk() \ No newline at end of file +class FakeImageContentReader : ImageContentReader by mockk() \ No newline at end of file diff --git a/features/settings/src/main/kotlin/app/dapk/st/settings/SettingsItemFactory.kt b/features/settings/src/main/kotlin/app/dapk/st/settings/SettingsItemFactory.kt index 8919eb9..d054e64 100644 --- a/features/settings/src/main/kotlin/app/dapk/st/settings/SettingsItemFactory.kt +++ b/features/settings/src/main/kotlin/app/dapk/st/settings/SettingsItemFactory.kt @@ -4,7 +4,8 @@ import app.dapk.st.core.BuildMeta import app.dapk.st.core.DeviceMeta import app.dapk.st.core.ThemeStore import app.dapk.st.core.isAtLeastS -import app.dapk.st.domain.eventlog.LoggingStore +import app.dapk.st.domain.application.eventlog.LoggingStore +import app.dapk.st.domain.application.message.MessageOptionsStore import app.dapk.st.push.PushTokenRegistrars internal class SettingsItemFactory( @@ -13,6 +14,7 @@ internal class SettingsItemFactory( private val pushTokenRegistrars: PushTokenRegistrars, private val themeStore: ThemeStore, private val loggingStore: LoggingStore, + private val messageOptionsStore: MessageOptionsStore, ) { suspend fun root() = general() + theme() + data() + account() + advanced() + about() @@ -44,6 +46,12 @@ internal class SettingsItemFactory( val loggingIsEnabled = loggingStore.isEnabled() return listOf( SettingItem.Header("Advanced"), + SettingItem.Toggle( + SettingItem.Id.ToggleSendReadReceipts, + "Don't send message read receipts", + subtitle = "Requires the Homeserver to be running Synapse 1.65+", + state = messageOptionsStore.isReadReceiptsDisabled() + ), SettingItem.Toggle(SettingItem.Id.ToggleEnableLogs, "Enable local logging", state = loggingIsEnabled), SettingItem.Text(SettingItem.Id.EventLog, "Event log", enabled = loggingIsEnabled), ) diff --git a/features/settings/src/main/kotlin/app/dapk/st/settings/SettingsModule.kt b/features/settings/src/main/kotlin/app/dapk/st/settings/SettingsModule.kt index 380cbdd..a0c695a 100644 --- a/features/settings/src/main/kotlin/app/dapk/st/settings/SettingsModule.kt +++ b/features/settings/src/main/kotlin/app/dapk/st/settings/SettingsModule.kt @@ -3,7 +3,8 @@ package app.dapk.st.settings import android.content.ContentResolver import app.dapk.st.core.* import app.dapk.st.domain.StoreModule -import app.dapk.st.domain.eventlog.LoggingStore +import app.dapk.st.domain.application.eventlog.LoggingStore +import app.dapk.st.domain.application.message.MessageOptionsStore import app.dapk.st.matrix.crypto.CryptoService import app.dapk.st.matrix.sync.SyncService import app.dapk.st.push.PushModule @@ -20,6 +21,7 @@ class SettingsModule( private val coroutineDispatchers: CoroutineDispatchers, private val themeStore: ThemeStore, private val loggingStore: LoggingStore, + private val messageOptionsStore: MessageOptionsStore, ) : ProvidableModule { internal fun settingsViewModel(): SettingsViewModel { @@ -29,10 +31,11 @@ class SettingsModule( cryptoService, syncService, UriFilenameResolver(contentResolver, coroutineDispatchers), - SettingsItemFactory(buildMeta, deviceMeta, pushModule.pushTokenRegistrars(), themeStore, loggingStore), + SettingsItemFactory(buildMeta, deviceMeta, pushModule.pushTokenRegistrars(), themeStore, loggingStore, messageOptionsStore), pushModule.pushTokenRegistrars(), themeStore, loggingStore, + messageOptionsStore, ) } diff --git a/features/settings/src/main/kotlin/app/dapk/st/settings/SettingsState.kt b/features/settings/src/main/kotlin/app/dapk/st/settings/SettingsState.kt index 5dd8144..0c73de2 100644 --- a/features/settings/src/main/kotlin/app/dapk/st/settings/SettingsState.kt +++ b/features/settings/src/main/kotlin/app/dapk/st/settings/SettingsState.kt @@ -44,7 +44,7 @@ internal sealed interface SettingItem { data class Header(val label: String, override val id: Id = Id.Ignored) : SettingItem data class Text(override val id: Id, val content: String, val subtitle: String? = null, val enabled: Boolean = true) : SettingItem - data class Toggle(override val id: Id, val content: String, val state: Boolean) : SettingItem + data class Toggle(override val id: Id, val content: String, val subtitle: String? = null, val state: Boolean) : SettingItem data class AccessToken(override val id: Id, val content: String, val accessToken: String) : SettingItem enum class Id { @@ -58,6 +58,7 @@ internal sealed interface SettingItem { Ignored, ToggleDynamicTheme, ToggleEnableLogs, + ToggleSendReadReceipts, } } diff --git a/features/settings/src/main/kotlin/app/dapk/st/settings/SettingsViewModel.kt b/features/settings/src/main/kotlin/app/dapk/st/settings/SettingsViewModel.kt index a952c75..2956d62 100644 --- a/features/settings/src/main/kotlin/app/dapk/st/settings/SettingsViewModel.kt +++ b/features/settings/src/main/kotlin/app/dapk/st/settings/SettingsViewModel.kt @@ -7,7 +7,8 @@ import app.dapk.st.core.Lce import app.dapk.st.core.ThemeStore import app.dapk.st.design.components.SpiderPage import app.dapk.st.domain.StoreCleaner -import app.dapk.st.domain.eventlog.LoggingStore +import app.dapk.st.domain.application.eventlog.LoggingStore +import app.dapk.st.domain.application.message.MessageOptionsStore import app.dapk.st.matrix.crypto.CryptoService import app.dapk.st.matrix.crypto.ImportResult import app.dapk.st.matrix.sync.SyncService @@ -34,6 +35,7 @@ internal class SettingsViewModel( private val pushTokenRegistrars: PushTokenRegistrars, private val themeStore: ThemeStore, private val loggingStore: LoggingStore, + private val messageOptionsStore: MessageOptionsStore, factory: MutableStateFactory = defaultStateFactory(), ) : DapkViewModel( initialState = SettingsScreenState(SpiderPage(Page.Routes.root, "Settings", null, Page.Root(Lce.Loading()))), @@ -104,6 +106,10 @@ internal class SettingsViewModel( loggingStore.setEnabled(!loggingStore.isEnabled()) refreshRoot() } + + ToggleSendReadReceipts -> viewModelScope.launch { + messageOptionsStore.setReadReceiptsDisabled(!messageOptionsStore.isReadReceiptsDisabled()) + } } } diff --git a/features/settings/src/main/kotlin/app/dapk/st/settings/eventlogger/EventLoggerState.kt b/features/settings/src/main/kotlin/app/dapk/st/settings/eventlogger/EventLoggerState.kt index 60bf449..08a28ef 100644 --- a/features/settings/src/main/kotlin/app/dapk/st/settings/eventlogger/EventLoggerState.kt +++ b/features/settings/src/main/kotlin/app/dapk/st/settings/eventlogger/EventLoggerState.kt @@ -1,7 +1,7 @@ package app.dapk.st.settings.eventlogger import app.dapk.st.core.Lce -import app.dapk.st.domain.eventlog.LogLine +import app.dapk.st.domain.application.eventlog.LogLine data class EventLoggerState( val logs: Lce>, diff --git a/features/settings/src/main/kotlin/app/dapk/st/settings/eventlogger/EventLoggerViewModel.kt b/features/settings/src/main/kotlin/app/dapk/st/settings/eventlogger/EventLoggerViewModel.kt index b85e057..aa9d6af 100644 --- a/features/settings/src/main/kotlin/app/dapk/st/settings/eventlogger/EventLoggerViewModel.kt +++ b/features/settings/src/main/kotlin/app/dapk/st/settings/eventlogger/EventLoggerViewModel.kt @@ -2,7 +2,7 @@ package app.dapk.st.settings.eventlogger import androidx.lifecycle.viewModelScope import app.dapk.st.core.Lce -import app.dapk.st.domain.eventlog.EventLogPersistence +import app.dapk.st.domain.application.eventlog.EventLogPersistence import app.dapk.st.viewmodel.DapkViewModel import kotlinx.coroutines.Job import kotlinx.coroutines.flow.collect diff --git a/features/settings/src/test/kotlin/app/dapk/st/settings/SettingsItemFactoryTest.kt b/features/settings/src/test/kotlin/app/dapk/st/settings/SettingsItemFactoryTest.kt index 7216731..46a1620 100644 --- a/features/settings/src/test/kotlin/app/dapk/st/settings/SettingsItemFactoryTest.kt +++ b/features/settings/src/test/kotlin/app/dapk/st/settings/SettingsItemFactoryTest.kt @@ -4,6 +4,8 @@ import app.dapk.st.core.BuildMeta import app.dapk.st.core.DeviceMeta import app.dapk.st.push.PushTokenRegistrars import app.dapk.st.push.Registrar +import fake.FakeLoggingStore +import fake.FakeMessageOptionsStore import internalfixture.aSettingHeaderItem import internalfixture.aSettingTextItem import io.mockk.coEvery @@ -16,6 +18,7 @@ import test.delegateReturn private val A_SELECTION = Registrar("A_SELECTION") private const val ENABLED_MATERIAL_YOU = true private const val DISABLED_LOGGING = false +private const val DISABLED_READ_RECEIPTS = true class SettingsItemFactoryTest { @@ -24,13 +27,15 @@ class SettingsItemFactoryTest { private val fakePushTokenRegistrars = FakePushRegistrars() private val fakeThemeStore = FakeThemeStore() private val fakeLoggingStore = FakeLoggingStore() + private val fakeMessageOptionsStore = FakeMessageOptionsStore() private val settingsItemFactory = SettingsItemFactory( buildMeta, deviceMeta, fakePushTokenRegistrars.instance, fakeThemeStore.instance, - fakeLoggingStore.instance + fakeLoggingStore.instance, + fakeMessageOptionsStore.instance, ) @Test @@ -38,6 +43,7 @@ class SettingsItemFactoryTest { fakePushTokenRegistrars.givenCurrentSelection().returns(A_SELECTION) fakeThemeStore.givenMaterialYouIsEnabled().returns(ENABLED_MATERIAL_YOU) fakeLoggingStore.givenLoggingIsEnabled().returns(DISABLED_LOGGING) + fakeMessageOptionsStore.givenReadReceiptsDisabled().returns(DISABLED_READ_RECEIPTS) val result = settingsItemFactory.root() @@ -52,6 +58,12 @@ class SettingsItemFactoryTest { aSettingHeaderItem("Account"), aSettingTextItem(SettingItem.Id.SignOut, "Sign out"), aSettingHeaderItem("Advanced"), + SettingItem.Toggle( + SettingItem.Id.ToggleSendReadReceipts, + "Don't send message read receipts", + subtitle = "Requires the Homeserver to be running Synapse 1.65+", + state = DISABLED_READ_RECEIPTS + ), SettingItem.Toggle(SettingItem.Id.ToggleEnableLogs, "Enable local logging", state = DISABLED_LOGGING), aSettingTextItem(SettingItem.Id.EventLog, "Event log", enabled = DISABLED_LOGGING), aSettingHeaderItem("About"), diff --git a/features/settings/src/test/kotlin/app/dapk/st/settings/SettingsViewModelTest.kt b/features/settings/src/test/kotlin/app/dapk/st/settings/SettingsViewModelTest.kt index 374849c..87477c4 100644 --- a/features/settings/src/test/kotlin/app/dapk/st/settings/SettingsViewModelTest.kt +++ b/features/settings/src/test/kotlin/app/dapk/st/settings/SettingsViewModelTest.kt @@ -5,7 +5,7 @@ import app.dapk.st.core.Lce import app.dapk.st.design.components.SpiderPage import app.dapk.st.matrix.crypto.ImportResult import fake.* -import fixture.FakeStoreCleaner +import fake.FakeStoreCleaner import fixture.aRoomId import internalfake.FakeSettingsItemFactory import internalfake.FakeUriFilenameResolver @@ -42,6 +42,7 @@ internal class SettingsViewModelTest { private val fakeSettingsItemFactory = FakeSettingsItemFactory() private val fakeThemeStore = FakeThemeStore() private val fakeLoggingStore = FakeLoggingStore() + private val fakeMessageOptionsStore = FakeMessageOptionsStore() private val viewModel = SettingsViewModel( fakeStoreCleaner, @@ -53,6 +54,7 @@ internal class SettingsViewModelTest { fakePushTokenRegistrars.instance, fakeThemeStore.instance, fakeLoggingStore.instance, + fakeMessageOptionsStore.instance, runViewModelTest.testMutableStateFactory(), )