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) { 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) view.setAlpha(folder.hide || !folder.selectable || disabledIds.contains(folder.id)
? Helper.LOW_LIGHT : 1.0f); ? Helper.LOW_LIGHT : 1.0f);

View File

@ -801,6 +801,18 @@ class Core {
db.folder().resetFolderTbc(folder.id); db.folder().resetFolderTbc(folder.id);
local.put(folder.name, folder); local.put(folder.name, folder);
sync_folders = true; 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) { } else if (folder.tbd != null && folder.tbd) {
Log.i(folder.name + " deleting"); Log.i(folder.name + " deleting");
Folder ifolder = istore.getFolder(folder.name); Folder ifolder = istore.getFolder(folder.name);
@ -808,6 +820,7 @@ class Core {
ifolder.delete(false); ifolder.delete(false);
db.folder().deleteFolder(folder.id); db.folder().deleteFolder(folder.id);
sync_folders = true; sync_folders = true;
} else { } else {
local.put(folder.name, folder); local.put(folder.name, folder);
if (folder.initialize != 0) if (folder.initialize != 0)
@ -864,7 +877,7 @@ class Core {
String type = EntityFolder.getType(attr, fullName, false); String type = EntityFolder.getType(attr, fullName, false);
boolean selectable = !Arrays.asList(attr).contains("\\Noselect"); boolean selectable = !Arrays.asList(attr).contains("\\Noselect");
if (EntityFolder.INBOX.equals(type)) if (EntityFolder.INBOX.equals(type) || fullName.equals(childName))
childName = null; childName = null;
Log.i(account.name + ":" + fullName + " subscribed=" + subscribed + 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 // https://developer.android.com/topic/libraries/architecture/room.html
@Database( @Database(
version = 97, version = 98,
entities = { entities = {
EntityIdentity.class, EntityIdentity.class,
EntityAccount.class, EntityAccount.class,
@ -984,6 +984,13 @@ public abstract class DB extends RoomDatabase {
db.execSQL("ALTER TABLE `folder` ADD COLUMN `uidv` INTEGER"); 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(); .build();
} }

View File

@ -249,7 +249,8 @@ public interface DaoFolder {
int setFoldersUser(long account); int setFoldersUser(long account);
@Query("UPDATE folder" + @Query("UPDATE folder" +
" SET display = :display" + " SET `rename` = :rename" +
", display = :display" +
", unified = :unified" + ", unified = :unified" +
", navigation = :navigation" + ", navigation = :navigation" +
", notify = :notify" + ", notify = :notify" +
@ -262,7 +263,7 @@ public interface DaoFolder {
", auto_delete = :auto_delete" + ", auto_delete = :auto_delete" +
" WHERE id = :id") " WHERE id = :id")
int setFolderProperties( int setFolderProperties(
long id, long id, String rename,
String display, boolean unified, boolean navigation, boolean notify, boolean hide, String display, boolean unified, boolean navigation, boolean notify, boolean hide,
boolean synchronize, boolean poll, boolean download, boolean synchronize, boolean poll, boolean download,
int sync_days, int keep_days, boolean auto_delete); 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") @Query("UPDATE folder SET read_only = :read_only WHERE id = :id")
int setFolderReadOnly(long id, boolean read_only); 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); 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") @Query("UPDATE folder SET tbd = 1 WHERE id = :id")
int setFolderTbd(long id); int setFolderTbd(long id);

View File

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

View File

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