Add option to always merge on conflict, closes https://github.com/PhilippC/keepass2android/issues/1218
This commit is contained in:
@@ -21,6 +21,7 @@ using System.Security.Cryptography;
|
|||||||
using Android.App;
|
using Android.App;
|
||||||
using Android.Content;
|
using Android.Content;
|
||||||
using Android.OS;
|
using Android.OS;
|
||||||
|
using Android.Preferences;
|
||||||
using Java.Lang;
|
using Java.Lang;
|
||||||
using KeePassLib;
|
using KeePassLib;
|
||||||
using KeePassLib.Serialization;
|
using KeePassLib.Serialization;
|
||||||
@@ -129,6 +130,17 @@ namespace keepass2android
|
|||||||
{
|
{
|
||||||
Kp2aLog.Log("Conflict. " + hasStreamForOrigFile + " " + hasChangeFast + " " + hasHashChanged);
|
Kp2aLog.Log("Conflict. " + hasStreamForOrigFile + " " + hasChangeFast + " " + hasHashChanged);
|
||||||
|
|
||||||
|
bool alwaysMerge = (PreferenceManager.GetDefaultSharedPreferences(Application.Context)
|
||||||
|
.GetBoolean("AlwaysMergeOnConflict", false));
|
||||||
|
|
||||||
|
if (alwaysMerge)
|
||||||
|
{
|
||||||
|
MergeAndFinish(fileStorage, ioc);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
|
||||||
|
|
||||||
//ask user...
|
//ask user...
|
||||||
_app.AskYesNoCancel(UiStringKey.TitleSyncQuestion, UiStringKey.MessageSyncQuestion,
|
_app.AskYesNoCancel(UiStringKey.TitleSyncQuestion, UiStringKey.MessageSyncQuestion,
|
||||||
UiStringKey.YesSynchronize,
|
UiStringKey.YesSynchronize,
|
||||||
@@ -136,16 +148,7 @@ namespace keepass2android
|
|||||||
//yes = sync
|
//yes = sync
|
||||||
(sender, args) =>
|
(sender, args) =>
|
||||||
{
|
{
|
||||||
Action runHandler = () =>
|
Action runHandler = () => { MergeAndFinish(fileStorage, ioc); };
|
||||||
{
|
|
||||||
//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.
|
|
||||||
MergeIn(fileStorage, ioc);
|
|
||||||
PerformSaveWithoutCheck(fileStorage, ioc);
|
|
||||||
_db.UpdateGlobals();
|
|
||||||
Finish(true);
|
|
||||||
};
|
|
||||||
RunInWorkerThread(runHandler);
|
RunInWorkerThread(runHandler);
|
||||||
},
|
},
|
||||||
//no = overwrite
|
//no = overwrite
|
||||||
@@ -164,6 +167,8 @@ namespace keepass2android
|
|||||||
},
|
},
|
||||||
_ctx
|
_ctx
|
||||||
);
|
);
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
@@ -193,6 +198,17 @@ namespace keepass2android
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private void MergeAndFinish(IFileStorage fileStorage, IOConnectionInfo ioc)
|
||||||
|
{
|
||||||
|
//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.
|
||||||
|
MergeIn(fileStorage, ioc);
|
||||||
|
PerformSaveWithoutCheck(fileStorage, ioc);
|
||||||
|
_db.UpdateGlobals();
|
||||||
|
Finish(true);
|
||||||
|
}
|
||||||
|
|
||||||
private void RunInWorkerThread(Action runHandler)
|
private void RunInWorkerThread(Action runHandler)
|
||||||
{
|
{
|
||||||
try
|
try
|
||||||
|
|||||||
@@ -50,6 +50,7 @@
|
|||||||
|
|
||||||
<!-- Preference settings -->
|
<!-- Preference settings -->
|
||||||
<string name="AutoReturnFromQuery_key">AutoReturnFromQuery_key</string>
|
<string name="AutoReturnFromQuery_key">AutoReturnFromQuery_key</string>
|
||||||
|
<string name="AlwaysMergeOnConflict_key">AlwaysMergeOnConflict</string>
|
||||||
<string name="NoDalVerification_key">NoDalVerification_key</string>
|
<string name="NoDalVerification_key">NoDalVerification_key</string>
|
||||||
<string name="InlineSuggestions_key">InlineSuggestions_key</string>
|
<string name="InlineSuggestions_key">InlineSuggestions_key</string>
|
||||||
<string name="algorithm_key">algorithm</string>
|
<string name="algorithm_key">algorithm</string>
|
||||||
|
|||||||
@@ -311,6 +311,8 @@
|
|||||||
<string name="please_note">Please note</string>
|
<string name="please_note">Please note</string>
|
||||||
<string name="contributors">Contributors</string>
|
<string name="contributors">Contributors</string>
|
||||||
<string name="regular_expression">Regular expression</string>
|
<string name="regular_expression">Regular expression</string>
|
||||||
|
<string name="AlwaysMergeOnConflict_title">Always merge on conflict</string>
|
||||||
|
<string name="AlwaysMergeOnConflict_summary">When Keepass2Android detects that the remote file was modified, always merge the local changes with the remote changes.</string>
|
||||||
<string name="TanExpiresOnUse_title">TAN expires on use</string>
|
<string name="TanExpiresOnUse_title">TAN expires on use</string>
|
||||||
<string name="TanExpiresOnUse_summary">Mark TAN entries expired when using them</string>
|
<string name="TanExpiresOnUse_summary">Mark TAN entries expired when using them</string>
|
||||||
<string name="ShowUsernameInList_title">Display username in list</string>
|
<string name="ShowUsernameInList_title">Display username in list</string>
|
||||||
|
|||||||
@@ -576,6 +576,14 @@
|
|||||||
android:key="@string/SyncAfterQuickUnlock_key" />
|
android:key="@string/SyncAfterQuickUnlock_key" />
|
||||||
|
|
||||||
<CheckBoxPreference
|
<CheckBoxPreference
|
||||||
|
android:enabled="true"
|
||||||
|
android:persistent="true"
|
||||||
|
android:summary="@string/AlwaysMergeOnConflict_summary"
|
||||||
|
android:defaultValue="false"
|
||||||
|
android:title="@string/AlwaysMergeOnConflict_title"
|
||||||
|
android:key="@string/AlwaysMergeOnConflict_key" />
|
||||||
|
|
||||||
|
<CheckBoxPreference
|
||||||
android:key="@string/TanExpiresOnUse_key"
|
android:key="@string/TanExpiresOnUse_key"
|
||||||
android:title="@string/TanExpiresOnUse_title"
|
android:title="@string/TanExpiresOnUse_title"
|
||||||
android:summary="@string/TanExpiresOnUse_summary"
|
android:summary="@string/TanExpiresOnUse_summary"
|
||||||
|
|||||||
Reference in New Issue
Block a user