From f0dfdefd678eddf45917f52983cf2e2cdf9a9b7d Mon Sep 17 00:00:00 2001 From: AlexVallat Date: Sat, 3 Aug 2013 19:58:01 +0100 Subject: [PATCH 1/3] Load Database task async wait moved to LoadDb runnable rather than blocking UI thread (in case the file is very slow, or the user is very quick to enter their password) Database Unlocked warning notification now uses a 4.1 extended "Lock Database" button, and the main action is now just to activate the app. PasswordActivity no longer loads the database file into memory ready for loading if it's already loaded and we're showing QuickUnlock instead. --- src/Kp2aBusinessLogic/database/edit/LoadDB.cs | 7 ++-- src/keepass2android/PasswordActivity.cs | 40 +++++++++---------- .../Resources/values/strings.xml | 2 +- .../services/OngoingNotificationsService.cs | 29 +++++++++----- 4 files changed, 43 insertions(+), 35 deletions(-) diff --git a/src/Kp2aBusinessLogic/database/edit/LoadDB.cs b/src/Kp2aBusinessLogic/database/edit/LoadDB.cs index 416239ee..540853de 100644 --- a/src/Kp2aBusinessLogic/database/edit/LoadDB.cs +++ b/src/Kp2aBusinessLogic/database/edit/LoadDB.cs @@ -17,19 +17,20 @@ This file is part of Keepass2Android, Copyright 2013 Philipp Crocoll. This file using System; using System.IO; +using System.Threading.Tasks; using KeePassLib.Serialization; namespace keepass2android { public class LoadDb : RunnableOnFinish { private readonly IOConnectionInfo _ioc; - private readonly MemoryStream _databaseData; + private readonly Task _databaseData; private readonly String _pass; private readonly String _key; private readonly IKp2aApp _app; private readonly bool _rememberKeyfile; - public LoadDb(IKp2aApp app, IOConnectionInfo ioc, MemoryStream databaseData, String pass, String key, OnFinish finish): base(finish) + public LoadDb(IKp2aApp app, IOConnectionInfo ioc, Task databaseData, String pass, String key, OnFinish finish): base(finish) { _app = app; _ioc = ioc; @@ -47,7 +48,7 @@ namespace keepass2android try { StatusLogger.UpdateMessage(UiStringKey.loading_database); - _app.LoadDatabase(_ioc, _databaseData, _pass, _key, StatusLogger); + _app.LoadDatabase(_ioc, _databaseData.Result, _pass, _key, StatusLogger); SaveFileData (_ioc, _key); } catch (KeyFileException) { diff --git a/src/keepass2android/PasswordActivity.cs b/src/keepass2android/PasswordActivity.cs index dae84a76..68ce21d8 100644 --- a/src/keepass2android/PasswordActivity.cs +++ b/src/keepass2android/PasswordActivity.cs @@ -128,35 +128,19 @@ namespace keepass2android public void LaunchNextActivity() { AppTask.AfterUnlockDatabase(this); - } - void TryStartQuickUnlock() - { - if (App.Kp2a.QuickUnlockEnabled && App.Kp2a.QuickLocked) - { - Intent i = new Intent(this, typeof(QuickUnlock)); - PutIoConnectionToIntent(_ioConnection, i); - Kp2aLog.Log("Starting QuickUnlock"); - StartActivityForResult(i, 0); - } - } - - bool _startedWithActivityResult; - protected override void OnActivityResult(int requestCode, Result resultCode, Intent data) { base.OnActivityResult(requestCode, resultCode, data); - _startedWithActivityResult = true; Kp2aLog.Log("PasswordActivity.OnActivityResult "+resultCode+"/"+requestCode); //NOTE: original code from k eepassdroid used switch ((Android.App.Result)requestCode) { (but doesn't work here, although k eepassdroid works) switch(resultCode) { case KeePass.ExitLock: - // The database has already been locked, just show the quick unlock screen if appropriate - TryStartQuickUnlock(); + // The database has already been locked, and the quick unlock screen will be shown if appropriate break; case KeePass.ExitForceLock: App.Kp2a.LockDatabase(false); @@ -300,9 +284,9 @@ namespace keepass2android App.Kp2a.SetQuickUnlockEnabled(cbQuickUnlock.Checked); Handler handler = new Handler(); - var stream = _loadDbTask.Result; + LoadDb task = new LoadDb(App.Kp2a, _ioConnection, _loadDbTask, pass, key, new AfterLoad(handler, this)); _loadDbTask = null; // prevent accidental re-use - LoadDb task = new LoadDb(App.Kp2a, _ioConnection, stream, pass, key, new AfterLoad(handler, this)); + ProgressTask pt = new ProgressTask(App.Kp2a, this, task); pt.Run(); }; @@ -382,8 +366,18 @@ namespace keepass2android { base.OnStart(); - // Create task to kick off file loading while the user enters the password - _loadDbTask = Task.Factory.StartNew(LoadDbFile); + if (App.Kp2a.QuickUnlockEnabled && App.Kp2a.QuickLocked) + { + Intent i = new Intent(this, typeof(QuickUnlock)); + PutIoConnectionToIntent(_ioConnection, i); + Kp2aLog.Log("Starting QuickUnlock"); + StartActivityForResult(i, 0); + } + else + { + // Create task to kick off file loading while the user enters the password + _loadDbTask = Task.Factory.StartNew(LoadDbFile); + } } private MemoryStream LoadDbFile() @@ -407,6 +401,8 @@ namespace keepass2android memoryStream.Seek(0, System.IO.SeekOrigin.Begin); } + System.Threading.Thread.Sleep(3000); + Kp2aLog.Log("Pre-loading database file completed"); return memoryStream; @@ -418,6 +414,7 @@ namespace keepass2android AppTask.ToBundle(outState); } + /* protected override void OnResume() { base.OnResume(); @@ -437,6 +434,7 @@ namespace keepass2android } } } + * */ private void RetrieveSettings() { String defaultFilename = _prefs.GetString(KeyDefaultFilename, ""); diff --git a/src/keepass2android/Resources/values/strings.xml b/src/keepass2android/Resources/values/strings.xml index ac9eee5e..0e0a17de 100644 --- a/src/keepass2android/Resources/values/strings.xml +++ b/src/keepass2android/Resources/values/strings.xml @@ -216,7 +216,7 @@ Add additional string Delete additional string %1$s: Locked. QuickUnlock enabled. - %1$s: Unlocked. Tap to lock. + %1$s: Unlocked. Enter server credentials File transactions Use file transactions for writing databases diff --git a/src/keepass2android/services/OngoingNotificationsService.cs b/src/keepass2android/services/OngoingNotificationsService.cs index d330987e..3981b03b 100644 --- a/src/keepass2android/services/OngoingNotificationsService.cs +++ b/src/keepass2android/services/OngoingNotificationsService.cs @@ -128,22 +128,19 @@ namespace keepass2android new NotificationCompat.Builder(this) .SetSmallIcon(Resource.Drawable.ic_launcher_gray) .SetLargeIcon(BitmapFactory.DecodeResource(Resources, AppNames.LauncherIcon)) - .SetContentTitle(GetText(Resource.String.app_name)) + .SetContentTitle(GetString(Resource.String.app_name)) .SetContentText(GetString(Resource.String.database_loaded_quickunlock_enabled, GetDatabaseName())); - Intent startKp2aIntent = new Intent(this, typeof(KeePass)); - startKp2aIntent.SetAction(Intent.ActionMain); - startKp2aIntent.AddCategory(Intent.CategoryLauncher); - - PendingIntent startKp2APendingIntent = - PendingIntent.GetActivity(this, 0, startKp2aIntent, PendingIntentFlags.UpdateCurrent); + var startKp2APendingIntent = GetSwitchToAppPendingIntent(); builder.SetContentIntent(startKp2APendingIntent); return builder.Build(); } + #endregion #region Unlocked Warning + private Notification GetUnlockedNotification() { NotificationCompat.Builder builder = @@ -151,14 +148,26 @@ namespace keepass2android .SetOngoing(true) .SetSmallIcon(Resource.Drawable.ic_unlocked_gray) .SetLargeIcon(BitmapFactory.DecodeResource(Resources, Resource.Drawable.ic_launcher_red)) - .SetContentTitle(GetText(Resource.String.app_name)) + .SetContentTitle(GetString(Resource.String.app_name)) .SetContentText(GetString(Resource.String.database_loaded_unlocked, GetDatabaseName())); - builder.SetContentIntent(PendingIntent.GetBroadcast(this, 0, new Intent(Intents.LockDatabase), PendingIntentFlags.UpdateCurrent)); - + // Default action is to show Kp2A + builder.SetContentIntent(GetSwitchToAppPendingIntent()); + // Additional action to allow locking the database + builder.AddAction(Android.Resource.Drawable.IcLockLock, GetString(Resource.String.menu_lock), PendingIntent.GetBroadcast(this, 0, new Intent(Intents.LockDatabase), PendingIntentFlags.UpdateCurrent)); + return builder.Build(); } + private PendingIntent GetSwitchToAppPendingIntent() + { + var startKp2aIntent = new Intent(this, typeof(KeePass)); + startKp2aIntent.SetAction(Intent.ActionMain); + startKp2aIntent.AddCategory(Intent.CategoryLauncher); + + return PendingIntent.GetActivity(this, 0, startKp2aIntent, PendingIntentFlags.UpdateCurrent); + } + private static string GetDatabaseName() { var db = App.Kp2a.GetDb().KpDatabase; From 518479904aaeedb19d43f1caf89bba4d869e9290 Mon Sep 17 00:00:00 2001 From: AlexVallat Date: Sun, 4 Aug 2013 09:38:15 +0100 Subject: [PATCH 2/3] Remove debugging delay, ensure prompt GC of memory used when loading DB --- src/keepass2android/PasswordActivity.cs | 29 ++++++++++++++----------- 1 file changed, 16 insertions(+), 13 deletions(-) diff --git a/src/keepass2android/PasswordActivity.cs b/src/keepass2android/PasswordActivity.cs index 68ce21d8..774588b6 100644 --- a/src/keepass2android/PasswordActivity.cs +++ b/src/keepass2android/PasswordActivity.cs @@ -270,8 +270,7 @@ namespace keepass2android Window.SetSoftInputMode(SoftInput.StateVisible); Button confirmButton = (Button)FindViewById(Resource.Id.pass_ok); - confirmButton.Click += (sender, e) => - { + confirmButton.Click += (sender, e) => { String pass = GetEditText(Resource.Id.password); String key = GetEditText(Resource.Id.pass_keyfile); if (pass.Length == 0 && key.Length == 0) @@ -282,13 +281,12 @@ namespace keepass2android CheckBox cbQuickUnlock = (CheckBox)FindViewById(Resource.Id.enable_quickunlock); App.Kp2a.SetQuickUnlockEnabled(cbQuickUnlock.Checked); - + Handler handler = new Handler(); LoadDb task = new LoadDb(App.Kp2a, _ioConnection, _loadDbTask, pass, key, new AfterLoad(handler, this)); _loadDbTask = null; // prevent accidental re-use - - ProgressTask pt = new ProgressTask(App.Kp2a, this, task); - pt.Run(); + + new ProgressTask(App.Kp2a, this, task).Run(); }; /*CheckBox checkBox = (CheckBox) FindViewById(Resource.Id.show_password); @@ -396,13 +394,11 @@ namespace keepass2android capacity = (int)stream.Length; } memoryStream = new MemoryStream(capacity); - MemUtil.CopyStream(stream, memoryStream); + stream.CopyTo(memoryStream); stream.Close(); memoryStream.Seek(0, System.IO.SeekOrigin.Begin); } - System.Threading.Thread.Sleep(3000); - Kp2aLog.Log("Pre-loading database file completed"); return memoryStream; @@ -514,17 +510,24 @@ namespace keepass2android private class AfterLoad : OnFinish { readonly PasswordActivity _act; - public AfterLoad(Handler handler, PasswordActivity act):base(handler) { + + public AfterLoad(Handler handler, PasswordActivity act):base(handler) + { _act = act; } - + public override void Run() { - if ( Success ) { + if ( Success ) + { _act.SetEditText(Resource.Id.password, ""); _act.LaunchNextActivity(); - } else { + + GC.Collect(); // Ensure temporary memory used while loading is collected - it will contain sensitive data such as username and password, and also the large data of the encrypted database file + } + else + { DisplayMessage(_act); } } From b9aad79b62e634559cd5c9c952dcea9a8228e46f Mon Sep 17 00:00:00 2001 From: AlexVallat Date: Wed, 7 Aug 2013 18:34:43 +0100 Subject: [PATCH 3/3] Made pre-loading optional Refactoring of PasswordActivity/QuickUnlock lifecycle --- src/Kp2aBusinessLogic/database/Database.cs | 9 +- src/Kp2aBusinessLogic/database/edit/LoadDB.cs | 2 +- src/keepass2android/KeePass.cs | 9 +- src/keepass2android/PasswordActivity.cs | 71 +- src/keepass2android/QuickUnlock.cs | 20 +- .../Resources/Resource.designer.cs | 1052 +++++++++-------- .../Resources/values/config.xml | 3 + .../Resources/values/strings.xml | 7 +- .../Resources/xml/preferences.xml | 8 +- 9 files changed, 595 insertions(+), 586 deletions(-) diff --git a/src/Kp2aBusinessLogic/database/Database.cs b/src/Kp2aBusinessLogic/database/Database.cs index 7a0b249a..c0b7456f 100644 --- a/src/Kp2aBusinessLogic/database/Database.cs +++ b/src/Kp2aBusinessLogic/database/Database.cs @@ -109,7 +109,7 @@ namespace keepass2android var filename = fileStorage.GetFilenameWithoutPathAndExt(iocInfo); try { - pwDatabase.Open(databaseData, filename, iocInfo, compositeKey, status); + pwDatabase.Open(databaseData ?? fileStorage.OpenFileForRead(iocInfo), filename, iocInfo, compositeKey, status); } catch (Exception) { @@ -118,8 +118,11 @@ namespace keepass2android //if we don't get a password, we don't know whether this means "empty password" or "no password" //retry without password: compositeKey.RemoveUserKey(compositeKey.GetUserKey(typeof (KcpPassword))); - databaseData.Seek(0, SeekOrigin.Begin); - pwDatabase.Open(databaseData, filename, iocInfo, compositeKey, status); + if (databaseData != null) + { + databaseData.Seek(0, SeekOrigin.Begin); + } + pwDatabase.Open(databaseData ?? fileStorage.OpenFileForRead(iocInfo), filename, iocInfo, compositeKey, status); } else throw; } diff --git a/src/Kp2aBusinessLogic/database/edit/LoadDB.cs b/src/Kp2aBusinessLogic/database/edit/LoadDB.cs index 540853de..9e71164d 100644 --- a/src/Kp2aBusinessLogic/database/edit/LoadDB.cs +++ b/src/Kp2aBusinessLogic/database/edit/LoadDB.cs @@ -48,7 +48,7 @@ namespace keepass2android try { StatusLogger.UpdateMessage(UiStringKey.loading_database); - _app.LoadDatabase(_ioc, _databaseData.Result, _pass, _key, StatusLogger); + _app.LoadDatabase(_ioc, _databaseData == null ? null : _databaseData.Result, _pass, _key, StatusLogger); SaveFileData (_ioc, _key); } catch (KeyFileException) { diff --git a/src/keepass2android/KeePass.cs b/src/keepass2android/KeePass.cs index a6962594..74b2031c 100644 --- a/src/keepass2android/KeePass.cs +++ b/src/keepass2android/KeePass.cs @@ -37,12 +37,9 @@ namespace keepass2android public const Result ExitLock = Result.FirstUser+1; public const Result ExitRefresh = Result.FirstUser+2; public const Result ExitRefreshTitle = Result.FirstUser+3; - public const Result ExitForceLock = Result.FirstUser+4; - public const Result ExitQuickUnlock = Result.FirstUser+5; - public const Result ExitCloseAfterTaskComplete = Result.FirstUser+6; - public const Result ExitChangeDb = Result.FirstUser+7; - public const Result ExitForceLockAndChangeDb = Result.FirstUser+8; - public const Result ExitReloadDb = Result.FirstUser+9; + public const Result ExitCloseAfterTaskComplete = Result.FirstUser+4; + public const Result ExitChangeDb = Result.FirstUser+5; // NOTE: Nothing is currently using this, but in the future a "Change Database" menu option might. + public const Result ExitReloadDb = Result.FirstUser+6; AppTask _appTask; diff --git a/src/keepass2android/PasswordActivity.cs b/src/keepass2android/PasswordActivity.cs index 774588b6..6223bf7b 100644 --- a/src/keepass2android/PasswordActivity.cs +++ b/src/keepass2android/PasswordActivity.cs @@ -59,6 +59,8 @@ namespace keepass2android private bool _rememberKeyfile; ISharedPreferences _prefs; + private bool _started; + public PasswordActivity (IntPtr javaReference, JniHandleOwnership transfer) : base(javaReference, transfer) { @@ -138,27 +140,22 @@ namespace keepass2android //NOTE: original code from k eepassdroid used switch ((Android.App.Result)requestCode) { (but doesn't work here, although k eepassdroid works) switch(resultCode) { - + + case KeePass.ExitNormal: // Returned to this screen using the Back key, treat as locking the database + App.Kp2a.LockDatabase(); + break; case KeePass.ExitLock: // The database has already been locked, and the quick unlock screen will be shown if appropriate break; - case KeePass.ExitForceLock: - App.Kp2a.LockDatabase(false); - break; - case KeePass.ExitForceLockAndChangeDb: - case KeePass.ExitChangeDb: // What's the difference between this and ExitForceLockAndChangeDb? - case KeePass.ExitNormal: // Returned to this screen using the Back key, treat as exiting the database + case KeePass.ExitChangeDb: App.Kp2a.LockDatabase(false); Finish(); break; case KeePass.ExitCloseAfterTaskComplete: + // Do not lock the database SetResult(KeePass.ExitCloseAfterTaskComplete); Finish(); break; - case KeePass.ExitQuickUnlock: - App.Kp2a.UnlockDatabase(); - LaunchNextActivity(); - break; case KeePass.ExitReloadDb: //if the activity was killed, fill password/keyfile so the user can directly hit load again if (App.Kp2a.GetDb().Loaded) @@ -180,8 +177,9 @@ namespace keepass2android SetEditText(Resource.Id.pass_keyfile, kcpKeyfile.Path); } } + App.Kp2a.LockDatabase(false); break; - case Result.Ok: + case Result.Ok: // Key file browse dialog OK'ed. if (requestCode == Intents.RequestCodeFileBrowseForKeyfile) { string filename = Util.IntentToFilename(data); if (filename != null) { @@ -258,6 +256,13 @@ namespace keepass2android } } + if (App.Kp2a.GetDb().Loaded && App.Kp2a.GetDb().Ioc != null && + App.Kp2a.GetDb().Ioc.GetDisplayName() != _ioConnection.GetDisplayName()) + { + // A different database is currently loaded, unload it before loading the new one requested + App.Kp2a.LockDatabase(false); + } + AppTask = AppTask.GetTaskInOnCreate(savedInstanceState, Intent); SetContentView(Resource.Layout.password); @@ -363,19 +368,7 @@ namespace keepass2android protected override void OnStart() { base.OnStart(); - - if (App.Kp2a.QuickUnlockEnabled && App.Kp2a.QuickLocked) - { - Intent i = new Intent(this, typeof(QuickUnlock)); - PutIoConnectionToIntent(_ioConnection, i); - Kp2aLog.Log("Starting QuickUnlock"); - StartActivityForResult(i, 0); - } - else - { - // Create task to kick off file loading while the user enters the password - _loadDbTask = Task.Factory.StartNew(LoadDbFile); - } + _started = true; } private MemoryStream LoadDbFile() @@ -410,27 +403,33 @@ namespace keepass2android AppTask.ToBundle(outState); } - /* - protected override void OnResume() { + protected override void OnResume() + { base.OnResume(); - - if (_startedWithActivityResult) - return; - if (App.Kp2a.GetDb().Loaded && (App.Kp2a.GetDb().Ioc != null) - && (_ioConnection != null) && (App.Kp2a.GetDb().Ioc.GetDisplayName() == _ioConnection.GetDisplayName())) + // OnResume is run every time the activity comes to the foreground. This code should only run when the activity is started (OnStart), but must + // be run in OnResume rather than OnStart so that it always occurrs after OnActivityResult (when re-creating a killed activity, OnStart occurs before OnActivityResult) + if (_started) { - if (App.Kp2a.QuickLocked == false) + _started = false; + if (App.Kp2a.DatabaseIsUnlocked) { LaunchNextActivity(); } - else + else if (App.Kp2a.QuickUnlockEnabled && App.Kp2a.QuickLocked) { - TryStartQuickUnlock(); + var i = new Intent(this, typeof(QuickUnlock)); + PutIoConnectionToIntent(_ioConnection, i); + Kp2aLog.Log("Starting QuickUnlock"); + StartActivityForResult(i, 0); + } + else if (_loadDbTask == null && _prefs.GetBoolean(GetString(Resource.String.PreloadDatabaseEnabled_key), true)) + { + // Create task to kick off file loading while the user enters the password + _loadDbTask = Task.Factory.StartNew(LoadDbFile); } } } - * */ private void RetrieveSettings() { String defaultFilename = _prefs.GetString(KeyDefaultFilename, ""); diff --git a/src/keepass2android/QuickUnlock.cs b/src/keepass2android/QuickUnlock.cs index f516bc27..50b91bbd 100644 --- a/src/keepass2android/QuickUnlock.cs +++ b/src/keepass2android/QuickUnlock.cs @@ -72,8 +72,6 @@ namespace keepass2android keyboard.ShowSoftInput(pwd, 0); }, 50); - SetResult(KeePass.ExitChangeDb); - Button btnUnlock = (Button)FindViewById(Resource.Id.QuickUnlock_button); btnUnlock.Click += (object sender, EventArgs e) => { @@ -82,11 +80,11 @@ namespace keepass2android String expectedPasswordPart = password.Substring(Math.Max(0,password.Length-quickUnlockLength),Math.Min(password.Length, quickUnlockLength)); if (pwd.Text == expectedPasswordPart) { - SetResult(KeePass.ExitQuickUnlock); + App.Kp2a.UnlockDatabase(); } else { - SetResult(KeePass.ExitForceLock); + App.Kp2a.LockDatabase(false); Toast.MakeText(this, GetString(Resource.String.QuickUnlock_fail), ToastLength.Long).Show(); } Finish(); @@ -95,22 +93,10 @@ namespace keepass2android Button btnLock = (Button)FindViewById(Resource.Id.QuickUnlock_buttonLock); btnLock.Click += (object sender, EventArgs e) => { - SetResult(KeePass.ExitForceLockAndChangeDb); + App.Kp2a.LockDatabase(false); Finish(); }; } - - - protected override void OnResume() - { - base.OnResume(); - - if ( ! App.Kp2a.GetDb().Loaded ) { - SetResult(KeePass.ExitChangeDb); - Finish(); - return; - } - } } } diff --git a/src/keepass2android/Resources/Resource.designer.cs b/src/keepass2android/Resources/Resource.designer.cs index b85b70c9..7fa00129 100644 --- a/src/keepass2android/Resources/Resource.designer.cs +++ b/src/keepass2android/Resources/Resource.designer.cs @@ -84,6 +84,9 @@ namespace keepass2android // aapt resource value: 0x7f090008 public const int OpenKp2aKeyboardAutomatically_default = 2131296264; + // aapt resource value: 0x7f09000a + public const int PreloadDatabaseEnabled_default = 2131296266; + // aapt resource value: 0x7f090009 public const int ShowUnlockedNotification_default = 2131296265; @@ -1196,50 +1199,50 @@ namespace keepass2android public partial class String { - // aapt resource value: 0x7f080034 - public const int AboutText = 2131230772; + // aapt resource value: 0x7f080035 + public const int AboutText = 2131230773; - // aapt resource value: 0x7f080126 - public const int AddingEntry = 2131231014; + // aapt resource value: 0x7f080129 + public const int AddingEntry = 2131231017; - // aapt resource value: 0x7f080127 - public const int AddingGroup = 2131231015; - - // aapt resource value: 0x7f08011c - public const int AskDeletePermanentlyEntry = 2131231004; - - // aapt resource value: 0x7f08011d - public const int AskDeletePermanentlyGroup = 2131231005; - - // aapt resource value: 0x7f08011e - public const int AskDeletePermanently_title = 2131231006; - - // aapt resource value: 0x7f080121 - public const int AskDiscardChanges = 2131231009; - - // aapt resource value: 0x7f080122 - public const int AskDiscardChanges_title = 2131231010; - - // aapt resource value: 0x7f080116 - public const int AskOverwriteBinary = 2131230998; - - // aapt resource value: 0x7f080119 - public const int AskOverwriteBinary_no = 2131231001; - - // aapt resource value: 0x7f080117 - public const int AskOverwriteBinary_title = 2131230999; - - // aapt resource value: 0x7f080118 - public const int AskOverwriteBinary_yes = 2131231000; - - // aapt resource value: 0x7f080120 - public const int AskReloadFile = 2131231008; + // aapt resource value: 0x7f08012a + public const int AddingGroup = 2131231018; // aapt resource value: 0x7f08011f - public const int AskReloadFile_title = 2131231007; + public const int AskDeletePermanentlyEntry = 2131231007; + + // aapt resource value: 0x7f080120 + public const int AskDeletePermanentlyGroup = 2131231008; + + // aapt resource value: 0x7f080121 + public const int AskDeletePermanently_title = 2131231009; + + // aapt resource value: 0x7f080124 + public const int AskDiscardChanges = 2131231012; + + // aapt resource value: 0x7f080125 + public const int AskDiscardChanges_title = 2131231013; + + // aapt resource value: 0x7f080119 + public const int AskOverwriteBinary = 2131231001; + + // aapt resource value: 0x7f08011c + public const int AskOverwriteBinary_no = 2131231004; // aapt resource value: 0x7f08011a - public const int AttachFailed = 2131231002; + public const int AskOverwriteBinary_title = 2131231002; + + // aapt resource value: 0x7f08011b + public const int AskOverwriteBinary_yes = 2131231003; + + // aapt resource value: 0x7f080123 + public const int AskReloadFile = 2131231011; + + // aapt resource value: 0x7f080122 + public const int AskReloadFile_title = 2131231010; + + // aapt resource value: 0x7f08011d + public const int AttachFailed = 2131231005; // aapt resource value: 0x7f080021 public const int BinaryDirectory_default = 2131230753; @@ -1247,74 +1250,74 @@ namespace keepass2android // aapt resource value: 0x7f080020 public const int BinaryDirectory_key = 2131230752; - // aapt resource value: 0x7f0800f8 - public const int BinaryDirectory_summary = 2131230968; + // aapt resource value: 0x7f0800f9 + public const int BinaryDirectory_summary = 2131230969; - // aapt resource value: 0x7f0800f7 - public const int BinaryDirectory_title = 2131230967; + // aapt resource value: 0x7f0800f8 + public const int BinaryDirectory_title = 2131230968; + + // aapt resource value: 0x7f080140 + public const int ChangeLog = 2131231040; + + // aapt resource value: 0x7f08013f + public const int ChangeLog_0_7 = 2131231039; // aapt resource value: 0x7f08013d - public const int ChangeLog = 2131231037; + public const int ChangeLog_0_8 = 2131231037; // aapt resource value: 0x7f08013c - public const int ChangeLog_0_7 = 2131231036; - - // aapt resource value: 0x7f08013a - public const int ChangeLog_0_8 = 2131231034; - - // aapt resource value: 0x7f080139 - public const int ChangeLog_0_8_1 = 2131231033; - - // aapt resource value: 0x7f080138 - public const int ChangeLog_0_8_2 = 2131231032; - - // aapt resource value: 0x7f080137 - public const int ChangeLog_0_8_3 = 2131231031; - - // aapt resource value: 0x7f080136 - public const int ChangeLog_0_8_4 = 2131231030; + public const int ChangeLog_0_8_1 = 2131231036; // aapt resource value: 0x7f08013b - public const int ChangeLog_keptDonate = 2131231035; + public const int ChangeLog_0_8_2 = 2131231035; - // aapt resource value: 0x7f080135 - public const int ChangeLog_title = 2131231029; + // aapt resource value: 0x7f08013a + public const int ChangeLog_0_8_3 = 2131231034; + + // aapt resource value: 0x7f080139 + public const int ChangeLog_0_8_4 = 2131231033; + + // aapt resource value: 0x7f08013e + public const int ChangeLog_keptDonate = 2131231038; + + // aapt resource value: 0x7f080138 + public const int ChangeLog_title = 2131231032; // aapt resource value: 0x7f080028 public const int CheckForFileChangesOnSave_key = 2131230760; + // aapt resource value: 0x7f08010e + public const int CheckForFileChangesOnSave_summary = 2131230990; + // aapt resource value: 0x7f08010d - public const int CheckForFileChangesOnSave_summary = 2131230989; + public const int CheckForFileChangesOnSave_title = 2131230989; - // aapt resource value: 0x7f08010c - public const int CheckForFileChangesOnSave_title = 2131230988; + // aapt resource value: 0x7f080132 + public const int CheckingTargetFileForChanges = 2131231026; - // aapt resource value: 0x7f08012f - public const int CheckingTargetFileForChanges = 2131231023; - - // aapt resource value: 0x7f080049 - public const int ClearClipboard = 2131230793; + // aapt resource value: 0x7f08004a + public const int ClearClipboard = 2131230794; // aapt resource value: 0x7f08002c public const int CopyToClipboardNotification_key = 2131230764; - // aapt resource value: 0x7f080035 - public const int CreditsText = 2131230773; + // aapt resource value: 0x7f080036 + public const int CreditsText = 2131230774; - // aapt resource value: 0x7f08012d - public const int DecodingDatabase = 2131231021; + // aapt resource value: 0x7f080130 + public const int DecodingDatabase = 2131231024; - // aapt resource value: 0x7f080128 - public const int DeletingEntry = 2131231016; + // aapt resource value: 0x7f08012b + public const int DeletingEntry = 2131231019; - // aapt resource value: 0x7f080129 - public const int DeletingGroup = 2131231017; + // aapt resource value: 0x7f08012c + public const int DeletingGroup = 2131231020; - // aapt resource value: 0x7f080082 - public const int FileNotFound = 2131230850; + // aapt resource value: 0x7f080083 + public const int FileNotFound = 2131230851; - // aapt resource value: 0x7f080095 - public const int InvalidPassword = 2131230869; + // aapt resource value: 0x7f080096 + public const int InvalidPassword = 2131230870; // aapt resource value: 0x7f080026 public const int LastInfoVersionCode_key = 2131230758; @@ -1322,35 +1325,44 @@ namespace keepass2android // aapt resource value: 0x7f080029 public const int MarketURL = 2131230761; - // aapt resource value: 0x7f08009f - public const int MaskedPassword = 2131230879; - - // aapt resource value: 0x7f080131 - public const int MessageSyncQuestion = 2131231025; + // aapt resource value: 0x7f0800a0 + public const int MaskedPassword = 2131230880; // aapt resource value: 0x7f080134 - public const int NoOverwrite = 2131231028; + public const int MessageSyncQuestion = 2131231028; + + // aapt resource value: 0x7f080137 + public const int NoOverwrite = 2131231031; // aapt resource value: 0x7f08002e public const int OpenKp2aKeyboardAutomatically_key = 2131230766; + // aapt resource value: 0x7f080114 + public const int OpenKp2aKeyboardAutomatically_summary = 2131230996; + // aapt resource value: 0x7f080113 - public const int OpenKp2aKeyboardAutomatically_summary = 2131230995; + public const int OpenKp2aKeyboardAutomatically_title = 2131230995; - // aapt resource value: 0x7f080112 - public const int OpenKp2aKeyboardAutomatically_title = 2131230994; + // aapt resource value: 0x7f080131 + public const int ParsingDatabase = 2131231025; - // aapt resource value: 0x7f08012e - public const int ParsingDatabase = 2131231022; + // aapt resource value: 0x7f080032 + public const int PreloadDatabaseEnabled_key = 2131230770; + + // aapt resource value: 0x7f080118 + public const int PreloadDatabaseEnabled_summary = 2131231000; + + // aapt resource value: 0x7f080117 + public const int PreloadDatabaseEnabled_title = 2131230999; // aapt resource value: 0x7f080022 public const int QuickUnlockDefaultEnabled_key = 2131230754; - // aapt resource value: 0x7f0800f3 - public const int QuickUnlockDefaultEnabled_summary = 2131230963; + // aapt resource value: 0x7f0800f4 + public const int QuickUnlockDefaultEnabled_summary = 2131230964; - // aapt resource value: 0x7f0800f2 - public const int QuickUnlockDefaultEnabled_title = 2131230962; + // aapt resource value: 0x7f0800f3 + public const int QuickUnlockDefaultEnabled_title = 2131230963; // aapt resource value: 0x7f080024 public const int QuickUnlockLength_default = 2131230756; @@ -1358,104 +1370,104 @@ namespace keepass2android // aapt resource value: 0x7f080023 public const int QuickUnlockLength_key = 2131230755; - // aapt resource value: 0x7f0800f5 - public const int QuickUnlockLength_summary = 2131230965; - - // aapt resource value: 0x7f0800f4 - public const int QuickUnlockLength_title = 2131230964; - - // aapt resource value: 0x7f0800f0 - public const int QuickUnlock_button = 2131230960; - // aapt resource value: 0x7f0800f6 - public const int QuickUnlock_fail = 2131230966; + public const int QuickUnlockLength_summary = 2131230966; - // aapt resource value: 0x7f0800ef - public const int QuickUnlock_label = 2131230959; + // aapt resource value: 0x7f0800f5 + public const int QuickUnlockLength_title = 2131230965; // aapt resource value: 0x7f0800f1 - public const int QuickUnlock_lockButton = 2131230961; + public const int QuickUnlock_button = 2131230961; - // aapt resource value: 0x7f08011b - public const int RecycleBin = 2131231003; + // aapt resource value: 0x7f0800f7 + public const int QuickUnlock_fail = 2131230967; - // aapt resource value: 0x7f0800fc - public const int SaveAttachmentDialog_open = 2131230972; + // aapt resource value: 0x7f0800f0 + public const int QuickUnlock_label = 2131230960; - // aapt resource value: 0x7f0800fb - public const int SaveAttachmentDialog_save = 2131230971; + // aapt resource value: 0x7f0800f2 + public const int QuickUnlock_lockButton = 2131230962; - // aapt resource value: 0x7f0800fa - public const int SaveAttachmentDialog_text = 2131230970; - - // aapt resource value: 0x7f0800f9 - public const int SaveAttachmentDialog_title = 2131230969; - - // aapt resource value: 0x7f0800fe - public const int SaveAttachment_Failed = 2131230974; + // aapt resource value: 0x7f08011e + public const int RecycleBin = 2131231006; // aapt resource value: 0x7f0800fd - public const int SaveAttachment_doneMessage = 2131230973; + public const int SaveAttachmentDialog_open = 2131230973; - // aapt resource value: 0x7f08012a - public const int SettingPassword = 2131231018; + // aapt resource value: 0x7f0800fc + public const int SaveAttachmentDialog_save = 2131230972; - // aapt resource value: 0x7f08010f - public const int ShowCopyToClipboardNotification_summary = 2131230991; + // aapt resource value: 0x7f0800fb + public const int SaveAttachmentDialog_text = 2131230971; - // aapt resource value: 0x7f08010e - public const int ShowCopyToClipboardNotification_title = 2131230990; + // aapt resource value: 0x7f0800fa + public const int SaveAttachmentDialog_title = 2131230970; - // aapt resource value: 0x7f080111 - public const int ShowKp2aKeyboardNotification_summary = 2131230993; + // aapt resource value: 0x7f0800ff + public const int SaveAttachment_Failed = 2131230975; + + // aapt resource value: 0x7f0800fe + public const int SaveAttachment_doneMessage = 2131230974; + + // aapt resource value: 0x7f08012d + public const int SettingPassword = 2131231021; // aapt resource value: 0x7f080110 - public const int ShowKp2aKeyboardNotification_title = 2131230992; + public const int ShowCopyToClipboardNotification_summary = 2131230992; + + // aapt resource value: 0x7f08010f + public const int ShowCopyToClipboardNotification_title = 2131230991; + + // aapt resource value: 0x7f080112 + public const int ShowKp2aKeyboardNotification_summary = 2131230994; + + // aapt resource value: 0x7f080111 + public const int ShowKp2aKeyboardNotification_title = 2131230993; // aapt resource value: 0x7f080031 public const int ShowUnlockedNotification_key = 2131230769; - // aapt resource value: 0x7f080115 - public const int ShowUnlockedNotification_summary = 2131230997; + // aapt resource value: 0x7f080116 + public const int ShowUnlockedNotification_summary = 2131230998; - // aapt resource value: 0x7f080114 - public const int ShowUnlockedNotification_title = 2131230996; + // aapt resource value: 0x7f080115 + public const int ShowUnlockedNotification_title = 2131230997; // aapt resource value: 0x7f08001d public const int ShowUsernameInList_key = 2131230749; - // aapt resource value: 0x7f0800e3 - public const int ShowUsernameInList_summary = 2131230947; + // aapt resource value: 0x7f0800e4 + public const int ShowUsernameInList_summary = 2131230948; - // aapt resource value: 0x7f0800e2 - public const int ShowUsernameInList_title = 2131230946; + // aapt resource value: 0x7f0800e3 + public const int ShowUsernameInList_title = 2131230947; // aapt resource value: 0x7f08002a public const int SuggestionsURL = 2131230762; - // aapt resource value: 0x7f080132 - public const int SynchronizingDatabase = 2131231026; + // aapt resource value: 0x7f080135 + public const int SynchronizingDatabase = 2131231029; // aapt resource value: 0x7f08001c public const int TanExpiresOnUse_key = 2131230748; + // aapt resource value: 0x7f0800e2 + public const int TanExpiresOnUse_summary = 2131230946; + // aapt resource value: 0x7f0800e1 - public const int TanExpiresOnUse_summary = 2131230945; + public const int TanExpiresOnUse_title = 2131230945; - // aapt resource value: 0x7f0800e0 - public const int TanExpiresOnUse_title = 2131230944; + // aapt resource value: 0x7f080133 + public const int TitleSyncQuestion = 2131231027; - // aapt resource value: 0x7f080130 - public const int TitleSyncQuestion = 2131231024; - - // aapt resource value: 0x7f08012c - public const int TransformingKey = 2131231020; + // aapt resource value: 0x7f08012f + public const int TransformingKey = 2131231023; // aapt resource value: 0x7f08002b public const int TranslationURL = 2131230763; - // aapt resource value: 0x7f08012b - public const int UndoingChanges = 2131231019; + // aapt resource value: 0x7f08012e + public const int UndoingChanges = 2131231022; // aapt resource value: 0x7f080025 public const int UsageCount_key = 2131230757; @@ -1463,50 +1475,50 @@ namespace keepass2android // aapt resource value: 0x7f080027 public const int UseFileTransactions_key = 2131230759; - // aapt resource value: 0x7f08010b - public const int UseFileTransactions_summary = 2131230987; + // aapt resource value: 0x7f08010c + public const int UseFileTransactions_summary = 2131230988; - // aapt resource value: 0x7f08010a - public const int UseFileTransactions_title = 2131230986; + // aapt resource value: 0x7f08010b + public const int UseFileTransactions_title = 2131230987; // aapt resource value: 0x7f08002d public const int UseKp2aKeyboard_key = 2131230765; - // aapt resource value: 0x7f080133 - public const int YesSynchronize = 2131231027; - - // aapt resource value: 0x7f080032 - public const int about_feedback = 2131230770; + // aapt resource value: 0x7f080136 + public const int YesSynchronize = 2131231030; // aapt resource value: 0x7f080033 - public const int about_homepage = 2131230771; + public const int about_feedback = 2131230771; - // aapt resource value: 0x7f080036 - public const int accept = 2131230774; - - // aapt resource value: 0x7f080104 - public const int add_binary = 2131230980; + // aapt resource value: 0x7f080034 + public const int about_homepage = 2131230772; // aapt resource value: 0x7f080037 - public const int add_entry = 2131230775; + public const int accept = 2131230775; // aapt resource value: 0x7f080105 - public const int add_extra_string = 2131230981; - - // aapt resource value: 0x7f080039 - public const int add_group = 2131230777; - - // aapt resource value: 0x7f08003a - public const int add_group_title = 2131230778; + public const int add_binary = 2131230981; // aapt resource value: 0x7f080038 - public const int add_url_entry = 2131230776; + public const int add_entry = 2131230776; + + // aapt resource value: 0x7f080106 + public const int add_extra_string = 2131230982; + + // aapt resource value: 0x7f08003a + public const int add_group = 2131230778; // aapt resource value: 0x7f08003b - public const int algorithm = 2131230779; + public const int add_group_title = 2131230779; + + // aapt resource value: 0x7f080039 + public const int add_url_entry = 2131230777; // aapt resource value: 0x7f08003c - public const int algorithm_colon = 2131230780; + public const int algorithm = 2131230780; + + // aapt resource value: 0x7f08003d + public const int algorithm_colon = 2131230781; // aapt resource value: 0x7f080011 public const int algorithm_key = 2131230737; @@ -1514,50 +1526,50 @@ namespace keepass2android // aapt resource value: 0x7f080012 public const int app_key = 2131230738; - // aapt resource value: 0x7f08003d - public const int app_name = 2131230781; + // aapt resource value: 0x7f08003e + public const int app_name = 2131230782; - // aapt resource value: 0x7f08003f - public const int app_name_nonet = 2131230783; + // aapt resource value: 0x7f080040 + public const int app_name_nonet = 2131230784; - // aapt resource value: 0x7f080041 - public const int app_timeout = 2131230785; + // aapt resource value: 0x7f080042 + public const int app_timeout = 2131230786; // aapt resource value: 0x7f080013 public const int app_timeout_key = 2131230739; - // aapt resource value: 0x7f080042 - public const int app_timeout_summary = 2131230786; - // aapt resource value: 0x7f080043 - public const int application = 2131230787; + public const int app_timeout_summary = 2131230787; // aapt resource value: 0x7f080044 - public const int application_settings = 2131230788; - - // aapt resource value: 0x7f08004e - public const int available_through_keyboard = 2131230798; + public const int application = 2131230788; // aapt resource value: 0x7f080045 - public const int brackets = 2131230789; + public const int application_settings = 2131230789; + + // aapt resource value: 0x7f08004f + public const int available_through_keyboard = 2131230799; // aapt resource value: 0x7f080046 - public const int browser_intall_text = 2131230790; + public const int brackets = 2131230790; // aapt resource value: 0x7f080047 - public const int building_search_idx = 2131230791; + public const int browser_intall_text = 2131230791; // aapt resource value: 0x7f080048 - public const int cancel = 2131230792; + public const int building_search_idx = 2131230792; - // aapt resource value: 0x7f0800e7 - public const int caseSensitive = 2131230951; + // aapt resource value: 0x7f080049 + public const int cancel = 2131230793; + + // aapt resource value: 0x7f0800e8 + public const int caseSensitive = 2131230952; // aapt resource value: 0x7f080002 public const int change_entry = 2131230722; - // aapt resource value: 0x7f08004a - public const int clipboard_timeout = 2131230794; + // aapt resource value: 0x7f08004b + public const int clipboard_timeout = 2131230795; // aapt resource value: 0x7f08002f public const int clipboard_timeout_default = 2131230767; @@ -1565,38 +1577,38 @@ namespace keepass2android // aapt resource value: 0x7f080014 public const int clipboard_timeout_key = 2131230740; - // aapt resource value: 0x7f08004b - public const int clipboard_timeout_summary = 2131230795; + // aapt resource value: 0x7f08004c + public const int clipboard_timeout_summary = 2131230796; + + // aapt resource value: 0x7f08004e + public const int copy_password = 2131230798; // aapt resource value: 0x7f08004d - public const int copy_password = 2131230797; - - // aapt resource value: 0x7f08004c - public const int copy_username = 2131230796; - - // aapt resource value: 0x7f080051 - public const int creating_db_key = 2131230801; - - // aapt resource value: 0x7f080109 - public const int credentials_dialog_title = 2131230985; + public const int copy_username = 2131230797; // aapt resource value: 0x7f080052 - public const int current_group = 2131230802; + public const int creating_db_key = 2131230802; + + // aapt resource value: 0x7f08010a + public const int credentials_dialog_title = 2131230986; // aapt resource value: 0x7f080053 - public const int current_group_root = 2131230803; + public const int current_group = 2131230803; // aapt resource value: 0x7f080054 - public const int database = 2131230804; + public const int current_group_root = 2131230804; - // aapt resource value: 0x7f080107 - public const int database_loaded_quickunlock_enabled = 2131230983; + // aapt resource value: 0x7f080055 + public const int database = 2131230805; // aapt resource value: 0x7f080108 - public const int database_loaded_unlocked = 2131230984; + public const int database_loaded_quickunlock_enabled = 2131230984; - // aapt resource value: 0x7f0800ca - public const int database_name = 2131230922; + // aapt resource value: 0x7f080109 + public const int database_loaded_unlocked = 2131230985; + + // aapt resource value: 0x7f0800cb + public const int database_name = 2131230923; // aapt resource value: 0x7f08001f public const int database_name_key = 2131230751; @@ -1604,227 +1616,227 @@ namespace keepass2android // aapt resource value: 0x7f080015 public const int db_key = 2131230741; - // aapt resource value: 0x7f080055 - public const int decrypting_db = 2131230805; - // aapt resource value: 0x7f080056 - public const int decrypting_entry = 2131230806; + public const int decrypting_db = 2131230806; // aapt resource value: 0x7f080057 - public const int default_checkbox = 2131230807; + public const int decrypting_entry = 2131230807; + + // aapt resource value: 0x7f080058 + public const int default_checkbox = 2131230808; // aapt resource value: 0x7f08000a public const int default_file_path = 2131230730; - // aapt resource value: 0x7f0800cb - public const int default_username = 2131230923; + // aapt resource value: 0x7f0800cc + public const int default_username = 2131230924; // aapt resource value: 0x7f08001e public const int default_username_key = 2131230750; - // aapt resource value: 0x7f080106 - public const int delete_extra_string = 2131230982; - - // aapt resource value: 0x7f080058 - public const int digits = 2131230808; + // aapt resource value: 0x7f080107 + public const int delete_extra_string = 2131230983; // aapt resource value: 0x7f080059 - public const int disclaimer_formal = 2131230809; + public const int digits = 2131230809; + + // aapt resource value: 0x7f08005a + public const int disclaimer_formal = 2131230810; // aapt resource value: 0x7f08000b public const int donate_url = 2131230731; - // aapt resource value: 0x7f08005a - public const int ellipsis = 2131230810; - - // aapt resource value: 0x7f0800ee - public const int enable_quickunlock = 2131230958; - // aapt resource value: 0x7f08005b - public const int enter_filename = 2131230811; + public const int ellipsis = 2131230811; - // aapt resource value: 0x7f0800ed - public const int enter_filename_details_create_import = 2131230957; - - // aapt resource value: 0x7f0800ec - public const int enter_filename_details_url = 2131230956; + // aapt resource value: 0x7f0800ef + public const int enable_quickunlock = 2131230959; // aapt resource value: 0x7f08005c - public const int entry_accessed = 2131230812; + public const int enter_filename = 2131230812; + + // aapt resource value: 0x7f0800ee + public const int enter_filename_details_create_import = 2131230958; + + // aapt resource value: 0x7f0800ed + public const int enter_filename_details_url = 2131230957; // aapt resource value: 0x7f08005d - public const int entry_and_or = 2131230813; - - // aapt resource value: 0x7f08006d - public const int entry_binaries = 2131230829; + public const int entry_accessed = 2131230813; // aapt resource value: 0x7f08005e - public const int entry_cancel = 2131230814; - - // aapt resource value: 0x7f08005f - public const int entry_comment = 2131230815; - - // aapt resource value: 0x7f080062 - public const int entry_confpassword = 2131230818; - - // aapt resource value: 0x7f080063 - public const int entry_created = 2131230819; - - // aapt resource value: 0x7f080064 - public const int entry_expires = 2131230820; - - // aapt resource value: 0x7f08006c - public const int entry_extra_strings = 2131230828; - - // aapt resource value: 0x7f080065 - public const int entry_keyfile = 2131230821; - - // aapt resource value: 0x7f080066 - public const int entry_modified = 2131230822; - - // aapt resource value: 0x7f080061 - public const int entry_override_url = 2131230817; - - // aapt resource value: 0x7f080067 - public const int entry_password = 2131230823; - - // aapt resource value: 0x7f080068 - public const int entry_save = 2131230824; - - // aapt resource value: 0x7f080060 - public const int entry_tags = 2131230816; - - // aapt resource value: 0x7f080069 - public const int entry_title = 2131230825; - - // aapt resource value: 0x7f08006a - public const int entry_url = 2131230826; - - // aapt resource value: 0x7f08006b - public const int entry_user_name = 2131230827; + public const int entry_and_or = 2131230814; // aapt resource value: 0x7f08006e - public const int error_arc4 = 2131230830; + public const int entry_binaries = 2131230830; + + // aapt resource value: 0x7f08005f + public const int entry_cancel = 2131230815; + + // aapt resource value: 0x7f080060 + public const int entry_comment = 2131230816; + + // aapt resource value: 0x7f080063 + public const int entry_confpassword = 2131230819; + + // aapt resource value: 0x7f080064 + public const int entry_created = 2131230820; + + // aapt resource value: 0x7f080065 + public const int entry_expires = 2131230821; + + // aapt resource value: 0x7f08006d + public const int entry_extra_strings = 2131230829; + + // aapt resource value: 0x7f080066 + public const int entry_keyfile = 2131230822; + + // aapt resource value: 0x7f080067 + public const int entry_modified = 2131230823; + + // aapt resource value: 0x7f080062 + public const int entry_override_url = 2131230818; + + // aapt resource value: 0x7f080068 + public const int entry_password = 2131230824; + + // aapt resource value: 0x7f080069 + public const int entry_save = 2131230825; + + // aapt resource value: 0x7f080061 + public const int entry_tags = 2131230817; + + // aapt resource value: 0x7f08006a + public const int entry_title = 2131230826; + + // aapt resource value: 0x7f08006b + public const int entry_url = 2131230827; + + // aapt resource value: 0x7f08006c + public const int entry_user_name = 2131230828; // aapt resource value: 0x7f08006f - public const int error_can_not_handle_uri = 2131230831; + public const int error_arc4 = 2131230831; // aapt resource value: 0x7f080070 - public const int error_could_not_create_group = 2131230832; + public const int error_can_not_handle_uri = 2131230832; // aapt resource value: 0x7f080071 - public const int error_could_not_create_parent = 2131230833; + public const int error_could_not_create_group = 2131230833; // aapt resource value: 0x7f080072 - public const int error_database_exists = 2131230834; + public const int error_could_not_create_parent = 2131230834; // aapt resource value: 0x7f080073 - public const int error_database_settings = 2131230835; + public const int error_database_exists = 2131230835; // aapt resource value: 0x7f080074 - public const int error_failed_to_launch_link = 2131230836; - - // aapt resource value: 0x7f080076 - public const int error_file_not_create = 2131230838; + public const int error_database_settings = 2131230836; // aapt resource value: 0x7f080075 - public const int error_filename_required = 2131230837; + public const int error_failed_to_launch_link = 2131230837; // aapt resource value: 0x7f080077 - public const int error_invalid_db = 2131230839; + public const int error_file_not_create = 2131230839; - // aapt resource value: 0x7f0800ff - public const int error_invalid_expiry_date = 2131230975; + // aapt resource value: 0x7f080076 + public const int error_filename_required = 2131230838; // aapt resource value: 0x7f080078 - public const int error_invalid_path = 2131230840; - - // aapt resource value: 0x7f080079 - public const int error_no_name = 2131230841; - - // aapt resource value: 0x7f08007a - public const int error_nopass = 2131230842; - - // aapt resource value: 0x7f08007b - public const int error_out_of_memory = 2131230843; - - // aapt resource value: 0x7f08007c - public const int error_pass_gen_type = 2131230844; - - // aapt resource value: 0x7f08007d - public const int error_pass_match = 2131230845; - - // aapt resource value: 0x7f08007e - public const int error_rounds_not_number = 2131230846; - - // aapt resource value: 0x7f08007f - public const int error_rounds_too_large = 2131230847; + public const int error_invalid_db = 2131230840; // aapt resource value: 0x7f080100 - public const int error_string_key = 2131230976; + public const int error_invalid_expiry_date = 2131230976; + + // aapt resource value: 0x7f080079 + public const int error_invalid_path = 2131230841; + + // aapt resource value: 0x7f08007a + public const int error_no_name = 2131230842; + + // aapt resource value: 0x7f08007b + public const int error_nopass = 2131230843; + + // aapt resource value: 0x7f08007c + public const int error_out_of_memory = 2131230844; + + // aapt resource value: 0x7f08007d + public const int error_pass_gen_type = 2131230845; + + // aapt resource value: 0x7f08007e + public const int error_pass_match = 2131230846; + + // aapt resource value: 0x7f08007f + public const int error_rounds_not_number = 2131230847; // aapt resource value: 0x7f080080 - public const int error_title_required = 2131230848; - - // aapt resource value: 0x7f080081 - public const int error_wrong_length = 2131230849; - - // aapt resource value: 0x7f0800e5 - public const int excludeExpiredEntries = 2131230949; + public const int error_rounds_too_large = 2131230848; // aapt resource value: 0x7f080101 - public const int field_name = 2131230977; + public const int error_string_key = 2131230977; + + // aapt resource value: 0x7f080081 + public const int error_title_required = 2131230849; + + // aapt resource value: 0x7f080082 + public const int error_wrong_length = 2131230850; + + // aapt resource value: 0x7f0800e6 + public const int excludeExpiredEntries = 2131230950; // aapt resource value: 0x7f080102 - public const int field_value = 2131230978; + public const int field_name = 2131230978; - // aapt resource value: 0x7f080083 - public const int file_browser = 2131230851; + // aapt resource value: 0x7f080103 + public const int field_value = 2131230979; // aapt resource value: 0x7f080084 - public const int generate_password = 2131230852; + public const int file_browser = 2131230852; // aapt resource value: 0x7f080085 - public const int group = 2131230853; + public const int generate_password = 2131230853; // aapt resource value: 0x7f080086 - public const int hint_comment = 2131230854; + public const int group = 2131230854; // aapt resource value: 0x7f080087 - public const int hint_conf_pass = 2131230855; + public const int hint_comment = 2131230855; // aapt resource value: 0x7f080088 - public const int hint_generated_password = 2131230856; + public const int hint_conf_pass = 2131230856; // aapt resource value: 0x7f080089 - public const int hint_group_name = 2131230857; + public const int hint_generated_password = 2131230857; // aapt resource value: 0x7f08008a - public const int hint_keyfile = 2131230858; + public const int hint_group_name = 2131230858; // aapt resource value: 0x7f08008b - public const int hint_length = 2131230859; - - // aapt resource value: 0x7f08008d - public const int hint_login_pass = 2131230861; - - // aapt resource value: 0x7f080090 - public const int hint_override_url = 2131230864; + public const int hint_keyfile = 2131230859; // aapt resource value: 0x7f08008c - public const int hint_pass = 2131230860; - - // aapt resource value: 0x7f080091 - public const int hint_tags = 2131230865; + public const int hint_length = 2131230860; // aapt resource value: 0x7f08008e - public const int hint_title = 2131230862; + public const int hint_login_pass = 2131230862; - // aapt resource value: 0x7f08008f - public const int hint_url = 2131230863; + // aapt resource value: 0x7f080091 + public const int hint_override_url = 2131230865; + + // aapt resource value: 0x7f08008d + public const int hint_pass = 2131230861; // aapt resource value: 0x7f080092 - public const int hint_username = 2131230866; + public const int hint_tags = 2131230866; + + // aapt resource value: 0x7f08008f + public const int hint_title = 2131230863; + + // aapt resource value: 0x7f080090 + public const int hint_url = 2131230864; + + // aapt resource value: 0x7f080093 + public const int hint_username = 2131230867; // aapt resource value: 0x7f08000c public const int homepage = 2131230732; @@ -1835,32 +1847,32 @@ namespace keepass2android // aapt resource value: 0x7f080000 public const int ime_name = 2131230720; - // aapt resource value: 0x7f080093 - public const int install_from_market = 2131230867; - // aapt resource value: 0x7f080094 - public const int install_from_website = 2131230868; + public const int install_from_market = 2131230868; - // aapt resource value: 0x7f080096 - public const int invalid_algorithm = 2131230870; + // aapt resource value: 0x7f080095 + public const int install_from_website = 2131230869; // aapt resource value: 0x7f080097 - public const int invalid_db_sig = 2131230871; + public const int invalid_algorithm = 2131230871; + + // aapt resource value: 0x7f080098 + public const int invalid_db_sig = 2131230872; // aapt resource value: 0x7f08000e public const int issues = 2131230734; - // aapt resource value: 0x7f080098 - public const int keyfile_does_not_exist = 2131230872; - // aapt resource value: 0x7f080099 - public const int keyfile_is_empty = 2131230873; + public const int keyfile_does_not_exist = 2131230873; + + // aapt resource value: 0x7f08009a + public const int keyfile_is_empty = 2131230874; // aapt resource value: 0x7f080017 public const int keyfile_key = 2131230743; - // aapt resource value: 0x7f0800e4 - public const int kp2a_findUrl = 2131230948; + // aapt resource value: 0x7f0800e5 + public const int kp2a_findUrl = 2131230949; // aapt resource value: 0x7f080005 public const int label_go_key = 2131230725; @@ -1874,8 +1886,8 @@ namespace keepass2android // aapt resource value: 0x7f080008 public const int label_subtype_generic = 2131230728; - // aapt resource value: 0x7f08009a - public const int length = 2131230874; + // aapt resource value: 0x7f08009b + public const int length = 2131230875; // aapt resource value: 0x7f080009 public const int library_name = 2131230729; @@ -1886,101 +1898,101 @@ namespace keepass2android // aapt resource value: 0x7f08001a public const int list_size_key = 2131230746; - // aapt resource value: 0x7f08009c - public const int list_size_summary = 2131230876; - - // aapt resource value: 0x7f08009b - public const int list_size_title = 2131230875; - // aapt resource value: 0x7f08009d - public const int loading_database = 2131230877; + public const int list_size_summary = 2131230877; + + // aapt resource value: 0x7f08009c + public const int list_size_title = 2131230876; // aapt resource value: 0x7f08009e - public const int lowercase = 2131230878; + public const int loading_database = 2131230878; + + // aapt resource value: 0x7f08009f + public const int lowercase = 2131230879; // aapt resource value: 0x7f080018 public const int maskpass_key = 2131230744; - // aapt resource value: 0x7f0800a1 - public const int maskpass_summary = 2131230881; - - // aapt resource value: 0x7f0800a0 - public const int maskpass_title = 2131230880; - // aapt resource value: 0x7f0800a2 - public const int menu_about = 2131230882; + public const int maskpass_summary = 2131230882; - // aapt resource value: 0x7f0800a7 - public const int menu_app_settings = 2131230887; + // aapt resource value: 0x7f0800a1 + public const int maskpass_title = 2131230881; // aapt resource value: 0x7f0800a3 - public const int menu_change_key = 2131230883; - - // aapt resource value: 0x7f0800a4 - public const int menu_copy_pass = 2131230884; - - // aapt resource value: 0x7f0800a5 - public const int menu_copy_user = 2131230885; - - // aapt resource value: 0x7f0800a6 - public const int menu_create = 2131230886; + public const int menu_about = 2131230883; // aapt resource value: 0x7f0800a8 - public const int menu_db_settings = 2131230888; + public const int menu_app_settings = 2131230888; + + // aapt resource value: 0x7f0800a4 + public const int menu_change_key = 2131230884; + + // aapt resource value: 0x7f0800a5 + public const int menu_copy_pass = 2131230885; + + // aapt resource value: 0x7f0800a6 + public const int menu_copy_user = 2131230886; + + // aapt resource value: 0x7f0800a7 + public const int menu_create = 2131230887; // aapt resource value: 0x7f0800a9 - public const int menu_delete = 2131230889; + public const int menu_db_settings = 2131230889; // aapt resource value: 0x7f0800aa - public const int menu_donate = 2131230890; + public const int menu_delete = 2131230890; // aapt resource value: 0x7f0800ab - public const int menu_edit = 2131230891; + public const int menu_donate = 2131230891; // aapt resource value: 0x7f0800ac - public const int menu_hide_password = 2131230892; + public const int menu_edit = 2131230892; // aapt resource value: 0x7f0800ad - public const int menu_homepage = 2131230893; + public const int menu_hide_password = 2131230893; // aapt resource value: 0x7f0800ae - public const int menu_lock = 2131230894; + public const int menu_homepage = 2131230894; // aapt resource value: 0x7f0800af - public const int menu_open = 2131230895; + public const int menu_lock = 2131230895; // aapt resource value: 0x7f0800b0 - public const int menu_rename = 2131230896; + public const int menu_open = 2131230896; // aapt resource value: 0x7f0800b1 - public const int menu_search = 2131230897; + public const int menu_rename = 2131230897; // aapt resource value: 0x7f0800b2 - public const int menu_search_advanced = 2131230898; + public const int menu_search = 2131230898; // aapt resource value: 0x7f0800b3 - public const int menu_url = 2131230899; + public const int menu_search_advanced = 2131230899; // aapt resource value: 0x7f0800b4 - public const int minus = 2131230900; + public const int menu_url = 2131230900; // aapt resource value: 0x7f0800b5 - public const int never = 2131230901; + public const int minus = 2131230901; - // aapt resource value: 0x7f0800b7 - public const int no = 2131230903; + // aapt resource value: 0x7f0800b6 + public const int never = 2131230902; // aapt resource value: 0x7f0800b8 - public const int no_keys = 2131230904; + public const int no = 2131230904; // aapt resource value: 0x7f0800b9 - public const int no_results = 2131230905; + public const int no_keys = 2131230905; // aapt resource value: 0x7f0800ba - public const int no_url_handler = 2131230906; + public const int no_results = 2131230906; - // aapt resource value: 0x7f08004f - public const int not_possible_im_picker = 2131230799; + // aapt resource value: 0x7f0800bb + public const int no_url_handler = 2131230907; + + // aapt resource value: 0x7f080050 + public const int not_possible_im_picker = 2131230800; // aapt resource value: 0x7f08000f public const int oi_filemanager_market = 2131230735; @@ -1991,11 +2003,11 @@ namespace keepass2android // aapt resource value: 0x7f080019 public const int omitbackup_key = 2131230745; - // aapt resource value: 0x7f0800bd - public const int omitbackup_summary = 2131230909; + // aapt resource value: 0x7f0800be + public const int omitbackup_summary = 2131230910; - // aapt resource value: 0x7f0800bc - public const int omitbackup_title = 2131230908; + // aapt resource value: 0x7f0800bd + public const int omitbackup_title = 2131230909; // aapt resource value: 0x7f080003 public const int open_entry = 2131230723; @@ -2003,152 +2015,152 @@ namespace keepass2android // aapt resource value: 0x7f080004 public const int open_entry_for_app = 2131230724; - // aapt resource value: 0x7f0800bb - public const int open_recent = 2131230907; - - // aapt resource value: 0x7f0800be - public const int pass_filename = 2131230910; + // aapt resource value: 0x7f0800bc + public const int open_recent = 2131230908; // aapt resource value: 0x7f0800bf - public const int password_title = 2131230911; - - // aapt resource value: 0x7f080050 - public const int please_activate_keyboard = 2131230800; + public const int pass_filename = 2131230911; // aapt resource value: 0x7f0800c0 - public const int progress_create = 2131230912; + public const int password_title = 2131230912; + + // aapt resource value: 0x7f080051 + public const int please_activate_keyboard = 2131230801; // aapt resource value: 0x7f0800c1 - public const int progress_title = 2131230913; - - // aapt resource value: 0x7f080103 - public const int protection = 2131230979; - - // aapt resource value: 0x7f080124 - public const int rate_app = 2131231012; - - // aapt resource value: 0x7f0800df - public const int regular_expression = 2131230943; + public const int progress_create = 2131230913; // aapt resource value: 0x7f0800c2 - public const int remember_keyfile_summary = 2131230914; + public const int progress_title = 2131230914; + + // aapt resource value: 0x7f080104 + public const int protection = 2131230980; + + // aapt resource value: 0x7f080127 + public const int rate_app = 2131231015; + + // aapt resource value: 0x7f0800e0 + public const int regular_expression = 2131230944; // aapt resource value: 0x7f0800c3 - public const int remember_keyfile_title = 2131230915; + public const int remember_keyfile_summary = 2131230915; // aapt resource value: 0x7f0800c4 - public const int remove_from_filelist = 2131230916; + public const int remember_keyfile_title = 2131230916; // aapt resource value: 0x7f0800c5 - public const int rijndael = 2131230917; + public const int remove_from_filelist = 2131230917; // aapt resource value: 0x7f0800c6 - public const int root = 2131230918; + public const int rijndael = 2131230918; // aapt resource value: 0x7f0800c7 - public const int rounds = 2131230919; + public const int root = 2131230919; // aapt resource value: 0x7f0800c8 - public const int rounds_explaination = 2131230920; + public const int rounds = 2131230920; // aapt resource value: 0x7f0800c9 - public const int rounds_hint = 2131230921; + public const int rounds_explaination = 2131230921; + + // aapt resource value: 0x7f0800ca + public const int rounds_hint = 2131230922; // aapt resource value: 0x7f080016 public const int rounds_key = 2131230742; - // aapt resource value: 0x7f0800cc - public const int saving_database = 2131230924; - - // aapt resource value: 0x7f0800d3 - public const int search_hint = 2131230931; - - // aapt resource value: 0x7f0800d5 - public const int search_in = 2131230933; - - // aapt resource value: 0x7f0800ce - public const int search_label = 2131230926; - - // aapt resource value: 0x7f0800e6 - public const int search_options = 2131230950; + // aapt resource value: 0x7f0800cd + public const int saving_database = 2131230925; // aapt resource value: 0x7f0800d4 - public const int search_results = 2131230932; - - // aapt resource value: 0x7f0800d7 - public const int select_group_then_add = 2131230935; + public const int search_hint = 2131230932; // aapt resource value: 0x7f0800d6 - public const int select_other_entry = 2131230934; - - // aapt resource value: 0x7f08003e - public const int short_app_name = 2131230782; - - // aapt resource value: 0x7f080040 - public const int short_app_name_nonet = 2131230784; + public const int search_in = 2131230934; // aapt resource value: 0x7f0800cf - public const int show_password = 2131230927; + public const int search_label = 2131230927; - // aapt resource value: 0x7f0800d1 - public const int sort_db = 2131230929; + // aapt resource value: 0x7f0800e7 + public const int search_options = 2131230951; + + // aapt resource value: 0x7f0800d5 + public const int search_results = 2131230933; + + // aapt resource value: 0x7f0800d8 + public const int select_group_then_add = 2131230936; + + // aapt resource value: 0x7f0800d7 + public const int select_other_entry = 2131230935; + + // aapt resource value: 0x7f08003f + public const int short_app_name = 2131230783; + + // aapt resource value: 0x7f080041 + public const int short_app_name_nonet = 2131230785; + + // aapt resource value: 0x7f0800d0 + public const int show_password = 2131230928; + + // aapt resource value: 0x7f0800d2 + public const int sort_db = 2131230930; // aapt resource value: 0x7f08001b public const int sort_key = 2131230747; - // aapt resource value: 0x7f0800d0 - public const int sort_name = 2131230928; + // aapt resource value: 0x7f0800d1 + public const int sort_name = 2131230929; - // aapt resource value: 0x7f0800cd - public const int space = 2131230925; + // aapt resource value: 0x7f0800ce + public const int space = 2131230926; - // aapt resource value: 0x7f0800d2 - public const int special = 2131230930; - - // aapt resource value: 0x7f0800e9 - public const int start_create = 2131230953; - - // aapt resource value: 0x7f0800eb - public const int start_create_import = 2131230955; - - // aapt resource value: 0x7f0800e8 - public const int start_open_file = 2131230952; + // aapt resource value: 0x7f0800d3 + public const int special = 2131230931; // aapt resource value: 0x7f0800ea - public const int start_open_url = 2131230954; + public const int start_create = 2131230954; - // aapt resource value: 0x7f080123 - public const int suggest_improvements = 2131231011; + // aapt resource value: 0x7f0800ec + public const int start_create_import = 2131230956; - // aapt resource value: 0x7f080125 - public const int translate_app = 2131231013; + // aapt resource value: 0x7f0800e9 + public const int start_open_file = 2131230953; - // aapt resource value: 0x7f0800d8 - public const int twofish = 2131230936; + // aapt resource value: 0x7f0800eb + public const int start_open_url = 2131230955; + + // aapt resource value: 0x7f080126 + public const int suggest_improvements = 2131231014; + + // aapt resource value: 0x7f080128 + public const int translate_app = 2131231016; // aapt resource value: 0x7f0800d9 - public const int underline = 2131230937; + public const int twofish = 2131230937; // aapt resource value: 0x7f0800da - public const int unsupported_db_version = 2131230938; + public const int underline = 2131230938; // aapt resource value: 0x7f0800db - public const int uppercase = 2131230939; - - // aapt resource value: 0x7f0800de - public const int version_label = 2131230942; + public const int unsupported_db_version = 2131230939; // aapt resource value: 0x7f0800dc - public const int warning_read_only = 2131230940; + public const int uppercase = 2131230940; + + // aapt resource value: 0x7f0800df + public const int version_label = 2131230943; // aapt resource value: 0x7f0800dd - public const int warning_unmounted = 2131230941; + public const int warning_read_only = 2131230941; + + // aapt resource value: 0x7f0800de + public const int warning_unmounted = 2131230942; // aapt resource value: 0x7f080001 public const int word_separators = 2131230721; - // aapt resource value: 0x7f0800b6 - public const int yes = 2131230902; + // aapt resource value: 0x7f0800b7 + public const int yes = 2131230903; private String() { diff --git a/src/keepass2android/Resources/values/config.xml b/src/keepass2android/Resources/values/config.xml index 7403b6e0..ed97a266 100644 --- a/src/keepass2android/Resources/values/config.xml +++ b/src/keepass2android/Resources/values/config.xml @@ -92,4 +92,7 @@ ShowUnlockedNotification true + PreloadDatabaseEnabled + true + \ No newline at end of file diff --git a/src/keepass2android/Resources/values/strings.xml b/src/keepass2android/Resources/values/strings.xml index 0e0a17de..43dfdeb4 100644 --- a/src/keepass2android/Resources/values/strings.xml +++ b/src/keepass2android/Resources/values/strings.xml @@ -232,8 +232,11 @@ Notification while unlocked Show an ongoing notification while the database is unlocked. - - Do you want to overwrite the existing binary with the same name? + + Pre-load database file + Start background loading or downloading of the database file during password entry. + + Do you want to overwrite the existing binary with the same name? Overwrite existing binary? Overwrite Rename diff --git a/src/keepass2android/Resources/xml/preferences.xml b/src/keepass2android/Resources/xml/preferences.xml index 6f38fe38..f8368351 100644 --- a/src/keepass2android/Resources/xml/preferences.xml +++ b/src/keepass2android/Resources/xml/preferences.xml @@ -163,6 +163,12 @@ android:defaultValue="true" android:title="@string/CheckForFileChangesOnSave_title" android:key="@string/CheckForFileChangesOnSave_key" /> - +