Merge pull request #2344 from iansw246/master
Hide progress dialogs when user input dialog is showing
This commit is contained in:
@@ -111,7 +111,6 @@ namespace keepass2android
|
||||
public class Kp2aApp: IKp2aApp, ICacheSupervisor
|
||||
{
|
||||
|
||||
|
||||
|
||||
public void Lock(bool allowQuickUnlock = true, bool lockWasTriggeredByTimeout = false)
|
||||
{
|
||||
@@ -467,8 +466,11 @@ namespace keepass2android
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
private void AskForReload(Activity activity, Action<bool> actionOnResult)
|
||||
private readonly HashSet<RealProgressDialog> _activeProgressDialogs = new HashSet<RealProgressDialog>();
|
||||
// Whether the app is currently showing a dialog that requires user input, like a yesNoCancel dialog
|
||||
private bool _isShowingUserInputDialog = false;
|
||||
|
||||
private void AskForReload(Activity activity, Action<bool> actionOnResult)
|
||||
{
|
||||
AlertDialog.Builder builder = new AlertDialog.Builder(activity);
|
||||
builder.SetTitle(activity.GetString(Resource.String.AskReloadFile_title));
|
||||
@@ -489,6 +491,8 @@ namespace keepass2android
|
||||
actionOnResult(true);
|
||||
actionOnResult = null;
|
||||
}
|
||||
|
||||
OnUserInputDialogClose();
|
||||
});
|
||||
|
||||
builder.SetNegativeButton(activity.GetString(Android.Resource.String.No), (dlgSender, dlgEvt) =>
|
||||
@@ -499,8 +503,9 @@ namespace keepass2android
|
||||
actionOnResult(false);
|
||||
actionOnResult = null;
|
||||
}
|
||||
});
|
||||
|
||||
OnUserInputDialogClose();
|
||||
});
|
||||
|
||||
Dialog dialog = builder.Create();
|
||||
|
||||
@@ -516,8 +521,11 @@ namespace keepass2android
|
||||
actionOnResult(false);
|
||||
actionOnResult = null;
|
||||
}
|
||||
|
||||
OnUserInputDialogClose();
|
||||
}));
|
||||
|
||||
OnUserInputDialogShow();
|
||||
dialog.Show();
|
||||
}
|
||||
|
||||
@@ -581,35 +589,59 @@ namespace keepass2android
|
||||
EventHandler dismissHandler,
|
||||
Context ctx, string messageSuffix = "")
|
||||
{
|
||||
Handler handler = new Handler(Looper.MainLooper);
|
||||
Handler handler = new Handler(Looper.MainLooper);
|
||||
handler.Post(() =>
|
||||
{
|
||||
AlertDialog.Builder builder = new AlertDialog.Builder(ctx);
|
||||
builder.SetTitle(GetResourceString(titleKey));
|
||||
|
||||
builder.SetMessage(GetResourceString(messageKey)+(messageSuffix != "" ? " " + messageSuffix: ""));
|
||||
builder.SetMessage(GetResourceString(messageKey) + (messageSuffix != "" ? " " + messageSuffix : ""));
|
||||
|
||||
string yesText = GetResourceString(yesString);
|
||||
builder.SetPositiveButton(yesText, yesHandler);
|
||||
// _____handlerWithShow are wrappers around given handlers to update _isSHowingYesNoCancelDialog
|
||||
// and to show progress dialog after yesNoCancel dialog is closed
|
||||
EventHandler<DialogClickEventArgs> yesHandlerWithShow = (sender, args) =>
|
||||
{
|
||||
OnUserInputDialogClose();
|
||||
yesHandler.Invoke(sender, args);
|
||||
};
|
||||
string yesText = GetResourceString(yesString);
|
||||
builder.SetPositiveButton(yesText, yesHandlerWithShow);
|
||||
string noText = "";
|
||||
if (noHandler != null)
|
||||
{
|
||||
EventHandler<DialogClickEventArgs> noHandlerWithShow = (sender, args) =>
|
||||
{
|
||||
OnUserInputDialogClose();
|
||||
noHandler.Invoke(sender, args);
|
||||
};
|
||||
|
||||
noText = GetResourceString(noString);
|
||||
builder.SetNegativeButton(noText, noHandler);
|
||||
builder.SetNegativeButton(noText, noHandlerWithShow);
|
||||
}
|
||||
string cancelText = "";
|
||||
if (cancelHandler != null)
|
||||
{
|
||||
EventHandler<DialogClickEventArgs> cancelHandlerWithShow = (sender, args) =>
|
||||
{
|
||||
OnUserInputDialogClose();
|
||||
cancelHandler.Invoke(sender, args);
|
||||
};
|
||||
|
||||
cancelText = ctx.GetString(Android.Resource.String.Cancel);
|
||||
builder.SetNeutralButton(cancelText,
|
||||
cancelHandler);
|
||||
cancelHandlerWithShow);
|
||||
}
|
||||
|
||||
|
||||
|
||||
AlertDialog dialog = builder.Create();
|
||||
if (dismissHandler != null)
|
||||
dialog.SetOnDismissListener(new Util.DismissListener(() => dismissHandler(dialog, EventArgs.Empty)));
|
||||
{
|
||||
dialog.SetOnDismissListener(new Util.DismissListener(() => {
|
||||
OnUserInputDialogClose();
|
||||
dismissHandler(dialog, EventArgs.Empty);
|
||||
}));
|
||||
}
|
||||
|
||||
OnUserInputDialogShow();
|
||||
dialog.Show();
|
||||
|
||||
if (yesText.Length + noText.Length + cancelText.Length >= 20)
|
||||
@@ -626,12 +658,53 @@ namespace keepass2android
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
public Handler UiThreadHandler
|
||||
/// <summary>
|
||||
/// Shows all non-dismissed progress dialogs.
|
||||
/// If there are multiple progressDialogs active, they all will be showing.
|
||||
/// There probably will never be multiple dialogs at the same time because only one ProgressTask can run at a time.
|
||||
/// Even if multiple dialogs show at the same time, it shouldn't be too much of an issue
|
||||
/// because they are just progress indicators.
|
||||
/// </summary>
|
||||
private void ShowAllActiveProgressDialogs()
|
||||
{
|
||||
foreach (RealProgressDialog progressDialog in _activeProgressDialogs)
|
||||
{
|
||||
progressDialog.Show();
|
||||
}
|
||||
}
|
||||
|
||||
private void HideAllActiveProgressDialogs()
|
||||
{
|
||||
foreach (RealProgressDialog progressDialog in _activeProgressDialogs)
|
||||
{
|
||||
progressDialog.Hide();
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Hide progress dialogs whenever a dialog that requires user interaction
|
||||
/// appears so that the progress dialogs cannot cover the user-interaction dialog
|
||||
/// </summary>
|
||||
private void OnUserInputDialogShow()
|
||||
{
|
||||
_isShowingUserInputDialog = true;
|
||||
HideAllActiveProgressDialogs();
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Show previously hidden progress dialogs after user interaction with dialog finished
|
||||
/// </summary>
|
||||
private void OnUserInputDialogClose()
|
||||
{
|
||||
_isShowingUserInputDialog = false;
|
||||
ShowAllActiveProgressDialogs();
|
||||
}
|
||||
|
||||
public Handler UiThreadHandler
|
||||
{
|
||||
get { return new Handler(); }
|
||||
}
|
||||
@@ -642,9 +715,11 @@ namespace keepass2android
|
||||
private class RealProgressDialog : IProgressDialog
|
||||
{
|
||||
private readonly ProgressDialog _pd;
|
||||
private readonly Kp2aApp _app;
|
||||
|
||||
public RealProgressDialog(Context ctx)
|
||||
public RealProgressDialog(Context ctx, Kp2aApp app)
|
||||
{
|
||||
_app = app;
|
||||
_pd = new ProgressDialog(ctx);
|
||||
_pd.SetCancelable(false);
|
||||
}
|
||||
@@ -669,18 +744,28 @@ namespace keepass2android
|
||||
{
|
||||
Kp2aLog.LogUnexpectedError(e);
|
||||
}
|
||||
|
||||
_app._activeProgressDialogs.Remove(this);
|
||||
}
|
||||
|
||||
public void Show()
|
||||
{
|
||||
_pd.Show();
|
||||
_app._activeProgressDialogs.Add(this);
|
||||
// Only show if asking dialog not also showing
|
||||
if (!_app._isShowingUserInputDialog)
|
||||
{
|
||||
_pd.Show();
|
||||
}
|
||||
}
|
||||
|
||||
public void Hide()
|
||||
{
|
||||
_pd.Hide();
|
||||
}
|
||||
}
|
||||
|
||||
public IProgressDialog CreateProgressDialog(Context ctx)
|
||||
{
|
||||
return new RealProgressDialog(ctx);
|
||||
return new RealProgressDialog(ctx, this);
|
||||
}
|
||||
|
||||
public IFileStorage GetFileStorage(IOConnectionInfo iocInfo)
|
||||
|
Reference in New Issue
Block a user