Properly handle transient states

This commit is contained in:
M66B 2018-10-17 08:36:25 +00:00
parent f336306606
commit 52b23befe6
2 changed files with 54 additions and 37 deletions

View File

@ -204,12 +204,6 @@ public class AdapterMessage extends PagedListAdapter<TupleMessageEx, AdapterMess
grpAttachments = itemView.findViewById(R.id.grpAttachments);
grpExpanded = itemView.findViewById(R.id.grpExpanded);
bnvActions.setHasTransientState(viewType == ViewType.THREAD);
btnImages.setHasTransientState(viewType == ViewType.THREAD);
tvBody.setHasTransientState(viewType == ViewType.THREAD);
pbBody.setHasTransientState(viewType == ViewType.THREAD);
grpAttachments.setHasTransientState(viewType == ViewType.THREAD);
tvBody.setMovementMethod(new UrlHandler());
}
@ -351,13 +345,13 @@ public class AdapterMessage extends PagedListAdapter<TupleMessageEx, AdapterMess
tvTime.setTextColor(colorUnseen);
grpExpanded.setVisibility(viewType == ViewType.THREAD && show_expanded ? View.VISIBLE : View.GONE);
grpHeaders.setVisibility(View.GONE);
pbHeaders.setVisibility(View.GONE);
grpHeaders.setVisibility(show_headers && show_expanded ? View.VISIBLE : View.GONE);
bnvActions.setVisibility(View.GONE);
btnImages.setVisibility(View.GONE);
pbBody.setVisibility(View.GONE);
grpAttachments.setVisibility(View.GONE);
grpAttachments.setVisibility(message.attachments > 0 && show_expanded ? View.VISIBLE : View.GONE);
db.folder().liveFolders(message.account).removeObservers(owner);
db.attachment().liveAttachments(message.id).removeObservers(owner);
@ -382,7 +376,6 @@ public class AdapterMessage extends PagedListAdapter<TupleMessageEx, AdapterMess
tvSubjectEx.setText(message.subject);
tvHeaders.setText(show_headers ? message.headers : null);
grpHeaders.setVisibility(show_headers ? View.VISIBLE : View.GONE);
tvBody.setText(null);
pbBody.setVisibility(View.VISIBLE);
@ -393,9 +386,11 @@ public class AdapterMessage extends PagedListAdapter<TupleMessageEx, AdapterMess
bodyTask.load(context, owner, args);
}
bnvActions.setHasTransientState(true);
db.folder().liveFolders(message.account).observe(owner, new Observer<List<TupleFolderEx>>() {
@Override
public void onChanged(@Nullable List<TupleFolderEx> folders) {
if (bnvActions.hasTransientState()) {
boolean hasTrash = false;
boolean hasArchive = false;
boolean hasUser = false;
@ -426,6 +421,9 @@ public class AdapterMessage extends PagedListAdapter<TupleMessageEx, AdapterMess
bnvActions.getMenu().findItem(R.id.action_reply).setVisible(message.content && !inOutbox);
bnvActions.setVisibility(View.VISIBLE);
bnvActions.setHasTransientState(false);
}
}
});
@ -438,7 +436,6 @@ public class AdapterMessage extends PagedListAdapter<TupleMessageEx, AdapterMess
attachments = new ArrayList<>();
adapter.set(attachments);
grpAttachments.setVisibility(attachments.size() > 0 ? View.VISIBLE : View.GONE);
if (message.content) {
Bundle args = new Bundle();
@ -542,6 +539,13 @@ public class AdapterMessage extends PagedListAdapter<TupleMessageEx, AdapterMess
}
private SimpleTask<Spanned> bodyTask = new SimpleTask<Spanned>() {
@Override
protected void onInit(Bundle args) {
btnImages.setHasTransientState(true);
tvBody.setHasTransientState(true);
pbBody.setHasTransientState(true);
}
@Override
protected Spanned onLoad(final Context context, final Bundle args) throws Throwable {
TupleMessageEx message = (TupleMessageEx) args.getSerializable("message");
@ -559,12 +563,20 @@ public class AdapterMessage extends PagedListAdapter<TupleMessageEx, AdapterMess
boolean show_images = properties.showImages(message.id);
btnImages.setVisibility(has_images && show_expanded && !show_images ? View.VISIBLE : View.GONE);
pbBody.setVisibility(View.GONE);
tvBody.setText(body);
pbBody.setVisibility(View.GONE);
btnImages.setHasTransientState(false);
tvBody.setHasTransientState(false);
pbBody.setHasTransientState(false);
}
@Override
protected void onException(Bundle args, Throwable ex) {
btnImages.setHasTransientState(false);
tvBody.setHasTransientState(false);
pbBody.setHasTransientState(false);
Helper.unexpectedError(context, ex);
}
};

View File

@ -118,6 +118,8 @@ public abstract class SimpleTask<T> implements LifecycleObserver {
this.stored = null;
owner.getLifecycle().addObserver(this);
onInit(args);
// Run in background thread
executor.submit(new Runnable() {
@Override
@ -162,6 +164,9 @@ public abstract class SimpleTask<T> implements LifecycleObserver {
}
}
protected void onInit(Bundle args) {
}
protected T onLoad(Context context, Bundle args) throws Throwable {
// Be careful not to access members in outer scopes
return null;