From c2421e65debc189cdbc240fa576f4642e38ba4f4 Mon Sep 17 00:00:00 2001 From: Jakub Florkowski Date: Sat, 17 May 2025 02:19:55 +0200 Subject: [PATCH 1/3] [Android] The number of SearchHandler toolbar item increases abnormally - fix --- .../Shell/Android/ShellToolbarTracker.cs | 21 +++++++++++++++++-- 1 file changed, 19 insertions(+), 2 deletions(-) diff --git a/src/Controls/src/Core/Compatibility/Handlers/Shell/Android/ShellToolbarTracker.cs b/src/Controls/src/Core/Compatibility/Handlers/Shell/Android/ShellToolbarTracker.cs index 657b53f23e2b..404dcc4c24ee 100644 --- a/src/Controls/src/Core/Compatibility/Handlers/Shell/Android/ShellToolbarTracker.cs +++ b/src/Controls/src/Core/Compatibility/Handlers/Shell/Android/ShellToolbarTracker.cs @@ -136,7 +136,7 @@ public Color TintColor _tintColor = value; if (Page != null) { - UpdateToolbarItems(); + UpdateToolbarItemsTintColors(); UpdateLeftBarButtonItem(); } } @@ -628,9 +628,21 @@ protected virtual void UpdateTitleView(Context context, AToolbar toolbar, View t _toolbar.Handler?.UpdateValue(nameof(Toolbar.TitleView)); } + private void UpdateToolbarItemsTintColors(AToolbar toolbar) + { + var menu = toolbar.Menu; + int _placeholderMenuItemId = 100; + if (menu.FindItem(_placeholderMenuItemId) is IMenuItem item) + { + using (var icon = item.Icon) + icon.SetColorFilter(TintColor.ToPlatform(Colors.White), FilterMode.SrcAtop); + } + } + protected virtual void UpdateToolbarItems(AToolbar toolbar, Page page) { var menu = toolbar.Menu; + int _placeholderMenuItemId = 100; SearchHandler = Shell.GetSearchHandler(page); if (SearchHandler != null && SearchHandler.SearchBoxVisibility != SearchBoxVisibility.Hidden) { @@ -650,7 +662,7 @@ protected virtual void UpdateToolbarItems(AToolbar toolbar, Page page) if (SearchHandler.SearchBoxVisibility == SearchBoxVisibility.Collapsible) { var placeholder = new Java.Lang.String(SearchHandler.Placeholder); - var item = menu.Add(placeholder); + var item = menu.Add(0, _placeholderMenuItemId, 0, placeholder); placeholder.Dispose(); item.SetEnabled(SearchHandler.IsSearchEnabled); @@ -725,6 +737,11 @@ void UpdateToolbarItems() UpdateToolbarItems(_platformToolbar, Page); } + void UpdateToolbarItemsTintColors() + { + UpdateToolbarItemsTintColors(_platformToolbar); + } + class FlyoutIconDrawerDrawable : DrawerArrowDrawable { public Drawable IconBitmap { get; set; } From 2b834f742c10cde1286bc0848d6de6ce594b3dc3 Mon Sep 17 00:00:00 2001 From: Jakub Florkowski Date: Sat, 17 May 2025 03:01:39 +0200 Subject: [PATCH 2/3] Added a UI test --- .../TestCases.HostApp/Issues/Issue29499.cs | 59 +++++++++++++++++++ .../Tests/Issues/Issue29499.cs | 27 +++++++++ 2 files changed, 86 insertions(+) create mode 100644 src/Controls/tests/TestCases.HostApp/Issues/Issue29499.cs create mode 100644 src/Controls/tests/TestCases.Shared.Tests/Tests/Issues/Issue29499.cs diff --git a/src/Controls/tests/TestCases.HostApp/Issues/Issue29499.cs b/src/Controls/tests/TestCases.HostApp/Issues/Issue29499.cs new file mode 100644 index 000000000000..b9fab65f1411 --- /dev/null +++ b/src/Controls/tests/TestCases.HostApp/Issues/Issue29499.cs @@ -0,0 +1,59 @@ +namespace Maui.Controls.Sample.Issues; + +[Issue(IssueTracker.Github, 29499, "[Android] The number of SearchHandler toolbar item increases abnormally", PlatformAffected.Android)] +public class Issue29499 : Shell +{ + public Issue29499() + { + Routing.RegisterRoute(nameof(Issue29499Subpage), typeof(Issue29499Subpage)); + Items.Add(new Issue29499Page()); + } + + public class Issue29499Page : ContentPage + { + public Issue29499Page() + { + SetForegroundColor(this, Colors.Red); + ToolbarItems.Add(new ToolbarItem { Text = "Item1", Order = ToolbarItemOrder.Secondary }); + ToolbarItems.Add(new ToolbarItem { Text = "Item2", Order = ToolbarItemOrder.Secondary }); + ToolbarItems.Add(new ToolbarItem { Text = "Item3", Order = ToolbarItemOrder.Secondary }); + ToolbarItems.Add(new ToolbarItem { Text = "Item4", Order = ToolbarItemOrder.Secondary }); + SetSearchHandler(this, new MainSearchHandler { SearchBoxVisibility = SearchBoxVisibility.Collapsible }); + Content = new Button + { + Text = "Go to subpage page", + AutomationId = "GotoIssue29499Subpage", + Command = new Command(async () => + { + await Current.GoToAsync(nameof(Issue29499Subpage)); + }) + }; + } + + public class MainSearchHandler : SearchHandler { } + } + + public class Issue29499Subpage : ContentPage + { + public Issue29499Subpage() + { + Content = new StackLayout + { + Children = + { + new Button + { + Text = "Go back", + AutomationId = "GoBackButton", + Command = new Command(async () => + { + await Current.GoToAsync(".."); + }) + }, + } + }; + } + } +} + + diff --git a/src/Controls/tests/TestCases.Shared.Tests/Tests/Issues/Issue29499.cs b/src/Controls/tests/TestCases.Shared.Tests/Tests/Issues/Issue29499.cs new file mode 100644 index 000000000000..e6a42d707194 --- /dev/null +++ b/src/Controls/tests/TestCases.Shared.Tests/Tests/Issues/Issue29499.cs @@ -0,0 +1,27 @@ +#if ANDROID +using NUnit.Framework; +using UITest.Appium; +using UITest.Core; + +namespace Microsoft.Maui.TestCases.Tests.Issues; + +public class Issue29499 : _IssuesUITest +{ + public Issue29499(TestDevice testDevice) : base(testDevice) { } + + public override string Issue => "[Android] The number of SearchHandler toolbar item increases abnormally"; + + [Test] + [Category(UITestCategories.SearchBar)] + public void NumberOfToolbarItemsShouldNotIncrease() + { + App.WaitForElement("GotoIssue29499Subpage"); + App.Click("GotoIssue29499Subpage"); + App.WaitForElement("GoBackButton"); + App.Click("GoBackButton"); + App.WaitForElement("GotoIssue29499Subpage"); + ((AppiumApp)App).Driver.FindElement(OpenQA.Selenium.By.XPath("//*[@content-desc=\"More options\"]")).Click(); + VerifyScreenshot(); + } +} +#endif \ No newline at end of file From 3031b3f748a40781ea9c65c4efee302b0fd0be12 Mon Sep 17 00:00:00 2001 From: Jakub Florkowski Date: Wed, 21 May 2025 00:44:52 +0200 Subject: [PATCH 3/3] Create NumberOfToolbarItemsShouldNotIncrease.png --- .../NumberOfToolbarItemsShouldNotIncrease.png | Bin 0 -> 33323 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 src/Controls/tests/TestCases.Android.Tests/snapshots/android/NumberOfToolbarItemsShouldNotIncrease.png diff --git a/src/Controls/tests/TestCases.Android.Tests/snapshots/android/NumberOfToolbarItemsShouldNotIncrease.png b/src/Controls/tests/TestCases.Android.Tests/snapshots/android/NumberOfToolbarItemsShouldNotIncrease.png new file mode 100644 index 0000000000000000000000000000000000000000..ab9a37617a126963b53d51c02c687d3ef2017b0a GIT binary patch literal 33323 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 H{}2BH?mWnj literal 0 HcmV?d00001