add missing file for SearchTotpResults, preview TOTPs depending on settings, make TOTP copyable from Entry view
closes #803
This commit is contained in:
@@ -1140,6 +1140,15 @@ namespace keepass2android
|
||||
|
||||
public abstract ElementAndDatabaseId FullGroupId { get; }
|
||||
|
||||
public virtual bool MayPreviewTotp
|
||||
{
|
||||
get
|
||||
{
|
||||
return !PreferenceManager.GetDefaultSharedPreferences(this).GetBoolean(GetString(Resource.String.masktotp_key),
|
||||
Resources.GetBoolean(Resource.Boolean.masktotp_default));
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
public override bool OnPrepareOptionsMenu(IMenu menu)
|
||||
{
|
||||
|
162
src/keepass2android/search/SearchTotpResults.cs
Normal file
162
src/keepass2android/search/SearchTotpResults.cs
Normal file
@@ -0,0 +1,162 @@
|
||||
/*
|
||||
This file is part of Keepass2Android, Copyright 2013 Philipp Crocoll. This file is based on Keepassdroid, Copyright Brian Pellin.
|
||||
|
||||
Keepass2Android is free software: you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
the Free Software Foundation, either version 3 of the License, or
|
||||
(at your option) any later version.
|
||||
|
||||
Keepass2Android is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with Keepass2Android. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
using System;
|
||||
using System.Linq;
|
||||
using System.Text.RegularExpressions;
|
||||
using Android.App;
|
||||
using Android.Content;
|
||||
using Android.Content.PM;
|
||||
using Android.OS;
|
||||
using Android.Preferences;
|
||||
using Android.Views;
|
||||
using Android.Widget;
|
||||
using keepass2android.view;
|
||||
using KeePassLib;
|
||||
|
||||
namespace keepass2android.search
|
||||
{
|
||||
/// <summary>
|
||||
/// Activity to show search results
|
||||
/// </summary>
|
||||
[Activity(Label = "@string/app_name", Theme = "@style/MyTheme_ActionBar", LaunchMode = Android.Content.PM.LaunchMode.SingleTop, ConfigurationChanges = ConfigChanges.Orientation | ConfigChanges.Keyboard | ConfigChanges.KeyboardHidden)]
|
||||
public class SearchTotpResults : GroupBaseActivity
|
||||
{
|
||||
|
||||
public static void Launch(Activity act, AppTask appTask, ActivityFlags? flags = null)
|
||||
{
|
||||
Intent i = new Intent(act, typeof(SearchTotpResults));
|
||||
|
||||
|
||||
if (flags != null)
|
||||
i.SetFlags((ActivityFlags)flags);
|
||||
|
||||
appTask.ToIntent(i);
|
||||
if (flags != null && (((ActivityFlags)flags) | ActivityFlags.ForwardResult) == ActivityFlags.ForwardResult)
|
||||
act.StartActivity(i);
|
||||
else
|
||||
act.StartActivityForResult(i, 0);
|
||||
}
|
||||
|
||||
public override bool MayPreviewTotp
|
||||
{
|
||||
get
|
||||
{
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
protected override void OnCreate (Bundle bundle)
|
||||
{
|
||||
base.OnCreate (bundle);
|
||||
|
||||
if ( IsFinishing ) {
|
||||
return;
|
||||
}
|
||||
|
||||
SetResult(KeePass.ExitNormal);
|
||||
|
||||
// Likely the app has been killed exit the activity
|
||||
if (!App.Kp2a.DatabaseIsUnlocked)
|
||||
{
|
||||
Finish();
|
||||
}
|
||||
|
||||
Group = new PwGroup()
|
||||
{
|
||||
Name = GetString(Resource.String.TOTP)
|
||||
};
|
||||
try
|
||||
{
|
||||
foreach (var db in App.Kp2a.OpenDatabases)
|
||||
{
|
||||
foreach (var entry in db.EntriesById.Values)
|
||||
{
|
||||
var totpData = new Kp2aTotp().TryGetTotpData(new PwEntryOutput(entry, db));
|
||||
if (totpData?.IsTotpEntry == true)
|
||||
Group.AddEntry(entry, false);
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
catch (Exception e)
|
||||
{
|
||||
Kp2aLog.LogUnexpectedError(e);
|
||||
Toast.MakeText(this, e.Message, ToastLength.Long).Show();
|
||||
Finish();
|
||||
return;
|
||||
}
|
||||
|
||||
if (Group == null || (!Group.Entries.Any()))
|
||||
{
|
||||
SetContentView(Resource.Layout.group_empty);
|
||||
}
|
||||
|
||||
SetGroupTitle();
|
||||
|
||||
FragmentManager.FindFragmentById<GroupListFragment>(Resource.Id.list_fragment).ListAdapter = new PwGroupListAdapter(this, Group);
|
||||
|
||||
}
|
||||
|
||||
public override bool EntriesBelongToCurrentDatabaseOnly
|
||||
{
|
||||
get { return false; }
|
||||
}
|
||||
|
||||
public override ElementAndDatabaseId FullGroupId
|
||||
{
|
||||
get { return null; }
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
public override void OnCreateContextMenu(IContextMenu menu, View v,
|
||||
IContextMenuContextMenuInfo menuInfo)
|
||||
{
|
||||
|
||||
AdapterView.AdapterContextMenuInfo acmi = (AdapterView.AdapterContextMenuInfo) menuInfo;
|
||||
ClickView cv = (ClickView) acmi.TargetView;
|
||||
cv.OnCreateMenu(menu, menuInfo);
|
||||
}
|
||||
|
||||
public override bool OnContextItemSelected(IMenuItem item) {
|
||||
AdapterView.AdapterContextMenuInfo acmi = (AdapterView.AdapterContextMenuInfo)item.MenuInfo;
|
||||
ClickView cv = (ClickView) acmi.TargetView;
|
||||
|
||||
bool result;
|
||||
|
||||
return cv.OnContextItemSelected(item);
|
||||
}
|
||||
|
||||
|
||||
public override bool OnSearchRequested()
|
||||
{
|
||||
Intent i = new Intent(this, typeof(SearchActivity));
|
||||
this.AppTask.ToIntent(i);
|
||||
i.SetFlags(ActivityFlags.ForwardResult);
|
||||
StartActivity(i);
|
||||
return true;
|
||||
}
|
||||
|
||||
public override bool IsSearchResult
|
||||
{
|
||||
get { return true; }
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@@ -28,7 +28,8 @@ using Android.Preferences;
|
||||
using KeePass.Util.Spr;
|
||||
using KeeTrayTOTP.Libraries;
|
||||
using PluginTOTP;
|
||||
using Microsoft.Graph;
|
||||
using Android.Content;
|
||||
using System.ComponentModel;
|
||||
|
||||
|
||||
namespace keepass2android.view
|
||||
@@ -92,6 +93,13 @@ namespace keepass2android.view
|
||||
_totpText = ev.FindViewById<TextView>(Resource.Id.totp_text);
|
||||
_totpLayout = ev.FindViewById<LinearLayout>(Resource.Id.totp_layout);
|
||||
|
||||
_totpLayout.LongClick += (sender, args) =>
|
||||
{
|
||||
string totp = UpdateTotp();
|
||||
if (!String.IsNullOrEmpty(totp))
|
||||
CopyToClipboardService.CopyValueToClipboardWithTimeout(_groupActivity, totp, true);
|
||||
};
|
||||
|
||||
_showDetail = PreferenceManager.GetDefaultSharedPreferences(groupActivity).GetBoolean(
|
||||
groupActivity.GetString(Resource.String.ShowUsernameInList_key),
|
||||
Resources.GetBoolean(Resource.Boolean.ShowUsernameInList_default));
|
||||
@@ -200,16 +208,7 @@ namespace keepass2android.view
|
||||
UpdateTotp();
|
||||
|
||||
|
||||
if (_totpData?.IsTotpEntry == true)
|
||||
{
|
||||
_totpLayout.Visibility = ViewStates.Visible;
|
||||
|
||||
|
||||
}
|
||||
else
|
||||
{
|
||||
_totpLayout.Visibility = ViewStates.Gone;
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -283,14 +282,25 @@ namespace keepass2android.view
|
||||
|
||||
private Database _db;
|
||||
|
||||
public void UpdateTotp()
|
||||
public string UpdateTotp()
|
||||
{
|
||||
|
||||
_totpData = new Kp2aTotp().TryGetTotpData(new PwEntryOutput(_entry, _db));
|
||||
ISharedPreferences prefs = PreferenceManager.GetDefaultSharedPreferences(_groupActivity);
|
||||
bool showTotpDefault = _groupActivity.MayPreviewTotp;
|
||||
|
||||
|
||||
if (showTotpDefault)
|
||||
_totpData = new Kp2aTotp().TryGetTotpData(new PwEntryOutput(_entry, _db));
|
||||
else
|
||||
_totpData = null;
|
||||
|
||||
if (_totpData?.IsTotpEntry != true)
|
||||
{
|
||||
_totpLayout.Visibility = ViewStates.Gone;
|
||||
return null;
|
||||
}
|
||||
|
||||
_totpLayout.Visibility = ViewStates.Visible;
|
||||
|
||||
if (_totpData == null)
|
||||
return;
|
||||
Kp2aLog.Log("UpdateTotp");
|
||||
TOTPProvider prov = new TOTPProvider(_totpData);
|
||||
string totp = prov.GenerateByByte(_totpData.TotpSecret);
|
||||
|
||||
@@ -298,6 +308,8 @@ namespace keepass2android.view
|
||||
var progressBar = _totpCountdown;
|
||||
progressBar.Progress = prov.Timer;
|
||||
progressBar.Max = prov.Duration;
|
||||
|
||||
return totp;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
Reference in New Issue
Block a user