Add restore local backupv2 infra.

This commit is contained in:
Cody Henthorne
2024-09-03 16:49:33 -04:00
parent 00d20a1917
commit a8bf03af89
41 changed files with 615 additions and 324 deletions

View File

@@ -74,6 +74,7 @@ import org.thoughtcrime.securesms.components.settings.app.internal.backup.Intern
import org.thoughtcrime.securesms.components.settings.app.internal.backup.InternalBackupPlaygroundViewModel.BackupUploadState
import org.thoughtcrime.securesms.components.settings.app.internal.backup.InternalBackupPlaygroundViewModel.ScreenState
import org.thoughtcrime.securesms.compose.ComposeFragment
import org.thoughtcrime.securesms.jobs.LocalBackupJob
import org.thoughtcrime.securesms.keyvalue.SignalStore
class InternalBackupPlaygroundFragment : ComposeFragment() {
@@ -81,7 +82,6 @@ class InternalBackupPlaygroundFragment : ComposeFragment() {
private val viewModel: InternalBackupPlaygroundViewModel by viewModels()
private lateinit var exportFileLauncher: ActivityResultLauncher<Intent>
private lateinit var importFileLauncher: ActivityResultLauncher<Intent>
private lateinit var importDirectoryLauncher: ActivityResultLauncher<Intent>
private lateinit var validateFileLauncher: ActivityResultLauncher<Intent>
override fun onCreate(savedInstanceState: Bundle?) {
@@ -108,12 +108,6 @@ class InternalBackupPlaygroundFragment : ComposeFragment() {
}
}
importDirectoryLauncher = registerForActivityResult(ActivityResultContracts.StartActivityForResult()) { result ->
if (result.resultCode == RESULT_OK) {
viewModel.import(result.data!!.data!!)
}
}
validateFileLauncher = registerForActivityResult(ActivityResultContracts.StartActivityForResult()) { result ->
if (result.resultCode == RESULT_OK) {
result.data?.data?.let { uri ->
@@ -141,6 +135,7 @@ class InternalBackupPlaygroundFragment : ComposeFragment() {
Screen(
state = state,
onExportClicked = { viewModel.export() },
onExportDirectoryClicked = { LocalBackupJob.enqueueArchive() },
onImportMemoryClicked = { viewModel.import() },
onImportFileClicked = {
val intent = Intent().apply {
@@ -152,8 +147,7 @@ class InternalBackupPlaygroundFragment : ComposeFragment() {
importFileLauncher.launch(intent)
},
onImportDirectoryClicked = {
val intent = Intent(Intent.ACTION_OPEN_DOCUMENT_TREE)
importDirectoryLauncher.launch(intent)
viewModel.import(SignalStore.settings.signalBackupDirectory!!)
},
onPlaintextClicked = { viewModel.onPlaintextToggled() },
onSaveToDiskClicked = {
@@ -260,6 +254,7 @@ fun Tabs(
fun Screen(
state: ScreenState,
onExportClicked: () -> Unit = {},
onExportDirectoryClicked: () -> Unit = {},
onImportMemoryClicked: () -> Unit = {},
onImportFileClicked: () -> Unit = {},
onImportDirectoryClicked: () -> Unit = {},
@@ -302,6 +297,13 @@ fun Screen(
Text("Export")
}
Buttons.LargePrimary(
onClick = onExportDirectoryClicked,
enabled = !state.backupState.inProgress && state.canReadWriteBackupDirectory
) {
Text("Export to backup directory")
}
Buttons.LargePrimary(
onClick = onTriggerBackupJobClicked,
enabled = !state.backupState.inProgress
@@ -323,9 +325,10 @@ fun Screen(
Text("Import from file")
}
Buttons.LargeTonal(
onClick = onImportDirectoryClicked
onClick = onImportDirectoryClicked,
enabled = state.canReadWriteBackupDirectory
) {
Text("Import from directory")
Text("Import from backup directory")
}
Buttons.LargeTonal(

View File

@@ -9,6 +9,7 @@ import android.net.Uri
import androidx.compose.runtime.MutableState
import androidx.compose.runtime.State
import androidx.compose.runtime.mutableStateOf
import androidx.documentfile.provider.DocumentFile
import androidx.lifecycle.ViewModel
import io.reactivex.rxjava3.android.schedulers.AndroidSchedulers
import io.reactivex.rxjava3.core.Completable
@@ -36,6 +37,7 @@ import org.thoughtcrime.securesms.jobs.AttachmentUploadJob
import org.thoughtcrime.securesms.jobs.BackupMessagesJob
import org.thoughtcrime.securesms.jobs.BackupRestoreJob
import org.thoughtcrime.securesms.jobs.BackupRestoreMediaJob
import org.thoughtcrime.securesms.jobs.RestoreLocalAttachmentJob
import org.thoughtcrime.securesms.jobs.SyncArchivedMediaJob
import org.thoughtcrime.securesms.keyvalue.SignalStore
import org.thoughtcrime.securesms.mms.IncomingMessage
@@ -53,7 +55,17 @@ class InternalBackupPlaygroundViewModel : ViewModel() {
val disposables = CompositeDisposable()
private val _state: MutableState<ScreenState> = mutableStateOf(ScreenState(backupState = BackupState.NONE, uploadState = BackupUploadState.NONE, plaintext = false))
private val _state: MutableState<ScreenState> = mutableStateOf(
ScreenState(
backupState = BackupState.NONE,
uploadState = BackupUploadState.NONE,
plaintext = false,
canReadWriteBackupDirectory = SignalStore.settings.signalBackupDirectory?.let {
val file = DocumentFile.fromTreeUri(AppDependencies.application, it)
file != null && file.canWrite() && file.canRead()
} ?: false
)
)
val state: State<ScreenState> = _state
private val _mediaState: MutableState<MediaState> = mutableStateOf(MediaState())
@@ -129,6 +141,9 @@ class InternalBackupPlaygroundViewModel : ViewModel() {
val snapshotFileSystem = SnapshotFileSystem(AppDependencies.application, snapshotInfo.file)
LocalArchiver.import(snapshotFileSystem, selfData)
val mediaNameToFileInfo = archiveFileSystem.filesFileSystem.allFiles()
RestoreLocalAttachmentJob.enqueueRestoreLocalAttachmentsJobs(mediaNameToFileInfo)
}
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
@@ -382,7 +397,8 @@ class InternalBackupPlaygroundViewModel : ViewModel() {
val backupState: BackupState = BackupState.NONE,
val uploadState: BackupUploadState = BackupUploadState.NONE,
val remoteBackupState: RemoteBackupState = RemoteBackupState.Unknown,
val plaintext: Boolean
val plaintext: Boolean,
val canReadWriteBackupDirectory: Boolean = false
)
enum class BackupState(val inProgress: Boolean = false) {

View File

@@ -89,7 +89,7 @@ public class VoiceNotePlaybackService extends MediaSessionService {
setMediaNotificationProvider(new VoiceNoteMediaNotificationProvider(this));
setListener(new MediaSessionServiceListener());
AppDependencies.getDatabaseObserver().registerAttachmentObserver(attachmentDeletionObserver);
AppDependencies.getDatabaseObserver().registerAttachmentDeletedObserver(attachmentDeletionObserver);
}
@Override