PeachApplication.kt

2.4 KB · raw

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.ForegroundSyncCoordinator10import com.peachpasswords.updates.UpdateCheckWorker11import com.peachpasswords.vault.VaultLockTimer12import com.peachpasswords.vault.VaultRepository13import dagger.hilt.android.HiltAndroidApp14import javax.inject.Inject1516@HiltAndroidApp17class PeachApplication : Application(), Configuration.Provider {18    @Inject lateinit var vault: VaultRepository19    @Inject lateinit var lockTimer: VaultLockTimer20    @Inject lateinit var foregroundSync: ForegroundSyncCoordinator21    @Inject lateinit var workerFactory: HiltWorkerFactory2223    override val workManagerConfiguration: Configuration24        get() = Configuration.Builder().setWorkerFactory(workerFactory).build()2526    override fun onCreate() {27        super.onCreate()2829        // Update checks: once a day in the background, plus one now — process30        // start is the honest "app open". Neither ever downloads or installs;31        // the most they do is post a notification.32        UpdateCheckWorker.schedulePeriodic(this)33        UpdateCheckWorker.checkNow(this)34        // Lock the vault the moment the whole app goes to background (CF-1).35        // ProcessLifecycleOwner is process-wide and debounced, so a rotation or a36        // brief Activity restart does not trip it — only a genuine backgrounding.37        ProcessLifecycleOwner.get().lifecycle.addObserver(object : DefaultLifecycleObserver {38            override fun onStart(owner: LifecycleOwner) {39                foregroundSync.triggerForegroundSync()40            }4142            override fun onStop(owner: LifecycleOwner) {43                // A SAF file picker/save dialog or share sheet also stops the44                // process's activities while it's in the foreground — that's45                // an expected, momentary handoff as part of an in-app export/46                // import flow, not a real backgrounding, so it's exempted via47                // VaultRepository.expectTransientBackground().48                if (vault.consumeTransientBackgroundSuppression()) return49                vault.lock()50                lockTimer.cancel()51            }52        })53    }54}