improve autofill service (#9): introduce partitioning of Autofill data
This commit is contained in:
@@ -85,6 +85,78 @@ namespace keepass2android.services.AutofillBase
|
|||||||
W3cHints.IMPP,
|
W3cHints.IMPP,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
private static readonly List<HashSet<string>> partitionsOfCanonicalHints = new List<HashSet<string>>()
|
||||||
|
{
|
||||||
|
|
||||||
|
new HashSet<string>(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<string>(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<string>(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<string, string> hintToCanonicalReplacement= new Dictionary<string, string>(StringComparer.OrdinalIgnoreCase)
|
private static readonly Dictionary<string, string> hintToCanonicalReplacement= new Dictionary<string, string>(StringComparer.OrdinalIgnoreCase)
|
||||||
{
|
{
|
||||||
{W3cHints.EMAIL, View.AutofillHintEmailAddress},
|
{W3cHints.EMAIL, View.AutofillHintEmailAddress},
|
||||||
@@ -145,5 +217,40 @@ namespace keepass2android.services.AutofillBase
|
|||||||
return result;
|
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;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -11,6 +11,7 @@ using Android.Widget;
|
|||||||
using Java.Util;
|
using Java.Util;
|
||||||
using keepass2android.services.AutofillBase.model;
|
using keepass2android.services.AutofillBase.model;
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
|
using System.Linq;
|
||||||
|
|
||||||
namespace keepass2android.services.AutofillBase
|
namespace keepass2android.services.AutofillBase
|
||||||
{
|
{
|
||||||
@@ -84,8 +85,11 @@ namespace keepass2android.services.AutofillBase
|
|||||||
StructureParser parser = new StructureParser(this, structure);
|
StructureParser parser = new StructureParser(this, structure);
|
||||||
parser.ParseForFill();
|
parser.ParseForFill();
|
||||||
AutofillFieldMetadataCollection autofillFields = parser.AutofillFields;
|
AutofillFieldMetadataCollection autofillFields = parser.AutofillFields;
|
||||||
|
int partitionIndex = AutofillHintsHelper.GetPartitionIndex(autofillFields.FocusedAutofillCanonicalHints.First());
|
||||||
|
FilledAutofillFieldCollection partitionData =
|
||||||
|
AutofillHintsHelper.FilterForPartition(clientFormDataMap, partitionIndex);
|
||||||
ReplyIntent = new Intent();
|
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)
|
protected override void OnActivityResult(int requestCode, Result resultCode, Intent data)
|
||||||
|
|||||||
Reference in New Issue
Block a user