diff --git a/app/src/main/java/eu/depau/etchdroid/activities/ConfirmationActivity.kt b/app/src/main/java/eu/depau/etchdroid/activities/ConfirmationActivity.kt index c22955d..4692d81 100644 --- a/app/src/main/java/eu/depau/etchdroid/activities/ConfirmationActivity.kt +++ b/app/src/main/java/eu/depau/etchdroid/activities/ConfirmationActivity.kt @@ -1,9 +1,8 @@ package eu.depau.etchdroid.activities -import android.os.Bundle -import android.app.Activity import android.content.Intent import android.os.Build +import android.os.Bundle import android.view.View import android.widget.Toast 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.services.UsbApiDmgWriteService import eu.depau.etchdroid.services.UsbApiImgWriteService - +import eu.depau.etchdroid.utils.DoNotShowAgainDialogFragment import kotlinx.android.synthetic.main.activity_confirmation.* import java.io.IOException class ConfirmationActivity : ActivityBase() { 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?) { super.onCreate(savedInstanceState) @@ -102,13 +131,13 @@ class ConfirmationActivity : ActivityBase() { val imgRepr = StateKeeper.imageRepr as DMGImage if (imgRepr.tableType == null && (imgRepr.partitionTable == null || imgRepr.partitionTable?.size == 0)) { - part_table_header.text = getString(R.string.image_is_not_dmg) - issuesFound = true + issuesFound = getString(R.string.image_is_not_dmg) + part_table_header.text = issuesFound return } 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) ?: "" - issuesFound = false + issuesFound = null val viewAdapter = PartitionTableRecyclerViewAdapter(imgRepr.partitionTable!!) part_table_recycler.apply { @@ -120,9 +149,14 @@ class ConfirmationActivity : ActivityBase() { } } - fun nextStep() { - if (!canContinue) { - confirm_fab.snackbar(getString(R.string.cannot_write)) + fun nextStep(showDialog: Boolean = true) { + if (!canContinue || issuesFound != null) { + confirm_fab.snackbar(issuesFound ?: getString(R.string.cannot_write)) + return + } + + if (showDialog && shouldShowDataLossAlertDialog) { + showDataLossAlertDialog() return } diff --git a/app/src/main/java/eu/depau/etchdroid/activities/StartActivity.kt b/app/src/main/java/eu/depau/etchdroid/activities/StartActivity.kt index 9423dde..307dd05 100644 --- a/app/src/main/java/eu/depau/etchdroid/activities/StartActivity.kt +++ b/app/src/main/java/eu/depau/etchdroid/activities/StartActivity.kt @@ -65,9 +65,10 @@ class StartActivity : ActivityBase() { val dialogFragment = DoNotShowAgainDialogFragment() dialogFragment.title = getString(R.string.here_be_dragons) 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 { - override fun onDialogClose(dialog: DoNotShowAgainDialogFragment, showAgain: Boolean) { + override fun onDialogNegative(dialog: DoNotShowAgainDialogFragment, showAgain: Boolean) {} + override fun onDialogPositive(dialog: DoNotShowAgainDialogFragment, showAgain: Boolean) { shouldShowDMGAlertDialog = showAgain showFilePicker() } diff --git a/app/src/main/java/eu/depau/etchdroid/utils/DoNotShowAgainDialogFragment.kt b/app/src/main/java/eu/depau/etchdroid/utils/DoNotShowAgainDialogFragment.kt index 4b6c6a0..75da5d7 100644 --- a/app/src/main/java/eu/depau/etchdroid/utils/DoNotShowAgainDialogFragment.kt +++ b/app/src/main/java/eu/depau/etchdroid/utils/DoNotShowAgainDialogFragment.kt @@ -11,12 +11,14 @@ import kotlinx.android.synthetic.main.do_not_show_again.view.* class DoNotShowAgainDialogFragment() : DialogFragment() { var title: String? = null - var closeButton: String? = null + var positiveButton: String? = null + var negativeButton: String? = null var message: String? = null var listener: DialogListener? = null 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 { @@ -30,10 +32,15 @@ class DoNotShowAgainDialogFragment() : DialogFragment() { .setTitle(title) .setMessage(message) .setView(dnsaLayout) - .setPositiveButton(closeButton) { _, _ -> - listener?.onDialogClose(this@DoNotShowAgainDialogFragment, !doNotShowAgainCB.isChecked) + .setPositiveButton(positiveButton) { _, _ -> + listener?.onDialogPositive(this@DoNotShowAgainDialogFragment, !doNotShowAgainCB.isChecked) } + if (negativeButton != null) + builder.setNegativeButton(negativeButton) {_, _ -> + listener?.onDialogNegative(this@DoNotShowAgainDialogFragment, !doNotShowAgainCB.isChecked) + } + return builder.create() } diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 47eee53..74a92b7 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -95,4 +95,8 @@ Here be dragons I understand, continue While in most cases DMG images can be restored just fine, sometimes there may be inconsistencies. You\'ve been warned. + Flash image + If you continue, selected image will be written and all data stored on the USB drive will be lost forever. + Warning + Cancel