From 08fa22069b900bcef3338e77a0c8a1486ade7af0 Mon Sep 17 00:00:00 2001 From: Benoit Marty Date: Wed, 22 Mar 2023 12:04:22 +0100 Subject: [PATCH] Use presenter factory --- features/roomlist/impl/build.gradle.kts | 1 + .../roomlist/impl/RoomListPresenter.kt | 21 +++++++++-------- .../roomlist/impl/RoomListPresenterTests.kt | 16 ++++++------- .../permissions/api/PermissionsPresenter.kt | 5 +++- .../impl/DefaultPermissionsPresenter.kt | 17 +++++++------- .../impl/DefaultPermissionsPresenterTest.kt | 12 +++++----- .../noop/NoopPermissionsPresenter.kt | 4 +--- .../noop/NoopPermissionsPresenterFactory.kt | 23 +++++++++++++++++++ .../android/samples/minimal/RoomListScreen.kt | 6 ++--- 9 files changed, 67 insertions(+), 38 deletions(-) create mode 100644 libraries/permissions/noop/src/main/kotlin/io/element/android/libraries/permissions/noop/NoopPermissionsPresenterFactory.kt diff --git a/features/roomlist/impl/build.gradle.kts b/features/roomlist/impl/build.gradle.kts index 79db4d5360..b679c2d823 100644 --- a/features/roomlist/impl/build.gradle.kts +++ b/features/roomlist/impl/build.gradle.kts @@ -48,6 +48,7 @@ dependencies { implementation(projects.libraries.designsystem) implementation(projects.libraries.elementresources) implementation(projects.libraries.permissions.api) + implementation(projects.libraries.permissions.noop) implementation(projects.libraries.testtags) implementation(projects.libraries.uiStrings) implementation(projects.libraries.dateformatter.api) 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 e77480f7c0..c38120161b 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 @@ -46,7 +46,7 @@ import io.element.android.libraries.matrix.api.verification.SessionVerificationS import io.element.android.libraries.matrix.api.verification.SessionVerifiedStatus import io.element.android.libraries.matrix.ui.model.MatrixUser import io.element.android.libraries.permissions.api.PermissionsPresenter -import io.element.android.libraries.permissions.api.createDummyPostNotificationPermissionsState +import io.element.android.libraries.permissions.noop.NoopPermissionsPresenter import kotlinx.collections.immutable.ImmutableList import kotlinx.collections.immutable.persistentListOf import kotlinx.collections.immutable.toImmutableList @@ -63,11 +63,20 @@ class RoomListPresenter @Inject constructor( private val roomLastMessageFormatter: RoomLastMessageFormatter, private val sessionVerificationService: SessionVerificationService, private val snackbarDispatcher: SnackbarDispatcher, - private val permissionsPresenter: PermissionsPresenter, + private val permissionsPresenterFactory: PermissionsPresenter.Factory, ) : Presenter { private val roomMembershipObserver: RoomMembershipObserver = client.roomMembershipObserver() + private val postNotificationPermissionsPresenter by lazy { + // Ask for POST_NOTIFICATION PERMISSION on Android 13+ + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) { + permissionsPresenterFactory.create(Manifest.permission.POST_NOTIFICATIONS) + } else { + NoopPermissionsPresenter() + } + } + @Composable override fun present(): RoomListState { val matrixUser: MutableState = remember { @@ -110,13 +119,7 @@ class RoomListPresenter @Inject constructor( val snackbarMessage = handleSnackbarMessage(snackbarDispatcher) - // Ask for POST_NOTIFICATION PERMISSION on Android 13+ - val permissionsState = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) { - permissionsPresenter.setParameter(Manifest.permission.POST_NOTIFICATIONS) - permissionsPresenter.present() - } else { - createDummyPostNotificationPermissionsState() - } + val permissionsState = postNotificationPermissionsPresenter.present() return RoomListState( matrixUser = matrixUser.value, diff --git a/features/roomlist/impl/src/test/kotlin/io/element/android/features/roomlist/impl/RoomListPresenterTests.kt b/features/roomlist/impl/src/test/kotlin/io/element/android/features/roomlist/impl/RoomListPresenterTests.kt index dc16984e53..18ead8f3e6 100644 --- a/features/roomlist/impl/src/test/kotlin/io/element/android/features/roomlist/impl/RoomListPresenterTests.kt +++ b/features/roomlist/impl/src/test/kotlin/io/element/android/features/roomlist/impl/RoomListPresenterTests.kt @@ -37,7 +37,7 @@ import io.element.android.libraries.matrix.test.FakeMatrixClient import io.element.android.libraries.matrix.test.room.FakeRoomSummaryDataSource import io.element.android.libraries.matrix.test.room.aRoomSummaryFilled import io.element.android.libraries.matrix.test.verification.FakeSessionVerificationService -import io.element.android.libraries.permissions.noop.NoopPermissionsPresenter +import io.element.android.libraries.permissions.noop.NoopPermissionsPresenterFactory import kotlinx.coroutines.test.runTest import org.junit.Test @@ -51,7 +51,7 @@ class RoomListPresenterTests { FakeRoomLastMessageFormatter(), FakeSessionVerificationService(), SnackbarDispatcher(), - NoopPermissionsPresenter(), + NoopPermissionsPresenterFactory(), ) moleculeFlow(RecompositionClock.Immediate) { presenter.present() @@ -79,7 +79,7 @@ class RoomListPresenterTests { FakeRoomLastMessageFormatter(), FakeSessionVerificationService(), SnackbarDispatcher(), - NoopPermissionsPresenter(), + NoopPermissionsPresenterFactory(), ) moleculeFlow(RecompositionClock.Immediate) { presenter.present() @@ -101,7 +101,7 @@ class RoomListPresenterTests { FakeRoomLastMessageFormatter(), FakeSessionVerificationService(), SnackbarDispatcher(), - NoopPermissionsPresenter(), + NoopPermissionsPresenterFactory(), ) moleculeFlow(RecompositionClock.Immediate) { presenter.present() @@ -127,7 +127,7 @@ class RoomListPresenterTests { FakeRoomLastMessageFormatter(), FakeSessionVerificationService(), SnackbarDispatcher(), - NoopPermissionsPresenter(), + NoopPermissionsPresenterFactory(), ) moleculeFlow(RecompositionClock.Immediate) { presenter.present() @@ -158,7 +158,7 @@ class RoomListPresenterTests { FakeRoomLastMessageFormatter(), FakeSessionVerificationService(), SnackbarDispatcher(), - NoopPermissionsPresenter(), + NoopPermissionsPresenterFactory(), ) moleculeFlow(RecompositionClock.Immediate) { presenter.present() @@ -194,7 +194,7 @@ class RoomListPresenterTests { FakeRoomLastMessageFormatter(), FakeSessionVerificationService(), SnackbarDispatcher(), - NoopPermissionsPresenter(), + NoopPermissionsPresenterFactory(), ) moleculeFlow(RecompositionClock.Immediate) { presenter.present() @@ -244,7 +244,7 @@ class RoomListPresenterTests { givenVerifiedStatus(SessionVerifiedStatus.NotVerified) }, SnackbarDispatcher(), - NoopPermissionsPresenter(), + NoopPermissionsPresenterFactory(), ) moleculeFlow(RecompositionClock.Immediate) { presenter.present() diff --git a/libraries/permissions/api/src/main/kotlin/io/element/android/libraries/permissions/api/PermissionsPresenter.kt b/libraries/permissions/api/src/main/kotlin/io/element/android/libraries/permissions/api/PermissionsPresenter.kt index 98519411bd..c4ab065ca0 100644 --- a/libraries/permissions/api/src/main/kotlin/io/element/android/libraries/permissions/api/PermissionsPresenter.kt +++ b/libraries/permissions/api/src/main/kotlin/io/element/android/libraries/permissions/api/PermissionsPresenter.kt @@ -19,5 +19,8 @@ package io.element.android.libraries.permissions.api import io.element.android.libraries.architecture.Presenter interface PermissionsPresenter : Presenter { - fun setParameter(permission: String) + + interface Factory { + fun create(permission: String): PermissionsPresenter + } } diff --git a/libraries/permissions/impl/src/main/kotlin/io/element/android/libraries/permissions/impl/DefaultPermissionsPresenter.kt b/libraries/permissions/impl/src/main/kotlin/io/element/android/libraries/permissions/impl/DefaultPermissionsPresenter.kt index 12eb5b81fd..c09a595783 100644 --- a/libraries/permissions/impl/src/main/kotlin/io/element/android/libraries/permissions/impl/DefaultPermissionsPresenter.kt +++ b/libraries/permissions/impl/src/main/kotlin/io/element/android/libraries/permissions/impl/DefaultPermissionsPresenter.kt @@ -30,25 +30,26 @@ import com.google.accompanist.permissions.PermissionStatus import com.google.accompanist.permissions.isGranted import com.google.accompanist.permissions.shouldShowRationale import com.squareup.anvil.annotations.ContributesBinding +import dagger.assisted.Assisted +import dagger.assisted.AssistedFactory +import dagger.assisted.AssistedInject import io.element.android.libraries.di.AppScope import io.element.android.libraries.permissions.api.PermissionsEvents import io.element.android.libraries.permissions.api.PermissionsPresenter import io.element.android.libraries.permissions.api.PermissionsState import kotlinx.coroutines.launch import timber.log.Timber -import javax.inject.Inject -@ContributesBinding(AppScope::class) -class DefaultPermissionsPresenter @Inject constructor( +class DefaultPermissionsPresenter @AssistedInject constructor( + @Assisted val permission: String, private val permissionsStore: PermissionsStore, private val permissionStateProvider: PermissionStateProvider, ) : PermissionsPresenter { - private lateinit var permission: String - - // TODO Move to the constructor. - override fun setParameter(permission: String) { - this.permission = permission + @AssistedFactory + @ContributesBinding(AppScope::class) + interface Factory : PermissionsPresenter.Factory { + override fun create(permission: String): DefaultPermissionsPresenter } @OptIn(ExperimentalPermissionsApi::class) diff --git a/libraries/permissions/impl/src/test/kotlin/io/element/android/libraries/permissions/impl/DefaultPermissionsPresenterTest.kt b/libraries/permissions/impl/src/test/kotlin/io/element/android/libraries/permissions/impl/DefaultPermissionsPresenterTest.kt index be326a71ed..10e6edf3f5 100644 --- a/libraries/permissions/impl/src/test/kotlin/io/element/android/libraries/permissions/impl/DefaultPermissionsPresenterTest.kt +++ b/libraries/permissions/impl/src/test/kotlin/io/element/android/libraries/permissions/impl/DefaultPermissionsPresenterTest.kt @@ -38,11 +38,11 @@ class DefaultPermissionsPresenterTest { val permissionState = FakePermissionState(A_PERMISSION, PermissionStatus.Granted) val permissionStateProvider = FakePermissionStateProvider(permissionState) val presenter = DefaultPermissionsPresenter( + A_PERMISSION, permissionsStore, permissionStateProvider ) moleculeFlow(RecompositionClock.Immediate) { - presenter.setParameter(A_PERMISSION) presenter.present() }.test { val initialState = awaitItem() @@ -61,11 +61,11 @@ class DefaultPermissionsPresenterTest { val permissionState = FakePermissionState(A_PERMISSION, PermissionStatus.Denied(shouldShowRationale = false)) val permissionStateProvider = FakePermissionStateProvider(permissionState) val presenter = DefaultPermissionsPresenter( + A_PERMISSION, permissionsStore, permissionStateProvider ) moleculeFlow(RecompositionClock.Immediate) { - presenter.setParameter(A_PERMISSION) presenter.present() }.test { val initialState = awaitItem() @@ -81,11 +81,11 @@ class DefaultPermissionsPresenterTest { val permissionState = FakePermissionState(A_PERMISSION, PermissionStatus.Denied(shouldShowRationale = false)) val permissionStateProvider = FakePermissionStateProvider(permissionState) val presenter = DefaultPermissionsPresenter( + A_PERMISSION, permissionsStore, permissionStateProvider ) moleculeFlow(RecompositionClock.Immediate) { - presenter.setParameter(A_PERMISSION) presenter.present() }.test { val initialState = awaitItem() @@ -110,11 +110,11 @@ class DefaultPermissionsPresenterTest { val permissionState = FakePermissionState(A_PERMISSION, PermissionStatus.Denied(shouldShowRationale = true)) val permissionStateProvider = FakePermissionStateProvider(permissionState) val presenter = DefaultPermissionsPresenter( + A_PERMISSION, permissionsStore, permissionStateProvider ) moleculeFlow(RecompositionClock.Immediate) { - presenter.setParameter(A_PERMISSION) presenter.present() }.test { val initialState = awaitItem() @@ -139,11 +139,11 @@ class DefaultPermissionsPresenterTest { val permissionState = FakePermissionState(A_PERMISSION, PermissionStatus.Denied(shouldShowRationale = false)) val permissionStateProvider = FakePermissionStateProvider(permissionState) val presenter = DefaultPermissionsPresenter( + A_PERMISSION, permissionsStore, permissionStateProvider ) moleculeFlow(RecompositionClock.Immediate) { - presenter.setParameter(A_PERMISSION) presenter.present() }.test { skipItems(1) @@ -161,11 +161,11 @@ class DefaultPermissionsPresenterTest { val permissionState = FakePermissionState(A_PERMISSION, PermissionStatus.Denied(shouldShowRationale = false)) val permissionStateProvider = FakePermissionStateProvider(permissionState) val presenter = DefaultPermissionsPresenter( + A_PERMISSION, permissionsStore, permissionStateProvider ) moleculeFlow(RecompositionClock.Immediate) { - presenter.setParameter(A_PERMISSION) presenter.present() }.test { val initialState = awaitItem() diff --git a/libraries/permissions/noop/src/main/kotlin/io/element/android/libraries/permissions/noop/NoopPermissionsPresenter.kt b/libraries/permissions/noop/src/main/kotlin/io/element/android/libraries/permissions/noop/NoopPermissionsPresenter.kt index 293edb2cac..653fe49268 100644 --- a/libraries/permissions/noop/src/main/kotlin/io/element/android/libraries/permissions/noop/NoopPermissionsPresenter.kt +++ b/libraries/permissions/noop/src/main/kotlin/io/element/android/libraries/permissions/noop/NoopPermissionsPresenter.kt @@ -20,9 +20,7 @@ import androidx.compose.runtime.Composable import io.element.android.libraries.permissions.api.PermissionsPresenter import io.element.android.libraries.permissions.api.PermissionsState -class NoopPermissionsPresenter: PermissionsPresenter { - - override fun setParameter(permission: String) = Unit +class NoopPermissionsPresenter : PermissionsPresenter { @Composable override fun present(): PermissionsState { diff --git a/libraries/permissions/noop/src/main/kotlin/io/element/android/libraries/permissions/noop/NoopPermissionsPresenterFactory.kt b/libraries/permissions/noop/src/main/kotlin/io/element/android/libraries/permissions/noop/NoopPermissionsPresenterFactory.kt new file mode 100644 index 0000000000..b982969483 --- /dev/null +++ b/libraries/permissions/noop/src/main/kotlin/io/element/android/libraries/permissions/noop/NoopPermissionsPresenterFactory.kt @@ -0,0 +1,23 @@ +/* + * 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.permissions.noop + +import io.element.android.libraries.permissions.api.PermissionsPresenter + +class NoopPermissionsPresenterFactory : PermissionsPresenter.Factory { + override fun create(permission: String) = NoopPermissionsPresenter() +} diff --git a/samples/minimal/src/main/kotlin/io/element/android/samples/minimal/RoomListScreen.kt b/samples/minimal/src/main/kotlin/io/element/android/samples/minimal/RoomListScreen.kt index 7d10663027..9d1c7a495d 100644 --- a/samples/minimal/src/main/kotlin/io/element/android/samples/minimal/RoomListScreen.kt +++ b/samples/minimal/src/main/kotlin/io/element/android/samples/minimal/RoomListScreen.kt @@ -29,7 +29,7 @@ import io.element.android.libraries.dateformatter.impl.LocalDateTimeProvider import io.element.android.libraries.designsystem.utils.SnackbarDispatcher import io.element.android.libraries.matrix.api.MatrixClient import io.element.android.libraries.matrix.api.core.RoomId -import io.element.android.libraries.permissions.noop.NoopPermissionsPresenter +import io.element.android.libraries.permissions.noop.NoopPermissionsPresenterFactory import kotlinx.coroutines.launch import kotlinx.datetime.Clock import kotlinx.datetime.TimeZone @@ -45,14 +45,14 @@ class RoomListScreen( private val dateTimeProvider = LocalDateTimeProvider(clock, timeZone) private val dateFormatters = DateFormatters(locale, clock, timeZone) private val sessionVerificationService = matrixClient.sessionVerificationService() - private val permissionsPresenter = NoopPermissionsPresenter() + private val permissionsPresenterFactory = NoopPermissionsPresenterFactory() private val presenter = RoomListPresenter( matrixClient, DefaultLastMessageTimestampFormatter(dateTimeProvider, dateFormatters), DefaultRoomLastMessageFormatter(context, matrixClient), sessionVerificationService, SnackbarDispatcher(), - permissionsPresenter, + permissionsPresenterFactory, ) @Composable