diff --git a/src/keepass2android/services/AutofillBase/AutofillHintsHelper.cs b/src/keepass2android/services/AutofillBase/AutofillHintsHelper.cs index cc8ad0a0..b4862f34 100644 --- a/src/keepass2android/services/AutofillBase/AutofillHintsHelper.cs +++ b/src/keepass2android/services/AutofillBase/AutofillHintsHelper.cs @@ -85,6 +85,78 @@ namespace keepass2android.services.AutofillBase W3cHints.IMPP, }; + private static readonly List> partitionsOfCanonicalHints = new List>() + { + + new HashSet(StringComparer.OrdinalIgnoreCase) + { + View.AutofillHintEmailAddress, + View.AutofillHintPhone, + View.AutofillHintName, + View.AutofillHintPassword, + View.AutofillHintUsername, + W3cHints.HONORIFIC_PREFIX, + W3cHints.NAME, + W3cHints.GIVEN_NAME, + W3cHints.ADDITIONAL_NAME, + W3cHints.FAMILY_NAME, + W3cHints.HONORIFIC_SUFFIX, + W3cHints.ORGANIZATION_TITLE, + W3cHints.ORGANIZATION, + W3cHints.LANGUAGE, + W3cHints.BDAY, + W3cHints.BDAY_DAY, + W3cHints.BDAY_MONTH, + W3cHints.BDAY_YEAR, + W3cHints.SEX, + W3cHints.URL, + W3cHints.PHOTO, + W3cHints.TEL, + W3cHints.TEL_COUNTRY_CODE, + W3cHints.TEL_NATIONAL, + W3cHints.TEL_AREA_CODE, + W3cHints.TEL_LOCAL, + W3cHints.TEL_LOCAL_PREFIX, + W3cHints.TEL_LOCAL_SUFFIX, + W3cHints.TEL_EXTENSION, + W3cHints.IMPP, + }, + new HashSet(StringComparer.OrdinalIgnoreCase) + { + View.AutofillHintPostalAddress, + View.AutofillHintPostalCode, + + W3cHints.STREET_ADDRESS, + W3cHints.ADDRESS_LINE1, + W3cHints.ADDRESS_LINE2, + W3cHints.ADDRESS_LINE3, + W3cHints.ADDRESS_LEVEL4, + W3cHints.ADDRESS_LEVEL3, + W3cHints.ADDRESS_LEVEL2, + W3cHints.ADDRESS_LEVEL1, + W3cHints.COUNTRY, + W3cHints.COUNTRY_NAME + }, + new HashSet(StringComparer.OrdinalIgnoreCase) + { + View.AutofillHintCreditCardExpirationDate, + View.AutofillHintCreditCardExpirationDay, + View.AutofillHintCreditCardExpirationMonth, + View.AutofillHintCreditCardExpirationYear, + View.AutofillHintCreditCardNumber, + View.AutofillHintCreditCardSecurityCode, + + W3cHints.CC_NAME, + W3cHints.CC_GIVEN_NAME, + W3cHints.CC_ADDITIONAL_NAME, + W3cHints.CC_FAMILY_NAME, + W3cHints.CC_TYPE, + W3cHints.TRANSACTION_CURRENCY, + W3cHints.TRANSACTION_AMOUNT, + }, + + }; + private static readonly Dictionary hintToCanonicalReplacement= new Dictionary(StringComparer.OrdinalIgnoreCase) { {W3cHints.EMAIL, View.AutofillHintEmailAddress}, @@ -145,5 +217,40 @@ namespace keepass2android.services.AutofillBase return result; } + + public static int GetPartitionIndex(string hint) + { + for (int i = 0; i < partitionsOfCanonicalHints.Count; i++) + { + if (partitionsOfCanonicalHints[i].Contains(hint)) + { + return i; + } + } + return -1; + } + + public static FilledAutofillFieldCollection FilterForPartition(FilledAutofillFieldCollection autofillFields, int partitionIndex) + { + FilledAutofillFieldCollection filteredCollection = + new FilledAutofillFieldCollection {DatasetName = autofillFields.DatasetName}; + + if (partitionIndex == -1) + return filteredCollection; + + foreach (var field in autofillFields.HintMap.Values.Distinct()) + { + foreach (var hint in field.AutofillHints) + { + if (GetPartitionIndex(hint) == partitionIndex) + { + filteredCollection.Add(field); + break; + } + } + } + + return filteredCollection; + } } } \ No newline at end of file diff --git a/src/keepass2android/services/AutofillBase/ChooseForAutofillActivityBase.cs b/src/keepass2android/services/AutofillBase/ChooseForAutofillActivityBase.cs index 2c6dfe1b..ae360703 100644 --- a/src/keepass2android/services/AutofillBase/ChooseForAutofillActivityBase.cs +++ b/src/keepass2android/services/AutofillBase/ChooseForAutofillActivityBase.cs @@ -11,6 +11,7 @@ using Android.Widget; using Java.Util; using keepass2android.services.AutofillBase.model; using System.Collections.Generic; +using System.Linq; namespace keepass2android.services.AutofillBase { @@ -84,8 +85,11 @@ namespace keepass2android.services.AutofillBase StructureParser parser = new StructureParser(this, structure); parser.ParseForFill(); AutofillFieldMetadataCollection autofillFields = parser.AutofillFields; + int partitionIndex = AutofillHintsHelper.GetPartitionIndex(autofillFields.FocusedAutofillCanonicalHints.First()); + FilledAutofillFieldCollection partitionData = + AutofillHintsHelper.FilterForPartition(clientFormDataMap, partitionIndex); ReplyIntent = new Intent(); - SetDatasetIntent(AutofillHelper.NewDataset(this, autofillFields, clientFormDataMap, false, IntentBuilder)); + SetDatasetIntent(AutofillHelper.NewDataset(this, autofillFields, partitionData, false, IntentBuilder)); } protected override void OnActivityResult(int requestCode, Result resultCode, Intent data)