Introduce prepopulated Info and Error Dialog.Builders,

and thereby unify dialog handling across the code base
This commit is contained in:
tzugen 2021-11-18 21:29:27 +01:00
parent 6b1fc7575a
commit 5bfa0044ab
No known key found for this signature in database
GPG Key ID: 61E9C34BC10EC930
9 changed files with 110 additions and 160 deletions

View File

@ -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 <http://www.gnu.org/licenses/>.
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();
}
}

View File

@ -20,11 +20,11 @@ package org.moire.ultrasonic.util;
import android.app.Activity; import android.app.Activity;
import android.app.AlertDialog; import android.app.AlertDialog;
import android.content.DialogInterface;
import timber.log.Timber;
import org.moire.ultrasonic.R; import org.moire.ultrasonic.R;
import timber.log.Timber;
/** /**
* @author Sindre Mehus * @author Sindre Mehus
*/ */
@ -49,27 +49,11 @@ public abstract class ModalBackgroundTask<T> extends BackgroundTask<T>
private AlertDialog createProgressDialog() private AlertDialog createProgressDialog()
{ {
AlertDialog.Builder builder = new AlertDialog.Builder(getActivity()); AlertDialog.Builder builder = new InfoDialog.Builder(getActivity());
builder.setIcon(R.drawable.ic_baseline_info);
builder.setTitle(R.string.background_task_wait); builder.setTitle(R.string.background_task_wait);
builder.setMessage(R.string.background_task_loading); builder.setMessage(R.string.background_task_loading);
builder.setCancelable(true); builder.setOnCancelListener(dialogInterface -> cancel());
builder.setOnCancelListener(new DialogInterface.OnCancelListener() builder.setPositiveButton(R.string.common_cancel, (dialogInterface, i) -> cancel());
{
@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();
}
});
return builder.create(); return builder.create();
} }
@ -165,19 +149,12 @@ public abstract class ModalBackgroundTask<T> extends BackgroundTask<T>
protected void error(Throwable error) protected void error(Throwable error)
{ {
Timber.w(error); Timber.w(error);
new ErrorDialog(getActivity(), getErrorMessage(error), finishActivityOnCancel); new ErrorDialog(getActivity(), getErrorMessage(error), getActivity(), finishActivityOnCancel);
} }
@Override @Override
public void updateProgress(final String message) public void updateProgress(final String message)
{ {
getHandler().post(new Runnable() getHandler().post(() -> progressDialog.setMessage(message));
{
@Override
public void run()
{
progressDialog.setMessage(message);
}
});
} }
} }

View File

