From d44396a4534b1e2bc81143c809e4adaee656ab15 Mon Sep 17 00:00:00 2001 From: Paul DiPietro Date: Thu, 16 Jun 2016 13:51:16 -0400 Subject: [PATCH] [Android] DatePicker unfocuses on cancel (#204) The DatePicker in Android would remain focused when being closed via the cancel button, and a subsequent re-focus via something such as button would not function as expected. --- .../Bugzilla41424.cs | 61 ++++++++++++++++++++++ .../Xamarin.Forms.Controls.Issues.Shared.projitems | 1 + .../Renderers/DatePickerRenderer.cs | 11 ++++ 3 files changed, 73 insertions(+) create mode 100644 Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Bugzilla41424.cs diff --git a/Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Bugzilla41424.cs b/Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Bugzilla41424.cs new file mode 100644 index 0000000..8738696 --- /dev/null +++ b/Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Bugzilla41424.cs @@ -0,0 +1,61 @@ +using System; + +using Xamarin.Forms.CustomAttributes; +using Xamarin.Forms.Internals; + +#if UITEST +using Xamarin.UITest; +using NUnit.Framework; +#endif + +namespace Xamarin.Forms.Controls +{ + [Preserve(AllMembers = true)] + [Issue(IssueTracker.Bugzilla, 41424, "[Android] Clicking cancel on a DatePicker does not cause it to unfocus", PlatformAffected.Android)] + public class Bugzilla41424 : TestContentPage + { + const string DatePicker = "DatePicker"; + + protected override void Init() + { + var datePicker = new DatePicker + { + AutomationId = DatePicker + }; + var datePickerFocusButton = new Button + { + Text = "Click to focus DatePicker", + Command = new Command(() => datePicker.Focus()) + }; + Content = new StackLayout + { + Children = + { + datePicker, + datePickerFocusButton + } + }; + } + +#if UITEST + +#if __ANDROID__ + [Test] + public void DatePickerCancelShouldUnfocus() + { + RunningApp.Tap(q => q.Marked(DatePicker)); + RunningApp.WaitForElement(q => q.Marked("Cancel")); + + RunningApp.Tap(q => q.Marked("Cancel")); + RunningApp.WaitForElement(q => q.Marked("Click to focus DatePicker")); + + RunningApp.Tap(q => q.Marked("Click to focus DatePicker")); + RunningApp.WaitForElement(q => q.Marked("Cancel")); + + RunningApp.Tap(q => q.Marked("Cancel")); + } +#endif + +#endif + } +} 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 1e9d1ea..c857bbb 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 @@ -106,6 +106,7 @@ + diff --git a/Xamarin.Forms.Platform.Android/Renderers/DatePickerRenderer.cs b/Xamarin.Forms.Platform.Android/Renderers/DatePickerRenderer.cs index 5b0e099..328336f 100644 --- a/Xamarin.Forms.Platform.Android/Renderers/DatePickerRenderer.cs +++ b/Xamarin.Forms.Platform.Android/Renderers/DatePickerRenderer.cs @@ -31,6 +31,7 @@ namespace Xamarin.Forms.Platform.Android _disposed = true; if (_dialog != null) { + _dialog.CancelEvent -= OnCancelButtonClicked; _dialog.Hide(); _dialog.Dispose(); _dialog = null; @@ -84,6 +85,7 @@ namespace Xamarin.Forms.Platform.Android _dialog.Hide(); ((IElementController)Element).SetValueFromRenderer(VisualElement.IsFocusedPropertyKey, false); Control.ClearFocus(); + _dialog.CancelEvent -= OnCancelButtonClicked; _dialog = null; } } @@ -96,6 +98,8 @@ namespace Xamarin.Forms.Platform.Android view.Date = e.Date; ((IElementController)view).SetValueFromRenderer(VisualElement.IsFocusedPropertyKey, false); Control.ClearFocus(); + + _dialog.CancelEvent -= OnCancelButtonClicked; _dialog = null; }, year, month, day); } @@ -123,9 +127,16 @@ namespace Xamarin.Forms.Platform.Android UpdateMinimumDate(); UpdateMaximumDate(); + + _dialog.CancelEvent += OnCancelButtonClicked; _dialog.Show(); } + void OnCancelButtonClicked(object sender, EventArgs e) + { + Element.Unfocus(); + } + void SetDate(DateTime date) { Control.Text = date.ToString(Element.Format); -- 2.7.4