diff --git a/app/src/main/java/org/thoughtcrime/securesms/loki/activities/SettingsActivity.kt b/app/src/main/java/org/thoughtcrime/securesms/loki/activities/SettingsActivity.kt
index af834f18de..48edde409e 100644
--- a/app/src/main/java/org/thoughtcrime/securesms/loki/activities/SettingsActivity.kt
+++ b/app/src/main/java/org/thoughtcrime/securesms/loki/activities/SettingsActivity.kt
@@ -31,10 +31,8 @@ import org.session.libsession.utilities.ProfilePictureUtilities
import org.session.libsession.utilities.SSKEnvironment.ProfileManagerProtocol
import org.session.libsession.utilities.TextSecurePreferences
import org.session.libsession.utilities.ProfileKeyUtil
-import org.thoughtcrime.securesms.ApplicationContext
import org.thoughtcrime.securesms.PassphraseRequiredActionBarActivity
import org.thoughtcrime.securesms.avatar.AvatarSelection
-import org.thoughtcrime.securesms.database.DatabaseFactory
import org.thoughtcrime.securesms.loki.dialogs.ChangeUiModeDialog
import org.thoughtcrime.securesms.loki.dialogs.ClearAllDataDialog
import org.thoughtcrime.securesms.loki.dialogs.SeedDialog
@@ -92,7 +90,6 @@ class SettingsActivity : PassphraseRequiredActionBarActivity() {
helpTranslateButton.setOnClickListener { helpTranslate() }
seedButton.setOnClickListener { showSeed() }
clearAllDataButton.setOnClickListener { clearAllData() }
- clearAllDataAndNetworkButton.setOnClickListener { clearAllDataIncludingNetwork() }
versionTextView.text = String.format(getString(R.string.version_s), "${BuildConfig.VERSION_NAME} (${BuildConfig.VERSION_CODE})")
}
@@ -303,11 +300,7 @@ class SettingsActivity : PassphraseRequiredActionBarActivity() {
}
private fun clearAllData() {
- ClearAllDataDialog(deleteNetworkMessages = false).show(supportFragmentManager, "Clear All Data Dialog")
- }
-
- private fun clearAllDataIncludingNetwork() {
- ClearAllDataDialog(deleteNetworkMessages = true).show(supportFragmentManager, "Clear All Data Dialog")
+ ClearAllDataDialog().show(supportFragmentManager, "Clear All Data Dialog")
}
// endregion
diff --git a/app/src/main/java/org/thoughtcrime/securesms/loki/dialogs/ClearAllDataDialog.kt b/app/src/main/java/org/thoughtcrime/securesms/loki/dialogs/ClearAllDataDialog.kt
index 12866caa4e..45f62c2b10 100644
--- a/app/src/main/java/org/thoughtcrime/securesms/loki/dialogs/ClearAllDataDialog.kt
+++ b/app/src/main/java/org/thoughtcrime/securesms/loki/dialogs/ClearAllDataDialog.kt
@@ -23,18 +23,44 @@ import org.thoughtcrime.securesms.ApplicationContext
import org.thoughtcrime.securesms.loki.protocol.MultiDeviceProtocol
import java.util.concurrent.Executors
-class ClearAllDataDialog(val deleteNetworkMessages: Boolean) : DialogFragment() {
+class ClearAllDataDialog : DialogFragment() {
+
+ enum class Steps {
+ INFO_PROMPT,
+ NETWORK_PROMPT,
+ DELETING
+ }
var clearJob: Job? = null
set(value) {
field = value
}
+ var step = Steps.INFO_PROMPT
+ set(value) {
+ field = value
+ updateUI()
+ }
+
override fun onCreateDialog(savedInstanceState: Bundle?): Dialog {
val builder = AlertDialog.Builder(requireContext())
val contentView = LayoutInflater.from(requireContext()).inflate(R.layout.dialog_clear_all_data, null)
- contentView.cancelButton.setOnClickListener { dismiss() }
- contentView.clearAllDataButton.setOnClickListener { clearAllData() }
+ contentView.cancelButton.setOnClickListener {
+ if (step == Steps.NETWORK_PROMPT) {
+ clearAllData(false)
+ } else {
+ dismiss()
+ }
+ }
+ contentView.clearAllDataButton.setOnClickListener {
+ when(step) {
+ Steps.INFO_PROMPT -> step = Steps.NETWORK_PROMPT
+ Steps.NETWORK_PROMPT -> {
+ clearAllData(true)
+ }
+ Steps.DELETING -> { /* do nothing intentionally */ }
+ }
+ }
builder.setView(contentView)
builder.setCancelable(false)
val result = builder.create()
@@ -42,71 +68,70 @@ class ClearAllDataDialog(val deleteNetworkMessages: Boolean) : DialogFragment()
return result
}
- override fun onDismiss(dialog: DialogInterface) {
- super.onDismiss(dialog)
- }
-
- override fun onStart() {
- super.onStart()
- isCancelable = false
- dialog?.setCanceledOnTouchOutside(false)
- }
+ private fun updateUI() {
- private fun updateUI(isLoading: Boolean) {
dialog?.let { view ->
+
+ val isLoading = step == Steps.DELETING
+
+ when (step) {
+ Steps.INFO_PROMPT -> {
+ view.dialogDescriptionText.setText(R.string.dialog_clear_all_data_explanation)
+ view.cancelButton.setText(R.string.cancel)
+ }
+ else -> {
+ view.dialogDescriptionText.setText(R.string.dialog_clear_all_data_network_explanation)
+ view.cancelButton.setText(R.string.dialog_clear_all_data_local_only)
+ }
+ }
+
view.cancelButton.isVisible = !isLoading
view.clearAllDataButton.isVisible = !isLoading
view.progressBar.isVisible = isLoading
+
+ view.setCanceledOnTouchOutside(!isLoading)
+ isCancelable = !isLoading
+
}
}
- private fun clearAllData() {
+ private fun clearAllData(deleteNetworkMessages: Boolean) {
if (KeyPairUtilities.hasV2KeyPair(requireContext())) {
clearJob = lifecycleScope.launch(Dispatchers.IO) {
+ val previousStep = step
withContext(Dispatchers.Main) {
- updateUI(true)
+ step = Steps.DELETING
}
if (!deleteNetworkMessages) {
try {
MultiDeviceProtocol.forceSyncConfigurationNowIfNeeded(requireContext()).get()
- ApplicationContext.getInstance(context).clearAllData(false)
- withContext(Dispatchers.Main) {
- dismiss()
- }
} catch (e: Exception) {
Log.e("Loki", "Failed to force sync", e)
- withContext(Dispatchers.Main) {
- updateUI(false)
- }
+ }
+ ApplicationContext.getInstance(context).clearAllData(false)
+ withContext(Dispatchers.Main) {
+ dismiss()
}
} else {
// finish
- val promises = try {
+ val result = try {
SnodeAPI.deleteAllMessages(requireContext()).get()
} catch (e: Exception) {
null
}
- val rawResponses = promises?.map {
- try {
- it.get()
- } catch (e: Exception) {
- null
+ if (result == null || result.values.any { !it } || result.isEmpty()) {
+ // didn't succeed (at least one)
+ withContext(Dispatchers.Main) {
+ step = previousStep
}
- } ?: listOf(null)
- // TODO: process the responses here
- if (rawResponses.all { it != null }) {
+ } else if (result.values.all { it }) {
// don't force sync because all the messages are deleted?
ApplicationContext.getInstance(context).clearAllData(false)
withContext(Dispatchers.Main) {
dismiss()
}
- } else if (rawResponses.any { it == null || it["failed"] as? Boolean == true }) {
- // didn't succeed (at least one)
- withContext(Dispatchers.Main) {
- updateUI(false)
- }
}
}
}
diff --git a/app/src/main/res/layout/activity_settings.xml b/app/src/main/res/layout/activity_settings.xml
index 5b655b9fe0..bafea51469 100644
--- a/app/src/main/res/layout/activity_settings.xml
+++ b/app/src/main/res/layout/activity_settings.xml
@@ -185,16 +185,6 @@
android:textStyle="bold"
android:gravity="center"
android:text="@string/activity_settings_clear_all_data_button_title" />
-