Load drafts from server when needed

pull/147/head
M66B 6 years ago
parent 82e5561f18
commit 72c806eb88

@ -79,7 +79,6 @@ import java.io.BufferedOutputStream;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
@ -114,6 +113,8 @@ import androidx.recyclerview.widget.RecyclerView;
import static android.app.Activity.RESULT_OK;
public class FragmentCompose extends FragmentEx {
private enum State {NONE, LOADING, LOADED}
private ViewGroup view;
private Spinner spAccount;
private Spinner spIdentity;
@ -145,8 +146,9 @@ public class FragmentCompose extends FragmentEx {
private AdapterAttachment adapter;
private long working = -1;
private boolean busy = false;
private State state = State.NONE;
private boolean autosave = false;
private boolean busy = false;
private boolean pro = false;
private OpenPgpServiceConnection pgpService;
@ -475,8 +477,8 @@ public class FragmentCompose extends FragmentEx {
public void onPrepareOptionsMenu(Menu menu) {
super.onPrepareOptionsMenu(menu);
menu.findItem(R.id.menu_addresses).setVisible(working >= 0);
menu.findItem(R.id.menu_clear).setVisible(working >= 0);
menu.findItem(R.id.menu_encrypt).setVisible(working >= 0);
menu.findItem(R.id.menu_clear).setVisible(state == State.LOADED);
menu.findItem(R.id.menu_encrypt).setVisible(state == State.LOADED);
menu.findItem(R.id.menu_clear).setEnabled(!busy);
menu.findItem(R.id.menu_encrypt).setEnabled(!busy);
@ -890,7 +892,9 @@ public class FragmentCompose extends FragmentEx {
}
private void handleExit() {
if (isEmpty())
if (state != State.LOADED)
finish();
else if (isEmpty())
onAction(R.id.action_delete);
else
new DialogBuilderLifecycle(getContext(), getViewLifecycleOwner())
@ -1080,12 +1084,9 @@ public class FragmentCompose extends FragmentEx {
result.draft = db.message().getMessage(id);
if (result.draft == null || result.draft.ui_hide) {
// New draft
if ("edit".equals(action))
throw new IllegalStateException("Message to edit not found");
} else {
result.account = db.account().getAccount(result.draft.account);
return result;
}
throw new IllegalStateException("Draft not found hide=" + (result.draft != null));
EntityMessage ref = db.message().getMessage(reference);
if (ref == null) {
@ -1297,6 +1298,15 @@ public class FragmentCompose extends FragmentEx {
}
EntityOperation.queue(db, result.draft, EntityOperation.ADD);
} else {
// Existing draft
result.account = db.account().getAccount(result.draft.account);
if (!result.draft.content) {
if (result.draft.uid == null)
throw new IllegalStateException("Draft without uid");
EntityOperation.queue(db, result.draft, EntityOperation.BODY);
}
}
db.setTransactionSuccessful();
} finally {
@ -1309,7 +1319,6 @@ public class FragmentCompose extends FragmentEx {
@Override
protected void onLoaded(Bundle args, final DraftAccount result) {
working = result.draft.id;
autosave = true;
final String action = getArguments().getString("action");
Log.i(Helper.TAG, "Loaded draft id=" + result.draft.id + " action=" + action);
@ -1320,76 +1329,13 @@ public class FragmentCompose extends FragmentEx {
etBcc.setText(MessageHelper.getFormattedAddresses(result.draft.bcc, true));
etSubject.setText(result.draft.subject);
etBody.setText(null);
final Bundle a = new Bundle();
a.putLong("id", result.draft.id);
if (result.draft.replying != null)
a.putLong("reference", result.draft.replying);
else if (result.draft.forwarding != null)
a.putLong("reference", result.draft.forwarding);
new SimpleTask<Spanned[]>() {
@Override
protected Spanned[] onLoad(final Context context, Bundle args) throws Throwable {
long id = args.getLong("id");
final long reference = args.getLong("reference", -1);
String body = EntityMessage.read(context, id);
String quote = (reference < 0 ? null : HtmlHelper.getQuote(context, reference, true));
return new Spanned[]{
Html.fromHtml(body, cidGetter, null),
quote == null ? null : Html.fromHtml(quote,
new Html.ImageGetter() {
@Override
public Drawable getDrawable(String source) {
return HtmlHelper.decodeImage(source, context, reference, false);
}
},
null)};
}
@Override
protected void onLoaded(Bundle args, Spanned[] texts) {
etBody.setText(texts[0]);
etBody.setSelection(0);
tvReference.setText(texts[1]);
grpReference.setVisibility(texts[1] == null ? View.GONE : View.VISIBLE);
new Handler().post(new Runnable() {
@Override
public void run() {
if (TextUtils.isEmpty(etTo.getText()))
etTo.requestFocus();
else if (TextUtils.isEmpty(etSubject.getText()))
etSubject.requestFocus();
else
etBody.requestFocus();
}
});
}
@Override
protected void onException(Bundle args, Throwable ex) {
if (!(ex instanceof FileNotFoundException))
Helper.unexpectedError(getContext(), getViewLifecycleOwner(), ex);
}
}.load(FragmentCompose.this, a);
getActivity().invalidateOptionsMenu();
Helper.setViewsEnabled(view, true);
boolean sender = PreferenceManager.getDefaultSharedPreferences(getContext()).getBoolean("sender", false);
pbWait.setVisibility(View.GONE);
grpHeader.setVisibility(View.VISIBLE);
grpExtra.setVisibility(sender ? View.VISIBLE : View.GONE);
grpAddresses.setVisibility("reply_all".equals(action) ? View.VISIBLE : View.GONE);
etBody.setVisibility(View.VISIBLE);
edit_bar.setVisibility(View.VISIBLE);
bottom_navigation.setVisibility(View.VISIBLE);
getActivity().invalidateOptionsMenu();
final DB db = DB.getInstance(getContext());
@ -1517,15 +1463,80 @@ public class FragmentCompose extends FragmentEx {
// Draft was deleted
if (draft == null || draft.ui_hide)
finish();
else if (draft.content && state == State.NONE) {
state = State.LOADING;
Bundle args = new Bundle();
args.putLong("id", result.draft.id);
if (result.draft.replying != null)
args.putLong("reference", result.draft.replying);
else if (result.draft.forwarding != null)
args.putLong("reference", result.draft.forwarding);
new SimpleTask<Spanned[]>() {
@Override
protected Spanned[] onLoad(final Context context, Bundle args) throws Throwable {
long id = args.getLong("id");
final long reference = args.getLong("reference", -1);
String body = EntityMessage.read(context, id);
String quote = (reference < 0 ? null : HtmlHelper.getQuote(context, reference, true));
return new Spanned[]{
Html.fromHtml(body, cidGetter, null),
quote == null ? null : Html.fromHtml(quote,
new Html.ImageGetter() {
@Override
public Drawable getDrawable(String source) {
return HtmlHelper.decodeImage(source, context, reference, false);
}
},
null)};
}
@Override
protected void onLoaded(Bundle args, Spanned[] texts) {
etBody.setText(texts[0]);
etBody.setSelection(0);
tvReference.setText(texts[1]);
state = State.LOADED;
autosave = true;
pbWait.setVisibility(View.GONE);
etBody.setVisibility(View.VISIBLE);
grpReference.setVisibility(texts[1] == null ? View.GONE : View.VISIBLE);
edit_bar.setVisibility(View.VISIBLE);
bottom_navigation.setVisibility(View.VISIBLE);
Helper.setViewsEnabled(view, true);
getActivity().invalidateOptionsMenu();
new Handler().post(new Runnable() {
@Override
public void run() {
if (TextUtils.isEmpty(etTo.getText()))
etTo.requestFocus();
else if (TextUtils.isEmpty(etSubject.getText()))
etSubject.requestFocus();
else
etBody.requestFocus();
}
});
}
@Override
protected void onException(Bundle args, Throwable ex) {
Helper.unexpectedError(getContext(), getViewLifecycleOwner(), ex);
}
}.load(FragmentCompose.this, args);
}
}
});
}
@Override
protected void onException(Bundle args, Throwable ex) {
if (ex instanceof IllegalArgumentException)
Snackbar.make(view, ex.getMessage(), Snackbar.LENGTH_LONG).show();
else
Helper.unexpectedError(getContext(), getViewLifecycleOwner(), ex);
}
};

Loading…
Cancel
Save