From 2760db01a0242800a0531bc6cc9e852a22414bde Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Javier=20Su=C3=A1rez=20Ruiz?= Date: Fri, 27 Sep 2019 07:19:12 +0200 Subject: [PATCH] [RefreshView] Fire RefreshCommand setting IsRefreshing (#7398) * refresh view ui tests * Fixed issue notifying changes in IsRefreshing property * Fire RefreshCommand setting IsRefreshing to true * Update Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Xamarin.Forms.Controls.Issues.Shared.projitems * Update Xamarin.Forms.Core.UITests.Shared/UITestCategories.cs * Added RefreshView UITests * - ui test with swipe * - change to drag * - fix ui test * - remove extra property changed event --- .../RefreshViewTests.cs | 35 +++++++++++++++++-- .../UITestCategories.cs | 2 +- Xamarin.Forms.Core/RefreshView.cs | 2 +- .../Renderers/RefreshViewRenderer.cs | 11 +++--- .../Renderers/RefreshViewRenderer.cs | 13 ++++--- 5 files changed, 47 insertions(+), 16 deletions(-) diff --git a/Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/RefreshViewTests.cs b/Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/RefreshViewTests.cs index 3cd831e5949..789d3615cfd 100644 --- a/Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/RefreshViewTests.cs +++ b/Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/RefreshViewTests.cs @@ -27,9 +27,11 @@ protected override void Init() { Title = "Refresh View Tests"; var scrollViewContent = - new StackLayout(); + new StackLayout() + { + }; - Enumerable.Range(0, 1000).Select(_ => new Label() { Text = "Pull me down to refresh me" }) + Enumerable.Range(0, 10).Select(_ => new Label() { HeightRequest = 200, Text = "Pull me down to refresh me" }) .ForEach(x => scrollViewContent.Children.Add(x)); _refreshView = new RefreshView() @@ -38,7 +40,8 @@ protected override void Init() { HeightRequest = 2000, BackgroundColor = Color.Green, - Content = scrollViewContent + Content = scrollViewContent, + AutomationId = "LayoutContainer" }, Command = new Command(async () => { @@ -69,5 +72,31 @@ protected override void Init() } }; } +#if UITEST + [Test] + public void IsRefreshingAndCommandTest() + { + RunningApp.Tap(q => q.Button("Toggle Refresh")); + RunningApp.WaitForElement(q => q.Marked("IsRefreshing: True")); + RunningApp.Screenshot("Refreshing"); + RunningApp.WaitForElement(q => q.Marked("IsRefreshing: False")); + RunningApp.Screenshot("Refreshed"); + } + + [Test] + public void IsRefreshingAndCommandTest_SwipeDown() + { + RunningApp.WaitForElement(q => q.Marked("IsRefreshing: False")); + + var container = RunningApp.WaitForElement("LayoutContainer")[0]; + + RunningApp.Pan(new Drag(container.Rect, Drag.Direction.TopToBottom, Drag.DragLength.Medium)); + + RunningApp.WaitForElement(q => q.Marked("IsRefreshing: True")); + RunningApp.Screenshot("Refreshing"); + RunningApp.WaitForElement(q => q.Marked("IsRefreshing: False")); + RunningApp.Screenshot("Refreshed"); + } +#endif } } \ No newline at end of file diff --git a/Xamarin.Forms.Core.UITests.Shared/UITestCategories.cs b/Xamarin.Forms.Core.UITests.Shared/UITestCategories.cs index 3a79668c217..b5b697c5a6c 100644 --- a/Xamarin.Forms.Core.UITests.Shared/UITestCategories.cs +++ b/Xamarin.Forms.Core.UITests.Shared/UITestCategories.cs @@ -57,4 +57,4 @@ internal static class UITestCategories public const string RefreshView = "RefreshView"; public const string TitleView = "TitleView"; } -} \ No newline at end of file +} diff --git a/Xamarin.Forms.Core/RefreshView.cs b/Xamarin.Forms.Core/RefreshView.cs index d19a577ee54..1216cdce9ff 100644 --- a/Xamarin.Forms.Core/RefreshView.cs +++ b/Xamarin.Forms.Core/RefreshView.cs @@ -20,7 +20,7 @@ public RefreshView() } public static readonly BindableProperty IsRefreshingProperty = - BindableProperty.Create(nameof(IsRefreshing), typeof(bool), typeof(RefreshView), false); + BindableProperty.Create(nameof(IsRefreshing), typeof(bool), typeof(RefreshView), false, BindingMode.TwoWay); public bool IsRefreshing { diff --git a/Xamarin.Forms.Platform.Android/Renderers/RefreshViewRenderer.cs b/Xamarin.Forms.Platform.Android/Renderers/RefreshViewRenderer.cs index 858a106ecbf..c88bb4d6e00 100644 --- a/Xamarin.Forms.Platform.Android/Renderers/RefreshViewRenderer.cs +++ b/Xamarin.Forms.Platform.Android/Renderers/RefreshViewRenderer.cs @@ -54,10 +54,10 @@ public override bool Refreshing if (RefreshView != null && RefreshView.IsRefreshing != _refreshing) RefreshView.IsRefreshing = _refreshing; - if (base.Refreshing == _refreshing) - return; - base.Refreshing = _refreshing; + + if (base.Refreshing && Element is RefreshView refreshView && refreshView.Command != null && refreshView.Command.CanExecute(refreshView?.CommandParameter)) + refreshView.Command.Execute(refreshView?.CommandParameter); } } @@ -186,10 +186,7 @@ bool CanScrollUpViewByType(AView view) public void OnRefresh() { - if (RefreshView?.Command?.CanExecute(RefreshView?.CommandParameter) ?? false) - { - RefreshView.Command.Execute(RefreshView?.CommandParameter); - } + Refreshing = true; } void HandlePropertyChanged(object sender, PropertyChangedEventArgs e) diff --git a/Xamarin.Forms.Platform.iOS/Renderers/RefreshViewRenderer.cs b/Xamarin.Forms.Platform.iOS/Renderers/RefreshViewRenderer.cs index 72b17ca0631..6ffda38edb5 100644 --- a/Xamarin.Forms.Platform.iOS/Renderers/RefreshViewRenderer.cs +++ b/Xamarin.Forms.Platform.iOS/Renderers/RefreshViewRenderer.cs @@ -22,8 +22,16 @@ public bool IsRefreshing { _isRefreshing = value; + if (Element != null && Element.IsRefreshing != _isRefreshing) + Element.IsRefreshing = _isRefreshing; + if (_isRefreshing) + { _refreshControl.BeginRefreshing(); + + if (Element is RefreshView refreshView && refreshView.Command != null && refreshView.Command.CanExecute(refreshView?.CommandParameter)) + refreshView.Command.Execute(refreshView?.CommandParameter); + } else _refreshControl.EndRefreshing(); @@ -201,10 +209,7 @@ bool CanUseRefreshControlProperty() void OnRefresh(object sender, EventArgs e) { - if (Element?.Command?.CanExecute(Element?.CommandParameter) ?? false) - { - Element.Command.Execute(Element?.CommandParameter); - } + IsRefreshing = true; } void IEffectControlProvider.RegisterEffect(Effect effect)