|
|
|
@ -27,6 +27,7 @@ import android.content.Intent;
|
|
|
|
|
import android.content.pm.PackageManager;
|
|
|
|
|
import android.database.Cursor;
|
|
|
|
|
import android.graphics.Typeface;
|
|
|
|
|
import android.graphics.drawable.Drawable;
|
|
|
|
|
import android.net.Uri;
|
|
|
|
|
import android.os.Bundle;
|
|
|
|
|
import android.os.Handler;
|
|
|
|
@ -37,6 +38,7 @@ import android.text.Html;
|
|
|
|
|
import android.text.SpannableString;
|
|
|
|
|
import android.text.Spanned;
|
|
|
|
|
import android.text.TextUtils;
|
|
|
|
|
import android.text.style.ImageSpan;
|
|
|
|
|
import android.text.style.StyleSpan;
|
|
|
|
|
import android.text.style.URLSpan;
|
|
|
|
|
import android.util.Log;
|
|
|
|
@ -399,6 +401,7 @@ public class FragmentCompose extends FragmentEx {
|
|
|
|
|
menu.findItem(R.id.menu_bold).setVisible(free && working >= 0);
|
|
|
|
|
menu.findItem(R.id.menu_italic).setVisible(free && working >= 0);
|
|
|
|
|
menu.findItem(R.id.menu_link).setVisible(free && working >= 0);
|
|
|
|
|
menu.findItem(R.id.menu_image).setVisible(free && working >= 0);
|
|
|
|
|
menu.findItem(R.id.menu_attachment).setVisible(!free && working >= 0);
|
|
|
|
|
menu.findItem(R.id.menu_attachment).setEnabled(etBody.isEnabled());
|
|
|
|
|
menu.findItem(R.id.menu_addresses).setVisible(!free && working >= 0);
|
|
|
|
@ -412,6 +415,9 @@ public class FragmentCompose extends FragmentEx {
|
|
|
|
|
case R.id.menu_link:
|
|
|
|
|
onMenuStyle(item.getItemId());
|
|
|
|
|
return true;
|
|
|
|
|
case R.id.menu_image:
|
|
|
|
|
onMenuImage();
|
|
|
|
|
return true;
|
|
|
|
|
case R.id.menu_attachment:
|
|
|
|
|
onMenuAttachment();
|
|
|
|
|
return true;
|
|
|
|
@ -460,6 +466,13 @@ public class FragmentCompose extends FragmentEx {
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private void onMenuImage() {
|
|
|
|
|
Intent intent = new Intent(Intent.ACTION_OPEN_DOCUMENT);
|
|
|
|
|
intent.addCategory(Intent.CATEGORY_OPENABLE);
|
|
|
|
|
intent.setType("image/*");
|
|
|
|
|
startActivityForResult(intent, ActivityCompose.REQUEST_IMAGE);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private void onMenuAttachment() {
|
|
|
|
|
Intent intent = new Intent(Intent.ACTION_OPEN_DOCUMENT);
|
|
|
|
|
intent.addCategory(Intent.CATEGORY_OPENABLE);
|
|
|
|
@ -475,9 +488,12 @@ public class FragmentCompose extends FragmentEx {
|
|
|
|
|
public void onActivityResult(int requestCode, int resultCode, Intent data) {
|
|
|
|
|
Log.i(Helper.TAG, "Compose onActivityResult request=" + requestCode + " result=" + resultCode + " data=" + data);
|
|
|
|
|
if (resultCode == RESULT_OK) {
|
|
|
|
|
if (requestCode == ActivityCompose.REQUEST_ATTACHMENT) {
|
|
|
|
|
if (requestCode == ActivityCompose.REQUEST_IMAGE) {
|
|
|
|
|
if (data != null)
|
|
|
|
|
handleAddAttachment(data);
|
|
|
|
|
handleAddAttachment(data, true);
|
|
|
|
|
} else if (requestCode == ActivityCompose.REQUEST_ATTACHMENT) {
|
|
|
|
|
if (data != null)
|
|
|
|
|
handleAddAttachment(data, false);
|
|
|
|
|
} else {
|
|
|
|
|
if (data != null)
|
|
|
|
|
handlePickContact(requestCode, data);
|
|
|
|
@ -532,7 +548,7 @@ public class FragmentCompose extends FragmentEx {
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private void handleAddAttachment(Intent data) {
|
|
|
|
|
private void handleAddAttachment(Intent data, final boolean image) {
|
|
|
|
|
Uri uri = data.getData();
|
|
|
|
|
if (uri == null)
|
|
|
|
|
return;
|
|
|
|
@ -541,13 +557,31 @@ public class FragmentCompose extends FragmentEx {
|
|
|
|
|
args.putLong("id", working);
|
|
|
|
|
args.putParcelable("uri", data.getData());
|
|
|
|
|
|
|
|
|
|
new SimpleTask<Void>() {
|
|
|
|
|
new SimpleTask<EntityAttachment>() {
|
|
|
|
|
@Override
|
|
|
|
|
protected Void onLoad(Context context, Bundle args) throws IOException {
|
|
|
|
|
protected EntityAttachment onLoad(Context context, Bundle args) throws IOException {
|
|
|
|
|
Long id = args.getLong("id");
|
|
|
|
|
Uri uri = args.getParcelable("uri");
|
|
|
|
|
addAttachment(context, id, uri);
|
|
|
|
|
return null;
|
|
|
|
|
return addAttachment(context, id, uri, image);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
@Override
|
|
|
|
|
protected void onLoaded(Bundle args, EntityAttachment attachment) {
|
|
|
|
|
if (image) {
|
|
|
|
|
File file = EntityAttachment.getFile(getContext(), attachment.id);
|
|
|
|
|
Drawable d = Drawable.createFromPath(file.getAbsolutePath());
|
|
|
|
|
d.setBounds(0, 0, d.getIntrinsicWidth(), d.getIntrinsicHeight());
|
|
|
|
|
|
|
|
|
|
int start = etBody.getSelectionStart();
|
|
|
|
|
etBody.getText().insert(start, " ");
|
|
|
|
|
SpannableString s = new SpannableString(etBody.getText());
|
|
|
|
|
ImageSpan is = new ImageSpan(getContext(), Uri.parse("cid:" + attachment.id), ImageSpan.ALIGN_BASELINE);
|
|
|
|
|
s.setSpan(is, start, start + 1, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
|
|
|
|
|
String html = Html.toHtml(s);
|
|
|
|
|
Log.i(Helper.TAG, "html=" + html);
|
|
|
|
|
|
|
|
|
|
etBody.setText(Html.fromHtml(html, cidGetter, null));
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
@Override
|
|
|
|
@ -577,7 +611,7 @@ public class FragmentCompose extends FragmentEx {
|
|
|
|
|
actionLoader.load(this, args);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private void addAttachment(Context context, long id, Uri uri) throws IOException {
|
|
|
|
|
private EntityAttachment addAttachment(Context context, long id, Uri uri, boolean image) throws IOException {
|
|
|
|
|
EntityAttachment attachment = new EntityAttachment();
|
|
|
|
|
|
|
|
|
|
String name = null;
|
|
|
|
@ -646,6 +680,9 @@ public class FragmentCompose extends FragmentEx {
|
|
|
|
|
db.attachment().setProgress(attachment.id, size * 100 / attachment.size);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (image)
|
|
|
|
|
attachment.cid = "<" + attachment.id + ">";
|
|
|
|
|
|
|
|
|
|
attachment.size = size;
|
|
|
|
|
attachment.progress = null;
|
|
|
|
|
attachment.available = true;
|
|
|
|
@ -665,6 +702,8 @@ public class FragmentCompose extends FragmentEx {
|
|
|
|
|
db.attachment().updateAttachment(attachment);
|
|
|
|
|
throw ex;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return attachment;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private SimpleTask<EntityMessage> draftLoader = new SimpleTask<EntityMessage>() {
|
|
|
|
@ -852,7 +891,7 @@ public class FragmentCompose extends FragmentEx {
|
|
|
|
|
ArrayList<Uri> uris = args.getParcelableArrayList("attachments");
|
|
|
|
|
if (uris != null)
|
|
|
|
|
for (Uri uri : uris)
|
|
|
|
|
addAttachment(context, draft.id, uri);
|
|
|
|
|
addAttachment(context, draft.id, uri, false);
|
|
|
|
|
|
|
|
|
|
EntityOperation.queue(db, draft, EntityOperation.ADD);
|
|
|
|
|
|
|
|
|
@ -886,9 +925,10 @@ public class FragmentCompose extends FragmentEx {
|
|
|
|
|
|
|
|
|
|
new SimpleTask<Spanned>() {
|
|
|
|
|
@Override
|
|
|
|
|
protected Spanned onLoad(Context context, Bundle args) throws Throwable {
|
|
|
|
|
String body = EntityMessage.read(context, args.getLong("id"));
|
|
|
|
|
return Html.fromHtml(body);
|
|
|
|
|
protected Spanned onLoad(final Context context, Bundle args) throws Throwable {
|
|
|
|
|
final long id = args.getLong("id");
|
|
|
|
|
String body = EntityMessage.read(context, id);
|
|
|
|
|
return Html.fromHtml(body, cidGetter, null);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
@Override
|
|
|
|
@ -1151,6 +1191,25 @@ public class FragmentCompose extends FragmentEx {
|
|
|
|
|
}
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
private Html.ImageGetter cidGetter = new Html.ImageGetter() {
|
|
|
|
|
@Override
|
|
|
|
|
public Drawable getDrawable(String source) {
|
|
|
|
|
if (source != null && source.startsWith("cid")) {
|
|
|
|
|
String cid = source.split(":")[1];
|
|
|
|
|
File file = EntityAttachment.getFile(getContext(), Long.parseLong(cid));
|
|
|
|
|
Drawable d = Drawable.createFromPath(file.getAbsolutePath());
|
|
|
|
|
d.setBounds(0, 0, d.getIntrinsicWidth(), d.getIntrinsicHeight());
|
|
|
|
|
return d;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
float scale = getContext().getResources().getDisplayMetrics().density;
|
|
|
|
|
int px = (int) (24 * scale + 0.5f);
|
|
|
|
|
Drawable d = getContext().getResources().getDrawable(R.drawable.baseline_warning_24, getContext().getTheme());
|
|
|
|
|
d.setBounds(0, 0, px, px);
|
|
|
|
|
return d;
|
|
|
|
|
}
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
public class IdentityAdapter extends ArrayAdapter<EntityIdentity> {
|
|
|
|
|
private Context context;
|
|
|
|
|
private List<EntityIdentity> identities;
|
|
|
|
|