From cf05a9680f26c3355687f13df2e5980fe817d565 Mon Sep 17 00:00:00 2001 From: Benoit Marty Date: Mon, 7 Oct 2024 09:02:05 +0200 Subject: [PATCH] Remove dependencies to other presenters from PreferencesRootPresenter. Also do some renaming since DirectLogoutPresenter interface can be removed. --- .../api/direct/DirectLogoutPresenter.kt | 12 ---------- .../features/logout/impl/di/LogoutModule.kt | 23 +++++++++++++++++++ ...tPresenter.kt => DirectLogoutPresenter.kt} | 9 +++----- ...erTest.kt => DirectLogoutPresenterTest.kt} | 20 ++++++++-------- .../impl/root/PreferencesRootPresenter.kt | 4 ++-- .../impl/root/PreferencesRootPresenterTest.kt | 18 +++------------ .../roomlist/impl/RoomListPresenter.kt | 4 ++-- .../roomlist/impl/RoomListPresenterTest.kt | 8 +------ 8 files changed, 44 insertions(+), 54 deletions(-) delete mode 100644 features/logout/api/src/main/kotlin/io/element/android/features/logout/api/direct/DirectLogoutPresenter.kt create mode 100644 features/logout/impl/src/main/kotlin/io/element/android/features/logout/impl/di/LogoutModule.kt rename features/logout/impl/src/main/kotlin/io/element/android/features/logout/impl/direct/{DefaultDirectLogoutPresenter.kt => DirectLogoutPresenter.kt} (90%) rename features/logout/impl/src/test/kotlin/io/element/android/features/logout/impl/direct/{DefaultDirectLogoutPresenterTest.kt => DirectLogoutPresenterTest.kt} (92%) diff --git a/features/logout/api/src/main/kotlin/io/element/android/features/logout/api/direct/DirectLogoutPresenter.kt b/features/logout/api/src/main/kotlin/io/element/android/features/logout/api/direct/DirectLogoutPresenter.kt deleted file mode 100644 index c20e04b4f0..0000000000 --- a/features/logout/api/src/main/kotlin/io/element/android/features/logout/api/direct/DirectLogoutPresenter.kt +++ /dev/null @@ -1,12 +0,0 @@ -/* - * Copyright 2023, 2024 New Vector Ltd. - * - * SPDX-License-Identifier: AGPL-3.0-only - * Please see LICENSE in the repository root for full details. - */ - -package io.element.android.features.logout.api.direct - -import io.element.android.libraries.architecture.Presenter - -interface DirectLogoutPresenter : Presenter diff --git a/features/logout/impl/src/main/kotlin/io/element/android/features/logout/impl/di/LogoutModule.kt b/features/logout/impl/src/main/kotlin/io/element/android/features/logout/impl/di/LogoutModule.kt new file mode 100644 index 0000000000..fdd157fef0 --- /dev/null +++ b/features/logout/impl/src/main/kotlin/io/element/android/features/logout/impl/di/LogoutModule.kt @@ -0,0 +1,23 @@ +/* + * Copyright 2024 New Vector Ltd. + * + * SPDX-License-Identifier: AGPL-3.0-only + * Please see LICENSE in the repository root for full details. + */ + +package io.element.android.features.logout.impl.di + +import com.squareup.anvil.annotations.ContributesTo +import dagger.Binds +import dagger.Module +import io.element.android.features.logout.api.direct.DirectLogoutState +import io.element.android.features.logout.impl.direct.DirectLogoutPresenter +import io.element.android.libraries.architecture.Presenter +import io.element.android.libraries.di.SessionScope + +@ContributesTo(SessionScope::class) +@Module +interface LogoutModule { + @Binds + fun bindDirectLogoutPresenter(presenter: DirectLogoutPresenter): Presenter +} diff --git a/features/logout/impl/src/main/kotlin/io/element/android/features/logout/impl/direct/DefaultDirectLogoutPresenter.kt b/features/logout/impl/src/main/kotlin/io/element/android/features/logout/impl/direct/DirectLogoutPresenter.kt similarity index 90% rename from features/logout/impl/src/main/kotlin/io/element/android/features/logout/impl/direct/DefaultDirectLogoutPresenter.kt rename to features/logout/impl/src/main/kotlin/io/element/android/features/logout/impl/direct/DirectLogoutPresenter.kt index 1595747a31..4a5fead974 100644 --- a/features/logout/impl/src/main/kotlin/io/element/android/features/logout/impl/direct/DefaultDirectLogoutPresenter.kt +++ b/features/logout/impl/src/main/kotlin/io/element/android/features/logout/impl/direct/DirectLogoutPresenter.kt @@ -14,14 +14,12 @@ import androidx.compose.runtime.getValue import androidx.compose.runtime.mutableStateOf import androidx.compose.runtime.remember import androidx.compose.runtime.rememberCoroutineScope -import com.squareup.anvil.annotations.ContributesBinding import io.element.android.features.logout.api.direct.DirectLogoutEvents -import io.element.android.features.logout.api.direct.DirectLogoutPresenter import io.element.android.features.logout.api.direct.DirectLogoutState import io.element.android.features.logout.impl.tools.isBackingUp import io.element.android.libraries.architecture.AsyncAction +import io.element.android.libraries.architecture.Presenter import io.element.android.libraries.architecture.runCatchingUpdatingState -import io.element.android.libraries.di.SessionScope import io.element.android.libraries.matrix.api.MatrixClient import io.element.android.libraries.matrix.api.encryption.BackupUploadState import io.element.android.libraries.matrix.api.encryption.EncryptionService @@ -29,11 +27,10 @@ import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.launch import javax.inject.Inject -@ContributesBinding(SessionScope::class) -class DefaultDirectLogoutPresenter @Inject constructor( +class DirectLogoutPresenter @Inject constructor( private val matrixClient: MatrixClient, private val encryptionService: EncryptionService, -) : DirectLogoutPresenter { +) : Presenter { @Composable override fun present(): DirectLogoutState { val localCoroutineScope = rememberCoroutineScope() diff --git a/features/logout/impl/src/test/kotlin/io/element/android/features/logout/impl/direct/DefaultDirectLogoutPresenterTest.kt b/features/logout/impl/src/test/kotlin/io/element/android/features/logout/impl/direct/DirectLogoutPresenterTest.kt similarity index 92% rename from features/logout/impl/src/test/kotlin/io/element/android/features/logout/impl/direct/DefaultDirectLogoutPresenterTest.kt rename to features/logout/impl/src/test/kotlin/io/element/android/features/logout/impl/direct/DirectLogoutPresenterTest.kt index e8bcece709..a490b7b10d 100644 --- a/features/logout/impl/src/test/kotlin/io/element/android/features/logout/impl/direct/DefaultDirectLogoutPresenterTest.kt +++ b/features/logout/impl/src/test/kotlin/io/element/android/features/logout/impl/direct/DirectLogoutPresenterTest.kt @@ -26,13 +26,13 @@ import kotlinx.coroutines.test.runTest import org.junit.Rule import org.junit.Test -class DefaultDirectLogoutPresenterTest { +class DirectLogoutPresenterTest { @get:Rule val warmUpRule = WarmUpRule() @Test fun `present - initial state`() = runTest { - val presenter = createDefaultDirectLogoutPresenter() + val presenter = createDirectLogoutPresenter() moleculeFlow(RecompositionMode.Immediate) { presenter.present() }.test { @@ -44,7 +44,7 @@ class DefaultDirectLogoutPresenterTest { @Test fun `present - initial state - last session`() = runTest { - val presenter = createDefaultDirectLogoutPresenter( + val presenter = createDirectLogoutPresenter( encryptionService = FakeEncryptionService().apply { emitIsLastDevice(true) } @@ -66,7 +66,7 @@ class DefaultDirectLogoutPresenterTest { emit(BackupUploadState.Waiting) } ) - val presenter = createDefaultDirectLogoutPresenter( + val presenter = createDirectLogoutPresenter( encryptionService = encryptionService ) moleculeFlow(RecompositionMode.Immediate) { @@ -81,7 +81,7 @@ class DefaultDirectLogoutPresenterTest { @Test fun `present - logout then cancel`() = runTest { - val presenter = createDefaultDirectLogoutPresenter() + val presenter = createDirectLogoutPresenter() moleculeFlow(RecompositionMode.Immediate) { presenter.present() }.test { @@ -97,7 +97,7 @@ class DefaultDirectLogoutPresenterTest { @Test fun `present - logout then confirm`() = runTest { - val presenter = createDefaultDirectLogoutPresenter() + val presenter = createDirectLogoutPresenter() moleculeFlow(RecompositionMode.Immediate) { presenter.present() }.test { @@ -120,7 +120,7 @@ class DefaultDirectLogoutPresenterTest { throw A_THROWABLE } } - val presenter = createDefaultDirectLogoutPresenter( + val presenter = createDirectLogoutPresenter( matrixClient, ) moleculeFlow(RecompositionMode.Immediate) { @@ -152,7 +152,7 @@ class DefaultDirectLogoutPresenterTest { } } } - val presenter = createDefaultDirectLogoutPresenter( + val presenter = createDirectLogoutPresenter( matrixClient, ) moleculeFlow(RecompositionMode.Immediate) { @@ -179,10 +179,10 @@ class DefaultDirectLogoutPresenterTest { return awaitItem() } - private fun createDefaultDirectLogoutPresenter( + private fun createDirectLogoutPresenter( matrixClient: MatrixClient = FakeMatrixClient(), encryptionService: EncryptionService = FakeEncryptionService(), - ): DefaultDirectLogoutPresenter = DefaultDirectLogoutPresenter( + ): DirectLogoutPresenter = DirectLogoutPresenter( matrixClient = matrixClient, encryptionService = encryptionService, ) diff --git a/features/preferences/impl/src/main/kotlin/io/element/android/features/preferences/impl/root/PreferencesRootPresenter.kt b/features/preferences/impl/src/main/kotlin/io/element/android/features/preferences/impl/root/PreferencesRootPresenter.kt index f1507c45f4..7429b3dc4e 100644 --- a/features/preferences/impl/src/main/kotlin/io/element/android/features/preferences/impl/root/PreferencesRootPresenter.kt +++ b/features/preferences/impl/src/main/kotlin/io/element/android/features/preferences/impl/root/PreferencesRootPresenter.kt @@ -16,7 +16,7 @@ import androidx.compose.runtime.mutableStateOf import androidx.compose.runtime.produceState import androidx.compose.runtime.remember import androidx.compose.runtime.setValue -import io.element.android.features.logout.api.direct.DirectLogoutPresenter +import io.element.android.features.logout.api.direct.DirectLogoutState import io.element.android.features.preferences.impl.utils.ShowDeveloperSettingsProvider import io.element.android.libraries.architecture.Presenter import io.element.android.libraries.designsystem.utils.snackbar.SnackbarDispatcher @@ -42,7 +42,7 @@ class PreferencesRootPresenter @Inject constructor( private val snackbarDispatcher: SnackbarDispatcher, private val featureFlagService: FeatureFlagService, private val indicatorService: IndicatorService, - private val directLogoutPresenter: DirectLogoutPresenter, + private val directLogoutPresenter: Presenter, private val showDeveloperSettingsProvider: ShowDeveloperSettingsProvider, ) : Presenter { @Composable diff --git a/features/preferences/impl/src/test/kotlin/io/element/android/features/preferences/impl/root/PreferencesRootPresenterTest.kt b/features/preferences/impl/src/test/kotlin/io/element/android/features/preferences/impl/root/PreferencesRootPresenterTest.kt index 774d52076a..5c2bc63add 100644 --- a/features/preferences/impl/src/test/kotlin/io/element/android/features/preferences/impl/root/PreferencesRootPresenterTest.kt +++ b/features/preferences/impl/src/test/kotlin/io/element/android/features/preferences/impl/root/PreferencesRootPresenterTest.kt @@ -7,16 +7,13 @@ package io.element.android.features.preferences.impl.root -import androidx.compose.runtime.Composable import app.cash.molecule.RecompositionMode import app.cash.molecule.moleculeFlow import app.cash.turbine.ReceiveTurbine import app.cash.turbine.test import com.google.common.truth.Truth.assertThat -import io.element.android.features.logout.api.direct.DirectLogoutPresenter -import io.element.android.features.logout.api.direct.DirectLogoutState +import io.element.android.features.logout.api.direct.aDirectLogoutState import io.element.android.features.preferences.impl.utils.ShowDeveloperSettingsProvider -import io.element.android.libraries.architecture.AsyncAction import io.element.android.libraries.core.meta.BuildType import io.element.android.libraries.designsystem.utils.snackbar.SnackbarDispatcher import io.element.android.libraries.featureflag.test.FakeFeatureFlagService @@ -38,12 +35,6 @@ class PreferencesRootPresenterTest { @get:Rule val warmUpRule = WarmUpRule() - private val aDirectLogoutState = DirectLogoutState( - canDoDirectSignOut = true, - logoutAction = AsyncAction.Uninitialized, - eventSink = {}, - ) - @Test fun `present - initial state`() = runTest { val matrixClient = FakeMatrixClient(canDeactivateAccountResult = { true }) @@ -78,7 +69,7 @@ class PreferencesRootPresenterTest { assertThat(loadedState.showLockScreenSettings).isTrue() assertThat(loadedState.showNotificationSettings).isTrue() assertThat(loadedState.canDeactivateAccount).isTrue() - assertThat(loadedState.directLogoutState).isEqualTo(aDirectLogoutState) + assertThat(loadedState.directLogoutState).isEqualTo(aDirectLogoutState()) assertThat(loadedState.snackbarMessage).isNull() } } @@ -148,10 +139,7 @@ class PreferencesRootPresenterTest { sessionVerificationService = sessionVerificationService, encryptionService = FakeEncryptionService(), ), - directLogoutPresenter = object : DirectLogoutPresenter { - @Composable - override fun present() = aDirectLogoutState - }, + directLogoutPresenter = { aDirectLogoutState() }, showDeveloperSettingsProvider = showDeveloperSettingsProvider, ) } diff --git a/features/roomlist/impl/src/main/kotlin/io/element/android/features/roomlist/impl/RoomListPresenter.kt b/features/roomlist/impl/src/main/kotlin/io/element/android/features/roomlist/impl/RoomListPresenter.kt index 429bfbb698..a29ce74fd1 100644 --- a/features/roomlist/impl/src/main/kotlin/io/element/android/features/roomlist/impl/RoomListPresenter.kt +++ b/features/roomlist/impl/src/main/kotlin/io/element/android/features/roomlist/impl/RoomListPresenter.kt @@ -29,7 +29,7 @@ import io.element.android.features.invite.api.response.AcceptDeclineInviteState import io.element.android.features.invite.api.response.InviteData import io.element.android.features.leaveroom.api.LeaveRoomEvent import io.element.android.features.leaveroom.api.LeaveRoomPresenter -import io.element.android.features.logout.api.direct.DirectLogoutPresenter +import io.element.android.features.logout.api.direct.DirectLogoutState import io.element.android.features.networkmonitor.api.NetworkMonitor import io.element.android.features.networkmonitor.api.NetworkStatus import io.element.android.features.roomlist.impl.datasource.RoomListDataSource @@ -91,7 +91,7 @@ class RoomListPresenter @Inject constructor( private val acceptDeclineInvitePresenter: Presenter, private val fullScreenIntentPermissionsPresenter: FullScreenIntentPermissionsPresenter, private val notificationCleaner: NotificationCleaner, - private val logoutPresenter: DirectLogoutPresenter, + private val logoutPresenter: Presenter, ) : Presenter { private val encryptionService: EncryptionService = client.encryptionService() private val syncService: SyncService = client.syncService() diff --git a/features/roomlist/impl/src/test/kotlin/io/element/android/features/roomlist/impl/RoomListPresenterTest.kt b/features/roomlist/impl/src/test/kotlin/io/element/android/features/roomlist/impl/RoomListPresenterTest.kt index 8264263760..536971b7b6 100644 --- a/features/roomlist/impl/src/test/kotlin/io/element/android/features/roomlist/impl/RoomListPresenterTest.kt +++ b/features/roomlist/impl/src/test/kotlin/io/element/android/features/roomlist/impl/RoomListPresenterTest.kt @@ -7,7 +7,6 @@ package io.element.android.features.roomlist.impl -import androidx.compose.runtime.Composable import app.cash.molecule.RecompositionMode import app.cash.molecule.moleculeFlow import app.cash.turbine.test @@ -19,7 +18,6 @@ import io.element.android.features.invite.api.response.anAcceptDeclineInviteStat import io.element.android.features.leaveroom.api.LeaveRoomEvent import io.element.android.features.leaveroom.api.LeaveRoomPresenter import io.element.android.features.leaveroom.fake.FakeLeaveRoomPresenter -import io.element.android.features.logout.api.direct.DirectLogoutPresenter import io.element.android.features.logout.api.direct.aDirectLogoutState import io.element.android.features.networkmonitor.api.NetworkMonitor import io.element.android.features.networkmonitor.test.FakeNetworkMonitor @@ -686,10 +684,6 @@ class RoomListPresenterTest { searchPresenter: Presenter = Presenter { aRoomListSearchState() }, acceptDeclineInvitePresenter: Presenter = Presenter { anAcceptDeclineInviteState() }, notificationCleaner: NotificationCleaner = FakeNotificationCleaner(), - logoutPresenter: DirectLogoutPresenter = object : DirectLogoutPresenter { - @Composable - override fun present() = aDirectLogoutState() - }, ) = RoomListPresenter( client = client, networkMonitor = networkMonitor, @@ -717,6 +711,6 @@ class RoomListPresenterTest { acceptDeclineInvitePresenter = acceptDeclineInvitePresenter, fullScreenIntentPermissionsPresenter = FakeFullScreenIntentPermissionsPresenter(), notificationCleaner = notificationCleaner, - logoutPresenter = logoutPresenter, + logoutPresenter = { aDirectLogoutState() }, ) }