Skip to content
This repository was archived by the owner on May 1, 2024. It is now read-only.
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
31 commits
Select commit Hold shift + click to select a range
f5ca7c7
Update SnackBar.android.cs
maxkoshevoi Jun 2, 2021
dc6838c
Fix #1340
maxkoshevoi Jun 2, 2021
e456430
Pass exception into result
maxkoshevoi Jun 2, 2021
2922f14
Fix build
maxkoshevoi Jun 2, 2021
ce3fd59
Merge branch 'main' into 1341-infinite-toast
maxkoshevoi Jun 2, 2021
2ac6e53
Merge branch 'main' into 1341-infinite-toast
maxkoshevoi Jun 4, 2021
7a26fa3
Merge branch 'main' into 1341-infinite-toast
maxkoshevoi Jun 5, 2021
0f93075
Merge branch 'main' into 1341-infinite-toast
jsuarezruiz Jun 8, 2021
2e77e97
Merge branch 'main' into 1341-infinite-toast
maxkoshevoi Jun 10, 2021
943b776
Merge branch 'main' into 1341-infinite-toast
jsuarezruiz Jun 14, 2021
a004f08
Merge branch 'main' into 1341-infinite-toast
pictos Jun 16, 2021
fafe506
Add test
maxkoshevoi Jun 18, 2021
42b7644
Merge branch 'main' into 1341-infinite-toast
maxkoshevoi Jun 18, 2021
53d2b3e
Merge branch 'main' into 1341-infinite-toast
maxkoshevoi Jun 20, 2021
f95ea34
Merge branch 'main' into 1341-infinite-toast
maxkoshevoi Jun 25, 2021
6ca1595
Merge branch 'main' into 1341-infinite-toast
maxkoshevoi Jun 30, 2021
cbb22ae
Merge branch 'main' into 1341-infinite-toast
TheCodeTraveler Jul 1, 2021
bba2055
Merge branch 'main' into 1341-infinite-toast
maxkoshevoi Jul 6, 2021
2956aa1
Merge branch 'main' into 1341-infinite-toast
maxkoshevoi Aug 26, 2021
5195ca3
Merge branch 'main' into 1341-infinite-toast
maxkoshevoi Sep 27, 2021
d8983ac
Merge branch 'main' into 1341-infinite-toast
pictos Oct 22, 2021
11a05dc
Merge branch 'main' into 1341-infinite-toast
pictos Oct 22, 2021
552fcf3
Merge branch 'main' into 1341-infinite-toast
maxkoshevoi Oct 28, 2021
c232152
Use tabs
maxkoshevoi Oct 28, 2021
0ee1136
Extract OnActionClick method
maxkoshevoi Oct 28, 2021
d02b852
Update SnackBar.tizen.cs
maxkoshevoi Oct 28, 2021
2ee2ee8
Merge branch 'main' into 1341-infinite-toast
pictos Oct 30, 2021
89d8222
Merge branch 'main' into 1341-infinite-toast
maxkoshevoi Nov 15, 2021
7da156b
Merge branch 'main' into 1341-infinite-toast
TheCodeTraveler Nov 24, 2021
1d8737b
Merge branch 'main' into 1341-infinite-toast
VladislavAntonyuk Nov 25, 2021
06fce54
Update ToastOptions.shared.cs
VladislavAntonyuk Nov 25, 2021
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
<?xml version="1.0" encoding="utf-8" ?>
<pages:BasePage
x:Class="Xamarin.CommunityToolkit.Sample.Pages.TestCases.SnackBarActionExceptionPage"
xmlns="http://xamarin.com/schemas/2014/forms"
xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
xmlns:pages="clr-namespace:Xamarin.CommunityToolkit.Sample.Pages">

<ContentPage.Content>
<Grid RowDefinitions="auto, *, *">
<Button Text="App shouldn't crash when you press this and execute action." Clicked="ShowSnackBar" />
</Grid>
</ContentPage.Content>

</pages:BasePage>
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
using System;
using Xamarin.CommunityToolkit.Extensions;

