1package com.peachpasswords23import android.app.Application4import androidx.hilt.work.HiltWorkerFactory5import androidx.lifecycle.DefaultLifecycleObserver6import androidx.lifecycle.LifecycleOwner7import androidx.lifecycle.ProcessLifecycleOwner8import androidx.work.Configuration9import com.peachpasswords.sync.BackgroundSyncPreference10import com.peachpasswords.sync.ForegroundSyncCoordinator11import com.peachpasswords.sync.LockedSyncSpoolHooks12import com.peachpasswords.sync.LockedSyncSpoolStore13import com.peachpasswords.sync.PeachSyncService14import com.peachpasswords.shared.PeachClipboard15import com.peachpasswords.ui.lock.BiometricKeyStore16import com.peachpasswords.updates.UpdateCheckWorker17import com.peachpasswords.vault.PinUnlockStore18import com.peachpasswords.vault.VaultKeyRotationHooks19import com.peachpasswords.vault.VaultLockTimer20import com.peachpasswords.vault.VaultMutationHooks21import com.peachpasswords.vault.VaultRepository22import dagger.hilt.android.HiltAndroidApp23import javax.inject.Inject2425@HiltAndroidApp26class PeachApplication : Application(), Configuration.Provider {27 @Inject lateinit var vault: VaultRepository28 @Inject lateinit var lockTimer: VaultLockTimer29 @Inject lateinit var foregroundSync: ForegroundSyncCoordinator30 @Inject lateinit var backgroundSync: BackgroundSyncPreference31 @Inject lateinit var lockedSyncSpool: LockedSyncSpoolStore32 @Inject lateinit var pinUnlock: PinUnlockStore33 @Inject lateinit var workerFactory: HiltWorkerFactory3435 3637383940414243 var stopWasConfigurationChange = false4445 override val workManagerConfiguration: Configuration46 get() = Configuration.Builder().setWorkerFactory(workerFactory).build()4748 override fun onCreate() {49 super.onCreate()50 LockedSyncSpoolHooks.refresh = lockedSyncSpool::refresh51 52 53 54 55 VaultKeyRotationHooks.onRotated = {56 pinUnlock.clear()57 BiometricKeyStore.clear(this)58 }59 VaultMutationHooks.onCommitted = {60 if (backgroundSync.enabled.value && vault.syncVaultId() != null) {61 PeachSyncService.start(this)62 }63 }6465 66 67 68 UpdateCheckWorker.schedulePeriodic(this)69 UpdateCheckWorker.checkNow(this)70 71 72 73 ProcessLifecycleOwner.get().lifecycle.addObserver(object : DefaultLifecycleObserver {74 override fun onStart(owner: LifecycleOwner) {75 foregroundSync.triggerForegroundSync()76 }7778 override fun onStop(owner: LifecycleOwner) {79 80 81 82 83 84 if (vault.consumeTransientBackgroundSuppression()) return85 if (stopWasConfigurationChange) {86 stopWasConfigurationChange = false87 return88 }89 if (backgroundSync.enabled.value && vault.isUnlocked.value) {90 91 92 93 runCatching { lockedSyncSpool.refresh(vault) }94 vault.lock()95 } else {96 vault.lock()97 lockTimer.cancel()98 }99 100 101 102 103 PeachClipboard.clearNow(this@PeachApplication)104 }105 })106 }107}