Support for renaming folders

This commit is contained in:
M66B 2019-07-29 21:53:32 +02:00
parent c4ebff4c09
commit 1ed78da2a0
7 changed files with 1890 additions and 14 deletions

File diff suppressed because it is too large Load Diff

View File

@ -158,7 +158,7 @@ public class AdapterFolder extends RecyclerView.Adapter<AdapterFolder.ViewHolder
}
private void bindTo(final TupleFolderEx folder) {
view.setActivated(folder.tbc != null || folder.tbd != null);
view.setActivated(folder.tbc != null || folder.rename != null || folder.tbd != null);
view.setAlpha(folder.hide || !folder.selectable || disabledIds.contains(folder.id)
? Helper.LOW_LIGHT : 1.0f);

View File

@ -801,6 +801,18 @@ class Core {
db.folder().resetFolderTbc(folder.id);
local.put(folder.name, folder);
sync_folders = true;
} else if (folder.rename != null) {
Log.i(folder.name + " rename into " + folder.rename);
Folder ifolder = istore.getFolder(folder.name);
if (ifolder.exists()) {
ifolder.renameTo(istore.getFolder(folder.rename));
db.folder().renameFolder(folder.account, folder.name, folder.rename);
folder.name = folder.rename;
}
db.folder().resetFolderRename(folder.id);
sync_folders = true;
} else if (folder.tbd != null && folder.tbd) {
Log.i(folder.name + " deleting");
Folder ifolder = istore.getFolder(folder.name);
@ -808,6 +820,7 @@ class Core {
ifolder.delete(false);
db.folder().deleteFolder(folder.id);
sync_folders = true;
} else {
local.put(folder.name, folder);
if (folder.initialize != 0)
@ -864,7 +877,7 @@ class Core {
String type = EntityFolder.getType(attr, fullName, false);
boolean selectable = !Arrays.asList(attr).contains("\\Noselect");
if (EntityFolder.INBOX.equals(type))
if (EntityFolder.INBOX.equals(type) || fullName.equals(childName))
childName = null;
Log.i(account.name + ":" + fullName + " subscribed=" + subscribed +

View File

@ -57,7 +57,7 @@ import io.requery.android.database.sqlite.RequerySQLiteOpenHelperFactory;
// https://developer.android.com/topic/libraries/architecture/room.html
@Database(
version = 97,
version = 98,
entities = {
EntityIdentity.class,
EntityAccount.class,
@ -984,6 +984,13 @@ public abstract class DB extends RoomDatabase {
db.execSQL("ALTER TABLE `folder` ADD COLUMN `uidv` INTEGER");
}
})
.addMigrations(new Migration(97, 98) {
@Override
public void migrate(@NonNull SupportSQLiteDatabase db) {
Log.i("DB migration from version " + startVersion + " to " + endVersion);
db.execSQL("ALTER TABLE `folder` ADD COLUMN `rename` TEXT");
}
})
.build();
}

View File

@ -249,7 +249,8 @@ public interface DaoFolder {
int setFoldersUser(long account);
@Query("UPDATE folder" +
" SET display = :display" +
" SET `rename` = :rename" +
", display = :display" +
", unified = :unified" +
", navigation = :navigation" +
", notify = :notify" +
@ -262,7 +263,7 @@ public interface DaoFolder {
", auto_delete = :auto_delete" +
" WHERE id = :id")
int setFolderProperties(
long id,
long id, String rename,
String display, boolean unified, boolean navigation, boolean notify, boolean hide,
boolean synchronize, boolean poll, boolean download,
int sync_days, int keep_days, boolean auto_delete);
@ -288,9 +289,12 @@ public interface DaoFolder {
@Query("UPDATE folder SET read_only = :read_only WHERE id = :id")
int setFolderReadOnly(long id, boolean read_only);
@Query("UPDATE folder SET tbc = null WHERE id = :id")
@Query("UPDATE folder SET tbc = NULL WHERE id = :id")
int resetFolderTbc(long id);
@Query("UPDATE folder SET `rename` = NULL WHERE id = :id")
int resetFolderRename(long id);
@Query("UPDATE folder SET tbd = 1 WHERE id = :id")
int setFolderTbd(long id);

View File

@ -103,6 +103,7 @@ public class EntityFolder extends EntityOrder implements Serializable {
public Integer initialize = DEFAULT_KEEP;
public Boolean tbc; // to be created
public Boolean tbd; // to be deleted
public String rename;
public String state;
public String sync_state;
@NonNull
@ -311,6 +312,7 @@ public class EntityFolder extends EntityOrder implements Serializable {
Helper.equal(this.keywords, other.keywords) &&
this.initialize.equals(other.initialize) &&
Objects.equals(this.tbc, other.tbc) &&
Objects.equals(this.rename, other.rename) &&
Objects.equals(this.tbd, other.tbd) &&
Objects.equals(this.state, other.state) &&
Objects.equals(this.sync_state, other.sync_state) &&

View File

@ -222,7 +222,7 @@ public class FragmentFolder extends FragmentBase {
Helper.setViewsEnabled(view, true);
etName.setEnabled(folder == null);
etName.setEnabled(folder == null || EntityFolder.USER.equals(folder.type));
cbPoll.setEnabled(cbSynchronize.isChecked());
cbDownload.setEnabled(cbSynchronize.isChecked());
etKeepDays.setEnabled(!cbKeepAll.isChecked());
@ -361,7 +361,7 @@ public class FragmentFolder extends FragmentBase {
boolean should = args.getBoolean("should");
if (TextUtils.isEmpty(display))
if (TextUtils.isEmpty(display) || display.equals(name))
display = null;
int sync_days = (TextUtils.isEmpty(sync) ? EntityFolder.DEFAULT_SYNC : Integer.parseInt(sync));
@ -380,6 +380,8 @@ public class FragmentFolder extends FragmentBase {
if (folder == null)
return !TextUtils.isEmpty(name);
if (!Objects.equals(folder.name, name))
return true;
if (!Objects.equals(folder.display, display))
return true;
if (!Objects.equals(folder.unified, unified))
@ -406,9 +408,6 @@ public class FragmentFolder extends FragmentBase {
return false;
}
if (TextUtils.isEmpty(display) || display.equals(name))
display = null;
if (folder == null) {
reload = true;
Log.i("Creating folder=" + name + " parent=" + parent);
@ -423,7 +422,8 @@ public class FragmentFolder extends FragmentBase {
if (TextUtils.isEmpty(name))
throw new IllegalArgumentException(context.getString(R.string.title_folder_name_missing));
if (db.folder().getFolderByName(aid, name) != null)
EntityFolder target = db.folder().getFolderByName(aid, name);
if (target != null)
throw new IllegalArgumentException(context.getString(R.string.title_folder_exists, name));
EntityFolder create = new EntityFolder();
@ -443,11 +443,19 @@ public class FragmentFolder extends FragmentBase {
create.tbc = true;
db.folder().insertFolder(create);
} else {
reload = (!folder.synchronize.equals(synchronize) ||
if (!folder.name.equals(name)) {
EntityFolder target = db.folder().getFolderByName(folder.account, name);
if (target != null)
throw new IllegalArgumentException(context.getString(R.string.title_folder_exists, name));
}
reload = (!folder.name.equals(name) ||
!folder.synchronize.equals(synchronize) ||
!folder.poll.equals(poll));
Log.i("Updating folder=" + name);
Log.i("Updating folder=" + folder.name);
db.folder().setFolderProperties(id,
folder.name.equals(name) ? null : name,
display, unified, navigation, notify, hide,
synchronize, poll, download,
sync_days, keep_days, auto_delete);