[Android] Fix Entry password visibility when using Keyboard.Password - #36280
Conversation
|
🚀 Dogfood this PR with:
curl -fsSL https://raw.githubusercontent.com/dotnet/maui/main/eng/scripts/get-maui-pr.sh | bash -s -- 36280Or
iex "& { $(irm https://raw.githubusercontent.com/dotnet/maui/main/eng/scripts/get-maui-pr.ps1) } 36280" |
|
Hey there @@jpd21122012! Thank you so much for your PR! Someone from the team will get assigned to your PR shortly and we'll get it reviewed. |
|
Hey there @jpd21122012! Thank you so much for your PR! Someone from the team will get assigned to your PR shortly and we'll get it reviewed. |
There was a problem hiding this comment.
Pull request overview
Fixes Android Entry behavior where Keyboard.Password effectively forced password-style obscuring even after Entry.IsPassword was toggled to false, by explicitly clearing password variation flags when IsPassword is not set.
Changes:
- When
IEntry.IsPassword == false, clearTextVariationPasswordandNumberVariationPasswordfrom the nativeEditText.InputTypeso password obscuring no longer persists. - Keeps
IEntry.IsPasswordas the controlling source of truth for password visibility on Android.
Co-authored-by: Frédéric Delaporte <12201973+fredericDelaporte@users.noreply.github.com>
…=false and runtime IsPassword toggling.
…ttps://github.com/jpd21122012/maui into fix/35650-KeyboardPasswordForceIsPassword-Android
Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com>
This comment has been minimized.
This comment has been minimized.
MauiBot
left a comment
There was a problem hiding this comment.
Expert Review — 1 findings
See inline comments for details.
Add Android Entry keyboard variation regression coverage
MauiBot
left a comment
There was a problem hiding this comment.
AI Review Summary
@jpd21122012 — new AI review results are available based on this last commit:
a783d6f. To request a fresh review after new comments or commits, comment/review rerun.
🗂️ Review Sessions — click to expand
🚦 Gate — Test Before & After Fix
Gate Result: ✅ PASSED
Platform: ANDROID · Base: main · Merge base: fa1d0d2d
| Test | Without Fix (expect FAIL) | With Fix (expect PASS) |
|---|---|---|
📱 EntryTests (KeyboardPasswordDoesNotForcePasswordVisibilityWhenIsPasswordIsFalse, KeyboardPasswordRespectsIsPasswordToggle) Category=Entry |
✅ FAIL — 1390s | ✅ PASS — 242s |
🔴 Without fix — 📱 EntryTests (KeyboardPasswordDoesNotForcePasswordVisibilityWhenIsPasswordIsFalse, KeyboardPasswordRespectsIsPasswordToggle): FAIL ✅ · 1390s
(truncated to last 15,000 chars)
[120/133] System.Threading.Tasks.dll -> System.Threading.Tasks.dll.so
[47/133] Xamarin.AndroidX.Loader.dll -> Xamarin.AndroidX.Loader.dll.so
[121/133] System.Threading.Thread.dll -> System.Threading.Thread.dll.so
[48/133] Xamarin.AndroidX.Navigation.Common.Android.dll -> Xamarin.AndroidX.Navigation.Common.Android.dll.so
[122/133] System.Text.Json.dll -> System.Text.Json.dll.so
[123/133] System.Threading.ThreadPool.dll -> System.Threading.ThreadPool.dll.so
[124/133] System.Threading.dll -> System.Threading.dll.so
[125/133] System.Xml.Linq.dll -> System.Xml.Linq.dll.so
[49/133] Xamarin.AndroidX.Navigation.Fragment.dll -> Xamarin.AndroidX.Navigation.Fragment.dll.so
[126/133] System.Xml.ReaderWriter.dll -> System.Xml.ReaderWriter.dll.so
[127/133] System.Xml.XDocument.dll -> System.Xml.XDocument.dll.so
[50/133] Xamarin.AndroidX.Navigation.Runtime.Android.dll -> Xamarin.AndroidX.Navigation.Runtime.Android.dll.so
[128/133] System.dll -> System.dll.so
[129/133] netstandard.dll -> netstandard.dll.so
[51/133] Xamarin.AndroidX.Navigation.UI.dll -> Xamarin.AndroidX.Navigation.UI.dll.so
[130/133] Mono.Android.Runtime.dll -> Mono.Android.Runtime.dll.so
[52/133] Xamarin.AndroidX.RecyclerView.dll -> Xamarin.AndroidX.RecyclerView.dll.so
[131/133] Java.Interop.dll -> Java.Interop.dll.so
[53/133] Xamarin.AndroidX.SavedState.SavedState.Android.dll -> Xamarin.AndroidX.SavedState.SavedState.Android.dll.so
[54/133] Xamarin.AndroidX.SwipeRefreshLayout.dll -> Xamarin.AndroidX.SwipeRefreshLayout.dll.so
[55/133] Xamarin.AndroidX.ViewPager.dll -> Xamarin.AndroidX.ViewPager.dll.so
[56/133] Xamarin.AndroidX.ViewPager2.dll -> Xamarin.AndroidX.ViewPager2.dll.so
[57/133] Xamarin.Google.Android.Material.dll -> Xamarin.Google.Android.Material.dll.so
[58/133] Xamarin.GooglePlayServices.Base.dll -> Xamarin.GooglePlayServices.Base.dll.so
[132/133] Mono.Android.dll -> Mono.Android.dll.so
[59/133] Xamarin.GooglePlayServices.Basement.dll -> Xamarin.GooglePlayServices.Basement.dll.so
[60/133] Xamarin.GooglePlayServices.Maps.dll -> Xamarin.GooglePlayServices.Maps.dll.so
[61/133] Xamarin.GooglePlayServices.Tasks.dll -> Xamarin.GooglePlayServices.Tasks.dll.so
[62/133] Xamarin.Kotlin.StdLib.dll -> Xamarin.Kotlin.StdLib.dll.so
[63/133] Xamarin.KotlinX.Coroutines.Core.Jvm.dll -> Xamarin.KotlinX.Coroutines.Core.Jvm.dll.so
[64/133] Xamarin.KotlinX.Serialization.Core.Jvm.dll -> Xamarin.KotlinX.Serialization.Core.Jvm.dll.so
[65/133] xunit.abstractions.dll -> xunit.abstractions.dll.so
[66/133] xunit.assert.dll -> xunit.assert.dll.so
[67/133] xunit.core.dll -> xunit.core.dll.so
[68/133] xunit.execution.dotnet.dll -> xunit.execution.dotnet.dll.so
[69/133] xunit.runner.utility.netcoreapp10.dll -> xunit.runner.utility.netcoreapp10.dll.so
[133/133] System.Private.CoreLib.dll -> System.Private.CoreLib.dll.so
[70/133] System.Collections.Concurrent.dll -> System.Collections.Concurrent.dll.so
[71/133] System.Collections.Immutable.dll -> System.Collections.Immutable.dll.so
[72/133] System.Collections.NonGeneric.dll -> System.Collections.NonGeneric.dll.so
[73/133] System.Collections.Specialized.dll -> System.Collections.Specialized.dll.so
[74/133] System.Collections.dll -> System.Collections.dll.so
[75/133] System.ComponentModel.Primitives.dll -> System.ComponentModel.Primitives.dll.so
[76/133] System.ComponentModel.TypeConverter.dll -> System.ComponentModel.TypeConverter.dll.so
[77/133] System.ComponentModel.dll -> System.ComponentModel.dll.so
[78/133] System.Console.dll -> System.Console.dll.so
[79/133] System.Diagnostics.Debug.dll -> System.Diagnostics.Debug.dll.so
[80/133] System.Diagnostics.DiagnosticSource.dll -> System.Diagnostics.DiagnosticSource.dll.so
[81/133] System.Diagnostics.Process.dll -> System.Diagnostics.Process.dll.so
[82/133] System.Diagnostics.Tools.dll -> System.Diagnostics.Tools.dll.so
[83/133] System.Diagnostics.TraceSource.dll -> System.Diagnostics.TraceSource.dll.so
[84/133] System.Diagnostics.Tracing.dll -> System.Diagnostics.Tracing.dll.so
[85/133] System.Drawing.Primitives.dll -> System.Drawing.Primitives.dll.so
[86/133] System.Drawing.dll -> System.Drawing.dll.so
[87/133] System.Formats.Asn1.dll -> System.Formats.Asn1.dll.so
[88/133] System.Globalization.dll -> System.Globalization.dll.so
[89/133] System.IO.Compression.Brotli.dll -> System.IO.Compression.Brotli.dll.so
[90/133] System.IO.Compression.dll -> System.IO.Compression.dll.so
[91/133] System.IO.FileSystem.dll -> System.IO.FileSystem.dll.so
[92/133] System.IO.Pipelines.dll -> System.IO.Pipelines.dll.so
[93/133] System.IO.dll -> System.IO.dll.so
[94/133] System.Linq.Expressions.dll -> System.Linq.Expressions.dll.so
[95/133] System.Linq.dll -> System.Linq.dll.so
[96/133] System.Memory.dll -> System.Memory.dll.so
[97/133] System.Net.Http.dll -> System.Net.Http.dll.so
[98/133] System.Net.NameResolution.dll -> System.Net.NameResolution.dll.so
[99/133] System.Net.Primitives.dll -> System.Net.Primitives.dll.so
[100/133] System.Net.Requests.dll -> System.Net.Requests.dll.so
[101/133] System.Net.Sockets.dll -> System.Net.Sockets.dll.so
[102/133] System.Numerics.Vectors.dll -> System.Numerics.Vectors.dll.so
[103/133] System.ObjectModel.dll -> System.ObjectModel.dll.so
[104/133] System.Private.Uri.dll -> System.Private.Uri.dll.so
[105/133] System.Private.Xml.Linq.dll -> System.Private.Xml.Linq.dll.so
[106/133] System.Private.Xml.dll -> System.Private.Xml.dll.so
[107/133] System.Reflection.Extensions.dll -> System.Reflection.Extensions.dll.so
[108/133] System.Reflection.TypeExtensions.dll -> System.Reflection.TypeExtensions.dll.so
[109/133] System.Reflection.dll -> System.Reflection.dll.so
[110/133] System.Runtime.Extensions.dll -> System.Runtime.Extensions.dll.so
[111/133] System.Runtime.InteropServices.RuntimeInformation.dll -> System.Runtime.InteropServices.RuntimeInformation.dll.so
[112/133] System.Runtime.InteropServices.dll -> System.Runtime.InteropServices.dll.so
[113/133] System.Runtime.Loader.dll -> System.Runtime.Loader.dll.so
[114/133] System.Runtime.Numerics.dll -> System.Runtime.Numerics.dll.so
[115/133] System.Runtime.dll -> System.Runtime.dll.so
[116/133] System.Security.Cryptography.dll -> System.Security.Cryptography.dll.so
[117/133] System.Text.Encoding.dll -> System.Text.Encoding.dll.so
[118/133] System.Text.Encodings.Web.dll -> System.Text.Encodings.Web.dll.so
[119/133] System.Text.Json.dll -> System.Text.Json.dll.so
[120/133] System.Text.RegularExpressions.dll -> System.Text.RegularExpressions.dll.so
[121/133] System.Threading.Tasks.dll -> System.Threading.Tasks.dll.so
[122/133] System.Threading.Thread.dll -> System.Threading.Thread.dll.so
[123/133] System.Threading.ThreadPool.dll -> System.Threading.ThreadPool.dll.so
[124/133] System.Threading.dll -> System.Threading.dll.so
[125/133] System.Xml.Linq.dll -> System.Xml.Linq.dll.so
[126/133] System.Xml.ReaderWriter.dll -> System.Xml.ReaderWriter.dll.so
[127/133] System.Xml.XDocument.dll -> System.Xml.XDocument.dll.so
[128/133] System.dll -> System.dll.so
[129/133] netstandard.dll -> netstandard.dll.so
[130/133] Java.Interop.dll -> Java.Interop.dll.so
[131/133] Mono.Android.Runtime.dll -> Mono.Android.Runtime.dll.so
[132/133] Mono.Android.dll -> Mono.Android.dll.so
[133/133] System.Private.CoreLib.dll -> System.Private.CoreLib.dll.so
Build succeeded.
0 Warning(s)
0 Error(s)
Time Elapsed 00:11:40.87
[11.0.0-prerelease.26230.4+92962e5c46ac08a66ded4c5696209cc60f1a232f] XHarness command issued: android test --app /home/vsts/work/1/s/artifacts/bin/Controls.DeviceTests/Release/net10.0-android/com.microsoft.maui.controls.devicetests-Signed.apk --package-name com.microsoft.maui.controls.devicetests --device-id emulator-5554 -o artifacts/log --timeout 01:00:00 -v --arg TestFilter=Category=Entry
�[40m�[37mdbug�[39m�[22m�[49m: ADBRunner using ADB.exe supplied from /home/vsts/.nuget/packages/microsoft.dotnet.xharness.cli/11.0.0-prerelease.26230.4/tools/net10.0/any/../../../runtimes/any/native/adb/linux/adb
�[40m�[37mdbug�[39m�[22m�[49m: Full resolved path:'/home/vsts/.nuget/packages/microsoft.dotnet.xharness.cli/11.0.0-prerelease.26230.4/runtimes/any/native/adb/linux/adb'
�[40m�[32minfo�[39m�[22m�[49m: Will attempt to find device supporting architectures: 'arm64-v8a', 'x86_64'
�[40m�[37mdbug�[39m�[22m�[49m: Executing command: '/home/vsts/.nuget/packages/microsoft.dotnet.xharness.cli/11.0.0-prerelease.26230.4/runtimes/any/native/adb/linux/adb start-server'
�[40m�[37mdbug�[39m�[22m�[49m:
�[40m�[32minfo�[39m�[22m�[49m: Finding attached devices/emulators...
�[40m�[37mdbug�[39m�[22m�[49m: Executing command: '/home/vsts/.nuget/packages/microsoft.dotnet.xharness.cli/11.0.0-prerelease.26230.4/runtimes/any/native/adb/linux/adb devices -l'
�[40m�[37mdbug�[39m�[22m�[49m: Found 1 possible devices
�[40m�[37mdbug�[39m�[22m�[49m: Evaluating output line for device serial: emulator-5554 device product:sdk_gphone_x86_64 model:sdk_gphone_x86_64 device:generic_x86_64_arm64 transport_id:2
�[40m�[37mdbug�[39m�[22m�[49m: Executing command: '/home/vsts/.nuget/packages/microsoft.dotnet.xharness.cli/11.0.0-prerelease.26230.4/runtimes/any/native/adb/linux/adb -s emulator-5554 shell getprop ro.product.cpu.abilist'
�[40m�[37mdbug�[39m�[22m�[49m: Found 1 possible devices. Using 'emulator-5554'
�[40m�[32minfo�[39m�[22m�[49m: Active Android device set to serial 'emulator-5554'
�[40m�[37mdbug�[39m�[22m�[49m: Executing command: '/home/vsts/.nuget/packages/microsoft.dotnet.xharness.cli/11.0.0-prerelease.26230.4/runtimes/any/native/adb/linux/adb -s emulator-5554 -s emulator-5554 shell getprop ro.product.cpu.abi'
�[40m�[37mdbug�[39m�[22m�[49m: Executing command: '/home/vsts/.nuget/packages/microsoft.dotnet.xharness.cli/11.0.0-prerelease.26230.4/runtimes/any/native/adb/linux/adb -s emulator-5554 -s emulator-5554 shell getprop ro.build.version.sdk'
�[40m�[32minfo�[39m�[22m�[49m: Waiting for device to be available (max 5 minutes)
�[40m�[37mdbug�[39m�[22m�[49m: Executing command: '/home/vsts/.nuget/packages/microsoft.dotnet.xharness.cli/11.0.0-prerelease.26230.4/runtimes/any/native/adb/linux/adb -s emulator-5554 wait-for-device'
�[40m�[37mdbug�[39m�[22m�[49m: Executing command: '/home/vsts/.nuget/packages/microsoft.dotnet.xharness.cli/11.0.0-prerelease.26230.4/runtimes/any/native/adb/linux/adb -s emulator-5554 -s emulator-5554 shell getprop sys.boot_completed'
�[40m�[37mdbug�[39m�[22m�[49m: sys.boot_completed = '1'
�[40m�[37mdbug�[39m�[22m�[49m: Waited 0 seconds for device boot completion
�[40m�[37mdbug�[39m�[22m�[49m: Working with emulator-5554 (API 30)
�[40m�[37mdbug�[39m�[22m�[49m: Check current adb install and/or package verification settings
�[40m�[37mdbug�[39m�[22m�[49m: Executing command: '/home/vsts/.nuget/packages/microsoft.dotnet.xharness.cli/11.0.0-prerelease.26230.4/runtimes/any/native/adb/linux/adb -s emulator-5554 shell settings get global verifier_verify_adb_installs'
�[40m�[37mdbug�[39m�[22m�[49m: verifier_verify_adb_installs = 0
�[40m�[37mdbug�[39m�[22m�[49m: Executing command: '/home/vsts/.nuget/packages/microsoft.dotnet.xharness.cli/11.0.0-prerelease.26230.4/runtimes/any/native/adb/linux/adb -s emulator-5554 shell settings get global package_verifier_enable'
�[40m�[37mdbug�[39m�[22m�[49m: package_verifier_enable =
�[40m�[1m�[33mwarn�[39m�[22m�[49m: Installing debug apks on a device might be rejected with INSTALL_FAILED_VERIFICATION_FAILURE. Make sure to set 'package_verifier_enable' to '0'
�[40m�[32minfo�[39m�[22m�[49m: Attempting to remove apk 'com.microsoft.maui.controls.devicetests'..
�[40m�[37mdbug�[39m�[22m�[49m: Executing command: '/home/vsts/.nuget/packages/microsoft.dotnet.xharness.cli/11.0.0-prerelease.26230.4/runtimes/any/native/adb/linux/adb -s emulator-5554 uninstall com.microsoft.maui.controls.devicetests'
�[40m�[1m�[33mwarn�[39m�[22m�[49m: Hit broken pipe error; Will make one attempt to restart ADB server, and retry the uninstallation
�[40m�[37mdbug�[39m�[22m�[49m: Executing command: '/home/vsts/.nuget/packages/microsoft.dotnet.xharness.cli/11.0.0-prerelease.26230.4/runtimes/any/native/adb/linux/adb -s emulator-5554 kill-server'
�[40m�[37mdbug�[39m�[22m�[49m: Executing command: '/home/vsts/.nuget/packages/microsoft.dotnet.xharness.cli/11.0.0-prerelease.26230.4/runtimes/any/native/adb/linux/adb -s emulator-5554 start-server'
�[40m�[37mdbug�[39m�[22m�[49m:
�[40m�[37mdbug�[39m�[22m�[49m: Executing command: '/home/vsts/.nuget/packages/microsoft.dotnet.xharness.cli/11.0.0-prerelease.26230.4/runtimes/any/native/adb/linux/adb -s emulator-5554 uninstall com.microsoft.maui.controls.devicetests'
�[41m�[30mfail�[39m�[22m�[49m: Error: Exit code: 20
Std out:
Std err:
- waiting for device -
cmd: Can't find service: package
�[40m�[32minfo�[39m�[22m�[49m: Attempting to install /home/vsts/work/1/s/artifacts/bin/Controls.DeviceTests/Release/net10.0-android/com.microsoft.maui.controls.devicetests-Signed.apk
�[40m�[37mdbug�[39m�[22m�[49m: Executing command: '/home/vsts/.nuget/packages/microsoft.dotnet.xharness.cli/11.0.0-prerelease.26230.4/runtimes/any/native/adb/linux/adb -s emulator-5554 install /home/vsts/work/1/s/artifacts/bin/Controls.DeviceTests/Release/net10.0-android/com.microsoft.maui.controls.devicetests-Signed.apk'
�[41m�[30mfail�[39m�[22m�[49m: Error:
Exit code: 1
Std out:
Serving...
Performing Incremental Install
cmd: Can't find service: package
Performing Streamed Install
Std err:
adb: failed to install /home/vsts/work/1/s/artifacts/bin/Controls.DeviceTests/Release/net10.0-android/com.microsoft.maui.controls.devicetests-Signed.apk: cmd: Can't find service: package
�[41m�[1m�[37mcrit�[39m�[22m�[49m: Install failure: Test command cannot continue
�[40m�[32minfo�[39m�[22m�[49m: Attempting to remove apk 'com.microsoft.maui.controls.devicetests'..
�[40m�[37mdbug�[39m�[22m�[49m: Executing command: '/home/vsts/.nuget/packages/microsoft.dotnet.xharness.cli/11.0.0-prerelease.26230.4/runtimes/any/native/adb/linux/adb -s emulator-5554 uninstall com.microsoft.maui.controls.devicetests'
�[41m�[30mfail�[39m�[22m�[49m: Error: Exit code: 20
Std out:
Std err:
cmd: Can't find service: package
�[40m�[32minfo�[39m�[22m�[49m: Attempting to remove apk 'com.microsoft.maui.controls.devicetests'..
�[40m�[37mdbug�[39m�[22m�[49m: Executing command: '/home/vsts/.nuget/packages/microsoft.dotnet.xharness.cli/11.0.0-prerelease.26230.4/runtimes/any/native/adb/linux/adb -s emulator-5554 uninstall com.microsoft.maui.controls.devicetests'
�[41m�[30mfail�[39m�[22m�[49m: Error: Exit code: 20
Std out:
Std err:
cmd: Can't find service: package
XHarness exit code: 78 (PACKAGE_INSTALLATION_FAILURE)
Tests completed with exit code: 78
🟢 With fix — 📱 EntryTests (KeyboardPasswordDoesNotForcePasswordVisibilityWhenIsPasswordIsFalse, KeyboardPasswordRespectsIsPasswordToggle): PASS ✅ · 242s
(truncated to last 15,000 chars)
125 6116 6146 I DOTNET : [FILTER] Included test (filtered by Trait; 'Category':'ContentView'): [Memory] Handler Does Not Leak
07-01 23:48:45.125 6116 6146 I DOTNET : [FILTER] Included test (filtered by Trait; 'Category':'DatePicker'): [Memory] Handler Does Not Leak
07-01 23:48:45.125 6116 6146 I DOTNET : [FILTER] Included test (filtered by Trait; 'Category':'Dispatcher'): [Memory] Handler Does Not Leak
07-01 23:48:45.125 6116 6146 I DOTNET : [FILTER] Included test (filtered by Trait; 'Category':'Editor'): [Memory] Handler Does Not Leak
07-01 23:48:45.125 6116 6146 I DOTNET : [FILTER] Included test (filtered by Trait; 'Category':'Element'): [Memory] Handler Does Not Leak
07-01 23:48:45.125 6116 6146 I DOTNET : [FILTER] Included test (filtered by Trait; 'Category':'FlexLayout'): [Memory] Handler Does Not Leak
07-01 23:48:45.125 6116 6146 I DOTNET : [FILTER] Included test (filtered by Trait; 'Category':'FlyoutPage'): [Memory] Handler Does Not Leak
07-01 23:48:45.125 6116 6146 I DOTNET : [FILTER] Included test (filtered by Trait; 'Category':'Frame'): [Memory] Handler Does Not Leak
07-01 23:48:45.125 6116 6146 I DOTNET : [FILTER] Included test (filtered by Trait; 'Category':'Gesture'): [Memory] Handler Does Not Leak
07-01 23:48:45.125 6116 6146 I DOTNET : [FILTER] Included test (filtered by Trait; 'Category':'HybridWebView'): [Memory] Handler Does Not Leak
07-01 23:48:45.125 6116 6146 I DOTNET : [FILTER] Included test (filtered by Trait; 'Category':'Image'): [Memory] Handler Does Not Leak
07-01 23:48:45.125 6116 6146 I DOTNET : [FILTER] Included test (filtered by Trait; 'Category':'Label'): [Memory] Handler Does Not Leak
07-01 23:48:45.125 6116 6146 I DOTNET : [FILTER] Included test (filtered by Trait; 'Category':'Layout'): [Memory] Handler Does Not Leak
07-01 23:48:45.125 6116 6146 I DOTNET : [FILTER] Included test (filtered by Trait; 'Category':'Lifecycle'): [Memory] Handler Does Not Leak
07-01 23:48:45.125 6116 6146 I DOTNET : [FILTER] Included test (filtered by Trait; 'Category':'ListView'): [Memory] Handler Does Not Leak
07-01 23:48:45.125 6116 6146 I DOTNET : [FILTER] Included test (filtered by Trait; 'Category':'Map'): [Memory] Handler Does Not Leak
07-01 23:48:45.125 6116 6146 I DOTNET : [FILTER] Included test (filtered by Trait; 'Category':'MenuFlyout'): [Memory] Handler Does Not Leak
07-01 23:48:45.125 6116 6146 I DOTNET : [FILTER] Included test (filtered by Trait; 'Category':'Mapper'): [Memory] Handler Does Not Leak
07-01 23:48:45.125 6116 6146 I DOTNET : [FILTER] Excluded test (filtered by Trait; 'Category':'Memory'): [Memory] Handler Does Not Leak
07-01 23:48:45.125 6116 6146 I DOTNET : [FILTER] Included test (filtered by Trait; 'Category':'Modal'): [Memory] Handler Does Not Leak
07-01 23:48:45.125 6116 6146 I DOTNET : [FILTER] Included test (filtered by Trait; 'Category':'NavigationPage'): [Memory] Handler Does Not Leak
07-01 23:48:45.125 6116 6146 I DOTNET : [FILTER] Included test (filtered by Trait; 'Category':'Page'): [Memory] Handler Does Not Leak
07-01 23:48:45.125 6116 6146 I DOTNET : [FILTER] Included test (filtered by Trait; 'Category':'Path'): [Memory] Handler Does Not Leak
07-01 23:48:45.125 6116 6146 I DOTNET : [FILTER] Included test (filtered by Trait; 'Category':'Picker'): [Memory] Handler Does Not Leak
07-01 23:48:45.125 6116 6146 I DOTNET : [FILTER] Included test (filtered by Trait; 'Category':'RadioButton'): [Memory] Handler Does Not Leak
07-01 23:48:45.125 6116 6146 I DOTNET : [FILTER] Included test (filtered by Trait; 'Category':'RefreshView'): [Memory] Handler Does Not Leak
07-01 23:48:45.125 6116 6146 I DOTNET : [FILTER] Included test (filtered by Trait; 'Category':'ScrollView'): [Memory] Handler Does Not Leak
07-01 23:48:45.125 6116 6146 I DOTNET : [FILTER] Included test (filtered by Trait; 'Category':'SearchBar'): [Memory] Handler Does Not Leak
07-01 23:48:45.125 6116 6146 I DOTNET : [FILTER] Included test (filtered by Trait; 'Category':'Shape'): [Memory] Handler Does Not Leak
07-01 23:48:45.125 6116 6146 I DOTNET : [FILTER] Included test (filtered by Trait; 'Category':'Shell'): [Memory] Handler Does Not Leak
07-01 23:48:45.125 6116 6146 I DOTNET : [FILTER] Included test (filtered by Trait; 'Category':'Slider'): [Memory] Handler Does Not Leak
07-01 23:48:45.125 6116 6146 I DOTNET : [FILTER] Included test (filtered by Trait; 'Category':'SwipeView'): [Memory] Handler Does Not Leak
07-01 23:48:45.125 6116 6146 I DOTNET : [FILTER] Included test (filtered by Trait; 'Category':'TabbedPage'): [Memory] Handler Does Not Leak
07-01 23:48:45.125 6116 6146 I DOTNET : [FILTER] Included test (filtered by Trait; 'Category':'TextInput'): [Memory] Handler Does Not Leak
07-01 23:48:45.125 6116 6146 I DOTNET : [FILTER] Included test (filtered by Trait; 'Category':'Toolbar'): [Memory] Handler Does Not Leak
07-01 23:48:45.125 6116 6146 I DOTNET : [FILTER] Included test (filtered by Trait; 'Category':'TemplatedView'): [Memory] Handler Does Not Leak
07-01 23:48:45.125 6116 6146 I DOTNET : [FILTER] Included test (filtered by Trait; 'Category':'View'): [Memory] Handler Does Not Leak
07-01 23:48:45.125 6116 6146 I DOTNET : [FILTER] Included test (filtered by Trait; 'Category':'VisualElement'): [Memory] Handler Does Not Leak
07-01 23:48:45.125 6116 6146 I DOTNET : [FILTER] Included test (filtered by Trait; 'Category':'VisualElementTree'): [Memory] Handler Does Not Leak
07-01 23:48:45.125 6116 6146 I DOTNET : [FILTER] Included test (filtered by Trait; 'Category':'WebView'): [Memory] Handler Does Not Leak
07-01 23:48:45.125 6116 6146 I DOTNET : [FILTER] Included test (filtered by Trait; 'Category':'Window'): [Memory] Handler Does Not Leak
07-01 23:48:45.125 6116 6146 I DOTNET : [FILTER] Included test (filtered by Trait; 'Category':'WindowOverlay'): [Memory] Handler Does Not Leak
07-01 23:48:45.125 6116 6146 I DOTNET : [FILTER] Included test (filtered by Trait; 'Category':'Xaml'): [Memory] Handler Does Not Leak
07-01 23:48:45.125 6116 6146 I DOTNET : [FILTER] Included test (filtered by Trait; 'Category':'Accessibility'): [Memory] CollectionView Header/Footer Doesn't Leak
07-01 23:48:45.125 6116 6146 I DOTNET : [FILTER] Included test (filtered by Trait; 'Category':'Application'): [Memory] CollectionView Header/Footer Doesn't Leak
07-01 23:48:45.125 6116 6146 I DOTNET : [FILTER] Included test (filtered by Trait; 'Category':'Behavior'): [Memory] CollectionView Header/Footer Doesn't Leak
07-01 23:48:45.125 6116 6146 I DOTNET : [FILTER] Included test (filtered by Trait; 'Category':'Border'): [Memory] CollectionView Header/Footer Doesn't Leak
07-01 23:48:45.125 6116 6146 I DOTNET : [FILTER] Included test (filtered by Trait; 'Category':'BoxView'): [Memory] CollectionView Header/Footer Doesn't Leak
07-01 23:48:45.155 6116 6146 I DOTNET : [Test environment: 64-bit .NET .NET 10.0 [collection-per-class, non-parallel]]
07-01 23:48:45.155 6116 6146 I DOTNET : [Test framework: xUnit.net 2.9.0.0]
07-01 23:48:45.174 6116 6146 I DOTNET : Test collection for Microsoft.Maui.DeviceTests.AlertDialogTests
07-01 23:48:45.442 6116 6146 I DOTNET : [PASS] AlertDialogButtonColorDarkTheme
07-01 23:48:45.490 6116 6146 I DOTNET : [PASS] AlertDialogButtonColorLightTheme
07-01 23:48:45.493 6116 6146 I DOTNET : Microsoft.Maui.DeviceTests.AlertDialogTests 0.2262106 ms
07-01 23:48:45.495 6116 6146 I DOTNET : Serialize test because it has to add itself to the main window
07-01 23:48:45.742 6116 6158 I DOTNET : [PASS] Text is Transformed Correctly at Initialization
07-01 23:48:45.750 6116 6158 I DOTNET : [PASS] Text is Transformed Correctly at Initialization
07-01 23:48:45.770 6116 6158 I DOTNET : [PASS] SelectionLength Updates Correctly
07-01 23:48:45.776 6116 6158 I DOTNET : [PASS] SelectionLength Initializes Correctly
07-01 23:48:45.780 6116 6158 I DOTNET : [PASS] Unset SelectionLength is kept at zero at initialization with TextTransform
07-01 23:48:45.788 6116 6158 I DOTNET : [PASS] Unset SelectionLength is kept at zero at initialization with TextTransform
07-01 23:48:45.822 6116 6164 I DOTNET : [PASS] SelectionLength is Capped to Text Length
07-01 23:48:45.827 6116 6164 I DOTNET : [PASS] Unset CursorPosition is kept at zero at initialization
07-01 23:48:45.833 6116 6164 I DOTNET : [PASS] Unset CursorPosition is kept at zero at initialization
07-01 23:48:45.837 6116 6164 I DOTNET : [PASS] CursorPosition is Capped to Text's Length
07-01 23:48:45.841 6116 6164 I DOTNET : [PASS] CursorPosition Updates Correctly
07-01 23:48:45.846 6116 6164 I DOTNET : [PASS] Text is Transformed Correctly after Initialization
07-01 23:48:45.852 6116 6164 I DOTNET : [PASS] Text is Transformed Correctly after Initialization
07-01 23:48:45.855 6116 6164 I DOTNET : [PASS] CursorPosition Initializes Correctly
07-01 23:48:46.110 6116 6174 I DOTNET : [PASS] SelectionLength is kept at zero on text change after initialization
07-01 23:48:46.462 6116 6181 I DOTNET : [PASS] SelectionLength is kept at zero on text change after initialization
07-01 23:48:46.590 6116 6188 I DOTNET : [PASS] SelectionLength is kept at zero on text change after initialization
07-01 23:48:46.752 6116 6195 I DOTNET : [PASS] SelectionLength is kept at zero on text change after initialization
07-01 23:48:46.765 6116 6195 I DOTNET : [PASS] Unset SelectionLength is kept at zero at initialization
07-01 23:48:46.776 6116 6195 I DOTNET : [PASS] Unset SelectionLength is kept at zero at initialization
07-01 23:48:46.786 6116 6195 I DOTNET : [PASS] SelectionLengthInitializesCorrectlyWithUpdateCursorPositionLast
07-01 23:48:46.790 6116 6195 I DOTNET : [PASS] CursorPositionInitializesCorrectlyWithUpdateTextLast
07-01 23:48:46.797 6116 6195 I DOTNET : [PASS] Unset CursorPosition is kept at zero at initialization with TextTransform
07-01 23:48:46.805 6116 6195 I DOTNET : [PASS] Unset CursorPosition is kept at zero at initialization with TextTransform
07-01 23:48:46.924 6116 6202 I DOTNET : [PASS] CursorPosition moves to the end on text change after initialization
07-01 23:48:47.066 6116 6209 I DOTNET : [PASS] CursorPosition moves to the end on text change after initialization
07-01 23:48:47.182 6116 6216 I DOTNET : [PASS] CursorPosition moves to the end on text change after initialization
07-01 23:48:47.348 6116 6224 I DOTNET : [PASS] CursorPosition moves to the end on text change after initialization
07-01 23:48:47.358 6116 6229 I DOTNET : [PASS] CursorPositionInitializesCorrectlyWithUpdateCursorPositionLast
07-01 23:48:47.363 6116 6229 I DOTNET : [PASS] SelectionLengthInitializesCorrectlyWithUpdateTextLast
07-01 23:48:47.364 6116 6229 I DOTNET : Microsoft.Maui.DeviceTests.EntryTests+EntryTextInputTests 1.6657563 ms
07-01 23:48:47.366 6116 6229 I DOTNET : Test collection for Microsoft.Maui.DeviceTests.EntryTests
07-01 23:48:47.398 6116 6229 I DOTNET : [PASS] ScaleXConsistent
07-01 23:48:47.407 6116 6229 I DOTNET : [PASS] MaxLengthTrims
07-01 23:48:47.411 6116 6229 I DOTNET : [PASS] EntryMaxLengthAndTextOrder_RespectsMaxLength
07-01 23:48:47.419 6116 6229 I DOTNET : [PASS] VerifyEntryIsVisibleProperty
07-01 23:48:47.425 6116 6229 I DOTNET : [PASS] KeyboardPasswordDoesNotForcePasswordVisibilityWhenIsPasswordIsFalse
07-01 23:48:47.430 6116 6229 I DOTNET : [PASS] ChangingPlatformTextPreservesTextTransform
07-01 23:48:47.433 6116 6229 I DOTNET : [PASS] ChangingPlatformTextPreservesTextTransform
07-01 23:48:47.437 6116 6229 I DOTNET : [PASS] ScaleConsistent
07-01 23:48:47.443 6116 6229 I DOTNET : [PASS] KeyboardPasswordRespectsIsPasswordToggle
07-01 23:48:47.469 6116 6234 I DOTNET : [PASS] Entry with longer text and short text updates correctly
07-01 23:48:47.473 6116 6234 I DOTNET : [PASS] InitializingTextTransformBeforeTextShouldUpdateTextProperty
07-01 23:48:47.477 6116 6234 I DOTNET : [PASS] RotationYConsistent
07-01 23:48:47.481 6116 6234 I DOTNET : [PASS] EntryTranslationConsistent
07-01 23:48:47.507 6116 6239 I DOTNET : [PASS] Android crash when Entry has more than 5000 characters
07-01 23:48:47.511 6116 6239 I DOTNET : [PASS] UpdateTextWithTextLongerThanMaxLength
07-01 23:48:47.516 6116 6239 I DOTNET : [PASS] VerifyEntryOpacityProperty
07-01 23:48:47.717 6116 6244 I DOTNET : [PASS] EntryBackgroundColorConsistent
07-01 23:48:47.780 6116 6244 I DOTNET : [PASS] SelectionLengthRightToLeft
07-01 23:48:47.785 6116 6244 I DOTNET : [PASS] RotationXConsistent
07-01 23:48:47.791 6116 6244 I DOTNET : [PASS] CursorPositionPreservedWhenTextTransformPresent
07-01 23:48:47.794 6116 6244 I DOTNET : [PASS] ScaleYConsistent
07-01 23:48:47.797 6116 6244 I DOTNET : [PASS] RotationConsistent
07-01 23:48:47.797 6116 6244 I DOTNET : Microsoft.Maui.DeviceTests.EntryTests 0.4197451 ms
07-01 23:48:47.827 6116 6136 I DOTNET : Xml file was written to the provided writer.
07-01 23:48:47.827 6116 6136 I DOTNET : Tests run: 595 Passed: 64 Inconclusive: 0 Failed: 0 Ignored: 531
�[40m�[32minfo�[39m�[22m�[49m: <<XHARNESS_RESULT_START>>
{
"version": 1,
"machineName": "runnervm5lfqw",
"exitCode": 0,
"exitCodeName": "SUCCESS",
"platform": "android",
"instrumentationExitCode": 0,
"device": "emulator-5554",
"deviceOsVersion": "API 30",
"architecture": "x86_64",
"files": [
{
"name": "testResults.xml",
"type": "test-results"
},
{
"name": "adb-logcat-com.microsoft.maui.controls.devicetests-default.log",
"type": "logcat"
}
]
}
<<XHARNESS_RESULT_END>>
�[40m�[32minfo�[39m�[22m�[49m: Attempting to remove apk 'com.microsoft.maui.controls.devicetests'..
�[40m�[37mdbug�[39m�[22m�[49m: Executing command: '/home/vsts/.nuget/packages/microsoft.dotnet.xharness.cli/11.0.0-prerelease.26230.4/runtimes/any/native/adb/linux/adb -s emulator-5554 uninstall com.microsoft.maui.controls.devicetests'
�[40m�[32minfo�[39m�[22m�[49m: Successfully uninstalled com.microsoft.maui.controls.devicetests
XHarness exit code: 0
Tests completed successfully
📁 Fix files reverted (1 files)
src/Core/src/Platform/Android/EditTextExtensions.cs
📱 UI Tests — Entry,ViewBaseTests
Detected UI test categories: Entry,ViewBaseTests
❌ Deep UI tests — 229 passed, 1 failed across 2 categories on platform-pool agent (replaces in-process counts above).
🧪 UI Test Execution Results (deep, platform pool)
| Category | Tests | Snapshot diffs |
|---|---|---|
Entry |
111/113 (1 ❌) | — |
ViewBaseTests |
118/119 ✓ | — |
❌ Entry — 1 failed test
EntryClearButtonColorShouldUpdateOnThemeChange
System.NullReferenceException : Object reference not set to an instance of an object.
at UITest.Appium.HelperExtensions.Click(IUIElement element) in /_/src/TestUtils/src/UITest.Appium/HelperExtensions.cs:line 412
at UITest.Appium.HelperExtensions.<>c__DisplayClass2_0.<Tap>b__0() in /_/src/TestUtils/src/UITest.Appium/HelperExtensions.cs:line 36
at UITest.Appium.HelperExtensions.<>c__DisplayClass186_0.<RunWithTimeout>b__0() in /_/src/TestUtils/src/UITest.Appium/HelperExtensions.cs:line 3075
at System.Threading.Tasks.Task`1.InnerInvoke()
at System.Threading.ExecutionContext.RunFromThreadPoolDispatchLoop(Thread threadPoolThread, ExecutionContext executionContext, ContextCallback callback, Object state)
--- End of stack trace from previous location ---
at System.Threading.ExecutionContext.RunFromThreadPoolDispatchLoop(Thread threadPoolThread, ExecutionContext executionContext, ContextCallback callback, Object state)
at System.Threading.Tasks.Task.ExecuteWithThreadLocal(Tas
...
📎 Download drop-deep-uitests artifact (TRX + snapshot diffs)
🔗 Regression Cross-Reference
🔍 Regression Cross-Reference
⚠ Overlaps with prior bug-fix PRs — same files modified, but no exact line revert detected.
| File | Fix PR | Fixed issue(s) |
|---|---|---|
src/Core/src/Platform/Android/EditTextExtensions.cs |
#32889 | #32886 |
🧪 Regression Tests to Verify
These tests were added by the overlapping fix PRs. Running them to verify no side-effect regressions:
| Fix PR | Type | Test | Filter |
|---|---|---|---|
| #32889 | UITest | Issue32886 | Issue32886 |
🧪 Regression Test Results
❌ FAILED — 0 passed, 1 failed, 0 skipped
| Fix PR | Test | Type | Result |
|---|---|---|---|
| #32889 | Issue32886 | UITest | ❌ FAILED |
📋 Pre-Flight — Context & Validation
Issue: #35650 - [Android] Keyboard Password seems to force IsPassword to True on Entry
PR: #36280 - [Android] Fix Entry password visibility when using Keyboard.Password
Platforms Affected: Android
Files Changed: 1 implementation, 1 test
Key Findings
- Issue #35650 reports that
Entry Keyboard="Password"on Android obscures text even whenIsPasswordis false, and togglingIsPassworddoes not reveal the text. - PR #36280 changes
src/Core/src/Platform/Android/EditTextExtensions.csso AndroidEntryclears password variation flags whenIEntry.IsPasswordis false. - PR #36280 adds Android Controls device tests in
src/Controls/tests/DeviceTests/Elements/Entry/EntryTests.Android.csforKeyboard.PasswordwithIsPassword=falseand false/true/false toggling. - Public PR review discussion noted a double-cast cleanup and requested the Android device-test coverage that is now present.
ghwas unauthenticated in this environment, so required-check state could not be verified viagh pr checks --required; public PR API and local branch context were used for pre-flight.- Impacted UI test categories:
Entry.
Code Review Summary
Verdict: NEEDS_CHANGES
Confidence: low
Errors: 1 | Warnings: 0 | Suggestions: 0
Key code review findings:
- ✗
src/Core/src/Platform/Android/EditTextExtensions.cs:390clears both text and number password variation bits for every non-passwordEntry.InputTypes.NumberVariationPasswordshares the0x10bit used by text variations such asTextVariationUri, so normalKeyboard.UrlEntries can lose their URL keyboard variation.
Fix Candidates
| # | Source | Approach | Test Result | Files Changed | Notes |
|---|---|---|---|---|---|
| PR | PR #36280 | Clear TextVariationPassword and NumberVariationPassword whenever Android Entry.IsPassword is false |
✅ PASSED (Gate) | src/Core/src/Platform/Android/EditTextExtensions.cs, src/Controls/tests/DeviceTests/Elements/Entry/EntryTests.Android.cs |
Original PR; gate was reported passed before this run, but code review found potential URL/date variation regression from unconditional bit clearing. |
🔬 Code Review — Deep Analysis
Code Review — PR #36280
Independent Assessment
What this changes: Android Entry input-type mapping now clears password variation bits whenever IEntry.IsPassword is false, and adds device tests for Keyboard.Password.
Inferred motivation: Prevent Keyboard.Password from continuing to obscure text when Entry.IsPassword is false or toggled off.
Reconciliation with PR Narrative
Author claims: Keyboard.Password initializes Android password variation flags; this PR clears them when IsPassword=false.
Agreement/disagreement: The target bug is real, but the clearing logic is too broad because Android variation bit values overlap across input classes.
Prior Review Reconciliation
No prior ❌ Error findings found. Prior inline comments were suggestions/test coverage comments; the test-coverage concern was addressed.
Blast Radius Assessment
- Runs for all instances: yes — every Android
EntrycallingSetInputType. - Startup impact: yes — initial handler/property mapping for Android Entries.
- Static/shared state: no.
CI Status
- Required-check result:
gh pr checks --requiredunavailable due unauthenticatedgh; public check-runs showmaui-prsucceeded. - Classification: required-check set not fully verified; no PR-caused CI failure seen.
- Action taken: capped confidence.
Findings
❌ Error — Clearing NumberVariationPassword also removes URL/date variations
src/Core/src/Platform/Android/EditTextExtensions.cs:390
InputTypes.NumberVariationPassword is 0x10, which is the same bit used by other variation values such as TextVariationUri. Because this branch runs for every non-password Entry, Keyboard.Url starts as ClassText | TextVariationUri, then line 390 clears 0x10, leaving plain ClassText. That regresses URL keyboard behavior for normal Entries unrelated to passwords. The clear should be scoped to the current input class/variation, not clear text and number password variations unconditionally.
Failure-Mode Probing
Keyboard.Password,IsPassword=false: target scenario works; password variation is removed.Keyboard.Url,IsPassword=false: losesTextVariationUribecause it shares the0x10bit.- Non-Entry
Editor/SearchBar: unaffected because the new branch only runs forIEntry.
Verdict: NEEDS_CHANGES
Confidence: low, per CI-verification cap, though the code finding itself is high-confidence.
Summary: The fix addresses the reported password case but introduces a regression for other Android keyboard variations, especially URL. The masking logic needs to avoid clearing unrelated variation bits.
🛠️ Fix — Analysis & Comparison
Fix Candidates
| # | Source | Approach | Test Result | Files Changed | Notes |
|---|---|---|---|---|---|
| 1 | try-fix-1 | Only clear Android variation mask for Keyboard.Password when Entry.IsPassword=false, then set TextVariationNormal; add URL-variation regression assertion |
✅ PASS | 2 files | Better than PR fix because it avoids clearing overlapping variation bits for unrelated keyboards such as Keyboard.Url. |
| PR | PR #36280 | Clear `TextVariationPassword | NumberVariationPasswordwhenever AndroidEntry.IsPassword=false` |
✅ PASSED (Gate) | 2 files |
Cross-Pollination
| Model | Round | New Ideas? | Details |
|---|---|---|---|
| gpt-5.5 + maui-expert-reviewer | 1 | Yes | Proposed class/keyboard-scoped password variation normalization using MaskVariation only for Keyboard.Password. |
Exhausted: No — stopped because Candidate #1 passed all required tests and is demonstrably safer than the PR fix.
Selected Fix: Candidate #1 — It preserves the original bug fix while avoiding the Android InputTypes bit-overlap regression identified in code review.
📝 Recommended PR Title & Description
Assessment: ✏️ Recommend updating — the title is good, but the description should describe the winning scoped Keyboard.Password fix rather than the raw PR's broader "clear password flags whenever IsPassword is false" implementation.
Recommended title
[Android] Fix Entry password visibility when using Keyboard.Password
Recommended description
### Description of Change
This PR fixes an Android issue where `Entry` configured with `Keyboard.Password` continued to obscure text even when `IsPassword` was set to `false`.
The root cause was that `Keyboard.Password` initializes the underlying `EditText.InputType` with password variation flags, but those flags were not reset when `IsPassword` was `false`. As a result, the platform `EditText` continued behaving as a password field even though `Entry.IsPassword` should be the source of truth for password visibility.
This change updates the Android input type configuration so when `Keyboard.Password` is used with `IsPassword=false`, the input variation is reset to the normal text variation. The reset is scoped to `Keyboard.Password` so unrelated keyboards, such as `Keyboard.Url`, preserve their own Android variation bits.
Android device tests cover:
- `Keyboard.Password` with `IsPassword=false`
- `Keyboard.Password` toggling `IsPassword` false/true/false
- `Keyboard.Url` preserving its URL variation with `IsPassword=false`
### Issues Fixed
Fixes #35650
🏁 Report — Final Recommendation
Comparative Report — PR #36280
Candidates Compared
| Rank | Candidate | Regression Result | Assessment |
|---|---|---|---|
| 1 | pr-plus-reviewer |
Inherits the tested try-fix-1 approach; sandbox diff matches the passing candidate strategy |
Best candidate. It keeps the PR's Keyboard.Password fix, applies the expert review feedback, and adds URL variation coverage so unrelated keyboards are not regressed. |
| 2 | try-fix-1 |
✅ Passed Entry device tests and mandatory Issue32886 regression |
Technically equivalent to pr-plus-reviewer: only normalizes Android variation bits when keyboard == Keyboard.Password and IsPassword=false, then restores TextVariationNormal; also adds URL-regression coverage. Ranked just below pr-plus-reviewer because the reviewer-applied PR candidate preserves the PR lineage while adopting the same safer fix. |
| 3 | pr |
❌ Failed saved regression cross-check: Issue32886 |
The raw PR fixes the reported Keyboard.Password password-visibility bug and the gate result passed, but it clears `TextVariationPassword |
Only one STEP 5a try-fix candidate was present: try-fix-1.
Key Technical Difference
The raw PR does this for every non-password Android Entry:
editText.InputType &= ~(InputTypes.TextVariationPassword | InputTypes.NumberVariationPassword);That is unsafe because NumberVariationPassword is a variation bit whose numeric value overlaps with text-class variations such as TextVariationUri.
The winning approach scopes the variation reset to the source of the bug:
else if (keyboard == Keyboard.Password)
{
editText.InputType &= ~InputTypes.MaskVariation;
editText.InputType |= InputTypes.TextVariationNormal;
}This keeps Entry.IsPassword=false authoritative for Keyboard.Password without touching unrelated keyboard variations.
Winner
Winner: pr-plus-reviewer
Rationale: pr-plus-reviewer fixes the reported Android Keyboard.Password/IsPassword=false behavior while addressing the expert review finding that the raw PR can regress Keyboard.Url. It is equivalent in approach to the tested try-fix-1 candidate, which passed both the Entry device-test run and the mandatory Issue32886 regression, and is preferable to the raw PR because the raw PR failed the saved regression cross-check.
Recommendation
Update PR #36280 with the pr-plus-reviewer scoped variation-reset change and URL-regression test before merge. Do not merge the raw PR fix as-is.
🧭 Next Steps — review latest findings
No alternative fix was selected for this run. Review the session findings and CI results before merging.
kubaflo
left a comment
There was a problem hiding this comment.
Looks good, but could you please check this failing test? EntryClearButtonColorShouldUpdateOnThemeChange
Sure, let me check what's hapenning |
…36280) <!-- !!!!!!! MAIN IS THE ONLY ACTIVE BRANCH. MAKE SURE THIS PR IS TARGETING MAIN. !!!!!!! --> ### Description of Change This PR fixes an Android issue where `Entry` configured with `Keyboard.Password` continued to obscure text even when `IsPassword` was set to `false`. The root cause was that `Keyboard.Password` initializes the underlying `InputType` with the password variation flags, but those flags were never removed when `IsPassword` was `false`. As a result, the platform `EditText` continued behaving as a password field. This change updates the Android input type configuration to explicitly clear the password variation flags whenever `IsPassword` is `false`, ensuring that `Entry.IsPassword` remains the source of truth for password visibility. ### Issues Fixed Fixes #35650 <!-- Are you targeting main? All PRs should target the main branch unless otherwise noted. --> --------- Co-authored-by: Frédéric Delaporte <12201973+fredericDelaporte@users.noreply.github.com> Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com>
…36280) <!-- !!!!!!! MAIN IS THE ONLY ACTIVE BRANCH. MAKE SURE THIS PR IS TARGETING MAIN. !!!!!!! --> ### Description of Change This PR fixes an Android issue where `Entry` configured with `Keyboard.Password` continued to obscure text even when `IsPassword` was set to `false`. The root cause was that `Keyboard.Password` initializes the underlying `InputType` with the password variation flags, but those flags were never removed when `IsPassword` was `false`. As a result, the platform `EditText` continued behaving as a password field. This change updates the Android input type configuration to explicitly clear the password variation flags whenever `IsPassword` is `false`, ensuring that `Entry.IsPassword` remains the source of truth for password visibility. ### Issues Fixed Fixes #35650 <!-- Are you targeting main? All PRs should target the main branch unless otherwise noted. --> --------- Co-authored-by: Frédéric Delaporte <12201973+fredericDelaporte@users.noreply.github.com> Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com>
…36280) <!-- !!!!!!! MAIN IS THE ONLY ACTIVE BRANCH. MAKE SURE THIS PR IS TARGETING MAIN. !!!!!!! --> ### Description of Change This PR fixes an Android issue where `Entry` configured with `Keyboard.Password` continued to obscure text even when `IsPassword` was set to `false`. The root cause was that `Keyboard.Password` initializes the underlying `InputType` with the password variation flags, but those flags were never removed when `IsPassword` was `false`. As a result, the platform `EditText` continued behaving as a password field. This change updates the Android input type configuration to explicitly clear the password variation flags whenever `IsPassword` is `false`, ensuring that `Entry.IsPassword` remains the source of truth for password visibility. ### Issues Fixed Fixes #35650 <!-- Are you targeting main? All PRs should target the main branch unless otherwise noted. --> --------- Co-authored-by: Frédéric Delaporte <12201973+fredericDelaporte@users.noreply.github.com> Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com>
…36280) <!-- !!!!!!! MAIN IS THE ONLY ACTIVE BRANCH. MAKE SURE THIS PR IS TARGETING MAIN. !!!!!!! --> ### Description of Change This PR fixes an Android issue where `Entry` configured with `Keyboard.Password` continued to obscure text even when `IsPassword` was set to `false`. The root cause was that `Keyboard.Password` initializes the underlying `InputType` with the password variation flags, but those flags were never removed when `IsPassword` was `false`. As a result, the platform `EditText` continued behaving as a password field. This change updates the Android input type configuration to explicitly clear the password variation flags whenever `IsPassword` is `false`, ensuring that `Entry.IsPassword` remains the source of truth for password visibility. ### Issues Fixed Fixes #35650 <!-- Are you targeting main? All PRs should target the main branch unless otherwise noted. --> --------- Co-authored-by: Frédéric Delaporte <12201973+fredericDelaporte@users.noreply.github.com> Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com>
…36280) <!-- !!!!!!! MAIN IS THE ONLY ACTIVE BRANCH. MAKE SURE THIS PR IS TARGETING MAIN. !!!!!!! --> ### Description of Change This PR fixes an Android issue where `Entry` configured with `Keyboard.Password` continued to obscure text even when `IsPassword` was set to `false`. The root cause was that `Keyboard.Password` initializes the underlying `InputType` with the password variation flags, but those flags were never removed when `IsPassword` was `false`. As a result, the platform `EditText` continued behaving as a password field. This change updates the Android input type configuration to explicitly clear the password variation flags whenever `IsPassword` is `false`, ensuring that `Entry.IsPassword` remains the source of truth for password visibility. ### Issues Fixed Fixes #35650 <!-- Are you targeting main? All PRs should target the main branch unless otherwise noted. --> --------- Co-authored-by: Frédéric Delaporte <12201973+fredericDelaporte@users.noreply.github.com> Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com>
…36280) <!-- !!!!!!! MAIN IS THE ONLY ACTIVE BRANCH. MAKE SURE THIS PR IS TARGETING MAIN. !!!!!!! --> ### Description of Change This PR fixes an Android issue where `Entry` configured with `Keyboard.Password` continued to obscure text even when `IsPassword` was set to `false`. The root cause was that `Keyboard.Password` initializes the underlying `InputType` with the password variation flags, but those flags were never removed when `IsPassword` was `false`. As a result, the platform `EditText` continued behaving as a password field. This change updates the Android input type configuration to explicitly clear the password variation flags whenever `IsPassword` is `false`, ensuring that `Entry.IsPassword` remains the source of truth for password visibility. ### Issues Fixed Fixes #35650 <!-- Are you targeting main? All PRs should target the main branch unless otherwise noted. --> --------- Co-authored-by: Frédéric Delaporte <12201973+fredericDelaporte@users.noreply.github.com> Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com>
…o Password (#36677) <!-- Please let the below note in for people that find this PR --> > [!NOTE] > Are you waiting for the changes in this PR to be merged? > It would be very helpful if you could [test the resulting artifacts](https://github.com/dotnet/maui/wiki/Testing-PR-Builds) from this PR and let us know in a comment if this change resolves your issue. Thank you! ### Issue Details - An Entry with Keyboard="Password" always renders text as masked, ignoring IsPassword=false. Setting IsPassword=false has no effect on iOS (initial load) and Windows (initial load and runtime toggle) when Keyboard="Password" is set. ### Root Cause - The MapIsPassword mapper runs before MapKeyboard in EntryHandler.cs on initial setup, so Keyboard.Password hardcodes masking behavior in ApplyKeyboard (iOS: SetSecureTextEntry(true)) and via an InputScope callback (Windows: OnInputScopePropertyChanged), both of which run after MapIsPassword and silently overwrite IsPassword=false. ### Description of Change - **iOS**: Removed the hardcoded SetSecureTextEntry(true) from the Keyboard.Password branch in KeyboardExtensions.cs. SecureTextEntry is now set exclusively by TextFieldExtensions.UpdateIsPassword, respecting the actual IsPassword value. - **Windows**: Removed the OnInputScopePropertyChanged callback from MauiPasswordTextBox that automatically forced IsPassword=true whenever InputScope changed to Password, allowing developers to set IsPassword=false even when Keyboard=Password is used. **Note**: The Android fix for the same issue is tracked separately in PR #36280. ### Issues Fixed Fixes #35650 ### Validated the behaviour in the following platforms - [x] Windows - [ ] Android - [x] iOS - [x] Mac ### Output | Platform | Before | After | |----------|----------|----------| | iOS | <video src="https://github.com/user-attachments/assets/1b249d36-8e83-434c-a7dc-b7a4b9c5a3f4"> | <video src="https://github.com/user-attachments/assets/1c917876-aa8f-4c39-93ca-22b6b592f213"> | | Windows | <video src="https://github.com/user-attachments/assets/80ae3ff3-5c9b-4211-9451-eeb9fc13c126"> | <video src="https://github.com/user-attachments/assets/fdd830fe-8017-4b12-882d-bf118be4a9f1"> |
…36280) <!-- !!!!!!! MAIN IS THE ONLY ACTIVE BRANCH. MAKE SURE THIS PR IS TARGETING MAIN. !!!!!!! --> ### Description of Change This PR fixes an Android issue where `Entry` configured with `Keyboard.Password` continued to obscure text even when `IsPassword` was set to `false`. The root cause was that `Keyboard.Password` initializes the underlying `InputType` with the password variation flags, but those flags were never removed when `IsPassword` was `false`. As a result, the platform `EditText` continued behaving as a password field. This change updates the Android input type configuration to explicitly clear the password variation flags whenever `IsPassword` is `false`, ensuring that `Entry.IsPassword` remains the source of truth for password visibility. ### Issues Fixed Fixes #35650 <!-- Are you targeting main? All PRs should target the main branch unless otherwise noted. --> --------- Co-authored-by: Frédéric Delaporte <12201973+fredericDelaporte@users.noreply.github.com> Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com>
…o Password (#36677) <!-- Please let the below note in for people that find this PR --> > [!NOTE] > Are you waiting for the changes in this PR to be merged? > It would be very helpful if you could [test the resulting artifacts](https://github.com/dotnet/maui/wiki/Testing-PR-Builds) from this PR and let us know in a comment if this change resolves your issue. Thank you! ### Issue Details - An Entry with Keyboard="Password" always renders text as masked, ignoring IsPassword=false. Setting IsPassword=false has no effect on iOS (initial load) and Windows (initial load and runtime toggle) when Keyboard="Password" is set. ### Root Cause - The MapIsPassword mapper runs before MapKeyboard in EntryHandler.cs on initial setup, so Keyboard.Password hardcodes masking behavior in ApplyKeyboard (iOS: SetSecureTextEntry(true)) and via an InputScope callback (Windows: OnInputScopePropertyChanged), both of which run after MapIsPassword and silently overwrite IsPassword=false. ### Description of Change - **iOS**: Removed the hardcoded SetSecureTextEntry(true) from the Keyboard.Password branch in KeyboardExtensions.cs. SecureTextEntry is now set exclusively by TextFieldExtensions.UpdateIsPassword, respecting the actual IsPassword value. - **Windows**: Removed the OnInputScopePropertyChanged callback from MauiPasswordTextBox that automatically forced IsPassword=true whenever InputScope changed to Password, allowing developers to set IsPassword=false even when Keyboard=Password is used. **Note**: The Android fix for the same issue is tracked separately in PR #36280. ### Issues Fixed Fixes #35650 ### Validated the behaviour in the following platforms - [x] Windows - [ ] Android - [x] iOS - [x] Mac ### Output | Platform | Before | After | |----------|----------|----------| | iOS | <video src="https://github.com/user-attachments/assets/1b249d36-8e83-434c-a7dc-b7a4b9c5a3f4"> | <video src="https://github.com/user-attachments/assets/1c917876-aa8f-4c39-93ca-22b6b592f213"> | | Windows | <video src="https://github.com/user-attachments/assets/80ae3ff3-5c9b-4211-9451-eeb9fc13c126"> | <video src="https://github.com/user-attachments/assets/fdd830fe-8017-4b12-882d-bf118be4a9f1"> |
…36280) <!-- !!!!!!! MAIN IS THE ONLY ACTIVE BRANCH. MAKE SURE THIS PR IS TARGETING MAIN. !!!!!!! --> ### Description of Change This PR fixes an Android issue where `Entry` configured with `Keyboard.Password` continued to obscure text even when `IsPassword` was set to `false`. The root cause was that `Keyboard.Password` initializes the underlying `InputType` with the password variation flags, but those flags were never removed when `IsPassword` was `false`. As a result, the platform `EditText` continued behaving as a password field. This change updates the Android input type configuration to explicitly clear the password variation flags whenever `IsPassword` is `false`, ensuring that `Entry.IsPassword` remains the source of truth for password visibility. ### Issues Fixed Fixes #35650 <!-- Are you targeting main? All PRs should target the main branch unless otherwise noted. --> --------- Co-authored-by: Frédéric Delaporte <12201973+fredericDelaporte@users.noreply.github.com> Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com>
…o Password (#36677) <!-- Please let the below note in for people that find this PR --> > [!NOTE] > Are you waiting for the changes in this PR to be merged? > It would be very helpful if you could [test the resulting artifacts](https://github.com/dotnet/maui/wiki/Testing-PR-Builds) from this PR and let us know in a comment if this change resolves your issue. Thank you! ### Issue Details - An Entry with Keyboard="Password" always renders text as masked, ignoring IsPassword=false. Setting IsPassword=false has no effect on iOS (initial load) and Windows (initial load and runtime toggle) when Keyboard="Password" is set. ### Root Cause - The MapIsPassword mapper runs before MapKeyboard in EntryHandler.cs on initial setup, so Keyboard.Password hardcodes masking behavior in ApplyKeyboard (iOS: SetSecureTextEntry(true)) and via an InputScope callback (Windows: OnInputScopePropertyChanged), both of which run after MapIsPassword and silently overwrite IsPassword=false. ### Description of Change - **iOS**: Removed the hardcoded SetSecureTextEntry(true) from the Keyboard.Password branch in KeyboardExtensions.cs. SecureTextEntry is now set exclusively by TextFieldExtensions.UpdateIsPassword, respecting the actual IsPassword value. - **Windows**: Removed the OnInputScopePropertyChanged callback from MauiPasswordTextBox that automatically forced IsPassword=true whenever InputScope changed to Password, allowing developers to set IsPassword=false even when Keyboard=Password is used. **Note**: The Android fix for the same issue is tracked separately in PR #36280. ### Issues Fixed Fixes #35650 ### Validated the behaviour in the following platforms - [x] Windows - [ ] Android - [x] iOS - [x] Mac ### Output | Platform | Before | After | |----------|----------|----------| | iOS | <video src="https://github.com/user-attachments/assets/1b249d36-8e83-434c-a7dc-b7a4b9c5a3f4"> | <video src="https://github.com/user-attachments/assets/1c917876-aa8f-4c39-93ca-22b6b592f213"> | | Windows | <video src="https://github.com/user-attachments/assets/80ae3ff3-5c9b-4211-9451-eeb9fc13c126"> | <video src="https://github.com/user-attachments/assets/fdd830fe-8017-4b12-882d-bf118be4a9f1"> |


Description of Change
This PR fixes an Android issue where
Entryconfigured withKeyboard.Passwordcontinued to obscure text even whenIsPasswordwas set tofalse.The root cause was that
Keyboard.Passwordinitializes the underlyingInputTypewith the password variation flags, but those flags were never removed whenIsPasswordwasfalse. As a result, the platformEditTextcontinued behaving as a password field.This change updates the Android input type configuration to explicitly clear the password variation flags whenever
IsPasswordisfalse, ensuring thatEntry.IsPasswordremains the source of truth for password visibility.Issues Fixed
Fixes #35650