work on reducing popups for autofill/allow to disable autofill for query. not yet fully functional. refers to #455.
This commit is contained in:
@@ -53,9 +53,11 @@
|
||||
<Compile Include="Properties\AssemblyInfo.cs" />
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<LibraryProjectZip Include="..\java\Keepass2AndroidPluginSDK2\app\build\outputs\aar\Keepass2AndroidPluginSDK2-release.aar">
|
||||
<Link>Jars\Keepass2AndroidPluginSDK2-release.aar</Link>
|
||||
</LibraryProjectZip>
|
||||
<None Include="Jars\AboutJars.txt" />
|
||||
<None Include="Additions\AboutAdditions.txt" />
|
||||
<LibraryProjectZip Include="Jars\app-release.aar" />
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<TransformFile Include="Transforms\Metadata.xml" />
|
||||
|
||||
110
src/keepass2android/DisableAutofillForQueryActivity.cs
Normal file
110
src/keepass2android/DisableAutofillForQueryActivity.cs
Normal file
@@ -0,0 +1,110 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
|
||||
using Android.App;
|
||||
using Android.App.Assist;
|
||||
using Android.Content;
|
||||
using Android.OS;
|
||||
using Android.Preferences;
|
||||
using Android.Runtime;
|
||||
using Android.Service.Autofill;
|
||||
using Android.Util;
|
||||
using Android.Views;
|
||||
using Android.Views.Autofill;
|
||||
using Android.Widget;
|
||||
using keepass2android.services;
|
||||
using keepass2android.services.AutofillBase;
|
||||
|
||||
namespace keepass2android
|
||||
{
|
||||
[Activity(Label = "DisableAutofillForQueryActivity")]
|
||||
public class DisableAutofillForQueryActivity : Activity
|
||||
{
|
||||
public IAutofillIntentBuilder IntentBuilder = new Kp2aAutofillIntentBuilder();
|
||||
|
||||
public const string ExtraIsDisable = "EXTRA_IS_DISABLE";
|
||||
|
||||
protected void RestartApp()
|
||||
{
|
||||
Intent intent = IntentBuilder.GetRestartAppIntent(this);
|
||||
StartActivity(intent);
|
||||
Finish();
|
||||
}
|
||||
|
||||
protected override void OnCreate(Bundle savedInstanceState)
|
||||
{
|
||||
base.OnCreate(savedInstanceState);
|
||||
|
||||
|
||||
string requestedUrl = Intent.GetStringExtra(ChooseForAutofillActivityBase.ExtraQueryString);
|
||||
if (requestedUrl == null)
|
||||
{
|
||||
Toast.MakeText(this, "Cannot execute query for null.", ToastLength.Long).Show();
|
||||
RestartApp();
|
||||
return;
|
||||
}
|
||||
|
||||
var prefs = PreferenceManager.GetDefaultSharedPreferences(this);
|
||||
|
||||
bool isDisable = Intent.GetBooleanExtra(ExtraIsDisable, true);
|
||||
|
||||
var disabledValues = prefs.GetStringSet("AutoFillDisabledQueries", new HashSet<string>() { }).ToHashSet();
|
||||
if (isDisable)
|
||||
{
|
||||
disabledValues.Add(requestedUrl);
|
||||
}
|
||||
else
|
||||
{
|
||||
disabledValues.Remove(requestedUrl);
|
||||
}
|
||||
|
||||
|
||||
prefs.Edit().PutStringSet("AutoFillDisabledQueries", disabledValues).Commit();
|
||||
|
||||
bool isManual = Intent.GetBooleanExtra(ChooseForAutofillActivityBase.ExtraIsManualRequest, false);
|
||||
|
||||
Intent reply = new Intent();
|
||||
FillResponse.Builder builder = new FillResponse.Builder();
|
||||
AssistStructure structure = (AssistStructure)Intent.GetParcelableExtra(AutofillManager.ExtraAssistStructure);
|
||||
StructureParser parser = new StructureParser(this, structure);
|
||||
try
|
||||
{
|
||||
parser.ParseForFill(isManual);
|
||||
|
||||
}
|
||||
catch (Java.Lang.SecurityException e)
|
||||
{
|
||||
Log.Warn(CommonUtil.Tag, "Security exception handling request");
|
||||
SetResult(Result.Canceled);
|
||||
return;
|
||||
}
|
||||
|
||||
AutofillFieldMetadataCollection autofillFields = parser.AutofillFields;
|
||||
|
||||
|
||||
var autofillIds = autofillFields.GetAutofillIds();
|
||||
builder.SetIgnoredIds(autofillIds);
|
||||
Bundle state = new Bundle();
|
||||
state.PutStringArray("AutoFillDisabledQueries", disabledValues.ToArray());
|
||||
|
||||
builder.SetClientState(state);
|
||||
try
|
||||
{
|
||||
var response = builder.Build();
|
||||
reply.PutExtra(AutofillManager.ExtraAuthenticationResult, response);
|
||||
}
|
||||
catch (Exception e)
|
||||
{
|
||||
Kp2aLog.LogUnexpectedError(e);
|
||||
throw;
|
||||
}
|
||||
|
||||
SetResult(Result.Ok, reply);
|
||||
|
||||
|
||||
Finish();
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1178,6 +1178,8 @@ Initial public release
|
||||
<string name="autofill_enable_failed">Sorry, it looks like your device does not support opening the settings from inside the app. Please go manually to the system settings for AutoFill to enable the service.</string>
|
||||
<string name="show_autofill_help">Show Autofill help</string>
|
||||
<string name="autofill_sign_in_prompt">Fill with Keepass2Android</string>
|
||||
<string name="autofill_disable">Disable AutoFill for %1$s</string>
|
||||
<string name="autofill_enable">Enable AutoFill for %1$s</string>
|
||||
<string name="invalid_link_association">Could not associate web domain %1$s with app %2$s</string>
|
||||
|
||||
<string name="enable_fingerprint_hint">Keepass2Android has detected fingerprint hardware. Do you want to enable fingerprint unlock for this database?</string>
|
||||
|
||||
@@ -178,6 +178,7 @@
|
||||
<Compile Include="AutoOpenEdit.cs" />
|
||||
<Compile Include="ChallengeXCKey.cs" />
|
||||
<Compile Include="ConfigureChildDatabasesActivity.cs" />
|
||||
<Compile Include="DisableAutofillForQueryActivity.cs" />
|
||||
<Compile Include="EntryActivityClasses\ViewImagePopupItem.cs" />
|
||||
<Compile Include="FileSaveProcessManager.cs" />
|
||||
<Compile Include="fileselect\FilteredCursor.cs" />
|
||||
|
||||
@@ -1,7 +1,9 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using Android.Content;
|
||||
using Android.OS;
|
||||
using Android.Preferences;
|
||||
using Android.Runtime;
|
||||
using Android.Service.Autofill;
|
||||
using Android.Util;
|
||||
@@ -14,6 +16,7 @@ namespace keepass2android.services.AutofillBase
|
||||
public interface IAutofillIntentBuilder
|
||||
{
|
||||
IntentSender GetAuthIntentSenderForResponse(Context context, string query, bool isManualRequest, bool autoReturnFromQuery);
|
||||
IntentSender GetDisableIntentSenderForResponse(Context context, string query, bool isManualRequest, bool isDisable);
|
||||
Intent GetRestartAppIntent(Context context);
|
||||
|
||||
int AppIconResource { get; }
|
||||
@@ -66,7 +69,7 @@ namespace keepass2android.services.AutofillBase
|
||||
|
||||
|
||||
var autofillIds = autofillFields.GetAutofillIds();
|
||||
if (autofillIds.Length != 0 && CanAutofill(query))
|
||||
if (autofillIds.Length != 0 && CanAutofill(query, isManual))
|
||||
{
|
||||
var responseBuilder = new FillResponse.Builder();
|
||||
|
||||
@@ -76,6 +79,7 @@ namespace keepass2android.services.AutofillBase
|
||||
responseBuilder.AddDataset(entryDataset);
|
||||
|
||||
AddQueryDataset(query, isManual, autofillIds, responseBuilder, !hasEntryDataset);
|
||||
AddDisableDataset(query, autofillIds, responseBuilder, isManual);
|
||||
responseBuilder.SetSaveInfo(new SaveInfo.Builder(parser.AutofillFields.SaveType,
|
||||
parser.AutofillFields.GetAutofillIds()).Build());
|
||||
|
||||
@@ -117,9 +121,49 @@ namespace keepass2android.services.AutofillBase
|
||||
responseBuilder.AddDataset(datasetBuilder.Build());
|
||||
}
|
||||
|
||||
private bool CanAutofill(string query)
|
||||
|
||||
private void AddDisableDataset(string query, AutofillId[] autofillIds, FillResponse.Builder responseBuilder, bool isManual)
|
||||
{
|
||||
return !(query == "androidapp://android" || query == "androidapp://"+this.PackageName);
|
||||
bool isQueryDisabled = IsQueryDisabled(query);
|
||||
if (isQueryDisabled && !isManual)
|
||||
return;
|
||||
bool isForDisable = !isQueryDisabled;
|
||||
var sender = IntentBuilder.GetDisableIntentSenderForResponse(this, query, isManual, isForDisable);
|
||||
|
||||
RemoteViews presentation = AutofillHelper.NewRemoteViews(PackageName,
|
||||
GetString(isForDisable ? Resource.String.autofill_disable : Resource.String.autofill_enable, new Java.Lang.Object[] { query}), Resource.Drawable.ic_menu_close_grey);
|
||||
|
||||
var datasetBuilder = new Dataset.Builder(presentation);
|
||||
datasetBuilder.SetAuthentication(sender);
|
||||
|
||||
foreach (var autofillId in autofillIds)
|
||||
{
|
||||
datasetBuilder.SetValue(autofillId, AutofillValue.ForText("PLACEHOLDER"));
|
||||
}
|
||||
|
||||
responseBuilder.AddDataset(datasetBuilder.Build());
|
||||
}
|
||||
|
||||
private bool CanAutofill(string query, bool isManual)
|
||||
{
|
||||
if (query == "androidapp://android" || query == "androidapp://" + this.PackageName)
|
||||
return false;
|
||||
if (!isManual)
|
||||
{
|
||||
var isQueryDisabled = IsQueryDisabled(query);
|
||||
if (isQueryDisabled)
|
||||
return false;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
private bool IsQueryDisabled(string query)
|
||||
{
|
||||
var prefs = PreferenceManager.GetDefaultSharedPreferences(this);
|
||||
var disabledValues = prefs.GetStringSet("AutoFillDisabledQueries", new List<string>());
|
||||
|
||||
bool isQueryDisabled = disabledValues.Contains(query);
|
||||
return isQueryDisabled;
|
||||
}
|
||||
|
||||
public override void OnSaveRequest(SaveRequest request, SaveCallback callback)
|
||||
|
||||
@@ -24,6 +24,16 @@ namespace keepass2android.services
|
||||
return PendingIntent.GetActivity(context, 0, intent, PendingIntentFlags.CancelCurrent).IntentSender;
|
||||
}
|
||||
|
||||
public IntentSender GetDisableIntentSenderForResponse(Context context, string query, bool isManualRequest, bool isDisable)
|
||||
{
|
||||
Intent intent = new Intent(context, typeof(DisableAutofillForQueryActivity));
|
||||
intent.PutExtra(ChooseForAutofillActivityBase.ExtraQueryString, query);
|
||||
intent.PutExtra(ChooseForAutofillActivityBase.ExtraIsManualRequest, isManualRequest);
|
||||
intent.PutExtra(DisableAutofillForQueryActivity.ExtraIsDisable, isDisable);
|
||||
|
||||
return PendingIntent.GetActivity(context, 0, intent, PendingIntentFlags.CancelCurrent).IntentSender;
|
||||
}
|
||||
|
||||
public Intent GetRestartAppIntent(Context context)
|
||||
{
|
||||
var intent = new Intent(context, typeof(SelectCurrentDbActivity));
|
||||
|
||||
Reference in New Issue
Block a user