diff --git a/src/Kp2aBusinessLogic/Io/BuiltInFileStorage.cs b/src/Kp2aBusinessLogic/Io/BuiltInFileStorage.cs index 54ebc266..13579079 100644 --- a/src/Kp2aBusinessLogic/Io/BuiltInFileStorage.cs +++ b/src/Kp2aBusinessLogic/Io/BuiltInFileStorage.cs @@ -27,10 +27,16 @@ namespace keepass2android.Io { if (!ioc.IsLocalFile()) return false; - DateTime previousDate; - if (!DateTime.TryParse(previousFileVersion, out previousDate)) + if (previousFileVersion == null) return false; - return File.GetLastWriteTimeUtc(ioc.Path) > previousDate; + DateTime previousDate; + if (!DateTime.TryParse(previousFileVersion, CultureInfo.InvariantCulture, DateTimeStyles.None, out previousDate)) + return false; + DateTime currentModificationDate = File.GetLastWriteTimeUtc(ioc.Path); + TimeSpan diff = currentModificationDate - previousDate; + return diff > TimeSpan.FromSeconds(1); + //don't use > operator because milliseconds are truncated + return File.GetLastWriteTimeUtc(ioc.Path) - previousDate >= TimeSpan.FromSeconds(1); } diff --git a/src/Kp2aBusinessLogic/Io/IFileStorage.cs b/src/Kp2aBusinessLogic/Io/IFileStorage.cs index 3a203189..91cf972c 100644 --- a/src/Kp2aBusinessLogic/Io/IFileStorage.cs +++ b/src/Kp2aBusinessLogic/Io/IFileStorage.cs @@ -43,6 +43,7 @@ namespace keepass2android.Io /// /// Note: This function may return false even if the file might have changed. The function /// should focus on being fast and cheap instead of doing things like hashing or downloading a full file. + /// previousFileVersion may be null to indicate no previous version is known. /// Returns true if a change was detected, false otherwise. bool CheckForFileChangeFast(IOConnectionInfo ioc , string previousFileVersion); diff --git a/src/Kp2aBusinessLogic/ProgressDialogStatusLogger.cs b/src/Kp2aBusinessLogic/ProgressDialogStatusLogger.cs index 9a650e05..f3849e46 100644 --- a/src/Kp2aBusinessLogic/ProgressDialogStatusLogger.cs +++ b/src/Kp2aBusinessLogic/ProgressDialogStatusLogger.cs @@ -60,7 +60,7 @@ namespace keepass2android { _handler.Post(() => { - if (String.IsNullOrEmpty(submessage)) + if (!String.IsNullOrEmpty(submessage)) { _progressDialog.SetMessage(_message + " (" + submessage + ")"); } diff --git a/src/Kp2aBusinessLogic/UiStringKey.cs b/src/Kp2aBusinessLogic/UiStringKey.cs index 534bc637..aa026a82 100644 --- a/src/Kp2aBusinessLogic/UiStringKey.cs +++ b/src/Kp2aBusinessLogic/UiStringKey.cs @@ -29,7 +29,7 @@ namespace keepass2android ParsingDatabase, CheckingTargetFileForChanges, TitleSyncQuestion, - MessageSyncQuestions, + MessageSyncQuestion, SynchronizingDatabase } } \ No newline at end of file diff --git a/src/Kp2aBusinessLogic/database/edit/SaveDB.cs b/src/Kp2aBusinessLogic/database/edit/SaveDB.cs index a3b76089..71c8177d 100644 --- a/src/Kp2aBusinessLogic/database/edit/SaveDB.cs +++ b/src/Kp2aBusinessLogic/database/edit/SaveDB.cs @@ -75,8 +75,9 @@ namespace keepass2android if (fileStorage.CheckForFileChangeFast(ioc, _app.GetDb().LastFileVersion) //first try to use the fast change detection || (FileHashChanged(ioc, _app.GetDb().KpDatabase.HashOfFileOnDisk))) //if that fails, hash the file and compare: { + //ask user... - _app.AskYesNoCancel(UiStringKey.TitleSyncQuestion, UiStringKey.MessageSyncQuestions, + _app.AskYesNoCancel(UiStringKey.TitleSyncQuestion, UiStringKey.MessageSyncQuestion, //yes = sync (sender, args) => { @@ -85,7 +86,6 @@ namespace keepass2android //note: when synced, the file might be downloaded once again from the server. Caching the data //in the hashing function would solve this but increases complexity. I currently assume the files are //small. - StatusLogger.UpdateSubMessage(_app.GetResourceString(UiStringKey.SynchronizingDatabase)); MergeIn(fileStorage, ioc); PerformSaveWithoutCheck(fileStorage, ioc); Finish(true); @@ -108,8 +108,6 @@ namespace keepass2android }, _ctx ); - - } else { @@ -125,7 +123,8 @@ namespace keepass2android bSuccess = false; } */ - Finish (false, e.ToString()); + Kp2aLog.Log("Error while saving: "+e.ToString()); + Finish (false, e.Message); return; } } @@ -138,7 +137,7 @@ namespace keepass2android try { _workerThread = new Thread(runHandler); - _workerThread.Run(); + _workerThread.Start(); } catch (Exception e) { @@ -156,6 +155,8 @@ namespace keepass2android private void MergeIn(IFileStorage fileStorage, IOConnectionInfo ioc) { + StatusLogger.UpdateSubMessage(_app.GetResourceString(UiStringKey.SynchronizingDatabase)); + PwDatabase pwImp = new PwDatabase(); PwDatabase pwDatabase = _app.GetDb().KpDatabase; pwImp.New(new IOConnectionInfo(), pwDatabase.MasterKey); @@ -170,6 +171,7 @@ namespace keepass2android private void PerformSaveWithoutCheck(IFileStorage fileStorage, IOConnectionInfo ioc) { + StatusLogger.UpdateSubMessage(""); _app.GetDb().SaveData(_ctx); _app.GetDb().LastFileVersion = fileStorage.GetCurrentFileVersionFast(ioc); } diff --git a/src/Kp2aUnitTests/TestSaveDb.cs b/src/Kp2aUnitTests/TestSaveDb.cs index 58c704d9..ae63566b 100644 --- a/src/Kp2aUnitTests/TestSaveDb.cs +++ b/src/Kp2aUnitTests/TestSaveDb.cs @@ -228,6 +228,14 @@ namespace Kp2aUnitTests Assert.Fail("TODO: Test "); } + + [TestMethod] + public void TestReloadWhenCancelSync() + { + //when a change is detected and the user cancels saving, the app should display the "file was modified - reload?" question. + Assert.Fail("TODO: Test "); + } + [TestMethod] public void TestSaveAsWhenSyncError() { diff --git a/src/keepass2android/LockCloseActivity.cs b/src/keepass2android/LockCloseActivity.cs index ffd4d2cc..78b08b2f 100644 --- a/src/keepass2android/LockCloseActivity.cs +++ b/src/keepass2android/LockCloseActivity.cs @@ -42,6 +42,10 @@ namespace keepass2android if (TimeoutHelper.CheckShutdown(this, _ioc)) return; + //todo: it seems like OnResume can be called after dismissing a dialog, e.g. the Delete-permanently-Dialog. + //in this case the following check might run in parallel with the check performed during the SaveDb check (triggered after the + //aforementioned dialog is closed) which can cause odd behavior. However, this is a rare case and hard to resolve so this is currently + //accepted. (If the user clicks cancel on the reload-dialog, everything will work.) App.Kp2a.CheckForOpenFileChanged(this); } diff --git a/src/keepass2android/LockCloseListActivity.cs b/src/keepass2android/LockCloseListActivity.cs index afe0215b..3a0117e0 100644 --- a/src/keepass2android/LockCloseListActivity.cs +++ b/src/keepass2android/LockCloseListActivity.cs @@ -53,6 +53,7 @@ namespace keepass2android if (TimeoutHelper.CheckShutdown(this, _ioc)) return; + //todo: see LockCloseActivity.OnResume App.Kp2a.CheckForOpenFileChanged(this); } diff --git a/src/keepass2android/Resources/Resource.designer.cs b/src/keepass2android/Resources/Resource.designer.cs index bd47f390..20a7831f 100644 --- a/src/keepass2android/Resources/Resource.designer.cs +++ b/src/keepass2android/Resources/Resource.designer.cs @@ -939,8 +939,8 @@ namespace keepass2android // aapt resource value: 0x7f0d00a3 public const int menu_cancel_edit = 2131558563; - // aapt resource value: 0x7f0d00a7 - public const int menu_change_master_key = 2131558567; + // aapt resource value: 0x7f0d00a8 + public const int menu_change_master_key = 2131558568; // aapt resource value: 0x7f0d009c public const int menu_donate = 2131558556; @@ -957,8 +957,11 @@ namespace keepass2android // aapt resource value: 0x7f0d00a6 public const int menu_search = 2131558566; - // aapt resource value: 0x7f0d00a8 - public const int menu_sort = 2131558568; + // aapt resource value: 0x7f0d00a7 + public const int menu_search_advanced = 2131558567; + + // aapt resource value: 0x7f0d00a9 + public const int menu_sort = 2131558569; // aapt resource value: 0x7f0d00a0 public const int menu_suggest_improvements = 2131558560; @@ -1227,50 +1230,50 @@ namespace keepass2android public partial class String { - // aapt resource value: 0x7f080033 - public const int AboutText = 2131230771; + // aapt resource value: 0x7f080034 + public const int AboutText = 2131230772; - // aapt resource value: 0x7f08011e - public const int AddingEntry = 2131231006; + // aapt resource value: 0x7f080122 + public const int AddingEntry = 2131231010; - // aapt resource value: 0x7f08011f - public const int AddingGroup = 2131231007; - - // aapt resource value: 0x7f080114 - public const int AskDeletePermanentlyEntry = 2131230996; - - // aapt resource value: 0x7f080115 - public const int AskDeletePermanentlyGroup = 2131230997; - - // aapt resource value: 0x7f080116 - public const int AskDeletePermanently_title = 2131230998; - - // aapt resource value: 0x7f080119 - public const int AskDiscardChanges = 2131231001; - - // aapt resource value: 0x7f08011a - public const int AskDiscardChanges_title = 2131231002; - - // aapt resource value: 0x7f08010e - public const int AskOverwriteBinary = 2131230990; - - // aapt resource value: 0x7f080111 - public const int AskOverwriteBinary_no = 2131230993; - - // aapt resource value: 0x7f08010f - public const int AskOverwriteBinary_title = 2131230991; - - // aapt resource value: 0x7f080110 - public const int AskOverwriteBinary_yes = 2131230992; + // aapt resource value: 0x7f080123 + public const int AddingGroup = 2131231011; // aapt resource value: 0x7f080118 - public const int AskReloadFile = 2131231000; + public const int AskDeletePermanentlyEntry = 2131231000; - // aapt resource value: 0x7f080117 - public const int AskReloadFile_title = 2131230999; + // aapt resource value: 0x7f080119 + public const int AskDeletePermanentlyGroup = 2131231001; + + // aapt resource value: 0x7f08011a + public const int AskDeletePermanently_title = 2131231002; + + // aapt resource value: 0x7f08011d + public const int AskDiscardChanges = 2131231005; + + // aapt resource value: 0x7f08011e + public const int AskDiscardChanges_title = 2131231006; // aapt resource value: 0x7f080112 - public const int AttachFailed = 2131230994; + public const int AskOverwriteBinary = 2131230994; + + // aapt resource value: 0x7f080115 + public const int AskOverwriteBinary_no = 2131230997; + + // aapt resource value: 0x7f080113 + public const int AskOverwriteBinary_title = 2131230995; + + // aapt resource value: 0x7f080114 + public const int AskOverwriteBinary_yes = 2131230996; + + // aapt resource value: 0x7f08011c + public const int AskReloadFile = 2131231004; + + // aapt resource value: 0x7f08011b + public const int AskReloadFile_title = 2131231003; + + // aapt resource value: 0x7f080116 + public const int AttachFailed = 2131230998; // aapt resource value: 0x7f080022 public const int BinaryDirectory_default = 2131230754; @@ -1278,92 +1281,107 @@ namespace keepass2android // aapt resource value: 0x7f080021 public const int BinaryDirectory_key = 2131230753; - // aapt resource value: 0x7f0800f6 - public const int BinaryDirectory_summary = 2131230966; + // aapt resource value: 0x7f0800f8 + public const int BinaryDirectory_summary = 2131230968; - // aapt resource value: 0x7f0800f5 - public const int BinaryDirectory_title = 2131230965; + // aapt resource value: 0x7f0800f7 + public const int BinaryDirectory_title = 2131230967; + + // aapt resource value: 0x7f080137 + public const int ChangeLog = 2131231031; + + // aapt resource value: 0x7f080136 + public const int ChangeLog_0_7 = 2131231030; + + // aapt resource value: 0x7f080134 + public const int ChangeLog_0_8 = 2131231028; + + // aapt resource value: 0x7f080133 + public const int ChangeLog_0_8_1 = 2131231027; + + // aapt resource value: 0x7f080132 + public const int ChangeLog_0_8_2 = 2131231026; + + // aapt resource value: 0x7f080131 + public const int ChangeLog_0_8_3 = 2131231025; + + // aapt resource value: 0x7f080130 + public const int ChangeLog_0_8_4 = 2131231024; + + // aapt resource value: 0x7f080135 + public const int ChangeLog_keptDonate = 2131231029; // aapt resource value: 0x7f08012f - public const int ChangeLog = 2131231023; + public const int ChangeLog_title = 2131231023; - // aapt resource value: 0x7f08012e - public const int ChangeLog_0_7 = 2131231022; + // aapt resource value: 0x7f080029 + public const int CheckForFileChangesOnSave_key = 2131230761; - // aapt resource value: 0x7f08012c - public const int ChangeLog_0_8 = 2131231020; + // aapt resource value: 0x7f08010b + public const int CheckForFileChangesOnSave_summary = 2131230987; + + // aapt resource value: 0x7f08010a + public const int CheckForFileChangesOnSave_title = 2131230986; // aapt resource value: 0x7f08012b - public const int ChangeLog_0_8_1 = 2131231019; + public const int CheckingTargetFileForChanges = 2131231019; - // aapt resource value: 0x7f08012a - public const int ChangeLog_0_8_2 = 2131231018; + // aapt resource value: 0x7f080049 + public const int ClearClipboard = 2131230793; + + // aapt resource value: 0x7f08002d + public const int CopyToClipboardNotification_key = 2131230765; + + // aapt resource value: 0x7f080035 + public const int CreditsText = 2131230773; // aapt resource value: 0x7f080129 - public const int ChangeLog_0_8_3 = 2131231017; + public const int DecodingDatabase = 2131231017; - // aapt resource value: 0x7f08012d - public const int ChangeLog_keptDonate = 2131231021; - - // aapt resource value: 0x7f080128 - public const int ChangeLog_title = 2131231016; - - // aapt resource value: 0x7f080127 - public const int CheckingTargetFileForChanges = 2131231015; - - // aapt resource value: 0x7f080048 - public const int ClearClipboard = 2131230792; - - // aapt resource value: 0x7f08002c - public const int CopyToClipboardNotification_key = 2131230764; - - // aapt resource value: 0x7f080034 - public const int CreditsText = 2131230772; + // aapt resource value: 0x7f080124 + public const int DeletingEntry = 2131231012; // aapt resource value: 0x7f080125 - public const int DecodingDatabase = 2131231013; + public const int DeletingGroup = 2131231013; - // aapt resource value: 0x7f080120 - public const int DeletingEntry = 2131231008; + // aapt resource value: 0x7f080082 + public const int FileNotFound = 2131230850; - // aapt resource value: 0x7f080121 - public const int DeletingGroup = 2131231009; - - // aapt resource value: 0x7f080081 - public const int FileNotFound = 2131230849; - - // aapt resource value: 0x7f080094 - public const int InvalidPassword = 2131230868; + // aapt resource value: 0x7f080095 + public const int InvalidPassword = 2131230869; // aapt resource value: 0x7f080027 public const int LastInfoVersionCode_key = 2131230759; - // aapt resource value: 0x7f080029 - public const int MarketURL = 2131230761; + // aapt resource value: 0x7f08002a + public const int MarketURL = 2131230762; - // aapt resource value: 0x7f08009e - public const int MaskedPassword = 2131230878; + // aapt resource value: 0x7f08009f + public const int MaskedPassword = 2131230879; - // aapt resource value: 0x7f08002e - public const int OpenKp2aKeyboardAutomatically_key = 2131230766; + // aapt resource value: 0x7f08012d + public const int MessageSyncQuestion = 2131231021; - // aapt resource value: 0x7f08010d - public const int OpenKp2aKeyboardAutomatically_summary = 2131230989; + // aapt resource value: 0x7f08002f + public const int OpenKp2aKeyboardAutomatically_key = 2131230767; - // aapt resource value: 0x7f08010c - public const int OpenKp2aKeyboardAutomatically_title = 2131230988; + // aapt resource value: 0x7f080111 + public const int OpenKp2aKeyboardAutomatically_summary = 2131230993; - // aapt resource value: 0x7f080126 - public const int ParsingDatabase = 2131231014; + // aapt resource value: 0x7f080110 + public const int OpenKp2aKeyboardAutomatically_title = 2131230992; + + // aapt resource value: 0x7f08012a + public const int ParsingDatabase = 2131231018; // aapt resource value: 0x7f080023 public const int QuickUnlockDefaultEnabled_key = 2131230755; - // aapt resource value: 0x7f0800f1 - public const int QuickUnlockDefaultEnabled_summary = 2131230961; + // aapt resource value: 0x7f0800f3 + public const int QuickUnlockDefaultEnabled_summary = 2131230963; - // aapt resource value: 0x7f0800f0 - public const int QuickUnlockDefaultEnabled_title = 2131230960; + // aapt resource value: 0x7f0800f2 + public const int QuickUnlockDefaultEnabled_title = 2131230962; // aapt resource value: 0x7f080025 public const int QuickUnlockLength_default = 2131230757; @@ -1371,89 +1389,95 @@ namespace keepass2android // aapt resource value: 0x7f080024 public const int QuickUnlockLength_key = 2131230756; - // aapt resource value: 0x7f0800f3 - public const int QuickUnlockLength_summary = 2131230963; - - // aapt resource value: 0x7f0800f2 - public const int QuickUnlockLength_title = 2131230962; - - // aapt resource value: 0x7f0800ee - public const int QuickUnlock_button = 2131230958; + // aapt resource value: 0x7f0800f5 + public const int QuickUnlockLength_summary = 2131230965; // aapt resource value: 0x7f0800f4 - public const int QuickUnlock_fail = 2131230964; + public const int QuickUnlockLength_title = 2131230964; - // aapt resource value: 0x7f0800ed - public const int QuickUnlock_label = 2131230957; + // aapt resource value: 0x7f0800f0 + public const int QuickUnlock_button = 2131230960; + + // aapt resource value: 0x7f0800f6 + public const int QuickUnlock_fail = 2131230966; // aapt resource value: 0x7f0800ef - public const int QuickUnlock_lockButton = 2131230959; + public const int QuickUnlock_label = 2131230959; - // aapt resource value: 0x7f080113 - public const int RecycleBin = 2131230995; + // aapt resource value: 0x7f0800f1 + public const int QuickUnlock_lockButton = 2131230961; - // aapt resource value: 0x7f0800fa - public const int SaveAttachmentDialog_open = 2131230970; - - // aapt resource value: 0x7f0800f9 - public const int SaveAttachmentDialog_save = 2131230969; - - // aapt resource value: 0x7f0800f8 - public const int SaveAttachmentDialog_text = 2131230968; - - // aapt resource value: 0x7f0800f7 - public const int SaveAttachmentDialog_title = 2131230967; + // aapt resource value: 0x7f080117 + public const int RecycleBin = 2131230999; // aapt resource value: 0x7f0800fc - public const int SaveAttachment_Failed = 2131230972; + public const int SaveAttachmentDialog_open = 2131230972; // aapt resource value: 0x7f0800fb - public const int SaveAttachment_doneMessage = 2131230971; + public const int SaveAttachmentDialog_save = 2131230971; - // aapt resource value: 0x7f080122 - public const int SettingPassword = 2131231010; + // aapt resource value: 0x7f0800fa + public const int SaveAttachmentDialog_text = 2131230970; - // aapt resource value: 0x7f080109 - public const int ShowCopyToClipboardNotification_summary = 2131230985; + // aapt resource value: 0x7f0800f9 + public const int SaveAttachmentDialog_title = 2131230969; - // aapt resource value: 0x7f080108 - public const int ShowCopyToClipboardNotification_title = 2131230984; + // aapt resource value: 0x7f0800fe + public const int SaveAttachment_Failed = 2131230974; - // aapt resource value: 0x7f08010b - public const int ShowKp2aKeyboardNotification_summary = 2131230987; + // aapt resource value: 0x7f0800fd + public const int SaveAttachment_doneMessage = 2131230973; - // aapt resource value: 0x7f08010a - public const int ShowKp2aKeyboardNotification_title = 2131230986; + // aapt resource value: 0x7f080126 + public const int SettingPassword = 2131231014; + + // aapt resource value: 0x7f08010d + public const int ShowCopyToClipboardNotification_summary = 2131230989; + + // aapt resource value: 0x7f08010c + public const int ShowCopyToClipboardNotification_title = 2131230988; + + // aapt resource value: 0x7f08010f + public const int ShowKp2aKeyboardNotification_summary = 2131230991; + + // aapt resource value: 0x7f08010e + public const int ShowKp2aKeyboardNotification_title = 2131230990; // aapt resource value: 0x7f08001e public const int ShowUsernameInList_key = 2131230750; - // aapt resource value: 0x7f0800e1 - public const int ShowUsernameInList_summary = 2131230945; + // aapt resource value: 0x7f0800e3 + public const int ShowUsernameInList_summary = 2131230947; - // aapt resource value: 0x7f0800e0 - public const int ShowUsernameInList_title = 2131230944; + // aapt resource value: 0x7f0800e2 + public const int ShowUsernameInList_title = 2131230946; - // aapt resource value: 0x7f08002a - public const int SuggestionsURL = 2131230762; + // aapt resource value: 0x7f08002b + public const int SuggestionsURL = 2131230763; + + // aapt resource value: 0x7f08012e + public const int SynchronizingDatabase = 2131231022; // aapt resource value: 0x7f08001d public const int TanExpiresOnUse_key = 2131230749; - // aapt resource value: 0x7f0800df - public const int TanExpiresOnUse_summary = 2131230943; + // aapt resource value: 0x7f0800e1 + public const int TanExpiresOnUse_summary = 2131230945; - // aapt resource value: 0x7f0800de - public const int TanExpiresOnUse_title = 2131230942; + // aapt resource value: 0x7f0800e0 + public const int TanExpiresOnUse_title = 2131230944; - // aapt resource value: 0x7f080124 - public const int TransformingKey = 2131231012; + // aapt resource value: 0x7f08012c + public const int TitleSyncQuestion = 2131231020; - // aapt resource value: 0x7f08002b - public const int TranslationURL = 2131230763; + // aapt resource value: 0x7f080128 + public const int TransformingKey = 2131231016; - // aapt resource value: 0x7f080123 - public const int UndoingChanges = 2131231011; + // aapt resource value: 0x7f08002c + public const int TranslationURL = 2131230764; + + // aapt resource value: 0x7f080127 + public const int UndoingChanges = 2131231015; // aapt resource value: 0x7f080026 public const int UsageCount_key = 2131230758; @@ -1461,47 +1485,47 @@ namespace keepass2android // aapt resource value: 0x7f080028 public const int UseFileTransactions_key = 2131230760; - // aapt resource value: 0x7f080107 - public const int UseFileTransactions_summary = 2131230983; + // aapt resource value: 0x7f080109 + public const int UseFileTransactions_summary = 2131230985; - // aapt resource value: 0x7f080106 - public const int UseFileTransactions_title = 2131230982; + // aapt resource value: 0x7f080108 + public const int UseFileTransactions_title = 2131230984; - // aapt resource value: 0x7f08002d - public const int UseKp2aKeyboard_key = 2131230765; - - // aapt resource value: 0x7f080031 - public const int about_feedback = 2131230769; + // aapt resource value: 0x7f08002e + public const int UseKp2aKeyboard_key = 2131230766; // aapt resource value: 0x7f080032 - public const int about_homepage = 2131230770; + public const int about_feedback = 2131230770; - // aapt resource value: 0x7f080035 - public const int accept = 2131230773; - - // aapt resource value: 0x7f080102 - public const int add_binary = 2131230978; + // aapt resource value: 0x7f080033 + public const int about_homepage = 2131230771; // aapt resource value: 0x7f080036 - public const int add_entry = 2131230774; + public const int accept = 2131230774; - // aapt resource value: 0x7f080103 - public const int add_extra_string = 2131230979; - - // aapt resource value: 0x7f080038 - public const int add_group = 2131230776; - - // aapt resource value: 0x7f080039 - public const int add_group_title = 2131230777; + // aapt resource value: 0x7f080104 + public const int add_binary = 2131230980; // aapt resource value: 0x7f080037 - public const int add_url_entry = 2131230775; + public const int add_entry = 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 algorithm = 2131230778; + public const int add_group_title = 2131230778; + + // aapt resource value: 0x7f080038 + public const int add_url_entry = 2131230776; // aapt resource value: 0x7f08003b - public const int algorithm_colon = 2131230779; + public const int algorithm = 2131230779; + + // aapt resource value: 0x7f08003c + public const int algorithm_colon = 2131230780; // aapt resource value: 0x7f080011 public const int algorithm_key = 2131230737; @@ -1509,86 +1533,86 @@ namespace keepass2android // aapt resource value: 0x7f080012 public const int app_key = 2131230738; - // aapt resource value: 0x7f08003c - public const int app_name = 2131230780; + // aapt resource value: 0x7f08003d + public const int app_name = 2131230781; - // aapt resource value: 0x7f08003e - public const int app_name_nonet = 2131230782; + // aapt resource value: 0x7f08003f + public const int app_name_nonet = 2131230783; - // aapt resource value: 0x7f080040 - public const int app_timeout = 2131230784; + // aapt resource value: 0x7f080041 + public const int app_timeout = 2131230785; // aapt resource value: 0x7f080013 public const int app_timeout_key = 2131230739; - // aapt resource value: 0x7f080041 - public const int app_timeout_summary = 2131230785; - // aapt resource value: 0x7f080042 - public const int application = 2131230786; + public const int app_timeout_summary = 2131230786; // aapt resource value: 0x7f080043 - public const int application_settings = 2131230787; - - // aapt resource value: 0x7f08004d - public const int available_through_keyboard = 2131230797; + public const int application = 2131230787; // aapt resource value: 0x7f080044 - public const int brackets = 2131230788; + public const int application_settings = 2131230788; + + // aapt resource value: 0x7f08004e + public const int available_through_keyboard = 2131230798; // aapt resource value: 0x7f080045 - public const int browser_intall_text = 2131230789; + public const int brackets = 2131230789; // aapt resource value: 0x7f080046 - public const int building_search_idx = 2131230790; + public const int browser_intall_text = 2131230790; // aapt resource value: 0x7f080047 - public const int cancel = 2131230791; + public const int building_search_idx = 2131230791; - // aapt resource value: 0x7f0800e5 - public const int caseSensitive = 2131230949; + // aapt resource value: 0x7f080048 + public const int cancel = 2131230792; + + // aapt resource value: 0x7f0800e7 + public const int caseSensitive = 2131230951; // aapt resource value: 0x7f080002 public const int change_entry = 2131230722; - // aapt resource value: 0x7f080049 - public const int clipboard_timeout = 2131230793; + // aapt resource value: 0x7f08004a + public const int clipboard_timeout = 2131230794; - // aapt resource value: 0x7f08002f - public const int clipboard_timeout_default = 2131230767; + // aapt resource value: 0x7f080030 + public const int clipboard_timeout_default = 2131230768; // aapt resource value: 0x7f080014 public const int clipboard_timeout_key = 2131230740; - // aapt resource value: 0x7f08004a - public const int clipboard_timeout_summary = 2131230794; + // aapt resource value: 0x7f08004b + public const int clipboard_timeout_summary = 2131230795; + + // aapt resource value: 0x7f08004d + public const int copy_password = 2131230797; // aapt resource value: 0x7f08004c - public const int copy_password = 2131230796; - - // aapt resource value: 0x7f08004b - public const int copy_username = 2131230795; - - // aapt resource value: 0x7f080050 - public const int creating_db_key = 2131230800; - - // aapt resource value: 0x7f080105 - public const int credentials_dialog_title = 2131230981; + public const int copy_username = 2131230796; // aapt resource value: 0x7f080051 - public const int current_group = 2131230801; + public const int creating_db_key = 2131230801; + + // aapt resource value: 0x7f080107 + public const int credentials_dialog_title = 2131230983; // aapt resource value: 0x7f080052 - public const int current_group_root = 2131230802; + public const int current_group = 2131230802; // aapt resource value: 0x7f080053 - public const int database = 2131230803; + public const int current_group_root = 2131230803; - // aapt resource value: 0x7f080104 - public const int database_loaded_quickunlock_enabled = 2131230980; + // aapt resource value: 0x7f080054 + public const int database = 2131230804; - // aapt resource value: 0x7f0800c8 - public const int database_name = 2131230920; + // aapt resource value: 0x7f080106 + public const int database_loaded_quickunlock_enabled = 2131230982; + + // aapt resource value: 0x7f0800ca + public const int database_name = 2131230922; // aapt resource value: 0x7f080020 public const int database_name_key = 2131230752; @@ -1596,224 +1620,224 @@ namespace keepass2android // aapt resource value: 0x7f080015 public const int db_key = 2131230741; - // aapt resource value: 0x7f080054 - public const int decrypting_db = 2131230804; - // aapt resource value: 0x7f080055 - public const int decrypting_entry = 2131230805; + public const int decrypting_db = 2131230805; // aapt resource value: 0x7f080056 - public const int default_checkbox = 2131230806; + public const int decrypting_entry = 2131230806; + + // aapt resource value: 0x7f080057 + public const int default_checkbox = 2131230807; // aapt resource value: 0x7f08000a public const int default_file_path = 2131230730; - // aapt resource value: 0x7f0800c9 - public const int default_username = 2131230921; + // aapt resource value: 0x7f0800cb + public const int default_username = 2131230923; // aapt resource value: 0x7f08001f public const int default_username_key = 2131230751; - // aapt resource value: 0x7f080057 - public const int digits = 2131230807; - // aapt resource value: 0x7f080058 - public const int disclaimer_formal = 2131230808; + public const int digits = 2131230808; + + // aapt resource value: 0x7f080059 + public const int disclaimer_formal = 2131230809; // aapt resource value: 0x7f08000b public const int donate_url = 2131230731; - // aapt resource value: 0x7f080059 - public const int ellipsis = 2131230809; - - // aapt resource value: 0x7f0800ec - public const int enable_quickunlock = 2131230956; - // aapt resource value: 0x7f08005a - public const int enter_filename = 2131230810; + public const int ellipsis = 2131230810; - // aapt resource value: 0x7f0800eb - public const int enter_filename_details_create_import = 2131230955; - - // aapt resource value: 0x7f0800ea - public const int enter_filename_details_url = 2131230954; + // aapt resource value: 0x7f0800ee + public const int enable_quickunlock = 2131230958; // aapt resource value: 0x7f08005b - public const int entry_accessed = 2131230811; + public const int enter_filename = 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: 0x7f08005c - public const int entry_and_or = 2131230812; - - // aapt resource value: 0x7f08006c - public const int entry_binaries = 2131230828; + public const int entry_accessed = 2131230812; // aapt resource value: 0x7f08005d - public const int entry_cancel = 2131230813; - - // aapt resource value: 0x7f08005e - public const int entry_comment = 2131230814; - - // aapt resource value: 0x7f080061 - public const int entry_confpassword = 2131230817; - - // aapt resource value: 0x7f080062 - public const int entry_created = 2131230818; - - // aapt resource value: 0x7f080063 - public const int entry_expires = 2131230819; - - // aapt resource value: 0x7f08006b - public const int entry_extra_strings = 2131230827; - - // aapt resource value: 0x7f080064 - public const int entry_keyfile = 2131230820; - - // aapt resource value: 0x7f080065 - public const int entry_modified = 2131230821; - - // aapt resource value: 0x7f080060 - public const int entry_override_url = 2131230816; - - // aapt resource value: 0x7f080066 - public const int entry_password = 2131230822; - - // aapt resource value: 0x7f080067 - public const int entry_save = 2131230823; - - // aapt resource value: 0x7f08005f - public const int entry_tags = 2131230815; - - // aapt resource value: 0x7f080068 - public const int entry_title = 2131230824; - - // aapt resource value: 0x7f080069 - public const int entry_url = 2131230825; - - // aapt resource value: 0x7f08006a - public const int entry_user_name = 2131230826; + public const int entry_and_or = 2131230813; // aapt resource value: 0x7f08006d - public const int error_arc4 = 2131230829; + public const int entry_binaries = 2131230829; + + // 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; // aapt resource value: 0x7f08006e - public const int error_can_not_handle_uri = 2131230830; + public const int error_arc4 = 2131230830; // aapt resource value: 0x7f08006f - public const int error_could_not_create_group = 2131230831; + public const int error_can_not_handle_uri = 2131230831; // aapt resource value: 0x7f080070 - public const int error_could_not_create_parent = 2131230832; + public const int error_could_not_create_group = 2131230832; // aapt resource value: 0x7f080071 - public const int error_database_exists = 2131230833; + public const int error_could_not_create_parent = 2131230833; // aapt resource value: 0x7f080072 - public const int error_database_settings = 2131230834; + public const int error_database_exists = 2131230834; // aapt resource value: 0x7f080073 - public const int error_failed_to_launch_link = 2131230835; - - // aapt resource value: 0x7f080075 - public const int error_file_not_create = 2131230837; + public const int error_database_settings = 2131230835; // aapt resource value: 0x7f080074 - public const int error_filename_required = 2131230836; + public const int error_failed_to_launch_link = 2131230836; // aapt resource value: 0x7f080076 - public const int error_invalid_db = 2131230838; + public const int error_file_not_create = 2131230838; - // aapt resource value: 0x7f0800fd - public const int error_invalid_expiry_date = 2131230973; + // aapt resource value: 0x7f080075 + public const int error_filename_required = 2131230837; // aapt resource value: 0x7f080077 - public const int error_invalid_path = 2131230839; - - // aapt resource value: 0x7f080078 - public const int error_no_name = 2131230840; - - // aapt resource value: 0x7f080079 - public const int error_nopass = 2131230841; - - // aapt resource value: 0x7f08007a - public const int error_out_of_memory = 2131230842; - - // aapt resource value: 0x7f08007b - public const int error_pass_gen_type = 2131230843; - - // aapt resource value: 0x7f08007c - public const int error_pass_match = 2131230844; - - // aapt resource value: 0x7f08007d - public const int error_rounds_not_number = 2131230845; - - // aapt resource value: 0x7f08007e - public const int error_rounds_too_large = 2131230846; - - // aapt resource value: 0x7f0800fe - public const int error_string_key = 2131230974; - - // aapt resource value: 0x7f08007f - public const int error_title_required = 2131230847; - - // aapt resource value: 0x7f080080 - public const int error_wrong_length = 2131230848; - - // aapt resource value: 0x7f0800e3 - public const int excludeExpiredEntries = 2131230947; + public const int error_invalid_db = 2131230839; // aapt resource value: 0x7f0800ff - public const int field_name = 2131230975; + public const int error_invalid_expiry_date = 2131230975; + + // 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; // aapt resource value: 0x7f080100 - public const int field_value = 2131230976; + public const int error_string_key = 2131230976; - // aapt resource value: 0x7f080082 - public const int file_browser = 2131230850; + // 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; + + // aapt resource value: 0x7f080101 + public const int field_name = 2131230977; + + // aapt resource value: 0x7f080102 + public const int field_value = 2131230978; // aapt resource value: 0x7f080083 - public const int generate_password = 2131230851; + public const int file_browser = 2131230851; // aapt resource value: 0x7f080084 - public const int group = 2131230852; + public const int generate_password = 2131230852; // aapt resource value: 0x7f080085 - public const int hint_comment = 2131230853; + public const int group = 2131230853; // aapt resource value: 0x7f080086 - public const int hint_conf_pass = 2131230854; + public const int hint_comment = 2131230854; // aapt resource value: 0x7f080087 - public const int hint_generated_password = 2131230855; + public const int hint_conf_pass = 2131230855; // aapt resource value: 0x7f080088 - public const int hint_group_name = 2131230856; + public const int hint_generated_password = 2131230856; // aapt resource value: 0x7f080089 - public const int hint_keyfile = 2131230857; + public const int hint_group_name = 2131230857; // aapt resource value: 0x7f08008a - public const int hint_length = 2131230858; - - // aapt resource value: 0x7f08008c - public const int hint_login_pass = 2131230860; - - // aapt resource value: 0x7f08008f - public const int hint_override_url = 2131230863; + public const int hint_keyfile = 2131230858; // aapt resource value: 0x7f08008b - public const int hint_pass = 2131230859; - - // aapt resource value: 0x7f080090 - public const int hint_tags = 2131230864; + public const int hint_length = 2131230859; // aapt resource value: 0x7f08008d - public const int hint_title = 2131230861; + public const int hint_login_pass = 2131230861; - // aapt resource value: 0x7f08008e - public const int hint_url = 2131230862; + // aapt resource value: 0x7f080090 + public const int hint_override_url = 2131230864; + + // aapt resource value: 0x7f08008c + public const int hint_pass = 2131230860; // aapt resource value: 0x7f080091 - public const int hint_username = 2131230865; + public const int hint_tags = 2131230865; + + // aapt resource value: 0x7f08008e + public const int hint_title = 2131230862; + + // aapt resource value: 0x7f08008f + public const int hint_url = 2131230863; + + // aapt resource value: 0x7f080092 + public const int hint_username = 2131230866; // aapt resource value: 0x7f08000c public const int homepage = 2131230732; @@ -1824,32 +1848,32 @@ namespace keepass2android // aapt resource value: 0x7f080000 public const int ime_name = 2131230720; - // aapt resource value: 0x7f080092 - public const int install_from_market = 2131230866; - // aapt resource value: 0x7f080093 - public const int install_from_website = 2131230867; + public const int install_from_market = 2131230867; - // aapt resource value: 0x7f080095 - public const int invalid_algorithm = 2131230869; + // aapt resource value: 0x7f080094 + public const int install_from_website = 2131230868; // aapt resource value: 0x7f080096 - public const int invalid_db_sig = 2131230870; + public const int invalid_algorithm = 2131230870; + + // aapt resource value: 0x7f080097 + public const int invalid_db_sig = 2131230871; // aapt resource value: 0x7f08000e public const int issues = 2131230734; - // aapt resource value: 0x7f080097 - public const int keyfile_does_not_exist = 2131230871; - // aapt resource value: 0x7f080098 - public const int keyfile_is_empty = 2131230872; + public const int keyfile_does_not_exist = 2131230872; + + // aapt resource value: 0x7f080099 + public const int keyfile_is_empty = 2131230873; // aapt resource value: 0x7f080017 public const int keyfile_key = 2131230743; - // aapt resource value: 0x7f0800e2 - public const int kp2a_findUrl = 2131230946; + // aapt resource value: 0x7f0800e4 + public const int kp2a_findUrl = 2131230948; // aapt resource value: 0x7f080005 public const int label_go_key = 2131230725; @@ -1863,110 +1887,113 @@ namespace keepass2android // aapt resource value: 0x7f080008 public const int label_subtype_generic = 2131230728; - // aapt resource value: 0x7f080099 - public const int length = 2131230873; + // aapt resource value: 0x7f08009a + public const int length = 2131230874; // aapt resource value: 0x7f080009 public const int library_name = 2131230729; - // aapt resource value: 0x7f080030 - public const int list_size_default = 2131230768; + // aapt resource value: 0x7f080031 + public const int list_size_default = 2131230769; // aapt resource value: 0x7f08001a public const int list_size_key = 2131230746; - // aapt resource value: 0x7f08009b - public const int list_size_summary = 2131230875; - - // aapt resource value: 0x7f08009a - public const int list_size_title = 2131230874; - // aapt resource value: 0x7f08009c - public const int loading_database = 2131230876; + 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 lowercase = 2131230877; + public const int loading_database = 2131230877; + + // aapt resource value: 0x7f08009e + public const int lowercase = 2131230878; // aapt resource value: 0x7f080018 public const int maskpass_key = 2131230744; - // aapt resource value: 0x7f0800a0 - public const int maskpass_summary = 2131230880; - - // aapt resource value: 0x7f08009f - public const int maskpass_title = 2131230879; - // aapt resource value: 0x7f0800a1 - public const int menu_about = 2131230881; + public const int maskpass_summary = 2131230881; - // aapt resource value: 0x7f0800a6 - public const int menu_app_settings = 2131230886; + // aapt resource value: 0x7f0800a0 + public const int maskpass_title = 2131230880; // aapt resource value: 0x7f0800a2 - public const int menu_change_key = 2131230882; - - // aapt resource value: 0x7f0800a3 - public const int menu_copy_pass = 2131230883; - - // aapt resource value: 0x7f0800a4 - public const int menu_copy_user = 2131230884; - - // aapt resource value: 0x7f0800a5 - public const int menu_create = 2131230885; + public const int menu_about = 2131230882; // aapt resource value: 0x7f0800a7 - public const int menu_db_settings = 2131230887; + public const int menu_app_settings = 2131230887; + + // 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; // aapt resource value: 0x7f0800a8 - public const int menu_delete = 2131230888; + public const int menu_db_settings = 2131230888; // aapt resource value: 0x7f0800a9 - public const int menu_donate = 2131230889; + public const int menu_delete = 2131230889; // aapt resource value: 0x7f0800aa - public const int menu_edit = 2131230890; + public const int menu_donate = 2131230890; // aapt resource value: 0x7f0800ab - public const int menu_hide_password = 2131230891; + public const int menu_edit = 2131230891; // aapt resource value: 0x7f0800ac - public const int menu_homepage = 2131230892; + public const int menu_hide_password = 2131230892; // aapt resource value: 0x7f0800ad - public const int menu_lock = 2131230893; + public const int menu_homepage = 2131230893; // aapt resource value: 0x7f0800ae - public const int menu_open = 2131230894; + public const int menu_lock = 2131230894; // aapt resource value: 0x7f0800af - public const int menu_rename = 2131230895; + public const int menu_open = 2131230895; // aapt resource value: 0x7f0800b0 - public const int menu_search = 2131230896; + public const int menu_rename = 2131230896; // aapt resource value: 0x7f0800b1 - public const int menu_url = 2131230897; + public const int menu_search = 2131230897; // aapt resource value: 0x7f0800b2 - public const int minus = 2131230898; + public const int menu_search_advanced = 2131230898; // aapt resource value: 0x7f0800b3 - public const int never = 2131230899; + public const int menu_url = 2131230899; + + // aapt resource value: 0x7f0800b4 + public const int minus = 2131230900; // aapt resource value: 0x7f0800b5 - public const int no = 2131230901; - - // aapt resource value: 0x7f0800b6 - public const int no_keys = 2131230902; + public const int never = 2131230901; // aapt resource value: 0x7f0800b7 - public const int no_results = 2131230903; + public const int no = 2131230903; // aapt resource value: 0x7f0800b8 - public const int no_url_handler = 2131230904; + public const int no_keys = 2131230904; - // aapt resource value: 0x7f08004e - public const int not_possible_im_picker = 2131230798; + // aapt resource value: 0x7f0800b9 + public const int no_results = 2131230905; + + // aapt resource value: 0x7f0800ba + public const int no_url_handler = 2131230906; + + // aapt resource value: 0x7f08004f + public const int not_possible_im_picker = 2131230799; // aapt resource value: 0x7f08000f public const int oi_filemanager_market = 2131230735; @@ -1977,11 +2004,11 @@ namespace keepass2android // aapt resource value: 0x7f080019 public const int omitbackup_key = 2131230745; - // aapt resource value: 0x7f0800bb - public const int omitbackup_summary = 2131230907; + // aapt resource value: 0x7f0800bd + public const int omitbackup_summary = 2131230909; - // aapt resource value: 0x7f0800ba - public const int omitbackup_title = 2131230906; + // aapt resource value: 0x7f0800bc + public const int omitbackup_title = 2131230908; // aapt resource value: 0x7f080003 public const int open_entry = 2131230723; @@ -1989,155 +2016,155 @@ namespace keepass2android // aapt resource value: 0x7f080004 public const int open_entry_for_app = 2131230724; - // aapt resource value: 0x7f0800b9 - public const int open_recent = 2131230905; - - // aapt resource value: 0x7f0800bc - public const int pass_filename = 2131230908; - - // aapt resource value: 0x7f0800bd - public const int password_title = 2131230909; - - // aapt resource value: 0x7f08004f - public const int please_activate_keyboard = 2131230799; + // aapt resource value: 0x7f0800bb + public const int open_recent = 2131230907; // aapt resource value: 0x7f0800be - public const int progress_create = 2131230910; + public const int pass_filename = 2131230910; // aapt resource value: 0x7f0800bf - public const int progress_title = 2131230911; + public const int password_title = 2131230911; - // aapt resource value: 0x7f080101 - public const int protection = 2131230977; - - // aapt resource value: 0x7f08011c - public const int rate_app = 2131231004; - - // aapt resource value: 0x7f0800dd - public const int regular_expression = 2131230941; + // aapt resource value: 0x7f080050 + public const int please_activate_keyboard = 2131230800; // aapt resource value: 0x7f0800c0 - public const int remember_keyfile_summary = 2131230912; + public const int progress_create = 2131230912; // aapt resource value: 0x7f0800c1 - public const int remember_keyfile_title = 2131230913; + public const int progress_title = 2131230913; + + // aapt resource value: 0x7f080103 + public const int protection = 2131230979; + + // aapt resource value: 0x7f080120 + public const int rate_app = 2131231008; + + // aapt resource value: 0x7f0800df + public const int regular_expression = 2131230943; // aapt resource value: 0x7f0800c2 - public const int remove_from_filelist = 2131230914; + public const int remember_keyfile_summary = 2131230914; // aapt resource value: 0x7f0800c3 - public const int rijndael = 2131230915; + public const int remember_keyfile_title = 2131230915; // aapt resource value: 0x7f0800c4 - public const int root = 2131230916; + public const int remove_from_filelist = 2131230916; // aapt resource value: 0x7f0800c5 - public const int rounds = 2131230917; + public const int rijndael = 2131230917; // aapt resource value: 0x7f0800c6 - public const int rounds_explaination = 2131230918; + public const int root = 2131230918; // aapt resource value: 0x7f0800c7 - public const int rounds_hint = 2131230919; + public const int rounds = 2131230919; + + // aapt resource value: 0x7f0800c8 + public const int rounds_explaination = 2131230920; + + // aapt resource value: 0x7f0800c9 + public const int rounds_hint = 2131230921; // aapt resource value: 0x7f080016 public const int rounds_key = 2131230742; - // aapt resource value: 0x7f0800ca - public const int saving_database = 2131230922; - - // aapt resource value: 0x7f0800d1 - public const int search_hint = 2131230929; + // aapt resource value: 0x7f0800cc + public const int saving_database = 2131230924; // aapt resource value: 0x7f0800d3 - public const int search_in = 2131230931; - - // aapt resource value: 0x7f0800cc - public const int search_label = 2131230924; - - // aapt resource value: 0x7f0800e4 - public const int search_options = 2131230948; - - // aapt resource value: 0x7f0800d2 - public const int search_results = 2131230930; + public const int search_hint = 2131230931; // aapt resource value: 0x7f0800d5 - public const int select_group_then_add = 2131230933; + 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: 0x7f0800d4 - public const int select_other_entry = 2131230932; + public const int search_results = 2131230932; - // aapt resource value: 0x7f08003d - public const int short_app_name = 2131230781; + // aapt resource value: 0x7f0800d7 + public const int select_group_then_add = 2131230935; - // aapt resource value: 0x7f08003f - public const int short_app_name_nonet = 2131230783; + // aapt resource value: 0x7f0800d6 + public const int select_other_entry = 2131230934; - // aapt resource value: 0x7f0800cd - public const int show_password = 2131230925; + // aapt resource value: 0x7f08003e + public const int short_app_name = 2131230782; + + // aapt resource value: 0x7f080040 + public const int short_app_name_nonet = 2131230784; // aapt resource value: 0x7f0800cf - public const int sort_db = 2131230927; + public const int show_password = 2131230927; + + // aapt resource value: 0x7f0800d1 + public const int sort_db = 2131230929; // aapt resource value: 0x7f08001b public const int sort_key = 2131230747; - // aapt resource value: 0x7f0800ce - public const int sort_name = 2131230926; - - // aapt resource value: 0x7f0800cb - public const int space = 2131230923; - // aapt resource value: 0x7f0800d0 - public const int special = 2131230928; + public const int sort_name = 2131230928; - // aapt resource value: 0x7f0800e7 - public const int start_create = 2131230951; + // aapt resource value: 0x7f0800cd + public const int space = 2131230925; + + // aapt resource value: 0x7f0800d2 + public const int special = 2131230930; // aapt resource value: 0x7f0800e9 - public const int start_create_import = 2131230953; + public const int start_create = 2131230953; - // aapt resource value: 0x7f0800e6 - public const int start_open_file = 2131230950; + // aapt resource value: 0x7f0800eb + public const int start_create_import = 2131230955; // aapt resource value: 0x7f0800e8 - public const int start_open_url = 2131230952; + public const int start_open_file = 2131230952; - // aapt resource value: 0x7f08011b - public const int suggest_improvements = 2131231003; + // aapt resource value: 0x7f0800ea + public const int start_open_url = 2131230954; + + // aapt resource value: 0x7f08011f + public const int suggest_improvements = 2131231007; // aapt resource value: 0x7f08001c public const int timeout_key = 2131230748; - // aapt resource value: 0x7f08011d - public const int translate_app = 2131231005; - - // aapt resource value: 0x7f0800d6 - public const int twofish = 2131230934; - - // aapt resource value: 0x7f0800d7 - public const int underline = 2131230935; + // aapt resource value: 0x7f080121 + public const int translate_app = 2131231009; // aapt resource value: 0x7f0800d8 - public const int unsupported_db_version = 2131230936; + public const int twofish = 2131230936; // aapt resource value: 0x7f0800d9 - public const int uppercase = 2131230937; - - // aapt resource value: 0x7f0800dc - public const int version_label = 2131230940; + public const int underline = 2131230937; // aapt resource value: 0x7f0800da - public const int warning_read_only = 2131230938; + public const int unsupported_db_version = 2131230938; // aapt resource value: 0x7f0800db - public const int warning_unmounted = 2131230939; + public const int uppercase = 2131230939; + + // aapt resource value: 0x7f0800de + public const int version_label = 2131230942; + + // aapt resource value: 0x7f0800dc + public const int warning_read_only = 2131230940; + + // aapt resource value: 0x7f0800dd + public const int warning_unmounted = 2131230941; // aapt resource value: 0x7f080001 public const int word_separators = 2131230721; - // aapt resource value: 0x7f0800b4 - public const int yes = 2131230900; + // aapt resource value: 0x7f0800b6 + public const int yes = 2131230902; static String() { diff --git a/src/keepass2android/Resources/values/config.xml b/src/keepass2android/Resources/values/config.xml index 24123a43..f136d32d 100644 --- a/src/keepass2android/Resources/values/config.xml +++ b/src/keepass2android/Resources/values/config.xml @@ -61,6 +61,8 @@ LastInfoVersion UseFileTransactions + CheckForFileChangesOnSave + market://details?id= https://keepass2android.codeplex.com/workitem/list/basic http://crowdin.net/project/keepass2android diff --git a/src/keepass2android/Resources/values/strings.xml b/src/keepass2android/Resources/values/strings.xml index f18674da..a2976f12 100644 --- a/src/keepass2android/Resources/values/strings.xml +++ b/src/keepass2android/Resources/values/strings.xml @@ -218,6 +218,9 @@ Enter server credentials File transactions Use file transactions for writing databases + Check for modifications + Check whether the file was modified externally before saving changes. + Clipboard notifications Make username and password accessible through the notification bar and clipboard. Beware of password sniffers! KP2A keyboard notification @@ -251,9 +254,23 @@ Decoding database… Parsing database… Checking target file for changes… - - Change log - Version 0.8.3\n + Merge changes? + The database file was modified externally. Do you want to load and merge the changes before saving? Select No if you want to overwrite the external changes. + Merging changes… + + Change log + + Version 0.8.4\n + * External changes are detected and merged when saving\n + * Improved loading performance\n + * Improved search toolbar with suggestions\n + ? New app logo!\n + ? Added support for .kdbp format for faster loading/saving\n + ? Improved editing of extra strings and hidden display when protected\n + Thanks to Alex Vallat for his code contributions!\n + Thanks to Niki Hüttner (www.close-cut.de) for the new logo!\n + + Version 0.8.3\n * Username/TAN index displayed in entry list (see settings)\n * Entries can be created if search from browser doesn\'t return results\n * KP2A keyboard provides possibility to search for credentials for current app\n diff --git a/src/keepass2android/Resources/xml/preferences.xml b/src/keepass2android/Resources/xml/preferences.xml index 08dd6b09..075852ca 100644 --- a/src/keepass2android/Resources/xml/preferences.xml +++ b/src/keepass2android/Resources/xml/preferences.xml @@ -148,7 +148,14 @@ android:summary="@string/UseFileTransactions_summary" android:defaultValue="true" android:title="@string/UseFileTransactions_title" - android:key="@string/UseFileTransactions_key" /> - + android:key="@string/UseFileTransactions_key" /> + + diff --git a/src/keepass2android/app/App.cs b/src/keepass2android/app/App.cs index 29e7c909..425449f5 100644 --- a/src/keepass2android/app/App.cs +++ b/src/keepass2android/app/App.cs @@ -103,6 +103,8 @@ namespace keepass2android return prefs.GetBoolean(ctx.Resources.GetString(Resource.String.keyfile_key), ctx.Resources.GetBoolean(Resource.Boolean.keyfile_default)); case PreferenceKey.UseFileTransactions: return prefs.GetBoolean(ctx.Resources.GetString(Resource.String.UseFileTransactions_key), true); + case PreferenceKey.CheckForFileChangesOnSave: + return prefs.GetBoolean(ctx.Resources.GetString(Resource.String.CheckForFileChangesOnSave_key), true); default: throw new Exception("unexpected key!"); } @@ -163,22 +165,25 @@ namespace keepass2android EventHandler cancelHandler, Context ctx) { + Handler handler = new Handler(Looper.MainLooper); + handler.Post(() => + { + AlertDialog.Builder builder = new AlertDialog.Builder(ctx); + builder.SetTitle(GetResourceString(titleKey)); - AlertDialog.Builder builder = new AlertDialog.Builder(ctx); - builder.SetTitle(GetResourceString(titleKey)); + builder.SetMessage(GetResourceString(messageKey)); - builder.SetMessage(GetResourceString(messageKey)); + builder.SetPositiveButton(Resource.String.yes, yesHandler); - builder.SetPositiveButton(Resource.String.yes, yesHandler); + builder.SetNegativeButton(Resource.String.no, noHandler); - builder.SetNegativeButton(Resource.String.no, noHandler); - - builder.SetNeutralButton(ctx.GetString(Android.Resource.String.Cancel), - cancelHandler); - - Dialog dialog = builder.Create(); - dialog.Show(); + builder.SetNeutralButton(ctx.GetString(Android.Resource.String.Cancel), + cancelHandler); + Dialog dialog = builder.Create(); + dialog.Show(); + } + ); } public Handler UiThreadHandler diff --git a/src/keepass2android/keepass2android.csproj b/src/keepass2android/keepass2android.csproj index 18478ec4..2db67b8a 100644 --- a/src/keepass2android/keepass2android.csproj +++ b/src/keepass2android/keepass2android.csproj @@ -371,7 +371,9 @@ - + + Designer +