diff --git a/app/build.gradle b/app/build.gradle index 096cbeaef8f9..95b9c4478a99 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -301,7 +301,6 @@ dependencies { if (project.hasProperty('internal-testing')) { implementation project(':subscriptions-api') implementation project(':subscriptions-impl') - implementation project(':subscriptions-store') internalImplementation project(':subscriptions-internal') internalImplementation project(':network-protection-subscription-internal') } diff --git a/subscriptions/subscriptions-impl/build.gradle b/subscriptions/subscriptions-impl/build.gradle index 8e352d1aa5af..3f46669970d6 100644 --- a/subscriptions/subscriptions-impl/build.gradle +++ b/subscriptions/subscriptions-impl/build.gradle @@ -40,7 +40,6 @@ dependencies { implementation project(path: ':js-messaging-api') implementation project(path: ':user-agent-api') implementation project(path: ':subscriptions-api') - implementation project(path: ':subscriptions-store') implementation project(path: ':settings-api') implementation project(path: ':autofill-api') implementation project(path: ':network-protection-api') @@ -53,6 +52,7 @@ dependencies { implementation AndroidX.appCompat implementation KotlinX.coroutines.core + implementation AndroidX.work.runtimeKtx implementation Google.android.material implementation "com.android.billingclient:billing:_" @@ -66,6 +66,7 @@ dependencies { implementation AndroidX.constraintLayout implementation Square.retrofit2.converter.moshi implementation Square.okHttp3.okHttp + implementation AndroidX.security.crypto // Testing dependencies testImplementation project(path: ':common-test') diff --git a/subscriptions/subscriptions-impl/src/main/java/com/duckduckgo/subscriptions/impl/di/SubscriptionsModule.kt b/subscriptions/subscriptions-impl/src/main/java/com/duckduckgo/subscriptions/impl/di/SubscriptionsModule.kt index 26ff3e6c0d08..ed988f7ae173 100644 --- a/subscriptions/subscriptions-impl/src/main/java/com/duckduckgo/subscriptions/impl/di/SubscriptionsModule.kt +++ b/subscriptions/subscriptions-impl/src/main/java/com/duckduckgo/subscriptions/impl/di/SubscriptionsModule.kt @@ -18,10 +18,10 @@ package com.duckduckgo.subscriptions.impl.di import android.content.Context import com.duckduckgo.di.scopes.AppScope -import com.duckduckgo.subscriptions.store.AuthDataStore -import com.duckduckgo.subscriptions.store.AuthEncryptedDataStore -import com.duckduckgo.subscriptions.store.EncryptedSharedPrefsProvider -import com.duckduckgo.subscriptions.store.SharedPrefsProvider +import com.duckduckgo.subscriptions.impl.store.EncryptedSharedPrefsProvider +import com.duckduckgo.subscriptions.impl.store.SharedPrefsProvider +import com.duckduckgo.subscriptions.impl.store.SubscriptionsDataStore +import com.duckduckgo.subscriptions.impl.store.SubscriptionsEncryptedDataStore import com.squareup.anvil.annotations.ContributesTo import dagger.Module import dagger.Provides @@ -39,9 +39,9 @@ object SubscriptionsModule { @Provides @SingleInstanceIn(AppScope::class) - fun providesAuthDataStore( + fun providesSubscriptionsDataStore( sharedPrefsProvider: SharedPrefsProvider, - ): AuthDataStore { - return AuthEncryptedDataStore(sharedPrefsProvider) + ): SubscriptionsDataStore { + return SubscriptionsEncryptedDataStore(sharedPrefsProvider) } } diff --git a/subscriptions/subscriptions-impl/src/main/java/com/duckduckgo/subscriptions/impl/repository/AuthRepository.kt b/subscriptions/subscriptions-impl/src/main/java/com/duckduckgo/subscriptions/impl/repository/AuthRepository.kt index f0452e58e3b6..80e795b2782c 100644 --- a/subscriptions/subscriptions-impl/src/main/java/com/duckduckgo/subscriptions/impl/repository/AuthRepository.kt +++ b/subscriptions/subscriptions-impl/src/main/java/com/duckduckgo/subscriptions/impl/repository/AuthRepository.kt @@ -17,7 +17,7 @@ package com.duckduckgo.subscriptions.impl.repository import com.duckduckgo.di.scopes.AppScope -import com.duckduckgo.subscriptions.store.AuthDataStore +import com.duckduckgo.subscriptions.impl.store.SubscriptionsDataStore import com.squareup.anvil.annotations.ContributesBinding import dagger.SingleInstanceIn import javax.inject.Inject @@ -40,37 +40,41 @@ interface AuthRepository { @ContributesBinding(AppScope::class) @SingleInstanceIn(AppScope::class) class RealAuthRepository @Inject constructor( - private val authDataStore: AuthDataStore, + private val subscriptionsDataStore: SubscriptionsDataStore, ) : AuthRepository { - override fun isUserAuthenticated(): Boolean = !authDataStore.accessToken.isNullOrBlank() && !authDataStore.authToken.isNullOrBlank() + override fun isUserAuthenticated(): Boolean = + !subscriptionsDataStore.accessToken.isNullOrBlank() && !subscriptionsDataStore.authToken.isNullOrBlank() override suspend fun signOut() { - authDataStore.authToken = null - authDataStore.accessToken = null - authDataStore.platform = null - authDataStore.email = null - authDataStore.externalId = null - authDataStore.expiresOrRenewsAt = 0 + subscriptionsDataStore.authToken = null + subscriptionsDataStore.accessToken = null + subscriptionsDataStore.platform = null + subscriptionsDataStore.email = null + subscriptionsDataStore.externalId = null + subscriptionsDataStore.expiresOrRenewsAt = 0 } override suspend fun clearSubscriptionData() { - authDataStore.platform = null - authDataStore.expiresOrRenewsAt = 0 + subscriptionsDataStore.platform = null + subscriptionsDataStore.expiresOrRenewsAt = 0 } override suspend fun authenticate(authToken: String?, accessToken: String?, externalId: String?, email: String?) { - authDataStore.authToken = authToken - authDataStore.accessToken = accessToken - authDataStore.externalId = externalId - authDataStore.email = email + subscriptionsDataStore.authToken = authToken + subscriptionsDataStore.accessToken = accessToken + subscriptionsDataStore.externalId = externalId + subscriptionsDataStore.email = email } - override fun tokens(): SubscriptionsTokens = SubscriptionsTokens(authToken = authDataStore.authToken, accessToken = authDataStore.accessToken) + override fun tokens(): SubscriptionsTokens = SubscriptionsTokens( + authToken = subscriptionsDataStore.authToken, + accessToken = subscriptionsDataStore.accessToken, + ) override suspend fun saveSubscriptionData(platform: String, expiresOrRenewsAt: Long) { - authDataStore.platform = platform - authDataStore.expiresOrRenewsAt = expiresOrRenewsAt + subscriptionsDataStore.platform = platform + subscriptionsDataStore.expiresOrRenewsAt = expiresOrRenewsAt } } diff --git a/subscriptions/subscriptions-store/src/main/java/com/duckduckgo/subscriptions/store/SharedPrefsProvider.kt b/subscriptions/subscriptions-impl/src/main/java/com/duckduckgo/subscriptions/impl/store/SharedPrefsProvider.kt similarity index 96% rename from subscriptions/subscriptions-store/src/main/java/com/duckduckgo/subscriptions/store/SharedPrefsProvider.kt rename to subscriptions/subscriptions-impl/src/main/java/com/duckduckgo/subscriptions/impl/store/SharedPrefsProvider.kt index 69158c120e6d..196c504f1874 100644 --- a/subscriptions/subscriptions-store/src/main/java/com/duckduckgo/subscriptions/store/SharedPrefsProvider.kt +++ b/subscriptions/subscriptions-impl/src/main/java/com/duckduckgo/subscriptions/impl/store/SharedPrefsProvider.kt @@ -14,7 +14,7 @@ * limitations under the License. */ -package com.duckduckgo.subscriptions.store +package com.duckduckgo.subscriptions.impl.store import android.content.Context import android.content.SharedPreferences diff --git a/subscriptions/subscriptions-store/src/main/java/com/duckduckgo/subscriptions/store/AuthDataStore.kt b/subscriptions/subscriptions-impl/src/main/java/com/duckduckgo/subscriptions/impl/store/SubscriptionsDataStore.kt similarity index 96% rename from subscriptions/subscriptions-store/src/main/java/com/duckduckgo/subscriptions/store/AuthDataStore.kt rename to subscriptions/subscriptions-impl/src/main/java/com/duckduckgo/subscriptions/impl/store/SubscriptionsDataStore.kt index ef1ccc939b45..6e2d38f60f67 100644 --- a/subscriptions/subscriptions-store/src/main/java/com/duckduckgo/subscriptions/store/AuthDataStore.kt +++ b/subscriptions/subscriptions-impl/src/main/java/com/duckduckgo/subscriptions/impl/store/SubscriptionsDataStore.kt @@ -14,12 +14,12 @@ * limitations under the License. */ -package com.duckduckgo.subscriptions.store +package com.duckduckgo.subscriptions.impl.store import android.content.SharedPreferences import androidx.core.content.edit -interface AuthDataStore { +interface SubscriptionsDataStore { var accessToken: String? var authToken: String? var email: String? @@ -29,9 +29,9 @@ interface AuthDataStore { fun canUseEncryption(): Boolean } -class AuthEncryptedDataStore( +class SubscriptionsEncryptedDataStore( private val sharedPrefsProv: SharedPrefsProvider, -) : AuthDataStore { +) : SubscriptionsDataStore { private val encryptedPreferences: SharedPreferences? by lazy { encryptedPreferences() } diff --git a/subscriptions/subscriptions-impl/src/test/java/com/duckduckgo/subscriptions/impl/RealSubscriptionsManagerTest.kt b/subscriptions/subscriptions-impl/src/test/java/com/duckduckgo/subscriptions/impl/RealSubscriptionsManagerTest.kt index 37925221518f..b5d339b21fde 100644 --- a/subscriptions/subscriptions-impl/src/test/java/com/duckduckgo/subscriptions/impl/RealSubscriptionsManagerTest.kt +++ b/subscriptions/subscriptions-impl/src/test/java/com/duckduckgo/subscriptions/impl/RealSubscriptionsManagerTest.kt @@ -20,7 +20,7 @@ import com.duckduckgo.subscriptions.impl.billing.BillingClientWrapper import com.duckduckgo.subscriptions.impl.billing.PurchaseState import com.duckduckgo.subscriptions.impl.pixels.SubscriptionPixelSender import com.duckduckgo.subscriptions.impl.repository.AuthRepository -import com.duckduckgo.subscriptions.impl.repository.FakeAuthDataStore +import com.duckduckgo.subscriptions.impl.repository.FakeSubscriptionsDataStore import com.duckduckgo.subscriptions.impl.repository.RealAuthRepository import com.duckduckgo.subscriptions.impl.services.AccessTokenResponse import com.duckduckgo.subscriptions.impl.services.AccountResponse @@ -32,7 +32,7 @@ import com.duckduckgo.subscriptions.impl.services.StoreLoginResponse import com.duckduckgo.subscriptions.impl.services.SubscriptionResponse import com.duckduckgo.subscriptions.impl.services.SubscriptionsService import com.duckduckgo.subscriptions.impl.services.ValidateTokenResponse -import com.duckduckgo.subscriptions.store.AuthDataStore +import com.duckduckgo.subscriptions.impl.store.SubscriptionsDataStore import kotlinx.coroutines.flow.MutableSharedFlow import kotlinx.coroutines.flow.flowOf import kotlinx.coroutines.test.TestScope @@ -62,7 +62,7 @@ class RealSubscriptionsManagerTest { private val authService: AuthService = mock() private val subscriptionsService: SubscriptionsService = mock() - private val authDataStore: AuthDataStore = FakeAuthDataStore() + private val authDataStore: SubscriptionsDataStore = FakeSubscriptionsDataStore() private val authRepository = RealAuthRepository(authDataStore) private val emailManager: EmailManager = mock() private val billingClient: BillingClientWrapper = mock() diff --git a/subscriptions/subscriptions-impl/src/test/java/com/duckduckgo/subscriptions/impl/repository/FakeAuthDataStore.kt b/subscriptions/subscriptions-impl/src/test/java/com/duckduckgo/subscriptions/impl/repository/FakeSubscriptionsDataStore.kt similarity index 88% rename from subscriptions/subscriptions-impl/src/test/java/com/duckduckgo/subscriptions/impl/repository/FakeAuthDataStore.kt rename to subscriptions/subscriptions-impl/src/test/java/com/duckduckgo/subscriptions/impl/repository/FakeSubscriptionsDataStore.kt index 775c68e3f34d..f0e577d9a7b1 100644 --- a/subscriptions/subscriptions-impl/src/test/java/com/duckduckgo/subscriptions/impl/repository/FakeAuthDataStore.kt +++ b/subscriptions/subscriptions-impl/src/test/java/com/duckduckgo/subscriptions/impl/repository/FakeSubscriptionsDataStore.kt @@ -16,9 +16,9 @@ package com.duckduckgo.subscriptions.impl.repository -import com.duckduckgo.subscriptions.store.AuthDataStore +import com.duckduckgo.subscriptions.impl.store.SubscriptionsDataStore -class FakeAuthDataStore : AuthDataStore { +class FakeSubscriptionsDataStore : SubscriptionsDataStore { override var accessToken: String? = null override var authToken: String? = null diff --git a/subscriptions/subscriptions-impl/src/test/java/com/duckduckgo/subscriptions/impl/repository/RealAuthRepositoryTest.kt b/subscriptions/subscriptions-impl/src/test/java/com/duckduckgo/subscriptions/impl/repository/RealAuthRepositoryTest.kt index 6077a5f7d4dd..9ebe91768923 100644 --- a/subscriptions/subscriptions-impl/src/test/java/com/duckduckgo/subscriptions/impl/repository/RealAuthRepositoryTest.kt +++ b/subscriptions/subscriptions-impl/src/test/java/com/duckduckgo/subscriptions/impl/repository/RealAuthRepositoryTest.kt @@ -10,7 +10,7 @@ class RealAuthRepositoryTest { @get:Rule val coroutineRule = CoroutineTestRule() - private val authStore = FakeAuthDataStore() + private val authStore = FakeSubscriptionsDataStore() private val authRepository: AuthRepository = RealAuthRepository(authStore) @Test diff --git a/subscriptions/subscriptions-internal/build.gradle b/subscriptions/subscriptions-internal/build.gradle index 91efef4516d6..cc0f7342e2f6 100644 --- a/subscriptions/subscriptions-internal/build.gradle +++ b/subscriptions/subscriptions-internal/build.gradle @@ -32,7 +32,6 @@ android { dependencies { anvil project(':anvil-compiler') implementation project(':anvil-annotations') - implementation project(':subscriptions-store') implementation project(':subscriptions-impl') implementation project(':di') implementation project(':common-utils') diff --git a/subscriptions/subscriptions-internal/src/main/java/com/duckduckgo/subscriptions/internal/InternalViews.kt b/subscriptions/subscriptions-internal/src/main/java/com/duckduckgo/subscriptions/internal/InternalViews.kt index d0a4cbcd9f49..978158a6c5d1 100644 --- a/subscriptions/subscriptions-internal/src/main/java/com/duckduckgo/subscriptions/internal/InternalViews.kt +++ b/subscriptions/subscriptions-internal/src/main/java/com/duckduckgo/subscriptions/internal/InternalViews.kt @@ -27,7 +27,7 @@ import com.duckduckgo.internal.features.api.InternalFeaturePlugin import com.duckduckgo.subscriptions.impl.AccessToken import com.duckduckgo.subscriptions.impl.SubscriptionsData import com.duckduckgo.subscriptions.impl.SubscriptionsManager -import com.duckduckgo.subscriptions.store.AuthDataStore +import com.duckduckgo.subscriptions.impl.store.SubscriptionsDataStore import com.squareup.anvil.annotations.ContributesMultibinding import javax.inject.Inject import kotlinx.coroutines.CoroutineScope @@ -67,7 +67,7 @@ class InternalDeleteView @Inject constructor( @ContributesMultibinding(AppScope::class) class CopyDataView @Inject constructor( private val subscriptionsManager: SubscriptionsManager, - private val authDataStore: AuthDataStore, + private val subscriptionsDataStore: SubscriptionsDataStore, @AppCoroutineScope private val appCoroutineScope: CoroutineScope, val dispatcherProvider: DispatcherProvider, val context: Context, @@ -84,7 +84,7 @@ class CopyDataView @Inject constructor( val clipboardManager = context.getSystemService(ClipboardManager::class.java) appCoroutineScope.launch(dispatcherProvider.io()) { - val auth = authDataStore.authToken + val auth = subscriptionsDataStore.authToken val authToken = if (auth.isNullOrBlank()) { "No auth token found" } else { diff --git a/subscriptions/subscriptions-store/.gitignore b/subscriptions/subscriptions-store/.gitignore deleted file mode 100644 index 42afabfd2abe..000000000000 --- a/subscriptions/subscriptions-store/.gitignore +++ /dev/null @@ -1 +0,0 @@ -/build \ No newline at end of file diff --git a/subscriptions/subscriptions-store/build.gradle b/subscriptions/subscriptions-store/build.gradle deleted file mode 100644 index 4f587ee85265..000000000000 --- a/subscriptions/subscriptions-store/build.gradle +++ /dev/null @@ -1,41 +0,0 @@ -/* - * Copyright (c) 2022 DuckDuckGo - * - * 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 'com.android.library' - id 'kotlin-android' - id 'com.google.devtools.ksp' version "$ksp_version" -} - -apply from: "$rootProject.projectDir/gradle/android-library.gradle" - -dependencies { - implementation project(path: ':common-utils') - - implementation AndroidX.core.ktx - - implementation Square.retrofit2.converter.moshi - // Security crypto - implementation AndroidX.security.crypto - - testImplementation project(path: ':common-test') - testImplementation Testing.junit4 - testImplementation "org.mockito.kotlin:mockito-kotlin:_" -} - -android { - namespace 'com.duckduckgo.subscriptions.store' -} \ No newline at end of file