|
|
|
@ -93,7 +93,7 @@ public class FragmentCompose extends FragmentEx {
|
|
|
|
|
// Get arguments
|
|
|
|
|
Bundle args = getArguments();
|
|
|
|
|
String action = (args == null ? null : args.getString("action"));
|
|
|
|
|
final long id = (TextUtils.isEmpty(action) ? (args == null ? -1 : args.getLong("id")) : -1);
|
|
|
|
|
final long id = (TextUtils.isEmpty(action) ? (args == null ? -1 : args.getLong("id", -1)) : -1);
|
|
|
|
|
|
|
|
|
|
// Get controls
|
|
|
|
|
spFrom = view.findViewById(R.id.spFrom);
|
|
|
|
@ -159,14 +159,14 @@ public class FragmentCompose extends FragmentEx {
|
|
|
|
|
@Override
|
|
|
|
|
public boolean onNavigationItemSelected(@NonNull MenuItem item) {
|
|
|
|
|
switch (item.getItemId()) {
|
|
|
|
|
case R.id.action_delete:
|
|
|
|
|
actionDelete(id);
|
|
|
|
|
case R.id.action_trash:
|
|
|
|
|
actionPut(id, "trash");
|
|
|
|
|
return true;
|
|
|
|
|
case R.id.action_save:
|
|
|
|
|
actionPut(id, false);
|
|
|
|
|
actionPut(id, "save");
|
|
|
|
|
return true;
|
|
|
|
|
case R.id.action_send:
|
|
|
|
|
actionPut(id, true);
|
|
|
|
|
actionPut(id, "send");
|
|
|
|
|
return true;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
@ -179,7 +179,6 @@ public class FragmentCompose extends FragmentEx {
|
|
|
|
|
// Initialize
|
|
|
|
|
grpReady.setVisibility(View.GONE);
|
|
|
|
|
pbWait.setVisibility(View.VISIBLE);
|
|
|
|
|
bottom_navigation.getMenu().findItem(R.id.action_delete).setVisible(id > 0);
|
|
|
|
|
bottom_navigation.getMenu().setGroupEnabled(0, false);
|
|
|
|
|
|
|
|
|
|
DB.getInstance(getContext()).identity().liveIdentities(true).observe(FragmentCompose.this, new Observer<List<EntityIdentity>>() {
|
|
|
|
@ -279,15 +278,8 @@ public class FragmentCompose extends FragmentEx {
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private void actionDelete(final long id) {
|
|
|
|
|
bottom_navigation.getMenu().setGroupEnabled(0, false);
|
|
|
|
|
|
|
|
|
|
Bundle args = new Bundle();
|
|
|
|
|
args.putLong("id", id);
|
|
|
|
|
getLoaderManager().restartLoader(ActivityCompose.LOADER_COMPOSE_DELETE, args, deleteLoaderCallbacks).forceLoad();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private void actionPut(long id, boolean send) {
|
|
|
|
|
private void actionPut(long id, String action) {
|
|
|
|
|
Log.i(Helper.TAG, "Put id=" + id + " action=" + action);
|
|
|
|
|
bottom_navigation.getMenu().setGroupEnabled(0, false);
|
|
|
|
|
|
|
|
|
|
EntityIdentity identity = (EntityIdentity) spFrom.getSelectedItem();
|
|
|
|
@ -302,7 +294,7 @@ public class FragmentCompose extends FragmentEx {
|
|
|
|
|
args.putString("bcc", etBcc.getText().toString());
|
|
|
|
|
args.putString("subject", etSubject.getText().toString());
|
|
|
|
|
args.putString("body", etBody.getText().toString());
|
|
|
|
|
args.putBoolean("send", send);
|
|
|
|
|
args.putString("action", action);
|
|
|
|
|
|
|
|
|
|
getLoaderManager().restartLoader(ActivityCompose.LOADER_COMPOSE_PUT, args, putLoaderCallbacks).forceLoad();
|
|
|
|
|
}
|
|
|
|
@ -465,63 +457,6 @@ public class FragmentCompose extends FragmentEx {
|
|
|
|
|
}
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
private static class DeleteLoader extends AsyncTaskLoader<Throwable> {
|
|
|
|
|
private Bundle args;
|
|
|
|
|
|
|
|
|
|
DeleteLoader(Context context) {
|
|
|
|
|
super(context);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void setArgs(Bundle args) {
|
|
|
|
|
this.args = args;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
@Override
|
|
|
|
|
public Throwable loadInBackground() {
|
|
|
|
|
try {
|
|
|
|
|
long id = args.getLong("id");
|
|
|
|
|
DaoMessage message = DB.getInstance(getContext()).message();
|
|
|
|
|
EntityMessage draft = message.getMessage(id);
|
|
|
|
|
if (draft != null) {
|
|
|
|
|
draft.ui_hide = true;
|
|
|
|
|
message.updateMessage(draft);
|
|
|
|
|
EntityOperation.queue(getContext(), draft, EntityOperation.DELETE);
|
|
|
|
|
}
|
|
|
|
|
return null;
|
|
|
|
|
} catch (Throwable ex) {
|
|
|
|
|
return ex;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private LoaderManager.LoaderCallbacks deleteLoaderCallbacks = new LoaderManager.LoaderCallbacks<Throwable>() {
|
|
|
|
|
@NonNull
|
|
|
|
|
@Override
|
|
|
|
|
public Loader<Throwable> onCreateLoader(int id, @Nullable Bundle args) {
|
|
|
|
|
DeleteLoader loader = new DeleteLoader(getContext());
|
|
|
|
|
loader.setArgs(args);
|
|
|
|
|
return loader;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
@Override
|
|
|
|
|
public void onLoadFinished(@NonNull Loader<Throwable> loader, Throwable ex) {
|
|
|
|
|
getLoaderManager().destroyLoader(loader.getId());
|
|
|
|
|
|
|
|
|
|
if (ex == null) {
|
|
|
|
|
getFragmentManager().popBackStack();
|
|
|
|
|
Toast.makeText(getContext(), R.string.title_draft_deleted, Toast.LENGTH_LONG).show();
|
|
|
|
|
} else {
|
|
|
|
|
Log.w(Helper.TAG, ex + "\n" + Log.getStackTraceString(ex));
|
|
|
|
|
bottom_navigation.getMenu().setGroupEnabled(0, true);
|
|
|
|
|
Toast.makeText(getContext(), Helper.formatThrowable(ex), Toast.LENGTH_LONG).show();
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
@Override
|
|
|
|
|
public void onLoaderReset(@NonNull Loader<Throwable> loader) {
|
|
|
|
|
}
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
private static class PutLoader extends AsyncTaskLoader<Throwable> {
|
|
|
|
|
private Bundle args;
|
|
|
|
|
|
|
|
|
@ -537,8 +472,8 @@ public class FragmentCompose extends FragmentEx {
|
|
|
|
|
public Throwable loadInBackground() {
|
|
|
|
|
try {
|
|
|
|
|
long id = args.getLong("id");
|
|
|
|
|
boolean send = args.getBoolean("send", false);
|
|
|
|
|
Log.i(Helper.TAG, "Put load id=" + id + " send=" + send);
|
|
|
|
|
String action = args.getString("action");
|
|
|
|
|
Log.i(Helper.TAG, "Put load id=" + id + " action=" + action);
|
|
|
|
|
|
|
|
|
|
DB db = DB.getInstance(getContext());
|
|
|
|
|
DaoMessage message = db.message();
|
|
|
|
@ -548,7 +483,7 @@ public class FragmentCompose extends FragmentEx {
|
|
|
|
|
// Get data
|
|
|
|
|
EntityMessage draft = message.getMessage(id);
|
|
|
|
|
EntityIdentity ident = identity.getIdentity(args.getLong("iid"));
|
|
|
|
|
EntityFolder drafts = db.folder().getPrimaryDraftFolder();
|
|
|
|
|
EntityFolder drafts = db.folder().getPrimaryFolder(EntityFolder.TYPE_DRAFTS);
|
|
|
|
|
if (drafts == null)
|
|
|
|
|
throw new Throwable(getContext().getString(R.string.title_no_primary_drafts));
|
|
|
|
|
|
|
|
|
@ -583,7 +518,7 @@ public class FragmentCompose extends FragmentEx {
|
|
|
|
|
draft.received = new Date().getTime();
|
|
|
|
|
draft.seen = false;
|
|
|
|
|
draft.ui_seen = false;
|
|
|
|
|
draft.ui_hide = send;
|
|
|
|
|
draft.ui_hide = !"save".equals(action);
|
|
|
|
|
|
|
|
|
|
// Store draft
|
|
|
|
|
if (update)
|
|
|
|
@ -592,35 +527,37 @@ public class FragmentCompose extends FragmentEx {
|
|
|
|
|
draft.id = message.insertMessage(draft);
|
|
|
|
|
|
|
|
|
|
// Check data
|
|
|
|
|
if (send) {
|
|
|
|
|
if ("send".equals(action)) {
|
|
|
|
|
if (draft.identity == null)
|
|
|
|
|
throw new MessagingException(getContext().getString(R.string.title_from_missing));
|
|
|
|
|
if (draft.to == null && draft.cc == null && draft.bcc == null)
|
|
|
|
|
throw new MessagingException(getContext().getString(R.string.title_to_missing));
|
|
|
|
|
|
|
|
|
|
// Build outgoing message
|
|
|
|
|
EntityMessage out = new EntityMessage();
|
|
|
|
|
out.folder = folder.getOutbox().id;
|
|
|
|
|
out.identity = draft.identity;
|
|
|
|
|
out.replying = draft.replying;
|
|
|
|
|
out.thread = draft.thread;
|
|
|
|
|
out.from = draft.from;
|
|
|
|
|
out.to = draft.to;
|
|
|
|
|
out.cc = draft.cc;
|
|
|
|
|
out.bcc = draft.bcc;
|
|
|
|
|
out.subject = draft.subject;
|
|
|
|
|
out.body = draft.body;
|
|
|
|
|
out.received = draft.received;
|
|
|
|
|
out.seen = draft.seen;
|
|
|
|
|
out.ui_seen = draft.ui_seen;
|
|
|
|
|
out.ui_hide = false;
|
|
|
|
|
out.id = message.insertMessage(out);
|
|
|
|
|
|
|
|
|
|
EntityOperation.queue(getContext(), out, EntityOperation.SEND);
|
|
|
|
|
EntityOperation.queue(getContext(), draft, EntityOperation.DELETE);
|
|
|
|
|
} else
|
|
|
|
|
|
|
|
|
|
draft.id = null;
|
|
|
|
|
draft.folder = folder.getOutbox().id;
|
|
|
|
|
draft.ui_hide = false;
|
|
|
|
|
draft.id = db.message().insertMessage(draft);
|
|
|
|
|
|
|
|
|
|
EntityOperation.queue(getContext(), draft, EntityOperation.SEND);
|
|
|
|
|
|
|
|
|
|
} else if ("save".equals(action))
|
|
|
|
|
EntityOperation.queue(getContext(), draft, EntityOperation.ADD);
|
|
|
|
|
|
|
|
|
|
else if ("trash".equals(action)) {
|
|
|
|
|
EntityOperation.queue(getContext(), draft, EntityOperation.DELETE);
|
|
|
|
|
|
|
|
|
|
EntityFolder trash = db.folder().getPrimaryFolder(EntityFolder.TYPE_TRASH);
|
|
|
|
|
if (trash != null) {
|
|
|
|
|
draft.id = null;
|
|
|
|
|
draft.folder = trash.id;
|
|
|
|
|
draft.id = db.message().insertMessage(draft);
|
|
|
|
|
|
|
|
|
|
EntityOperation.queue(getContext(), draft, EntityOperation.ADD);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return null;
|
|
|
|
|
} catch (Throwable ex) {
|
|
|
|
|
Log.e(Helper.TAG, ex + "\n" + Log.getStackTraceString(ex));
|
|
|
|
@ -645,12 +582,17 @@ public class FragmentCompose extends FragmentEx {
|
|
|
|
|
public void onLoadFinished(@NonNull Loader<Throwable> loader, Throwable ex) {
|
|
|
|
|
getLoaderManager().destroyLoader(loader.getId());
|
|
|
|
|
|
|
|
|
|
boolean send = args.getBoolean("send", false);
|
|
|
|
|
Log.i(Helper.TAG, "Put finished send=" + send + " ex=" + ex);
|
|
|
|
|
String action = args.getString("action");
|
|
|
|
|
Log.i(Helper.TAG, "Put finished action=" + action + " ex=" + ex);
|
|
|
|
|
|
|
|
|
|
if (ex == null) {
|
|
|
|
|
getFragmentManager().popBackStack();
|
|
|
|
|
Toast.makeText(getContext(), send ? R.string.title_queued : R.string.title_draft_saved, Toast.LENGTH_LONG).show();
|
|
|
|
|
if ("trash".equals(action))
|
|
|
|
|
Toast.makeText(getContext(), R.string.title_draft_deleted, Toast.LENGTH_LONG).show();
|
|
|
|
|
else if ("save".equals(action))
|
|
|
|
|
Toast.makeText(getContext(), R.string.title_draft_saved, Toast.LENGTH_LONG).show();
|
|
|
|
|
else if ("send".equals(action))
|
|
|
|
|
Toast.makeText(getContext(), R.string.title_queued, Toast.LENGTH_LONG).show();
|
|
|
|
|
} else {
|
|
|
|
|
Log.w(Helper.TAG, ex + "\n" + Log.getStackTraceString(ex));
|
|
|
|
|
bottom_navigation.getMenu().setGroupEnabled(0, true);
|
|
|
|
|