Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
45 changes: 45 additions & 0 deletions src/Controls/tests/TestCases.HostApp/Issues/Issue32886.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,45 @@
namespace Maui.Controls.Sample.Issues;

[Issue(IssueTracker.Github, 32886, "[Android, iOS, Mac] Entry ClearButton not visible on dark theme", PlatformAffected.Android | PlatformAffected.iOS | PlatformAffected.macOS)]
public class Issue32886 : TestContentPage
{
protected override void Init()
{
Title = "Issue32886";

// Create the UITestEntry with ClearButtonVisibility
var entry = new UITestEntry
{
Text = "Entry Text",
IsCursorVisible = false,
IsSpellCheckEnabled = false,
IsTextPredictionEnabled = false,
AutomationId = "TestEntry",
ClearButtonVisibility = ClearButtonVisibility.WhileEditing
};

var button = new Button
{
Text = "Change theme",
AutomationId = "ThemeButton"
};
button.Clicked += Button_Clicked;

var layout = new VerticalStackLayout();
layout.Children.Add(entry);
layout.Children.Add(button);

Content = layout;

// Set background color based on app theme
this.SetAppThemeColor(BackgroundColorProperty, Colors.White, Colors.Black);
}

private void Button_Clicked(object sender, EventArgs e)
{
if (Application.Current is not null)
{
Application.Current.UserAppTheme = Application.Current.UserAppTheme != AppTheme.Dark ? AppTheme.Dark : AppTheme.Light;
}
}
}
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Original file line number Diff line number Diff line change
@@ -0,0 +1,55 @@
using NUnit.Framework;
using UITest.Appium;
using UITest.Core;

namespace Microsoft.Maui.TestCases.Tests.Issues;

public class Issue32886 : _IssuesUITest
{
public Issue32886(TestDevice device) : base(device)
{
}

public override string Issue => "[Android, iOS, Mac] Entry ClearButton not visible on dark theme";

[Test, Order(1)]
[Category(UITestCategories.Entry)]
public void EntryClearButtonShouldBeVisibleOnLightTheme()
{
App.WaitForElement("TestEntry");
App.Tap("TestEntry");
#if ANDROID // On Android, to address CI flakiness, the keyboard is dismissed.
if (App.WaitForKeyboardToShow(timeout: TimeSpan.FromSeconds(1)))
{
App.DismissKeyboard();
}
#endif

#if IOS
// On iOS, the virtual keyboard appears inconsistent with keyboard characters casing, can cause flaky test results. As this test verifying only the entry clear button color, crop the bottom portion of the screenshot to exclude the keyboard.
// Using DismissKeyboard() would unfocus the control in iOS, so we're using cropping instead to maintain focus during testing.
VerifyScreenshot(cropBottom: 1550);
#else
VerifyScreenshot();
#endif
}

[Test, Order(2)]
[Category(UITestCategories.Entry)]
public void EntryClearButtonShouldBeVisibleOnDarkTheme()
{
App.WaitForElement("TestEntry");
App.Tap("ThemeButton");
#if WINDOWS // On Windows, the clear button isn't visible when Entry loses focus, so manually focused to check its icon color.
App.Tap("TestEntry");
#endif

#if IOS
// On iOS, the virtual keyboard appears inconsistent with keyboard characters casing, can cause flaky test results. As this test verifying only the entry clear button color, crop the bottom portion of the screenshot to exclude the keyboard.
// Using DismissKeyboard() would unfocus the control in iOS, so we're using cropping instead to maintain focus during testing.
VerifyScreenshot(cropBottom: 1550);
#else
VerifyScreenshot();
#endif
}
}
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
18 changes: 17 additions & 1 deletion src/Core/src/Platform/Android/EditTextExtensions.cs
Original file line number Diff line number Diff line change
Expand Up @@ -231,7 +231,23 @@ internal static void UpdateClearButtonColor(this EditText editText, Graphics.Col
}
else
{
clearButtonDrawable?.ClearColorFilter();
if (OperatingSystem.IsAndroidVersionAtLeast(23) && editText.Context?.Theme is Resources.Theme theme)
{
using var ta = theme.ObtainStyledAttributes([global::Android.Resource.Attribute.TextColorPrimary]);
var cs = ta.GetColorStateList(0);

if (cs is not null)
{
// Clear button is only visible when enabled, so just use the enabled state
int[] enabledState = [global::Android.Resource.Attribute.StateEnabled];
var color = new global::Android.Graphics.Color(cs.GetColorForState(enabledState, Colors.Black.ToPlatform()));
clearButtonDrawable?.SetColorFilter(color, FilterMode.SrcIn);
}
}
else
{
clearButtonDrawable?.ClearColorFilter();
}
}
}

Expand Down
4 changes: 2 additions & 2 deletions src/Core/src/Platform/iOS/TextFieldExtensions.cs
Original file line number Diff line number Diff line change
Expand Up @@ -208,8 +208,8 @@ internal static void UpdateClearButtonColor(this UITextField textField, IEntry e

if (entry.TextColor is null)
{
clearButton.SetImage(defaultClearImage, UIControlState.Normal);
clearButton.SetImage(defaultClearImage, UIControlState.Highlighted);
// Setting TintColor to null allows the system to automatically apply the appropriate color based on the current theme (light or dark mode)
clearButton.TintColor = null;
}
else
{
Expand Down
Loading