From 0cff619f1c4e2c37252bb3a495f78f311af52869 Mon Sep 17 00:00:00 2001 From: Rui Marinho Date: Tue, 6 Nov 2018 16:00:25 +0000 Subject: [PATCH 1/6] =?UTF-8?q?[Controls]=C2=A0Add=20repo=20for=20issue=20?= =?UTF-8?q?#4341?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Issue4341.cs | 54 +++++++++++++++++++ ...rin.Forms.Controls.Issues.Shared.projitems | 1 + .../GalleryPages/EditableList.cs | 15 +++--- 3 files changed, 64 insertions(+), 6 deletions(-) create mode 100644 Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Issue4341.cs diff --git a/Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Issue4341.cs b/Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Issue4341.cs new file mode 100644 index 00000000000..6149594d07e --- /dev/null +++ b/Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Issue4341.cs @@ -0,0 +1,54 @@ +using Xamarin.Forms.CustomAttributes; +using Xamarin.Forms.Internals; + +#if UITEST +using Xamarin.Forms.Core.UITests; +using Xamarin.UITest; +using NUnit.Framework; +#endif + +namespace Xamarin.Forms.Controls.Issues +{ +#if UITEST + [Category(UITestCategories.ContextActions)] +#endif + [Preserve(AllMembers = true)] + [Issue(IssueTracker.Github, 4341, "When ListView items is removed and it is empty, Xamarin Forms crash", PlatformAffected.iOS)] + public class Issue4341 : TestNavigationPage // or TestMasterDetailPage, etc ... + { + const string Success = "Success"; +#if !UITEST + MessagesViewModel viewModel; + protected override void Init() + { + var page = new ContextActionsGallery(false, true, 2) { Title = "Swipe and delete both" }; + viewModel = page.BindingContext as MessagesViewModel; + viewModel.Messages.CollectionChanged += (s, e) => + { + if (viewModel.Messages.Count == 0) + { + Navigation.PushAsync(new ContentPage { Title = "Success", Content = new Label { Text = Success } }); + } + }; + Navigation.PushAsync(page); + } +#else + protected override void Init() + { + } +#endif +#if UITEST && __IOS__ + [Test] + public void Issue4341Test() + { + RunningApp.WaitForElement(c=> c.Marked("Email")); + RunningApp.SwipeRightToLeft("Subject Line 0"); + RunningApp.WaitForElement("Delete"); + RunningApp.Tap("Delete"); + RunningApp.SwipeRightToLeft("Subject Line 1"); + RunningApp.Tap("Delete"); + RunningApp.WaitForElement(c=> c.Marked(Success)); + } +#endif + } +} \ No newline at end of file diff --git a/Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Xamarin.Forms.Controls.Issues.Shared.projitems b/Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Xamarin.Forms.Controls.Issues.Shared.projitems index b53cbe8dd2c..148113fa03c 100644 --- a/Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Xamarin.Forms.Controls.Issues.Shared.projitems +++ b/Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Xamarin.Forms.Controls.Issues.Shared.projitems @@ -820,6 +820,7 @@ + diff --git a/Xamarin.Forms.Controls/GalleryPages/EditableList.cs b/Xamarin.Forms.Controls/GalleryPages/EditableList.cs index e2265726bf7..3f98473deaf 100644 --- a/Xamarin.Forms.Controls/GalleryPages/EditableList.cs +++ b/Xamarin.Forms.Controls/GalleryPages/EditableList.cs @@ -7,9 +7,9 @@ namespace Xamarin.Forms.Controls { internal class MessagesViewModel : ViewModelBase { - public MessagesViewModel() + public MessagesViewModel(int messagesCount) { - Messages = new ObservableCollection (Enumerable.Range (0, 100).Select (i => { + Messages = new ObservableCollection (Enumerable.Range (0, messagesCount).Select (i => { return new MessageViewModel { Subject = "Subject Line " + i, MessagePreview = "Lorem ipsum dolorem monkeys bonkers " + i }; })); @@ -26,7 +26,7 @@ public ObservableCollection Messages } [Preserve (AllMembers = true)] - internal class MessageViewModel : ViewModelBase + public class MessageViewModel : ViewModelBase { public MessageViewModel() { @@ -86,13 +86,16 @@ public MessageCell() } } - public ContextActionsGallery (bool tableView = false) + public ContextActionsGallery (bool tableView = false, bool hasUnevenRows = false, int messagesCount = 100) { - BindingContext = new MessagesViewModel(); + BindingContext = new MessagesViewModel(messagesCount); View list; if (!tableView) { - list = new ListView(); + list = new ListView + { + HasUnevenRows = hasUnevenRows + }; list.SetBinding (ListView.ItemsSourceProperty, "Messages"); ((ListView)list).ItemTemplate = new DataTemplate (typeof (MessageCell)); } else { From f2937c88c0fc069164f987e19de36dcd6f13dc94 Mon Sep 17 00:00:00 2001 From: Rui Marinho Date: Tue, 6 Nov 2018 16:01:28 +0000 Subject: [PATCH 2/6] =?UTF-8?q?[iOS]=C2=A0Clear=20the=20global=20closer=20?= =?UTF-8?q?delegate=20from=20ContextActionCell=20when=20disposing?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Xamarin.Forms.Platform.iOS/ContextActionCell.cs | 1 + 1 file changed, 1 insertion(+) diff --git a/Xamarin.Forms.Platform.iOS/ContextActionCell.cs b/Xamarin.Forms.Platform.iOS/ContextActionCell.cs index 480651a5e2b..6760cc531fc 100644 --- a/Xamarin.Forms.Platform.iOS/ContextActionCell.cs +++ b/Xamarin.Forms.Platform.iOS/ContextActionCell.cs @@ -276,6 +276,7 @@ protected override void Dispose(bool disposing) if (_scroller != null) { + _scroller.Delegate = null; _scroller.Dispose(); _scroller = null; } From fe1a0cb1588a0b3828fdc4a791aa90e8dc96463d Mon Sep 17 00:00:00 2001 From: Rui Marinho Date: Tue, 13 Nov 2018 19:55:05 +0000 Subject: [PATCH 3/6] =?UTF-8?q?[Controls]=C2=A0Rename=20to=20correct=20iss?= =?UTF-8?q?ue=20number?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../{Issue4341.cs => Issue4314.cs} | 4 ++-- .../Xamarin.Forms.Controls.Issues.Shared.projitems | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) rename Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/{Issue4341.cs => Issue4314.cs} (91%) diff --git a/Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Issue4341.cs b/Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Issue4314.cs similarity index 91% rename from Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Issue4341.cs rename to Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Issue4314.cs index 6149594d07e..daf3e053c74 100644 --- a/Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Issue4341.cs +++ b/Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Issue4314.cs @@ -13,8 +13,8 @@ namespace Xamarin.Forms.Controls.Issues [Category(UITestCategories.ContextActions)] #endif [Preserve(AllMembers = true)] - [Issue(IssueTracker.Github, 4341, "When ListView items is removed and it is empty, Xamarin Forms crash", PlatformAffected.iOS)] - public class Issue4341 : TestNavigationPage // or TestMasterDetailPage, etc ... + [Issue(IssueTracker.Github, 4314, "When ListView items is removed and it is empty, Xamarin Forms crash", PlatformAffected.iOS)] + public class Issue4314 : TestNavigationPage // or TestMasterDetailPage, etc ... { const string Success = "Success"; #if !UITEST diff --git a/Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Xamarin.Forms.Controls.Issues.Shared.projitems b/Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Xamarin.Forms.Controls.Issues.Shared.projitems index 148113fa03c..f65145b0e51 100644 --- a/Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Xamarin.Forms.Controls.Issues.Shared.projitems +++ b/Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Xamarin.Forms.Controls.Issues.Shared.projitems @@ -820,7 +820,7 @@ - + From b6bce7beda6e14ae8446fba471a9a3a3bf12a29d Mon Sep 17 00:00:00 2001 From: Rui Marinho Date: Wed, 21 Nov 2018 23:01:33 +0000 Subject: [PATCH 4/6] =?UTF-8?q?[Controls]=C2=A0Try=20fix=20opening=20conte?= =?UTF-8?q?xt=20menu=20on=20iOS10?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Xamarin.Forms.Controls.Issues.Shared/Issue4314.cs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Issue4314.cs b/Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Issue4314.cs index daf3e053c74..3b81502d586 100644 --- a/Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Issue4314.cs +++ b/Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Issue4314.cs @@ -42,10 +42,10 @@ protected override void Init() public void Issue4341Test() { RunningApp.WaitForElement(c=> c.Marked("Email")); - RunningApp.SwipeRightToLeft("Subject Line 0"); + RunningApp.ActivateContextMenu("Subject Line 0"); RunningApp.WaitForElement("Delete"); RunningApp.Tap("Delete"); - RunningApp.SwipeRightToLeft("Subject Line 1"); + RunningApp.ActivateContextMenu("Subject Line 1"); RunningApp.Tap("Delete"); RunningApp.WaitForElement(c=> c.Marked(Success)); } From 9348411341567b4dc33cd3e9b744de71de22a718 Mon Sep 17 00:00:00 2001 From: Rui Marinho Date: Tue, 27 Nov 2018 22:36:15 +0000 Subject: [PATCH 5/6] =?UTF-8?q?[Controls]=C2=A0Add=20more=20testing=20to?= =?UTF-8?q?=20#4314?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Xamarin.Forms.Controls.Issues.Shared/Issue4314.cs | 3 +++ 1 file changed, 3 insertions(+) diff --git a/Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Issue4314.cs b/Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Issue4314.cs index 3b81502d586..b57526eb2ab 100644 --- a/Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Issue4314.cs +++ b/Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Issue4314.cs @@ -48,6 +48,9 @@ public void Issue4341Test() RunningApp.ActivateContextMenu("Subject Line 1"); RunningApp.Tap("Delete"); RunningApp.WaitForElement(c=> c.Marked(Success)); + RunningApp.Back(); + RunningApp.WaitForElement(c => c.Marked("Email")); + RunningApp.SwipeRightToLeft(); } #endif } From 58439b48550ed53e189f8ab249d7efab21145896 Mon Sep 17 00:00:00 2001 From: Rui Marinho Date: Tue, 27 Nov 2018 22:37:34 +0000 Subject: [PATCH 6/6] =?UTF-8?q?[iOS]=C2=A0Fix=20Globalcloser=20when=20no?= =?UTF-8?q?=20cell=20exists?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ContextScrollViewDelegate.cs | 42 +++++++++---------- 1 file changed, 20 insertions(+), 22 deletions(-) diff --git a/Xamarin.Forms.Platform.iOS/ContextScrollViewDelegate.cs b/Xamarin.Forms.Platform.iOS/ContextScrollViewDelegate.cs index 22f57fc3e85..82a674772bd 100644 --- a/Xamarin.Forms.Platform.iOS/ContextScrollViewDelegate.cs +++ b/Xamarin.Forms.Platform.iOS/ContextScrollViewDelegate.cs @@ -125,7 +125,7 @@ public override void Scrolled(UIScrollView scrollView) RestoreHighlight(scrollView); s_scrollViewBeingScrolled = null; - ClearCloserRecognizer(scrollView); + ClearCloserRecognizer(GetContextCell(scrollView)); ClosedCallback?.Invoke(); } } @@ -133,7 +133,7 @@ public override void Scrolled(UIScrollView scrollView) public void Unhook(UIScrollView scrollView) { RestoreHighlight(scrollView); - ClearCloserRecognizer(scrollView); + ClearCloserRecognizer(GetContextCell(scrollView)); } public override void WillEndDragging(UIScrollView scrollView, PointF velocity, ref PointF targetContentOffset) @@ -158,36 +158,35 @@ public override void WillEndDragging(UIScrollView scrollView, PointF velocity, r while (view.Superview != null) { view = view.Superview; - - NSAction close = () => - { - if (UIDevice.CurrentDevice.CheckSystemVersion(8, 0)) - RestoreHighlight(scrollView); - - IsOpen = false; - scrollView.SetContentOffset(new PointF(0, 0), true); - - ClearCloserRecognizer(scrollView); - }; - var table = view as UITableView; if (table != null) { + ContextActionsCell contentCell = GetContextCell(scrollView); + NSAction close = () => + { + if (UIDevice.CurrentDevice.CheckSystemVersion(8, 0)) + RestoreHighlight(scrollView); + + IsOpen = false; + scrollView.SetContentOffset(new PointF(0, 0), true); + ClearCloserRecognizer(contentCell); + contentCell = null; + }; + _table = table; _globalCloser = new GlobalCloseContextGestureRecognizer(scrollView, close); _globalCloser.ShouldRecognizeSimultaneously = (recognizer, r) => r == _table.PanGestureRecognizer; table.AddGestureRecognizer(_globalCloser); _closer = new UITapGestureRecognizer(close); - var cell = GetContextCell(scrollView); - cell.ContentCell.AddGestureRecognizer(_closer); + contentCell.AddGestureRecognizer(_closer); } } } } else { - ClearCloserRecognizer(scrollView); + ClearCloserRecognizer(GetContextCell(scrollView)); IsOpen = false; targetContentOffset = new PointF(0, 0); @@ -234,13 +233,12 @@ protected override void Dispose(bool disposing) base.Dispose(disposing); } - void ClearCloserRecognizer(UIScrollView scrollView) + void ClearCloserRecognizer(ContextActionsCell cell) { if (_globalCloser == null || _globalCloser.State == UIGestureRecognizerState.Cancelled) return; - var cell = GetContextCell(scrollView); - cell.ContentCell.RemoveGestureRecognizer(_closer); + cell?.ContentCell?.RemoveGestureRecognizer(_closer); _closer.Dispose(); _closer = null; @@ -252,9 +250,9 @@ void ClearCloserRecognizer(UIScrollView scrollView) ContextActionsCell GetContextCell(UIScrollView scrollView) { - var view = scrollView.Superview.Superview; + var view = scrollView?.Superview?.Superview; var cell = view as ContextActionsCell; - while (view.Superview != null) + while (view?.Superview != null) { cell = view as ContextActionsCell; if (cell != null)