--- /dev/null
+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
+ {
+ VerticalOptions = LayoutOptions.Center,
+ HorizontalOptions = LayoutOptions.Center
+ };
+
+ // DatePicker
+ var datePickerButton = new Button
+ {
+ Text = "Show DatePicker",
+ AutomationId = DatePickerButton
+ };
+
+ var datePicker = new DatePicker
+ {
+ IsVisible = false
+ };
+
+ 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(() =>
+ {
+ if (picker.IsFocused)
+ picker.Unfocus();
+
+ picker.Focus();
+ });
+ };
+
+ 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");
+ RunningApp.TapCoordinates(5, 100);
+ }
+
+ [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");
+ RunningApp.TapCoordinates(5, 100);
+ }
+
+ [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");
+
+ RunningApp.Tap("Foo");
+
+ RunningApp.WaitForNoElement("Foo");
+
+ }
+#endif
+ }
+}
--- /dev/null
+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
+ {
+ ItemsSource = _items,
+ AutomationId = PickerId
+ };
+
+ 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__
+ [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