keepass2android/src/keepass2android/search/SearchResults.cs

175 lines
5.6 KiB
C#

/*
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 Android.App;
using Android.Content;
using Android.OS;
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)]
#if NoNet
[MetaData("android.app.searchable", Resource = "@xml/searchable_offline")]
#else
#if DEBUG
[MetaData("android.app.searchable", Resource = "@xml/searchable_debug")]
#else
[MetaData("android.app.searchable", Resource = "@xml/searchable")]
#endif
#endif
[MetaData("android.app.default_searchable", Value = "keepass2android.search.SearchResults")]
[IntentFilter(new[]{Intent.ActionSearch}, Categories=new[]{Intent.CategoryDefault})]
public class SearchResults : GroupBaseActivity
{
protected override void OnCreate (Bundle bundle)
{
base.OnCreate (bundle);
if ( IsFinishing ) {
return;
}
SetResult(KeePass.ExitNormal);
ProcessIntent(Intent);
}
protected override bool AddEntryEnabled
{
get { return false; }
}
protected override bool AddGroupEnabled
{
get { return false; }
}
protected override void OnNewIntent(Intent intent)
{
ProcessIntent(intent);
}
private void ProcessIntent(Intent intent)
{
// Likely the app has been killed exit the activity
if (!App.Kp2a.DatabaseIsUnlocked)
{
Finish();
}
if (intent.Action == Intent.ActionView)
{
var entryIntent = new Intent(this, typeof(EntryActivity));
entryIntent.PutExtra(EntryActivity.KeyEntry, intent.Data.LastPathSegment);
entryIntent.AddFlags(ActivityFlags.ForwardResult);
Finish(); // Close this activity so that the entry activity is navigated to from the main activity, not this one.
StartActivity(entryIntent);
}
else
{
// Action may either by ActionSearch (from search widget) or null (if called from SearchActivity directly)
Query(getSearch(intent));
}
}
private void Query (SearchParameters searchParams)
{
try {
Group = App.Kp2a.GetDb().Search (searchParams, null);
} 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);
}
private SearchParameters getSearch(Intent queryIntent) {
// get and process search query here
SearchParameters sp = new SearchParameters();
sp.SearchString = queryIntent.GetStringExtra(SearchManager.Query);
sp.SearchInTitles = queryIntent.GetBooleanExtra("SearchInTitles", sp.SearchInTitles);
sp.SearchInUrls = queryIntent.GetBooleanExtra("SearchInUrls", sp.SearchInUrls);
sp.SearchInPasswords = queryIntent.GetBooleanExtra("SearchInPasswords", sp.SearchInPasswords);
sp.SearchInUserNames = queryIntent.GetBooleanExtra("SearchInUserNames", sp.SearchInUserNames);
sp.SearchInNotes = queryIntent.GetBooleanExtra("SearchInNotes", sp.SearchInNotes);
sp.SearchInGroupNames = queryIntent.GetBooleanExtra("SearchInGroupNames", sp.SearchInGroupNames);
sp.SearchInOther = queryIntent.GetBooleanExtra("SearchInOther", sp.SearchInOther);
sp.SearchInTags = queryIntent.GetBooleanExtra("SearchInTags", sp.SearchInTags);
sp.RegularExpression = queryIntent.GetBooleanExtra("RegularExpression", sp.RegularExpression);
sp.ExcludeExpired = queryIntent.GetBooleanExtra("ExcludeExpired", sp.ExcludeExpired);
sp.ComparisonMode = queryIntent.GetBooleanExtra("CaseSensitive", false) ?
StringComparison.InvariantCulture :
StringComparison.InvariantCultureIgnoreCase;
return sp;
}
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));
AppTask.ToIntent(i);
i.SetFlags(ActivityFlags.ForwardResult);
StartActivity(i);
return true;
}
public override bool IsSearchResult
{
get { return true; }
}
}
}