mirror of
https://github.com/M66B/FairEmail.git
synced 2026-04-02 15:17:03 +02:00
Collapsible folder selector
This commit is contained in:
@@ -69,6 +69,7 @@ public class AdapterFolder extends RecyclerView.Adapter<AdapterFolder.ViewHolder
|
||||
private boolean show_hidden;
|
||||
|
||||
private long account;
|
||||
private IFolderSelectedListener listener;
|
||||
|
||||
private boolean subscriptions;
|
||||
private boolean debug;
|
||||
@@ -141,7 +142,7 @@ public class AdapterFolder extends RecyclerView.Adapter<AdapterFolder.ViewHolder
|
||||
private void bindTo(final TupleFolderEx folder) {
|
||||
boolean hidden = (folder.hide && !show_hidden);
|
||||
|
||||
int level = 1;
|
||||
int level = 0;
|
||||
TupleFolderEx parent = folder.parent_ref;
|
||||
while (parent != null) {
|
||||
level++;
|
||||
@@ -150,6 +151,20 @@ public class AdapterFolder extends RecyclerView.Adapter<AdapterFolder.ViewHolder
|
||||
parent = parent.parent_ref;
|
||||
}
|
||||
|
||||
boolean root_childs_visible = false;
|
||||
if (folder.parent_ref != null &&
|
||||
folder.parent_ref.parent_ref == null &&
|
||||
folder.parent_ref.child_refs != null) {
|
||||
for (TupleFolderEx root : folder.parent_ref.child_refs)
|
||||
if ((!root.hide || show_hidden) && root.child_refs != null)
|
||||
for (TupleFolderEx child : root.child_refs)
|
||||
if (!child.hide || show_hidden) {
|
||||
root_childs_visible = true;
|
||||
break;
|
||||
}
|
||||
} else
|
||||
root_childs_visible = true;
|
||||
|
||||
boolean childs_visible = false;
|
||||
if (folder.child_refs != null)
|
||||
for (TupleFolderEx child : folder.child_refs)
|
||||
@@ -165,49 +180,53 @@ public class AdapterFolder extends RecyclerView.Adapter<AdapterFolder.ViewHolder
|
||||
if (textSize != 0)
|
||||
tvName.setTextSize(TypedValue.COMPLEX_UNIT_PX, textSize);
|
||||
|
||||
vwColor.setBackgroundColor(folder.accountColor == null ? Color.TRANSPARENT : folder.accountColor);
|
||||
vwColor.setVisibility(account < 0 ? View.VISIBLE : View.GONE);
|
||||
if (listener == null) {
|
||||
vwColor.setBackgroundColor(folder.accountColor == null ? Color.TRANSPARENT : folder.accountColor);
|
||||
vwColor.setVisibility(account < 0 ? View.VISIBLE : View.GONE);
|
||||
|
||||
if (folder.sync_state == null || "requested".equals(folder.sync_state)) {
|
||||
if (folder.executing > 0)
|
||||
ivState.setImageResource(R.drawable.baseline_dns_24);
|
||||
else if ("waiting".equals(folder.state))
|
||||
ivState.setImageResource(R.drawable.baseline_hourglass_empty_24);
|
||||
else if ("connected".equals(folder.state))
|
||||
ivState.setImageResource(R.drawable.baseline_cloud_24);
|
||||
else if ("connecting".equals(folder.state))
|
||||
ivState.setImageResource(R.drawable.baseline_cloud_queue_24);
|
||||
else if ("closing".equals(folder.state))
|
||||
ivState.setImageResource(R.drawable.baseline_close_24);
|
||||
else if (folder.state == null)
|
||||
ivState.setImageResource(R.drawable.baseline_cloud_off_24);
|
||||
else
|
||||
ivState.setImageResource(R.drawable.baseline_warning_24);
|
||||
} else {
|
||||
if ("syncing".equals(folder.sync_state))
|
||||
ivState.setImageResource(R.drawable.baseline_compare_arrows_24);
|
||||
else if ("downloading".equals(folder.sync_state))
|
||||
ivState.setImageResource(R.drawable.baseline_cloud_download_24);
|
||||
else
|
||||
ivState.setImageResource(R.drawable.baseline_warning_24);
|
||||
if (folder.sync_state == null || "requested".equals(folder.sync_state)) {
|
||||
if (folder.executing > 0)
|
||||
ivState.setImageResource(R.drawable.baseline_dns_24);
|
||||
else if ("waiting".equals(folder.state))
|
||||
ivState.setImageResource(R.drawable.baseline_hourglass_empty_24);
|
||||
else if ("connected".equals(folder.state))
|
||||
ivState.setImageResource(R.drawable.baseline_cloud_24);
|
||||
else if ("connecting".equals(folder.state))
|
||||
ivState.setImageResource(R.drawable.baseline_cloud_queue_24);
|
||||
else if ("closing".equals(folder.state))
|
||||
ivState.setImageResource(R.drawable.baseline_close_24);
|
||||
else if (folder.state == null)
|
||||
ivState.setImageResource(R.drawable.baseline_cloud_off_24);
|
||||
else
|
||||
ivState.setImageResource(R.drawable.baseline_warning_24);
|
||||
} else {
|
||||
if ("syncing".equals(folder.sync_state))
|
||||
ivState.setImageResource(R.drawable.baseline_compare_arrows_24);
|
||||
else if ("downloading".equals(folder.sync_state))
|
||||
ivState.setImageResource(R.drawable.baseline_cloud_download_24);
|
||||
else
|
||||
ivState.setImageResource(R.drawable.baseline_warning_24);
|
||||
}
|
||||
ivState.setVisibility(
|
||||
folder.synchronize || folder.state != null || folder.sync_state != null
|
||||
? View.VISIBLE : View.INVISIBLE);
|
||||
|
||||
ivReadOnly.setVisibility(folder.read_only ? View.VISIBLE : View.GONE);
|
||||
}
|
||||
ivState.setVisibility(
|
||||
folder.synchronize || folder.state != null || folder.sync_state != null
|
||||
? View.VISIBLE : View.INVISIBLE);
|
||||
|
||||
ivReadOnly.setVisibility(folder.read_only ? View.VISIBLE : View.GONE);
|
||||
|
||||
ViewGroup.LayoutParams lp = vwLevel.getLayoutParams();
|
||||
lp.width = (account < 0 ? 1 : level) * dp12;
|
||||
vwLevel.setLayoutParams(lp);
|
||||
|
||||
ivExpander.setImageLevel(folder.collapsed ? 1 /* more */ : 0 /* less */);
|
||||
ivExpander.setVisibility(account < 0
|
||||
ivExpander.setVisibility(account < 0 || !root_childs_visible
|
||||
? View.GONE
|
||||
: childs_visible ? View.VISIBLE : View.INVISIBLE);
|
||||
|
||||
ivNotify.setVisibility(folder.notify ? View.VISIBLE : View.GONE);
|
||||
ivSubscribed.setVisibility(subscriptions && folder.subscribed != null && folder.subscribed ? View.VISIBLE : View.GONE);
|
||||
if (listener == null) {
|
||||
ivNotify.setVisibility(folder.notify ? View.VISIBLE : View.GONE);
|
||||
ivSubscribed.setVisibility(subscriptions && folder.subscribed != null && folder.subscribed ? View.VISIBLE : View.GONE);
|
||||
}
|
||||
|
||||
if (folder.unseen > 0)
|
||||
tvName.setText(context.getString(R.string.title_name_count,
|
||||
@@ -219,60 +238,65 @@ public class AdapterFolder extends RecyclerView.Adapter<AdapterFolder.ViewHolder
|
||||
tvName.setTypeface(null, folder.unseen > 0 ? Typeface.BOLD : Typeface.NORMAL);
|
||||
tvName.setTextColor(folder.unseen > 0 ? colorUnread : textColorSecondary);
|
||||
|
||||
StringBuilder sb = new StringBuilder();
|
||||
if (folder.account == null)
|
||||
sb.append(nf.format(folder.messages));
|
||||
else {
|
||||
sb.append(nf.format(folder.content));
|
||||
sb.append('/');
|
||||
sb.append(nf.format(folder.messages));
|
||||
sb.append('/');
|
||||
if (folder.total == null)
|
||||
sb.append('?');
|
||||
else
|
||||
sb.append(nf.format(folder.total));
|
||||
}
|
||||
tvMessages.setText(sb.toString());
|
||||
if (listener == null) {
|
||||
StringBuilder sb = new StringBuilder();
|
||||
if (folder.account == null)
|
||||
sb.append(nf.format(folder.messages));
|
||||
else {
|
||||
sb.append(nf.format(folder.content));
|
||||
sb.append('/');
|
||||
sb.append(nf.format(folder.messages));
|
||||
sb.append('/');
|
||||
if (folder.total == null)
|
||||
sb.append('?');
|
||||
else
|
||||
sb.append(nf.format(folder.total));
|
||||
}
|
||||
tvMessages.setText(sb.toString());
|
||||
|
||||
ivMessages.setImageResource(folder.download || EntityFolder.OUTBOX.equals(folder.type)
|
||||
? R.drawable.baseline_mail_24 : R.drawable.baseline_mail_outline_24);
|
||||
ivMessages.setImageResource(folder.download || EntityFolder.OUTBOX.equals(folder.type)
|
||||
? R.drawable.baseline_mail_24 : R.drawable.baseline_mail_outline_24);
|
||||
}
|
||||
|
||||
ivType.setImageResource(EntityFolder.getIcon(folder.type));
|
||||
ivUnified.setVisibility(account > 0 && folder.unified ? View.VISIBLE : View.GONE);
|
||||
|
||||
if (account < 0)
|
||||
tvType.setText(folder.accountName);
|
||||
else {
|
||||
int resid = context.getResources().getIdentifier(
|
||||
"title_folder_" + folder.type.toLowerCase(),
|
||||
"string",
|
||||
context.getPackageName());
|
||||
tvType.setText(resid > 0 ? context.getString(resid) : folder.type);
|
||||
if (listener == null) {
|
||||
ivUnified.setVisibility(account > 0 && folder.unified ? View.VISIBLE : View.GONE);
|
||||
|
||||
if (account < 0)
|
||||
tvType.setText(folder.accountName);
|
||||
else {
|
||||
int resid = context.getResources().getIdentifier(
|
||||
"title_folder_" + folder.type.toLowerCase(),
|
||||
"string",
|
||||
context.getPackageName());
|
||||
tvType.setText(resid > 0 ? context.getString(resid) : folder.type);
|
||||
}
|
||||
|
||||
if (folder.account == null) {
|
||||
tvAfter.setText(null);
|
||||
ivSync.setImageResource(R.drawable.baseline_sync_24);
|
||||
} else {
|
||||
StringBuilder a = new StringBuilder();
|
||||
a.append(nf.format(folder.sync_days));
|
||||
a.append('/');
|
||||
if (folder.keep_days == Integer.MAX_VALUE)
|
||||
a.append('∞');
|
||||
else
|
||||
a.append(nf.format(folder.keep_days));
|
||||
tvAfter.setText(a.toString());
|
||||
ivSync.setImageResource(folder.synchronize ? R.drawable.baseline_sync_24 : R.drawable.baseline_sync_disabled_24);
|
||||
}
|
||||
ivSync.setImageTintList(ColorStateList.valueOf(
|
||||
folder.synchronize && folder.initialize && !EntityFolder.OUTBOX.equals(folder.type)
|
||||
? colorUnread : textColorSecondary));
|
||||
|
||||
tvKeywords.setText(TextUtils.join(" ", folder.keywords));
|
||||
tvKeywords.setVisibility(debug && folder.keywords.length > 0 ? View.VISIBLE : View.GONE);
|
||||
|
||||
tvError.setText(folder.error);
|
||||
tvError.setVisibility(folder.error != null ? View.VISIBLE : View.GONE);
|
||||
}
|
||||
|
||||
if (folder.account == null) {
|
||||
tvAfter.setText(null);
|
||||
ivSync.setImageResource(R.drawable.baseline_sync_24);
|
||||
} else {
|
||||
StringBuilder a = new StringBuilder();
|
||||
a.append(nf.format(folder.sync_days));
|
||||
a.append('/');
|
||||
if (folder.keep_days == Integer.MAX_VALUE)
|
||||
a.append('∞');
|
||||
else
|
||||
a.append(nf.format(folder.keep_days));
|
||||
tvAfter.setText(a.toString());
|
||||
ivSync.setImageResource(folder.synchronize ? R.drawable.baseline_sync_24 : R.drawable.baseline_sync_disabled_24);
|
||||
}
|
||||
ivSync.setImageTintList(ColorStateList.valueOf(
|
||||
folder.synchronize && folder.initialize && !EntityFolder.OUTBOX.equals(folder.type)
|
||||
? colorUnread : textColorSecondary));
|
||||
|
||||
tvKeywords.setText(TextUtils.join(" ", folder.keywords));
|
||||
tvKeywords.setVisibility(debug && folder.keywords.length > 0 ? View.VISIBLE : View.GONE);
|
||||
|
||||
tvError.setText(folder.error);
|
||||
tvError.setVisibility(folder.error != null ? View.VISIBLE : View.GONE);
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -288,15 +312,24 @@ public class AdapterFolder extends RecyclerView.Adapter<AdapterFolder.ViewHolder
|
||||
if (view.getId() == R.id.ivExpander)
|
||||
onCollapse(folder);
|
||||
else {
|
||||
LocalBroadcastManager lbm = LocalBroadcastManager.getInstance(context);
|
||||
lbm.sendBroadcast(
|
||||
new Intent(ActivityView.ACTION_VIEW_MESSAGES)
|
||||
.putExtra("account", folder.account)
|
||||
.putExtra("folder", folder.id));
|
||||
if (listener == null) {
|
||||
LocalBroadcastManager lbm = LocalBroadcastManager.getInstance(context);
|
||||
lbm.sendBroadcast(
|
||||
new Intent(ActivityView.ACTION_VIEW_MESSAGES)
|
||||
.putExtra("account", folder.account)
|
||||
.putExtra("folder", folder.id));
|
||||
} else
|
||||
listener.onFolderSelected(folder);
|
||||
}
|
||||
}
|
||||
|
||||
private void onCollapse(TupleFolderEx folder) {
|
||||
if (listener != null) {
|
||||
folder.collapsed = !folder.collapsed;
|
||||
notifyDataSetChanged();
|
||||
return;
|
||||
}
|
||||
|
||||
Bundle args = new Bundle();
|
||||
args.putLong("id", folder.id);
|
||||
args.putBoolean("collapsed", !folder.collapsed);
|
||||
@@ -648,12 +681,13 @@ public class AdapterFolder extends RecyclerView.Adapter<AdapterFolder.ViewHolder
|
||||
}
|
||||
}
|
||||
|
||||
AdapterFolder(Context context, LifecycleOwner owner, long account, boolean show_hidden) {
|
||||
AdapterFolder(Context context, LifecycleOwner owner, long account, boolean show_hidden, IFolderSelectedListener listener) {
|
||||
this.context = context;
|
||||
this.inflater = LayoutInflater.from(context);
|
||||
this.owner = owner;
|
||||
this.account = account;
|
||||
this.show_hidden = show_hidden;
|
||||
this.listener = listener;
|
||||
|
||||
SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(context);
|
||||
boolean compact = prefs.getBoolean("compact", false);
|
||||
@@ -696,11 +730,18 @@ public class AdapterFolder extends RecyclerView.Adapter<AdapterFolder.ViewHolder
|
||||
}
|
||||
}
|
||||
|
||||
TupleFolderEx root = new TupleFolderEx();
|
||||
root.child_refs = parents;
|
||||
for (TupleFolderEx parent : parents)
|
||||
parent.parent_ref = root;
|
||||
|
||||
for (long pid : parentChilds.keySet()) {
|
||||
TupleFolderEx parent = idFolder.get(pid);
|
||||
parent.child_refs = parentChilds.get(pid);
|
||||
for (TupleFolderEx child : parent.child_refs)
|
||||
child.parent_ref = parent;
|
||||
if (parent != null) {
|
||||
parent.child_refs = parentChilds.get(pid);
|
||||
for (TupleFolderEx child : parent.child_refs)
|
||||
child.parent_ref = parent;
|
||||
}
|
||||
}
|
||||
|
||||
List<TupleFolderEx> hierarchical = getHierchical(parents);
|
||||
@@ -783,7 +824,9 @@ public class AdapterFolder extends RecyclerView.Adapter<AdapterFolder.ViewHolder
|
||||
TupleFolderEx f1 = prev.get(oldItemPosition);
|
||||
TupleFolderEx f2 = next.get(newItemPosition);
|
||||
boolean e = f1.equals(f2);
|
||||
if (!e || f1.parent_ref == null || f2.parent_ref == null)
|
||||
if (!e ||
|
||||
f1.parent_ref == null || f1.parent_ref.id == null ||
|
||||
f2.parent_ref == null || f2.parent_ref.id == null)
|
||||
return e;
|
||||
return f1.parent_ref.equals(f2.parent_ref);
|
||||
}
|
||||
@@ -802,7 +845,9 @@ public class AdapterFolder extends RecyclerView.Adapter<AdapterFolder.ViewHolder
|
||||
@Override
|
||||
@NonNull
|
||||
public ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
|
||||
return new ViewHolder(inflater.inflate(R.layout.item_folder, parent, false));
|
||||
return new ViewHolder(inflater.inflate(
|
||||
listener == null ? R.layout.item_folder : R.layout.item_folder_select,
|
||||
parent, false));
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -819,4 +864,8 @@ public class AdapterFolder extends RecyclerView.Adapter<AdapterFolder.ViewHolder
|
||||
|
||||
holder.wire();
|
||||
}
|
||||
|
||||
interface IFolderSelectedListener {
|
||||
void onFolderSelected(TupleFolderEx folder);
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user