diff --git a/src/Kp2aBusinessLogic/ProgressDialogStatusLogger.cs b/src/Kp2aBusinessLogic/ProgressDialogStatusLogger.cs index f3849e46..510434ec 100644 --- a/src/Kp2aBusinessLogic/ProgressDialogStatusLogger.cs +++ b/src/Kp2aBusinessLogic/ProgressDialogStatusLogger.cs @@ -30,8 +30,12 @@ namespace keepass2android readonly IKp2aApp _app; private readonly Handler _handler; private string _message = ""; + private string _submessage; - public ProgressDialogStatusLogger() { + public String SubMessage => _submessage; + public String Message => _message; + + public ProgressDialogStatusLogger() { } @@ -56,6 +60,7 @@ namespace keepass2android public void UpdateSubMessage(String submessage) { + _submessage = submessage; if (_app != null && _progressDialog != null && _handler != null) { _handler.Post(() => diff --git a/src/Kp2aBusinessLogic/ProgressTask.cs b/src/Kp2aBusinessLogic/ProgressTask.cs index b26fc667..08c76b70 100644 --- a/src/Kp2aBusinessLogic/ProgressTask.cs +++ b/src/Kp2aBusinessLogic/ProgressTask.cs @@ -25,33 +25,94 @@ namespace keepass2android /// /// Class to run a task while a progress dialog is shown /// - public class ProgressTask { - private readonly Handler _handler; + public class ProgressTask + { + //for handling Activity recreation situations, we need access to the currently active task. It must hold that there is no more than one active task. + private static ProgressTask _currentTask = null; + + public static void SetNewActiveActivity(Activity activeActivity) + { + if (_currentTask != null) + { + _currentTask.ActiveActivity = activeActivity; + } + } + public static void RemoveActiveActivity(Activity activity) + { + if ((_currentTask != null) && (_currentTask._activeActivity == activity)) + _currentTask.ActiveActivity = null; + + } + + public Activity ActiveActivity + { + get { return _activeActivity; } + private set + { + _activeActivity = value; + if (_task != null) + _task.ActiveActivity = _activeActivity; + if (_activeActivity != null) + { + SetupProgressDialog(_app); + _progressDialog.Show(); + } + } + } + + private readonly Handler _handler; private readonly RunnableOnFinish _task; - private readonly IProgressDialog _progressDialog; + private IProgressDialog _progressDialog; private readonly IKp2aApp _app; private Thread _thread; + private Activity _activeActivity; + private ProgressDialogStatusLogger _progressDialogStatusLogger; - public ProgressTask(IKp2aApp app, Context ctx, RunnableOnFinish task) { + public ProgressTask(IKp2aApp app, Activity activity, RunnableOnFinish task) + { + _activeActivity = activity; _task = task; _handler = app.UiThreadHandler; _app = app; - // Show process dialog - _progressDialog = app.CreateProgressDialog(ctx); - _progressDialog.SetTitle(_app.GetResourceString(UiStringKey.progress_title)); - _progressDialog.SetMessage("Initializing..."); - - // Set code to run when this is finished - _task.OnFinishToRun = new AfterTask(task.OnFinishToRun, _handler, _progressDialog); - _task.SetStatusLogger(new ProgressDialogStatusLogger(_app, _handler, _progressDialog)); + SetupProgressDialog(app); + + // Set code to run when this is finished + _task.OnFinishToRun = new AfterTask(activity, task.OnFinishToRun, _handler, this); + + _task.SetStatusLogger(_progressDialogStatusLogger); } - - public void Run() { - // Show process dialog - _progressDialog.Show(); + + private void SetupProgressDialog(IKp2aApp app) + { + string currentMessage = "Initializing..."; + string currentSubmessage = ""; + + if (_progressDialogStatusLogger != null) + { + currentMessage = _progressDialogStatusLogger.Message; + currentSubmessage = _progressDialogStatusLogger.SubMessage; + } + + + // Show process dialog + _progressDialog = app.CreateProgressDialog(_activeActivity); + _progressDialog.SetTitle(_app.GetResourceString(UiStringKey.progress_title)); + _progressDialogStatusLogger = new ProgressDialogStatusLogger(_app, _handler, _progressDialog); + _progressDialogStatusLogger.UpdateMessage(currentMessage); + _progressDialogStatusLogger.UpdateSubMessage(currentSubmessage); + } + + public void Run(bool allowOverwriteCurrentTask = false) + { + if ((!allowOverwriteCurrentTask) && (_currentTask != null)) + throw new Exception("Cannot start another ProgressTask while ProgressTask is already running! " + _task.GetType().Name + "/" + _currentTask._task.GetType().Name); + _currentTask = this; + + // Show process dialog + _progressDialog.Show(); // Start Thread to Run task @@ -66,11 +127,11 @@ namespace keepass2android } private class AfterTask : OnFinish { - readonly IProgressDialog _progressDialog; + readonly ProgressTask _progressTask; - public AfterTask (OnFinish finish, Handler handler, IProgressDialog pd): base(finish, handler) + public AfterTask (Activity activity, OnFinish finish, Handler handler, ProgressTask pt): base(activity, finish, handler) { - _progressDialog = pd; + _progressTask = pt; } public override void Run() { @@ -79,17 +140,19 @@ namespace keepass2android if (Handler != null) //can be null in tests { // Remove the progress dialog - Handler.Post(delegate { _progressDialog.Dismiss(); }); + Handler.Post(delegate { _progressTask._progressDialog.Dismiss(); }); } else { - _progressDialog.Dismiss(); + _progressTask._progressDialog.Dismiss(); } + _currentTask = null; } } - + + } } diff --git a/src/Kp2aBusinessLogic/database/CheckDatabaseForChanges.cs b/src/Kp2aBusinessLogic/database/CheckDatabaseForChanges.cs index 3bc976b9..d9ceef73 100644 --- a/src/Kp2aBusinessLogic/database/CheckDatabaseForChanges.cs +++ b/src/Kp2aBusinessLogic/database/CheckDatabaseForChanges.cs @@ -18,8 +18,8 @@ namespace keepass2android private readonly IKp2aApp _app; - public CheckDatabaseForChanges(Context context, IKp2aApp app, OnFinish finish) - : base(finish) + public CheckDatabaseForChanges(Activity context, IKp2aApp app, OnFinish finish) + : base(context, finish) { _context = context; _app = app; diff --git a/src/Kp2aBusinessLogic/database/Database.cs b/src/Kp2aBusinessLogic/database/Database.cs index 7d09bf39..6956e7b2 100644 --- a/src/Kp2aBusinessLogic/database/Database.cs +++ b/src/Kp2aBusinessLogic/database/Database.cs @@ -21,7 +21,6 @@ using System.IO; using System.Runtime.Serialization; using System.Security.Cryptography; using System.Text; -using Android.Content; using Java.Lang; using KeePassLib; using KeePassLib.Keys; @@ -218,7 +217,7 @@ namespace keepass2android } - public void SaveData(Context ctx) { + public void SaveData() { KpDatabase.UseFileTransactions = _app.GetBooleanPreference(PreferenceKey.UseFileTransactions); using (IWriteTransaction trans = _app.GetFileStorage(Ioc).OpenWriteTransaction(Ioc, KpDatabase.UseFileTransactions)) diff --git a/src/Kp2aBusinessLogic/database/SynchronizeCachedDatabase.cs b/src/Kp2aBusinessLogic/database/SynchronizeCachedDatabase.cs index dc8e367a..bd8c7ca1 100644 --- a/src/Kp2aBusinessLogic/database/SynchronizeCachedDatabase.cs +++ b/src/Kp2aBusinessLogic/database/SynchronizeCachedDatabase.cs @@ -11,12 +11,12 @@ namespace keepass2android { public class SynchronizeCachedDatabase: RunnableOnFinish { - private readonly Context _context; + private readonly Activity _context; private readonly IKp2aApp _app; private SaveDb _saveDb; - public SynchronizeCachedDatabase(Context context, IKp2aApp app, OnFinish finish) - : base(finish) + public SynchronizeCachedDatabase(Activity context, IKp2aApp app, OnFinish finish) + : base(context, finish) { _context = context; _app = app; @@ -59,7 +59,7 @@ namespace keepass2android if (cachingFileStorage.HasLocalChanges(ioc)) { //conflict! need to merge - _saveDb = new SaveDb(_context, _app, new ActionOnFinish((success, result) => + _saveDb = new SaveDb(_context, _app, new ActionOnFinish(ActiveActivity, (success, result, activity) => { if (!success) { diff --git a/src/Kp2aBusinessLogic/database/edit/ActionOnFinish.cs b/src/Kp2aBusinessLogic/database/edit/ActionOnFinish.cs index f9446ebf..f7a7f910 100644 --- a/src/Kp2aBusinessLogic/database/edit/ActionOnFinish.cs +++ b/src/Kp2aBusinessLogic/database/edit/ActionOnFinish.cs @@ -16,41 +16,37 @@ This file is part of Keepass2Android, Copyright 2013 Philipp Crocoll. */ using System; +using Android.App; using Android.OS; namespace keepass2android { public class ActionOnFinish: OnFinish { - public delegate void ActionToPerformOnFinsh(bool success, String message); + public delegate void ActionToPerformOnFinsh(bool success, String message, Activity activeActivity); readonly ActionToPerformOnFinsh _actionToPerform; - public ActionOnFinish(ActionToPerformOnFinsh actionToPerform) : base(null, null) + public ActionOnFinish(Activity activity, ActionToPerformOnFinsh actionToPerform) : base(activity, null, null) { _actionToPerform = actionToPerform; } - public ActionOnFinish(ActionToPerformOnFinsh actionToPerform, OnFinish finish) : base(finish) + public ActionOnFinish(Activity activity, ActionToPerformOnFinsh actionToPerform, OnFinish finish) : base(activity, finish) { _actionToPerform = actionToPerform; } - - public ActionOnFinish(ActionToPerformOnFinsh actionToPerform, Handler handler) : base(handler) - { - _actionToPerform = actionToPerform; - } - + public override void Run() { if (Message == null) Message = ""; if (Handler != null) { - Handler.Post(() => {_actionToPerform(Success, Message);}); + Handler.Post(() => {_actionToPerform(Success, Message, ActiveActivity);}); } else - _actionToPerform(Success, Message); + _actionToPerform(Success, Message, ActiveActivity); base.Run(); } } diff --git a/src/Kp2aBusinessLogic/database/edit/AddEntry.cs b/src/Kp2aBusinessLogic/database/edit/AddEntry.cs index 6c4c313b..7cfcfda4 100644 --- a/src/Kp2aBusinessLogic/database/edit/AddEntry.cs +++ b/src/Kp2aBusinessLogic/database/edit/AddEntry.cs @@ -15,6 +15,7 @@ This file is part of Keepass2Android, Copyright 2013 Philipp Crocoll. This file along with Keepass2Android. If not, see . */ +using Android.App; using Android.Content; using KeePassLib; @@ -29,20 +30,20 @@ namespace keepass2android private readonly IKp2aApp _app; private readonly PwEntry _entry; private readonly PwGroup _parentGroup; - private readonly Context _ctx; + private readonly Activity _ctx; - public static AddEntry GetInstance(Context ctx, IKp2aApp app, PwEntry entry, PwGroup parentGroup, OnFinish finish) { + public static AddEntry GetInstance(Activity ctx, IKp2aApp app, PwEntry entry, PwGroup parentGroup, OnFinish finish) { return new AddEntry(ctx, app, entry, parentGroup, finish); } - protected AddEntry(Context ctx, IKp2aApp app, PwEntry entry, PwGroup parentGroup, OnFinish finish):base(finish) { + protected AddEntry(Activity ctx, IKp2aApp app, PwEntry entry, PwGroup parentGroup, OnFinish finish):base(ctx, finish) { _ctx = ctx; _parentGroup = parentGroup; _app = app; _entry = entry; - _onFinishToRun = new AfterAdd(app.GetDb(), entry, OnFinishToRun); + _onFinishToRun = new AfterAdd(ctx, app.GetDb(), entry, OnFinishToRun); } @@ -68,7 +69,7 @@ namespace keepass2android private readonly Database _db; private readonly PwEntry _entry; - public AfterAdd(Database db, PwEntry entry, OnFinish finish):base(finish) { + public AfterAdd(Activity activity, Database db, PwEntry entry, OnFinish finish):base(activity, finish) { _db = db; _entry = entry; diff --git a/src/Kp2aBusinessLogic/database/edit/AddGroup.cs b/src/Kp2aBusinessLogic/database/edit/AddGroup.cs index 69597dd8..f052dcfb 100644 --- a/src/Kp2aBusinessLogic/database/edit/AddGroup.cs +++ b/src/Kp2aBusinessLogic/database/edit/AddGroup.cs @@ -16,6 +16,7 @@ This file is part of Keepass2Android, Copyright 2013 Philipp Crocoll. This file */ using System; +using Android.App; using Android.Content; using KeePassLib; @@ -34,16 +35,16 @@ namespace keepass2android internal PwGroup Group; internal PwGroup Parent; protected bool DontSave; - readonly Context _ctx; + readonly Activity _ctx; - public static AddGroup GetInstance(Context ctx, IKp2aApp app, string name, int iconid, PwUuid groupCustomIconId, PwGroup parent, OnFinish finish, bool dontSave) { + public static AddGroup GetInstance(Activity ctx, IKp2aApp app, string name, int iconid, PwUuid groupCustomIconId, PwGroup parent, OnFinish finish, bool dontSave) { return new AddGroup(ctx, app, name, iconid, groupCustomIconId, parent, finish, dontSave); } - private AddGroup(Context ctx, IKp2aApp app, String name, int iconid, PwUuid groupCustomIconId, PwGroup parent, OnFinish finish, bool dontSave) - : base(finish) + private AddGroup(Activity ctx, IKp2aApp app, String name, int iconid, PwUuid groupCustomIconId, PwGroup parent, OnFinish finish, bool dontSave) + : base(ctx, finish) { _ctx = ctx; _name = name; @@ -53,7 +54,7 @@ namespace keepass2android DontSave = dontSave; _app = app; - _onFinishToRun = new AfterAdd(this, OnFinishToRun); + _onFinishToRun = new AfterAdd(ctx, this, OnFinishToRun); } @@ -76,7 +77,7 @@ namespace keepass2android private class AfterAdd : OnFinish { readonly AddGroup _addGroup; - public AfterAdd(AddGroup addGroup,OnFinish finish): base(finish) { + public AfterAdd(Activity activity, AddGroup addGroup,OnFinish finish): base(activity, finish) { _addGroup = addGroup; } diff --git a/src/Kp2aBusinessLogic/database/edit/AddTemplateEntries.cs b/src/Kp2aBusinessLogic/database/edit/AddTemplateEntries.cs index f79b7a83..c2b39b63 100644 --- a/src/Kp2aBusinessLogic/database/edit/AddTemplateEntries.cs +++ b/src/Kp2aBusinessLogic/database/edit/AddTemplateEntries.cs @@ -18,6 +18,7 @@ This file is part of Keepass2Android, Copyright 2016 Philipp Crocoll. This file using System; using System.Collections.Generic; using System.Linq; +using Android.App; using Android.Content; using KeePassLib; using KeePassLib.Security; @@ -128,10 +129,10 @@ namespace keepass2android } private readonly IKp2aApp _app; - private readonly Context _ctx; + private readonly Activity _ctx; - public AddTemplateEntries(Context ctx, IKp2aApp app, OnFinish finish) - : base(finish) + public AddTemplateEntries(Activity ctx, IKp2aApp app, OnFinish finish) + : base(ctx, finish) { _ctx = ctx; _app = app; @@ -358,7 +359,7 @@ namespace keepass2android private readonly Database _db; private readonly List _entries; - public AfterAdd(Database db, List entries, OnFinish finish):base(finish) { + public AfterAdd(Activity activity, Database db, List entries, OnFinish finish):base(activity, finish) { _db = db; _entries = entries; diff --git a/src/Kp2aBusinessLogic/database/edit/CopyEntry.cs b/src/Kp2aBusinessLogic/database/edit/CopyEntry.cs index 14ffd7bb..74ece4a9 100644 --- a/src/Kp2aBusinessLogic/database/edit/CopyEntry.cs +++ b/src/Kp2aBusinessLogic/database/edit/CopyEntry.cs @@ -16,7 +16,7 @@ namespace keepass2android.database.edit { public class CopyEntry: AddEntry { - public CopyEntry(Context ctx, IKp2aApp app, PwEntry entry, OnFinish finish) + public CopyEntry(Activity ctx, IKp2aApp app, PwEntry entry, OnFinish finish) : base(ctx, app, CreateCopy(entry, app), entry.ParentGroup, finish) { } diff --git a/src/Kp2aBusinessLogic/database/edit/CreateDB.cs b/src/Kp2aBusinessLogic/database/edit/CreateDB.cs index f35df74c..2e066ca2 100644 --- a/src/Kp2aBusinessLogic/database/edit/CreateDB.cs +++ b/src/Kp2aBusinessLogic/database/edit/CreateDB.cs @@ -16,6 +16,7 @@ This file is part of Keepass2Android, Copyright 2013 Philipp Crocoll. This file */ using System.Collections.Generic; +using Android.App; using Android.Content; using KeePassLib; using KeePassLib.Cryptography.KeyDerivation; @@ -31,19 +32,19 @@ namespace keepass2android private readonly IOConnectionInfo _ioc; private readonly bool _dontSave; - private readonly Context _ctx; + private readonly Activity _ctx; private readonly IKp2aApp _app; private CompositeKey _key; - public CreateDb(IKp2aApp app, Context ctx, IOConnectionInfo ioc, OnFinish finish, bool dontSave): base(finish) { + public CreateDb(IKp2aApp app, Activity ctx, IOConnectionInfo ioc, OnFinish finish, bool dontSave): base(ctx, finish) { _ctx = ctx; _ioc = ioc; _dontSave = dontSave; _app = app; } - public CreateDb(IKp2aApp app, Context ctx, IOConnectionInfo ioc, OnFinish finish, bool dontSave, CompositeKey key) - : base(finish) + public CreateDb(IKp2aApp app, Activity ctx, IOConnectionInfo ioc, OnFinish finish, bool dontSave, CompositeKey key) + : base(ctx, finish) { _ctx = ctx; _ioc = ioc; diff --git a/src/Kp2aBusinessLogic/database/edit/DeleteEntry.cs b/src/Kp2aBusinessLogic/database/edit/DeleteEntry.cs index 533d56cd..047e0d5c 100644 --- a/src/Kp2aBusinessLogic/database/edit/DeleteEntry.cs +++ b/src/Kp2aBusinessLogic/database/edit/DeleteEntry.cs @@ -17,6 +17,7 @@ This file is part of Keepass2Android, Copyright 2013 Philipp Crocoll. This file using System; using System.Collections.Generic; +using Android.App; using Android.Content; using KeePassLib; using KeePassLib.Interfaces; @@ -28,8 +29,8 @@ namespace keepass2android private readonly PwEntry _entry; private UiStringKey _statusMessage; - public DeleteEntry(Context ctx, IKp2aApp app, PwEntry entry, OnFinish finish):base(finish, app) { - Ctx = ctx; + public DeleteEntry(Activity activiy, IKp2aApp app, PwEntry entry, OnFinish finish):base(activiy, finish, app) { + Ctx = activiy; Db = app.GetDb(); _entry = entry; diff --git a/src/Kp2aBusinessLogic/database/edit/DeleteGroup.cs b/src/Kp2aBusinessLogic/database/edit/DeleteGroup.cs index 7a764953..a0f3c414 100644 --- a/src/Kp2aBusinessLogic/database/edit/DeleteGroup.cs +++ b/src/Kp2aBusinessLogic/database/edit/DeleteGroup.cs @@ -17,6 +17,7 @@ This file is part of Keepass2Android, Copyright 2013 Philipp Crocoll. This file using System; using System.Collections.Generic; +using Android.App; using Android.Content; using KeePassLib; @@ -28,10 +29,10 @@ namespace keepass2android private PwGroup _group; protected bool DontSave; - public DeleteGroup(Context ctx, IKp2aApp app, PwGroup group, OnFinish finish) - : base(finish, app) + public DeleteGroup(Activity activity, IKp2aApp app, PwGroup group, OnFinish finish) + : base(activity, finish, app) { - SetMembers(ctx, app, group, false); + SetMembers(activity, app, group, false); } /* public DeleteGroup(Context ctx, Database db, PwGroup group, Activity act, OnFinish finish, bool dontSave) @@ -44,9 +45,9 @@ namespace keepass2android SetMembers(ctx, db, group, null, dontSave); } */ - private void SetMembers(Context ctx, IKp2aApp app, PwGroup group, bool dontSave) + private void SetMembers(Activity activity, IKp2aApp app, PwGroup group, bool dontSave) { - base.SetMembers(ctx, app.GetDb()); + base.SetMembers(activity, app.GetDb()); _group = group; DontSave = dontSave; diff --git a/src/Kp2aBusinessLogic/database/edit/DeleteMultipleItems.cs b/src/Kp2aBusinessLogic/database/edit/DeleteMultipleItems.cs index 620ab150..02f5bcfa 100644 --- a/src/Kp2aBusinessLogic/database/edit/DeleteMultipleItems.cs +++ b/src/Kp2aBusinessLogic/database/edit/DeleteMultipleItems.cs @@ -1,5 +1,6 @@ using System.Collections.Generic; using System.Linq; +using Android.App; using Android.Content; using KeePassLib; using KeePassLib.Interfaces; @@ -11,11 +12,11 @@ namespace keepass2android private readonly List _elementsToDelete; private readonly bool _canRecycle; - public DeleteMultipleItems(Context ctx, Database db, List elementsToDelete, OnFinish finish, IKp2aApp app) - : base(finish, app) + public DeleteMultipleItems(Activity activity, Database db, List elementsToDelete, OnFinish finish, IKp2aApp app) + : base(activity, finish, app) { _elementsToDelete = elementsToDelete; - SetMembers(ctx, db); + SetMembers(activity, db); //determine once. The property is queried for each delete operation, but might return false //after one entry/group is deleted (and thus in recycle bin and thus can't be recycled anymore) diff --git a/src/Kp2aBusinessLogic/database/edit/DeleteRunnable.cs b/src/Kp2aBusinessLogic/database/edit/DeleteRunnable.cs index 50fed440..582aa1de 100644 --- a/src/Kp2aBusinessLogic/database/edit/DeleteRunnable.cs +++ b/src/Kp2aBusinessLogic/database/edit/DeleteRunnable.cs @@ -1,5 +1,6 @@ using System; using System.Collections.Generic; +using Android.App; using Android.Content; using KeePassLib; @@ -7,8 +8,8 @@ namespace keepass2android { public abstract class DeleteRunnable : RunnableOnFinish { - protected DeleteRunnable(OnFinish finish, IKp2aApp app) - : base(finish) + protected DeleteRunnable(Activity activity, OnFinish finish, IKp2aApp app) + : base(activity, finish) { App = app; } @@ -17,11 +18,11 @@ namespace keepass2android protected Database Db; - protected Context Ctx; + protected Activity Ctx; - protected void SetMembers(Context ctx, Database db) + protected void SetMembers(Activity activity, Database db) { - Ctx = ctx; + Ctx = activity; Db = db; } @@ -209,7 +210,7 @@ namespace keepass2android Android.Util.Log.Debug("KP2A", "Calling PerformDelete.."); PerformDelete(touchedGroups, permanentlyDeletedGroups); - _onFinishToRun = new ActionOnFinish((success, message) => + _onFinishToRun = new ActionOnFinish(ActiveActivity,(success, message, activity) => { if (success) { diff --git a/src/Kp2aBusinessLogic/database/edit/EditGroup.cs b/src/Kp2aBusinessLogic/database/edit/EditGroup.cs index a357a91d..fb596011 100644 --- a/src/Kp2aBusinessLogic/database/edit/EditGroup.cs +++ b/src/Kp2aBusinessLogic/database/edit/EditGroup.cs @@ -16,6 +16,7 @@ This file is part of Keepass2Android, Copyright 2013 Philipp Crocoll. This file */ using System; +using Android.App; using Android.Content; using KeePassLib; @@ -32,10 +33,10 @@ namespace keepass2android private readonly PwIcon _iconId; private readonly PwUuid _customIconId; internal PwGroup Group; - readonly Context _ctx; + readonly Activity _ctx; - public EditGroup(Context ctx, IKp2aApp app, String name, PwIcon iconid, PwUuid customIconId, PwGroup group, OnFinish finish) - : base(finish) + public EditGroup(Activity ctx, IKp2aApp app, String name, PwIcon iconid, PwUuid customIconId, PwGroup group, OnFinish finish) + : base(ctx, finish) { _ctx = ctx; _name = name; @@ -44,7 +45,7 @@ namespace keepass2android _customIconId = customIconId; _app = app; - _onFinishToRun = new AfterEdit(this, OnFinishToRun); + _onFinishToRun = new AfterEdit(ctx, this, OnFinishToRun); } @@ -64,8 +65,8 @@ namespace keepass2android private class AfterEdit : OnFinish { readonly EditGroup _editGroup; - public AfterEdit(EditGroup editGroup, OnFinish finish) - : base(finish) + public AfterEdit(Activity ctx, EditGroup editGroup, OnFinish finish) + : base(ctx, finish) { _editGroup = editGroup; } diff --git a/src/Kp2aBusinessLogic/database/edit/FileOnFinish.cs b/src/Kp2aBusinessLogic/database/edit/FileOnFinish.cs index 58c40311..b6f9da21 100644 --- a/src/Kp2aBusinessLogic/database/edit/FileOnFinish.cs +++ b/src/Kp2aBusinessLogic/database/edit/FileOnFinish.cs @@ -16,6 +16,7 @@ This file is part of Keepass2Android, Copyright 2013 Philipp Crocoll. This file */ using System; +using Android.App; namespace keepass2android { @@ -23,7 +24,7 @@ namespace keepass2android public abstract class FileOnFinish : OnFinish { private String _filename = ""; - protected FileOnFinish(FileOnFinish finish):base(finish) { + protected FileOnFinish(Activity activity, FileOnFinish finish):base(activity, finish) { } public string Filename diff --git a/src/Kp2aBusinessLogic/database/edit/LoadDB.cs b/src/Kp2aBusinessLogic/database/edit/LoadDB.cs index 22e8a32b..553d3e94 100644 --- a/src/Kp2aBusinessLogic/database/edit/LoadDB.cs +++ b/src/Kp2aBusinessLogic/database/edit/LoadDB.cs @@ -20,6 +20,7 @@ using System.IO; using System.Linq; using System.Threading; using System.Threading.Tasks; +using Android.App; using KeePassLib; using KeePassLib.Keys; using KeePassLib.Serialization; @@ -35,7 +36,7 @@ namespace keepass2android private readonly bool _rememberKeyfile; IDatabaseFormat _format; - public LoadDb(IKp2aApp app, IOConnectionInfo ioc, Task databaseData, CompositeKey compositeKey, String keyfileOrProvider, OnFinish finish): base(finish) + public LoadDb(Activity activity, IKp2aApp app, IOConnectionInfo ioc, Task databaseData, CompositeKey compositeKey, String keyfileOrProvider, OnFinish finish): base(activity, finish) { _app = app; _ioc = ioc; diff --git a/src/Kp2aBusinessLogic/database/edit/MoveElements.cs b/src/Kp2aBusinessLogic/database/edit/MoveElements.cs index 8b923a22..c5aacf5c 100644 --- a/src/Kp2aBusinessLogic/database/edit/MoveElements.cs +++ b/src/Kp2aBusinessLogic/database/edit/MoveElements.cs @@ -2,6 +2,7 @@ using System.Collections.Generic; using System.Text; using System.Text.RegularExpressions; +using Android.App; using Android.Content; using KeePassLib; using KeePassLib.Interfaces; @@ -12,10 +13,10 @@ namespace keepass2android.database.edit { private readonly List _elementsToMove; private readonly PwGroup _targetGroup; - private readonly Context _ctx; + private readonly Activity _ctx; private readonly IKp2aApp _app; - public MoveElements(List elementsToMove, PwGroup targetGroup, Context ctx, IKp2aApp app, OnFinish finish) : base(finish) + public MoveElements(List elementsToMove, PwGroup targetGroup, Activity ctx, IKp2aApp app, OnFinish finish) : base(ctx, finish) { _elementsToMove = elementsToMove; _targetGroup = targetGroup; @@ -82,7 +83,7 @@ namespace keepass2android.database.edit } - _onFinishToRun = new ActionOnFinish((success, message) => + _onFinishToRun = new ActionOnFinish(ActiveActivity, (success, message, activity) => { if (!success) { // Let's not bother recovering from a failure. diff --git a/src/Kp2aBusinessLogic/database/edit/OnFinish.cs b/src/Kp2aBusinessLogic/database/edit/OnFinish.cs index b01d43a0..ff516c1f 100644 --- a/src/Kp2aBusinessLogic/database/edit/OnFinish.cs +++ b/src/Kp2aBusinessLogic/database/edit/OnFinish.cs @@ -16,6 +16,7 @@ This file is part of Keepass2Android, Copyright 2013 Philipp Crocoll. This file */ using System; +using Android.App; using Android.Content; using Android.OS; using Android.Widget; @@ -31,27 +32,47 @@ namespace keepass2android protected OnFinish BaseOnFinish; protected Handler Handler; private ProgressDialogStatusLogger _statusLogger = new ProgressDialogStatusLogger(); //default: no logging but not null -> can be used whenever desired - + private Activity _activeActivity; - public ProgressDialogStatusLogger StatusLogger + + public ProgressDialogStatusLogger StatusLogger { get { return _statusLogger; } set { _statusLogger = value; } } + public Activity ActiveActivity + { + get { return _activeActivity; } + set + { + _activeActivity = value; + if (BaseOnFinish != null) + { + BaseOnFinish.ActiveActivity = value; + } + } + } - protected OnFinish(Handler handler) { + + protected OnFinish(Activity activeActivity, Handler handler) + { + ActiveActivity = activeActivity; BaseOnFinish = null; Handler = handler; } - protected OnFinish(OnFinish finish, Handler handler) { + protected OnFinish(Activity activeActivity, OnFinish finish, Handler handler) + { + ActiveActivity = activeActivity; BaseOnFinish = finish; Handler = handler; } - protected OnFinish(OnFinish finish) { + protected OnFinish(Activity activeActivity, OnFinish finish) + { + ActiveActivity = activeActivity; BaseOnFinish = finish; Handler = null; } diff --git a/src/Kp2aBusinessLogic/database/edit/RunnableOnFinish.cs b/src/Kp2aBusinessLogic/database/edit/RunnableOnFinish.cs index 91b9c077..6ef58a55 100644 --- a/src/Kp2aBusinessLogic/database/edit/RunnableOnFinish.cs +++ b/src/Kp2aBusinessLogic/database/edit/RunnableOnFinish.cs @@ -15,6 +15,8 @@ This file is part of Keepass2Android, Copyright 2013 Philipp Crocoll. This file along with Keepass2Android. If not, see . */ using System; +using Android.App; +using Android.Content; namespace keepass2android { @@ -23,8 +25,11 @@ namespace keepass2android protected OnFinish _onFinishToRun; public ProgressDialogStatusLogger StatusLogger = new ProgressDialogStatusLogger(); //default: empty but not null + private Activity _activeActivity; - protected RunnableOnFinish(OnFinish finish) { + protected RunnableOnFinish(Activity activeActivity, OnFinish finish) + { + _activeActivity = activeActivity; _onFinishToRun = finish; } @@ -34,7 +39,18 @@ namespace keepass2android set { _onFinishToRun = value; } } - protected void Finish(bool result, String message, Exception exception = null) { + public Activity ActiveActivity + { + get { return _activeActivity; } + set + { + _activeActivity = value; + if (_onFinishToRun != null) + _onFinishToRun.ActiveActivity = _activeActivity; + } + } + + protected void Finish(bool result, String message, Exception exception = null) { if ( OnFinishToRun != null ) { OnFinishToRun.SetResult(result, message, exception); OnFinishToRun.Run(); @@ -56,7 +72,7 @@ namespace keepass2android StatusLogger = status; } - abstract public void Run(); + public abstract void Run(); } } diff --git a/src/Kp2aBusinessLogic/database/edit/SaveDB.cs b/src/Kp2aBusinessLogic/database/edit/SaveDB.cs index 363bde4f..ae2035a3 100644 --- a/src/Kp2aBusinessLogic/database/edit/SaveDB.cs +++ b/src/Kp2aBusinessLogic/database/edit/SaveDB.cs @@ -18,6 +18,7 @@ This file is part of Keepass2Android, Copyright 2013 Philipp Crocoll. This file using System; using System.IO; using System.Security.Cryptography; +using Android.App; using Android.Content; using Android.OS; using Java.Lang; @@ -42,8 +43,8 @@ namespace keepass2android private readonly Context _ctx; private Thread _workerThread; - public SaveDb(Context ctx, IKp2aApp app, OnFinish finish, bool dontSave) - : base(finish) + public SaveDb(Activity ctx, IKp2aApp app, OnFinish finish, bool dontSave) + : base(ctx, finish) { _ctx = ctx; _app = app; @@ -58,8 +59,8 @@ namespace keepass2android /// /// /// Stream for reading the data from the (changed) original location - public SaveDb(Context ctx, IKp2aApp app, OnFinish finish, bool dontSave, Stream streamForOrigFile) - : base(finish) + public SaveDb(Activity ctx, IKp2aApp app, OnFinish finish, bool dontSave, Stream streamForOrigFile) + : base(ctx, finish) { _ctx = ctx; _app = app; @@ -67,8 +68,8 @@ namespace keepass2android _streamForOrigFile = streamForOrigFile; } - public SaveDb(Context ctx, IKp2aApp app, OnFinish finish) - : base(finish) + public SaveDb(Activity ctx, IKp2aApp app, OnFinish finish) + : base(ctx, finish) { _ctx = ctx; _app = app; @@ -248,7 +249,7 @@ namespace keepass2android private void PerformSaveWithoutCheck(IFileStorage fileStorage, IOConnectionInfo ioc) { StatusLogger.UpdateSubMessage(""); - _app.GetDb().SaveData(_ctx); + _app.GetDb().SaveData(); _app.GetDb().LastFileVersion = fileStorage.GetCurrentFileVersionFast(ioc); } diff --git a/src/Kp2aBusinessLogic/database/edit/SetPassword.cs b/src/Kp2aBusinessLogic/database/edit/SetPassword.cs index 521414c3..a3869ef8 100644 --- a/src/Kp2aBusinessLogic/database/edit/SetPassword.cs +++ b/src/Kp2aBusinessLogic/database/edit/SetPassword.cs @@ -15,6 +15,7 @@ This file is part of Keepass2Android, Copyright 2013 Philipp Crocoll. This file along with Keepass2Android. If not, see . */ using System; +using Android.App; using Android.Content; using KeePassLib; using KeePassLib.Keys; @@ -27,9 +28,9 @@ namespace keepass2android private readonly String _keyfile; private readonly IKp2aApp _app; private readonly bool _dontSave; - private readonly Context _ctx; + private readonly Activity _ctx; - public SetPassword(Context ctx, IKp2aApp app, String password, String keyfile, OnFinish finish): base(finish) { + public SetPassword(Activity ctx, IKp2aApp app, String password, String keyfile, OnFinish finish): base(ctx, finish) { _ctx = ctx; _app = app; _password = password; @@ -37,8 +38,8 @@ namespace keepass2android _dontSave = false; } - public SetPassword(Context ctx, IKp2aApp app, String password, String keyfile, OnFinish finish, bool dontSave) - : base(finish) + public SetPassword(Activity ctx, IKp2aApp app, String password, String keyfile, OnFinish finish, bool dontSave) + : base(ctx, finish) { _ctx = ctx; _app = app; @@ -72,7 +73,7 @@ namespace keepass2android pm.MasterKey = newKey; // Save Database - _onFinishToRun = new AfterSave(previousKey, previousMasterKeyChanged, pm, OnFinishToRun); + _onFinishToRun = new AfterSave(ActiveActivity, previousKey, previousMasterKeyChanged, pm, OnFinishToRun); SaveDb save = new SaveDb(_ctx, _app, OnFinishToRun, _dontSave); save.SetStatusLogger(StatusLogger); save.Run(); @@ -83,7 +84,7 @@ namespace keepass2android private readonly DateTime _previousKeyChanged; private readonly PwDatabase _db; - public AfterSave(CompositeKey backup, DateTime previousKeyChanged, PwDatabase db, OnFinish finish): base(finish) { + public AfterSave(Activity activity, CompositeKey backup, DateTime previousKeyChanged, PwDatabase db, OnFinish finish): base(activity, finish) { _previousKeyChanged = previousKeyChanged; _backup = backup; _db = db; diff --git a/src/Kp2aBusinessLogic/database/edit/UpdateEntry.cs b/src/Kp2aBusinessLogic/database/edit/UpdateEntry.cs index e70638d2..4bed5cbf 100644 --- a/src/Kp2aBusinessLogic/database/edit/UpdateEntry.cs +++ b/src/Kp2aBusinessLogic/database/edit/UpdateEntry.cs @@ -15,6 +15,7 @@ This file is part of Keepass2Android, Copyright 2013 Philipp Crocoll. This file along with Keepass2Android. If not, see . */ +using Android.App; using Android.Content; using KeePassLib; @@ -23,13 +24,13 @@ namespace keepass2android public class UpdateEntry : RunnableOnFinish { private readonly IKp2aApp _app; - private readonly Context _ctx; + private readonly Activity _ctx; - public UpdateEntry(Context ctx, IKp2aApp app, PwEntry oldE, PwEntry newE, OnFinish finish):base(finish) { + public UpdateEntry(Activity ctx, IKp2aApp app, PwEntry oldE, PwEntry newE, OnFinish finish):base(ctx, finish) { _ctx = ctx; _app = app; - _onFinishToRun = new AfterUpdate(oldE, newE, app, finish); + _onFinishToRun = new AfterUpdate(ctx, oldE, newE, app, finish); } @@ -45,7 +46,7 @@ namespace keepass2android private readonly PwEntry _updatedEntry; private readonly IKp2aApp _app; - public AfterUpdate(PwEntry backup, PwEntry updatedEntry, IKp2aApp app, OnFinish finish):base(finish) { + public AfterUpdate(Activity activity, PwEntry backup, PwEntry updatedEntry, IKp2aApp app, OnFinish finish):base(activity, finish) { _backup = backup; _updatedEntry = updatedEntry; _app = app; diff --git a/src/keepass2android/CancelDialog.cs b/src/keepass2android/CancelDialog.cs index d7fea910..8053d5eb 100644 --- a/src/keepass2android/CancelDialog.cs +++ b/src/keepass2android/CancelDialog.cs @@ -22,8 +22,12 @@ namespace keepass2android { public class CancelDialog : Dialog { - public CancelDialog(Context context): base(context) { - } + protected readonly Activity _activity; + + public CancelDialog(Activity activity): base(activity) + { + _activity = activity; + } public bool Canceled { get; private set; } diff --git a/src/keepass2android/CreateDatabaseActivity.cs b/src/keepass2android/CreateDatabaseActivity.cs index 82cbdb24..305b3b65 100644 --- a/src/keepass2android/CreateDatabaseActivity.cs +++ b/src/keepass2android/CreateDatabaseActivity.cs @@ -411,15 +411,15 @@ namespace keepass2android } else { - var task = new CreateNewFilename(new ActionOnFinish((success, messageOrFilename) => + var task = new CreateNewFilename(this, new ActionOnFinish(this, (success, messageOrFilename, activity) => { if (!success) { - Toast.MakeText(this, messageOrFilename, ToastLength.Long).Show(); + Toast.MakeText(activity, messageOrFilename, ToastLength.Long).Show(); return; } _ioc = new IOConnectionInfo { Path = ConvertFilenameToIocPath(messageOrFilename) }; - UpdateIocView(); + ((CreateDatabaseActivity)activity)?.UpdateIocView(); }), filename); @@ -471,7 +471,7 @@ namespace keepass2android private readonly IOConnectionInfo _ioc; public LaunchGroupActivity(IOConnectionInfo ioc, CreateDatabaseActivity activity) - : base(null) + : base(activity, null) { _activity = activity; _ioc = ioc; diff --git a/src/keepass2android/CreateNewFilename.cs b/src/keepass2android/CreateNewFilename.cs index cf530f63..f918f458 100644 --- a/src/keepass2android/CreateNewFilename.cs +++ b/src/keepass2android/CreateNewFilename.cs @@ -1,4 +1,5 @@ using System; +using Android.App; using KeePassLib.Serialization; namespace keepass2android @@ -7,8 +8,8 @@ namespace keepass2android { private readonly string _filename; - public CreateNewFilename(OnFinish finish, string filename) - : base(finish) + public CreateNewFilename(Activity activity, OnFinish finish, string filename) + : base(activity,finish) { _filename = filename; } diff --git a/src/keepass2android/EntryActivity.cs b/src/keepass2android/EntryActivity.cs index a835708f..096635fc 100644 --- a/src/keepass2android/EntryActivity.cs +++ b/src/keepass2android/EntryActivity.cs @@ -1056,7 +1056,7 @@ namespace keepass2android - internal void AddUrlToEntry(string url, Action finishAction) + internal void AddUrlToEntry(string url, Action finishAction) { PwEntry initialEntry = Entry.CloneDeep(); @@ -1084,10 +1084,10 @@ namespace keepass2android //save the entry: - ActionOnFinish closeOrShowError = new ActionOnFinish((success, message) => + ActionOnFinish closeOrShowError = new ActionOnFinish(this, (success, message, activity) => { OnFinish.DisplayMessage(this, message); - finishAction(); + finishAction((EntryActivity)activity); }); diff --git a/src/keepass2android/EntryEditActivity.cs b/src/keepass2android/EntryEditActivity.cs index 5ee22207..663aef82 100644 --- a/src/keepass2android/EntryEditActivity.cs +++ b/src/keepass2android/EntryEditActivity.cs @@ -413,20 +413,20 @@ namespace keepass2android RunnableOnFinish runnable; - ActionOnFinish closeOrShowError = new ActionOnFinish((success, message) => { + ActionOnFinish closeOrShowError = new ActionOnFinish(this, (success, message, activity) => { if (success) { - Finish(); + activity.Finish(); } else { - OnFinish.DisplayMessage(this, message); + OnFinish.DisplayMessage(activity, message); } }); - ActionOnFinish afterAddEntry = new ActionOnFinish((success, message) => + ActionOnFinish afterAddEntry = new ActionOnFinish(this, (success, message, activity) => { if (success) - _appTask.AfterAddNewEntry(this, newEntry); + _appTask.AfterAddNewEntry((EntryEditActivity)activity, newEntry); },closeOrShowError); if ( State.IsNew ) { diff --git a/src/keepass2android/ExportDatabaseActivity.cs b/src/keepass2android/ExportDatabaseActivity.cs index 196e9782..eaa7bd14 100644 --- a/src/keepass2android/ExportDatabaseActivity.cs +++ b/src/keepass2android/ExportDatabaseActivity.cs @@ -119,11 +119,11 @@ namespace keepass2android } else { - var task = new CreateNewFilename(new ActionOnFinish((success, messageOrFilename) => + var task = new CreateNewFilename(this, new ActionOnFinish(this, (success, messageOrFilename, activity) => { if (!success) { - Toast.MakeText(this, messageOrFilename, ToastLength.Long).Show(); + Toast.MakeText(activity, messageOrFilename, ToastLength.Long).Show(); return; } ExportTo(new IOConnectionInfo { Path = ConvertFilenameToIocPath(messageOrFilename) }); @@ -162,15 +162,15 @@ namespace keepass2android private void ExportTo(IOConnectionInfo ioc) { - var exportDb = new ExportDb(App.Kp2a, new ActionOnFinish(delegate(bool success, string message) - { - if (!success) - Toast.MakeText(this, message, ToastLength.Long).Show(); - else - Toast.MakeText(this, GetString(Resource.String.export_database_successful), ToastLength.Long).Show(); - Finish(); - } - ), _ffp[_fileFormatIndex], ioc); + var exportDb = new ExportDb(this, App.Kp2a, new ActionOnFinish(this, (success, message, activity) => + { + if (!success) + Toast.MakeText(activity, message, ToastLength.Long).Show(); + else + Toast.MakeText(activity, GetString(Resource.String.export_database_successful), ToastLength.Long).Show(); + activity.Finish(); + } + ), _ffp[_fileFormatIndex], ioc); ProgressTask pt = new ProgressTask(App.Kp2a, this, exportDb); pt.Run(); } @@ -196,7 +196,7 @@ namespace keepass2android private readonly FileFormatProvider _fileFormat; private IOConnectionInfo _targetIoc; - public ExportDb(IKp2aApp app, OnFinish onFinish, FileFormatProvider fileFormat, IOConnectionInfo targetIoc) : base(onFinish) + public ExportDb(Activity activity, IKp2aApp app, OnFinish onFinish, FileFormatProvider fileFormat, IOConnectionInfo targetIoc) : base(activity, onFinish) { _app = app; this._fileFormat = fileFormat; diff --git a/src/keepass2android/GroupActivity.cs b/src/keepass2android/GroupActivity.cs index aa180a14..fd841fc0 100644 --- a/src/keepass2android/GroupActivity.cs +++ b/src/keepass2android/GroupActivity.cs @@ -230,11 +230,8 @@ namespace keepass2android { //yes ProgressTask pt = new ProgressTask(App.Kp2a, this, - new AddTemplateEntries(this, App.Kp2a, new ActionOnFinish( - delegate - { - StartAddEntry(); - }))); + new AddTemplateEntries(this, App.Kp2a, new ActionOnFinish(this, + (success, message, activity) => ((GroupActivity)activity)?.StartAddEntry()))); pt.Run(); }, (o, args) => diff --git a/src/keepass2android/GroupBaseActivity.cs b/src/keepass2android/GroupBaseActivity.cs index 88035704..cde7dd72 100644 --- a/src/keepass2android/GroupBaseActivity.cs +++ b/src/keepass2android/GroupBaseActivity.cs @@ -616,7 +616,13 @@ namespace keepass2android - var moveElement = new MoveElements(elementsToMove.ToList(), Group, this, App.Kp2a, new ActionOnFinish((success, message) => { StopMovingElements(); if (!String.IsNullOrEmpty(message)) Toast.MakeText(this, message, ToastLength.Long).Show(); })); + var moveElement = new MoveElements(elementsToMove.ToList(), Group, this, App.Kp2a, new ActionOnFinish(this, + (success, message, activity) => + { + ((GroupBaseActivity)activity)?.StopMovingElements(); + if (!String.IsNullOrEmpty(message)) + Toast.MakeText(activity, message, ToastLength.Long).Show(); + })); var progressTask = new ProgressTask(App.Kp2a, this, moveElement); progressTask.Run(); @@ -867,8 +873,8 @@ namespace keepass2android { private readonly IOConnectionInfo _ioc; - public SyncOtpAuxFile(IOConnectionInfo ioc) - : base(null) + public SyncOtpAuxFile(Activity activity, IOConnectionInfo ioc) + : base(activity,null) { _ioc = ioc; } @@ -900,19 +906,19 @@ namespace keepass2android { var filestorage = App.Kp2a.GetFileStorage(App.Kp2a.GetDb().Ioc); RunnableOnFinish task; - OnFinish onFinish = new ActionOnFinish((success, message) => + OnFinish onFinish = new ActionOnFinish(this, (success, message, activity) => { if (!String.IsNullOrEmpty(message)) - Toast.MakeText(this, message, ToastLength.Long).Show(); + Toast.MakeText(activity, message, ToastLength.Long).Show(); // Tell the adapter to refresh it's list - BaseAdapter adapter = (BaseAdapter)ListAdapter; - adapter.NotifyDataSetChanged(); + BaseAdapter adapter = (BaseAdapter)((GroupBaseActivity)activity)?.ListAdapter; + adapter?.NotifyDataSetChanged(); if (App.Kp2a.GetDb().OtpAuxFileIoc != null) { - var task2 = new SyncOtpAuxFile(App.Kp2a.GetDb().OtpAuxFileIoc); - new ProgressTask(App.Kp2a, this, task2).Run(); + var task2 = new SyncOtpAuxFile(this, App.Kp2a.GetDb().OtpAuxFileIoc); + new ProgressTask(App.Kp2a, activity, task2).Run(true); } }); @@ -982,33 +988,28 @@ namespace keepass2android public class RefreshTask : OnFinish { - readonly GroupBaseActivity _act; public RefreshTask(Handler handler, GroupBaseActivity act) - : base(handler) + : base(act, handler) { - _act = act; } public override void Run() { if (Success) { - _act.RefreshIfDirty(); + ((GroupBaseActivity)ActiveActivity)?.RefreshIfDirty(); } else { - DisplayMessage(_act); + DisplayMessage(ActiveActivity); } } } public class AfterDeleteGroup : OnFinish { - readonly GroupBaseActivity _act; - public AfterDeleteGroup(Handler handler, GroupBaseActivity act) - : base(handler) + : base(act, handler) { - _act = act; } @@ -1016,13 +1017,13 @@ namespace keepass2android { if (Success) { - _act.RefreshIfDirty(); + ((GroupBaseActivity)ActiveActivity)?.RefreshIfDirty(); } else { Handler.Post(() => { - Toast.MakeText(_act, "Unrecoverable error: " + Message, ToastLength.Long).Show(); + Toast.MakeText(ActiveActivity, "Unrecoverable error: " + Message, ToastLength.Long).Show(); }); App.Kp2a.LockDatabase(false); diff --git a/src/keepass2android/GroupEditActivity.cs b/src/keepass2android/GroupEditActivity.cs index 051d4ad0..f486fd65 100644 --- a/src/keepass2android/GroupEditActivity.cs +++ b/src/keepass2android/GroupEditActivity.cs @@ -27,7 +27,7 @@ using KeePassLib.Utility; namespace keepass2android { [Activity(Label = "@string/app_name", Theme = "@style/Dialog")] - public class GroupEditActivity : LifecycleDebugActivity + public class GroupEditActivity : LifecycleAwareActivity { public const String KeyParent = "parent"; public const String KeyName = "name"; diff --git a/src/keepass2android/KeePass.cs b/src/keepass2android/KeePass.cs index 99f36105..5d718433 100644 --- a/src/keepass2android/KeePass.cs +++ b/src/keepass2android/KeePass.cs @@ -74,7 +74,7 @@ namespace keepass2android /// [Activity(Label = AppNames.AppName, MainLauncher = false, Theme = "@style/MyTheme_Blue")] [IntentFilter(new[] { Intent.ActionMain }, Categories = new[] { "android.intent.category.LAUNCHER", "android.intent.category.MULTIWINDOW_LAUNCHER" })] - public class KeePass : LifecycleDebugActivity, IDialogInterfaceOnDismissListener + public class KeePass : LifecycleAwareActivity, IDialogInterfaceOnDismissListener { public const Result ExitNormal = Result.FirstUser; public const Result ExitLock = Result.FirstUser+1; diff --git a/src/keepass2android/LifecycleDebugActivity.cs b/src/keepass2android/LifecycleAwareActivity.cs similarity index 88% rename from src/keepass2android/LifecycleDebugActivity.cs rename to src/keepass2android/LifecycleAwareActivity.cs index 5e066163..114c3f02 100644 --- a/src/keepass2android/LifecycleDebugActivity.cs +++ b/src/keepass2android/LifecycleAwareActivity.cs @@ -24,15 +24,15 @@ using Android.Support.V7.App; namespace keepass2android { - public abstract class LifecycleDebugActivity : AppCompatActivity + public abstract class LifecycleAwareActivity : AppCompatActivity { - protected LifecycleDebugActivity (IntPtr javaReference, JniHandleOwnership transfer) + protected LifecycleAwareActivity (IntPtr javaReference, JniHandleOwnership transfer) : base(javaReference, transfer) { } - protected LifecycleDebugActivity() + protected LifecycleAwareActivity() { } @@ -63,6 +63,7 @@ namespace keepass2android protected override void OnStart() { + ProgressTask.SetNewActiveActivity(this); base.OnStart(); Kp2aLog.Log(ClassName+".OnStart"); } @@ -90,7 +91,8 @@ namespace keepass2android { base.OnStop(); Kp2aLog.Log(ClassName+".OnStop"); - } + ProgressTask.RemoveActiveActivity(this); + } } } diff --git a/src/keepass2android/LockingActivity.cs b/src/keepass2android/LockingActivity.cs index 1992978b..d063f46c 100644 --- a/src/keepass2android/LockingActivity.cs +++ b/src/keepass2android/LockingActivity.cs @@ -27,7 +27,7 @@ namespace keepass2android /// /// Base class for activities. Notifies the TimeoutHelper whether the app is active or not. /// - public class LockingActivity : LifecycleDebugActivity { + public class LockingActivity : LifecycleAwareActivity { public LockingActivity (IntPtr javaReference, JniHandleOwnership transfer) : base(javaReference, transfer) diff --git a/src/keepass2android/PasswordActivity.cs b/src/keepass2android/PasswordActivity.cs index 734d00c5..f188fd74 100644 --- a/src/keepass2android/PasswordActivity.cs +++ b/src/keepass2android/PasswordActivity.cs @@ -310,7 +310,7 @@ namespace keepass2android Handler handler = new Handler(); OnFinish onFinish = new AfterLoad(handler, this, _ioConnection); _performingLoad = true; - LoadDb task = new LoadDb(App.Kp2a, _ioConnection, _loadDbFileTask, compositeKey, _keyFileOrProvider, onFinish); + LoadDb task = new LoadDb(this, App.Kp2a, _ioConnection, _loadDbFileTask, compositeKey, _keyFileOrProvider, onFinish); _loadDbFileTask = null; // prevent accidental re-use new ProgressTask(App.Kp2a, this, task).Run(); } @@ -1453,7 +1453,7 @@ namespace keepass2android LoadDb task = (KeyProviderType == KeyProviders.Otp) ? new SaveOtpAuxFileAndLoadDb(App.Kp2a, _ioConnection, _loadDbFileTask, compositeKey, _keyFileOrProvider, onFinish, this) - : new LoadDb(App.Kp2a, _ioConnection, _loadDbFileTask, compositeKey, _keyFileOrProvider, onFinish); + : new LoadDb(this, App.Kp2a, _ioConnection, _loadDbFileTask, compositeKey, _keyFileOrProvider, onFinish); _loadDbFileTask = null; // prevent accidental re-use SetNewDefaultFile(); @@ -2028,7 +2028,7 @@ namespace keepass2android readonly PasswordActivity _act; private readonly IOConnectionInfo _ioConnection; - public AfterLoad(Handler handler, PasswordActivity act, IOConnectionInfo ioConnection):base(handler) + public AfterLoad(Handler handler, PasswordActivity act, IOConnectionInfo ioConnection):base(act, handler) { _act = act; _ioConnection = ioConnection; @@ -2172,7 +2172,7 @@ namespace keepass2android private readonly PasswordActivity _act; - public SaveOtpAuxFileAndLoadDb(IKp2aApp app, IOConnectionInfo ioc, Task databaseData, CompositeKey compositeKey, string keyfileOrProvider, OnFinish finish, PasswordActivity act) : base(app, ioc, databaseData, compositeKey, keyfileOrProvider, finish) + public SaveOtpAuxFileAndLoadDb(IKp2aApp app, IOConnectionInfo ioc, Task databaseData, CompositeKey compositeKey, string keyfileOrProvider, OnFinish finish, PasswordActivity act) : base(act, app, ioc, databaseData, compositeKey, keyfileOrProvider, finish) { _act = act; } diff --git a/src/keepass2android/QuickUnlock.cs b/src/keepass2android/QuickUnlock.cs index a04543d6..f7b29346 100644 --- a/src/keepass2android/QuickUnlock.cs +++ b/src/keepass2android/QuickUnlock.cs @@ -37,7 +37,7 @@ namespace keepass2android WindowSoftInputMode = SoftInput.AdjustResize, MainLauncher = false, Theme = "@style/MyTheme_Blue")] - public class QuickUnlock : LifecycleDebugActivity, IFingerprintAuthCallback + public class QuickUnlock : LifecycleAwareActivity, IFingerprintAuthCallback { private IOConnectionInfo _ioc; private QuickUnlockBroadcastReceiver _intentReceiver; diff --git a/src/keepass2android/SetPasswordDialog.cs b/src/keepass2android/SetPasswordDialog.cs index 5ebaba3d..3615a31f 100644 --- a/src/keepass2android/SetPasswordDialog.cs +++ b/src/keepass2android/SetPasswordDialog.cs @@ -15,6 +15,7 @@ This file is part of Keepass2Android, Copyright 2013 Philipp Crocoll. This file along with Keepass2Android. If not, see . */ using System; +using Android.App; using Android.Content; using Android.OS; using Android.Preferences; @@ -25,10 +26,13 @@ namespace keepass2android public class SetPasswordDialog : CancelDialog { + + + internal String Keyfile; - internal String Keyfile; - - public SetPasswordDialog(Context context):base(context) { + public SetPasswordDialog(Activity activity):base(activity) + { + } @@ -67,8 +71,8 @@ namespace keepass2android } - SetPassword sp = new SetPassword(Context, App.Kp2a, pass, keyfile, new AfterSave(this, null, new Handler())); - ProgressTask pt = new ProgressTask(App.Kp2a, Context, sp); + SetPassword sp = new SetPassword(_activity, App.Kp2a, pass, keyfile, new AfterSave(_activity, this, null, new Handler())); + ProgressTask pt = new ProgressTask(App.Kp2a, _activity, sp); pt.Run(); }; @@ -88,7 +92,7 @@ namespace keepass2android readonly SetPasswordDialog _dlg; - public AfterSave(SetPasswordDialog dlg, FileOnFinish finish, Handler handler): base(finish, handler) { + public AfterSave(Activity activity, SetPasswordDialog dlg, FileOnFinish finish, Handler handler): base(activity, finish, handler) { _finish = finish; _dlg = dlg; } diff --git a/src/keepass2android/app/AppTask.cs b/src/keepass2android/app/AppTask.cs index 95ed520d..45329ae7 100644 --- a/src/keepass2android/app/AppTask.cs +++ b/src/keepass2android/app/AppTask.cs @@ -489,6 +489,10 @@ namespace keepass2android public override void CompleteOnCreateEntryActivity(EntryActivity activity) { + Context ctx = activity; + if (ctx == null) + ctx = Application.Context; + if (ShowUserNotifications) { //show the notifications @@ -579,7 +583,7 @@ namespace keepass2android builder.SetPositiveButton(activity.GetString(Resource.String.yes), (dlgSender, dlgEvt) => { - activity.AddUrlToEntry(url, () => base.CompleteOnCreateEntryActivity(activity)); + activity.AddUrlToEntry(url, (EntryActivity thenActiveActivity) => base.CompleteOnCreateEntryActivity(thenActiveActivity)); }); builder.SetNegativeButton(activity.GetString(Resource.String.no), (dlgSender, dlgEvt) => diff --git a/src/keepass2android/keepass2android.csproj b/src/keepass2android/keepass2android.csproj index ce8cfbc3..260deb5c 100644 --- a/src/keepass2android/keepass2android.csproj +++ b/src/keepass2android/keepass2android.csproj @@ -303,7 +303,7 @@ - + diff --git a/src/keepass2android/settings/DatabaseSettingsActivity.cs b/src/keepass2android/settings/DatabaseSettingsActivity.cs index 5b7f4094..45646f8b 100644 --- a/src/keepass2android/settings/DatabaseSettingsActivity.cs +++ b/src/keepass2android/settings/DatabaseSettingsActivity.cs @@ -561,12 +561,12 @@ namespace keepass2android var previousCipher = db.KpDatabase.DataCipherUuid; db.KpDatabase.DataCipherUuid = new PwUuid(MemUtil.HexStringToByteArray((string)preferenceChangeEventArgs.NewValue)); - SaveDb save = new SaveDb(Activity, App.Kp2a, new ActionOnFinish((success, message) => + SaveDb save = new SaveDb(Activity, App.Kp2a, new ActionOnFinish(Activity, (success, message, activity) => { if (!success) { db.KpDatabase.DataCipherUuid = previousCipher; - Toast.MakeText(Activity, message, ToastLength.Long).Show(); + Toast.MakeText(activity, message, ToastLength.Long).Show(); return; } preferenceChangeEventArgs.Preference.Summary = @@ -626,12 +626,12 @@ namespace keepass2android Kp2aLog.Log("--new kdf: " + KdfPool.Get(db.KpDatabase.KdfParameters.KdfUuid) + " " + db.KpDatabase.KdfParameters.KdfUuid.ToHexString()); - SaveDb save = new SaveDb(Activity, App.Kp2a, new ActionOnFinish((success, message) => + SaveDb save = new SaveDb(Activity, App.Kp2a, new ActionOnFinish(Activity, (success, message, activity) => { if (!success) { db.KpDatabase.KdfParameters = previousKdfParams; - Toast.MakeText(Activity, message, ToastLength.Long).Show(); + Toast.MakeText(activity, message, ToastLength.Long).Show(); return; } UpdateKdfScreen(); @@ -670,7 +670,7 @@ namespace keepass2android pref.PreferenceClick += (sender, args) => { ProgressTask pt = new ProgressTask(App.Kp2a, Activity, - new AddTemplateEntries(Activity, App.Kp2a, new ActionOnFinish( + new AddTemplateEntries(Activity, App.Kp2a, new ActionOnFinish(Activity, delegate { pref.Enabled = false; @@ -709,13 +709,13 @@ namespace keepass2android String previousName = db.KpDatabase.Name; db.KpDatabase.Name = e.NewValue.ToString(); - SaveDb save = new SaveDb(Activity, App.Kp2a, new ActionOnFinish((success, message) => + SaveDb save = new SaveDb(Activity, App.Kp2a, new ActionOnFinish(Activity, (success, message, activity) => { if (!success) { db.KpDatabase.Name = previousName; db.KpDatabase.NameChanged = previousNameChanged; - Toast.MakeText(Activity, message, ToastLength.Long).Show(); + Toast.MakeText(activity, message, ToastLength.Long).Show(); } else { @@ -747,13 +747,13 @@ namespace keepass2android String previousUsername = db.KpDatabase.DefaultUserName; db.KpDatabase.DefaultUserName = e.NewValue.ToString(); - SaveDb save = new SaveDb(Activity, App.Kp2a, new ActionOnFinish((success, message) => + SaveDb save = new SaveDb(Activity, App.Kp2a, new ActionOnFinish(Activity, (success, message, activity) => { if (!success) { db.KpDatabase.DefaultUserName = previousUsername; db.KpDatabase.DefaultUserNameChanged = previousUsernameChanged; - Toast.MakeText(Activity, message, ToastLength.Long).Show(); + Toast.MakeText(activity, message, ToastLength.Long).Show(); } })); ProgressTask pt = new ProgressTask(App.Kp2a, Activity, save); diff --git a/src/keepass2android/settings/RoundsPreference.cs b/src/keepass2android/settings/RoundsPreference.cs index 2536c30a..8056de8f 100644 --- a/src/keepass2android/settings/RoundsPreference.cs +++ b/src/keepass2android/settings/RoundsPreference.cs @@ -16,6 +16,7 @@ This file is part of Keepass2Android, Copyright 2013 Philipp Crocoll. This file */ using System; using System.Globalization; +using Android.App; using Android.Content; using Android.OS; using Android.Views; @@ -88,8 +89,8 @@ namespace keepass2android.settings ParamValue = paramValue; Handler handler = new Handler(); - SaveDb save = new SaveDb(Context, App.Kp2a, new KdfNumberParamPreference.AfterSave(Context, handler, oldValue, this)); - ProgressTask pt = new ProgressTask(App.Kp2a, Context, save); + SaveDb save = new SaveDb((Activity)Context, App.Kp2a, new KdfNumberParamPreference.AfterSave((Activity)Context, handler, oldValue, this)); + ProgressTask pt = new ProgressTask(App.Kp2a, (Activity)Context, save); pt.Run(); } @@ -101,7 +102,7 @@ namespace keepass2android.settings private readonly Context _ctx; private readonly KdfNumberParamPreference _pref; - public AfterSave(Context ctx, Handler handler, ulong oldRounds, KdfNumberParamPreference pref):base(handler) { + public AfterSave(Activity ctx, Handler handler, ulong oldRounds, KdfNumberParamPreference pref):base(ctx, handler) { _pref = pref; _ctx = ctx;