mirror of
https://github.com/signalapp/Signal-Android.git
synced 2026-04-22 01:40:07 +01:00
Add restore local backupv2 infra.
This commit is contained in:
@@ -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(
|
||||
|
||||
@@ -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) {
|
||||
|
||||
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user