@ -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 package org.moire.ultrasonic.activity
import android.app.AlertDialog
import android.app.SearchManager import android.app.SearchManager
import android.content.Intent import android.content.Intent
import android.content.res.ColorStateList 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.service.RxBus
import org.moire.ultrasonic.subsonic.ImageLoaderProvider import org.moire.ultrasonic.subsonic.ImageLoaderProvider
import org.moire.ultrasonic.util.Constants import org.moire.ultrasonic.util.Constants
import org.moire.ultrasonic.util.InfoDialog
import org.moire.ultrasonic.util.ServerColor import org.moire.ultrasonic.util.ServerColor
import org.moire.ultrasonic.util.Settings import org.moire.ultrasonic.util.Settings
import org.moire.ultrasonic.util.Storage import org.moire.ultrasonic.util.Storage
@ -352,8 +358,7 @@ class NavigationActivity : AppCompatActivity() {
if (!infoDialogDisplayed) { if (!infoDialogDisplayed) {
infoDialogDisplayed = true infoDialogDisplayed = true
AlertDialog.Builder(this) InfoDialog.Builder(this)
.setIcon(R.drawable.ic_baseline_info)
.setTitle(R.string.main_welcome_title) .setTitle(R.string.main_welcome_title)
.setMessage(R.string.main_welcome_text_demo) .setMessage(R.string.main_welcome_text_demo)
.setNegativeButton(R.string.main_welcome_cancel) { dialog, _ -> .setNegativeButton(R.string.main_welcome_cancel) { dialog, _ ->

View File

@ -1,6 +1,5 @@
package org.moire.ultrasonic.fragment package org.moire.ultrasonic.fragment
import android.app.AlertDialog
import android.os.Bundle import android.os.Bundle
import android.view.LayoutInflater import android.view.LayoutInflater
import android.view.View import android.view.View
@ -37,6 +36,7 @@ import org.moire.ultrasonic.model.ServerSettingsModel
import org.moire.ultrasonic.service.MusicServiceFactory import org.moire.ultrasonic.service.MusicServiceFactory
import org.moire.ultrasonic.util.Constants import org.moire.ultrasonic.util.Constants
import org.moire.ultrasonic.util.ErrorDialog import org.moire.ultrasonic.util.ErrorDialog
import org.moire.ultrasonic.util.InfoDialog
import org.moire.ultrasonic.util.ModalBackgroundTask import org.moire.ultrasonic.util.ModalBackgroundTask
import org.moire.ultrasonic.util.ServerColor import org.moire.ultrasonic.util.ServerColor
import org.moire.ultrasonic.util.Util import org.moire.ultrasonic.util.Util
@ -470,24 +470,22 @@ class EditServerFragment : Fragment(), OnBackPressedHandler {
) )
} }
Util.showDialog( InfoDialog.Builder(requireActivity())
context = requireActivity(), .setTitle(R.string.settings_testing_ok)
titleId = R.string.settings_testing_ok, .setMessage(dialogText)
message = dialogText .show()
)
} }
override fun error(error: Throwable) { override fun error(error: Throwable) {
Timber.w(error) Timber.w(error)
ErrorDialog( ErrorDialog(
activity, context = activity,
String.format( message = String.format(
"%s %s", "%s %s",
resources.getString(R.string.settings_connection_failure), resources.getString(R.string.settings_connection_failure),
getErrorMessage(error) getErrorMessage(error)
), )
false ).show()
)
} }
} }
task.execute() task.execute()
@ -508,8 +506,7 @@ class EditServerFragment : Fragment(), OnBackPressedHandler {
*/ */
private fun finishActivity() { private fun finishActivity() {
if (areFieldsChanged()) { if (areFieldsChanged()) {
AlertDialog.Builder(context) ErrorDialog.Builder(context)
.setIcon(R.drawable.ic_baseline_warning)
.setTitle(R.string.common_confirm) .setTitle(R.string.common_confirm)
.setMessage(R.string.server_editor_leave_confirmation) .setMessage(R.string.server_editor_leave_confirmation)
.setPositiveButton(R.string.common_ok) { dialog, _ -> .setPositiveButton(R.string.common_ok) { dialog, _ ->

View File

@ -1,6 +1,5 @@
package org.moire.ultrasonic.fragment package org.moire.ultrasonic.fragment
import android.app.AlertDialog
import android.os.Bundle import android.os.Bundle
import android.view.LayoutInflater import android.view.LayoutInflater
import android.view.View 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.fragment.EditServerFragment.Companion.EDIT_SERVER_INTENT_INDEX
import org.moire.ultrasonic.model.ServerSettingsModel import org.moire.ultrasonic.model.ServerSettingsModel
import org.moire.ultrasonic.service.MediaPlayerController import org.moire.ultrasonic.service.MediaPlayerController
import org.moire.ultrasonic.util.ErrorDialog
import org.moire.ultrasonic.util.Util import org.moire.ultrasonic.util.Util
import timber.log.Timber import timber.log.Timber
@ -133,8 +133,7 @@ class ServerSelectorFragment : Fragment() {
* This Callback handles the deletion of a Server Setting * This Callback handles the deletion of a Server Setting
*/ */
private fun onServerDeleted(index: Int) { private fun onServerDeleted(index: Int) {
AlertDialog.Builder(context) ErrorDialog.Builder(context)
.setIcon(R.drawable.ic_baseline_warning)
.setTitle(R.string.server_menu_delete) .setTitle(R.string.server_menu_delete)
.setMessage(R.string.server_selector_delete_confirmation) .setMessage(R.string.server_selector_delete_confirmation)
.setPositiveButton(R.string.common_delete) { dialog, _ -> .setPositiveButton(R.string.common_delete) { dialog, _ ->

View File

@ -42,6 +42,7 @@ import org.moire.ultrasonic.service.RxBus
import org.moire.ultrasonic.util.Constants import org.moire.ultrasonic.util.Constants
import org.moire.ultrasonic.util.FileUtil.defaultMusicDirectory import org.moire.ultrasonic.util.FileUtil.defaultMusicDirectory
import org.moire.ultrasonic.util.FileUtil.ultrasonicDirectory import org.moire.ultrasonic.util.FileUtil.ultrasonicDirectory
import org.moire.ultrasonic.util.InfoDialog
import org.moire.ultrasonic.util.MediaSessionHandler import org.moire.ultrasonic.util.MediaSessionHandler
import org.moire.ultrasonic.util.Settings import org.moire.ultrasonic.util.Settings
import org.moire.ultrasonic.util.Settings.preferences import org.moire.ultrasonic.util.Settings.preferences
@ -480,9 +481,8 @@ class SettingsFragment :
) )
val keep = R.string.settings_debug_log_keep val keep = R.string.settings_debug_log_keep
val delete = R.string.settings_debug_log_delete val delete = R.string.settings_debug_log_delete
AlertDialog.Builder(activity) InfoDialog.Builder(activity)
.setMessage(message) .setMessage(message)
.setIcon(R.drawable.ic_baseline_info)
.setNegativeButton(keep) { dIf: DialogInterface, _: Int -> .setNegativeButton(keep) { dIf: DialogInterface, _: Int ->
dIf.cancel() dIf.cancel()
} }

View File

@ -6,7 +6,6 @@
*/ */
package org.moire.ultrasonic.util package org.moire.ultrasonic.util
import android.app.AlertDialog
import android.content.Context import android.content.Context
import android.os.Handler import android.os.Handler
import android.os.Looper import android.os.Looper
@ -45,13 +44,10 @@ object CommunicationError {
if (context == null) return if (context == null) return
AlertDialog.Builder(context) ErrorDialog(
.setIcon(R.drawable.ic_baseline_warning) context = context,
.setTitle(R.string.error_label) message = getErrorMessage(error!!, context)
.setMessage(getErrorMessage(error!!, context)) ).show()
.setCancelable(true)
.setPositiveButton(R.string.common_ok) { _, _ -> }
.create().show()
} }
@JvmStatic @JvmStatic

View File

@ -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
}
}
}
}

View File

@ -9,11 +9,9 @@ package org.moire.ultrasonic.util
import android.annotation.SuppressLint import android.annotation.SuppressLint
import android.app.Activity import android.app.Activity
import android.app.AlertDialog
import android.app.PendingIntent import android.app.PendingIntent
import android.content.ContentResolver import android.content.ContentResolver
import android.content.Context import android.content.Context
import android.content.DialogInterface
import android.content.Intent import android.content.Intent
import android.content.pm.PackageManager import android.content.pm.PackageManager
import android.graphics.Bitmap import android.graphics.Bitmap
@ -364,34 +362,6 @@ object Util {
fun isExternalStoragePresent(): Boolean = fun isExternalStoragePresent(): Boolean =
Environment.MEDIA_MOUNTED == Environment.getExternalStorageState() 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 @JvmStatic
fun sleepQuietly(millis: Long) { fun sleepQuietly(millis: Long) {
try { try {