Add data loss confirmation dialog

This commit is contained in:
Davide Depau 2018-09-01 19:20:20 +02:00
parent 90958e0d80
commit 8f229e49f8
4 changed files with 62 additions and 16 deletions

View file

@ -1,9 +1,8 @@
package eu.depau.etchdroid.activities package eu.depau.etchdroid.activities
import android.os.Bundle
import android.app.Activity
import android.content.Intent import android.content.Intent
import android.os.Build import android.os.Build
import android.os.Bundle
import android.view.View import android.view.View
import android.widget.Toast import android.widget.Toast
import androidx.recyclerview.widget.LinearLayoutManager import androidx.recyclerview.widget.LinearLayoutManager
@ -15,13 +14,43 @@ import eu.depau.etchdroid.img_types.DMGImage
import eu.depau.etchdroid.kotlin_exts.* import eu.depau.etchdroid.kotlin_exts.*
import eu.depau.etchdroid.services.UsbApiDmgWriteService import eu.depau.etchdroid.services.UsbApiDmgWriteService
import eu.depau.etchdroid.services.UsbApiImgWriteService import eu.depau.etchdroid.services.UsbApiImgWriteService
import eu.depau.etchdroid.utils.DoNotShowAgainDialogFragment
import kotlinx.android.synthetic.main.activity_confirmation.* import kotlinx.android.synthetic.main.activity_confirmation.*
import java.io.IOException import java.io.IOException
class ConfirmationActivity : ActivityBase() { class ConfirmationActivity : ActivityBase() {
var canContinue: Boolean = false var canContinue: Boolean = false
var issuesFound: Boolean = false var issuesFound: String? = null
val DISMISSED_DIALOGS_PREFS = "dismissed_dialogs"
var shouldShowDataLossAlertDialog: Boolean
get() {
val settings = getSharedPreferences(DISMISSED_DIALOGS_PREFS, 0)
return !settings.getBoolean("data_loss_alert", false)
}
set(value) {
val settings = getSharedPreferences(DISMISSED_DIALOGS_PREFS, 0)
val editor = settings.edit()
editor.putBoolean("data_loss_alert", !value)
editor.apply()
}
fun showDataLossAlertDialog() {
val dialogFragment = DoNotShowAgainDialogFragment()
dialogFragment.title = getString(R.string.warning)
dialogFragment.message = getString(R.string.dataloss_confirmation_dialog_message)
dialogFragment.positiveButton = getString(R.string.confirm_flash_image)
dialogFragment.negativeButton = getString(R.string.cancel)
dialogFragment.listener = object : DoNotShowAgainDialogFragment.DialogListener {
override fun onDialogNegative(dialog: DoNotShowAgainDialogFragment, showAgain: Boolean) {}
override fun onDialogPositive(dialog: DoNotShowAgainDialogFragment, showAgain: Boolean) {
shouldShowDataLossAlertDialog = showAgain
nextStep(false)
}
}
dialogFragment.show(supportFragmentManager, "DataLossAlertDialogFragment")
}
override fun onCreate(savedInstanceState: Bundle?) { override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState) super.onCreate(savedInstanceState)
@ -102,13 +131,13 @@ class ConfirmationActivity : ActivityBase() {
val imgRepr = StateKeeper.imageRepr as DMGImage val imgRepr = StateKeeper.imageRepr as DMGImage
if (imgRepr.tableType == null && (imgRepr.partitionTable == null || imgRepr.partitionTable?.size == 0)) { if (imgRepr.tableType == null && (imgRepr.partitionTable == null || imgRepr.partitionTable?.size == 0)) {
part_table_header.text = getString(R.string.image_is_not_dmg) issuesFound = getString(R.string.image_is_not_dmg)
issuesFound = true part_table_header.text = issuesFound
return return
} else { } else {
part_table_header.text = if (imgRepr.tableType != null) getString(R.string.partition_table_title) else "" part_table_header.text = if (imgRepr.tableType != null) getString(R.string.partition_table_title) else ""
part_table_header_side.text = imgRepr.tableType?.getString(this) ?: "" part_table_header_side.text = imgRepr.tableType?.getString(this) ?: ""
issuesFound = false issuesFound = null
val viewAdapter = PartitionTableRecyclerViewAdapter(imgRepr.partitionTable!!) val viewAdapter = PartitionTableRecyclerViewAdapter(imgRepr.partitionTable!!)
part_table_recycler.apply { part_table_recycler.apply {
@ -120,9 +149,14 @@ class ConfirmationActivity : ActivityBase() {
} }
} }
fun nextStep() { fun nextStep(showDialog: Boolean = true) {
if (!canContinue) { if (!canContinue || issuesFound != null) {
confirm_fab.snackbar(getString(R.string.cannot_write)) confirm_fab.snackbar(issuesFound ?: getString(R.string.cannot_write))
return
}
if (showDialog && shouldShowDataLossAlertDialog) {
showDataLossAlertDialog()
return return
} }

View file

@ -65,9 +65,10 @@ class StartActivity : ActivityBase() {
val dialogFragment = DoNotShowAgainDialogFragment() val dialogFragment = DoNotShowAgainDialogFragment()
dialogFragment.title = getString(R.string.here_be_dragons) dialogFragment.title = getString(R.string.here_be_dragons)
dialogFragment.message = getString(R.string.dmg_alert_dialog_text) dialogFragment.message = getString(R.string.dmg_alert_dialog_text)
dialogFragment.closeButton = getString(R.string.i_understand) dialogFragment.positiveButton = getString(R.string.i_understand)
dialogFragment.listener = object : DoNotShowAgainDialogFragment.DialogListener { dialogFragment.listener = object : DoNotShowAgainDialogFragment.DialogListener {
override fun onDialogClose(dialog: DoNotShowAgainDialogFragment, showAgain: Boolean) { override fun onDialogNegative(dialog: DoNotShowAgainDialogFragment, showAgain: Boolean) {}
override fun onDialogPositive(dialog: DoNotShowAgainDialogFragment, showAgain: Boolean) {
shouldShowDMGAlertDialog = showAgain shouldShowDMGAlertDialog = showAgain
showFilePicker() showFilePicker()
} }

View file

@ -11,12 +11,14 @@ import kotlinx.android.synthetic.main.do_not_show_again.view.*
class DoNotShowAgainDialogFragment() : DialogFragment() { class DoNotShowAgainDialogFragment() : DialogFragment() {
var title: String? = null var title: String? = null
var closeButton: String? = null var positiveButton: String? = null
var negativeButton: String? = null
var message: String? = null var message: String? = null
var listener: DialogListener? = null var listener: DialogListener? = null
interface DialogListener { interface DialogListener {
fun onDialogClose(dialog: DoNotShowAgainDialogFragment, showAgain: Boolean) fun onDialogPositive(dialog: DoNotShowAgainDialogFragment, showAgain: Boolean)
fun onDialogNegative(dialog: DoNotShowAgainDialogFragment, showAgain: Boolean)
} }
override fun onCreateDialog(savedInstanceState: Bundle?): Dialog { override fun onCreateDialog(savedInstanceState: Bundle?): Dialog {
@ -30,8 +32,13 @@ class DoNotShowAgainDialogFragment() : DialogFragment() {
.setTitle(title) .setTitle(title)
.setMessage(message) .setMessage(message)
.setView(dnsaLayout) .setView(dnsaLayout)
.setPositiveButton(closeButton) { _, _ -> .setPositiveButton(positiveButton) { _, _ ->
listener?.onDialogClose(this@DoNotShowAgainDialogFragment, !doNotShowAgainCB.isChecked) listener?.onDialogPositive(this@DoNotShowAgainDialogFragment, !doNotShowAgainCB.isChecked)
}
if (negativeButton != null)
builder.setNegativeButton(negativeButton) {_, _ ->
listener?.onDialogNegative(this@DoNotShowAgainDialogFragment, !doNotShowAgainCB.isChecked)
} }
return builder.create() return builder.create()

View file

@ -95,4 +95,8 @@
<string name="here_be_dragons">Here be dragons</string> <string name="here_be_dragons">Here be dragons</string>
<string name="i_understand">I understand, continue</string> <string name="i_understand">I understand, continue</string>
<string name="dmg_alert_dialog_text">While in most cases DMG images can be restored just fine, sometimes there may be inconsistencies. You\'ve been warned.</string> <string name="dmg_alert_dialog_text">While in most cases DMG images can be restored just fine, sometimes there may be inconsistencies. You\'ve been warned.</string>
<string name="confirm_flash_image">Flash image</string>
<string name="dataloss_confirmation_dialog_message">If you continue, selected image will be written and all data stored on the USB drive will be lost forever.</string>
<string name="warning">Warning</string>
<string name="cancel">Cancel</string>
</resources> </resources>