diff --git a/auth/data/build.gradle.kts b/auth/data/build.gradle.kts index 7fcf56cbc..ff13ec8fb 100644 --- a/auth/data/build.gradle.kts +++ b/auth/data/build.gradle.kts @@ -69,7 +69,7 @@ dependencies { project(Module.kotlinUtil), project(Module.data), `coroutines-core`, - store4 + store5 ) testImplementation( diff --git a/auth/data/src/main/kotlin/me/proton/core/auth/data/repository/AuthDeviceRepositoryImpl.kt b/auth/data/src/main/kotlin/me/proton/core/auth/data/repository/AuthDeviceRepositoryImpl.kt index 07a995072..59ad250cd 100644 --- a/auth/data/src/main/kotlin/me/proton/core/auth/data/repository/AuthDeviceRepositoryImpl.kt +++ b/auth/data/src/main/kotlin/me/proton/core/auth/data/repository/AuthDeviceRepositoryImpl.kt @@ -19,10 +19,6 @@ package me.proton.core.auth.data.repository import androidx.work.WorkManager -import com.dropbox.android.external.store4.Fetcher -import com.dropbox.android.external.store4.SourceOfTruth -import com.dropbox.android.external.store4.StoreBuilder -import com.dropbox.android.external.store4.StoreRequest import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.distinctUntilChanged import kotlinx.coroutines.flow.map @@ -38,6 +34,10 @@ import me.proton.core.data.arch.buildProtonStore import me.proton.core.domain.entity.UserId import me.proton.core.util.kotlin.CoroutineScopeProvider import me.proton.core.util.kotlin.coroutine.result +import org.mobilenativefoundation.store.store5.Fetcher +import org.mobilenativefoundation.store.store5.SourceOfTruth +import org.mobilenativefoundation.store.store5.StoreBuilder +import org.mobilenativefoundation.store.store5.StoreReadRequest import javax.inject.Inject class AuthDeviceRepositoryImpl @Inject constructor( @@ -122,12 +122,12 @@ class AuthDeviceRepositoryImpl @Inject constructor( } override fun observeByUserId(userId: UserId, refresh: Boolean): Flow> = - store.stream(StoreRequest.cached(userId, refresh = refresh)) + store.stream(StoreReadRequest.cached(userId, refresh = refresh)) .map { it.dataOrNull().orEmpty() } .distinctUntilChanged() override fun observeByDeviceId(userId: UserId, deviceId: AuthDeviceId, refresh: Boolean): Flow = - store.stream(StoreRequest.cached(userId, refresh)) + store.stream(StoreReadRequest.cached(userId, refresh)) .map { it.dataOrNull().orEmpty() } .map { devices -> devices.firstOrNull { it.deviceId == deviceId } } .distinctUntilChanged() diff --git a/auth/data/src/main/kotlin/me/proton/core/auth/data/repository/MemberDeviceRepositoryImpl.kt b/auth/data/src/main/kotlin/me/proton/core/auth/data/repository/MemberDeviceRepositoryImpl.kt index 0ac945741..d4f90ddff 100644 --- a/auth/data/src/main/kotlin/me/proton/core/auth/data/repository/MemberDeviceRepositoryImpl.kt +++ b/auth/data/src/main/kotlin/me/proton/core/auth/data/repository/MemberDeviceRepositoryImpl.kt @@ -18,10 +18,6 @@ package me.proton.core.auth.data.repository -import com.dropbox.android.external.store4.Fetcher -import com.dropbox.android.external.store4.SourceOfTruth -import com.dropbox.android.external.store4.StoreBuilder -import com.dropbox.android.external.store4.StoreRequest import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.map import me.proton.core.auth.domain.entity.MemberDevice @@ -31,6 +27,10 @@ import me.proton.core.auth.domain.repository.MemberDeviceRepository import me.proton.core.data.arch.buildProtonStore import me.proton.core.domain.entity.UserId import me.proton.core.util.kotlin.CoroutineScopeProvider +import org.mobilenativefoundation.store.store5.Fetcher +import org.mobilenativefoundation.store.store5.SourceOfTruth +import org.mobilenativefoundation.store.store5.StoreBuilder +import org.mobilenativefoundation.store.store5.StoreReadRequest import javax.inject.Inject class MemberDeviceRepositoryImpl @Inject constructor( @@ -56,11 +56,11 @@ class MemberDeviceRepositoryImpl @Inject constructor( if (refresh) store.fresh(userId) else store.get(userId) override fun observeByMemberId(userId: UserId, memberId: UserId, refresh: Boolean): Flow> = - store.stream(StoreRequest.cached(userId, refresh)) + store.stream(StoreReadRequest.cached(userId, refresh)) .map { it.dataOrNull().orEmpty() } .map { memberDevices -> memberDevices.filter { it.memberId == memberId } } override fun observeByUserId(userId: UserId, refresh: Boolean): Flow> = - store.stream(StoreRequest.cached(userId, refresh)) + store.stream(StoreReadRequest.cached(userId, refresh)) .map { it.dataOrNull().orEmpty() } } diff --git a/contact/data/build.gradle.kts b/contact/data/build.gradle.kts index 49302f4b9..f80b8aa4c 100644 --- a/contact/data/build.gradle.kts +++ b/contact/data/build.gradle.kts @@ -59,7 +59,7 @@ dependencies { project(Module.userData), `coroutines-core`, - store4, + store5, ) kaptTest(`room-compiler`) diff --git a/contact/data/src/main/kotlin/me/proton/core/contact/data/repository/ContactRepositoryImpl.kt b/contact/data/src/main/kotlin/me/proton/core/contact/data/repository/ContactRepositoryImpl.kt index 9af3bd5d4..89aca0245 100644 --- a/contact/data/src/main/kotlin/me/proton/core/contact/data/repository/ContactRepositoryImpl.kt +++ b/contact/data/src/main/kotlin/me/proton/core/contact/data/repository/ContactRepositoryImpl.kt @@ -18,10 +18,6 @@ package me.proton.core.contact.data.repository -import com.dropbox.android.external.store4.Fetcher -import com.dropbox.android.external.store4.SourceOfTruth -import com.dropbox.android.external.store4.StoreBuilder -import com.dropbox.android.external.store4.StoreRequest import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.map import me.proton.core.contact.domain.entity.Contact @@ -39,6 +35,10 @@ import me.proton.core.domain.arch.DataResult import me.proton.core.domain.arch.mapSuccess import me.proton.core.domain.entity.UserId import me.proton.core.util.kotlin.CoroutineScopeProvider +import org.mobilenativefoundation.store.store5.Fetcher +import org.mobilenativefoundation.store.store5.SourceOfTruth +import org.mobilenativefoundation.store.store5.StoreBuilder +import org.mobilenativefoundation.store.store5.StoreReadRequest import javax.inject.Inject import javax.inject.Singleton @@ -97,7 +97,7 @@ class ContactRepositoryImpl @Inject constructor( refresh: Boolean ): Flow> { val key = ContactStoreKey(userId, contactId) - return contactWithCardsStore.stream(StoreRequest.cached(key, refresh)).map { it.toDataResult() } + return contactWithCardsStore.stream(StoreReadRequest.cached(key, refresh)).map { it.toDataResult() } } override suspend fun getContactWithCards( @@ -110,7 +110,7 @@ class ContactRepositoryImpl @Inject constructor( } override fun observeAllContacts(userId: UserId, refresh: Boolean): Flow>> { - return contactsStore.stream(StoreRequest.cached(userId, refresh)).map { it.toDataResult() } + return contactsStore.stream(StoreReadRequest.cached(userId, refresh)).map { it.toDataResult() } } override suspend fun getAllContacts(userId: UserId, refresh: Boolean): List { diff --git a/data/build.gradle.kts b/data/build.gradle.kts index 99ba9ba28..ac3292a49 100644 --- a/data/build.gradle.kts +++ b/data/build.gradle.kts @@ -16,7 +16,6 @@ * along with ProtonCore. If not, see . */ import studio.forface.easygradle.dsl.* -import studio.forface.easygradle.dsl.android.* plugins { protonAndroidLibrary @@ -43,7 +42,7 @@ dependencies { project(Module.networkDomain), `androidx-core`, `coroutines-core`, - store4 + store5 ) implementation( diff --git a/data/src/main/kotlin/me/proton/core/data/arch/StoreExtensions.kt b/data/src/main/kotlin/me/proton/core/data/arch/StoreExtensions.kt index 47629de3b..74c76db90 100644 --- a/data/src/main/kotlin/me/proton/core/data/arch/StoreExtensions.kt +++ b/data/src/main/kotlin/me/proton/core/data/arch/StoreExtensions.kt @@ -18,11 +18,11 @@ package me.proton.core.data.arch -import com.dropbox.android.external.store4.Store -import com.dropbox.android.external.store4.StoreBuilder -import com.dropbox.android.external.store4.fresh -import com.dropbox.android.external.store4.get import me.proton.core.util.kotlin.CoroutineScopeProvider +import org.mobilenativefoundation.store.store5.Store +import org.mobilenativefoundation.store.store5.StoreBuilder +import org.mobilenativefoundation.store.store5.impl.extensions.fresh +import org.mobilenativefoundation.store.store5.impl.extensions.get import kotlin.coroutines.cancellation.CancellationException private suspend fun catchWithStackTrace(block: suspend () -> T): T { diff --git a/data/src/main/kotlin/me/proton/core/data/arch/StoreResponseMapper.kt b/data/src/main/kotlin/me/proton/core/data/arch/StoreResponseMapper.kt index f989bea78..4daa85d41 100644 --- a/data/src/main/kotlin/me/proton/core/data/arch/StoreResponseMapper.kt +++ b/data/src/main/kotlin/me/proton/core/data/arch/StoreResponseMapper.kt @@ -18,31 +18,31 @@ package me.proton.core.data.arch -import com.dropbox.android.external.store4.ResponseOrigin -import com.dropbox.android.external.store4.StoreResponse import me.proton.core.domain.arch.DataResult import me.proton.core.domain.arch.ResponseSource import me.proton.core.util.kotlin.exhaustive +import org.mobilenativefoundation.store.store5.StoreReadResponse +import org.mobilenativefoundation.store.store5.StoreReadResponseOrigin -fun StoreResponse.toDataResult(): DataResult = when (this) { - is StoreResponse.Data -> +fun StoreReadResponse.toDataResult(): DataResult = when (this) { + is StoreReadResponse.Data -> when (origin) { - ResponseOrigin.Fetcher -> DataResult.Success(ResponseSource.Remote, value) - ResponseOrigin.Cache, - ResponseOrigin.SourceOfTruth -> DataResult.Success(ResponseSource.Local, value) + is StoreReadResponseOrigin.Fetcher -> DataResult.Success(ResponseSource.Remote, value) + is StoreReadResponseOrigin.Cache, + is StoreReadResponseOrigin.SourceOfTruth -> DataResult.Success(ResponseSource.Local, value) } - is StoreResponse.Error -> { - val cause = (this as? StoreResponse.Error.Exception)?.error + is StoreReadResponse.Error -> { + val cause = (this as? StoreReadResponse.Error.Exception)?.error when (origin) { - ResponseOrigin.Fetcher -> DataResult.Error.Remote(errorMessageOrNull(), cause) - ResponseOrigin.Cache -> DataResult.Error.Local(errorMessageOrNull(), cause) - ResponseOrigin.SourceOfTruth -> DataResult.Error.Local(errorMessageOrNull(), cause) + is StoreReadResponseOrigin.Fetcher -> DataResult.Error.Remote(errorMessageOrNull(), cause) + is StoreReadResponseOrigin.Cache -> DataResult.Error.Local(errorMessageOrNull(), cause) + is StoreReadResponseOrigin.SourceOfTruth -> DataResult.Error.Local(errorMessageOrNull(), cause) } } - is StoreResponse.Loading -> when (origin) { - ResponseOrigin.Fetcher -> DataResult.Processing(ResponseSource.Remote) - ResponseOrigin.Cache, - ResponseOrigin.SourceOfTruth -> DataResult.Processing(ResponseSource.Local) + is StoreReadResponse.Loading -> when (origin) { + is StoreReadResponseOrigin.Fetcher -> DataResult.Processing(ResponseSource.Remote) + is StoreReadResponseOrigin.Cache, + is StoreReadResponseOrigin.SourceOfTruth -> DataResult.Processing(ResponseSource.Local) } - is StoreResponse.NoNewData -> DataResult.Processing(ResponseSource.Remote) + is StoreReadResponse.NoNewData -> DataResult.Processing(ResponseSource.Remote) }.exhaustive diff --git a/data/src/test/kotlin/me/proton/core/data/arch/StoreExtensionsTest.kt b/data/src/test/kotlin/me/proton/core/data/arch/StoreExtensionsTest.kt index 18bb469f8..d727719bd 100644 --- a/data/src/test/kotlin/me/proton/core/data/arch/StoreExtensionsTest.kt +++ b/data/src/test/kotlin/me/proton/core/data/arch/StoreExtensionsTest.kt @@ -18,10 +18,6 @@ package me.proton.core.data.arch -import com.dropbox.android.external.store4.Fetcher -import com.dropbox.android.external.store4.FetcherResult -import com.dropbox.android.external.store4.SourceOfTruth -import com.dropbox.android.external.store4.StoreBuilder import io.mockk.coEvery import io.mockk.mockk import kotlinx.coroutines.Dispatchers @@ -33,6 +29,10 @@ import kotlinx.coroutines.test.runTest import kotlinx.coroutines.test.setMain import me.proton.core.test.kotlin.TestCoroutineScopeProvider import me.proton.core.test.kotlin.TestDispatcherProvider +import org.mobilenativefoundation.store.store5.Fetcher +import org.mobilenativefoundation.store.store5.FetcherResult +import org.mobilenativefoundation.store.store5.SourceOfTruth +import org.mobilenativefoundation.store.store5.StoreBuilder import kotlin.test.AfterTest import kotlin.test.BeforeTest import kotlin.test.Test diff --git a/data/src/test/kotlin/me/proton/core/data/arch/StoreResponseMapperKtTest.kt b/data/src/test/kotlin/me/proton/core/data/arch/StoreResponseMapperKtTest.kt index 72a552fe7..f7e4187f1 100644 --- a/data/src/test/kotlin/me/proton/core/data/arch/StoreResponseMapperKtTest.kt +++ b/data/src/test/kotlin/me/proton/core/data/arch/StoreResponseMapperKtTest.kt @@ -18,11 +18,11 @@ package me.proton.core.data.arch -import com.dropbox.android.external.store4.ResponseOrigin -import com.dropbox.android.external.store4.StoreResponse import io.mockk.mockk import me.proton.core.domain.arch.DataResult import me.proton.core.domain.arch.ResponseSource +import org.mobilenativefoundation.store.store5.StoreReadResponse +import org.mobilenativefoundation.store.store5.StoreReadResponseOrigin import kotlin.test.Test import kotlin.test.assertEquals @@ -31,15 +31,15 @@ class StoreResponseMapperKtTest { fun toSuccessDataResult() { assertEquals( DataResult.Success(ResponseSource.Local, "body"), - StoreResponse.Data("body", ResponseOrigin.Cache).toDataResult() + StoreReadResponse.Data("body", StoreReadResponseOrigin.Cache).toDataResult() ) assertEquals( DataResult.Success(ResponseSource.Remote, "body"), - StoreResponse.Data("body", ResponseOrigin.Fetcher).toDataResult() + StoreReadResponse.Data("body", StoreReadResponseOrigin.Fetcher()).toDataResult() ) assertEquals( DataResult.Success(ResponseSource.Local, "body"), - StoreResponse.Data("body", ResponseOrigin.SourceOfTruth).toDataResult() + StoreReadResponse.Data("body", StoreReadResponseOrigin.SourceOfTruth).toDataResult() ) } @@ -48,17 +48,17 @@ class StoreResponseMapperKtTest { val cause = Throwable("cause") assertEquals( DataResult.Error.Local("cause", cause), - StoreResponse.Error.Exception(cause, ResponseOrigin.Cache).toDataResult() + StoreReadResponse.Error.Exception(cause, StoreReadResponseOrigin.Cache).toDataResult() ) assertEquals( DataResult.Error.Remote("msg", null), - StoreResponse.Error.Message("msg", ResponseOrigin.Fetcher).toDataResult() + StoreReadResponse.Error.Message("msg", StoreReadResponseOrigin.Fetcher()).toDataResult() ) assertEquals( DataResult.Error.Local("msg", null), - StoreResponse.Error.Message("msg", ResponseOrigin.SourceOfTruth).toDataResult() + StoreReadResponse.Error.Message("msg", StoreReadResponseOrigin.SourceOfTruth).toDataResult() ) } @@ -66,22 +66,22 @@ class StoreResponseMapperKtTest { fun toProcessingDataResult() { assertEquals( DataResult.Processing(ResponseSource.Local), - StoreResponse.Loading(ResponseOrigin.Cache).toDataResult() + StoreReadResponse.Loading(StoreReadResponseOrigin.Cache).toDataResult() ) assertEquals( DataResult.Processing(ResponseSource.Local), - StoreResponse.Loading(ResponseOrigin.SourceOfTruth).toDataResult() + StoreReadResponse.Loading(StoreReadResponseOrigin.SourceOfTruth).toDataResult() ) assertEquals( DataResult.Processing(ResponseSource.Remote), - StoreResponse.Loading(ResponseOrigin.Fetcher).toDataResult() + StoreReadResponse.Loading(StoreReadResponseOrigin.Fetcher()).toDataResult() ) assertEquals( DataResult.Processing(ResponseSource.Remote), - StoreResponse.NoNewData(mockk()).toDataResult() + StoreReadResponse.NoNewData(mockk()).toDataResult() ) } } diff --git a/feature-flag/data/build.gradle.kts b/feature-flag/data/build.gradle.kts index c412d3940..04acf8556 100644 --- a/feature-flag/data/build.gradle.kts +++ b/feature-flag/data/build.gradle.kts @@ -67,7 +67,7 @@ dependencies { retrofit, `room-ktx`, `serialization-core`, - store4 + store5 ) testImplementation( diff --git a/feature-flag/data/src/main/kotlin/me/proton/core/featureflag/data/repository/FeatureFlagRepositoryImpl.kt b/feature-flag/data/src/main/kotlin/me/proton/core/featureflag/data/repository/FeatureFlagRepositoryImpl.kt index 0e737ee43..537498fe4 100644 --- a/feature-flag/data/src/main/kotlin/me/proton/core/featureflag/data/repository/FeatureFlagRepositoryImpl.kt +++ b/feature-flag/data/src/main/kotlin/me/proton/core/featureflag/data/repository/FeatureFlagRepositoryImpl.kt @@ -18,10 +18,6 @@ package me.proton.core.featureflag.data.repository -import com.dropbox.android.external.store4.Fetcher -import com.dropbox.android.external.store4.SourceOfTruth -import com.dropbox.android.external.store4.StoreBuilder -import com.dropbox.android.external.store4.StoreRequest import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.filter import kotlinx.coroutines.flow.first @@ -45,6 +41,10 @@ import me.proton.core.observability.domain.ObservabilityContext import me.proton.core.observability.domain.ObservabilityManager import me.proton.core.observability.domain.metrics.FeatureFlagAwaitTotal import me.proton.core.util.kotlin.CoroutineScopeProvider +import org.mobilenativefoundation.store.store5.Fetcher +import org.mobilenativefoundation.store.store5.SourceOfTruth +import org.mobilenativefoundation.store.store5.StoreBuilder +import org.mobilenativefoundation.store.store5.StoreReadRequest import javax.inject.Inject import javax.inject.Singleton @@ -138,7 +138,7 @@ public class FeatureFlagRepositoryImpl @Inject internal constructor( featureIds: Set, refresh: Boolean ): Flow> = StoreKey(userId = userId, featureIds = featureIds).let { key -> - store.stream(StoreRequest.cached(key, refresh)) + store.stream(StoreReadRequest.cached(key, refresh)) .map { it.dataOrNull().orEmpty().filterNot { flag -> flag.scope == Scope.Unknown } } } diff --git a/feature-flag/data/src/test/kotlin/me/proton/core/featureflag/data/repository/FeatureFlagRepositoryImplTest.kt b/feature-flag/data/src/test/kotlin/me/proton/core/featureflag/data/repository/FeatureFlagRepositoryImplTest.kt index 56af9faad..dfb8b6f36 100644 --- a/feature-flag/data/src/test/kotlin/me/proton/core/featureflag/data/repository/FeatureFlagRepositoryImplTest.kt +++ b/feature-flag/data/src/test/kotlin/me/proton/core/featureflag/data/repository/FeatureFlagRepositoryImplTest.kt @@ -298,6 +298,7 @@ class FeatureFlagRepositoryImplTest : CoroutinesTest by UnconfinedCoroutinesTest mutableDbFlow.emit(listOf(enabledFeatureEntity)) val expected = enabledFeature + assertNull(awaitItem()) assertEquals(expected, awaitItem()) } } @@ -326,6 +327,7 @@ class FeatureFlagRepositoryImplTest : CoroutinesTest by UnconfinedCoroutinesTest mutableDbFlow.emit(listOf(enabledFeatureEntity, disabledFeatureEntity)) val expected = listOf(enabledFeature, disabledFeature) + assertEquals(emptyList(), awaitItem()) assertEquals(expected, awaitItem()) } coVerify(Ordering.ORDERED) { @@ -372,6 +374,7 @@ class FeatureFlagRepositoryImplTest : CoroutinesTest by UnconfinedCoroutinesTest // Unknown flag is filtered out. val expected = listOf(enabledFeature) + assertEquals(emptyList(), awaitItem()) assertEquals(expected, awaitItem()) } coVerify(Ordering.ORDERED) { diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index c4a634b03..5178ce080 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -1,8 +1,8 @@ [versions] -androidGradle = "8.7.3" +androidGradle = "8.9.1" arturboschDetektGradle = "1.23.5" benManesVersions = "0.44.0" -daggerHiltAndroid = "2.49" +daggerHiltAndroid = "2.53.1" dependencyAnalysis = "2.4.2" detekt = "1.23.5" easyGradle = "2.8" @@ -12,7 +12,7 @@ kotlinDokka = "1.9.10" kotlinCoroutines = "1.8.0" kotlinSerialization = "1.6.3" kotlinx-kover = "0.8.2" -jacoco-to-cobertura = "1.2.0" +jacoco-to-cobertura = "1.3.2" vanniktechPublish = "0.33.0" paparazzi = "1.3.4" diff --git a/gradle/wrapper/gradle-wrapper.jar b/gradle/wrapper/gradle-wrapper.jar index 2c3521197..9bbc975c7 100644 Binary files a/gradle/wrapper/gradle-wrapper.jar and b/gradle/wrapper/gradle-wrapper.jar differ diff --git a/gradle/wrapper/gradle-wrapper.jar.sha256 b/gradle/wrapper/gradle-wrapper.jar.sha256 index 9901b4f5c..27e47ae46 100644 --- a/gradle/wrapper/gradle-wrapper.jar.sha256 +++ b/gradle/wrapper/gradle-wrapper.jar.sha256 @@ -1,3 +1,3 @@ -# Gradle 8.9 -# Updated on Thu Jan 23 17:59:28 CET 2025 -498495120a03b9a6ab5d155f5de3c8f0d986a449153702fb80fc80e134484f17 gradle-wrapper.jar +# Gradle 8.13 +# Updated on Mon Sep 15 14:27:06 CEST 2025 +81a82aaea5abcc8ff68b3dfcb58b3c3c429378efd98e7433460610fecd7ae45f gradle-wrapper.jar diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index 228bb540f..c99f97449 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,8 +1,7 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-8.9-bin.zip -# https://gradle.org/release-checksums -distributionSha256Sum=d725d707bfabd4dfdc958c624003b3c80accc03f7037b5122c4b1d0ef15cecab +distributionUrl=https\://services.gradle.org/distributions/gradle-8.13-bin.zip +distributionSha256Sum=20f1b1176237254a6fc204d8434196fa11a4cfb387567519c61556e8710aed78 networkTimeout=10000 validateDistributionUrl=true zipStoreBase=GRADLE_USER_HOME diff --git a/gradlew b/gradlew index f5feea6d6..faf93008b 100755 --- a/gradlew +++ b/gradlew @@ -86,8 +86,7 @@ done # shellcheck disable=SC2034 APP_BASE_NAME=${0##*/} # Discard cd standard output in case $CDPATH is set (https://github.com/gradle/gradle/issues/25036) -APP_HOME=$( cd -P "${APP_HOME:-./}" > /dev/null && printf '%s -' "$PWD" ) || exit +APP_HOME=$( cd -P "${APP_HOME:-./}" > /dev/null && printf '%s\n' "$PWD" ) || exit # Use the maximum available, or set MAX_FD != -1 to use that value. MAX_FD=maximum @@ -206,7 +205,7 @@ fi DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"' # Collect all arguments for the java command: -# * DEFAULT_JVM_OPTS, JAVA_OPTS, JAVA_OPTS, and optsEnvironmentVar are not allowed to contain shell fragments, +# * DEFAULT_JVM_OPTS, JAVA_OPTS, and optsEnvironmentVar are not allowed to contain shell fragments, # and any embedded shellness will be escaped. # * For example: A user cannot expect ${Hostname} to be expanded, as it is an environment variable and will be # treated as '${Hostname}' itself on the command line. diff --git a/key/data/build.gradle.kts b/key/data/build.gradle.kts index 20b75bf6d..4339664cc 100644 --- a/key/data/build.gradle.kts +++ b/key/data/build.gradle.kts @@ -59,7 +59,7 @@ dependencies { project(Module.authDomain), `coroutines-core`, `room-ktx`, - store4 + store5 ) androidTestImplementation( diff --git a/key/data/src/main/kotlin/me/proton/core/key/data/repository/KeySaltRepositoryImpl.kt b/key/data/src/main/kotlin/me/proton/core/key/data/repository/KeySaltRepositoryImpl.kt index c2786cfd8..95199baf2 100644 --- a/key/data/src/main/kotlin/me/proton/core/key/data/repository/KeySaltRepositoryImpl.kt +++ b/key/data/src/main/kotlin/me/proton/core/key/data/repository/KeySaltRepositoryImpl.kt @@ -18,9 +18,6 @@ package me.proton.core.key.data.repository -import com.dropbox.android.external.store4.Fetcher -import com.dropbox.android.external.store4.SourceOfTruth -import com.dropbox.android.external.store4.StoreBuilder import kotlinx.coroutines.flow.map import me.proton.core.data.arch.buildProtonStore import me.proton.core.domain.entity.SessionUserId @@ -33,6 +30,9 @@ import me.proton.core.key.domain.repository.KeySaltRepository import me.proton.core.network.data.ApiProvider import me.proton.core.util.kotlin.CoroutineScopeProvider import me.proton.core.util.kotlin.takeIfNotEmpty +import org.mobilenativefoundation.store.store5.Fetcher +import org.mobilenativefoundation.store.store5.SourceOfTruth +import org.mobilenativefoundation.store.store5.StoreBuilder import javax.inject.Inject class KeySaltRepositoryImpl @Inject constructor( @@ -62,5 +62,5 @@ class KeySaltRepositoryImpl @Inject constructor( override suspend fun clear(userId: UserId) = store.clear(userId) - override suspend fun clearAll() = store.clearAll() + override suspend fun clearAll() = store.clear() } diff --git a/key/data/src/main/kotlin/me/proton/core/key/data/repository/PublicAddressRepositoryImpl.kt b/key/data/src/main/kotlin/me/proton/core/key/data/repository/PublicAddressRepositoryImpl.kt index 3e475dc30..8e3c388ab 100644 --- a/key/data/src/main/kotlin/me/proton/core/key/data/repository/PublicAddressRepositoryImpl.kt +++ b/key/data/src/main/kotlin/me/proton/core/key/data/repository/PublicAddressRepositoryImpl.kt @@ -18,9 +18,6 @@ package me.proton.core.key.data.repository -import com.dropbox.android.external.store4.Fetcher -import com.dropbox.android.external.store4.SourceOfTruth -import com.dropbox.android.external.store4.StoreBuilder import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.map import me.proton.core.data.arch.buildProtonStore @@ -38,12 +35,15 @@ import me.proton.core.key.domain.entity.key.PublicAddress import me.proton.core.key.domain.entity.key.PublicAddressInfo import me.proton.core.key.domain.entity.key.PublicSignedKeyList import me.proton.core.key.domain.repository.PublicAddressRepository -import me.proton.core.key.domain.repository.Source import me.proton.core.key.domain.repository.PublicAddressVerifier +import me.proton.core.key.domain.repository.Source import me.proton.core.network.data.ApiProvider import me.proton.core.network.domain.CacheOverride import me.proton.core.util.kotlin.CoroutineScopeProvider import me.proton.core.util.kotlin.toInt +import org.mobilenativefoundation.store.store5.Fetcher +import org.mobilenativefoundation.store.store5.SourceOfTruth +import org.mobilenativefoundation.store.store5.StoreBuilder import java.util.Optional import javax.inject.Inject @@ -189,7 +189,7 @@ class PublicAddressRepositoryImpl @Inject constructor( }.valueOrThrow override suspend fun clearAll() { - publicAddressInfoStore.clearAll() - store.clearAll() + publicAddressInfoStore.clear() + store.clear() } } diff --git a/key/data/src/test/kotlin/me/proton/core/key/data/repository/PublicAddressRepositoryImplTest.kt b/key/data/src/test/kotlin/me/proton/core/key/data/repository/PublicAddressRepositoryImplTest.kt index 2aba16c43..48fb45d6b 100644 --- a/key/data/src/test/kotlin/me/proton/core/key/data/repository/PublicAddressRepositoryImplTest.kt +++ b/key/data/src/test/kotlin/me/proton/core/key/data/repository/PublicAddressRepositoryImplTest.kt @@ -244,7 +244,6 @@ class PublicAddressRepositoryImplTest { coEvery { keyApi.getAllActivePublicKeys(any(), any(), any()) } returns testResponse coEvery { publicAddressInfoWithKeysDao.findWithKeysByEmail(testEmail) } returns flowOf( - null, testResponse.toPublicAddressInfo(testEmail).toEntity() ) coJustRun { publicAddressInfoDao.deleteByEmail(testEmail) } diff --git a/label/data/build.gradle.kts b/label/data/build.gradle.kts index 71ee15b78..79768c1f6 100644 --- a/label/data/build.gradle.kts +++ b/label/data/build.gradle.kts @@ -66,7 +66,7 @@ dependencies { // Other `android-work-runtime`, - store4, + store5, ) kaptTest(`room-compiler`) diff --git a/label/data/src/main/kotlin/me/proton/core/label/data/repository/LabelRepositoryImpl.kt b/label/data/src/main/kotlin/me/proton/core/label/data/repository/LabelRepositoryImpl.kt index 6a9e89544..e892cb61e 100644 --- a/label/data/src/main/kotlin/me/proton/core/label/data/repository/LabelRepositoryImpl.kt +++ b/label/data/src/main/kotlin/me/proton/core/label/data/repository/LabelRepositoryImpl.kt @@ -20,10 +20,6 @@ package me.proton.core.label.data.repository import androidx.work.ExistingWorkPolicy import androidx.work.WorkManager -import com.dropbox.android.external.store4.Fetcher -import com.dropbox.android.external.store4.SourceOfTruth -import com.dropbox.android.external.store4.StoreBuilder -import com.dropbox.android.external.store4.StoreRequest import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.map import me.proton.core.data.arch.ProtonStore @@ -43,6 +39,10 @@ import me.proton.core.label.domain.repository.LabelLocalDataSource import me.proton.core.label.domain.repository.LabelRemoteDataSource import me.proton.core.label.domain.repository.LabelRepository import me.proton.core.util.kotlin.CoroutineScopeProvider +import org.mobilenativefoundation.store.store5.Fetcher +import org.mobilenativefoundation.store.store5.SourceOfTruth +import org.mobilenativefoundation.store.store5.StoreBuilder +import org.mobilenativefoundation.store.store5.StoreReadRequest import javax.inject.Inject import javax.inject.Singleton @@ -74,7 +74,7 @@ class LabelRepositoryImpl @Inject constructor( override fun observeLabels(userId: UserId, type: LabelType, refresh: Boolean): Flow>> = StoreKey(userId = userId, type = type).let { key -> - store.stream(StoreRequest.cached(key, refresh)).map { it.toDataResult() } + store.stream(StoreReadRequest.cached(key, refresh)).map { it.toDataResult() } } override suspend fun getLabels(userId: UserId, type: LabelType, refresh: Boolean): List