refactoring: simplify autofill code

This commit is contained in:
Philipp Crocoll
2025-06-24 17:10:08 +02:00
parent bc0313aa6a
commit c8f6714373
7 changed files with 29 additions and 41 deletions

View File

@@ -95,7 +95,7 @@ namespace Kp2aAutofillParserTest
StructureParserBase<TestInputField> parser = StructureParserBase<TestInputField> parser =
new StructureParserBase<TestInputField>(new TestLogger(), new TestDalSourceTrustAll()); new StructureParserBase<TestInputField>(new TestLogger(), new TestDalSourceTrustAll());
var result = parser.ParseForFill(false, autofillView); var result = parser.ParseForFill(autofillView);
if (expectedPackageName != null) if (expectedPackageName != null)
Assert.Equal(expectedPackageName, result.PackageName); Assert.Equal(expectedPackageName, result.PackageName);
if (expectedWebDomain != null) if (expectedWebDomain != null)

View File

@@ -803,12 +803,12 @@ namespace Kp2aAutofillParser
public AutofillTargetId ParseForFill(bool isManual, AutofillView<FieldT> autofillView) public AutofillTargetId ParseForFill(bool isManual, AutofillView<FieldT> autofillView)
{ {
return Parse(true, isManual, autofillView); return Parse(true, autofillView);
} }
public AutofillTargetId ParseForSave(AutofillView<FieldT> autofillView) public AutofillTargetId ParseForSave(AutofillView<FieldT> autofillView)
{ {
return Parse(false, true, autofillView); return Parse(false, autofillView);
} }
/// <summary> /// <summary>
@@ -816,8 +816,7 @@ namespace Kp2aAutofillParser
/// </summary> /// </summary>
/// <returns>The parse.</returns> /// <returns>The parse.</returns>
/// <param name="forFill">If set to <c>true</c> for fill.</param> /// <param name="forFill">If set to <c>true</c> for fill.</param>
/// <param name="isManualRequest"></param> protected virtual AutofillTargetId Parse(bool forFill, AutofillView<FieldT> autofillView)
protected virtual AutofillTargetId Parse(bool forFill, bool isManualRequest, AutofillView<FieldT> autofillView)
{ {
AutofillTargetId result = new AutofillTargetId() AutofillTargetId result = new AutofillTargetId()
{ {

View File

@@ -63,8 +63,6 @@ namespace keepass2android
prefs.Edit().PutStringSet("AutoFillDisabledQueries", disabledValues).Commit(); prefs.Edit().PutStringSet("AutoFillDisabledQueries", disabledValues).Commit();
bool isManual = Intent.GetBooleanExtra(ChooseForAutofillActivityBase.ExtraIsManualRequest, false);
Intent reply = new Intent(); Intent reply = new Intent();
FillResponse.Builder builder = new FillResponse.Builder(); FillResponse.Builder builder = new FillResponse.Builder();
AssistStructure structure = (AssistStructure)Intent.GetParcelableExtra(AutofillManager.ExtraAssistStructure); AssistStructure structure = (AssistStructure)Intent.GetParcelableExtra(AutofillManager.ExtraAssistStructure);
@@ -77,7 +75,7 @@ namespace keepass2android
StructureParser parser = new StructureParser(this, structure); StructureParser parser = new StructureParser(this, structure);
try try
{ {
parser.ParseForFill(isManual); parser.ParseForFill();
} }
catch (Java.Lang.SecurityException e) catch (Java.Lang.SecurityException e)

View File

@@ -28,13 +28,11 @@ namespace keepass2android.services.AutofillBase
{ {
public interface IAutofillIntentBuilder public interface IAutofillIntentBuilder
{ {
PendingIntent GetAuthPendingIntentForResponse(Context context, string query, string queryDomain, string queryPackage, PendingIntent GetAuthPendingIntentForResponse(Context context, string query, string queryDomain, string queryPackage, bool autoReturnFromQuery, AutofillServiceBase.DisplayWarning warning);
bool isManualRequest, bool autoReturnFromQuery, AutofillServiceBase.DisplayWarning warning);
PendingIntent GetAuthPendingIntentForWarning(Context context, PwUuid entryUuid, AutofillServiceBase.DisplayWarning warning); PendingIntent GetAuthPendingIntentForWarning(Context context, PwUuid entryUuid, AutofillServiceBase.DisplayWarning warning);
PendingIntent GetDisablePendingIntentForResponse(Context context, string query, PendingIntent GetDisablePendingIntentForResponse(Context context, string query, bool isDisable);
bool isManualRequest, bool isDisable);
Intent GetRestartAppIntent(Context context); Intent GetRestartAppIntent(Context context);
int AppIconResource { get; } int AppIconResource { get; }
@@ -150,7 +148,7 @@ namespace keepass2android.services.AutofillBase
var parser = new StructureParser(this, structure); var parser = new StructureParser(this, structure);
try try
{ {
query = parser.ParseForFill(isManual); query = parser.ParseForFill();
} }
catch (Java.Lang.SecurityException e) catch (Java.Lang.SecurityException e)
@@ -213,16 +211,14 @@ namespace keepass2android.services.AutofillBase
{ {
if (query.WebDomain != null) if (query.WebDomain != null)
AddQueryDataset(query.WebDomain, AddQueryDataset(query.WebDomain,
query.WebDomain, query.PackageName, query.WebDomain, query.PackageName, autofillIds, responseBuilder, !hasEntryDataset,
isManual, autofillIds, responseBuilder, !hasEntryDataset,
query.IncompatiblePackageAndDomain query.IncompatiblePackageAndDomain
? DisplayWarning.FillDomainInUntrustedApp ? DisplayWarning.FillDomainInUntrustedApp
: DisplayWarning.None, : DisplayWarning.None,
AutofillHelper.ExtractSpec(inlinePresentationSpecs, entryDatasets.Count)); AutofillHelper.ExtractSpec(inlinePresentationSpecs, entryDatasets.Count));
else else
AddQueryDataset(query.PackageNameWithPseudoSchema, AddQueryDataset(query.PackageNameWithPseudoSchema,
query.WebDomain, query.PackageName, query.WebDomain, query.PackageName, autofillIds, responseBuilder, !hasEntryDataset, DisplayWarning.None,
isManual, autofillIds, responseBuilder, !hasEntryDataset, DisplayWarning.None,
AutofillHelper.ExtractSpec(inlinePresentationSpecs, entryDatasets.Count)); AutofillHelper.ExtractSpec(inlinePresentationSpecs, entryDatasets.Count));
} }
@@ -340,9 +336,9 @@ namespace keepass2android.services.AutofillBase
} }
private void AddQueryDataset(string query, string queryDomain, string queryPackage, bool isManual, AutofillId[] autofillIds, FillResponse.Builder responseBuilder, bool autoReturnFromQuery, DisplayWarning warning, InlinePresentationSpec inlinePresentationSpec) private void AddQueryDataset(string query, string queryDomain, string queryPackage, AutofillId[] autofillIds, FillResponse.Builder responseBuilder, bool autoReturnFromQuery, DisplayWarning warning, InlinePresentationSpec inlinePresentationSpec)
{ {
PendingIntent pendingIntent = IntentBuilder.GetAuthPendingIntentForResponse(this, query, queryDomain, queryPackage, isManual, autoReturnFromQuery, warning); PendingIntent pendingIntent = IntentBuilder.GetAuthPendingIntentForResponse(this, query, queryDomain, queryPackage, autoReturnFromQuery, warning);
string text = GetString(Resource.String.autofill_sign_in_prompt); string text = GetString(Resource.String.autofill_sign_in_prompt);
RemoteViews overlayPresentation = AutofillHelper.NewRemoteViews(base.PackageName, RemoteViews overlayPresentation = AutofillHelper.NewRemoteViews(base.PackageName,
text, AppNames.LauncherIcon); text, AppNames.LauncherIcon);
@@ -396,7 +392,7 @@ namespace keepass2android.services.AutofillBase
if (isQueryDisabled && !isManual) if (isQueryDisabled && !isManual)
return; return;
bool isForDisable = !isQueryDisabled; bool isForDisable = !isQueryDisabled;
var pendingIntent = IntentBuilder.GetDisablePendingIntentForResponse(this, query, isManual, isForDisable); var pendingIntent = IntentBuilder.GetDisablePendingIntentForResponse(this, query, isForDisable);
string text = GetString(isForDisable ? Resource.String.autofill_disable : Resource.String.autofill_enable_for, new Java.Lang.Object[] { GetDisplayNameForQuery(query, this) }); string text = GetString(isForDisable ? Resource.String.autofill_disable : Resource.String.autofill_enable_for, new Java.Lang.Object[] { GetDisplayNameForQuery(query, this) });
RemoteViews presentation = AutofillHelper.NewRemoteViews(base.PackageName, RemoteViews presentation = AutofillHelper.NewRemoteViews(base.PackageName,

View File

@@ -27,7 +27,6 @@ namespace keepass2android.services.AutofillBase
public static string ExtraQueryPackageString => "EXTRA_QUERY_PACKAGE_STRING"; public static string ExtraQueryPackageString => "EXTRA_QUERY_PACKAGE_STRING";
public static string ExtraQueryDomainString => "EXTRA_QUERY_DOMAIN_STRING"; public static string ExtraQueryDomainString => "EXTRA_QUERY_DOMAIN_STRING";
public static string ExtraUseLastOpenedEntry => "EXTRA_USE_LAST_OPENED_ENTRY"; //if set to true, no query UI is displayed. Can be used to just show a warning public static string ExtraUseLastOpenedEntry => "EXTRA_USE_LAST_OPENED_ENTRY"; //if set to true, no query UI is displayed. Can be used to just show a warning
public static string ExtraIsManualRequest => "EXTRA_IS_MANUAL_REQUEST";
public static string ExtraAutoReturnFromQuery => "EXTRA_AUTO_RETURN_FROM_QUERY"; public static string ExtraAutoReturnFromQuery => "EXTRA_AUTO_RETURN_FROM_QUERY";
public static string ExtraDisplayWarning => "EXTRA_DISPLAY_WARNING"; public static string ExtraDisplayWarning => "EXTRA_DISPLAY_WARNING";
@@ -185,7 +184,7 @@ namespace keepass2android.services.AutofillBase
ReplyIntent = null; ReplyIntent = null;
} }
protected void OnSuccess(FilledAutofillFieldCollection<ViewNodeInputField> clientFormDataMap, bool isManual) protected void OnSuccess(FilledAutofillFieldCollection<ViewNodeInputField> clientFormDataMap)
{ {
var intent = Intent; var intent = Intent;
AssistStructure structure = (AssistStructure)intent.GetParcelableExtra(AutofillManager.ExtraAssistStructure); AssistStructure structure = (AssistStructure)intent.GetParcelableExtra(AutofillManager.ExtraAssistStructure);
@@ -196,7 +195,7 @@ namespace keepass2android.services.AutofillBase
return; return;
} }
StructureParser parser = new StructureParser(this, structure); StructureParser parser = new StructureParser(this, structure);
parser.ParseForFill(isManual); parser.ParseForFill();
AutofillFieldMetadataCollection autofillFields = parser.AutofillFields; AutofillFieldMetadataCollection autofillFields = parser.AutofillFields;
var partitionData = AutofillHintsHelper.FilterForPartition(clientFormDataMap, parser.AutofillFields.FocusedAutofillCanonicalHints); var partitionData = AutofillHintsHelper.FilterForPartition(clientFormDataMap, parser.AutofillFields.FocusedAutofillCanonicalHints);
@@ -229,7 +228,7 @@ namespace keepass2android.services.AutofillBase
private void ReturnSuccess() private void ReturnSuccess()
{ {
OnSuccess(GetDataset(), Intent.GetBooleanExtra(ExtraIsManualRequest, false)); OnSuccess(GetDataset());
Finish(); Finish();
} }

View File

@@ -72,7 +72,7 @@ namespace keepass2android.services.AutofillBase
domainSuffixParserCache = new PublicSuffixRuleCache(context); domainSuffixParserCache = new PublicSuffixRuleCache(context);
} }
public AutofillView<ViewNodeInputField> GetAutofillView(bool isManualRequest) public AutofillView<ViewNodeInputField> GetAutofillView()
{ {
AutofillView<ViewNodeInputField> autofillView = new AutofillView<ViewNodeInputField>(); AutofillView<ViewNodeInputField> autofillView = new AutofillView<ViewNodeInputField>();
@@ -83,7 +83,7 @@ namespace keepass2android.services.AutofillBase
var node = _structure.GetWindowNodeAt(i); var node = _structure.GetWindowNodeAt(i);
var view = node.RootViewNode; var view = node.RootViewNode;
ParseRecursive(autofillView, view, isManualRequest); ParseRecursive(autofillView, view);
} }
autofillView.PackageId = autofillView.PackageId ?? _structure.ActivityComponent.PackageName; autofillView.PackageId = autofillView.PackageId ?? _structure.ActivityComponent.PackageName;
@@ -93,7 +93,7 @@ namespace keepass2android.services.AutofillBase
} }
void ParseRecursive(AutofillView<ViewNodeInputField> autofillView, AssistStructure.ViewNode viewNode, bool isManualRequest) void ParseRecursive(AutofillView<ViewNodeInputField> autofillView, AssistStructure.ViewNode viewNode)
{ {
String webDomain = viewNode.WebDomain; String webDomain = viewNode.WebDomain;
if ((autofillView.PackageId == null) && (!string.IsNullOrWhiteSpace(viewNode.IdPackage)) && if ((autofillView.PackageId == null) && (!string.IsNullOrWhiteSpace(viewNode.IdPackage)) &&
@@ -129,7 +129,7 @@ namespace keepass2android.services.AutofillBase
{ {
for (int i = 0; i < childrenSize; i++) for (int i = 0; i < childrenSize; i++)
{ {
ParseRecursive(autofillView, viewNode.GetChildAt(i), isManualRequest); ParseRecursive(autofillView, viewNode.GetChildAt(i));
} }
} }
} }
@@ -159,11 +159,11 @@ namespace keepass2android.services.AutofillBase
} }
protected override AutofillTargetId Parse(bool forFill, bool isManualRequest, AutofillView<ViewNodeInputField> autofillView) protected override AutofillTargetId Parse(bool forFill, AutofillView<ViewNodeInputField> autofillView)
{ {
if (autofillView == null) if (autofillView == null)
Kp2aLog.Log("Received null autofill view!"); Kp2aLog.Log("Received null autofill view!");
var result = base.Parse(forFill, isManualRequest, autofillView); var result = base.Parse(forFill, autofillView);
Kp2aLog.Log("Parsing done"); Kp2aLog.Log("Parsing done");
@@ -185,14 +185,14 @@ namespace keepass2android.services.AutofillBase
public AutofillTargetId ParseForSave() public AutofillTargetId ParseForSave()
{ {
var autofillView = new AutofillViewFromAssistStructureFinder(_context, _structure).GetAutofillView(true); var autofillView = new AutofillViewFromAssistStructureFinder(_context, _structure).GetAutofillView();
return Parse(false, true, autofillView); return Parse(false, autofillView);
} }
public StructureParserBase<ViewNodeInputField>.AutofillTargetId ParseForFill(bool isManual) public StructureParserBase<ViewNodeInputField>.AutofillTargetId ParseForFill()
{ {
var autofillView = new AutofillViewFromAssistStructureFinder(_context, _structure).GetAutofillView(isManual); var autofillView = new AutofillViewFromAssistStructureFinder(_context, _structure).GetAutofillView();
return Parse(true, isManual, autofillView); return Parse(true, autofillView);
} }

View File

@@ -17,14 +17,12 @@ namespace keepass2android.services
{ {
private static int _pendingIntentRequestCode = 0; private static int _pendingIntentRequestCode = 0;
public PendingIntent GetAuthPendingIntentForResponse(Context context, string query, string queryDomain, string queryPackage, public PendingIntent GetAuthPendingIntentForResponse(Context context, string query, string queryDomain, string queryPackage, bool autoReturnFromQuery, AutofillServiceBase.DisplayWarning warning)
bool isManualRequest, bool autoReturnFromQuery, AutofillServiceBase.DisplayWarning warning)
{ {
Intent intent = new Intent(context, typeof(ChooseForAutofillActivity)); Intent intent = new Intent(context, typeof(ChooseForAutofillActivity));
intent.PutExtra(ChooseForAutofillActivityBase.ExtraQueryString, query); intent.PutExtra(ChooseForAutofillActivityBase.ExtraQueryString, query);
intent.PutExtra(ChooseForAutofillActivityBase.ExtraQueryDomainString, queryDomain); intent.PutExtra(ChooseForAutofillActivityBase.ExtraQueryDomainString, queryDomain);
intent.PutExtra(ChooseForAutofillActivityBase.ExtraQueryPackageString, queryPackage); intent.PutExtra(ChooseForAutofillActivityBase.ExtraQueryPackageString, queryPackage);
intent.PutExtra(ChooseForAutofillActivityBase.ExtraIsManualRequest, isManualRequest);
intent.PutExtra(ChooseForAutofillActivityBase.ExtraAutoReturnFromQuery, autoReturnFromQuery); intent.PutExtra(ChooseForAutofillActivityBase.ExtraAutoReturnFromQuery, autoReturnFromQuery);
intent.PutExtra(ChooseForAutofillActivityBase.ExtraDisplayWarning, (int)warning); intent.PutExtra(ChooseForAutofillActivityBase.ExtraDisplayWarning, (int)warning);
return PendingIntent.GetActivity(context, _pendingIntentRequestCode++, intent, Util.AddMutabilityFlag(PendingIntentFlags.CancelCurrent, PendingIntentFlags.Mutable)); return PendingIntent.GetActivity(context, _pendingIntentRequestCode++, intent, Util.AddMutabilityFlag(PendingIntentFlags.CancelCurrent, PendingIntentFlags.Mutable));
@@ -40,12 +38,10 @@ namespace keepass2android.services
return PendingIntent.GetActivity(context, _pendingIntentRequestCode++, intent, Util.AddMutabilityFlag(PendingIntentFlags.CancelCurrent, PendingIntentFlags.Mutable)); return PendingIntent.GetActivity(context, _pendingIntentRequestCode++, intent, Util.AddMutabilityFlag(PendingIntentFlags.CancelCurrent, PendingIntentFlags.Mutable));
} }
public PendingIntent GetDisablePendingIntentForResponse(Context context, string query, public PendingIntent GetDisablePendingIntentForResponse(Context context, string query, bool isDisable)
bool isManualRequest, bool isDisable)
{ {
Intent intent = new Intent(context, typeof(DisableAutofillForQueryActivity)); Intent intent = new Intent(context, typeof(DisableAutofillForQueryActivity));
intent.PutExtra(ChooseForAutofillActivityBase.ExtraQueryString, query); intent.PutExtra(ChooseForAutofillActivityBase.ExtraQueryString, query);
intent.PutExtra(ChooseForAutofillActivityBase.ExtraIsManualRequest, isManualRequest);
intent.PutExtra(DisableAutofillForQueryActivity.ExtraIsDisable, isDisable); intent.PutExtra(DisableAutofillForQueryActivity.ExtraIsDisable, isDisable);
return PendingIntent.GetActivity(context, _pendingIntentRequestCode++, intent, Util.AddMutabilityFlag(PendingIntentFlags.CancelCurrent, PendingIntentFlags.Immutable)); return PendingIntent.GetActivity(context, _pendingIntentRequestCode++, intent, Util.AddMutabilityFlag(PendingIntentFlags.CancelCurrent, PendingIntentFlags.Immutable));