Merge pull request #53 from vector-im/feature/fga/clean_code_hierarchy

Feature/fga/clean code hierarchy
This commit is contained in:
ganfra 2023-01-23 12:26:36 +01:00 committed by GitHub
commit c1789b133e
290 changed files with 1058 additions and 1038 deletions

View file

@ -14,7 +14,7 @@
* limitations under the License.
*/
package io.element.android.x.anvilannotations
package io.element.android.anvilannotations
import kotlin.reflect.KClass

View file

@ -22,7 +22,7 @@ plugins {
}
dependencies {
implementation(project(":anvilannotations"))
implementation(projects.anvilannotations)
api(libs.anvil.compiler.api)
implementation(libs.anvil.compiler.utils)
implementation("com.squareup:kotlinpoet:1.12.0")

View file

@ -16,7 +16,7 @@
@file:OptIn(ExperimentalAnvilApi::class)
package io.element.android.x.anvilcodegen
package io.element.android.anvilcodegen
import com.google.auto.service.AutoService
import com.squareup.anvil.annotations.ContributesTo
@ -46,7 +46,7 @@ import dagger.assisted.Assisted
import dagger.assisted.AssistedFactory
import dagger.assisted.AssistedInject
import dagger.multibindings.IntoMap
import io.element.android.x.anvilannotations.ContributesNode
import io.element.android.anvilannotations.ContributesNode
import org.jetbrains.kotlin.descriptors.ModuleDescriptor
import org.jetbrains.kotlin.name.FqName
import org.jetbrains.kotlin.psi.KtFile
@ -148,7 +148,7 @@ class ContributesNodeCodeGenerator : CodeGenerator {
}
companion object {
private val assistedNodeFactoryFqName = FqName("io.element.android.x.architecture.AssistedNodeFactory")
private val nodeKeyFqName = FqName("io.element.android.x.architecture.NodeKey")
private val assistedNodeFactoryFqName = FqName("io.element.android.libraries.architecture.AssistedNodeFactory")
private val nodeKeyFqName = FqName("io.element.android.libraries.architecture.NodeKey")
}
}

View file

