From eb2a2177b3761efbc9b6563d4621ab4a19300837 Mon Sep 17 00:00:00 2001 From: "E.Z. Hart" Date: Fri, 23 Jun 2017 18:29:38 -0600 Subject: Fix NRE when background color of button set in FormsApplicationActivity (#1010) --- .../ButtonBackgroundColorTest.cs | 46 ++++++++++++++++++++++ .../Xamarin.Forms.Controls.Issues.Shared.projitems | 1 + .../AppCompat/ButtonRenderer.cs | 2 +- .../Renderers/ButtonRenderer.cs | 12 +++--- 4 files changed, 55 insertions(+), 6 deletions(-) create mode 100644 Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/ButtonBackgroundColorTest.cs diff --git a/Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/ButtonBackgroundColorTest.cs b/Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/ButtonBackgroundColorTest.cs new file mode 100644 index 00000000..b366efce --- /dev/null +++ b/Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/ButtonBackgroundColorTest.cs @@ -0,0 +1,46 @@ +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.Button)] +#endif + + [Preserve(AllMembers = true)] + [Issue(IssueTracker.Bugzilla, 57717, "Setting background color on Button in Android FormsApplicationActivity causes NRE", PlatformAffected.Android)] + public class ButtonBackgroundColorTest : TestContentPage + { + const string ButtonText = "I am a button"; + + protected override void Init() + { + var layout = new StackLayout(); + + var instructions = new Label { Text = "If you can see this, the test has passed." }; + + var button = new Button { Text = ButtonText, BackgroundColor = Color.CornflowerBlue }; + + layout.Children.Add(instructions); + layout.Children.Add(button); + + Content = layout; + } + +#if UITEST + [Test] + public void ButtonBackgroundColorAutomatedTest() + { + // With the original bug in place, we'll crash before we get this far + RunningApp.WaitForElement(ButtonText); + } +#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 37e3fc88..d11a4c61 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 @@ -213,6 +213,7 @@ + diff --git a/Xamarin.Forms.Platform.Android/AppCompat/ButtonRenderer.cs b/Xamarin.Forms.Platform.Android/AppCompat/ButtonRenderer.cs index e7e9a3bf..9f336a24 100644 --- a/Xamarin.Forms.Platform.Android/AppCompat/ButtonRenderer.cs +++ b/Xamarin.Forms.Platform.Android/AppCompat/ButtonRenderer.cs @@ -140,7 +140,7 @@ namespace Xamarin.Forms.Platform.Android.AppCompat if (Element == null || Control == null) return; - _backgroundTracker.UpdateBackgroundColor(); + _backgroundTracker?.UpdateBackgroundColor(); } void UpdateAll() diff --git a/Xamarin.Forms.Platform.Android/Renderers/ButtonRenderer.cs b/Xamarin.Forms.Platform.Android/Renderers/ButtonRenderer.cs index da4ec0ba..0aac4edb 100644 --- a/Xamarin.Forms.Platform.Android/Renderers/ButtonRenderer.cs +++ b/Xamarin.Forms.Platform.Android/Renderers/ButtonRenderer.cs @@ -96,13 +96,12 @@ namespace Xamarin.Forms.Platform.Android _textColorSwitcher = new TextColorSwitcher(button.TextColors); button.AddOnAttachStateChangeListener(this); } - if (_backgroundTracker == null) - _backgroundTracker = new ButtonBackgroundTracker(Element, Control); } + + if (_backgroundTracker == null) + _backgroundTracker = new ButtonBackgroundTracker(Element, Control); else - { _backgroundTracker.Button = e.NewElement; - } UpdateAll(); } @@ -127,7 +126,10 @@ namespace Xamarin.Forms.Platform.Android protected override void UpdateBackgroundColor() { - _backgroundTracker.UpdateBackgroundColor(); + if (Element == null || Control == null) + return; + + _backgroundTracker?.UpdateBackgroundColor(); } void UpdateAll() -- cgit v1.2.3