From 99c139d1ac70355fe68b6d49eb6dc4a32e9dd56e Mon Sep 17 00:00:00 2001 From: "Z. Charles Dziura" Date: Thu, 27 Mar 2025 10:19:46 -0400 Subject: [PATCH] Move the credential manager into its own dependency module --- .../debtpirate/app/host/MainActivity.kt | 8 ++-- .../confirm/ConfirmationScreenViewModel.kt | 2 +- .../login/LoginScreenViewModel.kt | 4 +- .../register/RegistrationScreenViewModel.kt | 4 +- .../debtpirate/di/AppCredentialsModule.kt | 19 --------- .../debtpirate/di/NavigatorModule.kt | 4 +- .../domain/credential/CredentialManager.kt | 42 +++++++++++++++++++ .../{ => domain}/navigation/Destination.kt | 2 +- .../navigation/NavigationAction.kt | 2 +- .../{ => domain}/navigation/Navigator.kt | 3 +- .../domain/usecase/StoreCredentialsUseCase.kt | 15 +++++++ .../debtpirate/types/Either.kt | 6 --- 12 files changed, 71 insertions(+), 40 deletions(-) delete mode 100644 app/app/src/main/java/ing/bikeshedengineer/debtpirate/di/AppCredentialsModule.kt create mode 100644 app/app/src/main/java/ing/bikeshedengineer/debtpirate/domain/credential/CredentialManager.kt rename app/app/src/main/java/ing/bikeshedengineer/debtpirate/{ => domain}/navigation/Destination.kt (92%) rename app/app/src/main/java/ing/bikeshedengineer/debtpirate/{ => domain}/navigation/NavigationAction.kt (82%) rename app/app/src/main/java/ing/bikeshedengineer/debtpirate/{ => domain}/navigation/Navigator.kt (92%) delete mode 100644 app/app/src/main/java/ing/bikeshedengineer/debtpirate/types/Either.kt diff --git a/app/app/src/main/java/ing/bikeshedengineer/debtpirate/app/host/MainActivity.kt b/app/app/src/main/java/ing/bikeshedengineer/debtpirate/app/host/MainActivity.kt index 5ca42bb..e24adc5 100644 --- a/app/app/src/main/java/ing/bikeshedengineer/debtpirate/app/host/MainActivity.kt +++ b/app/app/src/main/java/ing/bikeshedengineer/debtpirate/app/host/MainActivity.kt @@ -32,11 +32,11 @@ import ing.bikeshedengineer.debtpirate.app.screen.auth.presentation.login.LoginS import ing.bikeshedengineer.debtpirate.app.screen.auth.presentation.register.RegistrationScreen import ing.bikeshedengineer.debtpirate.app.screen.auth.presentation.register.RegistrationScreenViewModel import ing.bikeshedengineer.debtpirate.app.screen.home.presentation.overview.OverviewScreen +import ing.bikeshedengineer.debtpirate.domain.navigation.Destination +import ing.bikeshedengineer.debtpirate.domain.navigation.NavigationAction +import ing.bikeshedengineer.debtpirate.domain.navigation.Navigator import ing.bikeshedengineer.debtpirate.domain.usecase.GetStoredTokensUseCase import ing.bikeshedengineer.debtpirate.domain.usecase.StoreCredentialsUseCase -import ing.bikeshedengineer.debtpirate.navigation.Destination -import ing.bikeshedengineer.debtpirate.navigation.NavigationAction -import ing.bikeshedengineer.debtpirate.navigation.Navigator import ing.bikeshedengineer.debtpirate.theme.DebtPirateTheme import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.flow.Flow @@ -63,7 +63,7 @@ class MainActivity : ComponentActivity() { enableEdgeToEdge() setContent { val navController = rememberNavController() - + ObserveAsEvents(navigator.navigationActions) { action -> when (action) { diff --git a/app/app/src/main/java/ing/bikeshedengineer/debtpirate/app/screen/auth/presentation/confirm/ConfirmationScreenViewModel.kt b/app/app/src/main/java/ing/bikeshedengineer/debtpirate/app/screen/auth/presentation/confirm/ConfirmationScreenViewModel.kt index 8409c39..2b675d0 100644 --- a/app/app/src/main/java/ing/bikeshedengineer/debtpirate/app/screen/auth/presentation/confirm/ConfirmationScreenViewModel.kt +++ b/app/app/src/main/java/ing/bikeshedengineer/debtpirate/app/screen/auth/presentation/confirm/ConfirmationScreenViewModel.kt @@ -7,7 +7,7 @@ import androidx.lifecycle.viewModelScope import dagger.hilt.android.lifecycle.HiltViewModel import ing.bikeshedengineer.debtpirate.AppDataStore import ing.bikeshedengineer.debtpirate.app.screen.auth.usecase.SubmitNewUserVerificationRequestUseCase -import ing.bikeshedengineer.debtpirate.navigation.Navigator +import ing.bikeshedengineer.debtpirate.domain.navigation.Navigator import kotlinx.coroutines.flow.MutableStateFlow import kotlinx.coroutines.flow.asStateFlow import kotlinx.coroutines.launch diff --git a/app/app/src/main/java/ing/bikeshedengineer/debtpirate/app/screen/auth/presentation/login/LoginScreenViewModel.kt b/app/app/src/main/java/ing/bikeshedengineer/debtpirate/app/screen/auth/presentation/login/LoginScreenViewModel.kt index 353811d..cf1b092 100644 --- a/app/app/src/main/java/ing/bikeshedengineer/debtpirate/app/screen/auth/presentation/login/LoginScreenViewModel.kt +++ b/app/app/src/main/java/ing/bikeshedengineer/debtpirate/app/screen/auth/presentation/login/LoginScreenViewModel.kt @@ -12,9 +12,9 @@ import ing.bikeshedengineer.debtpirate.app.screen.auth.usecase.LoginCredentialsV import ing.bikeshedengineer.debtpirate.app.screen.auth.usecase.SubmitLoginCredentialsUseCase import ing.bikeshedengineer.debtpirate.app.screen.auth.usecase.UserNotFoundException import ing.bikeshedengineer.debtpirate.app.screen.auth.usecase.ValidateLoginCredentialsUseCase +import ing.bikeshedengineer.debtpirate.domain.navigation.Destination +import ing.bikeshedengineer.debtpirate.domain.navigation.Navigator import ing.bikeshedengineer.debtpirate.domain.usecase.UpdateStoreDataUseCase -import ing.bikeshedengineer.debtpirate.navigation.Destination -import ing.bikeshedengineer.debtpirate.navigation.Navigator import kotlinx.coroutines.flow.MutableSharedFlow import kotlinx.coroutines.flow.MutableStateFlow import kotlinx.coroutines.flow.distinctUntilChangedBy diff --git a/app/app/src/main/java/ing/bikeshedengineer/debtpirate/app/screen/auth/presentation/register/RegistrationScreenViewModel.kt b/app/app/src/main/java/ing/bikeshedengineer/debtpirate/app/screen/auth/presentation/register/RegistrationScreenViewModel.kt index a589692..7860191 100644 --- a/app/app/src/main/java/ing/bikeshedengineer/debtpirate/app/screen/auth/presentation/register/RegistrationScreenViewModel.kt +++ b/app/app/src/main/java/ing/bikeshedengineer/debtpirate/app/screen/auth/presentation/register/RegistrationScreenViewModel.kt @@ -7,9 +7,9 @@ import dagger.hilt.android.lifecycle.HiltViewModel import ing.bikeshedengineer.debtpirate.app.screen.auth.usecase.NewAccountRegistrationValidationResult import ing.bikeshedengineer.debtpirate.app.screen.auth.usecase.SubmitAccountRegistrationRequestUseCase import ing.bikeshedengineer.debtpirate.app.screen.auth.usecase.ValidateNewAccountRegistrationUseCase +import ing.bikeshedengineer.debtpirate.domain.navigation.Destination +import ing.bikeshedengineer.debtpirate.domain.navigation.Navigator import ing.bikeshedengineer.debtpirate.domain.usecase.UpdateStoreDataUseCase -import ing.bikeshedengineer.debtpirate.navigation.Destination -import ing.bikeshedengineer.debtpirate.navigation.Navigator import kotlinx.coroutines.flow.MutableSharedFlow import kotlinx.coroutines.flow.MutableStateFlow import kotlinx.coroutines.flow.asSharedFlow diff --git a/app/app/src/main/java/ing/bikeshedengineer/debtpirate/di/AppCredentialsModule.kt b/app/app/src/main/java/ing/bikeshedengineer/debtpirate/di/AppCredentialsModule.kt deleted file mode 100644 index bfa522a..0000000 --- a/app/app/src/main/java/ing/bikeshedengineer/debtpirate/di/AppCredentialsModule.kt +++ /dev/null @@ -1,19 +0,0 @@ -package ing.bikeshedengineer.debtpirate.di - -import android.content.Context -import dagger.Module -import dagger.Provides -import dagger.hilt.InstallIn -import dagger.hilt.android.components.ActivityComponent -import dagger.hilt.android.qualifiers.ActivityContext -import dagger.hilt.android.scopes.ActivityScoped -import ing.bikeshedengineer.debtpirate.domain.usecase.StoreCredentialsUseCase - -@Module -@InstallIn(ActivityComponent::class) -object AppCredentialsModule { - - @Provides - @ActivityScoped - fun provideStoreCredentialsUseCase(@ActivityContext context: Context) = StoreCredentialsUseCase(context) -} \ No newline at end of file diff --git a/app/app/src/main/java/ing/bikeshedengineer/debtpirate/di/NavigatorModule.kt b/app/app/src/main/java/ing/bikeshedengineer/debtpirate/di/NavigatorModule.kt index e028996..32f8bfd 100644 --- a/app/app/src/main/java/ing/bikeshedengineer/debtpirate/di/NavigatorModule.kt +++ b/app/app/src/main/java/ing/bikeshedengineer/debtpirate/di/NavigatorModule.kt @@ -4,8 +4,8 @@ import dagger.Module import dagger.Provides import dagger.hilt.InstallIn import dagger.hilt.components.SingletonComponent -import ing.bikeshedengineer.debtpirate.navigation.Navigator -import ing.bikeshedengineer.debtpirate.navigation.NavigatorImpl +import ing.bikeshedengineer.debtpirate.domain.navigation.Navigator +import ing.bikeshedengineer.debtpirate.domain.navigation.NavigatorImpl import javax.inject.Singleton @Module diff --git a/app/app/src/main/java/ing/bikeshedengineer/debtpirate/domain/credential/CredentialManager.kt b/app/app/src/main/java/ing/bikeshedengineer/debtpirate/domain/credential/CredentialManager.kt new file mode 100644 index 0000000..3b3c954 --- /dev/null +++ b/app/app/src/main/java/ing/bikeshedengineer/debtpirate/domain/credential/CredentialManager.kt @@ -0,0 +1,42 @@ +package ing.bikeshedengineer.debtpirate.domain.credential + +import dagger.Module +import dagger.Provides +import dagger.hilt.InstallIn +import dagger.hilt.components.SingletonComponent +import kotlinx.coroutines.channels.Channel +import kotlinx.coroutines.flow.Flow +import kotlinx.coroutines.flow.receiveAsFlow +import javax.inject.Singleton + +@Module +@InstallIn(SingletonComponent::class) +object CredentialManagerModule { + + @Provides + @Singleton + fun provideCredentialManager(): CredentialManager = CredentialManagerImpl() +} + +sealed interface CredentialManagerRequest { + data object GetCredentials : CredentialManagerRequest +} + +sealed interface CredentialManagerResponse { + data object NoCredentials : CredentialManagerResponse +} + +interface CredentialManager { + val credentialRequests: Flow + + suspend fun getCredentials() +} + +class CredentialManagerImpl() : CredentialManager { + private val _credentialRequests = Channel() + override val credentialRequests = _credentialRequests.receiveAsFlow() + + override suspend fun getCredentials() { + this._credentialRequests.send(CredentialManagerRequest.GetCredentials) + } +} diff --git a/app/app/src/main/java/ing/bikeshedengineer/debtpirate/navigation/Destination.kt b/app/app/src/main/java/ing/bikeshedengineer/debtpirate/domain/navigation/Destination.kt similarity index 92% rename from app/app/src/main/java/ing/bikeshedengineer/debtpirate/navigation/Destination.kt rename to app/app/src/main/java/ing/bikeshedengineer/debtpirate/domain/navigation/Destination.kt index d8f8981..696e2ad 100644 --- a/app/app/src/main/java/ing/bikeshedengineer/debtpirate/navigation/Destination.kt +++ b/app/app/src/main/java/ing/bikeshedengineer/debtpirate/domain/navigation/Destination.kt @@ -1,4 +1,4 @@ -package ing.bikeshedengineer.debtpirate.navigation +package ing.bikeshedengineer.debtpirate.domain.navigation import kotlinx.serialization.Serializable diff --git a/app/app/src/main/java/ing/bikeshedengineer/debtpirate/navigation/NavigationAction.kt b/app/app/src/main/java/ing/bikeshedengineer/debtpirate/domain/navigation/NavigationAction.kt similarity index 82% rename from app/app/src/main/java/ing/bikeshedengineer/debtpirate/navigation/NavigationAction.kt rename to app/app/src/main/java/ing/bikeshedengineer/debtpirate/domain/navigation/NavigationAction.kt index 5fe2061..4a4f8cf 100644 --- a/app/app/src/main/java/ing/bikeshedengineer/debtpirate/navigation/NavigationAction.kt +++ b/app/app/src/main/java/ing/bikeshedengineer/debtpirate/domain/navigation/NavigationAction.kt @@ -1,4 +1,4 @@ -package ing.bikeshedengineer.debtpirate.navigation +package ing.bikeshedengineer.debtpirate.domain.navigation import androidx.navigation.NavOptionsBuilder diff --git a/app/app/src/main/java/ing/bikeshedengineer/debtpirate/navigation/Navigator.kt b/app/app/src/main/java/ing/bikeshedengineer/debtpirate/domain/navigation/Navigator.kt similarity index 92% rename from app/app/src/main/java/ing/bikeshedengineer/debtpirate/navigation/Navigator.kt rename to app/app/src/main/java/ing/bikeshedengineer/debtpirate/domain/navigation/Navigator.kt index da31339..9d27103 100644 --- a/app/app/src/main/java/ing/bikeshedengineer/debtpirate/navigation/Navigator.kt +++ b/app/app/src/main/java/ing/bikeshedengineer/debtpirate/domain/navigation/Navigator.kt @@ -1,10 +1,9 @@ -package ing.bikeshedengineer.debtpirate.navigation +package ing.bikeshedengineer.debtpirate.domain.navigation import androidx.navigation.NavOptionsBuilder import kotlinx.coroutines.channels.Channel import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.receiveAsFlow -import javax.inject.Inject interface Navigator { val startDestination: Destination diff --git a/app/app/src/main/java/ing/bikeshedengineer/debtpirate/domain/usecase/StoreCredentialsUseCase.kt b/app/app/src/main/java/ing/bikeshedengineer/debtpirate/domain/usecase/StoreCredentialsUseCase.kt index 0373bb0..d4d426d 100644 --- a/app/app/src/main/java/ing/bikeshedengineer/debtpirate/domain/usecase/StoreCredentialsUseCase.kt +++ b/app/app/src/main/java/ing/bikeshedengineer/debtpirate/domain/usecase/StoreCredentialsUseCase.kt @@ -5,6 +5,21 @@ import android.util.Log import androidx.credentials.CreatePasswordRequest import androidx.credentials.CredentialManager import androidx.credentials.exceptions.CreateCredentialException +import dagger.Module +import dagger.Provides +import dagger.hilt.InstallIn +import dagger.hilt.android.components.ActivityComponent +import dagger.hilt.android.qualifiers.ActivityContext +import dagger.hilt.android.scopes.ActivityScoped + +@Module +@InstallIn(ActivityComponent::class) +object StoreCredentialsUseCaseModule { + + @Provides + @ActivityScoped + fun provideStoreCredentialsUseCase(@ActivityContext context: Context) = StoreCredentialsUseCase(context) +} class StoreCredentialsUseCase(val context: Context) { suspend operator fun invoke(username: String, password: String) { diff --git a/app/app/src/main/java/ing/bikeshedengineer/debtpirate/types/Either.kt b/app/app/src/main/java/ing/bikeshedengineer/debtpirate/types/Either.kt deleted file mode 100644 index 6056997..0000000 --- a/app/app/src/main/java/ing/bikeshedengineer/debtpirate/types/Either.kt +++ /dev/null @@ -1,6 +0,0 @@ -package ing.bikeshedengineer.debtpirate.types - -sealed class Either { - class Left(val value: A) : Either() - class Right(val value: B) : Either() -} \ No newline at end of file