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 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) |         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 KeePass.Util.Spr; | ||||||
| using KeeTrayTOTP.Libraries; | using KeeTrayTOTP.Libraries; | ||||||
| using PluginTOTP; | using PluginTOTP; | ||||||
| using Microsoft.Graph; | using Android.Content; | ||||||
|  | using System.ComponentModel; | ||||||
|  |  | ||||||
|  |  | ||||||
| namespace keepass2android.view | namespace keepass2android.view | ||||||
| @@ -92,6 +93,13 @@ namespace keepass2android.view | |||||||
|             _totpText = ev.FindViewById<TextView>(Resource.Id.totp_text); |             _totpText = ev.FindViewById<TextView>(Resource.Id.totp_text); | ||||||
|             _totpLayout = ev.FindViewById<LinearLayout>(Resource.Id.totp_layout); |             _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( |             _showDetail = PreferenceManager.GetDefaultSharedPreferences(groupActivity).GetBoolean( | ||||||
| 				groupActivity.GetString(Resource.String.ShowUsernameInList_key),  | 				groupActivity.GetString(Resource.String.ShowUsernameInList_key),  | ||||||
| 				Resources.GetBoolean(Resource.Boolean.ShowUsernameInList_default)); | 				Resources.GetBoolean(Resource.Boolean.ShowUsernameInList_default)); | ||||||
| @@ -200,16 +208,7 @@ namespace keepass2android.view | |||||||
|             UpdateTotp(); |             UpdateTotp(); | ||||||
|              |              | ||||||
|  |  | ||||||
|             if (_totpData?.IsTotpEntry == true) |             | ||||||
|             { |  | ||||||
|                 _totpLayout.Visibility = ViewStates.Visible; |  | ||||||
|                 |  | ||||||
|                  |  | ||||||
|             } |  | ||||||
|             else |  | ||||||
|             { |  | ||||||
|                 _totpLayout.Visibility = ViewStates.Gone; |  | ||||||
|             } |  | ||||||
|                  |                  | ||||||
|  |  | ||||||
|              |              | ||||||
| @@ -283,14 +282,25 @@ namespace keepass2android.view | |||||||
| 		 | 		 | ||||||
|         private Database _db; |         private Database _db; | ||||||
|  |  | ||||||
|         public void UpdateTotp() |         public string UpdateTotp() | ||||||
|         { |         { | ||||||
| 			 |             ISharedPreferences prefs = PreferenceManager.GetDefaultSharedPreferences(_groupActivity); | ||||||
|             _totpData = new Kp2aTotp().TryGetTotpData(new PwEntryOutput(_entry, _db)); |             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); |             TOTPProvider prov = new TOTPProvider(_totpData); | ||||||
|             string totp = prov.GenerateByByte(_totpData.TotpSecret); |             string totp = prov.GenerateByByte(_totpData.TotpSecret); | ||||||
|  |  | ||||||
| @@ -298,6 +308,8 @@ namespace keepass2android.view | |||||||
|             var progressBar = _totpCountdown; |             var progressBar = _totpCountdown; | ||||||
|             progressBar.Progress = prov.Timer; |             progressBar.Progress = prov.Timer; | ||||||
|             progressBar.Max = prov.Duration; |             progressBar.Max = prov.Duration; | ||||||
|  |  | ||||||
|  |             return totp; | ||||||
|         } |         } | ||||||
|     } |     } | ||||||
| } | } | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user
	 Philipp Crocoll
					Philipp Crocoll