Loading docs/login-class-diagram.md 0 → 100644 +237 −0 Original line number Diff line number Diff line # Login Feature Class Diagram This diagram covers the main classes involved in sign-in, login state initialization, and store authentication orchestration. Included scope: - setup UI fragments - shared `LoginViewModel` - domain login use cases - repository and authenticator abstractions - Play Store, Google, anonymous, and microG login managers Intentionally omitted: - exception classes - event bus / retry helpers - value objects with no orchestration role Layering: - `UI / App layer` contains UI entrypoints and app-facing coordinator interfaces used by the view model - `Domain layer` contains use cases plus the `LoginRepository` contract - `Data layer` contains concrete repository implementations, store authenticators, login managers, and persistence-facing collaborators Hilt bindings connect: - `AppLoginRepository` -> `LoginRepository` - `AuthenticatorRepository` -> `StoreAuthCoordinator` - `AuthenticatorRepository` -> `PlayStoreAuthManager` - `MicrogLoginManager` -> `MicrogAccountFetcher` ```mermaid classDiagram direction LR class UI_App_Layer { <<Layer>> } class Domain_Layer { <<Layer>> } class Data_Layer { <<Layer>> } class SignInFragment class GoogleSignInFragment class LoginViewModel { +startLoginFlow(clearList) +hasMicrogAccount() +initialMicrogLogin(accountName, onUserSaved, onError, onIntentRequired) +initialAnonymousLogin(onUserSaved) +initialGoogleLogin(email, oauthToken, onUserSaved) +initialNoGoogleLogin(onUserSaved) +markInvalidAuthObject(authObjectName) +logout() } class StoreAuthCoordinator { <<interface>> +fetchAuthObjects(authTypes) } class PlayStoreAuthManager { <<interface>> +getGPlayAuthOrThrow() +setGPlayAuth(auth) +getValidatedAuthData() } class MicrogAccountFetcher { <<interface>> +hasMicrogAccount() +fetchAccount(accountName) } class LoginRepository { <<interface>> +initializeAnonymousLogin() +initializeGoogleLogin(email, oauthToken, authSource) +initializeNoGoogleLogin() +logout() } class AnonymousLoginUseCase { +invoke() } class GoogleLoginUseCase { +invoke(email, oauthToken) } class MicrogLoginUseCase { +invoke(email, oauthToken) } class NoGoogleLoginUseCase { +invoke() } class LogoutUseCase { +invoke() } class AppLoginRepository class AuthenticatorRepository class StoreAuthenticator { <<interface>> +login() +logout() +isStoreActive() } class PlayStoreAuthenticator class CleanApkAuthenticator class PlayStoreSession { +login() } class LoginManager { <<interface>> +login() } class GoogleLoginManager class MicrogLoginManager class AnonymousLoginManager class SessionRepository { <<interface>> } class PlayStoreAuthStore { <<interface>> } class AppPreferencesRepository { <<interface>> } class Stores class AuthDataCache class OauthToAasTokenConverter class UserProfileFetcher class StoreAuthResult class AuthObject class GPlayAuth class CleanApk UI_App_Layer <.. SignInFragment : belongs to UI_App_Layer <.. GoogleSignInFragment : belongs to UI_App_Layer <.. LoginViewModel : belongs to UI_App_Layer <.. StoreAuthCoordinator : belongs to UI_App_Layer <.. PlayStoreAuthManager : belongs to UI_App_Layer <.. MicrogAccountFetcher : belongs to Domain_Layer <.. LoginRepository : belongs to Domain_Layer <.. AnonymousLoginUseCase : belongs to Domain_Layer <.. GoogleLoginUseCase : belongs to Domain_Layer <.. MicrogLoginUseCase : belongs to Domain_Layer <.. NoGoogleLoginUseCase : belongs to Domain_Layer <.. LogoutUseCase : belongs to Data_Layer <.. AppLoginRepository : belongs to Data_Layer <.. AuthenticatorRepository : belongs to Data_Layer <.. StoreAuthenticator : belongs to Data_Layer <.. PlayStoreAuthenticator : belongs to Data_Layer <.. CleanApkAuthenticator : belongs to Data_Layer <.. PlayStoreSession : belongs to Data_Layer <.. LoginManager : belongs to Data_Layer <.. GoogleLoginManager : belongs to Data_Layer <.. MicrogLoginManager : belongs to Data_Layer <.. AnonymousLoginManager : belongs to Data_Layer <.. SessionRepository : belongs to Data_Layer <.. PlayStoreAuthStore : belongs to Data_Layer <.. AppPreferencesRepository : belongs to Data_Layer <.. Stores : belongs to Data_Layer <.. AuthDataCache : belongs to Data_Layer <.. OauthToAasTokenConverter : belongs to Data_Layer <.. UserProfileFetcher : belongs to Data_Layer <.. StoreAuthResult : belongs to Data_Layer <.. AuthObject : belongs to Data_Layer <.. GPlayAuth : belongs to Data_Layer <.. CleanApk : belongs to SignInFragment --> LoginViewModel GoogleSignInFragment --> LoginViewModel LoginViewModel --> StoreAuthCoordinator LoginViewModel --> MicrogAccountFetcher LoginViewModel --> AnonymousLoginUseCase LoginViewModel --> GoogleLoginUseCase LoginViewModel --> MicrogLoginUseCase LoginViewModel --> NoGoogleLoginUseCase LoginViewModel --> LogoutUseCase AnonymousLoginUseCase --> LoginRepository GoogleLoginUseCase --> LoginRepository MicrogLoginUseCase --> LoginRepository NoGoogleLoginUseCase --> LoginRepository LogoutUseCase --> LoginRepository AppLoginRepository ..|> LoginRepository AppLoginRepository --> Stores AppLoginRepository --> SessionRepository AppLoginRepository --> PlayStoreAuthStore AuthenticatorRepository ..|> StoreAuthCoordinator AuthenticatorRepository ..|> PlayStoreAuthManager AuthenticatorRepository --> StoreAuthenticator : authenticators AuthenticatorRepository --> SessionRepository AuthenticatorRepository --> PlayStoreAuthStore PlayStoreAuthenticator ..|> StoreAuthenticator CleanApkAuthenticator ..|> StoreAuthenticator PlayStoreAuthenticator --> SessionRepository PlayStoreAuthenticator --> PlayStoreAuthStore PlayStoreAuthenticator --> AppPreferencesRepository PlayStoreAuthenticator --> AuthDataCache PlayStoreAuthenticator --> GoogleLoginManager PlayStoreAuthenticator --> MicrogLoginManager PlayStoreAuthenticator --> AnonymousLoginManager PlayStoreAuthenticator --> OauthToAasTokenConverter PlayStoreAuthenticator --> UserProfileFetcher PlayStoreAuthenticator ..> PlayStoreSession : creates CleanApkAuthenticator --> SessionRepository CleanApkAuthenticator --> AppPreferencesRepository PlayStoreSession --> LoginManager GoogleLoginManager ..|> LoginManager MicrogLoginManager ..|> LoginManager AnonymousLoginManager ..|> LoginManager MicrogLoginManager ..|> MicrogAccountFetcher MicrogLoginManager --> PlayStoreAuthStore StoreAuthResult --> AuthObject AuthObject <|-- GPlayAuth AuthObject <|-- CleanApk ``` Loading
docs/login-class-diagram.md 0 → 100644 +237 −0 Original line number Diff line number Diff line # Login Feature Class Diagram This diagram covers the main classes involved in sign-in, login state initialization, and store authentication orchestration. Included scope: - setup UI fragments - shared `LoginViewModel` - domain login use cases - repository and authenticator abstractions - Play Store, Google, anonymous, and microG login managers Intentionally omitted: - exception classes - event bus / retry helpers - value objects with no orchestration role Layering: - `UI / App layer` contains UI entrypoints and app-facing coordinator interfaces used by the view model - `Domain layer` contains use cases plus the `LoginRepository` contract - `Data layer` contains concrete repository implementations, store authenticators, login managers, and persistence-facing collaborators Hilt bindings connect: - `AppLoginRepository` -> `LoginRepository` - `AuthenticatorRepository` -> `StoreAuthCoordinator` - `AuthenticatorRepository` -> `PlayStoreAuthManager` - `MicrogLoginManager` -> `MicrogAccountFetcher` ```mermaid classDiagram direction LR class UI_App_Layer { <<Layer>> } class Domain_Layer { <<Layer>> } class Data_Layer { <<Layer>> } class SignInFragment class GoogleSignInFragment class LoginViewModel { +startLoginFlow(clearList) +hasMicrogAccount() +initialMicrogLogin(accountName, onUserSaved, onError, onIntentRequired) +initialAnonymousLogin(onUserSaved) +initialGoogleLogin(email, oauthToken, onUserSaved) +initialNoGoogleLogin(onUserSaved) +markInvalidAuthObject(authObjectName) +logout() } class StoreAuthCoordinator { <<interface>> +fetchAuthObjects(authTypes) } class PlayStoreAuthManager { <<interface>> +getGPlayAuthOrThrow() +setGPlayAuth(auth) +getValidatedAuthData() } class MicrogAccountFetcher { <<interface>> +hasMicrogAccount() +fetchAccount(accountName) } class LoginRepository { <<interface>> +initializeAnonymousLogin() +initializeGoogleLogin(email, oauthToken, authSource) +initializeNoGoogleLogin() +logout() } class AnonymousLoginUseCase { +invoke() } class GoogleLoginUseCase { +invoke(email, oauthToken) } class MicrogLoginUseCase { +invoke(email, oauthToken) } class NoGoogleLoginUseCase { +invoke() } class LogoutUseCase { +invoke() } class AppLoginRepository class AuthenticatorRepository class StoreAuthenticator { <<interface>> +login() +logout() +isStoreActive() } class PlayStoreAuthenticator class CleanApkAuthenticator class PlayStoreSession { +login() } class LoginManager { <<interface>> +login() } class GoogleLoginManager class MicrogLoginManager class AnonymousLoginManager class SessionRepository { <<interface>> } class PlayStoreAuthStore { <<interface>> } class AppPreferencesRepository { <<interface>> } class Stores class AuthDataCache class OauthToAasTokenConverter class UserProfileFetcher class StoreAuthResult class AuthObject class GPlayAuth class CleanApk UI_App_Layer <.. SignInFragment : belongs to UI_App_Layer <.. GoogleSignInFragment : belongs to UI_App_Layer <.. LoginViewModel : belongs to UI_App_Layer <.. StoreAuthCoordinator : belongs to UI_App_Layer <.. PlayStoreAuthManager : belongs to UI_App_Layer <.. MicrogAccountFetcher : belongs to Domain_Layer <.. LoginRepository : belongs to Domain_Layer <.. AnonymousLoginUseCase : belongs to Domain_Layer <.. GoogleLoginUseCase : belongs to Domain_Layer <.. MicrogLoginUseCase : belongs to Domain_Layer <.. NoGoogleLoginUseCase : belongs to Domain_Layer <.. LogoutUseCase : belongs to Data_Layer <.. AppLoginRepository : belongs to Data_Layer <.. AuthenticatorRepository : belongs to Data_Layer <.. StoreAuthenticator : belongs to Data_Layer <.. PlayStoreAuthenticator : belongs to Data_Layer <.. CleanApkAuthenticator : belongs to Data_Layer <.. PlayStoreSession : belongs to Data_Layer <.. LoginManager : belongs to Data_Layer <.. GoogleLoginManager : belongs to Data_Layer <.. MicrogLoginManager : belongs to Data_Layer <.. AnonymousLoginManager : belongs to Data_Layer <.. SessionRepository : belongs to Data_Layer <.. PlayStoreAuthStore : belongs to Data_Layer <.. AppPreferencesRepository : belongs to Data_Layer <.. Stores : belongs to Data_Layer <.. AuthDataCache : belongs to Data_Layer <.. OauthToAasTokenConverter : belongs to Data_Layer <.. UserProfileFetcher : belongs to Data_Layer <.. StoreAuthResult : belongs to Data_Layer <.. AuthObject : belongs to Data_Layer <.. GPlayAuth : belongs to Data_Layer <.. CleanApk : belongs to SignInFragment --> LoginViewModel GoogleSignInFragment --> LoginViewModel LoginViewModel --> StoreAuthCoordinator LoginViewModel --> MicrogAccountFetcher LoginViewModel --> AnonymousLoginUseCase LoginViewModel --> GoogleLoginUseCase LoginViewModel --> MicrogLoginUseCase LoginViewModel --> NoGoogleLoginUseCase LoginViewModel --> LogoutUseCase AnonymousLoginUseCase --> LoginRepository GoogleLoginUseCase --> LoginRepository MicrogLoginUseCase --> LoginRepository NoGoogleLoginUseCase --> LoginRepository LogoutUseCase --> LoginRepository AppLoginRepository ..|> LoginRepository AppLoginRepository --> Stores AppLoginRepository --> SessionRepository AppLoginRepository --> PlayStoreAuthStore AuthenticatorRepository ..|> StoreAuthCoordinator AuthenticatorRepository ..|> PlayStoreAuthManager AuthenticatorRepository --> StoreAuthenticator : authenticators AuthenticatorRepository --> SessionRepository AuthenticatorRepository --> PlayStoreAuthStore PlayStoreAuthenticator ..|> StoreAuthenticator CleanApkAuthenticator ..|> StoreAuthenticator PlayStoreAuthenticator --> SessionRepository PlayStoreAuthenticator --> PlayStoreAuthStore PlayStoreAuthenticator --> AppPreferencesRepository PlayStoreAuthenticator --> AuthDataCache PlayStoreAuthenticator --> GoogleLoginManager PlayStoreAuthenticator --> MicrogLoginManager PlayStoreAuthenticator --> AnonymousLoginManager PlayStoreAuthenticator --> OauthToAasTokenConverter PlayStoreAuthenticator --> UserProfileFetcher PlayStoreAuthenticator ..> PlayStoreSession : creates CleanApkAuthenticator --> SessionRepository CleanApkAuthenticator --> AppPreferencesRepository PlayStoreSession --> LoginManager GoogleLoginManager ..|> LoginManager MicrogLoginManager ..|> LoginManager AnonymousLoginManager ..|> LoginManager MicrogLoginManager ..|> MicrogAccountFetcher MicrogLoginManager --> PlayStoreAuthStore StoreAuthResult --> AuthObject AuthObject <|-- GPlayAuth AuthObject <|-- CleanApk ```