mirror of https://github.com/M66B/FairEmail.git
Support for renaming folders
This commit is contained in:
parent
c4ebff4c09
commit
1ed78da2a0
File diff suppressed because it is too large
Load Diff
|
@ -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);
|
||||||
|
|
||||||
|
|
|
@ -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 +
|
||||||
|
|
|
@ -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();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -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);
|
||||||
|
|
||||||
|
|
|
@ -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) &&
|
||||||
|
|
|
@ -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);
|
||||||
|
|
Loading…
Reference in New Issue