namespace Xamarin.CommunityToolkit.Sample.Pages.TestCases
{
public partial class SnackBarActionExceptionPage
{
public SnackBarActionExceptionPage() => InitializeComponent();

async void ShowSnackBar(object sender, EventArgs e)
{
try
{
await this.DisplaySnackBarAsync("Execute action to throw exception", "Throw exception", () => throw new Exception());
}
catch
{
await this.DisplayToastAsync("Exception caught");
}
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@ protected override IEnumerable<SectionModel> CreateItems() => new[]
new SectionModel(
typeof(TouchEffectButtonPage),
"TouchEffect + Button",
"TouchEffect must automatically invoke button'c command execution."),
"TouchEffect must automatically invoke button's command execution."),

new SectionModel(
typeof(TouchEffectCollectionViewPage),
Expand All @@ -38,6 +38,11 @@ protected override IEnumerable<SectionModel> CreateItems() => new[]
typeof(LinkerCameraViewPage),
"Linker for CameraView",
"Make sure that Linker is keeping the MediaCaptured and MediaCaptureFailed events if they are used."),

new SectionModel(
typeof(SnackBarActionExceptionPage),
"SnackBar Action Exception",
"Exception in SnackBar's action doesn't crash the app."),
};
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -73,8 +73,17 @@ public SnackBarLayout(SnackBarOptions options)
Command = new Forms.Command(async () =>
{
OnSnackBarActionExecuted?.Invoke();
if (action.Action != null)
await action.Action();
try
{
if (action.Action != null)
await action.Action();

options.SetResult(true);
}
catch (Exception ex)
{
options.SetException(ex);
}
}),
Padding = new Thickness(action.Padding.Left,
action.Padding.Top,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -51,6 +51,8 @@ public class ToastOptions
/// </summary>
public TaskCompletionSource<bool> Result { get; }

public void SetResult(bool result) => Result.SetResult(result);
internal bool SetResult(bool result) => Result.TrySetResult(result);

internal bool SetException(Exception exception) => Result.TrySetException(exception);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -15,9 +15,9 @@

namespace Xamarin.CommunityToolkit.UI.Views
{
class SnackBar
partial class SnackBar
{
internal async ValueTask Show(VisualElement sender, SnackBarOptions arguments)
internal partial async ValueTask Show(VisualElement sender, SnackBarOptions arguments)
{
var renderer = await GetRendererWithRetries(sender) ?? throw new ArgumentException("Provided VisualElement cannot be parent to SnackBar", nameof(sender));
var snackBar = AndroidSnackBar.Make(renderer.View, arguments.MessageOptions.Message, (int)arguments.Duration.TotalMilliseconds);
Expand Down Expand Up @@ -87,11 +87,7 @@ internal async ValueTask Show(VisualElement sender, SnackBarOptions arguments)

foreach (var action in arguments.Actions)
{
snackBar.SetAction(action.Text, async v =>
{
if (action.Action != null)
await action.Action();
});
snackBar.SetAction(action.Text, async _ => await OnActionClick(action, arguments).ConfigureAwait(false));
if (action.ForegroundColor != Forms.Color.Default)
{
snackBar.SetActionTextColor(action.ForegroundColor.ToAndroid());
Expand Down Expand Up @@ -154,15 +150,10 @@ public override void OnDismissed(Java.Lang.Object transientBottomBar, int e)
{
base.OnDismissed(transientBottomBar, e);

switch (e)
{
case DismissEventTimeout:
arguments.SetResult(false);
break;
case DismissEventAction:
arguments.SetResult(true);
break;
}
if (e == DismissEventAction)
return;

arguments.SetResult(false);
}
}
}
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
using System.Linq;
using System;
using System.Linq;
using System.Threading.Tasks;
using System.Timers;
using Gtk;
Expand All @@ -10,11 +11,11 @@

namespace Xamarin.CommunityToolkit.UI.Views
{
class SnackBar
partial class SnackBar
{
Timer? snackBarTimer;

public ValueTask Show(VisualElement visualElement, SnackBarOptions arguments)
internal partial ValueTask Show(VisualElement visualElement, SnackBarOptions arguments)
{
var mainWindow = (Platform.GetRenderer(visualElement).Container.Child as Forms.Platform.GTK.Controls.Page)?.Children[0] as VBox;
var snackBarLayout = GetSnackBarLayout(mainWindow, arguments);
Expand Down Expand Up @@ -55,14 +56,10 @@ HBox GetSnackBarLayout(Container? container, SnackBarOptions arguments)
button.ModifyBg(StateType.Normal, action.BackgroundColor.ToGtkColor());
button.ModifyFg(StateType.Normal, action.ForegroundColor.ToGtkColor());

button.Clicked += async (sender, e) =>
button.Clicked += async (_, _) =>
{
snackBarTimer?.Stop();

if (action.Action != null)
await action.Action();

arguments.SetResult(true);
await OnActionClick(action, arguments).ConfigureAwait(false);
container?.Remove(snackBarLayout);
};

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -15,9 +15,9 @@

namespace Xamarin.CommunityToolkit.UI.Views
{
class SnackBar
partial class SnackBar
{
internal ValueTask Show(VisualElement sender, SnackBarOptions arguments)
internal partial ValueTask Show(VisualElement sender, SnackBarOptions arguments)
{
var snackBar = NativeSnackBar.MakeSnackBar(arguments.MessageOptions.Message)
.SetDuration(arguments.Duration)
Expand Down Expand Up @@ -123,11 +123,7 @@ internal ValueTask Show(VisualElement sender, SnackBarOptions arguments)
actionButton.SetAction(async () =>
{
snackBar.Dismiss();

if (action.Action != null)
await action.Action();

arguments.SetResult(true);
await OnActionClick(action, arguments).ConfigureAwait(false);
});

snackBar.Actions.Add(actionButton);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,8 +5,8 @@

namespace Xamarin.CommunityToolkit.UI.Views
{
class SnackBar
partial class SnackBar
{
internal ValueTask Show(VisualElement sender, SnackBarOptions arguments) => throw new PlatformNotSupportedException();
internal partial ValueTask Show(VisualElement sender, SnackBarOptions arguments) => throw new PlatformNotSupportedException();
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
using System;
using System.Threading.Tasks;
using Xamarin.CommunityToolkit.UI.Views.Options;
using Xamarin.Forms;

namespace Xamarin.CommunityToolkit.UI.Views
{
partial class SnackBar
{
internal partial ValueTask Show(VisualElement sender, SnackBarOptions arguments);

async Task OnActionClick(SnackBarActionOptions action, SnackBarOptions arguments)
{
try
{
if (action.Action != null)
await action.Action();

arguments.SetResult(true);
}
catch (Exception ex)
{
arguments.SetException(ex);
}
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -6,9 +6,9 @@

namespace Xamarin.CommunityToolkit.UI.Views
{
class SnackBar
partial class SnackBar
{
internal ValueTask Show(Forms.VisualElement sender, SnackBarOptions arguments)
internal partial ValueTask Show(Forms.VisualElement sender, SnackBarOptions arguments)
{
var snackBarDialog =
Forms.Platform.Tizen.Native.Dialog.CreateDialog(Forms.Forms.NativeParent,
Expand All @@ -25,19 +25,15 @@ internal ValueTask Show(Forms.VisualElement sender, SnackBarOptions arguments)
{
var ok = new EButton(snackBarDialog) { Text = action.Text };
snackBarDialog.NeutralButton = ok;
ok.Clicked += async (s, evt) =>
ok.Clicked += async (_, _) =>
{
snackBarDialog.Dismiss();

if (action.Action != null)
await action.Action();

arguments.SetResult(true);
await OnActionClick(action, arguments).ConfigureAwait(false);
};
}

snackBarDialog.TimedOut += (s, evt) => DismissSnackBar();
snackBarDialog.BackButtonPressed += (s, evt) => DismissSnackBar();
snackBarDialog.TimedOut += (_, _) => DismissSnackBar();
snackBarDialog.BackButtonPressed += (_, _) => DismissSnackBar();
snackBarDialog.Show();

return default;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@

namespace Xamarin.CommunityToolkit.UI.Views
{
class SnackBar
partial class SnackBar
{
DispatcherTimer? snackBarTimer;

Expand All @@ -35,7 +35,7 @@ class SnackBar
return null;
}

internal ValueTask Show(Forms.VisualElement visualElement, SnackBarOptions arguments)
internal partial ValueTask Show(Forms.VisualElement visualElement, SnackBarOptions arguments)
{
var snackBarLayout = new SnackBarLayout(arguments);
var pageControl = Platform.GetRenderer(visualElement).ContainerElement.Parent;
Expand All @@ -55,7 +55,6 @@ internal ValueTask Show(Forms.VisualElement visualElement, SnackBarOptions argum
grid.Children.Remove(snackBarLayout);
grid.RowDefinitions.Remove(snackBarRow);
snackBarTimer.Stop();
arguments.SetResult(true);
};
snackBarTimer.Start();
grid.RowDefinitions.Add(snackBarRow);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -11,11 +11,11 @@

namespace Xamarin.CommunityToolkit.UI.Views
{
class SnackBar
partial class SnackBar
{
Timer? snackBarTimer;

internal ValueTask Show(Forms.VisualElement visualElement, SnackBarOptions arguments)
internal partial ValueTask Show(Forms.VisualElement visualElement, SnackBarOptions arguments)
{
var formsAppBar = System.Windows.Application.Current.MainWindow.FindChild<FormsAppBar>("PART_BottomAppBar");
var currentContent = formsAppBar.Content;
Expand All @@ -31,7 +31,6 @@ internal ValueTask Show(Forms.VisualElement visualElement, SnackBarOptions argum
{
formsAppBar.Content = currentContent;
snackBarTimer.Stop();
arguments.SetResult(true);
};
snackBarTimer.Start();
var border = new Border
Expand Down