From c2950b5896e9b69aeed3ae279f68731626ead2dd Mon Sep 17 00:00:00 2001 From: Contribucious <4764956+contribucious@users.noreply.github.com> Date: Tue, 14 Jul 2020 16:21:52 +0200 Subject: [PATCH 1/5] [KnownUsernameField] Engine update (make the system more flexible) --- src/Android/Accessibility/KnownUsernameField.cs | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/src/Android/Accessibility/KnownUsernameField.cs b/src/Android/Accessibility/KnownUsernameField.cs index 2cd6a91939d..91a886df275 100644 --- a/src/Android/Accessibility/KnownUsernameField.cs +++ b/src/Android/Accessibility/KnownUsernameField.cs @@ -2,15 +2,13 @@ { public class KnownUsernameField { - public KnownUsernameField(string uriAuthority, string uriPathEnd, string usernameViewId) + public KnownUsernameField(string uriAuthority, string[,] accessOptions) { UriAuthority = uriAuthority; - UriPathEnd = uriPathEnd; - UsernameViewId = usernameViewId; + AccessOptions = accessOptions; } public string UriAuthority { get; set; } - public string UriPathEnd { get; set; } - public string UsernameViewId { get; set; } + public string[,] AccessOptions { get; set; } } } From c1ecf773f8567a48f6e4b1387b112716aa140889 Mon Sep 17 00:00:00 2001 From: Contribucious <4764956+contribucious@users.noreply.github.com> Date: Tue, 14 Jul 2020 16:22:03 +0200 Subject: [PATCH 2/5] [KnownUsernameField] Engine update (make the system more flexible) --- .../Accessibility/AccessibilityHelpers.cs | 73 ++++++++++++++++--- 1 file changed, 61 insertions(+), 12 deletions(-) diff --git a/src/Android/Accessibility/AccessibilityHelpers.cs b/src/Android/Accessibility/AccessibilityHelpers.cs index 112399f795c..d8ba6b461d9 100644 --- a/src/Android/Accessibility/AccessibilityHelpers.cs +++ b/src/Android/Accessibility/AccessibilityHelpers.cs @@ -133,12 +133,12 @@ public static class AccessibilityHelpers // Be sure to keep these entries sorted alphabetically public static Dictionary KnownUsernameFields => new List { - new KnownUsernameField("accounts.google.com", "ServiceLogin", "Email"), - new KnownUsernameField("amazon.com", "signin", "ap_email_login"), - new KnownUsernameField("github.com", "", "user[login]-footer"), - new KnownUsernameField("paypal.com", "signin", "email"), - new KnownUsernameField("signin.aws.amazon.com", "signin", "resolving_input"), - new KnownUsernameField("signin.ebay.com", "eBayISAPI.dll", "userid"), + new KnownUsernameField("accounts.google.com", new string[,] { { "ServiceLogin", "Email" } }), + new KnownUsernameField("amazon.com", new string[,] { { "signin", "ap_email_login" } }), + new KnownUsernameField("github.com", new string[,] { { "", "user[login]-footer" } }), + new KnownUsernameField("paypal.com", new string[,] { { "signin", "email" } }), + new KnownUsernameField("signin.aws.amazon.com", new string[,] { { "signin", "resolving_input" } }), + new KnownUsernameField("signin.ebay.com", new string[,] { { "eBayISAPI.dll", "userid" } }), }.ToDictionary(n => n.UriAuthority); public static void PrintTestData(AccessibilityNodeInfo root, AccessibilityEvent e) @@ -314,7 +314,7 @@ public static AccessibilityNodeInfo GetUsernameEditText(string uriString, if (Uri.TryCreate(uriString, UriKind.Absolute, out var uri)) { uriAuthority = uri.Authority; - uriKey = uriAuthority.StartsWith("www.") ? uriAuthority.Substring(4) : uriAuthority; + uriKey = uriAuthority.StartsWith("www.", StringComparison.Ordinal) ? uriAuthority.Substring(4) : uriAuthority; uriLocalPath = uri.LocalPath; } @@ -330,15 +330,64 @@ public static AccessibilityNodeInfo GetUsernameEditText(string uriString, if (KnownUsernameFields.ContainsKey(uriKey)) { var usernameField = KnownUsernameFields[uriKey]; - if (uriLocalPath.EndsWith(usernameField.UriPathEnd)) + string[,] accessOptions = usernameField.AccessOptions; + + for (int i = 0; i < accessOptions.GetLength(0); i++) { - foreach (var editText in allEditTexts) + string curUriPathWanted = accessOptions[i, 0]; + string curUsernameViewId = accessOptions[i, 1]; + bool uriLocalPathMatches = false; + + // Case-sensitive comparison + if (curUriPathWanted.StartsWith("startswith:", StringComparison.Ordinal)) + { + curUriPathWanted = curUriPathWanted.Substring(11); + uriLocalPathMatches = uriLocalPath.StartsWith(curUriPathWanted, StringComparison.Ordinal); + } + else if (curUriPathWanted.StartsWith("contains:", StringComparison.Ordinal)) + { + curUriPathWanted = curUriPathWanted.Substring(9); + uriLocalPathMatches = uriLocalPath.Contains(curUriPathWanted, StringComparison.Ordinal); + } + else if (curUriPathWanted.StartsWith("endswith:", StringComparison.Ordinal)) + { + curUriPathWanted = curUriPathWanted.Substring(9); + uriLocalPathMatches = uriLocalPath.EndsWith(curUriPathWanted, StringComparison.Ordinal); + } + + // Case-insensitive comparison + else if (curUriPathWanted.StartsWith("istartswith:", StringComparison.Ordinal)) + { + curUriPathWanted = curUriPathWanted.Substring(12); + uriLocalPathMatches = uriLocalPath.StartsWith(curUriPathWanted, StringComparison.OrdinalIgnoreCase); + } + else if (curUriPathWanted.StartsWith("icontains:", StringComparison.Ordinal)) + { + curUriPathWanted = curUriPathWanted.Substring(10); + uriLocalPathMatches = uriLocalPath.IndexOf(curUriPathWanted, StringComparison.OrdinalIgnoreCase) >= 0; + } + else if (curUriPathWanted.StartsWith("iendswith:", StringComparison.Ordinal)) + { + curUriPathWanted = curUriPathWanted.Substring(10); + uriLocalPathMatches = uriLocalPath.EndsWith(curUriPathWanted, StringComparison.OrdinalIgnoreCase); + } + + // Default type of comparison + else + { + uriLocalPathMatches = uriLocalPath.EndsWith(curUriPathWanted, StringComparison.Ordinal); + } + + if (uriLocalPathMatches) { - foreach (var usernameViewId in usernameField.UsernameViewId.Split(",")) + foreach (var editText in allEditTexts) { - if (usernameViewId == editText.ViewIdResourceName) + foreach (var usernameViewId in curUsernameViewId.Split(",")) { - return editText; + if (usernameViewId == editText.ViewIdResourceName) + { + return editText; + } } } } From 057fd6bbf7baabfca2d054f290562c624ffce8f4 Mon Sep 17 00:00:00 2001 From: Contribucious <4764956+contribucious@users.noreply.github.com> Date: Thu, 30 Jul 2020 09:29:20 +0000 Subject: [PATCH 3/5] Use of tuples array instead of multidimensional array (string[,]) --- src/Android/Accessibility/KnownUsernameField.cs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/Android/Accessibility/KnownUsernameField.cs b/src/Android/Accessibility/KnownUsernameField.cs index 91a886df275..f8db476fe46 100644 --- a/src/Android/Accessibility/KnownUsernameField.cs +++ b/src/Android/Accessibility/KnownUsernameField.cs @@ -2,13 +2,13 @@ { public class KnownUsernameField { - public KnownUsernameField(string uriAuthority, string[,] accessOptions) + public KnownUsernameField(string uriAuthority, (string UriPathWanted, string UsernameViewId)[] accessOptions) { UriAuthority = uriAuthority; AccessOptions = accessOptions; } public string UriAuthority { get; set; } - public string[,] AccessOptions { get; set; } + public (string UriPathWanted, string UsernameViewId)[] AccessOptions { get; set; } } } From cab87a91cdc92dc39f9e94ffb328d6c308f0fc20 Mon Sep 17 00:00:00 2001 From: Contribucious <4764956+contribucious@users.noreply.github.com> Date: Thu, 30 Jul 2020 09:29:26 +0000 Subject: [PATCH 4/5] Use of tuples array instead of multidimensional array (string[,]) --- .../Accessibility/AccessibilityHelpers.cs | 20 +++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/src/Android/Accessibility/AccessibilityHelpers.cs b/src/Android/Accessibility/AccessibilityHelpers.cs index d8ba6b461d9..69369119428 100644 --- a/src/Android/Accessibility/AccessibilityHelpers.cs +++ b/src/Android/Accessibility/AccessibilityHelpers.cs @@ -133,12 +133,12 @@ public static class AccessibilityHelpers // Be sure to keep these entries sorted alphabetically public static Dictionary KnownUsernameFields => new List { - new KnownUsernameField("accounts.google.com", new string[,] { { "ServiceLogin", "Email" } }), - new KnownUsernameField("amazon.com", new string[,] { { "signin", "ap_email_login" } }), - new KnownUsernameField("github.com", new string[,] { { "", "user[login]-footer" } }), - new KnownUsernameField("paypal.com", new string[,] { { "signin", "email" } }), - new KnownUsernameField("signin.aws.amazon.com", new string[,] { { "signin", "resolving_input" } }), - new KnownUsernameField("signin.ebay.com", new string[,] { { "eBayISAPI.dll", "userid" } }), + new KnownUsernameField("accounts.google.com", new (string, string)[] { ("ServiceLogin", "Email") }), + new KnownUsernameField("amazon.com", new (string, string)[] { ("signin", "ap_email_login") }), + new KnownUsernameField("github.com", new (string, string)[] { ("", "user[login]-footer") }), + new KnownUsernameField("paypal.com", new (string, string)[] { ("signin", "email") }), + new KnownUsernameField("signin.aws.amazon.com", new (string, string)[] { ("signin", "resolving_input") }), + new KnownUsernameField("signin.ebay.com", new (string, string)[] { ("eBayISAPI.dll", "userid") }), }.ToDictionary(n => n.UriAuthority); public static void PrintTestData(AccessibilityNodeInfo root, AccessibilityEvent e) @@ -330,12 +330,12 @@ public static AccessibilityNodeInfo GetUsernameEditText(string uriString, if (KnownUsernameFields.ContainsKey(uriKey)) { var usernameField = KnownUsernameFields[uriKey]; - string[,] accessOptions = usernameField.AccessOptions; + (string UriPathWanted, string UsernameViewId)[] accessOptions = usernameField.AccessOptions; - for (int i = 0; i < accessOptions.GetLength(0); i++) + for (int i = 0; i < accessOptions.Length; i++) { - string curUriPathWanted = accessOptions[i, 0]; - string curUsernameViewId = accessOptions[i, 1]; + string curUriPathWanted = accessOptions[i].UriPathWanted; + string curUsernameViewId = accessOptions[i].UsernameViewId; bool uriLocalPathMatches = false; // Case-sensitive comparison From bbf7b7048095931a6ec000a26b2e1beb58fe1d1b Mon Sep 17 00:00:00 2001 From: Contribucious <4764956+contribucious@users.noreply.github.com> Date: Thu, 6 Aug 2020 18:23:55 +0200 Subject: [PATCH 5/5] [FIX] IndexOf -> Contains --- src/Android/Accessibility/AccessibilityHelpers.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Android/Accessibility/AccessibilityHelpers.cs b/src/Android/Accessibility/AccessibilityHelpers.cs index 69369119428..a304c78e9c9 100644 --- a/src/Android/Accessibility/AccessibilityHelpers.cs +++ b/src/Android/Accessibility/AccessibilityHelpers.cs @@ -364,7 +364,7 @@ public static AccessibilityNodeInfo GetUsernameEditText(string uriString, else if (curUriPathWanted.StartsWith("icontains:", StringComparison.Ordinal)) { curUriPathWanted = curUriPathWanted.Substring(10); - uriLocalPathMatches = uriLocalPath.IndexOf(curUriPathWanted, StringComparison.OrdinalIgnoreCase) >= 0; + uriLocalPathMatches = uriLocalPath.Contains(curUriPathWanted, StringComparison.OrdinalIgnoreCase); } else if (curUriPathWanted.StartsWith("iendswith:", StringComparison.Ordinal)) {