From 5bfa0044ab896785ca5f6ece7f034de355a1112a Mon Sep 17 00:00:00 2001 From: tzugen Date: Thu, 18 Nov 2021 21:29:27 +0100 Subject: [PATCH] Introduce prepopulated Info and Error Dialog.Builders, and thereby unify dialog handling across the code base --- .../moire/ultrasonic/util/ErrorDialog.java | 71 ----------------- .../ultrasonic/util/ModalBackgroundTask.java | 37 ++------- .../ultrasonic/activity/NavigationActivity.kt | 11 ++- .../ultrasonic/fragment/EditServerFragment.kt | 23 +++--- .../fragment/ServerSelectorFragment.kt | 5 +- .../ultrasonic/fragment/SettingsFragment.kt | 4 +- .../ultrasonic/util/CommunicationError.kt | 12 +-- .../org/moire/ultrasonic/util/Dialogs.kt | 77 +++++++++++++++++++ .../kotlin/org/moire/ultrasonic/util/Util.kt | 30 -------- 9 files changed, 110 insertions(+), 160 deletions(-) delete mode 100644 ultrasonic/src/main/java/org/moire/ultrasonic/util/ErrorDialog.java create mode 100644 ultrasonic/src/main/kotlin/org/moire/ultrasonic/util/Dialogs.kt diff --git a/ultrasonic/src/main/java/org/moire/ultrasonic/util/ErrorDialog.java b/ultrasonic/src/main/java/org/moire/ultrasonic/util/ErrorDialog.java deleted file mode 100644 index ff0fc891..00000000 --- a/ultrasonic/src/main/java/org/moire/ultrasonic/util/ErrorDialog.java +++ /dev/null @@ -1,71 +0,0 @@ -/* - This file is part of Subsonic. - - Subsonic is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - Subsonic is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with Subsonic. If not, see . - - Copyright 2009 (C) Sindre Mehus - */ -package org.moire.ultrasonic.util; - -import android.app.Activity; -import android.app.AlertDialog; -import android.content.DialogInterface; - -import org.moire.ultrasonic.R; - -/** - * @author Sindre Mehus - */ -public class ErrorDialog -{ - - public ErrorDialog(Activity activity, int messageId, boolean finishActivityOnCancel) - { - this(activity, activity.getResources().getString(messageId), finishActivityOnCancel); - } - - public ErrorDialog(final Activity activity, CharSequence message, final boolean finishActivityOnClose) - { - - AlertDialog.Builder builder = new AlertDialog.Builder(activity); - builder.setIcon(R.drawable.ic_baseline_warning); - builder.setTitle(R.string.error_label); - builder.setMessage(message); - builder.setCancelable(true); - builder.setOnCancelListener(new DialogInterface.OnCancelListener() - { - @Override - public void onCancel(DialogInterface dialogInterface) - { - if (finishActivityOnClose) - { - activity.finish(); - } - } - }); - builder.setPositiveButton(R.string.common_ok, new DialogInterface.OnClickListener() - { - @Override - public void onClick(DialogInterface dialogInterface, int i) - { - if (finishActivityOnClose) - { - activity.finish(); - } - } - }); - - builder.create().show(); - } -} diff --git a/ultrasonic/src/main/java/org/moire/ultrasonic/util/ModalBackgroundTask.java b/ultrasonic/src/main/java/org/moire/ultrasonic/util/ModalBackgroundTask.java index c402c83c..18c3bfa5 100644 --- a/ultrasonic/src/main/java/org/moire/ultrasonic/util/ModalBackgroundTask.java +++ b/ultrasonic/src/main/java/org/moire/ultrasonic/util/ModalBackgroundTask.java @@ -20,11 +20,11 @@ package org.moire.ultrasonic.util; import android.app.Activity; import android.app.AlertDialog; -import android.content.DialogInterface; -import timber.log.Timber; import org.moire.ultrasonic.R; +import timber.log.Timber; + /** * @author Sindre Mehus */ @@ -49,27 +49,11 @@ public abstract class ModalBackgroundTask extends BackgroundTask private AlertDialog createProgressDialog() { - AlertDialog.Builder builder = new AlertDialog.Builder(getActivity()); - builder.setIcon(R.drawable.ic_baseline_info); + AlertDialog.Builder builder = new InfoDialog.Builder(getActivity()); builder.setTitle(R.string.background_task_wait); builder.setMessage(R.string.background_task_loading); - builder.setCancelable(true); - builder.setOnCancelListener(new DialogInterface.OnCancelListener() - { - @Override - public void onCancel(DialogInterface dialogInterface) - { - cancel(); - } - }); - builder.setPositiveButton(R.string.common_cancel, new DialogInterface.OnClickListener() - { - @Override - public void onClick(DialogInterface dialogInterface, int i) - { - cancel(); - } - }); + builder.setOnCancelListener(dialogInterface -> cancel()); + builder.setPositiveButton(R.string.common_cancel, (dialogInterface, i) -> cancel()); return builder.create(); } @@ -165,19 +149,12 @@ public abstract class ModalBackgroundTask extends BackgroundTask protected void error(Throwable error) { Timber.w(error); - new ErrorDialog(getActivity(), getErrorMessage(error), finishActivityOnCancel); + new ErrorDialog(getActivity(), getErrorMessage(error), getActivity(), finishActivityOnCancel); } @Override public void updateProgress(final String message) { - getHandler().post(new Runnable() - { - @Override - public void run() - { - progressDialog.setMessage(message); - } - }); + getHandler().post(() -> progressDialog.setMessage(message)); } } diff --git a/ultrasonic/src/main/kotlin/org/moire/ultrasonic/activity/NavigationActivity.kt b/ultrasonic/src/main/kotlin/org/moire/ultrasonic/activity/NavigationActivity.kt index 0daa0989..44b67078 100644 --- a/ultrasonic/src/main/kotlin/org/moire/ultrasonic/activity/NavigationActivity.kt +++ b/ultrasonic/src/main/kotlin/org/moire/ultrasonic/activity/NavigationActivity.kt @@ -1,6 +1,11 @@ +/* + * NavigationActivity.kt + * Copyright (C) 2009-2021 Ultrasonic developers + * + * Distributed under terms of the GNU GPLv3 license. + */ package org.moire.ultrasonic.activity -import android.app.AlertDialog import android.app.SearchManager import android.content.Intent import android.content.res.ColorStateList @@ -47,6 +52,7 @@ import org.moire.ultrasonic.service.MediaPlayerLifecycleSupport import org.moire.ultrasonic.service.RxBus import org.moire.ultrasonic.subsonic.ImageLoaderProvider import org.moire.ultrasonic.util.Constants +import org.moire.ultrasonic.util.InfoDialog import org.moire.ultrasonic.util.ServerColor import org.moire.ultrasonic.util.Settings import org.moire.ultrasonic.util.Storage @@ -352,8 +358,7 @@ class NavigationActivity : AppCompatActivity() { if (!infoDialogDisplayed) { infoDialogDisplayed = true - AlertDialog.Builder(this) - .setIcon(R.drawable.ic_baseline_info) + InfoDialog.Builder(this) .setTitle(R.string.main_welcome_title) .setMessage(R.string.main_welcome_text_demo) .setNegativeButton(R.string.main_welcome_cancel) { dialog, _ -> diff --git a/ultrasonic/src/main/kotlin/org/moire/ultrasonic/fragment/EditServerFragment.kt b/ultrasonic/src/main/kotlin/org/moire/ultrasonic/fragment/EditServerFragment.kt index 76481cd3..29de1289 100644 --- a/ultrasonic/src/main/kotlin/org/moire/ultrasonic/fragment/EditServerFragment.kt +++ b/ultrasonic/src/main/kotlin/org/moire/ultrasonic/fragment/EditServerFragment.kt @@ -1,6 +1,5 @@ package org.moire.ultrasonic.fragment -import android.app.AlertDialog import android.os.Bundle import android.view.LayoutInflater import android.view.View @@ -37,6 +36,7 @@ import org.moire.ultrasonic.model.ServerSettingsModel import org.moire.ultrasonic.service.MusicServiceFactory import org.moire.ultrasonic.util.Constants import org.moire.ultrasonic.util.ErrorDialog +import org.moire.ultrasonic.util.InfoDialog import org.moire.ultrasonic.util.ModalBackgroundTask import org.moire.ultrasonic.util.ServerColor import org.moire.ultrasonic.util.Util @@ -470,24 +470,22 @@ class EditServerFragment : Fragment(), OnBackPressedHandler { ) } - Util.showDialog( - context = requireActivity(), - titleId = R.string.settings_testing_ok, - message = dialogText - ) + InfoDialog.Builder(requireActivity()) + .setTitle(R.string.settings_testing_ok) + .setMessage(dialogText) + .show() } override fun error(error: Throwable) { Timber.w(error) ErrorDialog( - activity, - String.format( + context = activity, + message = String.format( "%s %s", resources.getString(R.string.settings_connection_failure), getErrorMessage(error) - ), - false - ) + ) + ).show() } } task.execute() @@ -508,8 +506,7 @@ class EditServerFragment : Fragment(), OnBackPressedHandler { */ private fun finishActivity() { if (areFieldsChanged()) { - AlertDialog.Builder(context) - .setIcon(R.drawable.ic_baseline_warning) + ErrorDialog.Builder(context) .setTitle(R.string.common_confirm) .setMessage(R.string.server_editor_leave_confirmation) .setPositiveButton(R.string.common_ok) { dialog, _ -> diff --git a/ultrasonic/src/main/kotlin/org/moire/ultrasonic/fragment/ServerSelectorFragment.kt b/ultrasonic/src/main/kotlin/org/moire/ultrasonic/fragment/ServerSelectorFragment.kt index 61543264..f5827d1f 100644 --- a/ultrasonic/src/main/kotlin/org/moire/ultrasonic/fragment/ServerSelectorFragment.kt +++ b/ultrasonic/src/main/kotlin/org/moire/ultrasonic/fragment/ServerSelectorFragment.kt @@ -1,6 +1,5 @@ package org.moire.ultrasonic.fragment -import android.app.AlertDialog import android.os.Bundle import android.view.LayoutInflater import android.view.View @@ -20,6 +19,7 @@ import org.moire.ultrasonic.data.ActiveServerProvider import org.moire.ultrasonic.fragment.EditServerFragment.Companion.EDIT_SERVER_INTENT_INDEX import org.moire.ultrasonic.model.ServerSettingsModel import org.moire.ultrasonic.service.MediaPlayerController +import org.moire.ultrasonic.util.ErrorDialog import org.moire.ultrasonic.util.Util import timber.log.Timber @@ -133,8 +133,7 @@ class ServerSelectorFragment : Fragment() { * This Callback handles the deletion of a Server Setting */ private fun onServerDeleted(index: Int) { - AlertDialog.Builder(context) - .setIcon(R.drawable.ic_baseline_warning) + ErrorDialog.Builder(context) .setTitle(R.string.server_menu_delete) .setMessage(R.string.server_selector_delete_confirmation) .setPositiveButton(R.string.common_delete) { dialog, _ -> diff --git a/ultrasonic/src/main/kotlin/org/moire/ultrasonic/fragment/SettingsFragment.kt b/ultrasonic/src/main/kotlin/org/moire/ultrasonic/fragment/SettingsFragment.kt index 62da5051..9f3e5b79 100644 --- a/ultrasonic/src/main/kotlin/org/moire/ultrasonic/fragment/SettingsFragment.kt +++ b/ultrasonic/src/main/kotlin/org/moire/ultrasonic/fragment/SettingsFragment.kt @@ -42,6 +42,7 @@ import org.moire.ultrasonic.service.RxBus import org.moire.ultrasonic.util.Constants import org.moire.ultrasonic.util.FileUtil.defaultMusicDirectory import org.moire.ultrasonic.util.FileUtil.ultrasonicDirectory +import org.moire.ultrasonic.util.InfoDialog import org.moire.ultrasonic.util.MediaSessionHandler import org.moire.ultrasonic.util.Settings import org.moire.ultrasonic.util.Settings.preferences @@ -480,9 +481,8 @@ class SettingsFragment : ) val keep = R.string.settings_debug_log_keep val delete = R.string.settings_debug_log_delete - AlertDialog.Builder(activity) + InfoDialog.Builder(activity) .setMessage(message) - .setIcon(R.drawable.ic_baseline_info) .setNegativeButton(keep) { dIf: DialogInterface, _: Int -> dIf.cancel() } diff --git a/ultrasonic/src/main/kotlin/org/moire/ultrasonic/util/CommunicationError.kt b/ultrasonic/src/main/kotlin/org/moire/ultrasonic/util/CommunicationError.kt index dc7821a0..0bd4e0b9 100644 --- a/ultrasonic/src/main/kotlin/org/moire/ultrasonic/util/CommunicationError.kt +++ b/ultrasonic/src/main/kotlin/org/moire/ultrasonic/util/CommunicationError.kt @@ -6,7 +6,6 @@ */ package org.moire.ultrasonic.util -import android.app.AlertDialog import android.content.Context import android.os.Handler import android.os.Looper @@ -45,13 +44,10 @@ object CommunicationError { if (context == null) return - AlertDialog.Builder(context) - .setIcon(R.drawable.ic_baseline_warning) - .setTitle(R.string.error_label) - .setMessage(getErrorMessage(error!!, context)) - .setCancelable(true) - .setPositiveButton(R.string.common_ok) { _, _ -> } - .create().show() + ErrorDialog( + context = context, + message = getErrorMessage(error!!, context) + ).show() } @JvmStatic diff --git a/ultrasonic/src/main/kotlin/org/moire/ultrasonic/util/Dialogs.kt b/ultrasonic/src/main/kotlin/org/moire/ultrasonic/util/Dialogs.kt new file mode 100644 index 00000000..af83d784 --- /dev/null +++ b/ultrasonic/src/main/kotlin/org/moire/ultrasonic/util/Dialogs.kt @@ -0,0 +1,77 @@ +/* + * NavigationActivity.kt + * Copyright (C) 2009-2021 Ultrasonic developers + * + * Distributed under terms of the GNU GPLv3 license. + */ +package org.moire.ultrasonic.util + +import android.app.Activity +import android.app.AlertDialog +import android.content.Context +import org.moire.ultrasonic.R + +open class InfoDialog( + context: Context, + message: CharSequence?, + private val activity: Activity? = null, + private val finishActivityOnClose: Boolean = false +) { + + open var builder: AlertDialog.Builder = Builder(activity ?: context, message) + + fun show() { + builder.setOnCancelListener { + if (finishActivityOnClose) { + activity!!.finish() + } + } + builder.setPositiveButton(R.string.common_ok) { _, _ -> + if (finishActivityOnClose) { + activity!!.finish() + } + } + builder.create().show() + } + + class Builder(context: Context?) : AlertDialog.Builder(context) { + + constructor(context: Context, message: CharSequence?) : this(context) { + setMessage(message) + } + + init { + setIcon(R.drawable.ic_baseline_info) + setTitle(R.string.common_confirm) + setCancelable(true) + setPositiveButton(R.string.common_ok) { _, _ -> + // Just close it + } + } + } +} + +class ErrorDialog( + context: Context, + message: CharSequence?, + activity: Activity? = null, + finishActivityOnClose: Boolean = false +) : InfoDialog(context, message, activity, finishActivityOnClose) { + + override var builder: AlertDialog.Builder = Builder(activity ?: context, message) + + class Builder(context: Context?) : AlertDialog.Builder(context) { + constructor(context: Context, message: CharSequence?) : this(context) { + setMessage(message) + } + + init { + setIcon(R.drawable.ic_baseline_warning) + setTitle(R.string.error_label) + setCancelable(true) + setPositiveButton(R.string.common_ok) { _, _ -> + // Just close it + } + } + } +} diff --git a/ultrasonic/src/main/kotlin/org/moire/ultrasonic/util/Util.kt b/ultrasonic/src/main/kotlin/org/moire/ultrasonic/util/Util.kt index 7b65b17e..89f6173d 100644 --- a/ultrasonic/src/main/kotlin/org/moire/ultrasonic/util/Util.kt +++ b/ultrasonic/src/main/kotlin/org/moire/ultrasonic/util/Util.kt @@ -9,11 +9,9 @@ package org.moire.ultrasonic.util import android.annotation.SuppressLint import android.app.Activity -import android.app.AlertDialog import android.app.PendingIntent import android.content.ContentResolver import android.content.Context -import android.content.DialogInterface import android.content.Intent import android.content.pm.PackageManager import android.graphics.Bitmap @@ -364,34 +362,6 @@ object Util { fun isExternalStoragePresent(): Boolean = Environment.MEDIA_MOUNTED == Environment.getExternalStorageState() - // The AlertDialog requires an Activity context, app context is not enough - // See https://stackoverflow.com/questions/5436822/ - fun createDialog( - context: Context?, - icon: Int = R.drawable.ic_baseline_info, - title: String, - message: String? - ): AlertDialog.Builder { - return AlertDialog.Builder(context) - .setIcon(icon) - .setTitle(title) - .setMessage(message) - .setPositiveButton(R.string.common_ok) { - dialog: DialogInterface, - _: Int -> - dialog.dismiss() - } - } - - fun showDialog( - context: Context, - icon: Int = R.drawable.ic_baseline_info, - titleId: Int, - message: String? - ) { - createDialog(context, icon, context.getString(titleId, ""), message).show() - } - @JvmStatic fun sleepQuietly(millis: Long) { try {