diff --git a/app/build.gradle.kts b/app/build.gradle.kts index 524af1b314..d0716a23d7 100644 --- a/app/build.gradle.kts +++ b/app/build.gradle.kts @@ -200,6 +200,7 @@ dependencies { allFeatures() implementation(projects.tests.uitests) implementation(projects.anvilannotations) + implementation(projects.appnav) anvil(projects.anvilcodegen) // https://developer.android.com/studio/write/java8-support#library-desugaring-versions diff --git a/app/src/main/kotlin/io/element/android/x/MainNode.kt b/app/src/main/kotlin/io/element/android/x/MainNode.kt index 0c9428b183..23c0c05c37 100644 --- a/app/src/main/kotlin/io/element/android/x/MainNode.kt +++ b/app/src/main/kotlin/io/element/android/x/MainNode.kt @@ -16,6 +16,7 @@ package io.element.android.x +import android.os.Parcelable import androidx.compose.runtime.Composable import androidx.compose.ui.Modifier import com.bumble.appyx.core.composable.Children @@ -23,25 +24,26 @@ import com.bumble.appyx.core.modality.BuildContext import com.bumble.appyx.core.navigation.model.permanent.PermanentNavModel import com.bumble.appyx.core.node.Node import com.bumble.appyx.core.node.ParentNode +import io.element.android.appnav.LoggedInFlowNode +import io.element.android.appnav.RoomFlowNode +import io.element.android.appnav.RootFlowNode import io.element.android.libraries.architecture.bindings import io.element.android.libraries.architecture.createNode import io.element.android.libraries.di.DaggerComponentOwner import io.element.android.libraries.matrix.MatrixClient import io.element.android.libraries.matrix.room.MatrixRoom -import io.element.android.x.di.MainDaggerComponentOwner +import io.element.android.x.di.MainDaggerComponentsOwner import io.element.android.x.di.RoomComponent import io.element.android.x.di.SessionComponent -import io.element.android.x.node.LoggedInFlowNode -import io.element.android.x.node.RoomFlowNode -import io.element.android.x.node.RootFlowNode +import kotlinx.parcelize.Parcelize class MainNode( buildContext: BuildContext, - private val mainDaggerComponentOwner: MainDaggerComponentOwner, + private val mainDaggerComponentOwner: MainDaggerComponentsOwner, ) : - ParentNode( + ParentNode( navModel = PermanentNavModel( - navTargets = setOf(NavTarget), + navTargets = setOf(RootNavTarget), savedStateMap = buildContext.savedStateMap, ), buildContext = buildContext, @@ -70,7 +72,7 @@ class MainNode( } } - override fun resolve(navTarget: NavTarget, buildContext: BuildContext): Node { + override fun resolve(navTarget: RootNavTarget, buildContext: BuildContext): Node { return createNode(buildContext, plugins = listOf(loggedInFlowNodeCallback, roomFlowNodeCallback)) } @@ -79,5 +81,6 @@ class MainNode( Children(navModel = navModel) } - object NavTarget + @Parcelize + object RootNavTarget : Parcelable } diff --git a/app/src/main/kotlin/io/element/android/x/di/AppBindings.kt b/app/src/main/kotlin/io/element/android/x/di/AppBindings.kt index 4505b1663d..1bdab0a6ac 100644 --- a/app/src/main/kotlin/io/element/android/x/di/AppBindings.kt +++ b/app/src/main/kotlin/io/element/android/x/di/AppBindings.kt @@ -17,10 +17,11 @@ package io.element.android.x.di import com.squareup.anvil.annotations.ContributesTo +import io.element.android.appnav.MatrixClientsHolder import io.element.android.libraries.di.AppScope @ContributesTo(AppScope::class) interface AppBindings { fun matrixClientsHolder(): MatrixClientsHolder - fun mainDaggerComponentOwner(): MainDaggerComponentOwner + fun mainDaggerComponentOwner(): MainDaggerComponentsOwner } diff --git a/app/src/main/kotlin/io/element/android/x/di/MainDaggerComponentOwner.kt b/app/src/main/kotlin/io/element/android/x/di/MainDaggerComponentsOwner.kt similarity index 92% rename from app/src/main/kotlin/io/element/android/x/di/MainDaggerComponentOwner.kt rename to app/src/main/kotlin/io/element/android/x/di/MainDaggerComponentsOwner.kt index 4a3017e984..5489b07830 100644 --- a/app/src/main/kotlin/io/element/android/x/di/MainDaggerComponentOwner.kt +++ b/app/src/main/kotlin/io/element/android/x/di/MainDaggerComponentsOwner.kt @@ -24,7 +24,7 @@ import io.element.android.libraries.di.SingleIn import javax.inject.Inject @SingleIn(AppScope::class) -class MainDaggerComponentOwner @Inject constructor(@ApplicationContext context: Context) : DaggerComponentOwner { +class MainDaggerComponentsOwner @Inject constructor(@ApplicationContext context: Context) : DaggerComponentOwner { private val daggerComponents = LinkedHashMap().apply { put("app", (context as DaggerComponentOwner).daggerComponent) diff --git a/app/src/main/kotlin/io/element/android/x/root/MatrixClientsHolder.kt b/app/src/main/kotlin/io/element/android/x/root/MatrixClientsHolder.kt deleted file mode 100644 index d4cb6b6552..0000000000 --- a/app/src/main/kotlin/io/element/android/x/root/MatrixClientsHolder.kt +++ /dev/null @@ -1,63 +0,0 @@ -package io.element.android.x.root - -import android.os.Bundle -import io.element.android.libraries.di.AppScope -import io.element.android.libraries.di.SingleIn -import io.element.android.libraries.matrix.MatrixClient -import io.element.android.libraries.matrix.auth.MatrixAuthenticationService -import io.element.android.libraries.matrix.core.SessionId -import kotlinx.coroutines.runBlocking -import timber.log.Timber -import java.util.concurrent.ConcurrentHashMap -import javax.inject.Inject - -private const val SAVE_INSTANCE_KEY = "io.element.android.x.di.MatrixClientsHolder.SaveInstanceKey" - -@SingleIn(AppScope::class) -class MatrixClientsHolder @Inject constructor(private val authenticationService: MatrixAuthenticationService) { - - private val sessionIdsToMatrixClient = ConcurrentHashMap() - - fun add(matrixClient: MatrixClient) { - sessionIdsToMatrixClient[matrixClient.sessionId] = matrixClient - } - - fun removeAll() { - sessionIdsToMatrixClient.clear() - } - - fun remove(sessionId: SessionId) { - sessionIdsToMatrixClient.remove(sessionId) - } - - fun isEmpty(): Boolean = sessionIdsToMatrixClient.isEmpty() - - fun knowSession(sessionId: SessionId): Boolean = sessionIdsToMatrixClient.containsKey(sessionId) - - fun getOrNull(sessionId: SessionId): MatrixClient? { - return sessionIdsToMatrixClient[sessionId] - } - - @Suppress("DEPRECATION") - fun restore(savedInstanceState: Bundle?) { - if (savedInstanceState == null || sessionIdsToMatrixClient.isNotEmpty()) return - val sessionIds = savedInstanceState.getSerializable(SAVE_INSTANCE_KEY) as? Array - if (sessionIds.isNullOrEmpty()) return - // Not ideal but should only happens in case of process recreation. This ensure we restore all the active sessions before restoring the node graphs. - runBlocking { - sessionIds.forEach { sessionId -> - Timber.v("Restore matrix session: $sessionId") - val matrixClient = authenticationService.restoreSession(sessionId) - if (matrixClient != null) { - add(matrixClient) - } - } - } - } - - fun onSaveInstanceState(outState: Bundle) { - val sessionKeys = sessionIdsToMatrixClient.keys.toTypedArray() - Timber.v("Save matrix session keys = $sessionKeys") - outState.putSerializable(SAVE_INSTANCE_KEY, sessionKeys) - } -} diff --git a/appnav/build.gradle.kts b/appnav/build.gradle.kts new file mode 100644 index 0000000000..cb8d2d3595 --- /dev/null +++ b/appnav/build.gradle.kts @@ -0,0 +1,62 @@ +/* + * Copyright (c) 2022 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. + */ + +@file:Suppress("UnstableApiUsage") + +// TODO: Remove once https://youtrack.jetbrains.com/issue/KTIJ-19369 is fixed +@Suppress("DSL_SCOPE_VIOLATION") +plugins { + id("io.element.android-compose-library") + alias(libs.plugins.anvil) + alias(libs.plugins.ksp) + alias(libs.plugins.kapt) + id("kotlin-parcelize") +} + +android { + namespace = "io.element.android.appnav" + +} + +dependencies { + implementation(projects.anvilannotations) + anvil(projects.anvilcodegen) + implementation(libs.dagger) + kapt(libs.dagger.compiler) + + implementation(projects.features.messages.api) + implementation(projects.features.roomlist) + implementation(projects.features.rageshake) + implementation(projects.features.login) + implementation(projects.features.preferences) + implementation(projects.features.logout) + implementation(projects.features.onboarding) + + implementation(projects.libraries.core) + implementation(projects.libraries.architecture) + implementation(projects.libraries.matrix) + implementation(projects.libraries.designsystem) + implementation(projects.libraries.matrixui) + implementation(projects.tests.uitests) + implementation(libs.coil) + + testImplementation(libs.test.junit) + testImplementation(libs.coroutines.test) + testImplementation(libs.molecule.runtime) + testImplementation(libs.test.truth) + testImplementation(libs.test.turbine) + testImplementation(projects.libraries.matrixtest) +} diff --git a/app/src/main/kotlin/io/element/android/x/node/BackstackExt.kt b/appnav/src/main/kotlin/io/element/android/appnav/BackstackExt.kt similarity index 96% rename from app/src/main/kotlin/io/element/android/x/node/BackstackExt.kt rename to appnav/src/main/kotlin/io/element/android/appnav/BackstackExt.kt index 0476e50553..a8a4d3f64c 100644 --- a/app/src/main/kotlin/io/element/android/x/node/BackstackExt.kt +++ b/appnav/src/main/kotlin/io/element/android/appnav/BackstackExt.kt @@ -14,7 +14,7 @@ * limitations under the License. */ -package io.element.android.x.node +package io.element.android.appnav import com.bumble.appyx.navmodel.backstack.BackStack import com.bumble.appyx.navmodel.backstack.operation.NewRoot diff --git a/app/src/main/kotlin/io/element/android/x/node/LoggedInFlowNode.kt b/appnav/src/main/kotlin/io/element/android/appnav/LoggedInFlowNode.kt similarity index 99% rename from app/src/main/kotlin/io/element/android/x/node/LoggedInFlowNode.kt rename to appnav/src/main/kotlin/io/element/android/appnav/LoggedInFlowNode.kt index 8313aa4e45..ce70f4ba03 100644 --- a/app/src/main/kotlin/io/element/android/x/node/LoggedInFlowNode.kt +++ b/appnav/src/main/kotlin/io/element/android/appnav/LoggedInFlowNode.kt @@ -14,7 +14,7 @@ * limitations under the License. */ -package io.element.android.x.node +package io.element.android.appnav import android.os.Parcelable import androidx.compose.foundation.layout.Box @@ -92,9 +92,9 @@ class LoggedInFlowNode @AssistedInject constructor( inputs.matrixClient.startSync() }, onDestroy = { - plugins().forEach { it.onFlowReleased(inputs.matrixClient) } val imageLoaderFactory = bindings().notLoggedInImageLoaderFactory() Coil.setImageLoader(imageLoaderFactory) + plugins().forEach { it.onFlowReleased(inputs.matrixClient) } } ) } diff --git a/app/src/main/kotlin/io/element/android/x/di/MatrixClientsHolder.kt b/appnav/src/main/kotlin/io/element/android/appnav/MatrixClientsHolder.kt similarity index 98% rename from app/src/main/kotlin/io/element/android/x/di/MatrixClientsHolder.kt rename to appnav/src/main/kotlin/io/element/android/appnav/MatrixClientsHolder.kt index 62f3a975c9..a0f2d38d52 100644 --- a/app/src/main/kotlin/io/element/android/x/di/MatrixClientsHolder.kt +++ b/appnav/src/main/kotlin/io/element/android/appnav/MatrixClientsHolder.kt @@ -14,7 +14,7 @@ * limitations under the License. */ -package io.element.android.x.di +package io.element.android.appnav import android.os.Bundle import io.element.android.libraries.di.AppScope @@ -28,6 +28,7 @@ import java.util.concurrent.ConcurrentHashMap import javax.inject.Inject private const val SAVE_INSTANCE_KEY = "io.element.android.x.di.MatrixClientsHolder.SaveInstanceKey" + @SingleIn(AppScope::class) class MatrixClientsHolder @Inject constructor(private val authenticationService: MatrixAuthenticationService) { diff --git a/app/src/main/kotlin/io/element/android/x/node/NodeLifecycleCallback.kt b/appnav/src/main/kotlin/io/element/android/appnav/NodeLifecycleCallback.kt similarity index 95% rename from app/src/main/kotlin/io/element/android/x/node/NodeLifecycleCallback.kt rename to appnav/src/main/kotlin/io/element/android/appnav/NodeLifecycleCallback.kt index d63da9b0cb..a06564c3aa 100644 --- a/app/src/main/kotlin/io/element/android/x/node/NodeLifecycleCallback.kt +++ b/appnav/src/main/kotlin/io/element/android/appnav/NodeLifecycleCallback.kt @@ -14,7 +14,7 @@ * limitations under the License. */ -package io.element.android.x.node +package io.element.android.appnav import com.bumble.appyx.core.plugin.Plugin diff --git a/app/src/main/kotlin/io/element/android/x/node/NotLoggedInFlowNode.kt b/appnav/src/main/kotlin/io/element/android/appnav/NotLoggedInFlowNode.kt similarity index 99% rename from app/src/main/kotlin/io/element/android/x/node/NotLoggedInFlowNode.kt rename to appnav/src/main/kotlin/io/element/android/appnav/NotLoggedInFlowNode.kt index 4b4c4be66c..e3f135372c 100644 --- a/app/src/main/kotlin/io/element/android/x/node/NotLoggedInFlowNode.kt +++ b/appnav/src/main/kotlin/io/element/android/appnav/NotLoggedInFlowNode.kt @@ -14,7 +14,7 @@ * limitations under the License. */ -package io.element.android.x.node +package io.element.android.appnav import android.os.Parcelable import androidx.compose.runtime.Composable diff --git a/app/src/main/kotlin/io/element/android/x/node/RoomFlowNode.kt b/appnav/src/main/kotlin/io/element/android/appnav/RoomFlowNode.kt similarity index 98% rename from app/src/main/kotlin/io/element/android/x/node/RoomFlowNode.kt rename to appnav/src/main/kotlin/io/element/android/appnav/RoomFlowNode.kt index 09125382c5..0ef806208c 100644 --- a/app/src/main/kotlin/io/element/android/x/node/RoomFlowNode.kt +++ b/appnav/src/main/kotlin/io/element/android/appnav/RoomFlowNode.kt @@ -14,7 +14,7 @@ * limitations under the License. */ -package io.element.android.x.node +package io.element.android.appnav import android.os.Parcelable import androidx.compose.runtime.Composable diff --git a/app/src/main/kotlin/io/element/android/x/node/RootFlowNode.kt b/appnav/src/main/kotlin/io/element/android/appnav/RootFlowNode.kt similarity index 92% rename from app/src/main/kotlin/io/element/android/x/node/RootFlowNode.kt rename to appnav/src/main/kotlin/io/element/android/appnav/RootFlowNode.kt index 66f24be1fe..817e119035 100644 --- a/app/src/main/kotlin/io/element/android/x/node/RootFlowNode.kt +++ b/appnav/src/main/kotlin/io/element/android/appnav/RootFlowNode.kt @@ -14,14 +14,17 @@ * limitations under the License. */ -package io.element.android.x.node +package io.element.android.appnav +import android.app.Activity +import android.content.Context import android.os.Parcelable import androidx.compose.foundation.layout.Box 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.lifecycle.lifecycleScope import com.bumble.appyx.core.composable.Children import com.bumble.appyx.core.modality.BuildContext @@ -36,6 +39,8 @@ 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.root.RootPresenter +import io.element.android.appnav.root.RootView import io.element.android.features.rageshake.bugreport.BugReportEntryPoint import io.element.android.libraries.architecture.BackstackNode import io.element.android.libraries.architecture.animation.rememberDefaultTransitionHandler @@ -43,11 +48,10 @@ import io.element.android.libraries.architecture.createNode import io.element.android.libraries.architecture.nodeInputsProvider import io.element.android.libraries.designsystem.theme.components.CircularProgressIndicator import io.element.android.libraries.di.AppScope +import io.element.android.libraries.di.ApplicationContext import io.element.android.libraries.matrix.auth.MatrixAuthenticationService import io.element.android.libraries.matrix.core.SessionId -import io.element.android.x.root.MatrixClientsHolder -import io.element.android.x.root.RootPresenter -import io.element.android.x.root.RootView +import io.element.android.tests.uitests.openShowkase import kotlinx.coroutines.flow.distinctUntilChanged import kotlinx.coroutines.flow.launchIn import kotlinx.coroutines.flow.onEach @@ -56,8 +60,9 @@ import timber.log.Timber @ContributesNode(AppScope::class) class RootFlowNode @AssistedInject constructor( - @Assisted buildContext: BuildContext, + @Assisted val buildContext: BuildContext, @Assisted plugins: List, + @ApplicationContext private val appContext: Context, private val authenticationService: MatrixAuthenticationService, private val matrixClientsHolder: MatrixClientsHolder, private val presenter: RootPresenter, @@ -132,11 +137,16 @@ class RootFlowNode @AssistedInject constructor( @Composable override fun View(modifier: Modifier) { + val activity = LocalContext.current as Activity + fun openShowkase() { + openShowkase(activity) + } val state = presenter.present() RootView( state = state, modifier = modifier, onOpenBugReport = this::onOpenBugReport, + onOpenShowkase = ::openShowkase ) { Children( navModel = backstack, diff --git a/app/src/main/kotlin/io/element/android/x/root/RootEvents.kt b/appnav/src/main/kotlin/io/element/android/appnav/root/RootEvents.kt similarity index 94% rename from app/src/main/kotlin/io/element/android/x/root/RootEvents.kt rename to appnav/src/main/kotlin/io/element/android/appnav/root/RootEvents.kt index a37e9c3c5b..f6e4103017 100644 --- a/app/src/main/kotlin/io/element/android/x/root/RootEvents.kt +++ b/appnav/src/main/kotlin/io/element/android/appnav/root/RootEvents.kt @@ -14,7 +14,7 @@ * limitations under the License. */ -package io.element.android.x.root +package io.element.android.appnav.root sealed interface RootEvents { object HideShowkaseButton : RootEvents diff --git a/app/src/main/kotlin/io/element/android/x/root/RootPresenter.kt b/appnav/src/main/kotlin/io/element/android/appnav/root/RootPresenter.kt similarity index 98% rename from app/src/main/kotlin/io/element/android/x/root/RootPresenter.kt rename to appnav/src/main/kotlin/io/element/android/appnav/root/RootPresenter.kt index 05457e463e..5797eca221 100644 --- a/app/src/main/kotlin/io/element/android/x/root/RootPresenter.kt +++ b/appnav/src/main/kotlin/io/element/android/appnav/root/RootPresenter.kt @@ -14,7 +14,7 @@ * limitations under the License. */ -package io.element.android.x.root +package io.element.android.appnav.root import androidx.compose.runtime.Composable import androidx.compose.runtime.mutableStateOf diff --git a/app/src/main/kotlin/io/element/android/x/root/RootState.kt b/appnav/src/main/kotlin/io/element/android/appnav/root/RootState.kt similarity index 92% rename from app/src/main/kotlin/io/element/android/x/root/RootState.kt rename to appnav/src/main/kotlin/io/element/android/appnav/root/RootState.kt index 4f6b4c2062..e96229d675 100644 --- a/app/src/main/kotlin/io/element/android/x/root/RootState.kt +++ b/appnav/src/main/kotlin/io/element/android/appnav/root/RootState.kt @@ -14,9 +14,10 @@ * limitations under the License. */ -package io.element.android.x.root +package io.element.android.appnav.root import androidx.compose.runtime.Stable +import io.element.android.appnav.root.RootEvents import io.element.android.features.rageshake.crash.ui.CrashDetectionState import io.element.android.features.rageshake.detection.RageshakeDetectionState diff --git a/app/src/main/kotlin/io/element/android/x/root/RootStateProvider.kt b/appnav/src/main/kotlin/io/element/android/appnav/root/RootStateProvider.kt similarity index 97% rename from app/src/main/kotlin/io/element/android/x/root/RootStateProvider.kt rename to appnav/src/main/kotlin/io/element/android/appnav/root/RootStateProvider.kt index 692f5a88f0..ac8142fb9c 100644 --- a/app/src/main/kotlin/io/element/android/x/root/RootStateProvider.kt +++ b/appnav/src/main/kotlin/io/element/android/appnav/root/RootStateProvider.kt @@ -14,7 +14,7 @@ * limitations under the License. */ -package io.element.android.x.root +package io.element.android.appnav.root import androidx.compose.ui.tooling.preview.PreviewParameterProvider import io.element.android.features.rageshake.crash.ui.aCrashDetectionState diff --git a/app/src/main/kotlin/io/element/android/x/root/RootView.kt b/appnav/src/main/kotlin/io/element/android/appnav/root/RootView.kt similarity index 90% rename from app/src/main/kotlin/io/element/android/x/root/RootView.kt rename to appnav/src/main/kotlin/io/element/android/appnav/root/RootView.kt index b46188fbf7..b93a925b12 100644 --- a/app/src/main/kotlin/io/element/android/x/root/RootView.kt +++ b/appnav/src/main/kotlin/io/element/android/appnav/root/RootView.kt @@ -14,16 +14,14 @@ * limitations under the License. */ -package io.element.android.x.root +package io.element.android.appnav.root -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 import androidx.compose.ui.tooling.preview.PreviewParameter import io.element.android.features.rageshake.crash.ui.CrashDetectionEvents @@ -33,14 +31,13 @@ import io.element.android.features.rageshake.detection.RageshakeDetectionView 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.tests.uitests.openShowkase -import io.element.android.x.component.ShowkaseButton @Composable fun RootView( state: RootState, modifier: Modifier = Modifier, onOpenBugReport: () -> Unit = {}, + onOpenShowkase: () -> Unit = {}, children: @Composable BoxScope.() -> Unit, ) { Box( @@ -50,7 +47,6 @@ fun RootView( ) { children() val eventSink = state.eventSink - val context = LocalContext.current fun onOpenBugReport() { state.crashDetectionState.eventSink(CrashDetectionEvents.ResetAppHasCrashed) @@ -61,7 +57,7 @@ fun RootView( ShowkaseButton( isVisible = state.isShowkaseButtonVisible, onCloseClicked = { eventSink(RootEvents.HideShowkaseButton) }, - onClick = { openShowkase(context as Activity) } + onClick = onOpenShowkase ) RageshakeDetectionView( state = state.rageshakeDetectionState, diff --git a/app/src/main/kotlin/io/element/android/x/component/ShowkaseButton.kt b/appnav/src/main/kotlin/io/element/android/appnav/root/ShowkaseButton.kt similarity index 98% rename from app/src/main/kotlin/io/element/android/x/component/ShowkaseButton.kt rename to appnav/src/main/kotlin/io/element/android/appnav/root/ShowkaseButton.kt index 42b9703c2b..23dbbd4397 100644 --- a/app/src/main/kotlin/io/element/android/x/component/ShowkaseButton.kt +++ b/appnav/src/main/kotlin/io/element/android/appnav/root/ShowkaseButton.kt @@ -14,7 +14,7 @@ * limitations under the License. */ -package io.element.android.x.component +package io.element.android.appnav.root import androidx.compose.foundation.layout.padding import androidx.compose.foundation.layout.size diff --git a/app/src/test/kotlin/io/element/android/x/root/FakeBugReporter.kt b/appnav/src/test/kotlin/io/element/android/appnav/FakeBugReporter.kt similarity index 98% rename from app/src/test/kotlin/io/element/android/x/root/FakeBugReporter.kt rename to appnav/src/test/kotlin/io/element/android/appnav/FakeBugReporter.kt index c6f7000cdf..3f17841274 100644 --- a/app/src/test/kotlin/io/element/android/x/root/FakeBugReporter.kt +++ b/appnav/src/test/kotlin/io/element/android/appnav/FakeBugReporter.kt @@ -14,7 +14,7 @@ * limitations under the License. */ -package io.element.android.x.root +package io.element.android.appnav import io.element.android.features.rageshake.reporter.BugReporter import io.element.android.features.rageshake.reporter.BugReporterListener diff --git a/app/src/test/kotlin/io/element/android/x/root/FakeCrashDataStore.kt b/appnav/src/test/kotlin/io/element/android/appnav/FakeCrashDataStore.kt similarity index 97% rename from app/src/test/kotlin/io/element/android/x/root/FakeCrashDataStore.kt rename to appnav/src/test/kotlin/io/element/android/appnav/FakeCrashDataStore.kt index e6ede5ecc0..65d9e39a39 100644 --- a/app/src/test/kotlin/io/element/android/x/root/FakeCrashDataStore.kt +++ b/appnav/src/test/kotlin/io/element/android/appnav/FakeCrashDataStore.kt @@ -14,7 +14,7 @@ * limitations under the License. */ -package io.element.android.x.root +package io.element.android.appnav import io.element.android.features.rageshake.crash.CrashDataStore import kotlinx.coroutines.flow.Flow diff --git a/app/src/test/kotlin/io/element/android/x/root/FakeRageShake.kt b/appnav/src/test/kotlin/io/element/android/appnav/FakeRageShake.kt similarity index 97% rename from app/src/test/kotlin/io/element/android/x/root/FakeRageShake.kt rename to appnav/src/test/kotlin/io/element/android/appnav/FakeRageShake.kt index 9a260d9859..949b9f0b7b 100644 --- a/app/src/test/kotlin/io/element/android/x/root/FakeRageShake.kt +++ b/appnav/src/test/kotlin/io/element/android/appnav/FakeRageShake.kt @@ -14,7 +14,7 @@ * limitations under the License. */ -package io.element.android.x.root +package io.element.android.appnav import io.element.android.features.rageshake.rageshake.RageShake diff --git a/app/src/test/kotlin/io/element/android/x/root/FakeRageshakeDataStore.kt b/appnav/src/test/kotlin/io/element/android/appnav/FakeRageshakeDataStore.kt similarity index 97% rename from app/src/test/kotlin/io/element/android/x/root/FakeRageshakeDataStore.kt rename to appnav/src/test/kotlin/io/element/android/appnav/FakeRageshakeDataStore.kt index e8521fb74f..5dac61db66 100644 --- a/app/src/test/kotlin/io/element/android/x/root/FakeRageshakeDataStore.kt +++ b/appnav/src/test/kotlin/io/element/android/appnav/FakeRageshakeDataStore.kt @@ -14,7 +14,7 @@ * limitations under the License. */ -package io.element.android.x.root +package io.element.android.appnav import io.element.android.features.rageshake.rageshake.RageshakeDataStore import kotlinx.coroutines.flow.Flow diff --git a/app/src/test/kotlin/io/element/android/x/root/FakeScreenshotHolder.kt b/appnav/src/test/kotlin/io/element/android/appnav/FakeScreenshotHolder.kt similarity index 96% rename from app/src/test/kotlin/io/element/android/x/root/FakeScreenshotHolder.kt rename to appnav/src/test/kotlin/io/element/android/appnav/FakeScreenshotHolder.kt index 3a44ece6a2..a13acf1f1f 100644 --- a/app/src/test/kotlin/io/element/android/x/root/FakeScreenshotHolder.kt +++ b/appnav/src/test/kotlin/io/element/android/appnav/FakeScreenshotHolder.kt @@ -14,7 +14,7 @@ * limitations under the License. */ -package io.element.android.x.root +package io.element.android.appnav import android.graphics.Bitmap import io.element.android.features.rageshake.screenshot.ScreenshotHolder diff --git a/app/src/test/kotlin/io/element/android/x/root/RootPresenterTest.kt b/appnav/src/test/kotlin/io/element/android/appnav/RootPresenterTest.kt similarity index 95% rename from app/src/test/kotlin/io/element/android/x/root/RootPresenterTest.kt rename to appnav/src/test/kotlin/io/element/android/appnav/RootPresenterTest.kt index 0e3c6ce866..d912f5dffd 100644 --- a/app/src/test/kotlin/io/element/android/x/root/RootPresenterTest.kt +++ b/appnav/src/test/kotlin/io/element/android/appnav/RootPresenterTest.kt @@ -16,12 +16,14 @@ @file:OptIn(ExperimentalCoroutinesApi::class) -package io.element.android.x.root +package io.element.android.appnav import app.cash.molecule.RecompositionClock import app.cash.molecule.moleculeFlow import app.cash.turbine.test import com.google.common.truth.Truth.assertThat +import io.element.android.appnav.root.RootEvents +import io.element.android.appnav.root.RootPresenter import io.element.android.features.rageshake.crash.ui.CrashDetectionPresenter import io.element.android.features.rageshake.detection.RageshakeDetectionPresenter import io.element.android.features.rageshake.preferences.RageshakePreferencesPresenter diff --git a/settings.gradle.kts b/settings.gradle.kts index 85c58d03e7..8bf0c97b02 100644 --- a/settings.gradle.kts +++ b/settings.gradle.kts @@ -37,6 +37,7 @@ enableFeaturePreview("TYPESAFE_PROJECT_ACCESSORS") rootProject.name = "ElementX" include(":app") +include(":appnav") include(":libraries:core") include(":libraries:rustsdk") include(":libraries:matrix") @@ -65,4 +66,3 @@ include(":libraries:androidutils") include(":samples:minimal") include(":features:messages:api") include(":features:messages:impl") -include(":appnav")