summaryrefslogtreecommitdiffstats
path: root/src/android/app
diff options
context:
space:
mode:
Diffstat (limited to 'src/android/app')
-rw-r--r--src/android/app/src/main/java/org/yuzu/yuzu_emu/fragments/MessageDialogFragment.kt124
-rw-r--r--src/android/app/src/main/java/org/yuzu/yuzu_emu/model/MessageDialogViewModel.kt2
2 files changed, 104 insertions, 22 deletions
diff --git a/src/android/app/src/main/java/org/yuzu/yuzu_emu/fragments/MessageDialogFragment.kt b/src/android/app/src/main/java/org/yuzu/yuzu_emu/fragments/MessageDialogFragment.kt
index 22b084b9a..685df0d59 100644
--- a/src/android/app/src/main/java/org/yuzu/yuzu_emu/fragments/MessageDialogFragment.kt
+++ b/src/android/app/src/main/java/org/yuzu/yuzu_emu/fragments/MessageDialogFragment.kt
@@ -4,7 +4,6 @@
package org.yuzu.yuzu_emu.fragments
import android.app.Dialog
-import android.content.DialogInterface
import android.content.Intent
import android.net.Uri
import android.os.Bundle
@@ -16,18 +15,52 @@ import androidx.lifecycle.ViewModelProvider
import com.google.android.material.dialog.MaterialAlertDialogBuilder
import org.yuzu.yuzu_emu.R
import org.yuzu.yuzu_emu.model.MessageDialogViewModel
+import org.yuzu.yuzu_emu.utils.Log
class MessageDialogFragment : DialogFragment() {
private val messageDialogViewModel: MessageDialogViewModel by activityViewModels()
override fun onCreateDialog(savedInstanceState: Bundle?): Dialog {
val titleId = requireArguments().getInt(TITLE_ID)
- val titleString = requireArguments().getString(TITLE_STRING)!!
+ val title = if (titleId != 0) {
+ getString(titleId)
+ } else {
+ requireArguments().getString(TITLE_STRING)!!
+ }
+
val descriptionId = requireArguments().getInt(DESCRIPTION_ID)
- val descriptionString = requireArguments().getString(DESCRIPTION_STRING)!!
+ val description = if (descriptionId != 0) {
+ getString(descriptionId)
+ } else {
+ requireArguments().getString(DESCRIPTION_STRING)!!
+ }
+
+ val positiveButtonId = requireArguments().getInt(POSITIVE_BUTTON_TITLE_ID)
+ val positiveButtonString = requireArguments().getString(POSITIVE_BUTTON_TITLE_STRING)!!
+ val positiveButton = if (positiveButtonId != 0) {
+ getString(positiveButtonId)
+ } else if (positiveButtonString.isNotEmpty()) {
+ positiveButtonString
+ } else if (messageDialogViewModel.positiveAction != null) {
+ getString(R.string.close)
+ } else {
+ getString(android.R.string.ok)
+ }
+
+ val negativeButtonId = requireArguments().getInt(NEGATIVE_BUTTON_TITLE_ID)
+ val negativeButtonString = requireArguments().getString(NEGATIVE_BUTTON_TITLE_STRING)!!
+ val negativeButton = if (negativeButtonId != 0) {
+ getString(negativeButtonId)
+ } else if (negativeButtonString.isNotEmpty()) {
+ negativeButtonString
+ } else {
+ getString(android.R.string.cancel)
+ }
+
val helpLinkId = requireArguments().getInt(HELP_LINK)
val dismissible = requireArguments().getBoolean(DISMISSIBLE)
- val clearPositiveAction = requireArguments().getBoolean(CLEAR_POSITIVE_ACTION)
+ val clearPositiveAction = requireArguments().getBoolean(CLEAR_ACTIONS)
+ val showNegativeButton = requireArguments().getBoolean(SHOW_NEGATIVE_BUTTON)
val builder = MaterialAlertDialogBuilder(requireContext())
@@ -35,21 +68,19 @@ class MessageDialogFragment : DialogFragment() {
messageDialogViewModel.positiveAction = null
}
- if (messageDialogViewModel.positiveAction == null) {
- builder.setPositiveButton(R.string.close, null)
- } else {
- builder.setPositiveButton(android.R.string.ok) { _: DialogInterface, _: Int ->
- messageDialogViewModel.positiveAction?.invoke()
- }.setNegativeButton(android.R.string.cancel, null)
+ builder.setPositiveButton(positiveButton) { _, _ ->
+ messageDialogViewModel.positiveAction?.invoke()
+ }
+ if (messageDialogViewModel.negativeAction != null || showNegativeButton) {
+ builder.setNegativeButton(negativeButton) { _, _ ->
+ messageDialogViewModel.negativeAction?.invoke()
+ }
}
- if (titleId != 0) builder.setTitle(titleId)
- if (titleString.isNotEmpty()) builder.setTitle(titleString)
-
- if (descriptionId != 0) {
- builder.setMessage(Html.fromHtml(getString(descriptionId), Html.FROM_HTML_MODE_LEGACY))
+ if (title.isNotEmpty()) builder.setTitle(title)
+ if (description.isNotEmpty()) {
+ builder.setMessage(Html.fromHtml(description, Html.FROM_HTML_MODE_LEGACY))
}
- if (descriptionString.isNotEmpty()) builder.setMessage(descriptionString)
if (helpLinkId != 0) {
builder.setNeutralButton(R.string.learn_more) { _, _ ->
@@ -76,8 +107,41 @@ class MessageDialogFragment : DialogFragment() {
private const val DESCRIPTION_STRING = "DescriptionString"
private const val HELP_LINK = "Link"
private const val DISMISSIBLE = "Dismissible"
- private const val CLEAR_POSITIVE_ACTION = "ClearPositiveAction"
-
+ private const val CLEAR_ACTIONS = "ClearActions"
+ private const val POSITIVE_BUTTON_TITLE_ID = "PositiveButtonTitleId"
+ private const val POSITIVE_BUTTON_TITLE_STRING = "PositiveButtonTitleString"
+ private const val SHOW_NEGATIVE_BUTTON = "ShowNegativeButton"
+ private const val NEGATIVE_BUTTON_TITLE_ID = "NegativeButtonTitleId"
+ private const val NEGATIVE_BUTTON_TITLE_STRING = "NegativeButtonTitleString"
+
+ /**
+ * Creates a new [MessageDialogFragment] instance.
+ * @param activity Activity that will hold a [MessageDialogViewModel] instance if using
+ * [positiveAction] or [negativeAction].
+ * @param titleId String resource ID that will be used for the title. [titleString] used if 0.
+ * @param titleString String that will be used for the title. No title is set if empty.
+ * @param descriptionId String resource ID that will be used for the description.
+ * [descriptionString] used if 0.
+ * @param descriptionString String that will be used for the description.
+ * No description is set if empty.
+ * @param helpLinkId String resource ID that contains a help link. Will be added as a neutral
+ * button with the title R.string.help.
+ * @param dismissible Whether the dialog is dismissible or not. Typically used to ensure that
+ * the user clicks on one of the dialog buttons before closing.
+ * @param positiveButtonTitleId String resource ID that will be used for the positive button.
+ * [positiveButtonTitleString] used if 0.
+ * @param positiveButtonTitleString String that will be used for the positive button.
+ * android.R.string.ok used if empty. android.R.string.close will be used if [positiveAction]
+ * is not null.
+ * @param positiveAction Lambda to run when the positive button is clicked.
+ * @param showNegativeButton Normally the negative button isn't shown if there is no
+ * [negativeAction] set. This can override that behavior to always show a button.
+ * @param negativeButtonTitleId String resource ID that will be used for the negative button.
+ * [negativeButtonTitleString] used if 0.
+ * @param negativeButtonTitleString String that will be used for the negative button.
+ * android.R.string.cancel used if empty.
+ * @param negativeAction Lambda to run when the negative button is clicked
+ */
fun newInstance(
activity: FragmentActivity? = null,
titleId: Int = 0,
@@ -86,16 +150,27 @@ class MessageDialogFragment : DialogFragment() {
descriptionString: String = "",
helpLinkId: Int = 0,
dismissible: Boolean = true,
- positiveAction: (() -> Unit)? = null
+ positiveButtonTitleId: Int = 0,
+ positiveButtonTitleString: String = "",
+ positiveAction: (() -> Unit)? = null,
+ showNegativeButton: Boolean = false,
+ negativeButtonTitleId: Int = 0,
+ negativeButtonTitleString: String = "",
+ negativeAction: (() -> Unit)? = null
): MessageDialogFragment {
- var clearPositiveAction = false
+ var clearActions = false
if (activity != null) {
ViewModelProvider(activity)[MessageDialogViewModel::class.java].apply {
clear()
this.positiveAction = positiveAction
+ this.negativeAction = negativeAction
}
} else {
- clearPositiveAction = true
+ clearActions = true
+ }
+
+ if (activity == null && (positiveAction == null || negativeAction == null)) {
+ Log.warning("[$TAG] Tried to set action with no activity!")
}
val dialog = MessageDialogFragment()
@@ -106,7 +181,12 @@ class MessageDialogFragment : DialogFragment() {
putString(DESCRIPTION_STRING, descriptionString)
putInt(HELP_LINK, helpLinkId)
putBoolean(DISMISSIBLE, dismissible)
- putBoolean(CLEAR_POSITIVE_ACTION, clearPositiveAction)
+ putBoolean(CLEAR_ACTIONS, clearActions)
+ putInt(POSITIVE_BUTTON_TITLE_ID, positiveButtonTitleId)
+ putString(POSITIVE_BUTTON_TITLE_STRING, positiveButtonTitleString)
+ putBoolean(SHOW_NEGATIVE_BUTTON, showNegativeButton)
+ putInt(NEGATIVE_BUTTON_TITLE_ID, negativeButtonTitleId)
+ putString(NEGATIVE_BUTTON_TITLE_STRING, negativeButtonTitleString)
}
dialog.arguments = bundle
return dialog
diff --git a/src/android/app/src/main/java/org/yuzu/yuzu_emu/model/MessageDialogViewModel.kt b/src/android/app/src/main/java/org/yuzu/yuzu_emu/model/MessageDialogViewModel.kt
index 641c5cb17..2db005e49 100644
--- a/src/android/app/src/main/java/org/yuzu/yuzu_emu/model/MessageDialogViewModel.kt
+++ b/src/android/app/src/main/java/org/yuzu/yuzu_emu/model/MessageDialogViewModel.kt
@@ -7,8 +7,10 @@ import androidx.lifecycle.ViewModel
class MessageDialogViewModel : ViewModel() {
var positiveAction: (() -> Unit)? = null
+ var negativeAction: (() -> Unit)? = null
fun clear() {
positiveAction = null
+ negativeAction = null
}
}