diff --git a/CHANGES.md b/CHANGES.md index 4f729ba0a8..897f8deebf 100644 --- a/CHANGES.md +++ b/CHANGES.md @@ -14,6 +14,7 @@ Improvements 🙌: Bugfix 🐛: - Account creation: wrongly hints that an email can be used to create an account (#941) - Fix crash in the room directory, when public room has no name (#1023) + - Fix restoring keys backup with passphrase (#526) Translations 🗣: - diff --git a/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/crypto/DefaultCryptoService.kt b/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/crypto/DefaultCryptoService.kt index b0acb031fc..c4d115b10c 100755 --- a/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/crypto/DefaultCryptoService.kt +++ b/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/crypto/DefaultCryptoService.kt @@ -887,7 +887,7 @@ internal class DefaultCryptoService @Inject constructor( throw Exception("Error") } - megolmSessionDataImporter.handle(importedSessions, true, uiHandler, progressListener) + megolmSessionDataImporter.handle(importedSessions, true, progressListener) } }.foldToCallback(callback) } diff --git a/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/crypto/actions/MegolmSessionDataImporter.kt b/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/crypto/actions/MegolmSessionDataImporter.kt index 62b4f1b851..ca6cfad0f9 100644 --- a/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/crypto/actions/MegolmSessionDataImporter.kt +++ b/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/crypto/actions/MegolmSessionDataImporter.kt @@ -16,7 +16,6 @@ package im.vector.matrix.android.internal.crypto.actions -import android.os.Handler import androidx.annotation.WorkerThread import im.vector.matrix.android.api.listeners.ProgressListener import im.vector.matrix.android.internal.crypto.MXOlmDevice @@ -46,7 +45,6 @@ internal class MegolmSessionDataImporter @Inject constructor(private val olmDevi @WorkerThread fun handle(megolmSessionsData: List, fromBackup: Boolean, - uiHandler: Handler, progressListener: ProgressListener?): ImportRoomKeysResult { val t0 = System.currentTimeMillis() @@ -54,11 +52,7 @@ internal class MegolmSessionDataImporter @Inject constructor(private val olmDevi var lastProgress = 0 var totalNumbersOfImportedKeys = 0 - if (progressListener != null) { - uiHandler.post { - progressListener.onProgress(0, 100) - } - } + progressListener?.onProgress(0, 100) val olmInboundGroupSessionWrappers = olmDevice.importInboundGroupSessions(megolmSessionsData) megolmSessionsData.forEachIndexed { cpt, megolmSessionData -> @@ -89,14 +83,12 @@ internal class MegolmSessionDataImporter @Inject constructor(private val olmDevi } if (progressListener != null) { - uiHandler.post { - val progress = 100 * cpt / totalNumbersOfKeys + val progress = 100 * cpt / totalNumbersOfKeys - if (lastProgress != progress) { - lastProgress = progress + if (lastProgress != progress) { + lastProgress = progress - progressListener.onProgress(progress, 100) - } + progressListener.onProgress(progress, 100) } } } diff --git a/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/crypto/keysbackup/DefaultKeysBackupService.kt b/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/crypto/keysbackup/DefaultKeysBackupService.kt index a630467d4c..aa291e8206 100644 --- a/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/crypto/keysbackup/DefaultKeysBackupService.kt +++ b/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/crypto/keysbackup/DefaultKeysBackupService.kt @@ -692,7 +692,7 @@ internal class DefaultKeysBackupService @Inject constructor( null } - val result = megolmSessionDataImporter.handle(sessionsData, !backUp, uiHandler, progressListener) + val result = megolmSessionDataImporter.handle(sessionsData, !backUp, progressListener) // Do not back up the key if it comes from a backup recovery if (backUp) { diff --git a/vector/src/main/java/im/vector/riotx/features/crypto/keysbackup/restore/KeysBackupRestoreActivity.kt b/vector/src/main/java/im/vector/riotx/features/crypto/keysbackup/restore/KeysBackupRestoreActivity.kt index a12a43d06f..e6d303b3aa 100644 --- a/vector/src/main/java/im/vector/riotx/features/crypto/keysbackup/restore/KeysBackupRestoreActivity.kt +++ b/vector/src/main/java/im/vector/riotx/features/crypto/keysbackup/restore/KeysBackupRestoreActivity.kt @@ -19,7 +19,6 @@ import android.app.Activity import android.content.Context import android.content.Intent import androidx.appcompat.app.AlertDialog -import androidx.fragment.app.FragmentManager import androidx.lifecycle.Observer import im.vector.riotx.R import im.vector.riotx.core.extensions.addFragmentToBackstack @@ -79,7 +78,6 @@ class KeysBackupRestoreActivity : SimpleFragmentActivity() { addFragmentToBackstack(R.id.container, KeysBackupRestoreFromKeyFragment::class.java) } KeysBackupRestoreSharedViewModel.NAVIGATE_TO_SUCCESS -> { - supportFragmentManager.popBackStack(null, FragmentManager.POP_BACK_STACK_INCLUSIVE) replaceFragment(R.id.container, KeysBackupRestoreSuccessFragment::class.java) } } diff --git a/vector/src/main/java/im/vector/riotx/features/crypto/keysbackup/restore/KeysBackupRestoreFromKeyViewModel.kt b/vector/src/main/java/im/vector/riotx/features/crypto/keysbackup/restore/KeysBackupRestoreFromKeyViewModel.kt index 7c95c3f3fe..0cf297f7f1 100644 --- a/vector/src/main/java/im/vector/riotx/features/crypto/keysbackup/restore/KeysBackupRestoreFromKeyViewModel.kt +++ b/vector/src/main/java/im/vector/riotx/features/crypto/keysbackup/restore/KeysBackupRestoreFromKeyViewModel.kt @@ -62,21 +62,21 @@ class KeysBackupRestoreFromKeyViewModel @Inject constructor() : ViewModel() { override fun onStepProgress(step: StepProgressListener.Step) { when (step) { is StepProgressListener.Step.DownloadingKey -> { - sharedViewModel.loadingEvent.value = WaitingViewData(context.getString(R.string.keys_backup_restoring_waiting_message) + sharedViewModel.loadingEvent.postValue(WaitingViewData(context.getString(R.string.keys_backup_restoring_waiting_message) + "\n" + context.getString(R.string.keys_backup_restoring_downloading_backup_waiting_message), - isIndeterminate = true) + isIndeterminate = true)) } - is StepProgressListener.Step.ImportingKey -> { + is StepProgressListener.Step.ImportingKey -> { // Progress 0 can take a while, display an indeterminate progress in this case if (step.progress == 0) { - sharedViewModel.loadingEvent.value = WaitingViewData(context.getString(R.string.keys_backup_restoring_waiting_message) + sharedViewModel.loadingEvent.postValue(WaitingViewData(context.getString(R.string.keys_backup_restoring_waiting_message) + "\n" + context.getString(R.string.keys_backup_restoring_importing_keys_waiting_message), - isIndeterminate = true) + isIndeterminate = true)) } else { - sharedViewModel.loadingEvent.value = WaitingViewData(context.getString(R.string.keys_backup_restoring_waiting_message) + sharedViewModel.loadingEvent.postValue(WaitingViewData(context.getString(R.string.keys_backup_restoring_waiting_message) + "\n" + context.getString(R.string.keys_backup_restoring_importing_keys_waiting_message), step.progress, - step.total) + step.total)) } } } diff --git a/vector/src/main/java/im/vector/riotx/features/crypto/keysbackup/restore/KeysBackupRestoreFromPassphraseViewModel.kt b/vector/src/main/java/im/vector/riotx/features/crypto/keysbackup/restore/KeysBackupRestoreFromPassphraseViewModel.kt index 92a3504b5c..c6ffd730ca 100644 --- a/vector/src/main/java/im/vector/riotx/features/crypto/keysbackup/restore/KeysBackupRestoreFromPassphraseViewModel.kt +++ b/vector/src/main/java/im/vector/riotx/features/crypto/keysbackup/restore/KeysBackupRestoreFromPassphraseViewModel.kt @@ -63,27 +63,28 @@ class KeysBackupRestoreFromPassphraseViewModel @Inject constructor() : ViewModel override fun onStepProgress(step: StepProgressListener.Step) { when (step) { is StepProgressListener.Step.ComputingKey -> { - sharedViewModel.loadingEvent.value = WaitingViewData(context.getString(R.string.keys_backup_restoring_waiting_message) + sharedViewModel.loadingEvent.postValue(WaitingViewData(context.getString(R.string.keys_backup_restoring_waiting_message) + "\n" + context.getString(R.string.keys_backup_restoring_computing_key_waiting_message), step.progress, - step.total) + step.total)) } is StepProgressListener.Step.DownloadingKey -> { - sharedViewModel.loadingEvent.value = WaitingViewData(context.getString(R.string.keys_backup_restoring_waiting_message) + sharedViewModel.loadingEvent.postValue(WaitingViewData(context.getString(R.string.keys_backup_restoring_waiting_message) + "\n" + context.getString(R.string.keys_backup_restoring_downloading_backup_waiting_message), - isIndeterminate = true) + isIndeterminate = true)) } is StepProgressListener.Step.ImportingKey -> { + Timber.d("backupKeys.ImportingKey.progress: " + step.progress) // Progress 0 can take a while, display an indeterminate progress in this case if (step.progress == 0) { - sharedViewModel.loadingEvent.value = WaitingViewData(context.getString(R.string.keys_backup_restoring_waiting_message) + sharedViewModel.loadingEvent.postValue(WaitingViewData(context.getString(R.string.keys_backup_restoring_waiting_message) + "\n" + context.getString(R.string.keys_backup_restoring_importing_keys_waiting_message), - isIndeterminate = true) + isIndeterminate = true)) } else { - sharedViewModel.loadingEvent.value = WaitingViewData(context.getString(R.string.keys_backup_restoring_waiting_message) + sharedViewModel.loadingEvent.postValue(WaitingViewData(context.getString(R.string.keys_backup_restoring_waiting_message) + "\n" + context.getString(R.string.keys_backup_restoring_importing_keys_waiting_message), step.progress, - step.total) + step.total)) } } } diff --git a/vector/src/main/java/im/vector/riotx/features/crypto/keysbackup/restore/KeysBackupRestoreSuccessFragment.kt b/vector/src/main/java/im/vector/riotx/features/crypto/keysbackup/restore/KeysBackupRestoreSuccessFragment.kt index 0f681af737..def8e4bf65 100644 --- a/vector/src/main/java/im/vector/riotx/features/crypto/keysbackup/restore/KeysBackupRestoreSuccessFragment.kt +++ b/vector/src/main/java/im/vector/riotx/features/crypto/keysbackup/restore/KeysBackupRestoreSuccessFragment.kt @@ -17,6 +17,7 @@ package im.vector.riotx.features.crypto.keysbackup.restore import android.os.Bundle import android.widget.TextView +import androidx.core.view.isVisible import butterknife.BindView import butterknife.OnClick import im.vector.riotx.R @@ -39,16 +40,20 @@ class KeysBackupRestoreSuccessFragment @Inject constructor() : VectorBaseFragmen super.onActivityCreated(savedInstanceState) sharedViewModel = activityViewModelProvider.get(KeysBackupRestoreSharedViewModel::class.java) - sharedViewModel.importKeyResult?.let { - val part1 = resources.getQuantityString(R.plurals.keys_backup_restore_success_description_part1, - it.totalNumberOfKeys, it.totalNumberOfKeys) - val part2 = resources.getQuantityString(R.plurals.keys_backup_restore_success_description_part2, - it.successfullyNumberOfImportedKeys, it.successfullyNumberOfImportedKeys) - mSuccessDetailsText.text = String.format("%s\n%s", part1, part2) + if (compareValues(sharedViewModel.importKeyResult?.totalNumberOfKeys, 0) > 0) { + sharedViewModel.importKeyResult?.let { + val part1 = resources.getQuantityString(R.plurals.keys_backup_restore_success_description_part1, + it.totalNumberOfKeys, it.totalNumberOfKeys) + val part2 = resources.getQuantityString(R.plurals.keys_backup_restore_success_description_part2, + it.successfullyNumberOfImportedKeys, it.successfullyNumberOfImportedKeys) + mSuccessDetailsText.text = String.format("%s\n%s", part1, part2) + } + // We don't put emoji in string xml as it will crash on old devices + mSuccessText.text = context?.getString(R.string.keys_backup_restore_success_title, "🎉") + } else { + mSuccessText.text = context?.getString(R.string.keys_backup_restore_success_title_already_up_to_date) + mSuccessDetailsText.isVisible = false } - - // We don't put emoji in string xml as it will crash on old devices - mSuccessText.text = context?.getString(R.string.keys_backup_restore_success_title, "🎉") } @OnClick(R.id.keys_backup_setup_done_button) diff --git a/vector/src/main/res/layout/fragment_keys_backup_restore_from_key.xml b/vector/src/main/res/layout/fragment_keys_backup_restore_from_key.xml index cf24ab6af1..3592ff074d 100644 --- a/vector/src/main/res/layout/fragment_keys_backup_restore_from_key.xml +++ b/vector/src/main/res/layout/fragment_keys_backup_restore_from_key.xml @@ -4,7 +4,8 @@ xmlns:tools="http://schemas.android.com/tools" android:id="@+id/keys_backup_root" android:layout_width="match_parent" - android:layout_height="match_parent"> + android:layout_height="match_parent" + android:background="?riotx_background"> + android:layout_height="match_parent" + android:background="?riotx_background"> + android:layout_height="match_parent" + android:background="?riotx_background"> Event deleted by user, reason: %1$s Event moderated by room admin, reason: %1$s + + Keys are already up to date!