From 8a2b46e81a9741a7107e33229b4c8f5d669d149a Mon Sep 17 00:00:00 2001 From: David Perez Date: Mon, 2 Mar 2026 14:53:22 -0600 Subject: [PATCH] Move the AppStateManager to the data module (#6593) --- .../autofill/di/ActivityAutofillModule.kt | 2 +- .../manager/AutofillActivityManagerImpl.kt | 2 +- .../data/autofill/util/AutofillIntentUtils.kt | 19 ++----- .../manager/di/PlatformManagerModule.kt | 8 --- .../vault/manager/VaultLockManagerImpl.kt | 6 +- .../vault/manager/di/VaultManagerModule.kt | 2 +- .../manager/AutofillActivityManagerTest.kt | 4 +- .../vault/manager/VaultLockManagerTest.kt | 6 +- data/build.gradle.kts | 1 + .../data/autofill/util/AutofillIntentUtils.kt | 56 +++++++++++++++++++ .../data/manager/appstate}/AppStateManager.kt | 11 ++-- .../manager/appstate}/AppStateManagerImpl.kt | 10 ++-- .../appstate}/model/AppCreationState.kt | 2 +- .../appstate}/model/AppForegroundState.kt | 2 +- .../data/manager/di/DataManagerModule.kt | 9 +++ .../manager/appstate}/AppStateManagerTest.kt | 22 ++++++-- .../manager/appstate}/FakeAppStateManager.kt | 7 +-- 17 files changed, 112 insertions(+), 57 deletions(-) create mode 100644 data/src/main/kotlin/com/bitwarden/data/autofill/util/AutofillIntentUtils.kt rename {app/src/main/kotlin/com/x8bit/bitwarden/data/platform/manager => data/src/main/kotlin/com/bitwarden/data/manager/appstate}/AppStateManager.kt (50%) rename {app/src/main/kotlin/com/x8bit/bitwarden/data/platform/manager => data/src/main/kotlin/com/bitwarden/data/manager/appstate}/AppStateManagerImpl.kt (90%) rename {app/src/main/kotlin/com/x8bit/bitwarden/data/platform/manager => data/src/main/kotlin/com/bitwarden/data/manager/appstate}/model/AppCreationState.kt (88%) rename {app/src/main/kotlin/com/x8bit/bitwarden/data/platform/manager => data/src/main/kotlin/com/bitwarden/data/manager/appstate}/model/AppForegroundState.kt (81%) rename {app/src/test/kotlin/com/x8bit/bitwarden/data/platform/manager => data/src/test/kotlin/com/bitwarden/data/manager/appstate}/AppStateManagerTest.kt (85%) rename {app/src/test/kotlin/com/x8bit/bitwarden/data/platform/manager/util => data/src/testFixtures/kotlin/com/bitwarden/data/manager/appstate}/FakeAppStateManager.kt (82%) diff --git a/app/src/main/kotlin/com/x8bit/bitwarden/data/autofill/di/ActivityAutofillModule.kt b/app/src/main/kotlin/com/x8bit/bitwarden/data/autofill/di/ActivityAutofillModule.kt index c0682cd1d9..775bc40dc2 100644 --- a/app/src/main/kotlin/com/x8bit/bitwarden/data/autofill/di/ActivityAutofillModule.kt +++ b/app/src/main/kotlin/com/x8bit/bitwarden/data/autofill/di/ActivityAutofillModule.kt @@ -5,13 +5,13 @@ import android.view.autofill.AutofillManager import androidx.lifecycle.LifecycleCoroutineScope import androidx.lifecycle.LifecycleOwner import androidx.lifecycle.lifecycleScope +import com.bitwarden.data.manager.appstate.AppStateManager import com.x8bit.bitwarden.data.autofill.manager.AutofillActivityManager import com.x8bit.bitwarden.data.autofill.manager.AutofillActivityManagerImpl import com.x8bit.bitwarden.data.autofill.manager.AutofillEnabledManager import com.x8bit.bitwarden.data.autofill.manager.browser.BrowserThirdPartyAutofillEnabledManager import com.x8bit.bitwarden.data.autofill.manager.browser.BrowserThirdPartyAutofillManager import com.x8bit.bitwarden.data.autofill.manager.browser.BrowserThirdPartyAutofillManagerImpl -import com.x8bit.bitwarden.data.platform.manager.AppStateManager import dagger.Module import dagger.Provides import dagger.hilt.InstallIn diff --git a/app/src/main/kotlin/com/x8bit/bitwarden/data/autofill/manager/AutofillActivityManagerImpl.kt b/app/src/main/kotlin/com/x8bit/bitwarden/data/autofill/manager/AutofillActivityManagerImpl.kt index 1441f677a6..9df8d63fda 100644 --- a/app/src/main/kotlin/com/x8bit/bitwarden/data/autofill/manager/AutofillActivityManagerImpl.kt +++ b/app/src/main/kotlin/com/x8bit/bitwarden/data/autofill/manager/AutofillActivityManagerImpl.kt @@ -2,10 +2,10 @@ package com.x8bit.bitwarden.data.autofill.manager import android.view.autofill.AutofillManager import androidx.lifecycle.LifecycleCoroutineScope +import com.bitwarden.data.manager.appstate.AppStateManager import com.x8bit.bitwarden.data.autofill.manager.browser.BrowserThirdPartyAutofillEnabledManager import com.x8bit.bitwarden.data.autofill.manager.browser.BrowserThirdPartyAutofillManager import com.x8bit.bitwarden.data.autofill.model.browser.BrowserThirdPartyAutofillStatus -import com.x8bit.bitwarden.data.platform.manager.AppStateManager import kotlinx.coroutines.flow.launchIn import kotlinx.coroutines.flow.onEach diff --git a/app/src/main/kotlin/com/x8bit/bitwarden/data/autofill/util/AutofillIntentUtils.kt b/app/src/main/kotlin/com/x8bit/bitwarden/data/autofill/util/AutofillIntentUtils.kt index d06c4e8257..0f1b069062 100644 --- a/app/src/main/kotlin/com/x8bit/bitwarden/data/autofill/util/AutofillIntentUtils.kt +++ b/app/src/main/kotlin/com/x8bit/bitwarden/data/autofill/util/AutofillIntentUtils.kt @@ -2,7 +2,6 @@ package com.x8bit.bitwarden.data.autofill.util -import android.app.Activity import android.app.PendingIntent import android.app.assist.AssistStructure import android.content.Context @@ -13,6 +12,10 @@ import android.view.autofill.AutofillManager import androidx.core.os.bundleOf import com.bitwarden.annotation.OmitFromCoverage import com.bitwarden.core.util.toPendingIntentMutabilityFlag +import com.bitwarden.data.autofill.util.AUTOFILL_BUNDLE_KEY +import com.bitwarden.data.autofill.util.AUTOFILL_CALLBACK_DATA_KEY +import com.bitwarden.data.autofill.util.AUTOFILL_SAVE_ITEM_DATA_KEY +import com.bitwarden.data.autofill.util.AUTOFILL_SELECTION_DATA_KEY import com.bitwarden.ui.platform.util.getSafeParcelableExtra import com.x8bit.bitwarden.AutofillCallbackActivity import com.x8bit.bitwarden.MainActivity @@ -22,11 +25,6 @@ import com.x8bit.bitwarden.data.autofill.model.AutofillSaveItem import com.x8bit.bitwarden.data.autofill.model.AutofillSelectionData import kotlin.random.Random -private const val AUTOFILL_SAVE_ITEM_DATA_KEY = "autofill-save-item-data" -private const val AUTOFILL_SELECTION_DATA_KEY = "autofill-selection-data" -private const val AUTOFILL_CALLBACK_DATA_KEY = "autofill-callback-data" -private const val AUTOFILL_BUNDLE_KEY = "autofill-bundle-key" - /** * Creates an [Intent] in order to send the user to a manual selection process for autofill. */ @@ -149,12 +147,3 @@ fun Intent.getAutofillSelectionDataOrNull(): AutofillSelectionData? = fun Intent.getAutofillCallbackIntentOrNull(): AutofillCallbackData? = getBundleExtra(AUTOFILL_BUNDLE_KEY) ?.getSafeParcelableExtra(AUTOFILL_CALLBACK_DATA_KEY) - -/** - * Checks if the given [Activity] was created for Autofill. This is useful to avoid locking the - * vault if one of the Autofill services starts the only instance of the [MainActivity]. - */ -val Activity.createdForAutofill: Boolean - get() = intent.getAutofillSelectionDataOrNull() != null || - intent.getAutofillSaveItemOrNull() != null || - intent.getAutofillAssistStructureOrNull() != null diff --git a/app/src/main/kotlin/com/x8bit/bitwarden/data/platform/manager/di/PlatformManagerModule.kt b/app/src/main/kotlin/com/x8bit/bitwarden/data/platform/manager/di/PlatformManagerModule.kt index 2888c0c4cf..c2a89a5d46 100644 --- a/app/src/main/kotlin/com/x8bit/bitwarden/data/platform/manager/di/PlatformManagerModule.kt +++ b/app/src/main/kotlin/com/x8bit/bitwarden/data/platform/manager/di/PlatformManagerModule.kt @@ -30,8 +30,6 @@ import com.x8bit.bitwarden.data.platform.datasource.disk.SettingsDiskSource import com.x8bit.bitwarden.data.platform.datasource.disk.legacy.LegacyAppCenterMigrator import com.x8bit.bitwarden.data.platform.manager.AppResumeManager import com.x8bit.bitwarden.data.platform.manager.AppResumeManagerImpl -import com.x8bit.bitwarden.data.platform.manager.AppStateManager -import com.x8bit.bitwarden.data.platform.manager.AppStateManagerImpl import com.x8bit.bitwarden.data.platform.manager.AssetManager import com.x8bit.bitwarden.data.platform.manager.AssetManagerImpl import com.x8bit.bitwarden.data.platform.manager.BiometricsEncryptionManager @@ -106,12 +104,6 @@ import javax.inject.Singleton @InstallIn(SingletonComponent::class) object PlatformManagerModule { - @Provides - @Singleton - fun provideAppStateManager( - application: Application, - ): AppStateManager = AppStateManagerImpl(application = application) - @Provides @Singleton fun provideAuthenticatorBridgeProcessor( diff --git a/app/src/main/kotlin/com/x8bit/bitwarden/data/vault/manager/VaultLockManagerImpl.kt b/app/src/main/kotlin/com/x8bit/bitwarden/data/vault/manager/VaultLockManagerImpl.kt index add41370ab..737ad29f57 100644 --- a/app/src/main/kotlin/com/x8bit/bitwarden/data/vault/manager/VaultLockManagerImpl.kt +++ b/app/src/main/kotlin/com/x8bit/bitwarden/data/vault/manager/VaultLockManagerImpl.kt @@ -17,6 +17,9 @@ import com.bitwarden.core.data.util.concurrentMapOf import com.bitwarden.core.data.util.flatMap import com.bitwarden.crypto.HashPurpose import com.bitwarden.crypto.Kdf +import com.bitwarden.data.manager.appstate.AppStateManager +import com.bitwarden.data.manager.appstate.model.AppCreationState +import com.bitwarden.data.manager.appstate.model.AppForegroundState import com.x8bit.bitwarden.data.auth.datasource.disk.AuthDiskSource import com.x8bit.bitwarden.data.auth.datasource.sdk.AuthSdkSource import com.x8bit.bitwarden.data.auth.manager.KdfManager @@ -29,9 +32,6 @@ import com.x8bit.bitwarden.data.auth.repository.util.toSdkParams import com.x8bit.bitwarden.data.auth.repository.util.userAccountTokens import com.x8bit.bitwarden.data.auth.repository.util.userSwitchingChangesFlow import com.x8bit.bitwarden.data.platform.error.NoActiveUserException -import com.x8bit.bitwarden.data.platform.manager.AppStateManager -import com.x8bit.bitwarden.data.platform.manager.model.AppCreationState -import com.x8bit.bitwarden.data.platform.manager.model.AppForegroundState import com.x8bit.bitwarden.data.platform.repository.SettingsRepository import com.x8bit.bitwarden.data.platform.repository.model.VaultTimeout import com.x8bit.bitwarden.data.platform.repository.model.VaultTimeoutAction diff --git a/app/src/main/kotlin/com/x8bit/bitwarden/data/vault/manager/di/VaultManagerModule.kt b/app/src/main/kotlin/com/x8bit/bitwarden/data/vault/manager/di/VaultManagerModule.kt index 1c63697fec..e2804dfee3 100644 --- a/app/src/main/kotlin/com/x8bit/bitwarden/data/vault/manager/di/VaultManagerModule.kt +++ b/app/src/main/kotlin/com/x8bit/bitwarden/data/vault/manager/di/VaultManagerModule.kt @@ -4,6 +4,7 @@ import android.content.Context import com.bitwarden.core.data.manager.dispatcher.DispatcherManager import com.bitwarden.core.data.manager.realtime.RealtimeManager import com.bitwarden.cxf.parser.CredentialExchangePayloadParser +import com.bitwarden.data.manager.appstate.AppStateManager import com.bitwarden.data.manager.file.FileManager import com.bitwarden.network.service.CiphersService import com.bitwarden.network.service.FolderService @@ -16,7 +17,6 @@ import com.x8bit.bitwarden.data.auth.manager.TrustedDeviceManager import com.x8bit.bitwarden.data.auth.manager.UserLogoutManager import com.x8bit.bitwarden.data.auth.manager.UserStateManager import com.x8bit.bitwarden.data.platform.datasource.disk.SettingsDiskSource -import com.x8bit.bitwarden.data.platform.manager.AppStateManager import com.x8bit.bitwarden.data.platform.manager.DatabaseSchemeManager import com.x8bit.bitwarden.data.platform.manager.FeatureFlagManager import com.x8bit.bitwarden.data.platform.manager.PolicyManager diff --git a/app/src/test/kotlin/com/x8bit/bitwarden/data/autofill/manager/AutofillActivityManagerTest.kt b/app/src/test/kotlin/com/x8bit/bitwarden/data/autofill/manager/AutofillActivityManagerTest.kt index bcd68a53f1..c1c0ce25ef 100644 --- a/app/src/test/kotlin/com/x8bit/bitwarden/data/autofill/manager/AutofillActivityManagerTest.kt +++ b/app/src/test/kotlin/com/x8bit/bitwarden/data/autofill/manager/AutofillActivityManagerTest.kt @@ -3,13 +3,13 @@ package com.x8bit.bitwarden.data.autofill.manager import android.view.autofill.AutofillManager import androidx.lifecycle.LifecycleCoroutineScope import app.cash.turbine.test +import com.bitwarden.data.manager.appstate.AppStateManager +import com.bitwarden.data.manager.appstate.model.AppForegroundState import com.x8bit.bitwarden.data.autofill.manager.browser.BrowserThirdPartyAutofillEnabledManager import com.x8bit.bitwarden.data.autofill.manager.browser.BrowserThirdPartyAutofillEnabledManagerImpl import com.x8bit.bitwarden.data.autofill.manager.browser.BrowserThirdPartyAutofillManager import com.x8bit.bitwarden.data.autofill.model.browser.BrowserThirdPartyAutoFillData import com.x8bit.bitwarden.data.autofill.model.browser.BrowserThirdPartyAutofillStatus -import com.x8bit.bitwarden.data.platform.manager.AppStateManager -import com.x8bit.bitwarden.data.platform.manager.model.AppForegroundState import io.mockk.every import io.mockk.just import io.mockk.mockk diff --git a/app/src/test/kotlin/com/x8bit/bitwarden/data/vault/manager/VaultLockManagerTest.kt b/app/src/test/kotlin/com/x8bit/bitwarden/data/vault/manager/VaultLockManagerTest.kt index c7fe2e4f76..e338ade3d3 100644 --- a/app/src/test/kotlin/com/x8bit/bitwarden/data/vault/manager/VaultLockManagerTest.kt +++ b/app/src/test/kotlin/com/x8bit/bitwarden/data/vault/manager/VaultLockManagerTest.kt @@ -14,6 +14,9 @@ import com.bitwarden.core.data.manager.realtime.RealtimeManager import com.bitwarden.core.data.util.asFailure import com.bitwarden.core.data.util.asSuccess import com.bitwarden.crypto.HashPurpose +import com.bitwarden.data.manager.appstate.FakeAppStateManager +import com.bitwarden.data.manager.appstate.model.AppCreationState +import com.bitwarden.data.manager.appstate.model.AppForegroundState import com.x8bit.bitwarden.data.auth.datasource.disk.model.AccountJson import com.x8bit.bitwarden.data.auth.datasource.disk.model.AccountTokensJson import com.x8bit.bitwarden.data.auth.datasource.disk.model.UserStateJson @@ -26,9 +29,6 @@ import com.x8bit.bitwarden.data.auth.manager.model.LogoutEvent import com.x8bit.bitwarden.data.auth.repository.model.LogoutReason import com.x8bit.bitwarden.data.auth.repository.model.UpdateKdfMinimumsResult import com.x8bit.bitwarden.data.auth.repository.util.toSdkParams -import com.x8bit.bitwarden.data.platform.manager.model.AppCreationState -import com.x8bit.bitwarden.data.platform.manager.model.AppForegroundState -import com.x8bit.bitwarden.data.platform.manager.util.FakeAppStateManager import com.x8bit.bitwarden.data.platform.repository.SettingsRepository import com.x8bit.bitwarden.data.platform.repository.model.VaultTimeout import com.x8bit.bitwarden.data.platform.repository.model.VaultTimeoutAction diff --git a/data/build.gradle.kts b/data/build.gradle.kts index 5f7d82e743..91e07345e6 100644 --- a/data/build.gradle.kts +++ b/data/build.gradle.kts @@ -54,6 +54,7 @@ dependencies { implementation(libs.androidx.core.ktx) implementation(libs.androidx.security.crypto) + implementation(libs.androidx.lifecycle.process) implementation(libs.google.hilt.android) ksp(libs.google.hilt.compiler) implementation(libs.kotlinx.serialization) diff --git a/data/src/main/kotlin/com/bitwarden/data/autofill/util/AutofillIntentUtils.kt b/data/src/main/kotlin/com/bitwarden/data/autofill/util/AutofillIntentUtils.kt new file mode 100644 index 0000000000..7fd0b4d23b --- /dev/null +++ b/data/src/main/kotlin/com/bitwarden/data/autofill/util/AutofillIntentUtils.kt @@ -0,0 +1,56 @@ +@file:OmitFromCoverage + +package com.bitwarden.data.autofill.util + +import android.app.Activity +import android.content.Intent +import com.bitwarden.annotation.OmitFromCoverage + +/** + * A unique key used to set or get Autofill saved item data. + */ +const val AUTOFILL_SAVE_ITEM_DATA_KEY = "autofill-save-item-data" + +/** + * A unique key used to set or get Autofill selection data. + */ +const val AUTOFILL_SELECTION_DATA_KEY = "autofill-selection-data" + +/** + * A unique key used to set or get Autofill callback data. + */ +const val AUTOFILL_CALLBACK_DATA_KEY = "autofill-callback-data" + +/** + * A unique key used to set and get the `Bundle` containing autofill data. + */ +const val AUTOFILL_BUNDLE_KEY = "autofill-bundle-key" + +/** + * Checks if the given [Intent] contains an `AutofillSaveItem` related to an ongoing save item + * process. + */ +private val Intent.hasAutofillSaveItem: Boolean + get() = this.hasExtra(AUTOFILL_SAVE_ITEM_DATA_KEY) + +/** + * Checks if the given [Intent] contains data about an ongoing manual autofill selection process. + */ +private val Intent.hasAutofillSelectionData: Boolean + get() = getBundleExtra(AUTOFILL_BUNDLE_KEY) + ?.containsKey(AUTOFILL_SELECTION_DATA_KEY) == true + +/** + * Checks if the given [Intent] contains Autofill callback data. + */ +private val Intent.hasAutofillCallbackIntent: Boolean + get() = getBundleExtra(AUTOFILL_BUNDLE_KEY)?.containsKey(AUTOFILL_CALLBACK_DATA_KEY) == true + +/** + * Checks if the given [Activity] was created for Autofill. This is useful to avoid locking the + * vault if one of the Autofill services starts the only instance of the `Activity`. + */ +val Activity.createdForAutofill: Boolean + get() = intent.hasAutofillSelectionData || + intent.hasAutofillSaveItem || + intent.hasAutofillCallbackIntent diff --git a/app/src/main/kotlin/com/x8bit/bitwarden/data/platform/manager/AppStateManager.kt b/data/src/main/kotlin/com/bitwarden/data/manager/appstate/AppStateManager.kt similarity index 50% rename from app/src/main/kotlin/com/x8bit/bitwarden/data/platform/manager/AppStateManager.kt rename to data/src/main/kotlin/com/bitwarden/data/manager/appstate/AppStateManager.kt index 7bf69d0392..5ba8424b07 100644 --- a/app/src/main/kotlin/com/x8bit/bitwarden/data/platform/manager/AppStateManager.kt +++ b/data/src/main/kotlin/com/bitwarden/data/manager/appstate/AppStateManager.kt @@ -1,8 +1,7 @@ -package com.x8bit.bitwarden.data.platform.manager +package com.bitwarden.data.manager.appstate -import com.x8bit.bitwarden.data.autofill.accessibility.BitwardenAccessibilityService -import com.x8bit.bitwarden.data.platform.manager.model.AppCreationState -import com.x8bit.bitwarden.data.platform.manager.model.AppForegroundState +import com.bitwarden.data.manager.appstate.model.AppCreationState +import com.bitwarden.data.manager.appstate.model.AppForegroundState import kotlinx.coroutines.flow.StateFlow /** @@ -12,8 +11,8 @@ interface AppStateManager { /** * Emits whenever there are changes to the app creation state. * - * This is required because the [BitwardenAccessibilityService] will keep the app process alive - * when the app would otherwise be destroyed. + * This is required because the Accessibility Service will keep the app process alive when the + * app would otherwise be destroyed. */ val appCreatedStateFlow: StateFlow diff --git a/app/src/main/kotlin/com/x8bit/bitwarden/data/platform/manager/AppStateManagerImpl.kt b/data/src/main/kotlin/com/bitwarden/data/manager/appstate/AppStateManagerImpl.kt similarity index 90% rename from app/src/main/kotlin/com/x8bit/bitwarden/data/platform/manager/AppStateManagerImpl.kt rename to data/src/main/kotlin/com/bitwarden/data/manager/appstate/AppStateManagerImpl.kt index c44265e6fb..1b902acbec 100644 --- a/app/src/main/kotlin/com/x8bit/bitwarden/data/platform/manager/AppStateManagerImpl.kt +++ b/data/src/main/kotlin/com/bitwarden/data/manager/appstate/AppStateManagerImpl.kt @@ -1,4 +1,4 @@ -package com.x8bit.bitwarden.data.platform.manager +package com.bitwarden.data.manager.appstate import android.app.Activity import android.app.Application @@ -6,9 +6,9 @@ import android.os.Bundle import androidx.lifecycle.DefaultLifecycleObserver import androidx.lifecycle.LifecycleOwner import androidx.lifecycle.ProcessLifecycleOwner -import com.x8bit.bitwarden.data.autofill.util.createdForAutofill -import com.x8bit.bitwarden.data.platform.manager.model.AppCreationState -import com.x8bit.bitwarden.data.platform.manager.model.AppForegroundState +import com.bitwarden.data.autofill.util.createdForAutofill +import com.bitwarden.data.manager.appstate.model.AppCreationState +import com.bitwarden.data.manager.appstate.model.AppForegroundState import kotlinx.coroutines.flow.MutableStateFlow import kotlinx.coroutines.flow.StateFlow import kotlinx.coroutines.flow.asStateFlow @@ -17,7 +17,7 @@ import timber.log.Timber /** * Primary implementation of [AppStateManager]. */ -class AppStateManagerImpl( +internal class AppStateManagerImpl( application: Application, processLifecycleOwner: LifecycleOwner = ProcessLifecycleOwner.get(), ) : AppStateManager { diff --git a/app/src/main/kotlin/com/x8bit/bitwarden/data/platform/manager/model/AppCreationState.kt b/data/src/main/kotlin/com/bitwarden/data/manager/appstate/model/AppCreationState.kt similarity index 88% rename from app/src/main/kotlin/com/x8bit/bitwarden/data/platform/manager/model/AppCreationState.kt rename to data/src/main/kotlin/com/bitwarden/data/manager/appstate/model/AppCreationState.kt index 3e105829a2..68a40aef64 100644 --- a/app/src/main/kotlin/com/x8bit/bitwarden/data/platform/manager/model/AppCreationState.kt +++ b/data/src/main/kotlin/com/bitwarden/data/manager/appstate/model/AppCreationState.kt @@ -1,4 +1,4 @@ -package com.x8bit.bitwarden.data.platform.manager.model +package com.bitwarden.data.manager.appstate.model /** * Represents the creation state of the app. diff --git a/app/src/main/kotlin/com/x8bit/bitwarden/data/platform/manager/model/AppForegroundState.kt b/data/src/main/kotlin/com/bitwarden/data/manager/appstate/model/AppForegroundState.kt similarity index 81% rename from app/src/main/kotlin/com/x8bit/bitwarden/data/platform/manager/model/AppForegroundState.kt rename to data/src/main/kotlin/com/bitwarden/data/manager/appstate/model/AppForegroundState.kt index 166f9dd3ab..302fdbff44 100644 --- a/app/src/main/kotlin/com/x8bit/bitwarden/data/platform/manager/model/AppForegroundState.kt +++ b/data/src/main/kotlin/com/bitwarden/data/manager/appstate/model/AppForegroundState.kt @@ -1,4 +1,4 @@ -package com.x8bit.bitwarden.data.platform.manager.model +package com.bitwarden.data.manager.appstate.model /** * Represents the foreground state of the app. diff --git a/data/src/main/kotlin/com/bitwarden/data/manager/di/DataManagerModule.kt b/data/src/main/kotlin/com/bitwarden/data/manager/di/DataManagerModule.kt index b70228247d..d7bf729e57 100644 --- a/data/src/main/kotlin/com/bitwarden/data/manager/di/DataManagerModule.kt +++ b/data/src/main/kotlin/com/bitwarden/data/manager/di/DataManagerModule.kt @@ -1,5 +1,6 @@ package com.bitwarden.data.manager.di +import android.app.Application import android.content.Context import com.bitwarden.core.data.manager.BuildInfoManager import com.bitwarden.core.data.manager.dispatcher.DispatcherManager @@ -8,6 +9,8 @@ import com.bitwarden.data.manager.BitwardenPackageManager import com.bitwarden.data.manager.BitwardenPackageManagerImpl import com.bitwarden.data.manager.NativeLibraryManager import com.bitwarden.data.manager.NativeLibraryManagerImpl +import com.bitwarden.data.manager.appstate.AppStateManager +import com.bitwarden.data.manager.appstate.AppStateManagerImpl import com.bitwarden.data.manager.file.FileManager import com.bitwarden.data.manager.file.FileManagerImpl import com.bitwarden.data.manager.flightrecorder.FlightRecorderManager @@ -30,6 +33,12 @@ import javax.inject.Singleton @InstallIn(SingletonComponent::class) object DataManagerModule { + @Provides + @Singleton + fun provideAppStateManager( + application: Application, + ): AppStateManager = AppStateManagerImpl(application = application) + @Provides @Singleton fun provideBitwardenPackageManager( diff --git a/app/src/test/kotlin/com/x8bit/bitwarden/data/platform/manager/AppStateManagerTest.kt b/data/src/test/kotlin/com/bitwarden/data/manager/appstate/AppStateManagerTest.kt similarity index 85% rename from app/src/test/kotlin/com/x8bit/bitwarden/data/platform/manager/AppStateManagerTest.kt rename to data/src/test/kotlin/com/bitwarden/data/manager/appstate/AppStateManagerTest.kt index 23fbbbf601..d463de093f 100644 --- a/app/src/test/kotlin/com/x8bit/bitwarden/data/platform/manager/AppStateManagerTest.kt +++ b/data/src/test/kotlin/com/bitwarden/data/manager/appstate/AppStateManagerTest.kt @@ -1,12 +1,12 @@ -package com.x8bit.bitwarden.data.platform.manager +package com.bitwarden.data.manager.appstate import android.app.Activity import android.app.Application import app.cash.turbine.test import com.bitwarden.core.data.util.FakeLifecycleOwner -import com.x8bit.bitwarden.data.autofill.util.createdForAutofill -import com.x8bit.bitwarden.data.platform.manager.model.AppCreationState -import com.x8bit.bitwarden.data.platform.manager.model.AppForegroundState +import com.bitwarden.data.autofill.util.createdForAutofill +import com.bitwarden.data.manager.appstate.model.AppCreationState +import com.bitwarden.data.manager.appstate.model.AppForegroundState import io.mockk.every import io.mockk.just import io.mockk.mockk @@ -15,7 +15,9 @@ import io.mockk.runs import io.mockk.slot import io.mockk.unmockkStatic import kotlinx.coroutines.test.runTest +import org.junit.jupiter.api.AfterEach import org.junit.jupiter.api.Assertions.assertEquals +import org.junit.jupiter.api.BeforeEach import org.junit.jupiter.api.Test class AppStateManagerTest { @@ -31,6 +33,16 @@ class AppStateManagerTest { processLifecycleOwner = fakeLifecycleOwner, ) + @BeforeEach + fun setup() { + mockkStatic(Activity::createdForAutofill) + } + + @AfterEach + fun tearDown() { + unmockkStatic(Activity::createdForAutofill) + } + @Suppress("MaxLineLength") @Test fun `appForegroundStateFlow should emit whenever the underlying ProcessLifecycleOwner receives start and stop events`() = @@ -62,7 +74,6 @@ class AppStateManagerTest { @Test fun `appCreatedStateFlow should emit whenever the underlying activities are all destroyed or a creation event occurs`() = runTest { - mockkStatic(Activity::createdForAutofill) val activity = mockk { every { isChangingConfigurations } returns false every { createdForAutofill } returns false @@ -83,6 +94,5 @@ class AppStateManagerTest { activityLifecycleCallbacks.captured.onActivityDestroyed(activity) assertEquals(AppCreationState.Destroyed, awaitItem()) } - unmockkStatic(Activity::createdForAutofill) } } diff --git a/app/src/test/kotlin/com/x8bit/bitwarden/data/platform/manager/util/FakeAppStateManager.kt b/data/src/testFixtures/kotlin/com/bitwarden/data/manager/appstate/FakeAppStateManager.kt similarity index 82% rename from app/src/test/kotlin/com/x8bit/bitwarden/data/platform/manager/util/FakeAppStateManager.kt rename to data/src/testFixtures/kotlin/com/bitwarden/data/manager/appstate/FakeAppStateManager.kt index 2d37d7630a..402efed15f 100644 --- a/app/src/test/kotlin/com/x8bit/bitwarden/data/platform/manager/util/FakeAppStateManager.kt +++ b/data/src/testFixtures/kotlin/com/bitwarden/data/manager/appstate/FakeAppStateManager.kt @@ -1,8 +1,7 @@ -package com.x8bit.bitwarden.data.platform.manager.util +package com.bitwarden.data.manager.appstate -import com.x8bit.bitwarden.data.platform.manager.AppStateManager -import com.x8bit.bitwarden.data.platform.manager.model.AppCreationState -import com.x8bit.bitwarden.data.platform.manager.model.AppForegroundState +import com.bitwarden.data.manager.appstate.model.AppCreationState +import com.bitwarden.data.manager.appstate.model.AppForegroundState import kotlinx.coroutines.flow.MutableStateFlow import kotlinx.coroutines.flow.StateFlow import kotlinx.coroutines.flow.asStateFlow