Collapsible folder selector

This commit is contained in:
M66B
2019-05-25 22:51:44 +02:00
parent 9dd73d9d46
commit dca3447446
7 changed files with 234 additions and 343 deletions

View File

@@ -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);
}
}