DatabaseDowngradeHelperImpl.kt 1.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748
  1. package ch.threema.storage
  2. import android.content.Context
  3. import android.content.SharedPreferences
  4. import androidx.core.content.edit
  5. import ch.threema.android.showToast
  6. import kotlin.system.exitProcess
  7. import kotlin.time.Duration.Companion.seconds
  8. class DatabaseDowngradeHelperImpl(
  9. private val appContext: Context,
  10. private val sharedPreferences: SharedPreferences,
  11. ) : DatabaseDowngradeHelper {
  12. fun forceEnableDowngrade() {
  13. isDatabaseDowngradeEnabled = true
  14. appContext.showToast("Force-downgrade enabled. Re-open the app.")
  15. exitProcess(0)
  16. }
  17. private var isDatabaseDowngradeEnabled: Boolean
  18. get() {
  19. val forceDowngradeEnabledAt = sharedPreferences.getLong(FORCE_DOWNGRADE_KEY, 0)
  20. return forceDowngradeEnabledAt > System.currentTimeMillis() - DOWNGRADE_TIMEOUT.inWholeMilliseconds
  21. }
  22. set(value) {
  23. sharedPreferences.edit(commit = true) {
  24. if (value) {
  25. putLong(FORCE_DOWNGRADE_KEY, System.currentTimeMillis())
  26. } else {
  27. remove(FORCE_DOWNGRADE_KEY)
  28. }
  29. }
  30. }
  31. @Throws(DatabaseDowngradeException::class)
  32. override fun onDowngrade(oldVersion: Int) {
  33. if (isDatabaseDowngradeEnabled) {
  34. isDatabaseDowngradeEnabled = false
  35. } else {
  36. throw DatabaseDowngradeException(oldVersion)
  37. }
  38. }
  39. companion object {
  40. private val DOWNGRADE_TIMEOUT = 30.seconds
  41. private const val FORCE_DOWNGRADE_KEY = "_dev_force_db_downgrade"
  42. }
  43. }