add more autofill tests and change AutofillParser to make them pass
This commit is contained in:
@@ -323,6 +323,7 @@ namespace Kp2aAutofillParser
|
||||
AutofillHintPassword,
|
||||
AutofillHintUsername,
|
||||
W3cHints.HONORIFIC_PREFIX,
|
||||
W3cHints.EMAIL,
|
||||
W3cHints.NAME,
|
||||
W3cHints.GIVEN_NAME,
|
||||
W3cHints.ADDITIONAL_NAME,
|
||||
@@ -430,20 +431,26 @@ namespace Kp2aAutofillParser
|
||||
/// <summary>
|
||||
/// transforms hints by replacing some W3cHints by their Android counterparts and transforming everything to lowercase
|
||||
/// </summary>
|
||||
public static List<string> ConvertToCanonicalHints(string[] supportedHints)
|
||||
public static List<string> ConvertToCanonicalLowerCaseHints(string[] supportedHints)
|
||||
{
|
||||
List<string> result = new List<string>();
|
||||
foreach (string hint in supportedHints)
|
||||
{
|
||||
string canonicalHint;
|
||||
if (!hintToCanonicalReplacement.TryGetValue(hint, out canonicalHint))
|
||||
canonicalHint = hint;
|
||||
var canonicalHint = ToCanonicalHint(hint);
|
||||
result.Add(canonicalHint.ToLower());
|
||||
}
|
||||
return result;
|
||||
|
||||
}
|
||||
|
||||
public static string ToCanonicalHint(string hint)
|
||||
{
|
||||
string canonicalHint;
|
||||
if (!hintToCanonicalReplacement.TryGetValue(hint, out canonicalHint))
|
||||
canonicalHint = hint;
|
||||
return canonicalHint;
|
||||
}
|
||||
|
||||
public static int GetPartitionIndex(string hint)
|
||||
{
|
||||
for (int i = 0; i < partitionsOfCanonicalHints.Count; i++)
|
||||
@@ -657,7 +664,7 @@ namespace Kp2aAutofillParser
|
||||
|
||||
}
|
||||
}
|
||||
AutofillHints = AutofillHintsHelper.ConvertToCanonicalHints(hintList.ToArray()).ToArray();
|
||||
AutofillHints = AutofillHintsHelper.ConvertToCanonicalLowerCaseHints(hintList.ToArray()).ToArray();
|
||||
|
||||
|
||||
}
|
||||
@@ -699,8 +706,8 @@ namespace Kp2aAutofillParser
|
||||
/// </summary>
|
||||
public abstract class InputField
|
||||
{
|
||||
public string IdEntry { get; set; }
|
||||
public string Hint { get; set; }
|
||||
public string? IdEntry { get; set; }
|
||||
public string? Hint { get; set; }
|
||||
public string ClassName { get; set; }
|
||||
public string[] AutofillHints { get; set; }
|
||||
public bool IsFocused { get; set; }
|
||||
@@ -819,7 +826,7 @@ namespace Kp2aAutofillParser
|
||||
// * if there is no such autofill hint, we use IsPassword to
|
||||
|
||||
HashSet<string> autofillHintsOfAllFields = autofillView.InputFields.Where(f => f.AutofillHints != null)
|
||||
.SelectMany(f => f.AutofillHints).ToHashSet();
|
||||
.SelectMany(f => f.AutofillHints).Select(AutofillHintsHelper.ToCanonicalHint).ToHashSet();
|
||||
bool hasLoginAutofillHints = autofillHintsOfAllFields.Intersect(_autofillHintsForLogin).Any();
|
||||
|
||||
if (hasLoginAutofillHints)
|
||||
@@ -829,9 +836,9 @@ namespace Kp2aAutofillParser
|
||||
string[] viewHints = viewNode.AutofillHints;
|
||||
if (viewHints == null)
|
||||
continue;
|
||||
if (viewHints.Intersect(_autofillHintsForLogin).Any())
|
||||
if (viewHints.Select(AutofillHintsHelper.ToCanonicalHint).Intersect(_autofillHintsForLogin).Any())
|
||||
{
|
||||
FieldsMappedToHints.Add(viewNode, viewHints);
|
||||
FieldsMappedToHints.Add(viewNode, viewHints.Select(AutofillHintsHelper.ToCanonicalHint).ToHashSet().ToArray());
|
||||
}
|
||||
|
||||
}
|
||||
@@ -839,6 +846,7 @@ namespace Kp2aAutofillParser
|
||||
else
|
||||
{
|
||||
//determine password fields, first by type, then by hint:
|
||||
List<FieldT> editTexts = autofillView.InputFields.Where(f => IsEditText(f)).ToList();
|
||||
List<FieldT> passwordFields = autofillView.InputFields.Where(f => IsEditText(f) && IsPassword(f)).ToList();
|
||||
if (!passwordFields.Any())
|
||||
{
|
||||
@@ -851,8 +859,10 @@ namespace Kp2aAutofillParser
|
||||
{
|
||||
foreach (var passwordField in passwordFields)
|
||||
{
|
||||
var lastInputBeforePassword = autofillView.InputFields
|
||||
.TakeWhile(f => IsEditText(f) && f != passwordField && !passwordFields.Contains(f)).LastOrDefault();
|
||||
|
||||
var lastInputBeforePassword = autofillView.InputFields.Where(IsEditText)
|
||||
.TakeWhile(f => f != passwordField && !passwordFields.Contains(f)).LastOrDefault();
|
||||
|
||||
if (lastInputBeforePassword != null)
|
||||
usernameFields.Add(lastInputBeforePassword);
|
||||
}
|
||||
@@ -864,7 +874,7 @@ namespace Kp2aAutofillParser
|
||||
{
|
||||
foreach (var uf in usernameFields)
|
||||
FieldsMappedToHints.Add(uf, new string[] { AutofillHintsHelper.AutofillHintUsername });
|
||||
foreach (var pf in passwordFields)
|
||||
foreach (var pf in passwordFields.Except(usernameFields))
|
||||
FieldsMappedToHints.Add(pf, new string[] { AutofillHintsHelper.AutofillHintPassword });
|
||||
}
|
||||
}
|
||||
@@ -894,23 +904,22 @@ namespace Kp2aAutofillParser
|
||||
|| f.HtmlInfoTag == "input");
|
||||
}
|
||||
|
||||
private static readonly HashSet<string> _passwordHints = new HashSet<string> { "password", "passwort"
|
||||
/*, "passwordAuto", "pswd"*/ };
|
||||
private static readonly HashSet<string> _passwordHints = new HashSet<string> { "password", "passwort", "passwordAuto", "pswd" };
|
||||
private static bool HasPasswordHint(InputField f)
|
||||
{
|
||||
return IsAny(f.IdEntry, _passwordHints) ||
|
||||
IsAny(f.Hint, _passwordHints);
|
||||
}
|
||||
|
||||
private static readonly HashSet<string> _usernameHints = new HashSet<string> { "email", "e-mail", "username" };
|
||||
private static readonly HashSet<string> _usernameHints = new HashSet<string> { "email", "e-mail", "username", "user id" };
|
||||
|
||||
private static bool HasUsernameHint(InputField f)
|
||||
{
|
||||
return IsAny(f.IdEntry, _usernameHints) ||
|
||||
IsAny(f.Hint, _usernameHints);
|
||||
return IsAny(f.IdEntry?.ToLower(), _usernameHints) ||
|
||||
IsAny(f.Hint?.ToLower(), _usernameHints);
|
||||
}
|
||||
|
||||
private static bool IsAny(string value, IEnumerable<string> terms)
|
||||
private static bool IsAny(string? value, IEnumerable<string> terms)
|
||||
{
|
||||
if (string.IsNullOrWhiteSpace(value))
|
||||
{
|
||||
@@ -935,6 +944,11 @@ namespace Kp2aAutofillParser
|
||||
|
||||
private static bool IsPassword(InputField f)
|
||||
{
|
||||
if (f.IdEntry?.Contains("password") == true)
|
||||
{
|
||||
f = f;
|
||||
}
|
||||
|
||||
InputTypes inputType = f.InputType;
|
||||
|
||||
return
|
||||
|
@@ -41,6 +41,27 @@ namespace Kp2aAutofillParserTest
|
||||
RunTestFromAutofillInput(resourceName, "org.mozilla.firefox", "www.amazon.it");
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void CanDetectFieldsWithoutAutofillHints()
|
||||
{
|
||||
var resourceName = "Kp2aAutofillParserTest.chrome-android10-amazon-it.json";
|
||||
RunTestFromAutofillInput(resourceName, "com.android.chrome", "www.amazon.it");
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void DetectsUsernameFieldDespitePasswordAutoHint()
|
||||
{
|
||||
var resourceName = "Kp2aAutofillParserTest.com-ifs-banking-fiid3364-android13.json";
|
||||
RunTestFromAutofillInput(resourceName, "com.ifs.banking.fiid3364", null);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void DetectsEmailAutofillHint()
|
||||
{
|
||||
var resourceName = "Kp2aAutofillParserTest.com-expressvpn-vpn-android13.json";
|
||||
RunTestFromAutofillInput(resourceName, "com.expressvpn.vpn", null);
|
||||
}
|
||||
|
||||
private void RunTestFromAutofillInput(string resourceName, string expectedPackageName = null, string expectedWebDomain = null)
|
||||
{
|
||||
var assembly = Assembly.GetExecutingAssembly();
|
||||
|
@@ -9,6 +9,9 @@
|
||||
</PropertyGroup>
|
||||
|
||||
<ItemGroup>
|
||||
<None Remove="chrome-android10-amazon-it.json" />
|
||||
<None Remove="com-expressvpn-vpn-android13.json" />
|
||||
<None Remove="com-ifs-banking-fiid3364-android13.json" />
|
||||
<None Remove="com-servicenet-mobile-focused.json" />
|
||||
<None Remove="com-servicenet-mobile-no-focus.json" />
|
||||
<None Remove="firefox-amazon-it.json" />
|
||||
@@ -32,6 +35,15 @@
|
||||
</ItemGroup>
|
||||
|
||||
<ItemGroup>
|
||||
<EmbeddedResource Include="chrome-android10-amazon-it.json">
|
||||
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
|
||||
</EmbeddedResource>
|
||||
<EmbeddedResource Include="com-expressvpn-vpn-android13.json">
|
||||
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
|
||||
</EmbeddedResource>
|
||||
<EmbeddedResource Include="com-ifs-banking-fiid3364-android13.json">
|
||||
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
|
||||
</EmbeddedResource>
|
||||
<EmbeddedResource Include="firefox-amazon-it.json">
|
||||
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
|
||||
</EmbeddedResource>
|
||||
|
2018
src/Kp2aAutofillParserTest/chrome-android10-amazon-it.json
Normal file
2018
src/Kp2aAutofillParserTest/chrome-android10-amazon-it.json
Normal file
File diff suppressed because it is too large
Load Diff
226
src/Kp2aAutofillParserTest/com-expressvpn-vpn-android13.json
Normal file
226
src/Kp2aAutofillParserTest/com-expressvpn-vpn-android13.json
Normal file
@@ -0,0 +1,226 @@
|
||||
{
|
||||
"InputFields": [
|
||||
{
|
||||
"IdEntry": null,
|
||||
"Hint": null,
|
||||
"ClassName": "android.widget.FrameLayout",
|
||||
"AutofillHints": null,
|
||||
"IsFocused": false,
|
||||
"InputType": 0,
|
||||
"HtmlInfoTag": null,
|
||||
"HtmlInfoTypeAttribute": null
|
||||
},
|
||||
{
|
||||
"IdEntry": "action_bar_root",
|
||||
"Hint": null,
|
||||
"ClassName": "android.widget.LinearLayout",
|
||||
"AutofillHints": null,
|
||||
"IsFocused": false,
|
||||
"InputType": 0,
|
||||
"HtmlInfoTag": null,
|
||||
"HtmlInfoTypeAttribute": null
|
||||
},
|
||||
{
|
||||
"IdEntry": "action_mode_bar_stub",
|
||||
"Hint": null,
|
||||
"ClassName": "android.view.View",
|
||||
"AutofillHints": null,
|
||||
"IsFocused": false,
|
||||
"InputType": 0,
|
||||
"HtmlInfoTag": null,
|
||||
"HtmlInfoTypeAttribute": null
|
||||
},
|
||||
{
|
||||
"IdEntry": "layout",
|
||||
"Hint": null,
|
||||
"ClassName": "android.view.ViewGroup",
|
||||
"AutofillHints": null,
|
||||
"IsFocused": false,
|
||||
"InputType": 0,
|
||||
"HtmlInfoTag": null,
|
||||
"HtmlInfoTypeAttribute": null
|
||||
},
|
||||
{
|
||||
"IdEntry": "textView2",
|
||||
"Hint": null,
|
||||
"ClassName": "android.widget.TextView",
|
||||
"AutofillHints": null,
|
||||
"IsFocused": false,
|
||||
"InputType": 0,
|
||||
"HtmlInfoTag": null,
|
||||
"HtmlInfoTypeAttribute": null
|
||||
},
|
||||
{
|
||||
"IdEntry": "emailLayout",
|
||||
"Hint": null,
|
||||
"ClassName": "android.widget.LinearLayout",
|
||||
"AutofillHints": null,
|
||||
"IsFocused": false,
|
||||
"InputType": 0,
|
||||
"HtmlInfoTag": null,
|
||||
"HtmlInfoTypeAttribute": null
|
||||
},
|
||||
{
|
||||
"IdEntry": "email",
|
||||
"Hint": "E-Mail",
|
||||
"ClassName": "android.widget.EditText",
|
||||
"AutofillHints": [
|
||||
"email"
|
||||
],
|
||||
"IsFocused": true,
|
||||
"InputType": 33,
|
||||
"HtmlInfoTag": null,
|
||||
"HtmlInfoTypeAttribute": null,
|
||||
"ExpectedAssignedHints": [ "emailAddress" ]
|
||||
},
|
||||
{
|
||||
"IdEntry": null,
|
||||
"Hint": null,
|
||||
"ClassName": "android.widget.LinearLayout",
|
||||
"AutofillHints": null,
|
||||
"IsFocused": false,
|
||||
"InputType": 0,
|
||||
"HtmlInfoTag": null,
|
||||
"HtmlInfoTypeAttribute": null
|
||||
},
|
||||
{
|
||||
"IdEntry": null,
|
||||
"Hint": null,
|
||||
"ClassName": "android.widget.LinearLayout",
|
||||
"AutofillHints": null,
|
||||
"IsFocused": false,
|
||||
"InputType": 0,
|
||||
"HtmlInfoTag": null,
|
||||
"HtmlInfoTypeAttribute": null
|
||||
},
|
||||
{
|
||||
"IdEntry": "passwordLayout",
|
||||
"Hint": null,
|
||||
"ClassName": "android.widget.LinearLayout",
|
||||
"AutofillHints": null,
|
||||
"IsFocused": false,
|
||||
"InputType": 0,
|
||||
"HtmlInfoTag": null,
|
||||
"HtmlInfoTypeAttribute": null
|
||||
},
|
||||
{
|
||||
"IdEntry": "password",
|
||||
"Hint": "Passwort",
|
||||
"ClassName": "android.widget.EditText",
|
||||
"AutofillHints": [
|
||||
"password",
|
||||
"passwordAuto"
|
||||
],
|
||||
"IsFocused": false,
|
||||
"InputType": 129,
|
||||
"HtmlInfoTag": null,
|
||||
"HtmlInfoTypeAttribute": null,
|
||||
"ExpectedAssignedHints": [
|
||||
"password",
|
||||
"passwordAuto"
|
||||
]
|
||||
},
|
||||
{
|
||||
"IdEntry": null,
|
||||
"Hint": null,
|
||||
"ClassName": "android.widget.LinearLayout",
|
||||
"AutofillHints": null,
|
||||
"IsFocused": false,
|
||||
"InputType": 0,
|
||||
"HtmlInfoTag": null,
|
||||
"HtmlInfoTypeAttribute": null
|
||||
},
|
||||
{
|
||||
"IdEntry": null,
|
||||
"Hint": null,
|
||||
"ClassName": "android.widget.LinearLayout",
|
||||
"AutofillHints": null,
|
||||
"IsFocused": false,
|
||||
"InputType": 0,
|
||||
"HtmlInfoTag": null,
|
||||
"HtmlInfoTypeAttribute": null
|
||||
},
|
||||
{
|
||||
"IdEntry": "textinput_suffix_text",
|
||||
"Hint": null,
|
||||
"ClassName": "android.widget.TextView",
|
||||
"AutofillHints": null,
|
||||
"IsFocused": false,
|
||||
"InputType": 0,
|
||||
"HtmlInfoTag": null,
|
||||
"HtmlInfoTypeAttribute": null
|
||||
},
|
||||
{
|
||||
"IdEntry": "forgotPassword",
|
||||
"Hint": null,
|
||||
"ClassName": "android.widget.Button",
|
||||
"AutofillHints": null,
|
||||
"IsFocused": false,
|
||||
"InputType": 0,
|
||||
"HtmlInfoTag": null,
|
||||
"HtmlInfoTypeAttribute": null
|
||||
},
|
||||
{
|
||||
"IdEntry": "amazonInfo",
|
||||
"Hint": null,
|
||||
"ClassName": "android.widget.FrameLayout",
|
||||
"AutofillHints": null,
|
||||
"IsFocused": false,
|
||||
"InputType": 0,
|
||||
"HtmlInfoTag": null,
|
||||
"HtmlInfoTypeAttribute": null
|
||||
},
|
||||
{
|
||||
"IdEntry": "signInButtonBarrier",
|
||||
"Hint": null,
|
||||
"ClassName": "android.view.View",
|
||||
"AutofillHints": null,
|
||||
"IsFocused": false,
|
||||
"InputType": 0,
|
||||
"HtmlInfoTag": null,
|
||||
"HtmlInfoTypeAttribute": null
|
||||
},
|
||||
{
|
||||
"IdEntry": "signIn",
|
||||
"Hint": null,
|
||||
"ClassName": "android.widget.Button",
|
||||
"AutofillHints": null,
|
||||
"IsFocused": false,
|
||||
"InputType": 0,
|
||||
"HtmlInfoTag": null,
|
||||
"HtmlInfoTypeAttribute": null
|
||||
},
|
||||
{
|
||||
"IdEntry": "newUser",
|
||||
"Hint": null,
|
||||
"ClassName": "android.widget.Button",
|
||||
"AutofillHints": null,
|
||||
"IsFocused": false,
|
||||
"InputType": 0,
|
||||
"HtmlInfoTag": null,
|
||||
"HtmlInfoTypeAttribute": null
|
||||
},
|
||||
{
|
||||
"IdEntry": "focusThief",
|
||||
"Hint": null,
|
||||
"ClassName": "android.view.View",
|
||||
"AutofillHints": null,
|
||||
"IsFocused": false,
|
||||
"InputType": 0,
|
||||
"HtmlInfoTag": null,
|
||||
"HtmlInfoTypeAttribute": null
|
||||
},
|
||||
{
|
||||
"IdEntry": "activatingContainer",
|
||||
"Hint": null,
|
||||
"ClassName": "android.widget.FrameLayout",
|
||||
"AutofillHints": null,
|
||||
"IsFocused": false,
|
||||
"InputType": 0,
|
||||
"HtmlInfoTag": null,
|
||||
"HtmlInfoTypeAttribute": null
|
||||
}
|
||||
],
|
||||
"PackageId": "com.expressvpn.vpn",
|
||||
"WebDomain": null
|
||||
}
|
@@ -0,0 +1,322 @@
|
||||
{
|
||||
"InputFields": [
|
||||
{
|
||||
"IdEntry": null,
|
||||
"Hint": null,
|
||||
"ClassName": "android.widget.FrameLayout",
|
||||
"AutofillHints": null,
|
||||
"IsFocused": false,
|
||||
"InputType": 0,
|
||||
"HtmlInfoTag": null,
|
||||
"HtmlInfoTypeAttribute": null
|
||||
},
|
||||
{
|
||||
"IdEntry": "action_bar_root",
|
||||
"Hint": null,
|
||||
"ClassName": "android.widget.LinearLayout",
|
||||
"AutofillHints": null,
|
||||
"IsFocused": false,
|
||||
"InputType": 0,
|
||||
"HtmlInfoTag": null,
|
||||
"HtmlInfoTypeAttribute": null
|
||||
},
|
||||
{
|
||||
"IdEntry": "action_mode_bar_stub",
|
||||
"Hint": null,
|
||||
"ClassName": "android.view.View",
|
||||
"AutofillHints": null,
|
||||
"IsFocused": false,
|
||||
"InputType": 0,
|
||||
"HtmlInfoTag": null,
|
||||
"HtmlInfoTypeAttribute": null
|
||||
},
|
||||
{
|
||||
"IdEntry": "loginParent",
|
||||
"Hint": null,
|
||||
"ClassName": "android.view.ViewGroup",
|
||||
"AutofillHints": null,
|
||||
"IsFocused": false,
|
||||
"InputType": 0,
|
||||
"HtmlInfoTag": null,
|
||||
"HtmlInfoTypeAttribute": null
|
||||
},
|
||||
{
|
||||
"IdEntry": "rooted_device_error_screen",
|
||||
"Hint": null,
|
||||
"ClassName": "android.widget.LinearLayout",
|
||||
"AutofillHints": null,
|
||||
"IsFocused": false,
|
||||
"InputType": 0,
|
||||
"HtmlInfoTag": null,
|
||||
"HtmlInfoTypeAttribute": null
|
||||
},
|
||||
{
|
||||
"IdEntry": "scroll",
|
||||
"Hint": null,
|
||||
"ClassName": "android.widget.ScrollView",
|
||||
"AutofillHints": null,
|
||||
"IsFocused": false,
|
||||
"InputType": 0,
|
||||
"HtmlInfoTag": null,
|
||||
"HtmlInfoTypeAttribute": null
|
||||
},
|
||||
{
|
||||
"IdEntry": "login_box_layout",
|
||||
"Hint": null,
|
||||
"ClassName": "android.view.ViewGroup",
|
||||
"AutofillHints": null,
|
||||
"IsFocused": false,
|
||||
"InputType": 0,
|
||||
"HtmlInfoTag": null,
|
||||
"HtmlInfoTypeAttribute": null
|
||||
},
|
||||
{
|
||||
"IdEntry": "loginFragment_container_view",
|
||||
"Hint": null,
|
||||
"ClassName": "android.widget.FrameLayout",
|
||||
"AutofillHints": null,
|
||||
"IsFocused": false,
|
||||
"InputType": 0,
|
||||
"HtmlInfoTag": null,
|
||||
"HtmlInfoTypeAttribute": null
|
||||
},
|
||||
{
|
||||
"IdEntry": "login_box",
|
||||
"Hint": null,
|
||||
"ClassName": "android.view.ViewGroup",
|
||||
"AutofillHints": null,
|
||||
"IsFocused": false,
|
||||
"InputType": 0,
|
||||
"HtmlInfoTag": null,
|
||||
"HtmlInfoTypeAttribute": null
|
||||
},
|
||||
{
|
||||
"IdEntry": "Edt_UserId",
|
||||
"Hint": "User ID",
|
||||
"ClassName": "android.widget.EditText",
|
||||
"AutofillHints": [
|
||||
"passwordAuto"
|
||||
],
|
||||
"IsFocused": true,
|
||||
"InputType": 145,
|
||||
"HtmlInfoTag": null,
|
||||
"HtmlInfoTypeAttribute": null,
|
||||
"ExpectedAssignedHints": [ "username" ]
|
||||
},
|
||||
{
|
||||
"IdEntry": "login_save_userid_switch",
|
||||
"Hint": null,
|
||||
"ClassName": "android.widget.CompoundButton",
|
||||
"AutofillHints": null,
|
||||
"IsFocused": false,
|
||||
"InputType": 0,
|
||||
"HtmlInfoTag": null,
|
||||
"HtmlInfoTypeAttribute": null
|
||||
},
|
||||
{
|
||||
"IdEntry": "Edt_Password_layout",
|
||||
"Hint": null,
|
||||
"ClassName": "android.widget.LinearLayout",
|
||||
"AutofillHints": null,
|
||||
"IsFocused": false,
|
||||
"InputType": 0,
|
||||
"HtmlInfoTag": null,
|
||||
"HtmlInfoTypeAttribute": null
|
||||
},
|
||||
{
|
||||
"IdEntry": "Edt_Password",
|
||||
"Hint": null,
|
||||
"ClassName": "android.widget.EditText",
|
||||
"AutofillHints": [
|
||||
"passwordAuto"
|
||||
],
|
||||
"IsFocused": false,
|
||||
"InputType": 129,
|
||||
"HtmlInfoTag": null,
|
||||
"HtmlInfoTypeAttribute": null,
|
||||
"ExpectedAssignedHints": [ "password" ]
|
||||
},
|
||||
{
|
||||
"IdEntry": null,
|
||||
"Hint": null,
|
||||
"ClassName": "android.widget.LinearLayout",
|
||||
"AutofillHints": null,
|
||||
"IsFocused": false,
|
||||
"InputType": 0,
|
||||
"HtmlInfoTag": null,
|
||||
"HtmlInfoTypeAttribute": null
|
||||
},
|
||||
{
|
||||
"IdEntry": "textinput_prefix_text",
|
||||
"Hint": null,
|
||||
"ClassName": "android.widget.TextView",
|
||||
"AutofillHints": null,
|
||||
"IsFocused": false,
|
||||
"InputType": 0,
|
||||
"HtmlInfoTag": null,
|
||||
"HtmlInfoTypeAttribute": null
|
||||
},
|
||||
{
|
||||
"IdEntry": null,
|
||||
"Hint": null,
|
||||
"ClassName": "android.widget.LinearLayout",
|
||||
"AutofillHints": null,
|
||||
"IsFocused": false,
|
||||
"InputType": 0,
|
||||
"HtmlInfoTag": null,
|
||||
"HtmlInfoTypeAttribute": null
|
||||
},
|
||||
{
|
||||
"IdEntry": "textinput_suffix_text",
|
||||
"Hint": null,
|
||||
"ClassName": "android.widget.TextView",
|
||||
"AutofillHints": null,
|
||||
"IsFocused": false,
|
||||
"InputType": 0,
|
||||
"HtmlInfoTag": null,
|
||||
"HtmlInfoTypeAttribute": null
|
||||
},
|
||||
{
|
||||
"IdEntry": "textinput_placeholder",
|
||||
"Hint": null,
|
||||
"ClassName": "android.widget.TextView",
|
||||
"AutofillHints": null,
|
||||
"IsFocused": false,
|
||||
"InputType": 0,
|
||||
"HtmlInfoTag": null,
|
||||
"HtmlInfoTypeAttribute": null
|
||||
},
|
||||
{
|
||||
"IdEntry": "forgot_login_btn",
|
||||
"Hint": null,
|
||||
"ClassName": "android.widget.Button",
|
||||
"AutofillHints": null,
|
||||
"IsFocused": false,
|
||||
"InputType": 0,
|
||||
"HtmlInfoTag": null,
|
||||
"HtmlInfoTypeAttribute": null
|
||||
},
|
||||
{
|
||||
"IdEntry": "Btn_Login",
|
||||
"Hint": null,
|
||||
"ClassName": "android.widget.Button",
|
||||
"AutofillHints": null,
|
||||
"IsFocused": false,
|
||||
"InputType": 0,
|
||||
"HtmlInfoTag": null,
|
||||
"HtmlInfoTypeAttribute": null
|
||||
},
|
||||
{
|
||||
"IdEntry": "login_fab_fragment_container",
|
||||
"Hint": null,
|
||||
"ClassName": "android.widget.FrameLayout",
|
||||
"AutofillHints": null,
|
||||
"IsFocused": false,
|
||||
"InputType": 0,
|
||||
"HtmlInfoTag": null,
|
||||
"HtmlInfoTypeAttribute": null
|
||||
},
|
||||
{
|
||||
"IdEntry": "biometric_fragment_container",
|
||||
"Hint": null,
|
||||
"ClassName": "android.widget.FrameLayout",
|
||||
"AutofillHints": null,
|
||||
"IsFocused": false,
|
||||
"InputType": 0,
|
||||
"HtmlInfoTag": null,
|
||||
"HtmlInfoTypeAttribute": null
|
||||
},
|
||||
{
|
||||
"IdEntry": "biometricLayout",
|
||||
"Hint": null,
|
||||
"ClassName": "android.widget.LinearLayout",
|
||||
"AutofillHints": null,
|
||||
"IsFocused": false,
|
||||
"InputType": 0,
|
||||
"HtmlInfoTag": null,
|
||||
"HtmlInfoTypeAttribute": null
|
||||
},
|
||||
{
|
||||
"IdEntry": "login_menu_container",
|
||||
"Hint": null,
|
||||
"ClassName": "android.widget.LinearLayout",
|
||||
"AutofillHints": null,
|
||||
"IsFocused": false,
|
||||
"InputType": 0,
|
||||
"HtmlInfoTag": null,
|
||||
"HtmlInfoTypeAttribute": null
|
||||
},
|
||||
{
|
||||
"IdEntry": "deposit_insurance_systems_textview",
|
||||
"Hint": null,
|
||||
"ClassName": "android.widget.TextView",
|
||||
"AutofillHints": null,
|
||||
"IsFocused": false,
|
||||
"InputType": 0,
|
||||
"HtmlInfoTag": null,
|
||||
"HtmlInfoTypeAttribute": null
|
||||
},
|
||||
{
|
||||
"IdEntry": "login_menu",
|
||||
"Hint": null,
|
||||
"ClassName": "android.widget.LinearLayout",
|
||||
"AutofillHints": null,
|
||||
"IsFocused": false,
|
||||
"InputType": 0,
|
||||
"HtmlInfoTag": null,
|
||||
"HtmlInfoTypeAttribute": null
|
||||
},
|
||||
{
|
||||
"IdEntry": "login_menu_item_border_right",
|
||||
"Hint": null,
|
||||
"ClassName": "android.view.View",
|
||||
"AutofillHints": null,
|
||||
"IsFocused": false,
|
||||
"InputType": 0,
|
||||
"HtmlInfoTag": null,
|
||||
"HtmlInfoTypeAttribute": null
|
||||
},
|
||||
{
|
||||
"IdEntry": "login_menu_item_border_left",
|
||||
"Hint": null,
|
||||
"ClassName": "android.view.View",
|
||||
"AutofillHints": null,
|
||||
"IsFocused": false,
|
||||
"InputType": 0,
|
||||
"HtmlInfoTag": null,
|
||||
"HtmlInfoTypeAttribute": null
|
||||
},
|
||||
{
|
||||
"IdEntry": "sign_up_link",
|
||||
"Hint": null,
|
||||
"ClassName": "android.widget.Button",
|
||||
"AutofillHints": null,
|
||||
"IsFocused": false,
|
||||
"InputType": 0,
|
||||
"HtmlInfoTag": null,
|
||||
"HtmlInfoTypeAttribute": null
|
||||
},
|
||||
{
|
||||
"IdEntry": "locations_link",
|
||||
"Hint": null,
|
||||
"ClassName": "android.widget.Button",
|
||||
"AutofillHints": null,
|
||||
"IsFocused": false,
|
||||
"InputType": 0,
|
||||
"HtmlInfoTag": null,
|
||||
"HtmlInfoTypeAttribute": null
|
||||
},
|
||||
{
|
||||
"IdEntry": "more_link",
|
||||
"Hint": null,
|
||||
"ClassName": "android.widget.Button",
|
||||
"AutofillHints": null,
|
||||
"IsFocused": false,
|
||||
"InputType": 0,
|
||||
"HtmlInfoTag": null,
|
||||
"HtmlInfoTypeAttribute": null
|
||||
}
|
||||
],
|
||||
"PackageId": "com.ifs.banking.fiid3364",
|
||||
"WebDomain": null
|
||||
}
|
@@ -39,7 +39,7 @@ namespace keepass2android.services.AutofillBase
|
||||
AutofillOptions = view.GetAutofillOptions();
|
||||
Focused = view.IsFocused;
|
||||
var supportedHints = AutofillHintsHelper.FilterForSupportedHints(autofillHints);
|
||||
var canonicalHints = AutofillHintsHelper.ConvertToCanonicalHints(supportedHints);
|
||||
var canonicalHints = AutofillHintsHelper.ConvertToCanonicalLowerCaseHints(supportedHints);
|
||||
SetHints(canonicalHints.ToArray());
|
||||
}
|
||||
|
||||
|
Reference in New Issue
Block a user