diff --git a/app/build.gradle.kts b/app/build.gradle.kts index dfd3d79759..2ad27323b1 100644 --- a/app/build.gradle.kts +++ b/app/build.gradle.kts @@ -151,6 +151,7 @@ knit { dependencies { implementation(project(":libraries:designsystem")) implementation(project(":libraries:matrix")) + implementation(project(":libraries:matrixui")) implementation(project(":libraries:core")) implementation(project(":features:onboarding")) implementation(project(":features:login")) diff --git a/app/src/main/java/io/element/android/x/di/AppBindings.kt b/app/src/main/java/io/element/android/x/di/AppBindings.kt index 2db4459c9e..f330346e80 100644 --- a/app/src/main/java/io/element/android/x/di/AppBindings.kt +++ b/app/src/main/java/io/element/android/x/di/AppBindings.kt @@ -18,11 +18,13 @@ package io.element.android.x.di import com.squareup.anvil.annotations.ContributesTo import io.element.android.x.matrix.Matrix +import io.element.android.x.matrix.ui.MatrixUi import kotlinx.coroutines.CoroutineScope @ContributesTo(AppScope::class) interface AppBindings { fun coroutineScope(): CoroutineScope fun matrix(): Matrix + fun matrixUi(): MatrixUi fun sessionComponentsOwner(): SessionComponentsOwner } diff --git a/app/src/main/java/io/element/android/x/initializer/CoilInitializer.kt b/app/src/main/java/io/element/android/x/initializer/CoilInitializer.kt index f9bc07dce5..686e656e56 100644 --- a/app/src/main/java/io/element/android/x/initializer/CoilInitializer.kt +++ b/app/src/main/java/io/element/android/x/initializer/CoilInitializer.kt @@ -35,19 +35,18 @@ class CoilInitializer : Initializer { private class ElementImageLoaderFactory( private val context: Context -) : - ImageLoaderFactory { +) : ImageLoaderFactory { override fun newImageLoader(): ImageLoader { return ImageLoader .Builder(context) .components { val appBindings = context.bindings() - val matrix = appBindings.matrix() + val matrixUi = appBindings.matrixUi() val matrixClientProvider = { appBindings .sessionComponentsOwner().activeSessionComponent?.matrixClient() } - matrix.registerCoilComponents(this, matrixClientProvider) + matrixUi.registerCoilComponents(this, matrixClientProvider) } .build() } diff --git a/features/roomlist/build.gradle.kts b/features/roomlist/build.gradle.kts index 31bee1dbb7..6dc8cfd7cc 100644 --- a/features/roomlist/build.gradle.kts +++ b/features/roomlist/build.gradle.kts @@ -34,6 +34,7 @@ dependencies { implementation(project(":libraries:di")) implementation(project(":libraries:core")) implementation(project(":libraries:matrix")) + implementation(project(":libraries:matrixui")) implementation(project(":libraries:designsystem")) implementation(project(":libraries:elementresources")) implementation(libs.mavericks.compose) diff --git a/features/roomlist/src/main/java/io/element/android/x/features/roomlist/RoomListScreen.kt b/features/roomlist/src/main/java/io/element/android/x/features/roomlist/RoomListScreen.kt index ba399e05dc..f19a4d79d1 100644 --- a/features/roomlist/src/main/java/io/element/android/x/features/roomlist/RoomListScreen.kt +++ b/features/roomlist/src/main/java/io/element/android/x/features/roomlist/RoomListScreen.kt @@ -44,11 +44,11 @@ import io.element.android.x.designsystem.ElementXTheme import io.element.android.x.designsystem.components.avatar.AvatarData import io.element.android.x.features.roomlist.components.RoomListTopBar import io.element.android.x.features.roomlist.components.RoomSummaryRow -import io.element.android.x.features.roomlist.model.MatrixUser import io.element.android.x.features.roomlist.model.RoomListRoomSummary import io.element.android.x.features.roomlist.model.RoomListViewState import io.element.android.x.features.roomlist.model.stubbedRoomSummaries import io.element.android.x.matrix.core.RoomId +import io.element.android.x.matrix.ui.model.MatrixUser import kotlinx.collections.immutable.ImmutableList import kotlinx.collections.immutable.toImmutableList diff --git a/features/roomlist/src/main/java/io/element/android/x/features/roomlist/RoomListViewModel.kt b/features/roomlist/src/main/java/io/element/android/x/features/roomlist/RoomListViewModel.kt index d9c1f72813..57a2942d75 100644 --- a/features/roomlist/src/main/java/io/element/android/x/features/roomlist/RoomListViewModel.kt +++ b/features/roomlist/src/main/java/io/element/android/x/features/roomlist/RoomListViewModel.kt @@ -28,13 +28,13 @@ import io.element.android.x.core.di.daggerMavericksViewModelFactory import io.element.android.x.designsystem.components.avatar.AvatarData import io.element.android.x.designsystem.components.avatar.AvatarSize import io.element.android.x.di.SessionScope -import io.element.android.x.features.roomlist.model.MatrixUser import io.element.android.x.features.roomlist.model.RoomListRoomSummary import io.element.android.x.features.roomlist.model.RoomListRoomSummaryPlaceholders import io.element.android.x.features.roomlist.model.RoomListViewState import io.element.android.x.matrix.MatrixClient import io.element.android.x.matrix.media.MediaResolver import io.element.android.x.matrix.room.RoomSummary +import io.element.android.x.matrix.ui.model.MatrixUser import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.flow.combine import kotlinx.coroutines.flow.distinctUntilChanged diff --git a/features/roomlist/src/main/java/io/element/android/x/features/roomlist/components/RoomListTopBar.kt b/features/roomlist/src/main/java/io/element/android/x/features/roomlist/components/RoomListTopBar.kt index 344ad99b64..a6db83f09d 100644 --- a/features/roomlist/src/main/java/io/element/android/x/features/roomlist/components/RoomListTopBar.kt +++ b/features/roomlist/src/main/java/io/element/android/x/features/roomlist/components/RoomListTopBar.kt @@ -54,7 +54,7 @@ import androidx.compose.ui.unit.sp import io.element.android.x.core.compose.LogCompositions import io.element.android.x.core.compose.textFieldState import io.element.android.x.designsystem.components.avatar.Avatar -import io.element.android.x.features.roomlist.model.MatrixUser +import io.element.android.x.matrix.ui.model.MatrixUser @Composable fun RoomListTopBar( diff --git a/features/roomlist/src/main/java/io/element/android/x/features/roomlist/model/RoomListViewState.kt b/features/roomlist/src/main/java/io/element/android/x/features/roomlist/model/RoomListViewState.kt index 42fc6ab913..05f773537d 100644 --- a/features/roomlist/src/main/java/io/element/android/x/features/roomlist/model/RoomListViewState.kt +++ b/features/roomlist/src/main/java/io/element/android/x/features/roomlist/model/RoomListViewState.kt @@ -20,6 +20,7 @@ import com.airbnb.mvrx.Async import com.airbnb.mvrx.MavericksState import com.airbnb.mvrx.Uninitialized import io.element.android.x.matrix.core.RoomId +import io.element.android.x.matrix.ui.model.MatrixUser data class RoomListViewState( val user: Async = Uninitialized, diff --git a/libraries/matrix/build.gradle.kts b/libraries/matrix/build.gradle.kts index dd661c2410..9450134d78 100644 --- a/libraries/matrix/build.gradle.kts +++ b/libraries/matrix/build.gradle.kts @@ -33,7 +33,6 @@ dependencies { implementation(project(":libraries:di")) implementation(project(":libraries:core")) implementation("net.java.dev.jna:jna:5.12.1@aar") - implementation(libs.coil.compose) implementation(libs.androidx.datastore.preferences) implementation(libs.serialization.json) } diff --git a/libraries/matrix/src/main/java/io/element/android/x/matrix/Matrix.kt b/libraries/matrix/src/main/java/io/element/android/x/matrix/Matrix.kt index aaffd43ea2..e2771051d0 100644 --- a/libraries/matrix/src/main/java/io/element/android/x/matrix/Matrix.kt +++ b/libraries/matrix/src/main/java/io/element/android/x/matrix/Matrix.kt @@ -17,13 +17,10 @@ package io.element.android.x.matrix import android.content.Context -import coil.ComponentRegistry import io.element.android.x.core.coroutine.CoroutineDispatchers import io.element.android.x.di.AppScope import io.element.android.x.di.ApplicationContext import io.element.android.x.di.SingleIn -import io.element.android.x.matrix.media.MediaFetcher -import io.element.android.x.matrix.media.MediaKeyer import io.element.android.x.matrix.session.SessionStore import io.element.android.x.matrix.util.logError import java.io.File @@ -58,14 +55,6 @@ class Matrix @Inject constructor( return sessionStore.isLoggedIn() } - fun registerCoilComponents( - builder: ComponentRegistry.Builder, - activeClientProvider: () -> MatrixClient? - ) { - builder.add(MediaKeyer()) - builder.add(MediaFetcher.Factory(activeClientProvider)) - } - suspend fun restoreSession() = withContext(coroutineDispatchers.io) { sessionStore.getLatestSession() ?.let { session -> diff --git a/libraries/matrixui/build.gradle.kts b/libraries/matrixui/build.gradle.kts new file mode 100644 index 0000000000..02a07aa0dd --- /dev/null +++ b/libraries/matrixui/build.gradle.kts @@ -0,0 +1,35 @@ +/* + * 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. + */ + +plugins { + id("io.element.android-compose-library") + alias(libs.plugins.anvil) +} + +android { + namespace = "io.element.android.x.matrix.ui" +} + +anvil { + generateDaggerFactories.set(true) +} + +dependencies { + implementation(project(":libraries:matrix")) + implementation(project(":libraries:designsystem")) + implementation(project(":libraries:core")) + implementation(libs.coil.compose) +} diff --git a/libraries/matrixui/src/main/AndroidManifest.xml b/libraries/matrixui/src/main/AndroidManifest.xml new file mode 100644 index 0000000000..122869829c --- /dev/null +++ b/libraries/matrixui/src/main/AndroidManifest.xml @@ -0,0 +1,18 @@ + + + + diff --git a/libraries/matrixui/src/main/java/io/element/android/x/matrix/ui/MatrixUi.kt b/libraries/matrixui/src/main/java/io/element/android/x/matrix/ui/MatrixUi.kt new file mode 100644 index 0000000000..db4de72d7d --- /dev/null +++ b/libraries/matrixui/src/main/java/io/element/android/x/matrix/ui/MatrixUi.kt @@ -0,0 +1,34 @@ +/* + * 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.matrix.ui + +import coil.ComponentRegistry +import io.element.android.x.matrix.MatrixClient +import io.element.android.x.matrix.ui.media.MediaFetcher +import io.element.android.x.matrix.ui.media.MediaKeyer +import javax.inject.Inject + +class MatrixUi @Inject constructor() { + + fun registerCoilComponents( + builder: ComponentRegistry.Builder, + activeClientProvider: () -> MatrixClient? + ) { + builder.add(MediaKeyer()) + builder.add(MediaFetcher.Factory(activeClientProvider)) + } +} diff --git a/libraries/matrix/src/main/java/io/element/android/x/matrix/media/MediaFetcher.kt b/libraries/matrixui/src/main/java/io/element/android/x/matrix/ui/media/MediaFetcher.kt similarity index 93% rename from libraries/matrix/src/main/java/io/element/android/x/matrix/media/MediaFetcher.kt rename to libraries/matrixui/src/main/java/io/element/android/x/matrix/ui/media/MediaFetcher.kt index 9e4eb7d268..796f699852 100644 --- a/libraries/matrix/src/main/java/io/element/android/x/matrix/media/MediaFetcher.kt +++ b/libraries/matrixui/src/main/java/io/element/android/x/matrix/ui/media/MediaFetcher.kt @@ -14,16 +14,17 @@ * limitations under the License. */ -package io.element.android.x.matrix.media +package io.element.android.x.matrix.ui.media import coil.ImageLoader import coil.fetch.FetchResult import coil.fetch.Fetcher import coil.request.Options import io.element.android.x.matrix.MatrixClient +import io.element.android.x.matrix.media.MediaResolver import java.nio.ByteBuffer -internal class MediaFetcher( +class MediaFetcher( private val mediaResolver: MediaResolver?, private val meta: MediaResolver.Meta, private val options: Options, diff --git a/libraries/matrix/src/main/java/io/element/android/x/matrix/media/MediaKeyer.kt b/libraries/matrixui/src/main/java/io/element/android/x/matrix/ui/media/MediaKeyer.kt similarity index 84% rename from libraries/matrix/src/main/java/io/element/android/x/matrix/media/MediaKeyer.kt rename to libraries/matrixui/src/main/java/io/element/android/x/matrix/ui/media/MediaKeyer.kt index c43b07cb7c..acebdf82ee 100644 --- a/libraries/matrix/src/main/java/io/element/android/x/matrix/media/MediaKeyer.kt +++ b/libraries/matrixui/src/main/java/io/element/android/x/matrix/ui/media/MediaKeyer.kt @@ -14,12 +14,13 @@ * limitations under the License. */ -package io.element.android.x.matrix.media +package io.element.android.x.matrix.ui.media import coil.key.Keyer import coil.request.Options +import io.element.android.x.matrix.media.MediaResolver -internal class MediaKeyer : Keyer { +class MediaKeyer : Keyer { override fun key(data: MediaResolver.Meta, options: Options): String? { return "${data.source.url()}_${data.kind}" } diff --git a/features/roomlist/src/main/java/io/element/android/x/features/roomlist/model/MatrixUser.kt b/libraries/matrixui/src/main/java/io/element/android/x/matrix/ui/model/MatrixUser.kt similarity index 94% rename from features/roomlist/src/main/java/io/element/android/x/features/roomlist/model/MatrixUser.kt rename to libraries/matrixui/src/main/java/io/element/android/x/matrix/ui/model/MatrixUser.kt index cb2957d918..43dbada195 100644 --- a/features/roomlist/src/main/java/io/element/android/x/features/roomlist/model/MatrixUser.kt +++ b/libraries/matrixui/src/main/java/io/element/android/x/matrix/ui/model/MatrixUser.kt @@ -14,7 +14,7 @@ * limitations under the License. */ -package io.element.android.x.features.roomlist.model +package io.element.android.x.matrix.ui.model import androidx.compose.runtime.Stable import io.element.android.x.designsystem.components.avatar.AvatarData diff --git a/settings.gradle.kts b/settings.gradle.kts index 7102431768..b6ac63d837 100644 --- a/settings.gradle.kts +++ b/settings.gradle.kts @@ -37,6 +37,7 @@ include(":app") include(":libraries:core") include(":libraries:rustsdk") include(":libraries:matrix") +include(":libraries:matrixui") include(":libraries:textcomposer") include(":libraries:elementresources") include(":features:onboarding")