Update registration for new restore flows.

This commit is contained in:
Cody Henthorne
2024-11-07 10:42:54 -05:00
committed by Greyson Parrelli
parent aad2624bd5
commit 22c4e2d084
140 changed files with 8364 additions and 2679 deletions

View File

@@ -13,6 +13,7 @@ import org.greenrobot.eventbus.EventBus
import org.signal.core.util.Base64
import org.signal.core.util.EventTimer
import org.signal.core.util.Stopwatch
import org.signal.core.util.bytes
import org.signal.core.util.concurrent.LimitedWorker
import org.signal.core.util.concurrent.SignalExecutors
import org.signal.core.util.forceForeignKeyConstraintsEnabled
@@ -644,7 +645,7 @@ object BackupRepository {
else -> Log.w(TAG, "Unrecognized frame")
}
EventBus.getDefault().post(RestoreV2Event(RestoreV2Event.Type.PROGRESS_RESTORE, frameReader.getBytesRead(), totalLength))
EventBus.getDefault().post(RestoreV2Event(RestoreV2Event.Type.PROGRESS_RESTORE, frameReader.getBytesRead().bytes, totalLength.bytes))
}
if (chatItemInserter.flush()) {
@@ -1176,7 +1177,7 @@ object BackupRepository {
return if (SignalStore.backup.backupsInitialized) {
getArchiveServiceAccessPair().runOnStatusCodeError(resetInitializedStateErrorAction)
} else if (isPreRestoreDuringRegistration()) {
Log.w(TAG, "Requesting/using auth credentials in pre-restore state")
Log.w(TAG, "Requesting/using auth credentials in pre-restore state", Throwable())
getArchiveServiceAccessPair()
} else {
val messageBackupKey = SignalStore.backup.messageBackupKey

View File

@@ -5,18 +5,19 @@
package org.thoughtcrime.securesms.backup.v2
class RestoreV2Event(val type: Type, val count: Long, val estimatedTotalCount: Long) {
import org.signal.core.util.ByteSize
class RestoreV2Event(val type: Type, val count: ByteSize, val estimatedTotalCount: ByteSize) {
enum class Type {
PROGRESS_DOWNLOAD,
PROGRESS_RESTORE,
PROGRESS_MEDIA_RESTORE,
FINISHED
}
fun getProgress(): Float {
if (estimatedTotalCount == 0L) {
if (estimatedTotalCount.inWholeBytes == 0L) {
return 0f
}
return count.toFloat() / estimatedTotalCount.toFloat()
return count.inWholeBytes.toFloat() / estimatedTotalCount.inWholeBytes.toFloat()
}
}

View File

@@ -1,98 +0,0 @@
/*
* Copyright 2024 Signal Messenger, LLC
* SPDX-License-Identifier: AGPL-3.0-only
*/
package org.thoughtcrime.securesms.backup.v2.ui.subscription
import androidx.compose.runtime.MutableState
import androidx.compose.runtime.State
import androidx.compose.runtime.mutableStateOf
import androidx.lifecycle.ViewModel
import io.reactivex.rxjava3.android.schedulers.AndroidSchedulers
import io.reactivex.rxjava3.core.Single
import io.reactivex.rxjava3.disposables.CompositeDisposable
import io.reactivex.rxjava3.kotlin.plusAssign
import io.reactivex.rxjava3.kotlin.subscribeBy
import io.reactivex.rxjava3.schedulers.Schedulers
import org.signal.libsignal.zkgroup.profiles.ProfileKey
import org.thoughtcrime.securesms.backup.v2.BackupRepository
import org.thoughtcrime.securesms.backup.v2.MessageBackupTier
import org.thoughtcrime.securesms.backup.v2.RestoreV2Event
import org.thoughtcrime.securesms.dependencies.AppDependencies
import org.thoughtcrime.securesms.jobs.BackupRestoreJob
import org.thoughtcrime.securesms.jobs.BackupRestoreMediaJob
import org.thoughtcrime.securesms.jobs.SyncArchivedMediaJob
import org.thoughtcrime.securesms.keyvalue.SignalStore
import org.thoughtcrime.securesms.recipients.Recipient
import org.thoughtcrime.securesms.registration.util.RegistrationUtil
import java.io.InputStream
import kotlin.time.Duration.Companion.seconds
class RemoteRestoreViewModel : ViewModel() {
val disposables = CompositeDisposable()
private val _state: MutableState<ScreenState> = mutableStateOf(
ScreenState(
backupTier = SignalStore.backup.backupTier,
backupTime = SignalStore.backup.lastBackupTime,
importState = ImportState.NONE,
restoreProgress = null
)
)
val state: State<ScreenState> = _state
fun import(length: Long, inputStreamFactory: () -> InputStream) {
_state.value = _state.value.copy(importState = ImportState.IN_PROGRESS)
val self = Recipient.self()
val selfData = BackupRepository.SelfData(self.aci.get(), self.pni.get(), self.e164.get(), ProfileKey(self.profileKey))
disposables += Single.fromCallable { BackupRepository.import(length, inputStreamFactory, selfData) }
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribeBy {
_state.value = _state.value.copy(importState = ImportState.NONE)
}
}
fun restore() {
_state.value = _state.value.copy(importState = ImportState.IN_PROGRESS)
disposables += Single.fromCallable {
AppDependencies
.jobManager
.startChain(BackupRestoreJob())
.then(SyncArchivedMediaJob())
.then(BackupRestoreMediaJob())
.enqueueAndBlockUntilCompletion(120.seconds.inWholeMilliseconds)
RegistrationUtil.maybeMarkRegistrationComplete()
}
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribeBy {
_state.value = _state.value.copy(importState = ImportState.RESTORED)
}
}
fun updateRestoreProgress(restoreEvent: RestoreV2Event) {
_state.value = _state.value.copy(restoreProgress = restoreEvent)
}
override fun onCleared() {
disposables.clear()
}
data class ScreenState(
val backupTier: MessageBackupTier?,
val backupTime: Long,
val importState: ImportState,
val restoreProgress: RestoreV2Event?
)
enum class ImportState(val inProgress: Boolean = false) {
NONE,
IN_PROGRESS(true),
RESTORED
}
}