2013-02-23 11:43:42 -05:00
|
|
|
/*
|
|
|
|
This file is part of Keepass2Android, Copyright 2013 Philipp Crocoll. This file is based on Keepassdroid, Copyright Brian Pellin.
|
|
|
|
|
|
|
|
Keepass2Android is free software: you can redistribute it and/or modify
|
|
|
|
it under the terms of the GNU General Public License as published by
|
|
|
|
the Free Software Foundation, either version 2 of the License, or
|
|
|
|
(at your option) any later version.
|
|
|
|
|
|
|
|
Keepass2Android is distributed in the hope that it will be useful,
|
|
|
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
|
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
|
|
GNU General Public License for more details.
|
|
|
|
|
|
|
|
You should have received a copy of the GNU General Public License
|
|
|
|
along with Keepass2Android. If not, see <http://www.gnu.org/licenses/>.
|
|
|
|
*/
|
|
|
|
|
|
|
|
using System;
|
|
|
|
using Android.Content;
|
|
|
|
using KeePassLib;
|
|
|
|
|
|
|
|
namespace keepass2android
|
|
|
|
{
|
|
|
|
|
2013-03-06 14:44:02 -05:00
|
|
|
public class DeleteGroup : DeleteRunnable {
|
2013-02-23 11:43:42 -05:00
|
|
|
|
2013-06-15 06:40:01 -04:00
|
|
|
private PwGroup _group;
|
|
|
|
protected bool DontSave;
|
2013-03-06 14:44:02 -05:00
|
|
|
|
2013-06-15 06:40:01 -04:00
|
|
|
public DeleteGroup(Context ctx, IKp2aApp app, PwGroup group, OnFinish finish)
|
2013-06-14 00:14:50 -04:00
|
|
|
: base(finish, app)
|
|
|
|
{
|
2013-06-15 06:40:01 -04:00
|
|
|
SetMembers(ctx, app, group, false);
|
2013-02-23 11:43:42 -05:00
|
|
|
}
|
2013-06-14 00:14:50 -04:00
|
|
|
/*
|
|
|
|
public DeleteGroup(Context ctx, Database db, PwGroup group, Activity act, OnFinish finish, bool dontSave)
|
|
|
|
: base(finish)
|
|
|
|
{
|
2013-06-15 06:40:01 -04:00
|
|
|
SetMembers(ctx, db, group, act, dontSave);
|
2013-02-23 11:43:42 -05:00
|
|
|
}
|
2013-06-14 00:14:50 -04:00
|
|
|
|
2013-02-23 11:43:42 -05:00
|
|
|
public DeleteGroup(Context ctx, Database db, PwGroup group, OnFinish finish, bool dontSave):base(finish) {
|
2013-06-15 06:40:01 -04:00
|
|
|
SetMembers(ctx, db, group, null, dontSave);
|
2013-02-23 11:43:42 -05:00
|
|
|
}
|
2013-06-14 00:14:50 -04:00
|
|
|
*/
|
2013-06-15 06:40:01 -04:00
|
|
|
private void SetMembers(Context ctx, IKp2aApp app, PwGroup group, bool dontSave)
|
2013-06-14 00:14:50 -04:00
|
|
|
{
|
2013-06-15 06:40:01 -04:00
|
|
|
base.SetMembers(ctx, app.GetDb());
|
2013-03-06 14:44:02 -05:00
|
|
|
|
2013-06-15 06:40:01 -04:00
|
|
|
_group = group;
|
|
|
|
DontSave = dontSave;
|
2013-06-14 00:14:50 -04:00
|
|
|
|
2013-03-06 14:44:02 -05:00
|
|
|
}
|
|
|
|
|
|
|
|
public override bool CanRecycle
|
|
|
|
{
|
|
|
|
get
|
|
|
|
{
|
2013-06-15 06:40:01 -04:00
|
|
|
return CanRecycleGroup(_group);
|
2013-03-06 14:44:02 -05:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2013-06-14 00:14:50 -04:00
|
|
|
protected override UiStringKey QuestionsResourceId
|
2013-03-06 14:44:02 -05:00
|
|
|
{
|
|
|
|
get
|
|
|
|
{
|
2013-06-14 00:14:50 -04:00
|
|
|
return UiStringKey.AskDeletePermanentlyGroup;
|
2013-03-06 14:44:02 -05:00
|
|
|
}
|
2013-02-23 11:43:42 -05:00
|
|
|
}
|
|
|
|
|
|
|
|
|
2013-06-15 06:40:01 -04:00
|
|
|
public override void Run() {
|
2013-07-09 03:59:17 -04:00
|
|
|
StatusLogger.UpdateMessage(UiStringKey.DeletingGroup);
|
2013-02-23 11:43:42 -05:00
|
|
|
//from KP Desktop
|
2013-06-15 06:40:01 -04:00
|
|
|
PwGroup pg = _group;
|
2013-02-23 11:43:42 -05:00
|
|
|
PwGroup pgParent = pg.ParentGroup;
|
|
|
|
if(pgParent == null) return; // Can't remove virtual or root group
|
|
|
|
|
2013-06-15 06:40:01 -04:00
|
|
|
PwDatabase pd = Db.KpDatabase;
|
2013-02-23 11:43:42 -05:00
|
|
|
PwGroup pgRecycleBin = pd.RootGroup.FindGroup(pd.RecycleBinUuid, true);
|
|
|
|
|
|
|
|
pgParent.Groups.Remove(pg);
|
|
|
|
|
2013-03-06 14:44:02 -05:00
|
|
|
if ((DeletePermanently) || (!CanRecycle))
|
2013-02-23 11:43:42 -05:00
|
|
|
{
|
|
|
|
pg.DeleteAllObjects(pd);
|
|
|
|
|
|
|
|
PwDeletedObject pdo = new PwDeletedObject(pg.Uuid, DateTime.Now);
|
|
|
|
pd.DeletedObjects.Add(pdo);
|
2013-07-09 03:59:17 -04:00
|
|
|
_onFinishToRun = new AfterDeletePermanently(OnFinishToRun, App, _group);
|
2013-02-23 11:43:42 -05:00
|
|
|
}
|
|
|
|
else // Recycle
|
|
|
|
{
|
|
|
|
bool bDummy = false;
|
2013-03-06 14:44:02 -05:00
|
|
|
EnsureRecycleBin(ref pgRecycleBin, ref bDummy);
|
2013-02-23 11:43:42 -05:00
|
|
|
|
|
|
|
pgRecycleBin.AddGroup(pg, true, true);
|
|
|
|
pg.Touch(false);
|
2013-07-09 03:59:17 -04:00
|
|
|
_onFinishToRun = new ActionOnFinish((success, message) =>
|
2013-03-06 14:44:02 -05:00
|
|
|
{
|
|
|
|
if ( success ) {
|
|
|
|
// Mark new parent (Recycle bin) dirty
|
2013-06-15 06:40:01 -04:00
|
|
|
PwGroup parent = _group.ParentGroup;
|
2013-03-06 14:44:02 -05:00
|
|
|
if ( parent != null ) {
|
2013-06-15 06:40:01 -04:00
|
|
|
Db.Dirty.Add(parent);
|
2013-03-06 14:44:02 -05:00
|
|
|
}
|
|
|
|
//Mark old parent dirty:
|
2013-06-15 06:40:01 -04:00
|
|
|
Db.Dirty.Add(pgParent);
|
2013-03-06 14:44:02 -05:00
|
|
|
} else {
|
|
|
|
// Let's not bother recovering from a failure to save a deleted group. It is too much work.
|
2013-07-25 08:47:05 -04:00
|
|
|
App.LockDatabase();
|
2013-03-06 14:44:02 -05:00
|
|
|
}
|
2013-06-15 06:40:01 -04:00
|
|
|
}, OnFinishToRun);
|
2013-02-23 11:43:42 -05:00
|
|
|
}
|
|
|
|
|
|
|
|
// Save
|
2013-07-09 03:59:17 -04:00
|
|
|
SaveDb save = new SaveDb(Ctx, App, OnFinishToRun, DontSave);
|
|
|
|
save.SetStatusLogger(StatusLogger);
|
2013-06-15 06:40:01 -04:00
|
|
|
save.Run();
|
2013-02-23 11:43:42 -05:00
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
2013-03-06 14:44:02 -05:00
|
|
|
private class AfterDeletePermanently : OnFinish {
|
2013-06-15 06:40:01 -04:00
|
|
|
readonly IKp2aApp _app;
|
2013-02-23 11:43:42 -05:00
|
|
|
|
2013-06-15 06:40:01 -04:00
|
|
|
readonly PwGroup _group;
|
2013-02-23 11:43:42 -05:00
|
|
|
|
2013-06-14 00:14:50 -04:00
|
|
|
public AfterDeletePermanently(OnFinish finish, IKp2aApp app, PwGroup group):base(finish) {
|
2013-06-15 06:40:01 -04:00
|
|
|
_app = app;
|
|
|
|
_group = group;
|
2013-02-23 11:43:42 -05:00
|
|
|
}
|
|
|
|
|
2013-06-15 06:40:01 -04:00
|
|
|
public override void Run() {
|
|
|
|
if ( Success ) {
|
2013-02-23 11:43:42 -05:00
|
|
|
// Remove from group global
|
2013-06-15 06:40:01 -04:00
|
|
|
_app.GetDb().Groups.Remove(_group.Uuid);
|
2013-02-23 11:43:42 -05:00
|
|
|
|
2013-03-06 14:44:02 -05:00
|
|
|
// Remove group from the dirty global (if it is present), not a big deal if this fails (doesn't throw)
|
2013-06-15 06:40:01 -04:00
|
|
|
_app.GetDb().Dirty.Remove(_group);
|
2013-02-23 11:43:42 -05:00
|
|
|
|
|
|
|
// Mark parent dirty
|
2013-06-15 06:40:01 -04:00
|
|
|
PwGroup parent = _group.ParentGroup;
|
2013-02-23 11:43:42 -05:00
|
|
|
if ( parent != null ) {
|
2013-06-15 06:40:01 -04:00
|
|
|
_app.GetDb().Dirty.Add(parent);
|
2013-02-23 11:43:42 -05:00
|
|
|
}
|
|
|
|
} else {
|
|
|
|
// Let's not bother recovering from a failure to save a deleted group. It is too much work.
|
2013-07-25 08:47:05 -04:00
|
|
|
_app.LockDatabase();
|
2013-02-23 11:43:42 -05:00
|
|
|
}
|
|
|
|
|
2013-06-15 06:40:01 -04:00
|
|
|
base.Run();
|
2013-02-23 11:43:42 -05:00
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
}
|
|
|
|
|