@ -164,9 +164,9 @@ knit {
dependencies {
allLibraries()
allFeatures()
implementation(project(":tests:uitests"))
implementation(project(":anvilannotations"))
anvil(project(":anvilcodegen"))
implementation(projects.tests.uitests)
implementation(projects.anvilannotations)
anvil(projects.anvilcodegen)
// https://developer.android.com/studio/write/java8-support#library-desugaring-versions
coreLibraryDesugaring("com.android.tools:desugar_jdk_libs:1.2.2")

View file

@ -18,7 +18,7 @@ package io.element.android.x
import android.app.Application
import androidx.startup.AppInitializer
import io.element.android.x.di.DaggerComponentOwner
import io.element.android.libraries.di.DaggerComponentOwner
import io.element.android.x.di.AppComponent
import io.element.android.x.di.DaggerAppComponent
import io.element.android.x.initializer.CrashInitializer

View file

@ -25,9 +25,9 @@ import androidx.compose.ui.Modifier
import androidx.core.view.WindowCompat
import com.bumble.appyx.core.integration.NodeHost
import com.bumble.appyx.core.integrationpoint.NodeComponentActivity
import io.element.android.x.architecture.bindings
import io.element.android.x.di.DaggerComponentOwner
import io.element.android.x.designsystem.ElementXTheme
import io.element.android.libraries.architecture.bindings
import io.element.android.libraries.di.DaggerComponentOwner
import io.element.android.libraries.designsystem.ElementXTheme
import io.element.android.x.di.AppBindings
import io.element.android.x.node.RootFlowNode

View file

@ -17,7 +17,8 @@
package io.element.android.x.di
import com.squareup.anvil.annotations.ContributesTo
import io.element.android.x.matrix.auth.MatrixAuthenticationService
import io.element.android.libraries.di.AppScope
import io.element.android.libraries.matrix.auth.MatrixAuthenticationService
import io.element.android.x.root.RootPresenter
import kotlinx.coroutines.CoroutineScope

View file

@ -20,7 +20,10 @@ import android.content.Context
import com.squareup.anvil.annotations.MergeComponent
import dagger.BindsInstance
import dagger.Component
import io.element.android.x.architecture.NodeFactoriesBindings
import io.element.android.libraries.architecture.NodeFactoriesBindings
import io.element.android.libraries.di.AppScope
import io.element.android.libraries.di.ApplicationContext
import io.element.android.libraries.di.SingleIn
@SingleIn(AppScope::class)
@MergeComponent(AppScope::class)

View file

@ -20,7 +20,10 @@ import android.content.Context
import com.squareup.anvil.annotations.ContributesTo
import dagger.Module
import dagger.Provides
import io.element.android.x.core.coroutine.CoroutineDispatchers
import io.element.android.libraries.core.coroutine.CoroutineDispatchers
import io.element.android.libraries.di.AppScope
import io.element.android.libraries.di.ApplicationContext
import io.element.android.libraries.di.SingleIn
import kotlinx.coroutines.CoroutineName
import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.Dispatchers

View file

@ -20,8 +20,11 @@ import com.squareup.anvil.annotations.ContributesTo
import com.squareup.anvil.annotations.MergeSubcomponent
import dagger.BindsInstance
import dagger.Subcomponent
import io.element.android.x.architecture.NodeFactoriesBindings
import io.element.android.x.matrix.room.MatrixRoom
import io.element.android.libraries.architecture.NodeFactoriesBindings
import io.element.android.libraries.di.RoomScope
import io.element.android.libraries.di.SessionScope
import io.element.android.libraries.di.SingleIn
import io.element.android.libraries.matrix.room.MatrixRoom
@SingleIn(RoomScope::class)
@MergeSubcomponent(RoomScope::class)

View file

@ -20,8 +20,11 @@ import com.squareup.anvil.annotations.ContributesTo
import com.squareup.anvil.annotations.MergeSubcomponent
import dagger.BindsInstance
import dagger.Subcomponent
import io.element.android.x.architecture.NodeFactoriesBindings
import io.element.android.x.matrix.MatrixClient
import io.element.android.libraries.architecture.NodeFactoriesBindings
import io.element.android.libraries.di.AppScope
import io.element.android.libraries.di.SessionScope
import io.element.android.libraries.di.SingleIn
import io.element.android.libraries.matrix.MatrixClient
@SingleIn(SessionScope::class)
@MergeSubcomponent(SessionScope::class)

View file

@ -18,7 +18,7 @@ package io.element.android.x.initializer
import android.content.Context
import androidx.startup.Initializer
import io.element.android.x.features.rageshake.crash.VectorUncaughtExceptionHandler
import io.element.android.features.rageshake.crash.VectorUncaughtExceptionHandler
class CrashInitializer : Initializer<Unit> {

View file

@ -19,8 +19,8 @@ package io.element.android.x.initializer
import android.content.Context
import androidx.startup.Initializer
import io.element.android.x.BuildConfig
import io.element.android.x.matrix.tracing.TracingConfigurations
import io.element.android.x.matrix.tracing.setupTracing
import io.element.android.libraries.matrix.tracing.TracingConfigurations
import io.element.android.libraries.matrix.tracing.setupTracing
class MatrixInitializer : Initializer<Unit> {

View file

@ -19,7 +19,7 @@ package io.element.android.x.initializer
import android.content.Context
import androidx.startup.Initializer
import io.element.android.x.BuildConfig
import io.element.android.x.features.rageshake.logs.VectorFileLogger
import io.element.android.features.rageshake.logs.VectorFileLogger
import timber.log.Timber
class TimberInitializer : Initializer<Unit> {

View file

@ -32,16 +32,16 @@ import com.bumble.appyx.core.node.ParentNode
import com.bumble.appyx.core.node.node
import com.bumble.appyx.navmodel.backstack.BackStack
import com.bumble.appyx.navmodel.backstack.operation.push
import io.element.android.x.architecture.bindings
import io.element.android.x.architecture.createNode
import io.element.android.x.di.DaggerComponentOwner
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.x.di.SessionComponent
import io.element.android.x.features.preferences.PreferencesFlowNode
import io.element.android.x.features.roomlist.RoomListNode
import io.element.android.x.matrix.MatrixClient
import io.element.android.x.matrix.core.RoomId
import io.element.android.x.matrix.core.SessionId
import io.element.android.x.matrix.ui.di.MatrixUIBindings
import io.element.android.features.preferences.PreferencesFlowNode
import io.element.android.features.roomlist.RoomListNode
import io.element.android.libraries.matrix.MatrixClient
import io.element.android.libraries.matrix.core.RoomId
import io.element.android.libraries.matrix.core.SessionId
import io.element.android.libraries.matrix.ui.di.MatrixUIBindings
import kotlinx.parcelize.Parcelize
class LoggedInFlowNode(

View file

@ -27,8 +27,8 @@ import com.bumble.appyx.core.node.ParentNode
import com.bumble.appyx.core.node.node
import com.bumble.appyx.navmodel.backstack.BackStack
import com.bumble.appyx.navmodel.backstack.operation.replace
import io.element.android.x.features.login.LoginFlowNode
import io.element.android.x.features.onboarding.OnBoardingScreen
import io.element.android.features.login.LoginFlowNode
import io.element.android.features.onboarding.OnBoardingScreen
import kotlinx.parcelize.Parcelize
import timber.log.Timber

View file

@ -25,12 +25,12 @@ import com.bumble.appyx.core.modality.BuildContext
import com.bumble.appyx.core.node.Node
import com.bumble.appyx.core.node.ParentNode
import com.bumble.appyx.navmodel.backstack.BackStack
import io.element.android.x.architecture.bindings
import io.element.android.x.architecture.createNode
import io.element.android.x.di.DaggerComponentOwner
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.x.di.RoomComponent
import io.element.android.x.features.messages.MessagesNode
import io.element.android.x.matrix.room.MatrixRoom
import io.element.android.features.messages.MessagesNode
import io.element.android.libraries.matrix.room.MatrixRoom
import kotlinx.parcelize.Parcelize
import timber.log.Timber

View file

@ -36,13 +36,13 @@ import com.bumble.appyx.navmodel.backstack.BackStack
import com.bumble.appyx.navmodel.backstack.operation.newRoot
import com.bumble.appyx.navmodel.backstack.operation.pop
import com.bumble.appyx.navmodel.backstack.operation.push
import io.element.android.x.architecture.createNode
import io.element.android.x.architecture.presenterConnector
import io.element.android.x.di.DaggerComponentOwner
import io.element.android.x.features.rageshake.bugreport.BugReportNode
import io.element.android.x.matrix.MatrixClient
import io.element.android.x.matrix.auth.MatrixAuthenticationService
import io.element.android.x.matrix.core.SessionId
import io.element.android.libraries.architecture.createNode
import io.element.android.libraries.architecture.presenterConnector
import io.element.android.libraries.di.DaggerComponentOwner
import io.element.android.features.rageshake.bugreport.BugReportNode
import io.element.android.libraries.matrix.MatrixClient
import io.element.android.libraries.matrix.auth.MatrixAuthenticationService
import io.element.android.libraries.matrix.core.SessionId
import io.element.android.x.root.RootPresenter
import io.element.android.x.root.RootView
import kotlinx.coroutines.flow.distinctUntilChanged

View file

@ -19,10 +19,10 @@ package io.element.android.x.root
import androidx.compose.runtime.Composable
import androidx.compose.runtime.mutableStateOf
import androidx.compose.runtime.saveable.rememberSaveable
import io.element.android.x.architecture.Presenter
import io.element.android.x.features.rageshake.bugreport.BugReportPresenter
import io.element.android.x.features.rageshake.crash.ui.CrashDetectionPresenter
import io.element.android.x.features.rageshake.detection.RageshakeDetectionPresenter
import io.element.android.libraries.architecture.Presenter
import io.element.android.features.rageshake.bugreport.BugReportPresenter
import io.element.android.features.rageshake.crash.ui.CrashDetectionPresenter
import io.element.android.features.rageshake.detection.RageshakeDetectionPresenter
import javax.inject.Inject
class RootPresenter @Inject constructor(

View file

@ -17,9 +17,9 @@
package io.element.android.x.root
import androidx.compose.runtime.Stable
import io.element.android.x.features.rageshake.bugreport.BugReportState
import io.element.android.x.features.rageshake.crash.ui.CrashDetectionState
import io.element.android.x.features.rageshake.detection.RageshakeDetectionState
import io.element.android.features.rageshake.bugreport.BugReportState
import io.element.android.features.rageshake.crash.ui.CrashDetectionState
import io.element.android.features.rageshake.detection.RageshakeDetectionState
@Stable
data class RootState(

View file

@ -25,11 +25,11 @@ import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
import androidx.compose.ui.platform.LocalContext
import io.element.android.x.component.ShowkaseButton
import io.element.android.x.features.rageshake.crash.ui.CrashDetectionEvents
import io.element.android.x.features.rageshake.crash.ui.CrashDetectionView
import io.element.android.x.features.rageshake.detection.RageshakeDetectionEvents
import io.element.android.x.features.rageshake.detection.RageshakeDetectionView
import io.element.android.x.tests.uitests.openShowkase
import io.element.android.features.rageshake.crash.ui.CrashDetectionEvents
import io.element.android.features.rageshake.crash.ui.CrashDetectionView
import io.element.android.features.rageshake.detection.RageshakeDetectionEvents
import io.element.android.features.rageshake.detection.RageshakeDetectionView
import io.element.android.tests.uitests.openShowkase
@Composable
fun RootView(

View file

@ -24,7 +24,7 @@ plugins {
}
android {
namespace = "io.element.android.x.features.login"
namespace = "io.element.android.features.login"
}
anvil {
@ -32,17 +32,17 @@ anvil {
}
dependencies {
implementation(project(":anvilannotations"))
anvil(project(":anvilcodegen"))
implementation(project(":libraries:di"))
implementation(project(":libraries:core"))
implementation(project(":libraries:architecture"))
implementation(project(":libraries:matrix"))
implementation(project(":libraries:designsystem"))
implementation(project(":libraries:elementresources"))
implementation(project(":libraries:testtags"))
implementation(projects.anvilannotations)
anvil(projects.anvilcodegen)
implementation(projects.libraries.di)
implementation(projects.libraries.core)
implementation(projects.libraries.architecture)
implementation(projects.libraries.matrix)
implementation(projects.libraries.designsystem)
implementation(projects.libraries.elementresources)
implementation(projects.libraries.testtags)
implementation(libs.appyx.core)
implementation(project(":libraries:ui-strings"))
implementation(projects.libraries.uiStrings)
ksp(libs.showkase.processor)
testImplementation(libs.test.junit)
androidTestImplementation(libs.test.junitext)

View file

@ -14,7 +14,7 @@
* limitations under the License.
*/
package io.element.android.x.features.login
package io.element.android.features.login
import androidx.test.ext.junit.runners.AndroidJUnit4
import androidx.test.platform.app.InstrumentationRegistry
@ -33,6 +33,6 @@ class ExampleInstrumentedTest {
fun useAppContext() {
// Context of the app under test.
val appContext = InstrumentationRegistry.getInstrumentation().targetContext
assertEquals("io.element.android.x.features.login.test", appContext.packageName)
assertEquals("io.element.android.features.login.test", appContext.packageName)
}
}

View file

@ -14,7 +14,7 @@
* limitations under the License.
*/
package io.element.android.x.features.login
package io.element.android.features.login
import android.os.Parcelable
import androidx.compose.runtime.Composable
@ -25,9 +25,9 @@ import com.bumble.appyx.core.node.Node
import com.bumble.appyx.core.node.ParentNode
import com.bumble.appyx.navmodel.backstack.BackStack
import com.bumble.appyx.navmodel.backstack.operation.push
import io.element.android.x.architecture.createNode
import io.element.android.x.features.login.changeserver.ChangeServerNode
import io.element.android.x.features.login.root.LoginRootNode
import io.element.android.libraries.architecture.createNode
import io.element.android.features.login.changeserver.ChangeServerNode
import io.element.android.features.login.root.LoginRootNode
import kotlinx.parcelize.Parcelize
class LoginFlowNode(

View file

@ -14,7 +14,7 @@
* limitations under the License.
*/
package io.element.android.x.features.login.changeserver
package io.element.android.features.login.changeserver
sealed interface ChangeServerEvents {
data class SetServer(val server: String) : ChangeServerEvents

View file

@ -14,7 +14,7 @@
* limitations under the License.
*/
package io.element.android.x.features.login.changeserver
package io.element.android.features.login.changeserver
import androidx.compose.runtime.Composable
import androidx.compose.runtime.collectAsState
@ -25,9 +25,9 @@ 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.x.anvilannotations.ContributesNode
import io.element.android.x.architecture.presenterConnector
import io.element.android.x.di.AppScope
import io.element.android.anvilannotations.ContributesNode
import io.element.android.libraries.architecture.presenterConnector
import io.element.android.libraries.di.AppScope
@ContributesNode(AppScope::class)
class ChangeServerNode @AssistedInject constructor(

View file

@ -14,7 +14,7 @@
* limitations under the License.
*/
package io.element.android.x.features.login.changeserver
package io.element.android.features.login.changeserver
import androidx.compose.runtime.Composable
import androidx.compose.runtime.MutableState
@ -22,10 +22,10 @@ import androidx.compose.runtime.mutableStateOf
import androidx.compose.runtime.remember
import androidx.compose.runtime.rememberCoroutineScope
import androidx.compose.runtime.saveable.rememberSaveable
import io.element.android.x.architecture.Async
import io.element.android.x.architecture.Presenter
import io.element.android.x.architecture.execute
import io.element.android.x.matrix.auth.MatrixAuthenticationService
import io.element.android.libraries.architecture.Async
import io.element.android.libraries.architecture.Presenter
import io.element.android.libraries.architecture.execute
import io.element.android.libraries.matrix.auth.MatrixAuthenticationService
import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.launch
import javax.inject.Inject

View file

@ -14,9 +14,9 @@
* limitations under the License.
*/
package io.element.android.x.features.login.changeserver
package io.element.android.features.login.changeserver
import io.element.android.x.architecture.Async
import io.element.android.libraries.architecture.Async
data class ChangeServerState(
val homeserver: String = "",

View file

@ -16,7 +16,7 @@
@file:OptIn(ExperimentalMaterial3Api::class)
package io.element.android.x.features.login.changeserver
package io.element.android.features.login.changeserver
import androidx.compose.foundation.background
import androidx.compose.foundation.layout.Box
@ -52,13 +52,13 @@ import androidx.compose.ui.text.style.TextAlign
import androidx.compose.ui.tooling.preview.Preview
import androidx.compose.ui.unit.dp
import androidx.compose.ui.unit.sp
import io.element.android.x.architecture.Async
import io.element.android.x.core.compose.textFieldState
import io.element.android.x.designsystem.components.VectorIcon
import io.element.android.x.features.login.R
import io.element.android.x.features.login.error.changeServerError
import io.element.android.x.libraries.testtags.TestTags
import io.element.android.x.libraries.testtags.testTag
import io.element.android.libraries.architecture.Async
import io.element.android.libraries.core.compose.textFieldState
import io.element.android.libraries.designsystem.components.VectorIcon
import io.element.android.features.login.R
import io.element.android.features.login.error.changeServerError
import io.element.android.libraries.testtags.TestTags
import io.element.android.libraries.testtags.testTag
@Composable
fun ChangeServerView(

View file

@ -14,13 +14,13 @@
* limitations under the License.
*/
package io.element.android.x.features.login.error
package io.element.android.features.login.error
import androidx.compose.runtime.Composable
import androidx.compose.ui.res.stringResource
import io.element.android.x.core.uri.isValidUrl
import io.element.android.x.features.login.root.LoginFormState
import io.element.android.x.ui.strings.R as StringR
import io.element.android.libraries.core.uri.isValidUrl
import io.element.android.features.login.root.LoginFormState
import io.element.android.libraries.ui.strings.R as StringR
@Composable
fun loginError(

View file

@ -14,7 +14,7 @@
* limitations under the License.
*/
package io.element.android.x.features.login.root
package io.element.android.features.login.root
sealed interface LoginRootEvents {
object RefreshHomeServer : LoginRootEvents

View file

@ -14,7 +14,7 @@
* limitations under the License.
*/
package io.element.android.x.features.login.root
package io.element.android.features.login.root
import androidx.compose.runtime.Composable
import androidx.compose.runtime.collectAsState
@ -27,10 +27,10 @@ import com.bumble.appyx.core.plugin.Plugin
import com.bumble.appyx.core.plugin.plugins
import dagger.assisted.Assisted
import dagger.assisted.AssistedInject
import io.element.android.x.anvilannotations.ContributesNode
import io.element.android.x.architecture.presenterConnector
import io.element.android.x.core.compose.OnLifecycleEvent
import io.element.android.x.di.AppScope
import io.element.android.anvilannotations.ContributesNode
import io.element.android.libraries.architecture.presenterConnector
import io.element.android.libraries.core.compose.OnLifecycleEvent
import io.element.android.libraries.di.AppScope
@ContributesNode(AppScope::class)
class LoginRootNode @AssistedInject constructor(

View file

@ -14,7 +14,7 @@
* limitations under the License.
*/
package io.element.android.x.features.login.root
package io.element.android.features.login.root
import androidx.compose.runtime.Composable
import androidx.compose.runtime.MutableState
@ -22,8 +22,8 @@ import androidx.compose.runtime.mutableStateOf
import androidx.compose.runtime.remember
import androidx.compose.runtime.rememberCoroutineScope
import androidx.compose.runtime.saveable.rememberSaveable
import io.element.android.x.architecture.Presenter
import io.element.android.x.matrix.auth.MatrixAuthenticationService
import io.element.android.libraries.architecture.Presenter
import io.element.android.libraries.matrix.auth.MatrixAuthenticationService
import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.launch
import javax.inject.Inject

View file

@ -16,7 +16,7 @@
@file:OptIn(ExperimentalMaterial3Api::class)
package io.element.android.x.features.login.root
package io.element.android.features.login.root
import androidx.compose.foundation.layout.Box
import androidx.compose.foundation.layout.Column
@ -58,12 +58,12 @@ import androidx.compose.ui.text.style.TextAlign
import androidx.compose.ui.tooling.preview.Preview
import androidx.compose.ui.unit.dp
import androidx.compose.ui.unit.sp
import io.element.android.x.core.compose.textFieldState
import io.element.android.x.features.login.error.loginError
import io.element.android.x.libraries.testtags.TestTags
import io.element.android.x.libraries.testtags.testTag
import io.element.android.x.matrix.core.SessionId
import io.element.android.x.ui.strings.R as StringR
import io.element.android.libraries.core.compose.textFieldState
import io.element.android.features.login.error.loginError
import io.element.android.libraries.testtags.TestTags
import io.element.android.libraries.testtags.testTag
import io.element.android.libraries.matrix.core.SessionId
import io.element.android.libraries.ui.strings.R as StringR
@OptIn(ExperimentalMaterial3Api::class)
@Composable

View file

@ -14,10 +14,10 @@
* limitations under the License.
*/
package io.element.android.x.features.login.root
package io.element.android.features.login.root
import android.os.Parcelable
import io.element.android.x.matrix.core.SessionId
import io.element.android.libraries.matrix.core.SessionId
import kotlinx.parcelize.Parcelize
data class LoginRootState(

View file

@ -14,7 +14,7 @@
* limitations under the License.
*/
package io.element.android.x.features.login
package io.element.android.features.login
import org.junit.Assert.assertEquals
import org.junit.Test

View file

@ -23,7 +23,7 @@ plugins {
}
android {
namespace = "io.element.android.x.features.logout"
namespace = "io.element.android.features.logout"
}
anvil {
@ -31,15 +31,15 @@ anvil {
}
dependencies {
implementation(project(":anvilannotations"))
anvil(project(":anvilcodegen"))
implementation(project(":libraries:di"))
implementation(project(":libraries:architecture"))
implementation(project(":libraries:core"))
implementation(project(":libraries:matrix"))
implementation(project(":libraries:designsystem"))
implementation(project(":libraries:elementresources"))
implementation(project(":libraries:ui-strings"))
implementation(projects.anvilannotations)
anvil(projects.anvilcodegen)
implementation(projects.libraries.di)
implementation(projects.libraries.architecture)
implementation(projects.libraries.core)
implementation(projects.libraries.matrix)
implementation(projects.libraries.designsystem)
implementation(projects.libraries.elementresources)
implementation(projects.libraries.uiStrings)
ksp(libs.showkase.processor)
testImplementation(libs.test.junit)
androidTestImplementation(libs.test.junitext)

View file

@ -14,7 +14,7 @@
* limitations under the License.
*/
package io.element.android.x.features.login
package io.element.android.features.logout
import androidx.test.ext.junit.runners.AndroidJUnit4
import androidx.test.platform.app.InstrumentationRegistry
@ -33,6 +33,6 @@ class ExampleInstrumentedTest {
fun useAppContext() {
// Context of the app under test.
val appContext = InstrumentationRegistry.getInstrumentation().targetContext
assertEquals("io.element.android.x.features.login.test", appContext.packageName)
assertEquals("io.element.android.features.login.test", appContext.packageName)
}
}

View file

@ -14,7 +14,7 @@
* limitations under the License.
*/
package io.element.android.x.features.logout
package io.element.android.features.logout
sealed interface LogoutPreferenceEvents {
object Logout : LogoutPreferenceEvents

View file

@ -14,22 +14,23 @@
* limitations under the License.
*/
package io.element.android.x.features.logout
package io.element.android.features.logout
import androidx.compose.runtime.Composable
import androidx.compose.runtime.MutableState
import androidx.compose.runtime.mutableStateOf
import androidx.compose.runtime.remember
import androidx.compose.runtime.rememberCoroutineScope
import io.element.android.x.architecture.Async
import io.element.android.x.architecture.Presenter
import io.element.android.x.architecture.execute
import io.element.android.x.matrix.MatrixClient
import io.element.android.libraries.architecture.Async
import io.element.android.libraries.architecture.Presenter
import io.element.android.libraries.architecture.execute
import io.element.android.libraries.matrix.MatrixClient
import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.launch
import javax.inject.Inject
class LogoutPreferencePresenter @Inject constructor(private val matrixClient: MatrixClient) : Presenter<LogoutPreferenceState> {
class LogoutPreferencePresenter @Inject constructor(private val matrixClient: MatrixClient) :
Presenter<LogoutPreferenceState> {
@Composable
override fun present(): LogoutPreferenceState {

View file

@ -14,7 +14,7 @@
* limitations under the License.
*/
package io.element.android.x.features.logout
package io.element.android.features.logout
import androidx.compose.material.icons.Icons
import androidx.compose.material.icons.filled.Logout
@ -24,12 +24,12 @@ import androidx.compose.runtime.mutableStateOf
import androidx.compose.runtime.remember
import androidx.compose.ui.res.stringResource
import androidx.compose.ui.tooling.preview.Preview
import io.element.android.x.architecture.Async
import io.element.android.x.designsystem.components.ProgressDialog
import io.element.android.x.designsystem.components.dialogs.ConfirmationDialog
import io.element.android.x.designsystem.components.preferences.PreferenceCategory
import io.element.android.x.designsystem.components.preferences.PreferenceText
import io.element.android.x.ui.strings.R as StringR
import io.element.android.libraries.architecture.Async
import io.element.android.libraries.designsystem.components.ProgressDialog
import io.element.android.libraries.designsystem.components.dialogs.ConfirmationDialog
import io.element.android.libraries.designsystem.components.preferences.PreferenceCategory
import io.element.android.libraries.designsystem.components.preferences.PreferenceText
import io.element.android.libraries.ui.strings.R as StringR
@Composable
fun LogoutPreferenceView(

View file

@ -14,9 +14,9 @@
* limitations under the License.
*/
package io.element.android.x.features.logout
package io.element.android.features.logout
import io.element.android.x.architecture.Async
import io.element.android.libraries.architecture.Async
data class LogoutPreferenceState(
val logoutAction: Async<Unit> = Async.Uninitialized,

View file

@ -14,7 +14,7 @@
* limitations under the License.
*/
package io.element.android.x.features.login
package io.element.android.features.logout
import org.junit.Assert.assertEquals
import org.junit.Test

View file

@ -23,7 +23,7 @@ plugins {
}
android {
namespace = "io.element.android.x.features.messages"
namespace = "io.element.android.features.messages"
}
anvil {
@ -31,15 +31,15 @@ anvil {
}
dependencies {
implementation(project(":anvilannotations"))
anvil(project(":anvilcodegen"))
implementation(project(":libraries:di"))
implementation(project(":libraries:core"))
implementation(project(":libraries:architecture"))
implementation(project(":libraries:matrix"))
implementation(project(":libraries:matrixui"))
implementation(project(":libraries:designsystem"))
implementation(project(":libraries:textcomposer"))
implementation(projects.anvilannotations)
anvil(projects.anvilcodegen)
implementation(projects.libraries.di)
implementation(projects.libraries.core)
implementation(projects.libraries.architecture)
implementation(projects.libraries.matrix)
implementation(projects.libraries.matrixui)
implementation(projects.libraries.designsystem)
implementation(projects.libraries.textcomposer)
implementation(libs.appyx.core)
implementation(libs.coil.compose)
implementation(libs.datetime)

View file

@ -14,7 +14,7 @@
* limitations under the License.
*/
package io.element.android.x.features.messages
package io.element.android.features.messages
import androidx.test.ext.junit.runners.AndroidJUnit4
import androidx.test.platform.app.InstrumentationRegistry
@ -33,6 +33,6 @@ class ExampleInstrumentedTest {
fun useAppContext() {
// Context of the app under test.
val appContext = InstrumentationRegistry.getInstrumentation().targetContext
assertEquals("io.element.android.x.features.messages.test", appContext.packageName)
assertEquals("io.element.android.features.messages.test", appContext.packageName)
}
}

View file

@ -14,10 +14,10 @@
* limitations under the License.
*/
package io.element.android.x.features.messages
package io.element.android.features.messages
import io.element.android.x.features.messages.actionlist.model.TimelineItemAction
import io.element.android.x.features.messages.timeline.model.TimelineItem
import io.element.android.features.messages.actionlist.model.TimelineItemAction
import io.element.android.features.messages.timeline.model.TimelineItem
sealed interface MessagesEvents {
data class HandleAction(val action: TimelineItemAction, val messageEvent: TimelineItem.MessageEvent) : MessagesEvents

View file

@ -14,7 +14,7 @@
* limitations under the License.
*/
package io.element.android.x.features.messages
package io.element.android.features.messages
import androidx.compose.runtime.Composable
import androidx.compose.runtime.collectAsState
@ -25,9 +25,9 @@ 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.x.anvilannotations.ContributesNode
import io.element.android.x.architecture.presenterConnector
import io.element.android.x.di.RoomScope
import io.element.android.anvilannotations.ContributesNode
import io.element.android.libraries.architecture.presenterConnector
import io.element.android.libraries.di.RoomScope
@ContributesNode(RoomScope::class)
class MessagesNode @AssistedInject constructor(

View file

@ -14,7 +14,7 @@
* limitations under the License.
*/
package io.element.android.x.features.messages
package io.element.android.features.messages
import androidx.compose.runtime.Composable
import androidx.compose.runtime.LaunchedEffect
@ -24,22 +24,22 @@ import androidx.compose.runtime.mutableStateOf
import androidx.compose.runtime.remember
import androidx.compose.runtime.rememberCoroutineScope
import androidx.compose.runtime.saveable.rememberSaveable
import io.element.android.x.architecture.Presenter
import io.element.android.x.designsystem.components.avatar.AvatarData
import io.element.android.x.designsystem.components.avatar.AvatarSize
import io.element.android.x.features.messages.actionlist.ActionListPresenter
import io.element.android.x.features.messages.actionlist.model.TimelineItemAction
import io.element.android.x.features.messages.textcomposer.MessageComposerEvents
import io.element.android.x.features.messages.textcomposer.MessageComposerPresenter
import io.element.android.x.features.messages.textcomposer.MessageComposerState
import io.element.android.x.features.messages.timeline.TimelineEvents
import io.element.android.x.features.messages.timeline.TimelinePresenter
import io.element.android.x.features.messages.timeline.model.TimelineItem
import io.element.android.x.features.messages.timeline.model.content.TimelineItemTextBasedContent
import io.element.android.x.matrix.MatrixClient
import io.element.android.x.matrix.room.MatrixRoom
import io.element.android.x.matrix.ui.MatrixItemHelper
import io.element.android.x.textcomposer.MessageComposerMode
import io.element.android.libraries.architecture.Presenter
import io.element.android.libraries.designsystem.components.avatar.AvatarData
import io.element.android.libraries.designsystem.components.avatar.AvatarSize
import io.element.android.features.messages.actionlist.ActionListPresenter
import io.element.android.features.messages.actionlist.model.TimelineItemAction
import io.element.android.features.messages.textcomposer.MessageComposerEvents
import io.element.android.features.messages.textcomposer.MessageComposerPresenter
import io.element.android.features.messages.textcomposer.MessageComposerState
import io.element.android.features.messages.timeline.TimelineEvents
import io.element.android.features.messages.timeline.TimelinePresenter
import io.element.android.features.messages.timeline.model.TimelineItem
import io.element.android.features.messages.timeline.model.content.TimelineItemTextBasedContent
import io.element.android.libraries.matrix.MatrixClient
import io.element.android.libraries.matrix.room.MatrixRoom
import io.element.android.libraries.matrix.ui.MatrixItemHelper
import io.element.android.libraries.textcomposer.MessageComposerMode
import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.launch
import timber.log.Timber

View file

@ -14,14 +14,14 @@
* limitations under the License.
*/
package io.element.android.x.features.messages
package io.element.android.features.messages
import androidx.compose.runtime.Immutable
import io.element.android.x.designsystem.components.avatar.AvatarData
import io.element.android.x.features.messages.actionlist.ActionListState
import io.element.android.x.features.messages.textcomposer.MessageComposerState
import io.element.android.x.features.messages.timeline.TimelineState
import io.element.android.x.matrix.core.RoomId
import io.element.android.libraries.designsystem.components.avatar.AvatarData
import io.element.android.features.messages.actionlist.ActionListState
import io.element.android.features.messages.textcomposer.MessageComposerState
import io.element.android.features.messages.timeline.TimelineState
import io.element.android.libraries.matrix.core.RoomId
@Immutable
data class MessagesState(

View file

@ -19,7 +19,7 @@
ExperimentalMaterialApi::class, ExperimentalMaterial3Api::class,
)
package io.element.android.x.features.messages
package io.element.android.features.messages
import androidx.compose.foundation.layout.Column
import androidx.compose.foundation.layout.Row
@ -56,15 +56,15 @@ import androidx.compose.ui.text.font.FontWeight
import androidx.compose.ui.text.style.TextOverflow
import androidx.compose.ui.unit.dp
import androidx.compose.ui.unit.sp
import io.element.android.x.core.compose.LogCompositions
import io.element.android.x.designsystem.components.avatar.Avatar
import io.element.android.x.designsystem.components.avatar.AvatarData
import io.element.android.x.features.messages.actionlist.ActionListEvents
import io.element.android.x.features.messages.actionlist.ActionListView
import io.element.android.x.features.messages.actionlist.model.TimelineItemAction
import io.element.android.x.features.messages.timeline.model.TimelineItem
import io.element.android.x.features.messages.textcomposer.MessageComposerView
import io.element.android.x.features.messages.timeline.TimelineView
import io.element.android.libraries.core.compose.LogCompositions
import io.element.android.libraries.designsystem.components.avatar.Avatar
import io.element.android.libraries.designsystem.components.avatar.AvatarData
import io.element.android.features.messages.actionlist.ActionListEvents
import io.element.android.features.messages.actionlist.ActionListView
import io.element.android.features.messages.actionlist.model.TimelineItemAction
import io.element.android.features.messages.timeline.model.TimelineItem
import io.element.android.features.messages.textcomposer.MessageComposerView
import io.element.android.features.messages.timeline.TimelineView
import kotlinx.coroutines.launch
import timber.log.Timber

View file

@ -14,9 +14,9 @@
* limitations under the License.
*/
package io.element.android.x.features.messages.actionlist
package io.element.android.features.messages.actionlist
import io.element.android.x.features.messages.timeline.model.TimelineItem
import io.element.android.features.messages.timeline.model.TimelineItem
sealed interface ActionListEvents {
object Clear : ActionListEvents

View file

@ -14,17 +14,17 @@
* limitations under the License.
*/
package io.element.android.x.features.messages.actionlist
package io.element.android.features.messages.actionlist
import androidx.compose.runtime.Composable
import androidx.compose.runtime.MutableState
import androidx.compose.runtime.mutableStateOf
import androidx.compose.runtime.remember
import androidx.compose.runtime.rememberCoroutineScope
import io.element.android.x.architecture.Presenter
import io.element.android.x.features.messages.actionlist.model.TimelineItemAction
import io.element.android.x.features.messages.timeline.model.TimelineItem
import io.element.android.x.features.messages.timeline.model.content.TimelineItemRedactedContent
import io.element.android.libraries.architecture.Presenter
import io.element.android.features.messages.actionlist.model.TimelineItemAction
import io.element.android.features.messages.timeline.model.TimelineItem
import io.element.android.features.messages.timeline.model.content.TimelineItemRedactedContent
import kotlinx.collections.immutable.toImmutableList
import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.launch

View file

@ -14,11 +14,11 @@
* limitations under the License.
*/
package io.element.android.x.features.messages.actionlist
package io.element.android.features.messages.actionlist
import androidx.compose.runtime.Immutable
import io.element.android.x.features.messages.actionlist.model.TimelineItemAction
import io.element.android.x.features.messages.timeline.model.TimelineItem
import io.element.android.features.messages.actionlist.model.TimelineItemAction
import io.element.android.features.messages.timeline.model.TimelineItem
import kotlinx.collections.immutable.ImmutableList
@Immutable

View file

@ -16,7 +16,7 @@
@file:OptIn(ExperimentalMaterialApi::class)
package io.element.android.x.features.messages.actionlist
package io.element.android.features.messages.actionlist
import androidx.compose.foundation.clickable
import androidx.compose.foundation.layout.Box
@ -41,9 +41,9 @@ import androidx.compose.runtime.snapshotFlow
import androidx.compose.ui.Modifier
import androidx.compose.ui.graphics.Color
import androidx.compose.ui.unit.dp
import io.element.android.x.designsystem.components.VectorIcon
import io.element.android.x.features.messages.actionlist.model.TimelineItemAction
import io.element.android.x.features.messages.timeline.model.TimelineItem
import io.element.android.libraries.designsystem.components.VectorIcon
import io.element.android.features.messages.actionlist.model.TimelineItemAction
import io.element.android.features.messages.timeline.model.TimelineItem
import kotlinx.coroutines.flow.filter
import kotlinx.coroutines.launch

View file

@ -14,11 +14,11 @@
* limitations under the License.
*/
package io.element.android.x.features.messages.actionlist.model
package io.element.android.features.messages.actionlist.model
import androidx.annotation.DrawableRes
import androidx.compose.runtime.Immutable
import io.element.android.x.designsystem.VectorIcons
import io.element.android.libraries.designsystem.VectorIcons
@Immutable
sealed class TimelineItemAction(
@ -26,9 +26,9 @@ sealed class TimelineItemAction(
@DrawableRes val icon: Int,
val destructive: Boolean = false
) {
object Forward : TimelineItemAction("Forward", VectorIcons.ArrowForward)
object Copy : TimelineItemAction("Copy", VectorIcons.Copy)
object Redact : TimelineItemAction("Redact", VectorIcons.Delete, destructive = true)
object Reply : TimelineItemAction("Reply", VectorIcons.Reply)
object Edit : TimelineItemAction("Edit", VectorIcons.Edit)
object Forward : TimelineItemAction("Forward", io.element.android.libraries.designsystem.VectorIcons.ArrowForward)
object Copy : TimelineItemAction("Copy", io.element.android.libraries.designsystem.VectorIcons.Copy)
object Redact : TimelineItemAction("Redact", io.element.android.libraries.designsystem.VectorIcons.Delete, destructive = true)
object Reply : TimelineItemAction("Reply", io.element.android.libraries.designsystem.VectorIcons.Reply)
object Edit : TimelineItemAction("Edit", io.element.android.libraries.designsystem.VectorIcons.Edit)
}

View file

@ -14,9 +14,9 @@
* limitations under the License.
*/
package io.element.android.x.features.messages.textcomposer
package io.element.android.features.messages.textcomposer
import io.element.android.x.textcomposer.MessageComposerMode
import io.element.android.libraries.textcomposer.MessageComposerMode
sealed interface MessageComposerEvents {
object ToggleFullScreenState : MessageComposerEvents

View file

@ -14,18 +14,18 @@
* limitations under the License.
*/
package io.element.android.x.features.messages.textcomposer
package io.element.android.features.messages.textcomposer
import androidx.compose.runtime.Composable
import androidx.compose.runtime.LaunchedEffect
import androidx.compose.runtime.MutableState
import androidx.compose.runtime.mutableStateOf
import androidx.compose.runtime.saveable.rememberSaveable
import io.element.android.x.architecture.Presenter
import io.element.android.x.core.data.StableCharSequence
import io.element.android.x.core.data.toStableCharSequence
import io.element.android.x.matrix.room.MatrixRoom
import io.element.android.x.textcomposer.MessageComposerMode
import io.element.android.libraries.architecture.Presenter
import io.element.android.libraries.core.data.StableCharSequence
import io.element.android.libraries.core.data.toStableCharSequence
import io.element.android.libraries.matrix.room.MatrixRoom
import io.element.android.libraries.textcomposer.MessageComposerMode
import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.launch
import javax.inject.Inject

View file

@ -14,11 +14,11 @@
* limitations under the License.
*/
package io.element.android.x.features.messages.textcomposer
package io.element.android.features.messages.textcomposer
import androidx.compose.runtime.Immutable
import io.element.android.x.core.data.StableCharSequence
import io.element.android.x.textcomposer.MessageComposerMode
import io.element.android.libraries.core.data.StableCharSequence
import io.element.android.libraries.textcomposer.MessageComposerMode
@Immutable
data class MessageComposerState(

View file

@ -14,12 +14,12 @@
* limitations under the License.
*/
package io.element.android.x.features.messages.textcomposer
package io.element.android.features.messages.textcomposer
import androidx.compose.runtime.Composable
import androidx.compose.ui.Modifier
import io.element.android.x.designsystem.LocalIsDarkTheme
import io.element.android.x.textcomposer.TextComposer
import io.element.android.libraries.designsystem.LocalIsDarkTheme
import io.element.android.libraries.textcomposer.TextComposer
@Composable
fun MessageComposerView(

View file

@ -14,9 +14,9 @@
* limitations under the License.
*/
package io.element.android.x.features.messages.timeline
package io.element.android.features.messages.timeline
import io.element.android.x.matrix.core.EventId
import io.element.android.libraries.matrix.core.EventId
sealed interface TimelineEvents {
object LoadMore : TimelineEvents

View file

@ -14,30 +14,30 @@
* limitations under the License.
*/
package io.element.android.x.features.messages.timeline
package io.element.android.features.messages.timeline
import androidx.recyclerview.widget.DiffUtil
import io.element.android.x.designsystem.components.avatar.AvatarSize
import io.element.android.x.features.messages.timeline.diff.CacheInvalidator
import io.element.android.x.features.messages.timeline.diff.MatrixTimelineItemsDiffCallback
import io.element.android.x.features.messages.timeline.model.AggregatedReaction
import io.element.android.x.features.messages.timeline.model.MessagesItemGroupPosition
import io.element.android.x.features.messages.timeline.model.TimelineItem
import io.element.android.x.features.messages.timeline.model.TimelineItemReactions
import io.element.android.x.features.messages.timeline.model.content.TimelineItemContent
import io.element.android.x.features.messages.timeline.model.content.TimelineItemEmoteContent
import io.element.android.x.features.messages.timeline.model.content.TimelineItemEncryptedContent
import io.element.android.x.features.messages.timeline.model.content.TimelineItemImageContent
import io.element.android.x.features.messages.timeline.model.content.TimelineItemNoticeContent
import io.element.android.x.features.messages.timeline.model.content.TimelineItemRedactedContent
import io.element.android.x.features.messages.timeline.model.content.TimelineItemTextContent
import io.element.android.x.features.messages.timeline.model.content.TimelineItemUnknownContent
import io.element.android.x.features.messages.timeline.util.invalidateLast
import io.element.android.x.matrix.core.EventId
import io.element.android.x.matrix.media.MediaResolver
import io.element.android.x.matrix.room.MatrixRoom
import io.element.android.x.matrix.timeline.MatrixTimelineItem
import io.element.android.x.matrix.ui.MatrixItemHelper
import io.element.android.libraries.designsystem.components.avatar.AvatarSize
import io.element.android.features.messages.timeline.diff.CacheInvalidator
import io.element.android.features.messages.timeline.diff.MatrixTimelineItemsDiffCallback
import io.element.android.features.messages.timeline.model.AggregatedReaction
import io.element.android.features.messages.timeline.model.MessagesItemGroupPosition
import io.element.android.features.messages.timeline.model.TimelineItem
import io.element.android.features.messages.timeline.model.TimelineItemReactions
import io.element.android.features.messages.timeline.model.content.TimelineItemContent
import io.element.android.features.messages.timeline.model.content.TimelineItemEmoteContent
import io.element.android.features.messages.timeline.model.content.TimelineItemEncryptedContent
import io.element.android.features.messages.timeline.model.content.TimelineItemImageContent
import io.element.android.features.messages.timeline.model.content.TimelineItemNoticeContent
import io.element.android.features.messages.timeline.model.content.TimelineItemRedactedContent
import io.element.android.features.messages.timeline.model.content.TimelineItemTextContent
import io.element.android.features.messages.timeline.model.content.TimelineItemUnknownContent
import io.element.android.features.messages.timeline.util.invalidateLast
import io.element.android.libraries.matrix.core.EventId
import io.element.android.libraries.matrix.media.MediaResolver
import io.element.android.libraries.matrix.room.MatrixRoom
import io.element.android.libraries.matrix.timeline.MatrixTimelineItem
import io.element.android.libraries.matrix.ui.MatrixItemHelper
import kotlinx.collections.immutable.toImmutableList
import kotlinx.coroutines.CoroutineDispatcher
import kotlinx.coroutines.flow.MutableStateFlow

View file

@ -14,7 +14,7 @@
* limitations under the License.
*/
package io.element.android.x.features.messages.timeline
package io.element.android.features.messages.timeline
import androidx.compose.runtime.Composable
import androidx.compose.runtime.DisposableEffect
@ -24,14 +24,14 @@ import androidx.compose.runtime.collectAsState
import androidx.compose.runtime.mutableStateOf
import androidx.compose.runtime.rememberCoroutineScope
import androidx.compose.runtime.saveable.rememberSaveable
import io.element.android.x.architecture.Presenter
import io.element.android.x.core.coroutine.CoroutineDispatchers
import io.element.android.x.matrix.MatrixClient
import io.element.android.x.matrix.core.EventId
import io.element.android.x.matrix.room.MatrixRoom
import io.element.android.x.matrix.timeline.MatrixTimeline
import io.element.android.x.matrix.timeline.MatrixTimelineItem
import io.element.android.x.matrix.ui.MatrixItemHelper
import io.element.android.libraries.architecture.Presenter
import io.element.android.libraries.core.coroutine.CoroutineDispatchers
import io.element.android.libraries.matrix.MatrixClient
import io.element.android.libraries.matrix.core.EventId
import io.element.android.libraries.matrix.room.MatrixRoom
import io.element.android.libraries.matrix.timeline.MatrixTimeline
import io.element.android.libraries.matrix.timeline.MatrixTimelineItem
import io.element.android.libraries.matrix.ui.MatrixItemHelper
import kotlinx.collections.immutable.toImmutableList
import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.flow.launchIn

View file

@ -14,11 +14,11 @@
* limitations under the License.
*/
package io.element.android.x.features.messages.timeline
package io.element.android.features.messages.timeline
import androidx.compose.runtime.Immutable
import io.element.android.x.features.messages.timeline.model.TimelineItem
import io.element.android.x.matrix.core.EventId
import io.element.android.features.messages.timeline.model.TimelineItem
import io.element.android.libraries.matrix.core.EventId
import kotlinx.collections.immutable.ImmutableList
@Immutable

View file

@ -14,7 +14,7 @@
* limitations under the License.
*/
package io.element.android.x.features.messages.timeline
package io.element.android.features.messages.timeline
import androidx.compose.foundation.interaction.MutableInteractionSource
import androidx.compose.foundation.layout.Arrangement
@ -58,29 +58,29 @@ import androidx.compose.ui.tooling.preview.Preview
import androidx.compose.ui.tooling.preview.PreviewParameter
import androidx.compose.ui.unit.dp
import androidx.compose.ui.zIndex
import io.element.android.x.core.compose.PairCombinedPreviewParameter
import io.element.android.x.designsystem.components.avatar.Avatar
import io.element.android.x.designsystem.components.avatar.AvatarData
import io.element.android.x.features.messages.timeline.model.AggregatedReaction
import io.element.android.x.features.messages.timeline.model.MessagesItemGroupPosition
import io.element.android.x.features.messages.timeline.model.TimelineItemGroupPositionProvider
import io.element.android.x.features.messages.timeline.model.TimelineItemReactions
import io.element.android.x.features.messages.timeline.model.TimelineItem
import io.element.android.x.features.messages.timeline.model.content.TimelineItemContent
import io.element.android.x.features.messages.timeline.model.content.MessagesTimelineItemContentProvider
import io.element.android.x.features.messages.timeline.model.content.TimelineItemEncryptedContent
import io.element.android.x.features.messages.timeline.model.content.TimelineItemImageContent
import io.element.android.x.features.messages.timeline.model.content.TimelineItemRedactedContent
import io.element.android.x.features.messages.timeline.model.content.TimelineItemTextBasedContent
import io.element.android.x.features.messages.timeline.model.content.TimelineItemUnknownContent
import io.element.android.x.features.messages.timeline.components.MessageEventBubble
import io.element.android.x.features.messages.timeline.components.TimelineItemReactionsView
import io.element.android.x.features.messages.timeline.components.TimelineItemEncryptedView
import io.element.android.x.features.messages.timeline.components.TimelineItemImageView
import io.element.android.x.features.messages.timeline.components.TimelineItemRedactedView
import io.element.android.x.features.messages.timeline.components.TimelineItemTextView
import io.element.android.x.features.messages.timeline.components.TimelineItemUnknownView
import io.element.android.x.matrix.core.EventId
import io.element.android.libraries.core.compose.PairCombinedPreviewParameter
import io.element.android.libraries.designsystem.components.avatar.Avatar
import io.element.android.libraries.designsystem.components.avatar.AvatarData
import io.element.android.features.messages.timeline.model.AggregatedReaction
import io.element.android.features.messages.timeline.model.MessagesItemGroupPosition
import io.element.android.features.messages.timeline.model.TimelineItemGroupPositionProvider
import io.element.android.features.messages.timeline.model.TimelineItemReactions
import io.element.android.features.messages.timeline.model.TimelineItem
import io.element.android.features.messages.timeline.model.content.TimelineItemContent
import io.element.android.features.messages.timeline.model.content.MessagesTimelineItemContentProvider
import io.element.android.features.messages.timeline.model.content.TimelineItemEncryptedContent
import io.element.android.features.messages.timeline.model.content.TimelineItemImageContent
import io.element.android.features.messages.timeline.model.content.TimelineItemRedactedContent
import io.element.android.features.messages.timeline.model.content.TimelineItemTextBasedContent
import io.element.android.features.messages.timeline.model.content.TimelineItemUnknownContent
import io.element.android.features.messages.timeline.components.MessageEventBubble
import io.element.android.features.messages.timeline.components.TimelineItemReactionsView
import io.element.android.features.messages.timeline.components.TimelineItemEncryptedView
import io.element.android.features.messages.timeline.components.TimelineItemImageView
import io.element.android.features.messages.timeline.components.TimelineItemRedactedView
import io.element.android.features.messages.timeline.components.TimelineItemTextView
import io.element.android.features.messages.timeline.components.TimelineItemUnknownView
import io.element.android.libraries.matrix.core.EventId
import kotlinx.collections.immutable.ImmutableList
import kotlinx.collections.immutable.persistentListOf
import kotlinx.coroutines.flow.distinctUntilChanged

View file

@ -14,7 +14,7 @@
* limitations under the License.
*/
package io.element.android.x.features.messages.timeline.components
package io.element.android.features.messages.timeline.components
import androidx.compose.foundation.ExperimentalFoundationApi
import androidx.compose.foundation.combinedClickable
@ -29,14 +29,14 @@ import androidx.compose.ui.Modifier
import androidx.compose.ui.draw.clip
import androidx.compose.ui.graphics.Shape
import androidx.compose.ui.unit.dp
import io.element.android.x.designsystem.LocalIsDarkTheme
import io.element.android.x.designsystem.MessageHighlightDark
import io.element.android.x.designsystem.MessageHighlightLight
import io.element.android.x.designsystem.SystemGrey5Dark
import io.element.android.x.designsystem.SystemGrey5Light
import io.element.android.x.designsystem.SystemGrey6Dark
import io.element.android.x.designsystem.SystemGrey6Light
import io.element.android.x.features.messages.timeline.model.MessagesItemGroupPosition
import io.element.android.libraries.designsystem.LocalIsDarkTheme
import io.element.android.libraries.designsystem.MessageHighlightDark
import io.element.android.libraries.designsystem.MessageHighlightLight
import io.element.android.libraries.designsystem.SystemGrey5Dark
import io.element.android.libraries.designsystem.SystemGrey5Light
import io.element.android.libraries.designsystem.SystemGrey6Dark
import io.element.android.libraries.designsystem.SystemGrey6Light
import io.element.android.features.messages.timeline.model.MessagesItemGroupPosition
private val BUBBLE_RADIUS = 16.dp

View file

@ -14,13 +14,13 @@
* limitations under the License.
*/
package io.element.android.x.features.messages.timeline.components
package io.element.android.features.messages.timeline.components
import androidx.compose.material.icons.Icons
import androidx.compose.material.icons.filled.Warning
import androidx.compose.runtime.Composable
import androidx.compose.ui.Modifier
import io.element.android.x.features.messages.timeline.model.content.TimelineItemEncryptedContent
import io.element.android.features.messages.timeline.model.content.TimelineItemEncryptedContent
@Composable
fun TimelineItemEncryptedView(

View file

@ -16,7 +16,7 @@
@file:OptIn(ExperimentalFoundationApi::class)
package io.element.android.x.features.messages.timeline.components
package io.element.android.features.messages.timeline.components
import androidx.compose.foundation.ExperimentalFoundationApi
import androidx.compose.foundation.layout.Box
@ -33,7 +33,7 @@ import androidx.compose.ui.layout.ContentScale
import androidx.compose.ui.platform.LocalContext
import coil.compose.AsyncImage
import coil.request.ImageRequest
import io.element.android.x.features.messages.timeline.model.content.TimelineItemImageContent
import io.element.android.features.messages.timeline.model.content.TimelineItemImageContent
@Composable
fun TimelineItemImageView(

View file

@ -14,7 +14,7 @@
* limitations under the License.
*/
package io.element.android.x.features.messages.timeline.components
package io.element.android.features.messages.timeline.components
import androidx.compose.foundation.layout.Row
import androidx.compose.foundation.layout.Spacer

View file

@ -14,7 +14,7 @@
* limitations under the License.
*/
package io.element.android.x.features.messages.timeline.components
package io.element.android.features.messages.timeline.components
import androidx.compose.foundation.BorderStroke
import androidx.compose.foundation.layout.Row
@ -32,8 +32,8 @@ import androidx.compose.ui.Modifier
import androidx.compose.ui.unit.dp
import androidx.compose.ui.unit.sp
import com.google.accompanist.flowlayout.FlowRow
import io.element.android.x.features.messages.timeline.model.AggregatedReaction
import io.element.android.x.features.messages.timeline.model.TimelineItemReactions
import io.element.android.features.messages.timeline.model.AggregatedReaction
import io.element.android.features.messages.timeline.model.TimelineItemReactions
@Composable
fun TimelineItemReactionsView(

View file

@ -14,13 +14,13 @@
* limitations under the License.
*/
package io.element.android.x.features.messages.timeline.components
package io.element.android.features.messages.timeline.components
import androidx.compose.material.icons.Icons
import androidx.compose.material.icons.filled.Delete
import androidx.compose.runtime.Composable
import androidx.compose.ui.Modifier
import io.element.android.x.features.messages.timeline.model.content.TimelineItemRedactedContent
import io.element.android.features.messages.timeline.model.content.TimelineItemRedactedContent
@Composable
fun TimelineItemRedactedView(

View file

@ -14,7 +14,7 @@
* limitations under the License.
*/
package io.element.android.x.features.messages.timeline.components
package io.element.android.features.messages.timeline.components
import android.text.SpannableString
import android.text.style.URLSpan
@ -28,10 +28,10 @@ import androidx.compose.ui.Modifier
import androidx.compose.ui.text.SpanStyle
import androidx.compose.ui.text.buildAnnotatedString
import androidx.core.text.util.LinkifyCompat
import io.element.android.x.designsystem.LinkColor
import io.element.android.x.designsystem.components.ClickableLinkText
import io.element.android.x.features.messages.timeline.components.html.HtmlDocument
import io.element.android.x.features.messages.timeline.model.content.TimelineItemTextBasedContent
import io.element.android.libraries.designsystem.LinkColor
import io.element.android.libraries.designsystem.components.ClickableLinkText
import io.element.android.features.messages.timeline.components.html.HtmlDocument
import io.element.android.features.messages.timeline.model.content.TimelineItemTextBasedContent
@Composable
fun TimelineItemTextView(

View file

@ -14,13 +14,13 @@
* limitations under the License.
*/
package io.element.android.x.features.messages.timeline.components
package io.element.android.features.messages.timeline.components
import androidx.compose.material.icons.Icons
import androidx.compose.material.icons.filled.Info
import androidx.compose.runtime.Composable
import androidx.compose.ui.Modifier
import io.element.android.x.features.messages.timeline.model.content.TimelineItemUnknownContent
import io.element.android.features.messages.timeline.model.content.TimelineItemUnknownContent
@Composable
fun TimelineItemUnknownView(

View file

@ -14,7 +14,7 @@
* limitations under the License.
*/
package io.element.android.x.features.messages.timeline.components.html
package io.element.android.features.messages.timeline.components.html
import androidx.compose.foundation.background
import androidx.compose.foundation.interaction.MutableInteractionSource
@ -47,10 +47,10 @@ import androidx.compose.ui.text.withStyle
import androidx.compose.ui.unit.dp
import androidx.compose.ui.unit.sp
import com.google.accompanist.flowlayout.FlowRow
import io.element.android.x.designsystem.LinkColor
import io.element.android.x.designsystem.components.ClickableLinkText
import io.element.android.x.matrix.permalink.PermalinkData
import io.element.android.x.matrix.permalink.PermalinkParser
import io.element.android.libraries.designsystem.LinkColor
import io.element.android.libraries.designsystem.components.ClickableLinkText
import io.element.android.libraries.matrix.permalink.PermalinkData
import io.element.android.libraries.matrix.permalink.PermalinkParser
import kotlinx.collections.immutable.persistentMapOf
import org.jsoup.nodes.Document
import org.jsoup.nodes.Element

View file

@ -14,11 +14,11 @@
* limitations under the License.
*/
package io.element.android.x.features.messages.timeline.diff
package io.element.android.features.messages.timeline.diff
import androidx.recyclerview.widget.ListUpdateCallback
import io.element.android.x.features.messages.timeline.model.TimelineItem
import io.element.android.x.features.messages.timeline.util.invalidateLast
import io.element.android.features.messages.timeline.model.TimelineItem
import io.element.android.features.messages.timeline.util.invalidateLast
import timber.log.Timber
internal class CacheInvalidator(private val itemStatesCache: MutableList<TimelineItem?>) :

View file

@ -14,10 +14,10 @@
* limitations under the License.
*/
package io.element.android.x.features.messages.timeline.diff
package io.element.android.features.messages.timeline.diff
import androidx.recyclerview.widget.DiffUtil
import io.element.android.x.matrix.timeline.MatrixTimelineItem
import io.element.android.libraries.matrix.timeline.MatrixTimelineItem
internal class MatrixTimelineItemsDiffCallback(
private val oldList: List<MatrixTimelineItem>,

View file

@ -14,12 +14,12 @@
* limitations under the License.
*/
package io.element.android.x.features.messages.timeline.model
package io.element.android.features.messages.timeline.model
import androidx.compose.runtime.Immutable
import io.element.android.x.designsystem.components.avatar.AvatarData
import io.element.android.x.features.messages.timeline.model.content.TimelineItemContent
import io.element.android.x.matrix.core.EventId
import io.element.android.libraries.designsystem.components.avatar.AvatarData
import io.element.android.features.messages.timeline.model.content.TimelineItemContent
import io.element.android.libraries.matrix.core.EventId
@Immutable
sealed interface TimelineItem {

View file

@ -14,7 +14,7 @@
* limitations under the License.
*/
package io.element.android.x.features.messages.timeline.model
package io.element.android.features.messages.timeline.model
import androidx.compose.runtime.Immutable
import androidx.compose.ui.tooling.preview.PreviewParameterProvider

View file

@ -14,7 +14,7 @@
* limitations under the License.
*/
package io.element.android.x.features.messages.timeline.model
package io.element.android.features.messages.timeline.model
import kotlinx.collections.immutable.ImmutableList

View file

@ -14,7 +14,7 @@
* limitations under the License.
*/
package io.element.android.x.features.messages.timeline.model.content
package io.element.android.features.messages.timeline.model.content
import androidx.compose.ui.tooling.preview.PreviewParameterProvider
import org.matrix.rustcomponents.sdk.EncryptedMessage

View file

@ -14,7 +14,7 @@
* limitations under the License.
*/
package io.element.android.x.features.messages.timeline.model.content
package io.element.android.features.messages.timeline.model.content
import org.jsoup.nodes.Document

View file

@ -14,7 +14,7 @@
* limitations under the License.
*/
package io.element.android.x.features.messages.timeline.model.content
package io.element.android.features.messages.timeline.model.content
import org.matrix.rustcomponents.sdk.EncryptedMessage

View file

@ -14,9 +14,9 @@
* limitations under the License.
*/
package io.element.android.x.features.messages.timeline.model.content
package io.element.android.features.messages.timeline.model.content
import io.element.android.x.matrix.media.MediaResolver
import io.element.android.libraries.matrix.media.MediaResolver
data class TimelineItemImageContent(
val body: String,

View file

@ -14,7 +14,7 @@
* limitations under the License.
*/
package io.element.android.x.features.messages.timeline.model.content
package io.element.android.features.messages.timeline.model.content
import org.jsoup.nodes.Document

View file

@ -14,6 +14,6 @@
* limitations under the License.
*/
package io.element.android.x.features.messages.timeline.model.content
package io.element.android.features.messages.timeline.model.content
object TimelineItemRedactedContent : TimelineItemContent

View file

@ -14,7 +14,7 @@
* limitations under the License.
*/
package io.element.android.x.features.messages.timeline.model.content
package io.element.android.features.messages.timeline.model.content
import org.jsoup.nodes.Document

View file

@ -14,7 +14,7 @@
* limitations under the License.
*/
package io.element.android.x.features.messages.timeline.model.content
package io.element.android.features.messages.timeline.model.content
import org.jsoup.nodes.Document

View file

@ -14,6 +14,6 @@
* limitations under the License.
*/
package io.element.android.x.features.messages.timeline.model.content
package io.element.android.features.messages.timeline.model.content
object TimelineItemUnknownContent : TimelineItemContent

View file

@ -14,7 +14,7 @@
* limitations under the License.
*/
package io.element.android.x.features.messages.timeline.util
package io.element.android.features.messages.timeline.util
internal inline fun <reified T> MutableList<T?>.invalidateLast() {
val indexOfLast = size

View file

@ -14,7 +14,7 @@
* limitations under the License.
*/
package io.element.android.x.features.logout
package io.element.android.features.messages
import org.junit.Assert.assertEquals
import org.junit.Test

View file

@ -22,16 +22,16 @@ plugins {
}
android {
namespace = "io.element.android.x.features.onboarding"
namespace = "io.element.android.features.onboarding"
}
dependencies {
implementation(project(":libraries:core"))
implementation(project(":libraries:elementresources"))
implementation(project(":libraries:ui-strings"))
implementation(project(":libraries:designsystem"))
implementation(project(":libraries:architecture"))
implementation(project(":libraries:testtags"))
implementation(projects.libraries.core)
implementation(projects.libraries.elementresources)
implementation(projects.libraries.uiStrings)
implementation(projects.libraries.designsystem)
implementation(projects.libraries.architecture)
implementation(projects.libraries.testtags)
implementation(libs.accompanist.pager)
implementation(libs.accompanist.pagerindicator)
implementation(libs.appyx.core)

View file

@ -14,7 +14,7 @@
* limitations under the License.
*/
package io.element.android.x.features.logout
package io.element.android.features.login
import androidx.test.ext.junit.runners.AndroidJUnit4
import androidx.test.platform.app.InstrumentationRegistry
@ -33,6 +33,6 @@ class ExampleInstrumentedTest {
fun useAppContext() {
// Context of the app under test.
val appContext = InstrumentationRegistry.getInstrumentation().targetContext
assertEquals("io.element.android.x.features.login.test", appContext.packageName)
assertEquals("io.element.android.features.login.test", appContext.packageName)
}
}

View file

@ -16,7 +16,7 @@
@file:OptIn(ExperimentalMaterial3Api::class)
package io.element.android.x.features.onboarding
package io.element.android.features.onboarding
import androidx.compose.foundation.Image
import androidx.compose.foundation.layout.Box
@ -49,12 +49,12 @@ import com.google.accompanist.pager.ExperimentalPagerApi
import com.google.accompanist.pager.HorizontalPager
import com.google.accompanist.pager.HorizontalPagerIndicator
import com.google.accompanist.pager.rememberPagerState
import io.element.android.x.designsystem.components.VectorButton
import io.element.android.x.libraries.testtags.TestTags
import io.element.android.x.libraries.testtags.testTag
import io.element.android.libraries.designsystem.components.VectorButton
import io.element.android.libraries.testtags.TestTags
import io.element.android.libraries.testtags.testTag
import kotlinx.coroutines.delay
import kotlinx.coroutines.launch
import io.element.android.x.ui.strings.R as StringR
import io.element.android.libraries.ui.strings.R as StringR
@OptIn(ExperimentalPagerApi::class)
@Composable

View file

@ -14,7 +14,7 @@
* limitations under the License.
*/
package io.element.android.x.features.onboarding
package io.element.android.features.onboarding
import androidx.annotation.DrawableRes
import androidx.annotation.StringRes

View file

@ -14,10 +14,10 @@
* limitations under the License.
*/
package io.element.android.x.features.onboarding
package io.element.android.features.onboarding
import androidx.annotation.DrawableRes
import io.element.android.x.ui.strings.R as StringR
import io.element.android.libraries.ui.strings.R as StringR
class SplashCarouselStateFactory {
fun create(): SplashCarouselState {

View file

@ -14,7 +14,7 @@
* limitations under the License.
*/
package io.element.android.x.features.login
package io.element.android.features.login
import org.junit.Assert.assertEquals
import org.junit.Test

View file

@ -24,7 +24,7 @@ plugins {
}
android {
namespace = "io.element.android.x.features.preferences"
namespace = "io.element.android.features.preferences"
}
anvil {
@ -32,17 +32,17 @@ anvil {
}
dependencies {
implementation(project(":anvilannotations"))
anvil(project(":anvilcodegen"))
implementation(project(":libraries:di"))
implementation(project(":libraries:architecture"))
implementation(project(":libraries:core"))
implementation(project(":libraries:matrixui"))
implementation(project(":features:rageshake"))
implementation(project(":features:logout"))
implementation(project(":libraries:designsystem"))
implementation(project(":libraries:elementresources"))
implementation(project(":libraries:ui-strings"))
implementation(projects.anvilannotations)
anvil(projects.anvilcodegen)
implementation(projects.libraries.di)
implementation(projects.libraries.architecture)
implementation(projects.libraries.core)
implementation(projects.libraries.matrixui)
implementation(projects.features.rageshake)
implementation(projects.features.logout)
implementation(projects.libraries.designsystem)
implementation(projects.libraries.elementresources)
implementation(projects.libraries.uiStrings)
implementation(libs.datetime)
implementation(libs.accompanist.placeholder)
testImplementation(libs.test.junit)

View file

@ -0,0 +1,38 @@
/*
* 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.
*/
package io.element.android.features.preferences
import androidx.test.ext.junit.runners.AndroidJUnit4
import androidx.test.platform.app.InstrumentationRegistry
import org.junit.Assert.assertEquals
import org.junit.Test
import org.junit.runner.RunWith
/**
* Instrumented test, which will execute on an Android device.
*
* See [testing documentation](http://d.android.com/tools/testing).
*/
@RunWith(AndroidJUnit4::class)
class ExampleInstrumentedTest {
@Test
fun useAppContext() {
// Context of the app under test.
val appContext = InstrumentationRegistry.getInstrumentation().targetContext
assertEquals("io.element.android.features.preferences.test", appContext.packageName)
}
}

View file

@ -1,38 +0,0 @@
/*
* 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.
*/
package io.element.android.x.features.preferences
import androidx.test.ext.junit.runners.AndroidJUnit4
import androidx.test.platform.app.InstrumentationRegistry
import org.junit.Assert.assertEquals
import org.junit.Test
import org.junit.runner.RunWith
/**
* Instrumented test, which will execute on an Android device.
*
* See [testing documentation](http://d.android.com/tools/testing).
*/
@RunWith(AndroidJUnit4::class)
class ExampleInstrumentedTest {
@Test
fun useAppContext() {
// Context of the app under test.
val appContext = InstrumentationRegistry.getInstrumentation().targetContext
assertEquals("io.element.android.x.features.preferences.test", appContext.packageName)
}
}

View file

@ -14,7 +14,7 @@
* limitations under the License.
*/
package io.element.android.x.features.preferences
package io.element.android.features.preferences
import android.os.Parcelable
import androidx.compose.runtime.Composable
@ -24,8 +24,8 @@ import com.bumble.appyx.core.modality.BuildContext
import com.bumble.appyx.core.node.Node
import com.bumble.appyx.core.node.ParentNode
import com.bumble.appyx.navmodel.backstack.BackStack
import io.element.android.x.architecture.createNode
import io.element.android.x.features.preferences.root.PreferencesRootNode
import io.element.android.libraries.architecture.createNode
import io.element.android.features.preferences.root.PreferencesRootNode
import kotlinx.parcelize.Parcelize
class PreferencesFlowNode(

View file

@ -14,7 +14,7 @@
* limitations under the License.
*/
package io.element.android.x.features.preferences.root
package io.element.android.features.preferences.root
import androidx.compose.runtime.Composable
import androidx.compose.runtime.collectAsState
@ -26,9 +26,9 @@ import com.bumble.appyx.core.plugin.Plugin
import com.bumble.appyx.core.plugin.plugins
import dagger.assisted.Assisted
import dagger.assisted.AssistedInject
import io.element.android.x.anvilannotations.ContributesNode
import io.element.android.x.architecture.presenterConnector
import io.element.android.x.di.SessionScope
import io.element.android.anvilannotations.ContributesNode
import io.element.android.libraries.architecture.presenterConnector
import io.element.android.libraries.di.SessionScope
@ContributesNode(SessionScope::class)
class PreferencesRootNode @AssistedInject constructor(

Some files were not shown because too many files have changed in this diff Show more