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 System.Collections.Generic;
|
|
|
|
using System.Linq;
|
|
|
|
using System.Text;
|
|
|
|
|
|
|
|
using Android.App;
|
|
|
|
using Android.Content;
|
|
|
|
using Android.OS;
|
|
|
|
using Android.Runtime;
|
|
|
|
using Android.Views;
|
|
|
|
using Android.Widget;
|
|
|
|
using KeePassLib;
|
|
|
|
|
|
|
|
namespace keepass2android
|
|
|
|
{
|
|
|
|
|
2013-03-06 14:44:02 -05:00
|
|
|
public class DeleteGroup : DeleteRunnable {
|
2013-02-23 11:43:42 -05:00
|
|
|
|
|
|
|
private PwGroup mGroup;
|
2013-06-14 00:14:50 -04:00
|
|
|
private Activity mAct;
|
2013-03-06 14:44:02 -05:00
|
|
|
protected bool mDontSave;
|
|
|
|
|
2013-06-14 00:14:50 -04:00
|
|
|
public DeleteGroup(Context ctx, IKp2aApp app, PwGroup group, Activity act, OnFinish finish)
|
|
|
|
: base(finish, app)
|
|
|
|
{
|
|
|
|
setMembers(ctx, app, group, act, 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-02-23 11:43:42 -05:00
|
|
|
setMembers(ctx, db, group, act, dontSave);
|
|
|
|
}
|
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) {
|
|
|
|
setMembers(ctx, db, group, null, dontSave);
|
|
|
|
}
|
2013-06-14 00:14:50 -04:00
|
|
|
*/
|
|
|
|
private void setMembers(Context ctx, IKp2aApp app, PwGroup group, Activity act, bool dontSave)
|
|
|
|
{
|
|
|
|
base.setMembers(ctx, app.GetDb());
|
2013-03-06 14:44:02 -05:00
|
|
|
|
2013-02-23 11:43:42 -05:00
|
|
|
mGroup = group;
|
|
|
|
mAct = act;
|
|
|
|
mDontSave = dontSave;
|
2013-06-14 00:14:50 -04:00
|
|
|
|
2013-03-06 14:44:02 -05:00
|
|
|
}
|
|
|
|
|
|
|
|
public override bool CanRecycle
|
|
|
|
{
|
|
|
|
get
|
|
|
|
{
|
|
|
|
return CanRecycleGroup(mGroup);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
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
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
public override void run() {
|
|
|
|
//from KP Desktop
|
|
|
|
PwGroup pg = mGroup;
|
|
|
|
PwGroup pgParent = pg.ParentGroup;
|
|
|
|
if(pgParent == null) return; // Can't remove virtual or root group
|
|
|
|
|
|
|
|
PwDatabase pd = mDb.pm;
|
|
|
|
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-06-14 00:14:50 -04:00
|
|
|
mFinish = new AfterDeletePermanently(mFinish, mApp, mGroup);
|
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-03-06 14:44:02 -05:00
|
|
|
mFinish = new ActionOnFinish((success, message) =>
|
|
|
|
{
|
|
|
|
if ( success ) {
|
|
|
|
// Mark new parent (Recycle bin) dirty
|
|
|
|
PwGroup parent = mGroup.ParentGroup;
|
|
|
|
if ( parent != null ) {
|
|
|
|
mDb.dirty.Add(parent);
|
|
|
|
}
|
|
|
|
//Mark old parent dirty:
|
|
|
|
mDb.dirty.Add(pgParent);
|
|
|
|
} else {
|
|
|
|
// Let's not bother recovering from a failure to save a deleted group. It is too much work.
|
2013-06-14 00:14:50 -04:00
|
|
|
mApp.SetShutdown();
|
2013-03-06 14:44:02 -05:00
|
|
|
}
|
|
|
|
}, this.mFinish);
|
2013-02-23 11:43:42 -05:00
|
|
|
}
|
|
|
|
|
|
|
|
// Save
|
|
|
|
SaveDB save = new SaveDB(mCtx, mDb, mFinish, mDontSave);
|
|
|
|
save.run();
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
2013-03-06 14:44:02 -05:00
|
|
|
private class AfterDeletePermanently : OnFinish {
|
2013-06-14 00:14:50 -04:00
|
|
|
IKp2aApp mApp;
|
2013-02-23 11:43:42 -05:00
|
|
|
|
|
|
|
PwGroup mGroup;
|
|
|
|
|
2013-06-14 00:14:50 -04:00
|
|
|
public AfterDeletePermanently(OnFinish finish, IKp2aApp app, PwGroup group):base(finish) {
|
|
|
|
this.mApp = app;
|
2013-02-23 11:43:42 -05:00
|
|
|
this.mGroup = group;
|
|
|
|
}
|
|
|
|
|
|
|
|
public override void run() {
|
|
|
|
if ( mSuccess ) {
|
|
|
|
// Remove from group global
|
2013-06-14 00:14:50 -04:00
|
|
|
mApp.GetDb().groups.Remove(mGroup.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-14 00:14:50 -04:00
|
|
|
mApp.GetDb().dirty.Remove(mGroup);
|
2013-02-23 11:43:42 -05:00
|
|
|
|
|
|
|
// Mark parent dirty
|
|
|
|
PwGroup parent = mGroup.ParentGroup;
|
|
|
|
if ( parent != null ) {
|
2013-06-14 00:14:50 -04:00
|
|
|
mApp.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-06-14 00:14:50 -04:00
|
|
|
mApp.SetShutdown();
|
2013-02-23 11:43:42 -05:00
|
|
|
}
|
|
|
|
|
|
|
|
base.run();
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
}
|
|
|
|
|