diff --git a/src/Android/Services/DeviceActionService.cs b/src/Android/Services/DeviceActionService.cs index 43799eee3..7a89295b3 100644 --- a/src/Android/Services/DeviceActionService.cs +++ b/src/Android/Services/DeviceActionService.cs @@ -328,6 +328,79 @@ namespace Bit.Droid.Services return Build.Model; } + public Task DisplayAlertAsync(string title, string message, string cancel, params string[] buttons) + { + var activity = (MainActivity)CrossCurrentActivity.Current.Activity; + if(activity == null) + { + return Task.FromResult(null); + } + + var result = new TaskCompletionSource(); + var alertBuilder = new AlertDialog.Builder(activity); + alertBuilder.SetTitle(title); + + if(!string.IsNullOrWhiteSpace(message)) + { + if(buttons != null && buttons.Length > 2) + { + if(!string.IsNullOrWhiteSpace(title)) + { + alertBuilder.SetTitle($"{title}: {message}"); + } + else + { + alertBuilder.SetTitle(message); + } + } + else + { + alertBuilder.SetMessage(message); + } + } + + if(buttons != null) + { + if(buttons.Length > 2) + { + alertBuilder.SetItems(buttons, (sender, args) => + { + result.TrySetResult(buttons[args.Which]); + }); + } + else + { + if(buttons.Length > 0) + { + alertBuilder.SetPositiveButton(buttons[0], (sender, args) => + { + result.TrySetResult(buttons[0]); + }); + } + if(buttons.Length > 1) + { + alertBuilder.SetNeutralButton(buttons[1], (sender, args) => + { + result.TrySetResult(buttons[1]); + }); + } + } + } + + if(!string.IsNullOrWhiteSpace(cancel)) + { + alertBuilder.SetNegativeButton(cancel, (sender, args) => + { + result.TrySetResult(cancel); + }); + } + + var alert = alertBuilder.Create(); + alert.CancelEvent += (o, args) => { result.TrySetResult(null); }; + alert.Show(); + return result.Task; + } + private bool DeleteDir(Java.IO.File dir) { if(dir != null && dir.IsDirectory) diff --git a/src/App/Abstractions/IDeviceActionService.cs b/src/App/Abstractions/IDeviceActionService.cs index 08a135da6..e34c05e81 100644 --- a/src/App/Abstractions/IDeviceActionService.cs +++ b/src/App/Abstractions/IDeviceActionService.cs @@ -23,5 +23,6 @@ namespace Bit.App.Abstractions bool SupportsAutofillService(); int SystemMajorVersion(); string SystemModel(); + Task DisplayAlertAsync(string title, string message, string cancel, params string[] buttons); } } diff --git a/src/iOS/Services/DeviceActionService.cs b/src/iOS/Services/DeviceActionService.cs index 601a0849c..bb575dc9b 100644 --- a/src/iOS/Services/DeviceActionService.cs +++ b/src/iOS/Services/DeviceActionService.cs @@ -264,6 +264,29 @@ namespace Bit.iOS.Services return UIDevice.CurrentDevice.Model; } + public Task DisplayAlertAsync(string title, string message, string cancel, params string[] buttons) + { + var result = new TaskCompletionSource(); + var alert = UIAlertController.Create(title ?? string.Empty, message, UIAlertControllerStyle.Alert); + if(!string.IsNullOrWhiteSpace(cancel)) + { + alert.AddAction(UIAlertAction.Create(cancel, UIAlertActionStyle.Cancel, x => + { + result.TrySetResult(cancel); + })); + } + foreach(var button in buttons) + { + alert.AddAction(UIAlertAction.Create(button, UIAlertActionStyle.Default, x => + { + result.TrySetResult(button); + })); + } + var vc = GetPresentedViewController(); + vc?.PresentViewController(alert, true, null); + return result.Task; + } + private void ImagePicker_FinishedPickingMedia(object sender, UIImagePickerMediaPickedEventArgs e) { if(sender is UIImagePickerController picker)