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 e9dd21b..9423dde 100644 --- a/app/src/main/java/eu/depau/etchdroid/activities/StartActivity.kt +++ b/app/src/main/java/eu/depau/etchdroid/activities/StartActivity.kt @@ -15,14 +15,29 @@ import eu.depau.etchdroid.R import eu.depau.etchdroid.StateKeeper import eu.depau.etchdroid.enums.FlashMethod import eu.depau.etchdroid.kotlin_exts.snackbar +import eu.depau.etchdroid.utils.DoNotShowAgainDialogFragment import kotlinx.android.synthetic.main.activity_start.* import java.io.File + class StartActivity : ActivityBase() { val TAG = "StartActivity" val READ_REQUEST_CODE = 42 val READ_EXTERNAL_STORAGE_PERMISSION = 29 - var delayedButtonClicked: View? = null + val DISMISSED_DIALOGS_PREFS = "dismissed_dialogs" + var delayedButtonClicked: Boolean = false + + var shouldShowDMGAlertDialog: Boolean + get() { + val settings = getSharedPreferences(DISMISSED_DIALOGS_PREFS, 0) + return !settings.getBoolean("DMG_beta_alert", false) + } + set(value) { + val settings = getSharedPreferences(DISMISSED_DIALOGS_PREFS, 0) + val editor = settings.edit() + editor.putBoolean("DMG_beta_alert", !value) + editor.apply() + } override fun onCreate(savedInstanceState: Bundle?) { @@ -30,13 +45,37 @@ class StartActivity : ActivityBase() { setContentView(R.layout.activity_start) } - fun onButtonClicked(view: View) { - StateKeeper.flashMethod = when (view.id) { - R.id.btn_image_raw -> FlashMethod.FLASH_API - R.id.btn_image_dmg -> FlashMethod.FLASH_DMG_API - else -> null - } + fun onButtonClicked(view: View) = onButtonClicked(view, true) + private fun onButtonClicked(view: View?, showDialog: Boolean = true) { + if (view != null) + StateKeeper.flashMethod = when (view.id) { + R.id.btn_image_raw -> FlashMethod.FLASH_API + R.id.btn_image_dmg -> FlashMethod.FLASH_DMG_API + else -> null + } + + if (StateKeeper.flashMethod != FlashMethod.FLASH_DMG_API || !shouldShowDMGAlertDialog || !showDialog) + showFilePicker() + else + showDMGBetaAlertDialog() + } + + fun showDMGBetaAlertDialog() { + 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.listener = object : DoNotShowAgainDialogFragment.DialogListener { + override fun onDialogClose(dialog: DoNotShowAgainDialogFragment, showAgain: Boolean) { + shouldShowDMGAlertDialog = showAgain + showFilePicker() + } + } + dialogFragment.show(supportFragmentManager, "DMGBetaAlertDialogFragment") + } + + fun showFilePicker() { when (StateKeeper.flashMethod) { FlashMethod.FLASH_API -> { val intent = Intent(Intent.ACTION_OPEN_DOCUMENT) @@ -62,7 +101,7 @@ class StartActivity : ActivityBase() { nextStep() } } else { - delayedButtonClicked = view + delayedButtonClicked = true } } FlashMethod.FLASH_UNETBOOTIN -> { @@ -95,8 +134,8 @@ class StartActivity : ActivityBase() { override fun onRequestPermissionsResult(requestCode: Int, permissions: Array, grantResults: IntArray) { when (requestCode) { READ_EXTERNAL_STORAGE_PERMISSION -> { - if (delayedButtonClicked != null) - onButtonClicked(delayedButtonClicked!!) + if (delayedButtonClicked) + onButtonClicked(null, showDialog = false) return } else -> { diff --git a/app/src/main/java/eu/depau/etchdroid/utils/DoNotShowAgainDialogFragment.kt b/app/src/main/java/eu/depau/etchdroid/utils/DoNotShowAgainDialogFragment.kt new file mode 100644 index 0000000..4b6c6a0 --- /dev/null +++ b/app/src/main/java/eu/depau/etchdroid/utils/DoNotShowAgainDialogFragment.kt @@ -0,0 +1,40 @@ +package eu.depau.etchdroid.utils + +import android.app.Dialog +import android.os.Bundle +import android.view.LayoutInflater +import androidx.appcompat.app.AlertDialog +import androidx.fragment.app.DialogFragment +import eu.depau.etchdroid.R +import kotlinx.android.synthetic.main.do_not_show_again.view.* + + +class DoNotShowAgainDialogFragment() : DialogFragment() { + var title: String? = null + var closeButton: String? = null + var message: String? = null + var listener: DialogListener? = null + + interface DialogListener { + fun onDialogClose(dialog: DoNotShowAgainDialogFragment, showAgain: Boolean) + } + + override fun onCreateDialog(savedInstanceState: Bundle?): Dialog { + // Build the dialog and set up the button click handlers + val builder = AlertDialog.Builder(activity!!) + val inflater = LayoutInflater.from(this.context) + val dnsaLayout = inflater.inflate(R.layout.do_not_show_again, null) + val doNotShowAgainCB = dnsaLayout.do_not_show_again + + builder + .setTitle(title) + .setMessage(message) + .setView(dnsaLayout) + .setPositiveButton(closeButton) { _, _ -> + listener?.onDialogClose(this@DoNotShowAgainDialogFragment, !doNotShowAgainCB.isChecked) + } + + return builder.create() + } + +} \ No newline at end of file diff --git a/app/src/main/res/layout/do_not_show_again.xml b/app/src/main/res/layout/do_not_show_again.xml new file mode 100644 index 0000000..1c594c7 --- /dev/null +++ b/app/src/main/res/layout/do_not_show_again.xml @@ -0,0 +1,16 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index f1bca8e..47eee53 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -91,4 +91,8 @@ Write AppleĀ® DMG image Restore an image created with macOS Disk Utility No USB drives detected + Do not show again + 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.