A little more refactoring: Removed/moved classes, some renames, ...

Added comments for most classes
This commit is contained in:
Philipp Crocoll 2013-06-15 22:02:48 +02:00
parent d2a06617eb
commit 8b08baa51a
35 changed files with 240 additions and 236 deletions

View File

@ -4,19 +4,46 @@ using KeePassLib.Serialization;
namespace keepass2android namespace keepass2android
{ {
/// <summary>
/// Interface through which Activities and the logic layer can access some app specific functionalities and Application static data
/// </summary>
/// This also contains methods which are UI specific and should be replacable for testing.
public interface IKp2aApp public interface IKp2aApp
{ {
/// <summary>
/// Set the flag that the database needs to be locked.
/// </summary>
void SetShutdown(); void SetShutdown();
/// <summary>
/// Returns the current database
/// </summary>
Database GetDb(); Database GetDb();
/// <summary>
/// Tell the app that the file from ioc was opened with keyfile.
/// </summary>
void StoreOpenedFileAsRecent(IOConnectionInfo ioc, string keyfile); void StoreOpenedFileAsRecent(IOConnectionInfo ioc, string keyfile);
/// <summary>
/// Creates a new database and returns it
/// </summary>
Database CreateNewDatabase(); Database CreateNewDatabase();
/// <summary>
/// Returns the user-displayable string identified by stringKey
/// </summary>
string GetResourceString(UiStringKey stringKey); string GetResourceString(UiStringKey stringKey);
/// <summary>
/// Returns the value from the preferences corresponding to key
/// </summary>
bool GetBooleanPreference(PreferenceKey key); bool GetBooleanPreference(PreferenceKey key);
/// <summary>
/// Asks the user the question "messageKey" with the options Yes/No/Cancel, calls the handler corresponding to the answer.
/// </summary>
void AskYesNoCancel(UiStringKey titleKey, UiStringKey messageKey, void AskYesNoCancel(UiStringKey titleKey, UiStringKey messageKey,
EventHandler<DialogClickEventArgs> yesHandler, EventHandler<DialogClickEventArgs> yesHandler,
EventHandler<DialogClickEventArgs> noHandler, EventHandler<DialogClickEventArgs> noHandler,

View File

@ -16,20 +16,12 @@ This file is part of Keepass2Android, Copyright 2013 Philipp Crocoll. This file
*/ */
using System; using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Android.App;
using Android.Content;
using Android.OS;
using Android.Runtime;
using Android.Views;
using Android.Widget;
namespace keepass2android namespace keepass2android
{ {
/// <summary>
/// Thrown when there is an error adding the keyfie to the user key
/// </summary>
[Serializable] [Serializable]
public class KeyFileException : Exception public class KeyFileException : Exception
{ {

View File

@ -1,5 +1,8 @@
namespace keepass2android namespace keepass2android
{ {
/// <summary>
/// Keys which can be used to get a preference setting
/// </summary>
public enum PreferenceKey public enum PreferenceKey
{ {
remember_keyfile, remember_keyfile,

View File

@ -22,6 +22,9 @@ using Java.Lang;
namespace keepass2android namespace keepass2android
{ {
/// <summary>
/// Class to run a task while a progress dialog is shown
/// </summary>
public class ProgressTask { public class ProgressTask {
private readonly Handler _handler; private readonly Handler _handler;
private readonly RunnableOnFinish _task; private readonly RunnableOnFinish _task;

View File

@ -23,6 +23,9 @@ using KeePassLib.Utility;
namespace keepass2android namespace keepass2android
{ {
/// <summary>
/// Helper class providing methods to search a given database for specific things
/// </summary>
public class SearchDbHelper public class SearchDbHelper
{ {
private readonly IKp2aApp _app; private readonly IKp2aApp _app;
@ -86,21 +89,21 @@ namespace keepass2android
} }
private String extractHost(String url) private static String ExtractHost(String url)
{ {
return UrlUtil.GetHost(url.Trim()); return UrlUtil.GetHost(url.Trim());
} }
public PwGroup SearchForHost(Database database, String url, bool allowSubdomains) public PwGroup SearchForHost(Database database, String url, bool allowSubdomains)
{ {
String host = extractHost(url); String host = ExtractHost(url);
string strGroupName = _app.GetResourceString(UiStringKey.search_results) + " (\"" + host + "\")"; string strGroupName = _app.GetResourceString(UiStringKey.search_results) + " (\"" + host + "\")";
PwGroup pgResults = new PwGroup(true, true, strGroupName, PwIcon.EMailSearch) {IsVirtual = true}; PwGroup pgResults = new PwGroup(true, true, strGroupName, PwIcon.EMailSearch) {IsVirtual = true};
if (String.IsNullOrWhiteSpace(host)) if (String.IsNullOrWhiteSpace(host))
return pgResults; return pgResults;
foreach (PwEntry entry in database.Entries.Values) foreach (PwEntry entry in database.Entries.Values)
{ {
String otherHost = extractHost(entry.Strings.ReadSafe(PwDefs.UrlField)); String otherHost = ExtractHost(entry.Strings.ReadSafe(PwDefs.UrlField));
if ((allowSubdomains) && (otherHost.StartsWith("www."))) if ((allowSubdomains) && (otherHost.StartsWith("www.")))
otherHost = otherHost.Substring(4); //remove "www." otherHost = otherHost.Substring(4); //remove "www."
if (String.IsNullOrWhiteSpace(otherHost)) if (String.IsNullOrWhiteSpace(otherHost))

View File

@ -22,6 +22,9 @@ using KeePassLib.Interfaces;
namespace keepass2android namespace keepass2android
{ {
/// <summary>
/// StatusLogger implementation which shows the progress in a progress dialog
/// </summary>
public class UpdateStatus: IStatusLogger { public class UpdateStatus: IStatusLogger {
private readonly ProgressDialog _progressDialog; private readonly ProgressDialog _progressDialog;
readonly IKp2aApp _app; readonly IKp2aApp _app;

View File

@ -6,6 +6,9 @@ using Java.IO;
namespace keepass2android namespace keepass2android
{ {
/// <summary>
/// Makes attachments of PwEntries accessible when they are stored in the app cache
/// </summary>
[ContentProvider(new[]{"keepass2android."+AppNames.PackagePart+".provider"})] [ContentProvider(new[]{"keepass2android."+AppNames.PackagePart+".provider"})]
public class AttachmentContentProvider : ContentProvider { public class AttachmentContentProvider : ContentProvider {

View File

@ -1,34 +0,0 @@
/*
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 2 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 Android.Graphics.Drawables;
using Android.Content.Res;
using Android.Graphics;
namespace keepass2android
{
public class BitmapDrawableCompat {
public static BitmapDrawable GetBitmapDrawable(Resources res, Bitmap bitmap) {
return new BitmapDrawable(res, bitmap);
}
}
}

View File

@ -27,6 +27,9 @@ using Android.Text.Method;
namespace keepass2android namespace keepass2android
{ {
/// <summary>
/// Launcher activity of Keepass2Android. This activity usually forwards to FileSelect but may show the revision dialog after installation or updates.
/// </summary>
[Activity (Label = AppNames.AppName, MainLauncher = true, Theme="@style/Base")] [Activity (Label = AppNames.AppName, MainLauncher = true, Theme="@style/Base")]
public class KeePass : LifecycleDebugActivity public class KeePass : LifecycleDebugActivity
{ {

View File

@ -20,6 +20,10 @@ using KeePassLib.Serialization;
namespace keepass2android namespace keepass2android
{ {
/// <summary>
/// Base class for activities displaying sensitive information.
/// </summary>
/// Checks in OnResume whether the timeout occured and the database must be locked/closed.
public class LockCloseActivity : LockingActivity { public class LockCloseActivity : LockingActivity {
IOConnectionInfo _ioc; IOConnectionInfo _ioc;

View File

@ -22,7 +22,10 @@ using KeePassLib.Serialization;
namespace keepass2android namespace keepass2android
{ {
/// <summary>
/// Base class for list activities displaying sensitive information.
/// </summary>
/// Checks in OnResume whether the timeout occured and the database must be locked/closed.
public class LockCloseListActivity : LockingListActivity { public class LockCloseListActivity : LockingListActivity {
public LockCloseListActivity() public LockCloseListActivity()
{ {

View File

@ -20,7 +20,9 @@ using Android.Runtime;
namespace keepass2android namespace keepass2android
{ {
/// <summary>
/// Base class for activities. Notifies the TimeoutHelper whether the app is active or not.
/// </summary>
public class LockingActivity : LifecycleDebugActivity { public class LockingActivity : LifecycleDebugActivity {
public LockingActivity (IntPtr javaReference, JniHandleOwnership transfer) public LockingActivity (IntPtr javaReference, JniHandleOwnership transfer)

View File

@ -366,7 +366,7 @@ namespace keepass2android
Handler handler = new Handler(); Handler handler = new Handler();
LoadDb task = new LoadDb(App.Kp2a, _ioConnection, pass, key, new AfterLoad(handler, this)); LoadDb task = new LoadDb(App.Kp2a, _ioConnection, pass, key, new AfterLoad(handler, this));
ProgressTask pt = new ProgressTask(App.Kp2a, this, task, UiStringKey.loading_database); ProgressTask pt = new ProgressTask(App.Kp2a, this, task, UiStringKey.loading_database);
pt.run(); pt.Run();
}; };
/*CheckBox checkBox = (CheckBox) FindViewById(Resource.Id.show_password); /*CheckBox checkBox = (CheckBox) FindViewById(Resource.Id.show_password);
@ -556,7 +556,7 @@ namespace keepass2android
private class AfterLoad : OnFinish { private class AfterLoad : OnFinish {
readonly PasswordActivity _act; readonly PasswordActivity _act;
public AfterLoad(Handler handler, PasswordActivity act):base(handler) { public AfterLoad(Handler handler, PasswordActivity act):base(handler) {
this._act = act; _act = act;
} }

View File

@ -1,62 +0,0 @@
/*
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 2 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.Collections.Generic;
using System.Linq;
using System.Text;
using Android.App;
using Android.Content;
using Android.OS;
using Android.Runtime;
using Android.Views;
using Android.Widget;
using Android.Content.PM;
namespace keepass2android
{
public class Interaction {
/**
* Indicates whether the specified action can be used as an intent. This
* method queries the package manager for installed packages that can
* respond to an intent with the specified action. If no suitable package is
* found, this method returns false.
*
* @param context The application's environment.
* @param action The Intent action to check for availability.
*
* @return True if an Intent with the specified action can be sent and
* responded to, false otherwise.
*/
public static bool isIntentAvailable(Context context, String action, String type) {
PackageManager packageManager = context.PackageManager;
Intent intent = new Intent(action);
if (type != null)
intent.SetType(type);
IList<ResolveInfo> list =
packageManager.QueryIntentActivities(intent,
PackageInfoFlags.MatchDefaultOnly);
foreach (ResolveInfo i in list)
Android.Util.Log.Debug("DEBUG", i.ActivityInfo.ApplicationInfo.PackageName);
return list.Count > 0;
}
}
}

View File

@ -102,17 +102,42 @@ namespace keepass2android
} }
} }
/**
* Indicates whether the specified action can be used as an intent. This
* method queries the package manager for installed packages that can
* respond to an intent with the specified action. If no suitable package is
* found, this method returns false.
*
* @param context The application's environment.
* @param action The Intent action to check for availability.
*
* @return True if an Intent with the specified action can be sent and
* responded to, false otherwise.
*/
static bool IsIntentAvailable(Context context, String action, String type)
{
PackageManager packageManager = context.PackageManager;
Intent intent = new Intent(action);
if (type != null)
intent.SetType(type);
IList<ResolveInfo> list =
packageManager.QueryIntentActivities(intent,
PackageInfoFlags.MatchDefaultOnly);
foreach (ResolveInfo i in list)
Android.Util.Log.Debug("DEBUG", i.ActivityInfo.ApplicationInfo.PackageName);
return list.Count > 0;
}
public static void showBrowseDialog(string filename, Activity act, int requestCodeBrowse, bool forSaving) public static void showBrowseDialog(string filename, Activity act, int requestCodeBrowse, bool forSaving)
{ {
if ((!forSaving) && (Interaction.isIntentAvailable(act, Intent.ActionGetContent, "file/*"))) { if ((!forSaving) && (IsIntentAvailable(act, Intent.ActionGetContent, "file/*"))) {
Intent i = new Intent(Intent.ActionGetContent); Intent i = new Intent(Intent.ActionGetContent);
i.SetType("file/*"); i.SetType("file/*");
act.StartActivityForResult(i, requestCodeBrowse); act.StartActivityForResult(i, requestCodeBrowse);
return; return;
} }
if (Interaction.isIntentAvailable(act, Intents.FileBrowse, null)) if (IsIntentAvailable(act, Intents.FileBrowse, null))
{ {
Intent i = new Intent(Intents.FileBrowse); Intent i = new Intent(Intents.FileBrowse);
if (filename != null) if (filename != null)

View File

@ -25,6 +25,9 @@ using Android.Preferences;
namespace keepass2android namespace keepass2android
{ {
#if NoNet #if NoNet
/// <summary>
/// Static strings containing App names for the Offline ("nonet") release
/// </summary>
public static class AppNames public static class AppNames
{ {
public const string AppName = "@string/app_name_nonet"; public const string AppName = "@string/app_name_nonet";
@ -33,6 +36,9 @@ namespace keepass2android
public const string PackagePart = "keepass2android_nonet"; public const string PackagePart = "keepass2android_nonet";
} }
#else #else
/// <summary>
/// Static strings containing App names for the Online release
/// </summary>
public static class AppNames public static class AppNames
{ {
public const string AppName = "@string/app_name"; public const string AppName = "@string/app_name";

View File

@ -63,8 +63,11 @@ namespace keepass2android
} }
/// <summary> /// <summary>
/// base class for "tasks": this are things the user wants to do and which require several activities /// base class for "tasks": these are things the user wants to do and which require several activities
/// </summary> /// </summary>
/// Therefore AppTasks need to be serializable to bundles and intents to "survive" saving to instance state and changing activities.
/// An AppTask has a type and may have several parameters ("extras").
/// Activities call the task at special points so tasks can change the behaviour at these points.
public abstract class AppTask public abstract class AppTask
{ {
/// <summary> /// <summary>

View File

@ -23,22 +23,22 @@ namespace keepass2android
{ {
public class ActivityCompat { public class ActivityCompat {
private static MethodInfo invalidateOptMenuMethod; private static MethodInfo _invalidateOptMenuMethod;
public static void InvalidateOptionsMenu(Activity act) { public static void InvalidateOptionsMenu(Activity act) {
try { try {
invalidateOptMenuMethod = act.GetType().GetMethod("InvalidateOptionsMenu", new Type[]{}); _invalidateOptMenuMethod = act.GetType().GetMethod("InvalidateOptionsMenu", new Type[]{});
} catch (Exception) } catch (Exception)
{ {
// Do nothing if method doesn't exist // Do nothing if method doesn't exist
} }
if (invalidateOptMenuMethod != null) { if (_invalidateOptMenuMethod != null) {
try { try {
invalidateOptMenuMethod.Invoke(act, (new Object[]{})); _invalidateOptMenuMethod.Invoke(act, (new Object[]{}));
} catch (Exception) } catch (Exception)
{ {
// Do nothing // Do nothing

View File

@ -24,7 +24,9 @@ using Android.Content.PM;
namespace keepass2android namespace keepass2android
{ {
/// <summary>
/// Dialog to offer to install OpenIntent file manager if there's no other browser installed
/// </summary>
public class BrowserDialog : Dialog { public class BrowserDialog : Dialog {
public BrowserDialog(Context context) : base(context) public BrowserDialog(Context context) : base(context)

View File

@ -24,6 +24,9 @@ using KeePassLib.Serialization;
namespace keepass2android namespace keepass2android
{ {
/// <summary>
/// Class to store the recent files in a database
/// </summary>
public class FileDbHelper { public class FileDbHelper {
public const String LastFilename = "lastFile"; public const String LastFilename = "lastFile";

View File

@ -27,7 +27,9 @@ using KeePassLib.Serialization;
namespace keepass2android namespace keepass2android
{ {
/// <summary>
/// Activity to select the file to use
/// </summary>
[Activity (Label = "@string/app_name", [Activity (Label = "@string/app_name",
ConfigurationChanges=ConfigChanges.Orientation| ConfigurationChanges=ConfigChanges.Orientation|
ConfigChanges.KeyboardHidden, ConfigChanges.KeyboardHidden,
@ -171,7 +173,7 @@ namespace keepass2android
App.Kp2a, App.Kp2a,
this, create, this, create,
UiStringKey.progress_create); UiStringKey.progress_create);
createTask.run(); createTask.Run();
}; };

View File

@ -24,6 +24,9 @@ using Android.Graphics;
namespace keepass2android namespace keepass2android
{ {
/// <summary>
/// Factory to create password icons
/// </summary>
public class DrawableFactory: IDrawableFactory public class DrawableFactory: IDrawableFactory
{ {
private static Drawable _blank; private static Drawable _blank;
@ -42,7 +45,7 @@ namespace keepass2android
*/ */
private readonly Dictionary<int/*resId*/, Drawable> _standardIconMap = new Dictionary<int, Drawable>(); private readonly Dictionary<int/*resId*/, Drawable> _standardIconMap = new Dictionary<int, Drawable>();
public void assignDrawableTo (ImageView iv, Resources res, PwDatabase db, PwIcon icon, PwUuid customIconId) public void AssignDrawableTo (ImageView iv, Resources res, PwDatabase db, PwIcon icon, PwUuid customIconId)
{ {
Drawable draw = GetIconDrawable (res, db, icon, customIconId); Drawable draw = GetIconDrawable (res, db, icon, customIconId);
iv.SetImageDrawable (draw); iv.SetImageDrawable (draw);

View File

@ -22,15 +22,17 @@ using KeePassLib;
namespace keepass2android namespace keepass2android
{ {
/// <summary>
/// Stores the default pw entry icons
/// </summary>
public class Icons public class Icons
{ {
private static Dictionary<PwIcon, int> _icons; private static Dictionary<PwIcon, int> _icons;
private static void BuildList() private static void BuildList()
{ {
if (_icons == null) if (_icons != null) return;
{
_icons = new Dictionary<PwIcon, int>(); _icons = new Dictionary<PwIcon, int>();
FieldInfo[] fields = typeof(Resource.Drawable).GetFields(BindingFlags.Static | BindingFlags.Public); FieldInfo[] fields = typeof(Resource.Drawable).GetFields(BindingFlags.Static | BindingFlags.Public);
@ -61,7 +63,6 @@ namespace keepass2android
} }
} }
} }
}
public static int IconToResId(PwIcon iconId) public static int IconToResId(PwIcon iconId)
{ {

View File

@ -19,7 +19,9 @@ using System;
namespace keepass2android namespace keepass2android
{ {
/// <summary>
/// Contains constants to be used in intents
/// </summary>
public class Intents { public class Intents {
public const String Timeout = "keepass2android.timeout"; public const String Timeout = "keepass2android.timeout";

View File

@ -21,7 +21,9 @@ using Android.Content;
namespace keepass2android namespace keepass2android
{ {
/// <summary>
/// Password generator
/// </summary>
public class PasswordGenerator { public class PasswordGenerator {
private const String UpperCaseChars = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"; private const String UpperCaseChars = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
private const String LowerCaseChars = "abcdefghijklmnopqrstuvwxyz"; private const String LowerCaseChars = "abcdefghijklmnopqrstuvwxyz";

View File

@ -25,6 +25,9 @@ using keepass2android.search;
namespace keepass2android namespace keepass2android
{ {
/// <summary>
/// Activity to display search options
/// </summary>
[Activity (Label = "@string/app_name", Theme="@style/Base")] [Activity (Label = "@string/app_name", Theme="@style/Base")]
public class SearchActivity : LifecycleDebugActivity public class SearchActivity : LifecycleDebugActivity
{ {

View File

@ -25,6 +25,9 @@ using KeePassLib;
namespace keepass2android.search namespace keepass2android.search
{ {
/// <summary>
/// Activity to show search results
/// </summary>
[Activity (Label = "@string/app_name", Theme="@style/NoTitleBar")] [Activity (Label = "@string/app_name", Theme="@style/NoTitleBar")]
[MetaData("android.app.searchable",Resource="@xml/searchable")] [MetaData("android.app.searchable",Resource="@xml/searchable")]
[IntentFilter(new[]{Intent.ActionSearch}, Categories=new[]{Intent.CategoryDefault})] [IntentFilter(new[]{Intent.ActionSearch}, Categories=new[]{Intent.CategoryDefault})]

View File

@ -33,6 +33,12 @@ using KeePass.Util.Spr;
namespace keepass2android namespace keepass2android
{ {
/// <summary>
/// Service to show the notifications to make the current entry accessible through clipboard or the KP2A keyboard.
/// </summary>
/// The name reflects only the possibility through clipboard because keyboard was introduced later.
/// The notifications require to be displayed by a service in order to be kept when the activity is closed
/// after searching for a URL.
[Service] [Service]
public class CopyToClipboardService: Service public class CopyToClipboardService: Service
{ {

View File

@ -23,9 +23,11 @@ using Android.Graphics;
namespace keepass2android namespace keepass2android
{ {
//This service is started as soon as a Database with QuickUnlock enabled is opened. /// <summary>
//Its only purpose is to be a foreground service which prevents the App from being killed (in most situations) /// This service is started as soon as a Database with QuickUnlock enabled is opened.
[Service] /// Its only purpose is to be a foreground service which prevents the App from being killed (in most situations)
/// </summary>
[Service]
public class QuickUnlockForegroundService : Service public class QuickUnlockForegroundService : Service
{ {
public override IBinder OnBind(Intent intent) public override IBinder OnBind(Intent intent)

View File

@ -24,6 +24,9 @@ using Android.Util;
namespace keepass2android namespace keepass2android
{ {
/// <summary>
/// Manages timeout to lock the database after some idle time
/// </summary>
[Service] [Service]
public class TimeoutService : Service { public class TimeoutService : Service {
private const String Tag = "KeePass2Android Timer"; private const String Tag = "KeePass2Android Timer";

View File

@ -26,6 +26,9 @@ using KeePassLib.Cryptography.Cipher;
namespace keepass2android namespace keepass2android
{ {
/// <summary>
/// Activity to configure the app
/// </summary>
[Activity (Label = "@string/app_name", Theme="@style/NoTitleBar")] [Activity (Label = "@string/app_name", Theme="@style/NoTitleBar")]
public class AppSettingsActivity : LockingClosePreferenceActivity { public class AppSettingsActivity : LockingClosePreferenceActivity {
public static bool KeyfileDefault = false; public static bool KeyfileDefault = false;
@ -80,7 +83,7 @@ namespace keepass2android
} }
})); }));
ProgressTask pt = new ProgressTask(App.Kp2a, this, save, UiStringKey.saving_database); ProgressTask pt = new ProgressTask(App.Kp2a, this, save, UiStringKey.saving_database);
pt.run(); pt.Run();
}; };
Preference databaseName = FindPreference(GetString(Resource.String.database_name_key)); Preference databaseName = FindPreference(GetString(Resource.String.database_name_key));
@ -102,7 +105,7 @@ namespace keepass2android
} }
})); }));
ProgressTask pt = new ProgressTask(App.Kp2a, this, save, UiStringKey.saving_database); ProgressTask pt = new ProgressTask(App.Kp2a, this, save, UiStringKey.saving_database);
pt.run(); pt.Run();
}; };

View File

@ -21,7 +21,9 @@ using Android.Preferences;
namespace keepass2android namespace keepass2android
{ {
/// <summary>
/// Utility class to simplify access to the app preferences
/// </summary>
public class PrefsUtil { public class PrefsUtil {
public static float GetListTextSize(Context ctx) { public static float GetListTextSize(Context ctx) {
ISharedPreferences prefs = PreferenceManager.GetDefaultSharedPreferences(ctx); ISharedPreferences prefs = PreferenceManager.GetDefaultSharedPreferences(ctx);

View File

@ -26,7 +26,9 @@ using Android.Util;
namespace keepass2android.settings namespace keepass2android.settings
{ {
/// <summary>
/// Represents the setting for the number of key transformation rounds. Changing this requires to save the database.
/// </summary>
public class RoundsPreference : DialogPreference { public class RoundsPreference : DialogPreference {
internal PwDatabase PwDatabase; internal PwDatabase PwDatabase;
@ -80,7 +82,7 @@ namespace keepass2android.settings
Handler handler = new Handler(); Handler handler = new Handler();
SaveDb save = new SaveDb(Context, App.Kp2a.GetDb(), new AfterSave(Context, handler, oldRounds, this)); SaveDb save = new SaveDb(Context, App.Kp2a.GetDb(), new AfterSave(Context, handler, oldRounds, this));
ProgressTask pt = new ProgressTask(App.Kp2a, Context, save, UiStringKey.saving_database); ProgressTask pt = new ProgressTask(App.Kp2a, Context, save, UiStringKey.saving_database);
pt.run(); pt.Run();
} }

View File

@ -23,8 +23,66 @@ using KeePassLib.Serialization;
namespace keepass2android namespace keepass2android
{ {
/// <summary>
/// Helper class to simplify usage of timeout (lock after idle time) from the activities
/// </summary>
public class TimeoutHelper { public class TimeoutHelper {
class Timeout
{
private const int RequestId = 0;
private const long DefaultTimeout = 5 * 60 * 1000; // 5 minutes
private const String Tag = "Keepass2Android Timeout";
private static PendingIntent BuildIntent(Context ctx)
{
Intent intent = new Intent(Intents.Timeout);
PendingIntent sender = PendingIntent.GetBroadcast(ctx, RequestId, intent, PendingIntentFlags.CancelCurrent);
return sender;
}
public static void Start(Context ctx)
{
ISharedPreferences prefs = PreferenceManager.GetDefaultSharedPreferences(ctx);
String sTimeout = prefs.GetString(ctx.GetString(Resource.String.app_timeout_key), ctx.GetString(Resource.String.clipboard_timeout_default));
long timeout;
if (!long.TryParse(sTimeout, out timeout))
{
timeout = DefaultTimeout;
}
if (timeout == -1)
{
// No timeout don't start timeout service
return;
}
ctx.StartService(new Intent(ctx, typeof(TimeoutService)));
long triggerTime = Java.Lang.JavaSystem.CurrentTimeMillis() + timeout;
AlarmManager am = (AlarmManager)ctx.GetSystemService(Context.AlarmService);
Log.Debug(Tag, "Timeout start");
am.Set(AlarmType.Rtc, triggerTime, BuildIntent(ctx));
}
public static void Cancel(Context ctx)
{
AlarmManager am = (AlarmManager)ctx.GetSystemService(Context.AlarmService);
Log.Debug(Tag, "Timeout cancel");
am.Cancel(BuildIntent(ctx));
ctx.StopService(new Intent(ctx, typeof(TimeoutService)));
}
}
public static void Pause(Activity act) { public static void Pause(Activity act) {
// Record timeout time in case timeout service is killed // Record timeout time in case timeout service is killed
long time = Java.Lang.JavaSystem.CurrentTimeMillis(); long time = Java.Lang.JavaSystem.CurrentTimeMillis();

View File

@ -1,77 +0,0 @@
/*
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 2 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 Android.App;
using Android.Content;
using Android.Preferences;
using Android.Util;
namespace keepass2android
{
public class Timeout {
private const int RequestId = 0;
private const long DefaultTimeout = 5 * 60 * 1000; // 5 minutes
private const String Tag = "Keepass2Android Timeout";
private static PendingIntent BuildIntent(Context ctx) {
Intent intent = new Intent(Intents.Timeout);
PendingIntent sender = PendingIntent.GetBroadcast(ctx, RequestId, intent, PendingIntentFlags.CancelCurrent);
return sender;
}
public static void Start(Context ctx) {
ISharedPreferences prefs = PreferenceManager.GetDefaultSharedPreferences(ctx);
String sTimeout = prefs.GetString(ctx.GetString(Resource.String.app_timeout_key), ctx.GetString(Resource.String.clipboard_timeout_default));
long timeout;
if (!long.TryParse(sTimeout, out timeout))
{
timeout = DefaultTimeout;
}
if ( timeout == -1 ) {
// No timeout don't start timeout service
return;
}
ctx.StartService(new Intent(ctx, typeof(TimeoutService)));
long triggerTime = Java.Lang.JavaSystem.CurrentTimeMillis() + timeout;
AlarmManager am = (AlarmManager) ctx.GetSystemService(Context.AlarmService);
Log.Debug(Tag, "Timeout start");
am.Set(AlarmType.Rtc, triggerTime, BuildIntent(ctx));
}
public static void Cancel(Context ctx) {
AlarmManager am = (AlarmManager) ctx.GetSystemService(Context.AlarmService);
Log.Debug(Tag, "Timeout cancel");
am.Cancel(BuildIntent(ctx));
ctx.StopService(new Intent(ctx, typeof(TimeoutService)));
}
}
}