package com.peachpasswords import android.app.Application import androidx.lifecycle.DefaultLifecycleObserver import androidx.lifecycle.LifecycleOwner import androidx.lifecycle.ProcessLifecycleOwner import com.peachpasswords.sync.ForegroundSyncCoordinator import com.peachpasswords.vault.VaultLockTimer import com.peachpasswords.vault.VaultRepository import dagger.hilt.android.HiltAndroidApp import javax.inject.Inject @HiltAndroidApp class PeachApplication : Application() { @Inject lateinit var vault: VaultRepository @Inject lateinit var lockTimer: VaultLockTimer @Inject lateinit var foregroundSync: ForegroundSyncCoordinator override fun onCreate() { super.onCreate() // Lock the vault the moment the whole app goes to background (CF-1). // ProcessLifecycleOwner is process-wide and debounced, so a rotation or a // brief Activity restart does not trip it — only a genuine backgrounding. ProcessLifecycleOwner.get().lifecycle.addObserver(object : DefaultLifecycleObserver { override fun onStart(owner: LifecycleOwner) { foregroundSync.triggerForegroundSync() } override fun onStop(owner: LifecycleOwner) { // A SAF file picker/save dialog or share sheet also stops the // process's activities while it's in the foreground — that's // an expected, momentary handoff as part of an in-app export/ // import flow, not a real backgrounding, so it's exempted via // VaultRepository.expectTransientBackground(). if (vault.consumeTransientBackgroundSuppression()) return vault.lock() lockTimer.cancel() } }) } }