From e2bd966878095ac756f04c1735e527a8877575cd Mon Sep 17 00:00:00 2001 From: Benoit Marty Date: Mon, 6 Mar 2023 11:42:55 +0100 Subject: [PATCH 1/3] Split module `dateformatter` into `api`, `impl` and `test`. --- app/build.gradle.kts | 1 + features/messages/build.gradle.kts | 3 +- .../TimelineItemDaySeparatorFactory.kt | 2 +- .../messages/fixtures/timelineItemsFactory.kt | 2 +- features/roomlist/build.gradle.kts | 2 +- .../features/roomlist/RoomListPresenter.kt | 2 +- .../roomlist/FakeLastMessageFormatter.kt | 2 +- .../roomlist/RoomListPresenterTests.kt | 2 +- libraries/dateformatter/{ => api}/.gitignore | 0 libraries/dateformatter/api/build.gradle.kts | 25 ++++++++++++++++ .../{ => api}/consumer-rules.pro | 0 .../{ => api}/proguard-rules.pro | 0 .../{ => api}/src/main/AndroidManifest.xml | 0 .../api}/DaySeparatorFormatter.kt | 2 +- .../api}/LastMessageFormatter.kt | 2 +- libraries/dateformatter/impl/.gitignore | 1 + .../dateformatter/{ => impl}/build.gradle.kts | 6 ++-- .../dateformatter/impl/consumer-rules.pro | 0 .../dateformatter/impl/proguard-rules.pro | 21 +++++++++++++ .../impl/src/main/AndroidManifest.xml | 16 ++++++++++ .../dateformatter/impl/DateFormatters.kt | 0 .../impl/DefaultDaySeparatorFormatter.kt | 2 +- .../impl/DefaultLastMessageFormatter.kt | 2 +- .../impl/LocalDateTimeProvider.kt | 0 .../impl}/di/DateFormatterModule.kt | 2 +- .../impl/DefaultLastMessageFormatterTest.kt | 3 +- libraries/dateformatter/test/.gitignore | 1 + libraries/dateformatter/test/build.gradle.kts | 30 +++++++++++++++++++ .../dateformatter/test/consumer-rules.pro | 0 .../dateformatter/test/proguard-rules.pro | 21 +++++++++++++ .../test/src/main/AndroidManifest.xml | 16 ++++++++++ .../dateformatter/test}/FakeClock.kt | 2 +- .../test}/FakeDaySeparatorFormatter.kt | 4 +-- .../kotlin/extension/DependencyHandleScope.kt | 2 +- samples/minimal/build.gradle.kts | 3 +- settings.gradle.kts | 4 ++- 36 files changed, 160 insertions(+), 21 deletions(-) rename libraries/dateformatter/{ => api}/.gitignore (100%) create mode 100644 libraries/dateformatter/api/build.gradle.kts rename libraries/dateformatter/{ => api}/consumer-rules.pro (100%) rename libraries/dateformatter/{ => api}/proguard-rules.pro (100%) rename libraries/dateformatter/{ => api}/src/main/AndroidManifest.xml (100%) rename libraries/dateformatter/{src/main/kotlin/io/element/android/libraries/dateformatter => api/src/main/kotlin/io/element/android/libraries/dateformatter/api}/DaySeparatorFormatter.kt (92%) rename libraries/dateformatter/{src/main/kotlin/io/element/android/libraries/dateformatter => api/src/main/kotlin/io/element/android/libraries/dateformatter/api}/LastMessageFormatter.kt (92%) create mode 100644 libraries/dateformatter/impl/.gitignore rename libraries/dateformatter/{ => impl}/build.gradle.kts (86%) create mode 100644 libraries/dateformatter/impl/consumer-rules.pro create mode 100644 libraries/dateformatter/impl/proguard-rules.pro create mode 100644 libraries/dateformatter/impl/src/main/AndroidManifest.xml rename libraries/dateformatter/{ => impl}/src/main/kotlin/io/element/android/libraries/dateformatter/impl/DateFormatters.kt (100%) rename libraries/dateformatter/{ => impl}/src/main/kotlin/io/element/android/libraries/dateformatter/impl/DefaultDaySeparatorFormatter.kt (94%) rename libraries/dateformatter/{ => impl}/src/main/kotlin/io/element/android/libraries/dateformatter/impl/DefaultLastMessageFormatter.kt (95%) rename libraries/dateformatter/{ => impl}/src/main/kotlin/io/element/android/libraries/dateformatter/impl/LocalDateTimeProvider.kt (100%) rename libraries/dateformatter/{src/main/kotlin/io/element/android/libraries/dateformatter => impl/src/main/kotlin/io/element/android/libraries/dateformatter/impl}/di/DateFormatterModule.kt (94%) rename libraries/dateformatter/{ => impl}/src/test/kotlin/io/element/android/libraries/dateformatter/impl/DefaultLastMessageFormatterTest.kt (96%) create mode 100644 libraries/dateformatter/test/.gitignore create mode 100644 libraries/dateformatter/test/build.gradle.kts create mode 100644 libraries/dateformatter/test/consumer-rules.pro create mode 100644 libraries/dateformatter/test/proguard-rules.pro create mode 100644 libraries/dateformatter/test/src/main/AndroidManifest.xml rename libraries/dateformatter/{src/test/kotlin/io/element/android/libraries/dateformatter/impl => test/src/main/kotlin/io/element/android/libraries/dateformatter/test}/FakeClock.kt (94%) rename {features/messages/src/test/kotlin/io/element/android/features/messages/fakes => libraries/dateformatter/test/src/main/kotlin/io/element/android/libraries/dateformatter/test}/FakeDaySeparatorFormatter.kt (86%) diff --git a/app/build.gradle.kts b/app/build.gradle.kts index 0f5ba569ff..80df2d1392 100644 --- a/app/build.gradle.kts +++ b/app/build.gradle.kts @@ -199,6 +199,7 @@ dependencies { allLibraries() allFeatures() implementation(projects.libraries.matrix.impl) + implementation(projects.libraries.dateformatter.impl) implementation(projects.tests.uitests) implementation(projects.anvilannotations) anvil(projects.anvilcodegen) diff --git a/features/messages/build.gradle.kts b/features/messages/build.gradle.kts index eb73115c8a..316bb1e5c3 100644 --- a/features/messages/build.gradle.kts +++ b/features/messages/build.gradle.kts @@ -39,7 +39,7 @@ dependencies { implementation(projects.libraries.matrixui) implementation(projects.libraries.designsystem) implementation(projects.libraries.textcomposer) - implementation(projects.libraries.dateformatter) + implementation(projects.libraries.dateformatter.api) implementation(libs.coil.compose) implementation(libs.datetime) implementation(libs.accompanist.flowlayout) @@ -52,6 +52,7 @@ dependencies { testImplementation(libs.test.truth) testImplementation(libs.test.turbine) testImplementation(projects.libraries.matrix.test) + testImplementation(projects.libraries.dateformatter.test) androidTestImplementation(libs.test.junitext) ksp(libs.showkase.processor) diff --git a/features/messages/src/main/kotlin/io/element/android/features/messages/timeline/factories/virtual/TimelineItemDaySeparatorFactory.kt b/features/messages/src/main/kotlin/io/element/android/features/messages/timeline/factories/virtual/TimelineItemDaySeparatorFactory.kt index 43a6beada7..0f2a9f7ede 100644 --- a/features/messages/src/main/kotlin/io/element/android/features/messages/timeline/factories/virtual/TimelineItemDaySeparatorFactory.kt +++ b/features/messages/src/main/kotlin/io/element/android/features/messages/timeline/factories/virtual/TimelineItemDaySeparatorFactory.kt @@ -18,7 +18,7 @@ package io.element.android.features.messages.timeline.factories.virtual import io.element.android.features.messages.timeline.model.virtual.TimelineItemDaySeparatorModel import io.element.android.features.messages.timeline.model.virtual.TimelineItemVirtualModel -import io.element.android.libraries.dateformatter.DaySeparatorFormatter +import io.element.android.libraries.dateformatter.api.DaySeparatorFormatter import org.matrix.rustcomponents.sdk.VirtualTimelineItem import javax.inject.Inject diff --git a/features/messages/src/test/kotlin/io/element/android/features/messages/fixtures/timelineItemsFactory.kt b/features/messages/src/test/kotlin/io/element/android/features/messages/fixtures/timelineItemsFactory.kt index fc4cecf203..7cf4b3b766 100644 --- a/features/messages/src/test/kotlin/io/element/android/features/messages/fixtures/timelineItemsFactory.kt +++ b/features/messages/src/test/kotlin/io/element/android/features/messages/fixtures/timelineItemsFactory.kt @@ -16,7 +16,6 @@ package io.element.android.features.messages.fixtures -import io.element.android.features.messages.fakes.FakeDaySeparatorFormatter import io.element.android.features.messages.timeline.factories.TimelineItemsFactory import io.element.android.features.messages.timeline.factories.event.TimelineItemContentFactory import io.element.android.features.messages.timeline.factories.event.TimelineItemContentFailedToParseMessageFactory @@ -31,6 +30,7 @@ import io.element.android.features.messages.timeline.factories.event.TimelineIte import io.element.android.features.messages.timeline.factories.event.TimelineItemEventFactory import io.element.android.features.messages.timeline.factories.virtual.TimelineItemDaySeparatorFactory import io.element.android.features.messages.timeline.factories.virtual.TimelineItemVirtualFactory +import io.element.android.libraries.dateformatter.test.FakeDaySeparatorFormatter internal fun aTimelineItemsFactory() = TimelineItemsFactory( dispatchers = testCoroutineDispatchers(), diff --git a/features/roomlist/build.gradle.kts b/features/roomlist/build.gradle.kts index 9999262c40..89d66744bb 100644 --- a/features/roomlist/build.gradle.kts +++ b/features/roomlist/build.gradle.kts @@ -41,7 +41,7 @@ dependencies { implementation(projects.libraries.designsystem) implementation(projects.libraries.elementresources) implementation(projects.libraries.uiStrings) - implementation(projects.libraries.dateformatter) + implementation(projects.libraries.dateformatter.api) implementation(libs.accompanist.placeholder) testImplementation(libs.test.junit) diff --git a/features/roomlist/src/main/kotlin/io/element/android/features/roomlist/RoomListPresenter.kt b/features/roomlist/src/main/kotlin/io/element/android/features/roomlist/RoomListPresenter.kt index 905b1746b0..49e53075f9 100644 --- a/features/roomlist/src/main/kotlin/io/element/android/features/roomlist/RoomListPresenter.kt +++ b/features/roomlist/src/main/kotlin/io/element/android/features/roomlist/RoomListPresenter.kt @@ -31,7 +31,7 @@ import io.element.android.features.roomlist.model.RoomListRoomSummaryPlaceholder import io.element.android.features.roomlist.model.RoomListState import io.element.android.libraries.architecture.Presenter import io.element.android.libraries.core.coroutine.parallelMap -import io.element.android.libraries.dateformatter.LastMessageFormatter +import io.element.android.libraries.dateformatter.api.LastMessageFormatter import io.element.android.libraries.designsystem.components.avatar.AvatarData import io.element.android.libraries.designsystem.components.avatar.AvatarSize import io.element.android.libraries.matrix.api.MatrixClient diff --git a/features/roomlist/src/test/kotlin/io/element/android/features/roomlist/FakeLastMessageFormatter.kt b/features/roomlist/src/test/kotlin/io/element/android/features/roomlist/FakeLastMessageFormatter.kt index 997846056a..0040b9f480 100644 --- a/features/roomlist/src/test/kotlin/io/element/android/features/roomlist/FakeLastMessageFormatter.kt +++ b/features/roomlist/src/test/kotlin/io/element/android/features/roomlist/FakeLastMessageFormatter.kt @@ -16,7 +16,7 @@ package io.element.android.features.roomlist -import io.element.android.libraries.dateformatter.LastMessageFormatter +import io.element.android.libraries.dateformatter.api.LastMessageFormatter class FakeLastMessageFormatter : LastMessageFormatter { private var format = "" diff --git a/features/roomlist/src/test/kotlin/io/element/android/features/roomlist/RoomListPresenterTests.kt b/features/roomlist/src/test/kotlin/io/element/android/features/roomlist/RoomListPresenterTests.kt index 377af91261..77e7f236be 100644 --- a/features/roomlist/src/test/kotlin/io/element/android/features/roomlist/RoomListPresenterTests.kt +++ b/features/roomlist/src/test/kotlin/io/element/android/features/roomlist/RoomListPresenterTests.kt @@ -24,7 +24,7 @@ import app.cash.turbine.test import com.google.common.truth.Truth.assertThat import io.element.android.features.roomlist.model.RoomListEvents import io.element.android.features.roomlist.model.RoomListRoomSummary -import io.element.android.libraries.dateformatter.LastMessageFormatter +import io.element.android.libraries.dateformatter.api.LastMessageFormatter import io.element.android.libraries.designsystem.components.avatar.AvatarData import io.element.android.libraries.matrix.test.AN_AVATAR_URL import io.element.android.libraries.matrix.test.AN_EXCEPTION diff --git a/libraries/dateformatter/.gitignore b/libraries/dateformatter/api/.gitignore similarity index 100% rename from libraries/dateformatter/.gitignore rename to libraries/dateformatter/api/.gitignore diff --git a/libraries/dateformatter/api/build.gradle.kts b/libraries/dateformatter/api/build.gradle.kts new file mode 100644 index 0000000000..45f1ada80a --- /dev/null +++ b/libraries/dateformatter/api/build.gradle.kts @@ -0,0 +1,25 @@ +/* + * 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. + */ + +// TODO: Remove once https://youtrack.jetbrains.com/issue/KTIJ-19369 is fixed +@Suppress("DSL_SCOPE_VIOLATION") +plugins { + id("io.element.android-library") +} + +android { + namespace = "io.element.android.libraries.dateformatter.api" +} diff --git a/libraries/dateformatter/consumer-rules.pro b/libraries/dateformatter/api/consumer-rules.pro similarity index 100% rename from libraries/dateformatter/consumer-rules.pro rename to libraries/dateformatter/api/consumer-rules.pro diff --git a/libraries/dateformatter/proguard-rules.pro b/libraries/dateformatter/api/proguard-rules.pro similarity index 100% rename from libraries/dateformatter/proguard-rules.pro rename to libraries/dateformatter/api/proguard-rules.pro diff --git a/libraries/dateformatter/src/main/AndroidManifest.xml b/libraries/dateformatter/api/src/main/AndroidManifest.xml similarity index 100% rename from libraries/dateformatter/src/main/AndroidManifest.xml rename to libraries/dateformatter/api/src/main/AndroidManifest.xml diff --git a/libraries/dateformatter/src/main/kotlin/io/element/android/libraries/dateformatter/DaySeparatorFormatter.kt b/libraries/dateformatter/api/src/main/kotlin/io/element/android/libraries/dateformatter/api/DaySeparatorFormatter.kt similarity index 92% rename from libraries/dateformatter/src/main/kotlin/io/element/android/libraries/dateformatter/DaySeparatorFormatter.kt rename to libraries/dateformatter/api/src/main/kotlin/io/element/android/libraries/dateformatter/api/DaySeparatorFormatter.kt index 453bbb2154..682f0c5745 100644 --- a/libraries/dateformatter/src/main/kotlin/io/element/android/libraries/dateformatter/DaySeparatorFormatter.kt +++ b/libraries/dateformatter/api/src/main/kotlin/io/element/android/libraries/dateformatter/api/DaySeparatorFormatter.kt @@ -14,7 +14,7 @@ * limitations under the License. */ -package io.element.android.libraries.dateformatter +package io.element.android.libraries.dateformatter.api interface DaySeparatorFormatter { fun format(timestamp: Long): String diff --git a/libraries/dateformatter/src/main/kotlin/io/element/android/libraries/dateformatter/LastMessageFormatter.kt b/libraries/dateformatter/api/src/main/kotlin/io/element/android/libraries/dateformatter/api/LastMessageFormatter.kt similarity index 92% rename from libraries/dateformatter/src/main/kotlin/io/element/android/libraries/dateformatter/LastMessageFormatter.kt rename to libraries/dateformatter/api/src/main/kotlin/io/element/android/libraries/dateformatter/api/LastMessageFormatter.kt index caa5886cf9..7f61dfac5d 100644 --- a/libraries/dateformatter/src/main/kotlin/io/element/android/libraries/dateformatter/LastMessageFormatter.kt +++ b/libraries/dateformatter/api/src/main/kotlin/io/element/android/libraries/dateformatter/api/LastMessageFormatter.kt @@ -14,7 +14,7 @@ * limitations under the License. */ -package io.element.android.libraries.dateformatter +package io.element.android.libraries.dateformatter.api interface LastMessageFormatter { fun format(timestamp: Long?): String diff --git a/libraries/dateformatter/impl/.gitignore b/libraries/dateformatter/impl/.gitignore new file mode 100644 index 0000000000..42afabfd2a --- /dev/null +++ b/libraries/dateformatter/impl/.gitignore @@ -0,0 +1 @@ +/build \ No newline at end of file diff --git a/libraries/dateformatter/build.gradle.kts b/libraries/dateformatter/impl/build.gradle.kts similarity index 86% rename from libraries/dateformatter/build.gradle.kts rename to libraries/dateformatter/impl/build.gradle.kts index 60ecd95052..3e7f698c1f 100644 --- a/libraries/dateformatter/build.gradle.kts +++ b/libraries/dateformatter/impl/build.gradle.kts @@ -27,17 +27,19 @@ anvil { } android { - namespace = "io.element.android.libraries.dateformatter" + namespace = "io.element.android.libraries.dateformatter.impl" dependencies { anvil(projects.anvilcodegen) implementation(libs.dagger) implementation(projects.libraries.di) implementation(projects.anvilannotations) + + implementation(projects.libraries.dateformatter.api) api(libs.datetime) - ksp(libs.showkase.processor) testImplementation(libs.test.junit) testImplementation(libs.test.truth) + testImplementation(projects.libraries.dateformatter.test) } } diff --git a/libraries/dateformatter/impl/consumer-rules.pro b/libraries/dateformatter/impl/consumer-rules.pro new file mode 100644 index 0000000000..e69de29bb2 diff --git a/libraries/dateformatter/impl/proguard-rules.pro b/libraries/dateformatter/impl/proguard-rules.pro new file mode 100644 index 0000000000..ff59496d81 --- /dev/null +++ b/libraries/dateformatter/impl/proguard-rules.pro @@ -0,0 +1,21 @@ +# Add project specific ProGuard rules here. +# You can control the set of applied configuration files using the +# proguardFiles setting in build.gradle.kts. +# +# For more details, see +# http://developer.android.com/guide/developing/tools/proguard.html + +# If your project uses WebView with JS, uncomment the following +# and specify the fully qualified class name to the JavaScript interface +# class: +#-keepclassmembers class fqcn.of.javascript.interface.for.webview { +# public *; +#} + +# Uncomment this to preserve the line number information for +# debugging stack traces. +#-keepattributes SourceFile,LineNumberTable + +# If you keep the line number information, uncomment this to +# hide the original source file name. +#-renamesourcefileattribute SourceFile \ No newline at end of file diff --git a/libraries/dateformatter/impl/src/main/AndroidManifest.xml b/libraries/dateformatter/impl/src/main/AndroidManifest.xml new file mode 100644 index 0000000000..cf0e6386de --- /dev/null +++ b/libraries/dateformatter/impl/src/main/AndroidManifest.xml @@ -0,0 +1,16 @@ + + diff --git a/libraries/dateformatter/src/main/kotlin/io/element/android/libraries/dateformatter/impl/DateFormatters.kt b/libraries/dateformatter/impl/src/main/kotlin/io/element/android/libraries/dateformatter/impl/DateFormatters.kt similarity index 100% rename from libraries/dateformatter/src/main/kotlin/io/element/android/libraries/dateformatter/impl/DateFormatters.kt rename to libraries/dateformatter/impl/src/main/kotlin/io/element/android/libraries/dateformatter/impl/DateFormatters.kt diff --git a/libraries/dateformatter/src/main/kotlin/io/element/android/libraries/dateformatter/impl/DefaultDaySeparatorFormatter.kt b/libraries/dateformatter/impl/src/main/kotlin/io/element/android/libraries/dateformatter/impl/DefaultDaySeparatorFormatter.kt similarity index 94% rename from libraries/dateformatter/src/main/kotlin/io/element/android/libraries/dateformatter/impl/DefaultDaySeparatorFormatter.kt rename to libraries/dateformatter/impl/src/main/kotlin/io/element/android/libraries/dateformatter/impl/DefaultDaySeparatorFormatter.kt index 29e2c87221..4c6ebbbde0 100644 --- a/libraries/dateformatter/src/main/kotlin/io/element/android/libraries/dateformatter/impl/DefaultDaySeparatorFormatter.kt +++ b/libraries/dateformatter/impl/src/main/kotlin/io/element/android/libraries/dateformatter/impl/DefaultDaySeparatorFormatter.kt @@ -17,7 +17,7 @@ package io.element.android.libraries.dateformatter.impl import com.squareup.anvil.annotations.ContributesBinding -import io.element.android.libraries.dateformatter.DaySeparatorFormatter +import io.element.android.libraries.dateformatter.api.DaySeparatorFormatter import io.element.android.libraries.di.AppScope import javax.inject.Inject diff --git a/libraries/dateformatter/src/main/kotlin/io/element/android/libraries/dateformatter/impl/DefaultLastMessageFormatter.kt b/libraries/dateformatter/impl/src/main/kotlin/io/element/android/libraries/dateformatter/impl/DefaultLastMessageFormatter.kt similarity index 95% rename from libraries/dateformatter/src/main/kotlin/io/element/android/libraries/dateformatter/impl/DefaultLastMessageFormatter.kt rename to libraries/dateformatter/impl/src/main/kotlin/io/element/android/libraries/dateformatter/impl/DefaultLastMessageFormatter.kt index 753457c48f..fd7afe55e7 100644 --- a/libraries/dateformatter/src/main/kotlin/io/element/android/libraries/dateformatter/impl/DefaultLastMessageFormatter.kt +++ b/libraries/dateformatter/impl/src/main/kotlin/io/element/android/libraries/dateformatter/impl/DefaultLastMessageFormatter.kt @@ -17,7 +17,7 @@ package io.element.android.libraries.dateformatter.impl import com.squareup.anvil.annotations.ContributesBinding -import io.element.android.libraries.dateformatter.LastMessageFormatter +import io.element.android.libraries.dateformatter.api.LastMessageFormatter import io.element.android.libraries.di.AppScope import javax.inject.Inject diff --git a/libraries/dateformatter/src/main/kotlin/io/element/android/libraries/dateformatter/impl/LocalDateTimeProvider.kt b/libraries/dateformatter/impl/src/main/kotlin/io/element/android/libraries/dateformatter/impl/LocalDateTimeProvider.kt similarity index 100% rename from libraries/dateformatter/src/main/kotlin/io/element/android/libraries/dateformatter/impl/LocalDateTimeProvider.kt rename to libraries/dateformatter/impl/src/main/kotlin/io/element/android/libraries/dateformatter/impl/LocalDateTimeProvider.kt diff --git a/libraries/dateformatter/src/main/kotlin/io/element/android/libraries/dateformatter/di/DateFormatterModule.kt b/libraries/dateformatter/impl/src/main/kotlin/io/element/android/libraries/dateformatter/impl/di/DateFormatterModule.kt similarity index 94% rename from libraries/dateformatter/src/main/kotlin/io/element/android/libraries/dateformatter/di/DateFormatterModule.kt rename to libraries/dateformatter/impl/src/main/kotlin/io/element/android/libraries/dateformatter/impl/di/DateFormatterModule.kt index feab851a8b..352306da65 100644 --- a/libraries/dateformatter/src/main/kotlin/io/element/android/libraries/dateformatter/di/DateFormatterModule.kt +++ b/libraries/dateformatter/impl/src/main/kotlin/io/element/android/libraries/dateformatter/impl/di/DateFormatterModule.kt @@ -14,7 +14,7 @@ * limitations under the License. */ -package io.element.android.libraries.dateformatter.di +package io.element.android.libraries.dateformatter.impl.di import com.squareup.anvil.annotations.ContributesTo import dagger.Module diff --git a/libraries/dateformatter/src/test/kotlin/io/element/android/libraries/dateformatter/impl/DefaultLastMessageFormatterTest.kt b/libraries/dateformatter/impl/src/test/kotlin/io/element/android/libraries/dateformatter/impl/DefaultLastMessageFormatterTest.kt similarity index 96% rename from libraries/dateformatter/src/test/kotlin/io/element/android/libraries/dateformatter/impl/DefaultLastMessageFormatterTest.kt rename to libraries/dateformatter/impl/src/test/kotlin/io/element/android/libraries/dateformatter/impl/DefaultLastMessageFormatterTest.kt index cfe3e40fce..1d8390ec9f 100644 --- a/libraries/dateformatter/src/test/kotlin/io/element/android/libraries/dateformatter/impl/DefaultLastMessageFormatterTest.kt +++ b/libraries/dateformatter/impl/src/test/kotlin/io/element/android/libraries/dateformatter/impl/DefaultLastMessageFormatterTest.kt @@ -17,7 +17,8 @@ package io.element.android.libraries.dateformatter.impl import com.google.common.truth.Truth.assertThat -import io.element.android.libraries.dateformatter.LastMessageFormatter +import io.element.android.libraries.dateformatter.api.LastMessageFormatter +import io.element.android.libraries.dateformatter.test.FakeClock import kotlinx.datetime.Instant import kotlinx.datetime.TimeZone import org.junit.Test diff --git a/libraries/dateformatter/test/.gitignore b/libraries/dateformatter/test/.gitignore new file mode 100644 index 0000000000..42afabfd2a --- /dev/null +++ b/libraries/dateformatter/test/.gitignore @@ -0,0 +1 @@ +/build \ No newline at end of file diff --git a/libraries/dateformatter/test/build.gradle.kts b/libraries/dateformatter/test/build.gradle.kts new file mode 100644 index 0000000000..afc7e66059 --- /dev/null +++ b/libraries/dateformatter/test/build.gradle.kts @@ -0,0 +1,30 @@ +/* + * 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. + */ + +// TODO: Remove once https://youtrack.jetbrains.com/issue/KTIJ-19369 is fixed +@Suppress("DSL_SCOPE_VIOLATION") +plugins { + id("io.element.android-library") +} + +android { + namespace = "io.element.android.libraries.dateformatter.test" + + dependencies { + implementation(projects.libraries.dateformatter.api) + api(libs.datetime) + } +} diff --git a/libraries/dateformatter/test/consumer-rules.pro b/libraries/dateformatter/test/consumer-rules.pro new file mode 100644 index 0000000000..e69de29bb2 diff --git a/libraries/dateformatter/test/proguard-rules.pro b/libraries/dateformatter/test/proguard-rules.pro new file mode 100644 index 0000000000..ff59496d81 --- /dev/null +++ b/libraries/dateformatter/test/proguard-rules.pro @@ -0,0 +1,21 @@ +# Add project specific ProGuard rules here. +# You can control the set of applied configuration files using the +# proguardFiles setting in build.gradle.kts. +# +# For more details, see +# http://developer.android.com/guide/developing/tools/proguard.html + +# If your project uses WebView with JS, uncomment the following +# and specify the fully qualified class name to the JavaScript interface +# class: +#-keepclassmembers class fqcn.of.javascript.interface.for.webview { +# public *; +#} + +# Uncomment this to preserve the line number information for +# debugging stack traces. +#-keepattributes SourceFile,LineNumberTable + +# If you keep the line number information, uncomment this to +# hide the original source file name. +#-renamesourcefileattribute SourceFile \ No newline at end of file diff --git a/libraries/dateformatter/test/src/main/AndroidManifest.xml b/libraries/dateformatter/test/src/main/AndroidManifest.xml new file mode 100644 index 0000000000..cf0e6386de --- /dev/null +++ b/libraries/dateformatter/test/src/main/AndroidManifest.xml @@ -0,0 +1,16 @@ + + diff --git a/libraries/dateformatter/src/test/kotlin/io/element/android/libraries/dateformatter/impl/FakeClock.kt b/libraries/dateformatter/test/src/main/kotlin/io/element/android/libraries/dateformatter/test/FakeClock.kt similarity index 94% rename from libraries/dateformatter/src/test/kotlin/io/element/android/libraries/dateformatter/impl/FakeClock.kt rename to libraries/dateformatter/test/src/main/kotlin/io/element/android/libraries/dateformatter/test/FakeClock.kt index 58a5495218..4716b0f5f0 100644 --- a/libraries/dateformatter/src/test/kotlin/io/element/android/libraries/dateformatter/impl/FakeClock.kt +++ b/libraries/dateformatter/test/src/main/kotlin/io/element/android/libraries/dateformatter/test/FakeClock.kt @@ -14,7 +14,7 @@ * limitations under the License. */ -package io.element.android.libraries.dateformatter.impl +package io.element.android.libraries.dateformatter.test import kotlinx.datetime.Clock import kotlinx.datetime.Instant diff --git a/features/messages/src/test/kotlin/io/element/android/features/messages/fakes/FakeDaySeparatorFormatter.kt b/libraries/dateformatter/test/src/main/kotlin/io/element/android/libraries/dateformatter/test/FakeDaySeparatorFormatter.kt similarity index 86% rename from features/messages/src/test/kotlin/io/element/android/features/messages/fakes/FakeDaySeparatorFormatter.kt rename to libraries/dateformatter/test/src/main/kotlin/io/element/android/libraries/dateformatter/test/FakeDaySeparatorFormatter.kt index 40a52c640c..202e3ee5ae 100644 --- a/features/messages/src/test/kotlin/io/element/android/features/messages/fakes/FakeDaySeparatorFormatter.kt +++ b/libraries/dateformatter/test/src/main/kotlin/io/element/android/libraries/dateformatter/test/FakeDaySeparatorFormatter.kt @@ -14,9 +14,9 @@ * limitations under the License. */ -package io.element.android.features.messages.fakes +package io.element.android.libraries.dateformatter.test -import io.element.android.libraries.dateformatter.DaySeparatorFormatter +import io.element.android.libraries.dateformatter.api.DaySeparatorFormatter class FakeDaySeparatorFormatter : DaySeparatorFormatter { diff --git a/plugins/src/main/kotlin/extension/DependencyHandleScope.kt b/plugins/src/main/kotlin/extension/DependencyHandleScope.kt index 8d8f574cb1..87e6b41094 100644 --- a/plugins/src/main/kotlin/extension/DependencyHandleScope.kt +++ b/plugins/src/main/kotlin/extension/DependencyHandleScope.kt @@ -55,7 +55,7 @@ fun DependencyHandlerScope.allLibraries() { implementation(project(":libraries:matrixui")) implementation(project(":libraries:core")) implementation(project(":libraries:architecture")) - implementation(project(":libraries:dateformatter")) + implementation(project(":libraries:dateformatter:api")) implementation(project(":libraries:di")) } diff --git a/samples/minimal/build.gradle.kts b/samples/minimal/build.gradle.kts index 13686e7e61..7271b295e5 100644 --- a/samples/minimal/build.gradle.kts +++ b/samples/minimal/build.gradle.kts @@ -52,7 +52,8 @@ dependencies { implementation(projects.libraries.designsystem) implementation(projects.libraries.architecture) implementation(projects.libraries.core) - implementation(projects.libraries.dateformatter) + implementation(projects.libraries.dateformatter.api) + implementation(projects.libraries.dateformatter.impl) implementation(projects.features.roomlist) implementation(projects.features.login) implementation(libs.coroutines.core) diff --git a/settings.gradle.kts b/settings.gradle.kts index 2e5312a9f4..928fc5b4a4 100644 --- a/settings.gradle.kts +++ b/settings.gradle.kts @@ -44,7 +44,9 @@ include(":libraries:matrix:impl") include(":libraries:matrix:test") include(":libraries:matrixui") include(":libraries:textcomposer") -include(":libraries:dateformatter") +include(":libraries:dateformatter:api") +include(":libraries:dateformatter:impl") +include(":libraries:dateformatter:test") include(":libraries:elementresources") include(":libraries:ui-strings") include(":libraries:testtags") From 5ea2a4292d105e275adb0ea9e844f2a0225e784d Mon Sep 17 00:00:00 2001 From: Benoit Marty Date: Mon, 6 Mar 2023 13:08:54 +0100 Subject: [PATCH 2/3] Split module `session-storage` into `api` and `impl`. --- app/build.gradle.kts | 1 + libraries/matrix/api/build.gradle.kts | 2 +- .../libraries/matrix/impl/RustMatrixClient.kt | 2 +- .../auth/RustMatrixAuthenticationService.kt | 4 +- .../session-storage/api/build.gradle.kts | 27 ++++++++++++ .../sessionstorage/api/SessionData.kt | 27 ++++++++++++ .../sessionstorage/api}/SessionStore.kt | 5 +-- .../{ => impl}/build.gradle.kts | 3 +- .../impl}/DatabaseSessionStore.kt | 9 ++-- .../sessionstorage/impl/SessionDataMapper.kt | 43 +++++++++++++++++++ .../impl}/di/SessionStorageModule.kt | 4 +- .../libraries/matrix/session/SessionData.sq | 0 .../impl}/DatabaseSessionStoreTests.kt | 8 ++-- .../samples/minimal/InMemorySessionStore.kt | 20 ++++----- settings.gradle.kts | 3 +- 15 files changed, 130 insertions(+), 28 deletions(-) create mode 100644 libraries/session-storage/api/build.gradle.kts create mode 100644 libraries/session-storage/api/src/main/kotlin/io/element/android/libraries/sessionstorage/api/SessionData.kt rename libraries/session-storage/{src/main/kotlin/io/element/android/libraries/sessionstorage => api/src/main/kotlin/io/element/android/libraries/sessionstorage/api}/SessionStore.kt (84%) rename libraries/session-storage/{ => impl}/build.gradle.kts (92%) rename libraries/session-storage/{src/main/kotlin/io/element/android/libraries/sessionstorage => impl/src/main/kotlin/io/element/android/libraries/sessionstorage/impl}/DatabaseSessionStore.kt (87%) create mode 100644 libraries/session-storage/impl/src/main/kotlin/io/element/android/libraries/sessionstorage/impl/SessionDataMapper.kt rename libraries/session-storage/{src/main/kotlin/io/element/android/libraries/sessionstorage => impl/src/main/kotlin/io/element/android/libraries/sessionstorage/impl}/di/SessionStorageModule.kt (92%) rename libraries/session-storage/{ => impl}/src/main/sqldelight/io/element/android/libraries/matrix/session/SessionData.sq (100%) rename libraries/session-storage/{src/test/kotlin/io/element/android/libraries/sessionstorage => impl/src/test/kotlin/io/element/android/libraries/sessionstorage/impl}/DatabaseSessionStoreTests.kt (95%) diff --git a/app/build.gradle.kts b/app/build.gradle.kts index 80df2d1392..7e5f3f6862 100644 --- a/app/build.gradle.kts +++ b/app/build.gradle.kts @@ -200,6 +200,7 @@ dependencies { allFeatures() implementation(projects.libraries.matrix.impl) implementation(projects.libraries.dateformatter.impl) + implementation(projects.libraries.sessionStorage.impl) implementation(projects.tests.uitests) implementation(projects.anvilannotations) anvil(projects.anvilcodegen) diff --git a/libraries/matrix/api/build.gradle.kts b/libraries/matrix/api/build.gradle.kts index 2d8519b2e2..6d622f249e 100644 --- a/libraries/matrix/api/build.gradle.kts +++ b/libraries/matrix/api/build.gradle.kts @@ -39,6 +39,6 @@ dependencies { implementation(projects.libraries.core) implementation("net.java.dev.jna:jna:5.13.0@aar") implementation(libs.serialization.json) - api(projects.libraries.sessionStorage) + api(projects.libraries.sessionStorage.api) implementation(libs.coroutines.core) } diff --git a/libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/RustMatrixClient.kt b/libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/RustMatrixClient.kt index f02929e9ed..e75dd756a2 100644 --- a/libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/RustMatrixClient.kt +++ b/libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/RustMatrixClient.kt @@ -24,7 +24,7 @@ import io.element.android.libraries.matrix.impl.media.RustMediaResolver import io.element.android.libraries.matrix.impl.room.RustMatrixRoom import io.element.android.libraries.matrix.impl.room.RustRoomSummaryDataSource import io.element.android.libraries.matrix.impl.sync.SlidingSyncObserverProxy -import io.element.android.libraries.sessionstorage.SessionStore +import io.element.android.libraries.sessionstorage.api.SessionStore import io.element.android.libraries.matrix.api.media.MediaResolver import io.element.android.libraries.matrix.api.room.MatrixRoom import io.element.android.libraries.matrix.api.room.RoomSummaryDataSource diff --git a/libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/auth/RustMatrixAuthenticationService.kt b/libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/auth/RustMatrixAuthenticationService.kt index a00e787c9f..7a51386d02 100644 --- a/libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/auth/RustMatrixAuthenticationService.kt +++ b/libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/auth/RustMatrixAuthenticationService.kt @@ -27,8 +27,8 @@ import io.element.android.libraries.matrix.api.core.SessionId import io.element.android.libraries.matrix.api.core.UserId import io.element.android.libraries.matrix.impl.RustMatrixClient import io.element.android.libraries.matrix.impl.util.logError -import io.element.android.libraries.matrix.session.SessionData -import io.element.android.libraries.sessionstorage.SessionStore +import io.element.android.libraries.sessionstorage.api.SessionData +import io.element.android.libraries.sessionstorage.api.SessionStore import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.MutableStateFlow diff --git a/libraries/session-storage/api/build.gradle.kts b/libraries/session-storage/api/build.gradle.kts new file mode 100644 index 0000000000..99fd07fee6 --- /dev/null +++ b/libraries/session-storage/api/build.gradle.kts @@ -0,0 +1,27 @@ +/* + * Copyright (c) 2023 New Vector Ltd + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +plugins { + id("io.element.android-library") +} + +android { + namespace = "io.element.android.libraries.sessionstorage.api" +} + +dependencies { + implementation(libs.coroutines.core) +} diff --git a/libraries/session-storage/api/src/main/kotlin/io/element/android/libraries/sessionstorage/api/SessionData.kt b/libraries/session-storage/api/src/main/kotlin/io/element/android/libraries/sessionstorage/api/SessionData.kt new file mode 100644 index 0000000000..3f79701fd8 --- /dev/null +++ b/libraries/session-storage/api/src/main/kotlin/io/element/android/libraries/sessionstorage/api/SessionData.kt @@ -0,0 +1,27 @@ +/* + * Copyright (c) 2023 New Vector Ltd + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package io.element.android.libraries.sessionstorage.api + +data class SessionData( + val userId: String, + val deviceId: String, + val accessToken: String, + val refreshToken: String?, + val homeserverUrl: String, + val isSoftLogout: Boolean, + val slidingSyncProxy: String? +) diff --git a/libraries/session-storage/src/main/kotlin/io/element/android/libraries/sessionstorage/SessionStore.kt b/libraries/session-storage/api/src/main/kotlin/io/element/android/libraries/sessionstorage/api/SessionStore.kt similarity index 84% rename from libraries/session-storage/src/main/kotlin/io/element/android/libraries/sessionstorage/SessionStore.kt rename to libraries/session-storage/api/src/main/kotlin/io/element/android/libraries/sessionstorage/api/SessionStore.kt index a8cd52df70..de0ec2f727 100644 --- a/libraries/session-storage/src/main/kotlin/io/element/android/libraries/sessionstorage/SessionStore.kt +++ b/libraries/session-storage/api/src/main/kotlin/io/element/android/libraries/sessionstorage/api/SessionStore.kt @@ -14,14 +14,13 @@ * limitations under the License. */ -package io.element.android.libraries.sessionstorage +package io.element.android.libraries.sessionstorage.api -import io.element.android.libraries.matrix.session.SessionData import kotlinx.coroutines.flow.Flow interface SessionStore { fun isLoggedIn(): Flow - suspend fun storeData(session: SessionData) + suspend fun storeData(sessionData: SessionData) suspend fun getSession(sessionId: String): SessionData? suspend fun getLatestSession(): SessionData? suspend fun removeSession(sessionId: String) diff --git a/libraries/session-storage/build.gradle.kts b/libraries/session-storage/impl/build.gradle.kts similarity index 92% rename from libraries/session-storage/build.gradle.kts rename to libraries/session-storage/impl/build.gradle.kts index 2fd74a4670..b1952b6cc5 100644 --- a/libraries/session-storage/build.gradle.kts +++ b/libraries/session-storage/impl/build.gradle.kts @@ -21,7 +21,7 @@ plugins { } android { - namespace = "io.element.android.libraries.sessionstorage" + namespace = "io.element.android.libraries.sessionstorage.impl" } anvil { @@ -32,6 +32,7 @@ dependencies { implementation(libs.dagger) implementation(projects.libraries.core) implementation(projects.libraries.encryptedDb) + implementation(projects.libraries.sessionStorage.api) implementation(libs.sqldelight.driver.android) implementation(libs.sqlcipher) implementation(libs.sqlite) diff --git a/libraries/session-storage/src/main/kotlin/io/element/android/libraries/sessionstorage/DatabaseSessionStore.kt b/libraries/session-storage/impl/src/main/kotlin/io/element/android/libraries/sessionstorage/impl/DatabaseSessionStore.kt similarity index 87% rename from libraries/session-storage/src/main/kotlin/io/element/android/libraries/sessionstorage/DatabaseSessionStore.kt rename to libraries/session-storage/impl/src/main/kotlin/io/element/android/libraries/sessionstorage/impl/DatabaseSessionStore.kt index d833f06d92..6c32bcd1f3 100644 --- a/libraries/session-storage/src/main/kotlin/io/element/android/libraries/sessionstorage/DatabaseSessionStore.kt +++ b/libraries/session-storage/impl/src/main/kotlin/io/element/android/libraries/sessionstorage/impl/DatabaseSessionStore.kt @@ -14,14 +14,15 @@ * limitations under the License. */ -package io.element.android.libraries.sessionstorage +package io.element.android.libraries.sessionstorage.impl import com.squareup.anvil.annotations.ContributesBinding import com.squareup.sqldelight.runtime.coroutines.asFlow import com.squareup.sqldelight.runtime.coroutines.mapToOneOrNull import io.element.android.libraries.di.AppScope import io.element.android.libraries.di.SingleIn -import io.element.android.libraries.matrix.session.SessionData +import io.element.android.libraries.sessionstorage.api.SessionData +import io.element.android.libraries.sessionstorage.api.SessionStore import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.map import javax.inject.Inject @@ -37,17 +38,19 @@ class DatabaseSessionStore @Inject constructor( } override suspend fun storeData(sessionData: SessionData) { - database.sessionDataQueries.insertSessionData(sessionData) + database.sessionDataQueries.insertSessionData(sessionData.toDbModel()) } override suspend fun getLatestSession(): SessionData? { return database.sessionDataQueries.selectFirst() .executeAsOneOrNull() + ?.toApiModel() } override suspend fun getSession(sessionId: String): SessionData? { return database.sessionDataQueries.selectByUserId(sessionId) .executeAsOneOrNull() + ?.toApiModel() } override suspend fun removeSession(sessionId: String) { diff --git a/libraries/session-storage/impl/src/main/kotlin/io/element/android/libraries/sessionstorage/impl/SessionDataMapper.kt b/libraries/session-storage/impl/src/main/kotlin/io/element/android/libraries/sessionstorage/impl/SessionDataMapper.kt new file mode 100644 index 0000000000..627f896381 --- /dev/null +++ b/libraries/session-storage/impl/src/main/kotlin/io/element/android/libraries/sessionstorage/impl/SessionDataMapper.kt @@ -0,0 +1,43 @@ +/* + * Copyright (c) 2023 New Vector Ltd + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package io.element.android.libraries.sessionstorage.impl + +import io.element.android.libraries.sessionstorage.api.SessionData + +internal fun SessionData.toDbModel(): io.element.android.libraries.matrix.session.SessionData { + return io.element.android.libraries.matrix.session.SessionData( + userId = userId, + deviceId = deviceId, + accessToken = accessToken, + refreshToken = refreshToken, + homeserverUrl = homeserverUrl, + isSoftLogout = isSoftLogout, + slidingSyncProxy = slidingSyncProxy, + ) +} + +internal fun io.element.android.libraries.matrix.session.SessionData.toApiModel(): SessionData { + return SessionData( + userId = userId, + deviceId = deviceId, + accessToken = accessToken, + refreshToken = refreshToken, + homeserverUrl = homeserverUrl, + isSoftLogout = isSoftLogout, + slidingSyncProxy = slidingSyncProxy, + ) +} diff --git a/libraries/session-storage/src/main/kotlin/io/element/android/libraries/sessionstorage/di/SessionStorageModule.kt b/libraries/session-storage/impl/src/main/kotlin/io/element/android/libraries/sessionstorage/impl/di/SessionStorageModule.kt similarity index 92% rename from libraries/session-storage/src/main/kotlin/io/element/android/libraries/sessionstorage/di/SessionStorageModule.kt rename to libraries/session-storage/impl/src/main/kotlin/io/element/android/libraries/sessionstorage/impl/di/SessionStorageModule.kt index 33cdc50257..b101fc39b4 100644 --- a/libraries/session-storage/src/main/kotlin/io/element/android/libraries/sessionstorage/di/SessionStorageModule.kt +++ b/libraries/session-storage/impl/src/main/kotlin/io/element/android/libraries/sessionstorage/impl/di/SessionStorageModule.kt @@ -14,7 +14,7 @@ * limitations under the License. */ -package io.element.android.libraries.sessionstorage.di +package io.element.android.libraries.sessionstorage.impl.di import android.content.Context import com.squareup.anvil.annotations.ContributesTo @@ -23,7 +23,7 @@ import dagger.Provides import io.element.android.libraries.di.AppScope import io.element.android.libraries.di.ApplicationContext import io.element.android.libraries.di.SingleIn -import io.element.android.libraries.sessionstorage.SessionDatabase +import io.element.android.libraries.sessionstorage.impl.SessionDatabase import io.element.encrypteddb.SqlCipherDriverFactory import io.element.encrypteddb.passphrase.RandomSecretPassphraseProvider diff --git a/libraries/session-storage/src/main/sqldelight/io/element/android/libraries/matrix/session/SessionData.sq b/libraries/session-storage/impl/src/main/sqldelight/io/element/android/libraries/matrix/session/SessionData.sq similarity index 100% rename from libraries/session-storage/src/main/sqldelight/io/element/android/libraries/matrix/session/SessionData.sq rename to libraries/session-storage/impl/src/main/sqldelight/io/element/android/libraries/matrix/session/SessionData.sq diff --git a/libraries/session-storage/src/test/kotlin/io/element/android/libraries/sessionstorage/DatabaseSessionStoreTests.kt b/libraries/session-storage/impl/src/test/kotlin/io/element/android/libraries/sessionstorage/impl/DatabaseSessionStoreTests.kt similarity index 95% rename from libraries/session-storage/src/test/kotlin/io/element/android/libraries/sessionstorage/DatabaseSessionStoreTests.kt rename to libraries/session-storage/impl/src/test/kotlin/io/element/android/libraries/sessionstorage/impl/DatabaseSessionStoreTests.kt index 56c5e4db16..5bd726609b 100644 --- a/libraries/session-storage/src/test/kotlin/io/element/android/libraries/sessionstorage/DatabaseSessionStoreTests.kt +++ b/libraries/session-storage/impl/src/test/kotlin/io/element/android/libraries/sessionstorage/impl/DatabaseSessionStoreTests.kt @@ -14,7 +14,7 @@ * limitations under the License. */ -package io.element.android.libraries.sessionstorage +package io.element.android.libraries.sessionstorage.impl import app.cash.turbine.test import com.google.common.truth.Truth.assertThat @@ -55,7 +55,7 @@ class DatabaseSessionStoreTests { fun `storeData persists the SessionData into the DB`() = runTest { assertThat(database.sessionDataQueries.selectFirst().executeAsOneOrNull()).isNull() - databaseSessionStore.storeData(aSessionData) + databaseSessionStore.storeData(aSessionData.toApiModel()) assertThat(database.sessionDataQueries.selectFirst().executeAsOneOrNull()).isEqualTo(aSessionData) } @@ -76,7 +76,7 @@ class DatabaseSessionStoreTests { database.sessionDataQueries.insertSessionData(aSessionData) database.sessionDataQueries.insertSessionData(aSessionData.copy(userId = "otherUserId")) - val latestSession = databaseSessionStore.getLatestSession() + val latestSession = databaseSessionStore.getLatestSession()?.toDbModel() assertThat(latestSession).isEqualTo(aSessionData) } @@ -86,7 +86,7 @@ class DatabaseSessionStoreTests { database.sessionDataQueries.insertSessionData(aSessionData) database.sessionDataQueries.insertSessionData(aSessionData.copy(userId = "otherUserId")) - val foundSession = databaseSessionStore.getSession(aSessionData.userId) + val foundSession = databaseSessionStore.getSession(aSessionData.userId)?.toDbModel() assertThat(foundSession).isEqualTo(aSessionData) } diff --git a/samples/minimal/src/main/kotlin/io/element/android/samples/minimal/InMemorySessionStore.kt b/samples/minimal/src/main/kotlin/io/element/android/samples/minimal/InMemorySessionStore.kt index f96ea63d72..589e5d8804 100644 --- a/samples/minimal/src/main/kotlin/io/element/android/samples/minimal/InMemorySessionStore.kt +++ b/samples/minimal/src/main/kotlin/io/element/android/samples/minimal/InMemorySessionStore.kt @@ -16,35 +16,35 @@ package io.element.android.samples.minimal -import io.element.android.libraries.matrix.session.SessionData -import io.element.android.libraries.sessionstorage.SessionStore +import io.element.android.libraries.sessionstorage.api.SessionData +import io.element.android.libraries.sessionstorage.api.SessionStore import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.MutableStateFlow import kotlinx.coroutines.flow.map class InMemorySessionStore : SessionStore { - private var sessionData = MutableStateFlow(null) + private var sessionDataFlow = MutableStateFlow(null) override fun isLoggedIn(): Flow { - return sessionData.map { it != null } + return sessionDataFlow.map { it != null } } - override suspend fun storeData(session: SessionData) { - sessionData.value = session + override suspend fun storeData(sessionData: SessionData) { + sessionDataFlow.value = sessionData } override suspend fun getSession(sessionId: String): SessionData? { - return sessionData.value.takeIf { it?.userId == sessionId } + return sessionDataFlow.value.takeIf { it?.userId == sessionId } } override suspend fun getLatestSession(): SessionData? { - return sessionData.value + return sessionDataFlow.value } override suspend fun removeSession(sessionId: String) { - if (sessionData.value?.userId == sessionId) { - sessionData.value = null + if (sessionDataFlow.value?.userId == sessionId) { + sessionDataFlow.value = null } } } diff --git a/settings.gradle.kts b/settings.gradle.kts index 928fc5b4a4..10b255748b 100644 --- a/settings.gradle.kts +++ b/settings.gradle.kts @@ -67,4 +67,5 @@ include(":features:template") include(":libraries:androidutils") include(":samples:minimal") include(":libraries:encrypted-db") -include(":libraries:session-storage") +include(":libraries:session-storage:api") +include(":libraries:session-storage:impl") From 95ccccc33b802898a873839d66e98a16f2e3247d Mon Sep 17 00:00:00 2001 From: Benoit Marty Date: Mon, 6 Mar 2023 13:04:54 +0100 Subject: [PATCH 3/3] Move `InMemorySessionStore` in it's own module implementation --- .../impl-memory/build.gradle.kts | 28 +++++++++++++++++++ .../impl/memory}/InMemorySessionStore.kt | 2 +- samples/minimal/build.gradle.kts | 1 + .../android/samples/minimal/MainActivity.kt | 1 + settings.gradle.kts | 1 + 5 files changed, 32 insertions(+), 1 deletion(-) create mode 100644 libraries/session-storage/impl-memory/build.gradle.kts rename {samples/minimal/src/main/kotlin/io/element/android/samples/minimal => libraries/session-storage/impl-memory/src/main/kotlin/io/element/android/libraries/sessionstorage/impl/memory}/InMemorySessionStore.kt (96%) diff --git a/libraries/session-storage/impl-memory/build.gradle.kts b/libraries/session-storage/impl-memory/build.gradle.kts new file mode 100644 index 0000000000..ec1d618962 --- /dev/null +++ b/libraries/session-storage/impl-memory/build.gradle.kts @@ -0,0 +1,28 @@ +/* + * Copyright (c) 2023 New Vector Ltd + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +plugins { + id("io.element.android-library") +} + +android { + namespace = "io.element.android.libraries.sessionstorage.impl.memory" +} + +dependencies { + implementation(projects.libraries.sessionStorage.api) + implementation(libs.coroutines.core) +} diff --git a/samples/minimal/src/main/kotlin/io/element/android/samples/minimal/InMemorySessionStore.kt b/libraries/session-storage/impl-memory/src/main/kotlin/io/element/android/libraries/sessionstorage/impl/memory/InMemorySessionStore.kt similarity index 96% rename from samples/minimal/src/main/kotlin/io/element/android/samples/minimal/InMemorySessionStore.kt rename to libraries/session-storage/impl-memory/src/main/kotlin/io/element/android/libraries/sessionstorage/impl/memory/InMemorySessionStore.kt index 589e5d8804..b73ffdeb9a 100644 --- a/samples/minimal/src/main/kotlin/io/element/android/samples/minimal/InMemorySessionStore.kt +++ b/libraries/session-storage/impl-memory/src/main/kotlin/io/element/android/libraries/sessionstorage/impl/memory/InMemorySessionStore.kt @@ -14,7 +14,7 @@ * limitations under the License. */ -package io.element.android.samples.minimal +package io.element.android.libraries.sessionstorage.impl.memory import io.element.android.libraries.sessionstorage.api.SessionData import io.element.android.libraries.sessionstorage.api.SessionStore diff --git a/samples/minimal/build.gradle.kts b/samples/minimal/build.gradle.kts index 7271b295e5..a7da2a94c8 100644 --- a/samples/minimal/build.gradle.kts +++ b/samples/minimal/build.gradle.kts @@ -49,6 +49,7 @@ dependencies { implementation(libs.androidx.activity.compose) implementation(projects.libraries.matrix.api) implementation(projects.libraries.matrix.impl) + implementation(projects.libraries.sessionStorage.implMemory) implementation(projects.libraries.designsystem) implementation(projects.libraries.architecture) implementation(projects.libraries.core) diff --git a/samples/minimal/src/main/kotlin/io/element/android/samples/minimal/MainActivity.kt b/samples/minimal/src/main/kotlin/io/element/android/samples/minimal/MainActivity.kt index bdf2818519..4ba66c51d6 100644 --- a/samples/minimal/src/main/kotlin/io/element/android/samples/minimal/MainActivity.kt +++ b/samples/minimal/src/main/kotlin/io/element/android/samples/minimal/MainActivity.kt @@ -31,6 +31,7 @@ import androidx.core.view.WindowCompat import io.element.android.libraries.designsystem.theme.ElementTheme import io.element.android.libraries.matrix.api.auth.MatrixAuthenticationService import io.element.android.libraries.matrix.impl.auth.RustMatrixAuthenticationService +import io.element.android.libraries.sessionstorage.impl.memory.InMemorySessionStore import kotlinx.coroutines.runBlocking import org.matrix.rustcomponents.sdk.AuthenticationService import java.io.File diff --git a/settings.gradle.kts b/settings.gradle.kts index 10b255748b..77751aeda1 100644 --- a/settings.gradle.kts +++ b/settings.gradle.kts @@ -69,3 +69,4 @@ include(":samples:minimal") include(":libraries:encrypted-db") include(":libraries:session-storage:api") include(":libraries:session-storage:impl") +include(":libraries:session-storage:impl-memory")