From eaff43de3a146f461f5dabe51adcd9bd098335eb Mon Sep 17 00:00:00 2001 From: Benoit Marty Date: Fri, 31 Mar 2023 10:15:51 +0200 Subject: [PATCH] Create a LoggedInNode, used as a PermanentNode in LoggedInFlowNode --- .../android/appnav/LoggedInFlowNode.kt | 19 ++++---- .../android/appnav/loggedin/LoggedInNode.kt | 44 +++++++++++++++++++ .../appnav/loggedin/LoggedInPresenter.kt | 11 +++-- .../android/appnav/loggedin/LoggedInView.kt | 33 ++++---------- .../android/libraries/push/api/PushService.kt | 8 +++- .../libraries/push/impl/DefaultPushService.kt | 6 +-- .../libraries/push/impl/PushersManager.kt | 10 ++--- 7 files changed, 85 insertions(+), 46 deletions(-) create mode 100644 appnav/src/main/kotlin/io/element/android/appnav/loggedin/LoggedInNode.kt diff --git a/appnav/src/main/kotlin/io/element/android/appnav/LoggedInFlowNode.kt b/appnav/src/main/kotlin/io/element/android/appnav/LoggedInFlowNode.kt index b20dcc8f44..caef28bb9e 100644 --- a/appnav/src/main/kotlin/io/element/android/appnav/LoggedInFlowNode.kt +++ b/appnav/src/main/kotlin/io/element/android/appnav/LoggedInFlowNode.kt @@ -35,8 +35,7 @@ import com.bumble.appyx.navmodel.backstack.operation.push import dagger.assisted.Assisted import dagger.assisted.AssistedInject import io.element.android.anvilannotations.ContributesNode -import io.element.android.appnav.loggedin.LoggedInPresenter -import io.element.android.appnav.loggedin.LoggedInView +import io.element.android.appnav.loggedin.LoggedInNode import io.element.android.features.createroom.api.CreateRoomEntryPoint import io.element.android.features.preferences.api.PreferencesEntryPoint import io.element.android.features.roomlist.api.RoomListEntryPoint @@ -72,7 +71,6 @@ class LoggedInFlowNode @AssistedInject constructor( private val verifySessionEntryPoint: VerifySessionEntryPoint, private val coroutineScope: CoroutineScope, snackbarDispatcher: SnackbarDispatcher, - private val loggedInPresenter: LoggedInPresenter, ) : BackstackNode( backstack = BackStack( initialElement = NavTarget.RoomList, @@ -128,6 +126,9 @@ class LoggedInFlowNode @AssistedInject constructor( } sealed interface NavTarget : Parcelable { + @Parcelize + object Permanent : NavTarget + @Parcelize object RoomList : NavTarget @@ -146,6 +147,9 @@ class LoggedInFlowNode @AssistedInject constructor( override fun resolve(navTarget: NavTarget, buildContext: BuildContext): Node { return when (navTarget) { + NavTarget.Permanent -> { + createNode(buildContext) + } NavTarget.RoomList -> { val callback = object : RoomListEntryPoint.Callback { override fun onRoomClicked(roomId: RoomId) { @@ -205,16 +209,15 @@ class LoggedInFlowNode @AssistedInject constructor( @Composable override fun View(modifier: Modifier) { - val loggedInState = loggedInPresenter.present() - LoggedInView( - state = loggedInState - ) { + Box(modifier = modifier) { Children( navModel = backstack, - modifier = modifier, + modifier = Modifier, // Animate navigation to settings and to a room transitionHandler = rememberDefaultTransitionHandler(), ) + + PermanentChild(navTarget = NavTarget.Permanent) } } } diff --git a/appnav/src/main/kotlin/io/element/android/appnav/loggedin/LoggedInNode.kt b/appnav/src/main/kotlin/io/element/android/appnav/loggedin/LoggedInNode.kt new file mode 100644 index 0000000000..6950b9b699 --- /dev/null +++ b/appnav/src/main/kotlin/io/element/android/appnav/loggedin/LoggedInNode.kt @@ -0,0 +1,44 @@ +/* + * 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.appnav.loggedin + +import androidx.compose.runtime.Composable +import androidx.compose.ui.Modifier +import com.bumble.appyx.core.modality.BuildContext +import com.bumble.appyx.core.node.Node +import com.bumble.appyx.core.plugin.Plugin +import dagger.assisted.Assisted +import dagger.assisted.AssistedInject +import io.element.android.anvilannotations.ContributesNode +import io.element.android.libraries.di.SessionScope + +@ContributesNode(SessionScope::class) +class LoggedInNode @AssistedInject constructor( + @Assisted buildContext: BuildContext, + @Assisted plugins: List, + private val loggedInPresenter: LoggedInPresenter, +) : Node(buildContext, plugins = plugins) { + + @Composable + override fun View(modifier: Modifier) { + val loggedInState = loggedInPresenter.present() + LoggedInView( + state = loggedInState, + modifier = modifier + ) + } +} diff --git a/appnav/src/main/kotlin/io/element/android/appnav/loggedin/LoggedInPresenter.kt b/appnav/src/main/kotlin/io/element/android/appnav/loggedin/LoggedInPresenter.kt index 62127a5ea7..a845ec4600 100644 --- a/appnav/src/main/kotlin/io/element/android/appnav/loggedin/LoggedInPresenter.kt +++ b/appnav/src/main/kotlin/io/element/android/appnav/loggedin/LoggedInPresenter.kt @@ -19,6 +19,7 @@ package io.element.android.appnav.loggedin import android.Manifest import android.os.Build import androidx.compose.runtime.Composable +import androidx.compose.runtime.LaunchedEffect import io.element.android.libraries.architecture.Presenter import io.element.android.libraries.matrix.api.MatrixClient import io.element.android.libraries.permissions.api.PermissionsPresenter @@ -27,9 +28,9 @@ import io.element.android.libraries.push.api.PushService import javax.inject.Inject class LoggedInPresenter @Inject constructor( + private val matrixClient: MatrixClient, private val permissionsPresenterFactory: PermissionsPresenter.Factory, - // private val matrixClient: MatrixClient, - // private val pushService: PushService, + private val pushService: PushService, ) : Presenter { private val postNotificationPermissionsPresenter by lazy { @@ -43,8 +44,10 @@ class LoggedInPresenter @Inject constructor( @Composable override fun present(): LoggedInState { - - // TODO EAx pushService.registerPusher(matrixClient.sessionId) + LaunchedEffect(Unit) { + // Ensure pusher is registered + pushService.registerPusher(matrixClient) + } val permissionsState = postNotificationPermissionsPresenter.present() diff --git a/appnav/src/main/kotlin/io/element/android/appnav/loggedin/LoggedInView.kt b/appnav/src/main/kotlin/io/element/android/appnav/loggedin/LoggedInView.kt index 8071d7ca99..5db19ccae7 100644 --- a/appnav/src/main/kotlin/io/element/android/appnav/loggedin/LoggedInView.kt +++ b/appnav/src/main/kotlin/io/element/android/appnav/loggedin/LoggedInView.kt @@ -17,11 +17,7 @@ package io.element.android.appnav.loggedin import android.app.Activity -import androidx.compose.foundation.layout.Box -import androidx.compose.foundation.layout.BoxScope -import androidx.compose.foundation.layout.fillMaxSize import androidx.compose.runtime.Composable -import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.platform.LocalContext import androidx.compose.ui.tooling.preview.Preview @@ -29,31 +25,22 @@ import androidx.compose.ui.tooling.preview.PreviewParameter import io.element.android.libraries.androidutils.system.openAppSettingsPage import io.element.android.libraries.designsystem.preview.ElementPreviewDark import io.element.android.libraries.designsystem.preview.ElementPreviewLight -import io.element.android.libraries.designsystem.theme.components.Text import io.element.android.libraries.permissions.api.PermissionsView @Composable fun LoggedInView( state: LoggedInState, - modifier: Modifier = Modifier, - children: @Composable BoxScope.() -> Unit, + modifier: Modifier = Modifier ) { val activity = LocalContext.current as? Activity - Box( - modifier = modifier - .fillMaxSize(), - contentAlignment = Alignment.TopCenter, - ) { - children() - - PermissionsView( - state = state.permissionsState, - openSystemSettings = { - activity?.let { openAppSettingsPage(it, "") } - } - ) - } + PermissionsView( + state = state.permissionsState, + modifier = modifier, + openSystemSettings = { + activity?.let { openAppSettingsPage(it, "") } + } + ) } @Preview @@ -70,7 +57,5 @@ fun LoggedInViewDarkPreview(@PreviewParameter(LoggedInStateProvider::class) stat private fun ContentToPreview(state: LoggedInState) { LoggedInView( state = state - ) { - Text("Children") - } + ) } diff --git a/libraries/push/api/src/main/kotlin/io/element/android/libraries/push/api/PushService.kt b/libraries/push/api/src/main/kotlin/io/element/android/libraries/push/api/PushService.kt index 77adb869c5..7d0f2cf4cb 100644 --- a/libraries/push/api/src/main/kotlin/io/element/android/libraries/push/api/PushService.kt +++ b/libraries/push/api/src/main/kotlin/io/element/android/libraries/push/api/PushService.kt @@ -16,15 +16,19 @@ package io.element.android.libraries.push.api -import io.element.android.libraries.matrix.api.core.UserId +import io.element.android.libraries.matrix.api.MatrixClient interface PushService { + // TODO EAx remove fun setCurrentRoom(roomId: String?) + + // TODO EAx remove fun setCurrentThread(threadId: String?) + fun notificationStyleChanged() // Ensure pusher is registered - suspend fun registerPusher(userId: UserId) + suspend fun registerPusher(matrixClient: MatrixClient) suspend fun testPush() } diff --git a/libraries/push/impl/src/main/kotlin/io/element/android/libraries/push/impl/DefaultPushService.kt b/libraries/push/impl/src/main/kotlin/io/element/android/libraries/push/impl/DefaultPushService.kt index e9b7efcdee..82c7062959 100644 --- a/libraries/push/impl/src/main/kotlin/io/element/android/libraries/push/impl/DefaultPushService.kt +++ b/libraries/push/impl/src/main/kotlin/io/element/android/libraries/push/impl/DefaultPushService.kt @@ -18,7 +18,7 @@ package io.element.android.libraries.push.impl import com.squareup.anvil.annotations.ContributesBinding import io.element.android.libraries.di.AppScope -import io.element.android.libraries.matrix.api.core.UserId +import io.element.android.libraries.matrix.api.MatrixClient import io.element.android.libraries.push.api.PushService import io.element.android.libraries.push.impl.notifications.NotificationDrawerManager import javax.inject.Inject @@ -40,8 +40,8 @@ class DefaultPushService @Inject constructor( notificationDrawerManager.notificationStyleChanged() } - override suspend fun registerPusher(userId: UserId) { - pusherManager.registerPusher(userId) + override suspend fun registerPusher(matrixClient: MatrixClient) { + pusherManager.registerPusher(matrixClient) } override suspend fun testPush() { diff --git a/libraries/push/impl/src/main/kotlin/io/element/android/libraries/push/impl/PushersManager.kt b/libraries/push/impl/src/main/kotlin/io/element/android/libraries/push/impl/PushersManager.kt index b4952f35b4..710688e520 100644 --- a/libraries/push/impl/src/main/kotlin/io/element/android/libraries/push/impl/PushersManager.kt +++ b/libraries/push/impl/src/main/kotlin/io/element/android/libraries/push/impl/PushersManager.kt @@ -16,9 +16,9 @@ package io.element.android.libraries.push.impl +import io.element.android.libraries.matrix.api.MatrixClient import io.element.android.libraries.matrix.api.auth.MatrixAuthenticationService import io.element.android.libraries.matrix.api.core.SessionId -import io.element.android.libraries.matrix.api.core.UserId import io.element.android.libraries.matrix.api.pusher.SetHttpPusherData import io.element.android.libraries.push.impl.clientsecret.PushClientSecret import io.element.android.libraries.push.impl.config.PushConfig @@ -71,12 +71,12 @@ class PushersManager @Inject constructor( } } - suspend fun registerPusher(userId: UserId) { + suspend fun registerPusher(matrixClient: MatrixClient) { val pushKey = fcmHelper.getFcmToken() ?: return // Register the pusher for the session - val client = matrixAuthenticationService.restoreSession(userId).getOrNull() ?: return - client.pushersService().setHttpPusher(createHttpPusher(pushKey, PushConfig.pusher_http_url, userId.value)) - // TODO EAx Close sessions + matrixClient.pushersService().setHttpPusher( + createHttpPusher(pushKey, PushConfig.pusher_http_url, matrixClient.sessionId.value) + ) } private suspend fun createHttpPusher(