From fa031204ed8b4de49696fb10fe6f1da860ac5db1 Mon Sep 17 00:00:00 2001 From: Gerald Versluis Date: Tue, 27 Aug 2019 13:33:48 +0200 Subject: [PATCH 01/10] Repro + fix --- .../Issue5159.cs | 46 +++++++++++++++++++ ...rin.Forms.Controls.Issues.Shared.projitems | 1 + .../Renderers/DatePickerRenderer.cs | 14 +++++- .../Renderers/PickerRenderer.cs | 16 +++++-- .../Renderers/TimePickerRenderer.cs | 14 +++++- 5 files changed, 84 insertions(+), 7 deletions(-) create mode 100644 Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Issue5159.cs diff --git a/Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Issue5159.cs b/Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Issue5159.cs new file mode 100644 index 00000000000..09f86515fe6 --- /dev/null +++ b/Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Issue5159.cs @@ -0,0 +1,46 @@ +using System; +using Xamarin.Forms.Internals; +using Xamarin.Forms.CustomAttributes; + +namespace Xamarin.Forms.Controls.Issues +{ + [Preserve(AllMembers = true)] + [Issue(IssueTracker.Github, 5159, "[Android] Calling Focus on all Pickers running an API 28 devices no longer opens Picker", PlatformAffected.Android)] + public class Issue5159 : TestContentPage + { + protected override void Init() + { + var stackLayout = new StackLayout + { + VerticalOptions = LayoutOptions.Center, + HorizontalOptions = LayoutOptions.Center + }; + + var button = new Button + { + Text = "Show picker" + }; + + var picker = new DatePicker + { + IsVisible = false + }; + + button.Clicked += (s, a) => + { + Device.BeginInvokeOnMainThread(() => + { + if (picker.IsFocused) + picker.Unfocus(); + + picker.Focus(); + }); + }; + + stackLayout.Children.Add(button); + stackLayout.Children.Add(picker); + + Content = stackLayout; + } + } +} 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 afeeaf2326e..13d3b4a7bb4 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 @@ -1014,6 +1014,7 @@ + diff --git a/Xamarin.Forms.Platform.Android/Renderers/DatePickerRenderer.cs b/Xamarin.Forms.Platform.Android/Renderers/DatePickerRenderer.cs index cce0a5bcf42..ee3afa129e5 100644 --- a/Xamarin.Forms.Platform.Android/Renderers/DatePickerRenderer.cs +++ b/Xamarin.Forms.Platform.Android/Renderers/DatePickerRenderer.cs @@ -94,7 +94,12 @@ protected override void OnFocusChangeRequested(object sender, VisualElement.Focu base.OnFocusChangeRequested(sender, e); if (e.Focus) - CallOnClick(); + { + if (Clickable) + CallOnClick(); + else + OnClickHandler(); + } else if (_dialog != null) { _dialog.Hide(); @@ -135,7 +140,7 @@ void DeviceInfoPropertyChanged(object sender, PropertyChangedEventArgs e) } } - void IPickerRenderer.OnClick() + void OnClickHandler() { if (_dialog != null && _dialog.IsShowing) { @@ -148,6 +153,11 @@ void IPickerRenderer.OnClick() ShowPickerDialog(view.Date.Year, view.Date.Month - 1, view.Date.Day); } + void IPickerRenderer.OnClick() + { + OnClickHandler(); + } + void ShowPickerDialog(int year, int month, int day) { _dialog = CreateDatePickerDialog(year, month, day); diff --git a/Xamarin.Forms.Platform.Android/Renderers/PickerRenderer.cs b/Xamarin.Forms.Platform.Android/Renderers/PickerRenderer.cs index 26d25d6154c..01818b7cdcf 100644 --- a/Xamarin.Forms.Platform.Android/Renderers/PickerRenderer.cs +++ b/Xamarin.Forms.Platform.Android/Renderers/PickerRenderer.cs @@ -104,7 +104,12 @@ protected override void OnFocusChangeRequested(object sender, VisualElement.Focu base.OnFocusChangeRequested(sender, e); if (e.Focus) - CallOnClick(); + { + if (Focusable) + CallOnClick(); + else + OnClickHandler(); + } else if (_dialog != null) { _dialog.Hide(); @@ -113,13 +118,13 @@ protected override void OnFocusChangeRequested(object sender, VisualElement.Focu } } - void IPickerRenderer.OnClick() + void OnClickHandler() { Picker model = Element; if (_dialog != null) return; - + var picker = new NumberPicker(Context); if (model.Items != null && model.Items.Any()) { @@ -180,6 +185,11 @@ void IPickerRenderer.OnClick() _dialog.Show(); } + void IPickerRenderer.OnClick() + { + OnClickHandler(); + } + void RowsCollectionChanged(object sender, EventArgs e) { UpdatePicker(); diff --git a/Xamarin.Forms.Platform.Android/Renderers/TimePickerRenderer.cs b/Xamarin.Forms.Platform.Android/Renderers/TimePickerRenderer.cs index d0ed9fc7d2b..9f30e64ae1e 100644 --- a/Xamarin.Forms.Platform.Android/Renderers/TimePickerRenderer.cs +++ b/Xamarin.Forms.Platform.Android/Renderers/TimePickerRenderer.cs @@ -86,7 +86,12 @@ protected override void OnFocusChangeRequested(object sender, VisualElement.Focu base.OnFocusChangeRequested(sender, e); if (e.Focus) - CallOnClick(); + { + if (Focusable) + CallOnClick(); + else + OnClickHandler(); + } else if (_dialog != null) { _dialog.Hide(); @@ -109,7 +114,7 @@ protected virtual TimePickerDialog CreateTimePickerDialog(int hours, int minutes return dialog; } - void IPickerRenderer.OnClick() + void OnClickHandler() { if (_dialog != null && _dialog.IsShowing) { @@ -123,6 +128,11 @@ void IPickerRenderer.OnClick() _dialog.Show(); } + void IPickerRenderer.OnClick() + { + OnClickHandler(); + } + void OnCancelButtonClicked(object sender, EventArgs e) { Element.Unfocus(); From c6199bac8f4f78b556ba8af00ffb376c231a6813 Mon Sep 17 00:00:00 2001 From: Gerald Versluis Date: Thu, 29 Aug 2019 15:34:31 +0200 Subject: [PATCH 02/10] Final fix --- .../Issue5159.cs | 121 +++++++++++++++++- .../AppCompat/PickerRenderer.cs | 7 +- .../Renderers/DatePickerRenderer.cs | 9 +- .../Renderers/PickerRenderer.cs | 11 +- .../Renderers/TimePickerRenderer.cs | 11 +- 5 files changed, 130 insertions(+), 29 deletions(-) diff --git a/Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Issue5159.cs b/Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Issue5159.cs index 09f86515fe6..1ebf9d3f9b5 100644 --- a/Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Issue5159.cs +++ b/Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Issue5159.cs @@ -1,13 +1,28 @@ using System; using Xamarin.Forms.Internals; using Xamarin.Forms.CustomAttributes; +#if UITEST +using Xamarin.Forms.Core.UITests; +using Xamarin.UITest; +using NUnit.Framework; +#endif namespace Xamarin.Forms.Controls.Issues { +#if UITEST + [Category(UITestCategories.Picker)] + [Category(UITestCategories.DatePicker)] + [Category(UITestCategories.TimePicker)] +#endif [Preserve(AllMembers = true)] [Issue(IssueTracker.Github, 5159, "[Android] Calling Focus on all Pickers running an API 28 devices no longer opens Picker", PlatformAffected.Android)] public class Issue5159 : TestContentPage { + const string DatePickerButton = "DatePickerButton"; + const string TimePickerButton = "TimePickerButton"; + const string PickerButton = "PickerButton"; + readonly string[] _pickerValues = { "Foo", "Bar", "42", "1337" }; + protected override void Init() { var stackLayout = new StackLayout @@ -16,17 +31,66 @@ protected override void Init() HorizontalOptions = LayoutOptions.Center }; - var button = new Button + // DatePicker + var datePickerButton = new Button { - Text = "Show picker" + Text = "Show DatePicker", + AutomationId = DatePickerButton }; - var picker = new DatePicker + var datePicker = new DatePicker { IsVisible = false }; - button.Clicked += (s, a) => + datePickerButton.Clicked += (s, a) => + { + Device.BeginInvokeOnMainThread(() => + { + if (datePicker.IsFocused) + datePicker.Unfocus(); + + datePicker.Focus(); + }); + }; + + // TimePicker + var timePickerButton = new Button + { + Text = "Show TimePicker", + AutomationId = TimePickerButton + }; + + var timePicker = new TimePicker + { + IsVisible = false + }; + + timePickerButton.Clicked += (s, a) => + { + Device.BeginInvokeOnMainThread(() => + { + if (timePicker.IsFocused) + timePicker.Unfocus(); + + timePicker.Focus(); + }); + }; + + // Picker + var pickerButton = new Button + { + Text = "Show Picker", + AutomationId = PickerButton + }; + + var picker = new Picker + { + IsVisible = false, + ItemsSource = _pickerValues + }; + + pickerButton.Clicked += (s, a) => { Device.BeginInvokeOnMainThread(() => { @@ -37,10 +101,57 @@ protected override void Init() }); }; - stackLayout.Children.Add(button); + stackLayout.Children.Add(datePickerButton); + stackLayout.Children.Add(datePicker); + + stackLayout.Children.Add(timePickerButton); + stackLayout.Children.Add(timePicker); + + stackLayout.Children.Add(pickerButton); stackLayout.Children.Add(picker); Content = stackLayout; } + +#if UITEST && __ANDROID__ + [Test] + [UiTest(typeof(DatePicker))] + public void InvisibleDatepickerShowsDialogOnFocus() + { + RunningApp.WaitForElement(DatePickerButton); + RunningApp.Screenshot("Issue 5159 page is showing in all it's glory"); + RunningApp.Tap(DatePickerButton); + + RunningApp.WaitForElement(x => x.Class("DatePicker")); + + RunningApp.Screenshot("DatePicker is shown"); + } + + [Test] + [UiTest(typeof(TimePicker))] + public void InvisibleTimepickerShowsDialogOnFocus() + { + RunningApp.WaitForElement(TimePickerButton); + RunningApp.Screenshot("Issue 5159 page is showing in all it's glory"); + RunningApp.Tap(TimePickerButton); + + RunningApp.WaitForElement(x => x.Class("timePicker")); + + RunningApp.Screenshot("TimePicker is shown"); + } + + [Test] + [UiTest(typeof(Picker))] + public void InvisiblePickerShowsDialogOnFocus() + { + RunningApp.WaitForElement(PickerButton); + RunningApp.Screenshot("Issue 5159 page is showing in all it's glory"); + RunningApp.Tap(PickerButton); + + RunningApp.WaitForElement("Foo"); + + RunningApp.Screenshot("Picker is shown"); + } +#endif } } diff --git a/Xamarin.Forms.Platform.Android/AppCompat/PickerRenderer.cs b/Xamarin.Forms.Platform.Android/AppCompat/PickerRenderer.cs index 0ae620026f1..e46ab893dc0 100644 --- a/Xamarin.Forms.Platform.Android/AppCompat/PickerRenderer.cs +++ b/Xamarin.Forms.Platform.Android/AppCompat/PickerRenderer.cs @@ -90,7 +90,12 @@ protected override void OnFocusChangeRequested(object sender, VisualElement.Focu base.OnFocusChangeRequested(sender, e); if (e.Focus) - CallOnClick(); + { + if (Clickable) + CallOnClick(); + else + ((IPickerRenderer)this)?.OnClick(); + } else if (_dialog != null) { _dialog.Hide(); diff --git a/Xamarin.Forms.Platform.Android/Renderers/DatePickerRenderer.cs b/Xamarin.Forms.Platform.Android/Renderers/DatePickerRenderer.cs index ee3afa129e5..be04ecb0068 100644 --- a/Xamarin.Forms.Platform.Android/Renderers/DatePickerRenderer.cs +++ b/Xamarin.Forms.Platform.Android/Renderers/DatePickerRenderer.cs @@ -98,7 +98,7 @@ protected override void OnFocusChangeRequested(object sender, VisualElement.Focu if (Clickable) CallOnClick(); else - OnClickHandler(); + ((IPickerRenderer)this)?.OnClick(); } else if (_dialog != null) { @@ -140,7 +140,7 @@ void DeviceInfoPropertyChanged(object sender, PropertyChangedEventArgs e) } } - void OnClickHandler() + void IPickerRenderer.OnClick() { if (_dialog != null && _dialog.IsShowing) { @@ -153,11 +153,6 @@ void OnClickHandler() ShowPickerDialog(view.Date.Year, view.Date.Month - 1, view.Date.Day); } - void IPickerRenderer.OnClick() - { - OnClickHandler(); - } - void ShowPickerDialog(int year, int month, int day) { _dialog = CreateDatePickerDialog(year, month, day); diff --git a/Xamarin.Forms.Platform.Android/Renderers/PickerRenderer.cs b/Xamarin.Forms.Platform.Android/Renderers/PickerRenderer.cs index 01818b7cdcf..4c0e2aab3f1 100644 --- a/Xamarin.Forms.Platform.Android/Renderers/PickerRenderer.cs +++ b/Xamarin.Forms.Platform.Android/Renderers/PickerRenderer.cs @@ -105,10 +105,10 @@ protected override void OnFocusChangeRequested(object sender, VisualElement.Focu if (e.Focus) { - if (Focusable) + if (Clickable) CallOnClick(); else - OnClickHandler(); + ((IPickerRenderer)this)?.OnClick(); } else if (_dialog != null) { @@ -118,7 +118,7 @@ protected override void OnFocusChangeRequested(object sender, VisualElement.Focu } } - void OnClickHandler() + void IPickerRenderer.OnClick() { Picker model = Element; @@ -185,11 +185,6 @@ void OnClickHandler() _dialog.Show(); } - void IPickerRenderer.OnClick() - { - OnClickHandler(); - } - void RowsCollectionChanged(object sender, EventArgs e) { UpdatePicker(); diff --git a/Xamarin.Forms.Platform.Android/Renderers/TimePickerRenderer.cs b/Xamarin.Forms.Platform.Android/Renderers/TimePickerRenderer.cs index 9f30e64ae1e..e0e25ccb793 100644 --- a/Xamarin.Forms.Platform.Android/Renderers/TimePickerRenderer.cs +++ b/Xamarin.Forms.Platform.Android/Renderers/TimePickerRenderer.cs @@ -87,10 +87,10 @@ protected override void OnFocusChangeRequested(object sender, VisualElement.Focu if (e.Focus) { - if (Focusable) + if (Clickable) CallOnClick(); else - OnClickHandler(); + ((IPickerRenderer)this)?.OnClick(); } else if (_dialog != null) { @@ -114,7 +114,7 @@ protected virtual TimePickerDialog CreateTimePickerDialog(int hours, int minutes return dialog; } - void OnClickHandler() + void IPickerRenderer.OnClick() { if (_dialog != null && _dialog.IsShowing) { @@ -128,11 +128,6 @@ void OnClickHandler() _dialog.Show(); } - void IPickerRenderer.OnClick() - { - OnClickHandler(); - } - void OnCancelButtonClicked(object sender, EventArgs e) { Element.Unfocus(); From 0d317b827e2a4b8b7dd0969356d4570ba01eed48 Mon Sep 17 00:00:00 2001 From: Gerald Versluis Date: Thu, 29 Aug 2019 15:42:47 +0200 Subject: [PATCH 03/10] Update Issue5159.cs --- .../Xamarin.Forms.Controls.Issues.Shared/Issue5159.cs | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Issue5159.cs b/Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Issue5159.cs index 1ebf9d3f9b5..e0a0b7dd204 100644 --- a/Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Issue5159.cs +++ b/Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Issue5159.cs @@ -151,6 +151,11 @@ public void InvisiblePickerShowsDialogOnFocus() RunningApp.WaitForElement("Foo"); RunningApp.Screenshot("Picker is shown"); + + RunningApp.Tap("Foo"); + + RunningApp.WaitForNoElement("Foo"); + } #endif } From 7f15aa247a913a88dd8dff0d8824f3cebeecfaca Mon Sep 17 00:00:00 2001 From: Gerald Versluis Date: Thu, 29 Aug 2019 20:51:12 +0200 Subject: [PATCH 04/10] Fixes #7311 --- .../Issue7311.cs | 55 +++++++++++++++++++ ...rin.Forms.Controls.Issues.Shared.projitems | 1 + .../PickerManager.cs | 6 +- 3 files changed, 59 insertions(+), 3 deletions(-) create mode 100644 Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Issue7311.cs diff --git a/Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Issue7311.cs b/Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Issue7311.cs new file mode 100644 index 00000000000..2fe44c23aca --- /dev/null +++ b/Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Issue7311.cs @@ -0,0 +1,55 @@ +using System; +using Xamarin.Forms.CustomAttributes; +using Xamarin.Forms.Internals; + +#if UITEST +using Xamarin.UITest; +using NUnit.Framework; +using Xamarin.UITest.iOS; +#endif + +namespace Xamarin.Forms.Controls.Issues +{ + [Preserve(AllMembers = true)] + [Issue(IssueTracker.Github, 7311, "[Bug] [Android] Error back hardware button with Picker", PlatformAffected.Android)] + public class Issue7311 : TestContentPage + { + const string FirstPickerItem = "Uno"; + const string PickerId = "CaptainPickard"; + readonly string[] _items = { FirstPickerItem, "Dos", "Tres" }; + + protected override void Init() + { + var picker = new Picker + { + HorizontalOptions = LayoutOptions.Center, + VerticalOptions = LayoutOptions.Center, + ItemsSource = _items, + AutomationId = PickerId + }; + + Content = picker; + } + +#if UITEST + [Test] + public void OpeningPickerPressingBackButtonTwiceShouldNotOpenPickerAgain() + { + RunningApp.WaitForElement(PickerId); + RunningApp.Tap(PickerId); + + RunningApp.WaitForElement(FirstPickerItem); + + RunningApp.Back(); + + RunningApp.WaitForNoElement(FirstPickerItem); + + RunningApp.Back(); + + RunningApp.WaitForNoElement(FirstPickerItem, "Picker is again visible after second back button press", TimeSpan.FromSeconds(10)); + + RunningApp.Screenshot("Back at the previous page, not showing the picker again"); + } +#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 13d3b4a7bb4..f53f1a6a314 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 @@ -1015,6 +1015,7 @@ + diff --git a/Xamarin.Forms.Platform.Android/PickerManager.cs b/Xamarin.Forms.Platform.Android/PickerManager.cs index 471494f45e9..aefbd7954a3 100644 --- a/Xamarin.Forms.Platform.Android/PickerManager.cs +++ b/Xamarin.Forms.Platform.Android/PickerManager.cs @@ -10,8 +10,8 @@ namespace Xamarin.Forms.Platform.Android { internal static class PickerManager { - readonly static HashSet availableKeys = new HashSet(new[] { - Keycode.Tab, Keycode.Forward, Keycode.Back, Keycode.DpadDown, Keycode.DpadLeft, Keycode.DpadRight, Keycode.DpadUp + readonly static HashSet AvailableKeys = new HashSet(new[] { + Keycode.Tab, Keycode.Forward, Keycode.DpadDown, Keycode.DpadLeft, Keycode.DpadRight, Keycode.DpadUp }); public static void Init(EditText editText) @@ -42,7 +42,7 @@ public static void OnFocusChanged(bool gainFocus, EditText sender, IPopupTrigger static void OnKeyPress(object sender, AView.KeyEventArgs e) { - if (!availableKeys.Contains(e.KeyCode)) + if (!AvailableKeys.Contains(e.KeyCode)) { e.Handled = false; return; From ca896f3fb77c9ed7234da398a26ed1b9a1431a66 Mon Sep 17 00:00:00 2001 From: Gerald Versluis Date: Mon, 2 Sep 2019 10:56:37 +0200 Subject: [PATCH 05/10] Test tweaks --- .../Xamarin.Forms.Controls.Issues.Shared/Issue5159.cs | 2 ++ .../Xamarin.Forms.Controls.Issues.Shared/Issue7311.cs | 2 +- 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Issue5159.cs b/Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Issue5159.cs index e0a0b7dd204..d7415c34109 100644 --- a/Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Issue5159.cs +++ b/Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Issue5159.cs @@ -125,6 +125,7 @@ public void InvisibleDatepickerShowsDialogOnFocus() RunningApp.WaitForElement(x => x.Class("DatePicker")); RunningApp.Screenshot("DatePicker is shown"); + RunningApp.TapCoordinates(5, 100); } [Test] @@ -138,6 +139,7 @@ public void InvisibleTimepickerShowsDialogOnFocus() RunningApp.WaitForElement(x => x.Class("timePicker")); RunningApp.Screenshot("TimePicker is shown"); + RunningApp.TapCoordinates(5, 100); } [Test] diff --git a/Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Issue7311.cs b/Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Issue7311.cs index 2fe44c23aca..40c295c9811 100644 --- a/Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Issue7311.cs +++ b/Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Issue7311.cs @@ -31,7 +31,7 @@ protected override void Init() Content = picker; } -#if UITEST +#if UITEST && __ANDROID__ [Test] public void OpeningPickerPressingBackButtonTwiceShouldNotOpenPickerAgain() { From 06c1172d2501ec533cdf5b1eabafa1d402687980 Mon Sep 17 00:00:00 2001 From: Gerald Versluis Date: Fri, 20 Sep 2019 18:32:01 +0200 Subject: [PATCH 06/10] Update TimePickerRenderer.cs --- .../Renderers/TimePickerRenderer.cs | 28 ++++++++++++++++--- 1 file changed, 24 insertions(+), 4 deletions(-) diff --git a/Xamarin.Forms.Platform.Android/Renderers/TimePickerRenderer.cs b/Xamarin.Forms.Platform.Android/Renderers/TimePickerRenderer.cs index e0e25ccb793..d51bad18c16 100644 --- a/Xamarin.Forms.Platform.Android/Renderers/TimePickerRenderer.cs +++ b/Xamarin.Forms.Platform.Android/Renderers/TimePickerRenderer.cs @@ -16,6 +16,8 @@ public abstract class TimePickerRendererBase : ViewRenderer Date: Fri, 20 Sep 2019 21:00:48 +0200 Subject: [PATCH 07/10] Revert "Update TimePickerRenderer.cs" This reverts commit 06c1172d2501ec533cdf5b1eabafa1d402687980. --- .../Renderers/TimePickerRenderer.cs | 28 +++---------------- 1 file changed, 4 insertions(+), 24 deletions(-) diff --git a/Xamarin.Forms.Platform.Android/Renderers/TimePickerRenderer.cs b/Xamarin.Forms.Platform.Android/Renderers/TimePickerRenderer.cs index d51bad18c16..e0e25ccb793 100644 --- a/Xamarin.Forms.Platform.Android/Renderers/TimePickerRenderer.cs +++ b/Xamarin.Forms.Platform.Android/Renderers/TimePickerRenderer.cs @@ -16,8 +16,6 @@ public abstract class TimePickerRendererBase : ViewRenderer Date: Fri, 20 Sep 2019 21:12:59 +0200 Subject: [PATCH 08/10] Update TimePickerRenderer.cs --- .../Renderers/TimePickerRenderer.cs | 20 +++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/Xamarin.Forms.Platform.Android/Renderers/TimePickerRenderer.cs b/Xamarin.Forms.Platform.Android/Renderers/TimePickerRenderer.cs index e0e25ccb793..be717fa852a 100644 --- a/Xamarin.Forms.Platform.Android/Renderers/TimePickerRenderer.cs +++ b/Xamarin.Forms.Platform.Android/Renderers/TimePickerRenderer.cs @@ -16,6 +16,7 @@ public abstract class TimePickerRendererBase : ViewRenderer Date: Sun, 22 Sep 2019 20:25:47 +0200 Subject: [PATCH 09/10] Update TimePickerRenderer.cs --- Xamarin.Forms.Platform.Android/Renderers/TimePickerRenderer.cs | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/Xamarin.Forms.Platform.Android/Renderers/TimePickerRenderer.cs b/Xamarin.Forms.Platform.Android/Renderers/TimePickerRenderer.cs index be717fa852a..1ce033e38e9 100644 --- a/Xamarin.Forms.Platform.Android/Renderers/TimePickerRenderer.cs +++ b/Xamarin.Forms.Platform.Android/Renderers/TimePickerRenderer.cs @@ -101,6 +101,7 @@ protected override void OnFocusChangeRequested(object sender, VisualElement.Focu if (Forms.IsLollipopOrNewer) _dialog.CancelEvent -= OnCancelButtonClicked; + _dialog?.Dispose(); _dialog = null; } } @@ -124,7 +125,7 @@ protected override void Dispose(bool disposing) if (disposing) { - if (Forms.IsLollipopOrNewer && _dialog != null) + if (Forms.IsLollipopOrNewer && _dialog.IsAlive()) _dialog.CancelEvent -= OnCancelButtonClicked; _dialog?.Dispose(); From b6ef31822e96523f7b09b689f3b89d05ae5fa6ce Mon Sep 17 00:00:00 2001 From: shane Date: Thu, 26 Sep 2019 23:17:28 -0600 Subject: [PATCH 10/10] - added instructions --- .../Issue7311.cs | 14 +++++++++++--- 1 file changed, 11 insertions(+), 3 deletions(-) diff --git a/Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Issue7311.cs b/Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Issue7311.cs index 40c295c9811..6f3ce3e42bc 100644 --- a/Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Issue7311.cs +++ b/Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Issue7311.cs @@ -22,13 +22,21 @@ protected override void Init() { var picker = new Picker { - HorizontalOptions = LayoutOptions.Center, - VerticalOptions = LayoutOptions.Center, ItemsSource = _items, AutomationId = PickerId }; - Content = picker; + Content = new StackLayout() + { + Children = + { + new Label() + { + Text = "Open Picker. Click hardware back button to close picker. Click hardware button a second time and it should navigate back to gallery" + }, + picker + } + }; } #if UITEST && __ANDROID__