|
@ -25,6 +25,7 @@ import android.content.DialogInterface; |
|
|
import android.content.Intent; |
|
|
import android.content.Intent; |
|
|
import android.content.pm.PackageManager; |
|
|
import android.content.pm.PackageManager; |
|
|
import android.database.Cursor; |
|
|
import android.database.Cursor; |
|
|
|
|
|
import android.graphics.Typeface; |
|
|
import android.net.Uri; |
|
|
import android.net.Uri; |
|
|
import android.os.Bundle; |
|
|
import android.os.Bundle; |
|
|
import android.os.Handler; |
|
|
import android.os.Handler; |
|
@ -32,8 +33,10 @@ import android.preference.PreferenceManager; |
|
|
import android.provider.ContactsContract; |
|
|
import android.provider.ContactsContract; |
|
|
import android.provider.OpenableColumns; |
|
|
import android.provider.OpenableColumns; |
|
|
import android.text.Html; |
|
|
import android.text.Html; |
|
|
|
|
|
import android.text.SpannableString; |
|
|
import android.text.Spanned; |
|
|
import android.text.Spanned; |
|
|
import android.text.TextUtils; |
|
|
import android.text.TextUtils; |
|
|
|
|
|
import android.text.style.StyleSpan; |
|
|
import android.util.Log; |
|
|
import android.util.Log; |
|
|
import android.view.KeyEvent; |
|
|
import android.view.KeyEvent; |
|
|
import android.view.LayoutInflater; |
|
|
import android.view.LayoutInflater; |
|
@ -46,6 +49,7 @@ import android.webkit.MimeTypeMap; |
|
|
import android.widget.ArrayAdapter; |
|
|
import android.widget.ArrayAdapter; |
|
|
import android.widget.EditText; |
|
|
import android.widget.EditText; |
|
|
import android.widget.FilterQueryProvider; |
|
|
import android.widget.FilterQueryProvider; |
|
|
|
|
|
import android.widget.ImageButton; |
|
|
import android.widget.ImageView; |
|
|
import android.widget.ImageView; |
|
|
import android.widget.MultiAutoCompleteTextView; |
|
|
import android.widget.MultiAutoCompleteTextView; |
|
|
import android.widget.ProgressBar; |
|
|
import android.widget.ProgressBar; |
|
@ -100,6 +104,8 @@ public class FragmentCompose extends FragmentEx { |
|
|
private EditText etSubject; |
|
|
private EditText etSubject; |
|
|
private RecyclerView rvAttachment; |
|
|
private RecyclerView rvAttachment; |
|
|
private EditText etBody; |
|
|
private EditText etBody; |
|
|
|
|
|
private ImageButton ibBold; |
|
|
|
|
|
private ImageButton ibItalic; |
|
|
private BottomNavigationView bottom_navigation; |
|
|
private BottomNavigationView bottom_navigation; |
|
|
private ProgressBar pbWait; |
|
|
private ProgressBar pbWait; |
|
|
private Group grpHeader; |
|
|
private Group grpHeader; |
|
@ -133,6 +139,8 @@ public class FragmentCompose extends FragmentEx { |
|
|
etSubject = view.findViewById(R.id.etSubject); |
|
|
etSubject = view.findViewById(R.id.etSubject); |
|
|
rvAttachment = view.findViewById(R.id.rvAttachment); |
|
|
rvAttachment = view.findViewById(R.id.rvAttachment); |
|
|
etBody = view.findViewById(R.id.etBody); |
|
|
etBody = view.findViewById(R.id.etBody); |
|
|
|
|
|
ibBold = view.findViewById(R.id.ibBold); |
|
|
|
|
|
ibItalic = view.findViewById(R.id.ibItalic); |
|
|
bottom_navigation = view.findViewById(R.id.bottom_navigation); |
|
|
bottom_navigation = view.findViewById(R.id.bottom_navigation); |
|
|
pbWait = view.findViewById(R.id.pbWait); |
|
|
pbWait = view.findViewById(R.id.pbWait); |
|
|
grpHeader = view.findViewById(R.id.grpHeader); |
|
|
grpHeader = view.findViewById(R.id.grpHeader); |
|
@ -225,6 +233,28 @@ public class FragmentCompose extends FragmentEx { |
|
|
} |
|
|
} |
|
|
}); |
|
|
}); |
|
|
|
|
|
|
|
|
|
|
|
View.OnClickListener styleListener = new View.OnClickListener() { |
|
|
|
|
|
@Override |
|
|
|
|
|
public void onClick(View v) { |
|
|
|
|
|
int start = etBody.getSelectionStart(); |
|
|
|
|
|
int end = etBody.getSelectionEnd(); |
|
|
|
|
|
if (start > end) { |
|
|
|
|
|
int tmp = start; |
|
|
|
|
|
start = end; |
|
|
|
|
|
end = tmp; |
|
|
|
|
|
} |
|
|
|
|
|
if (start != end) { |
|
|
|
|
|
SpannableString s = new SpannableString(etBody.getText()); |
|
|
|
|
|
s.setSpan(new StyleSpan(v.getId() == ibBold.getId() ? Typeface.BOLD : Typeface.ITALIC), |
|
|
|
|
|
start, end, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); |
|
|
|
|
|
etBody.setText(s); |
|
|
|
|
|
} |
|
|
|
|
|
} |
|
|
|
|
|
}; |
|
|
|
|
|
|
|
|
|
|
|
ibBold.setOnClickListener(styleListener); |
|
|
|
|
|
ibItalic.setOnClickListener(styleListener); |
|
|
|
|
|
|
|
|
bottom_navigation.setOnNavigationItemSelectedListener(new BottomNavigationView.OnNavigationItemSelectedListener() { |
|
|
bottom_navigation.setOnNavigationItemSelectedListener(new BottomNavigationView.OnNavigationItemSelectedListener() { |
|
|
@Override |
|
|
@Override |
|
|
public boolean onNavigationItemSelected(@NonNull MenuItem item) { |
|
|
public boolean onNavigationItemSelected(@NonNull MenuItem item) { |
|
@ -521,7 +551,7 @@ public class FragmentCompose extends FragmentEx { |
|
|
args.putString("cc", etCc.getText().toString()); |
|
|
args.putString("cc", etCc.getText().toString()); |
|
|
args.putString("bcc", etBcc.getText().toString()); |
|
|
args.putString("bcc", etBcc.getText().toString()); |
|
|
args.putString("subject", etSubject.getText().toString()); |
|
|
args.putString("subject", etSubject.getText().toString()); |
|
|
args.putString("body", etBody.getText().toString()); |
|
|
|
|
|
|
|
|
args.putString("body", Html.toHtml(etBody.getText())); |
|
|
|
|
|
|
|
|
Log.i(Helper.TAG, "Run load id=" + working); |
|
|
Log.i(Helper.TAG, "Run load id=" + working); |
|
|
actionLoader.load(this, args); |
|
|
actionLoader.load(this, args); |
|
@ -981,8 +1011,6 @@ public class FragmentCompose extends FragmentEx { |
|
|
draft.subject = subject; |
|
|
draft.subject = subject; |
|
|
draft.received = new Date().getTime(); |
|
|
draft.received = new Date().getTime(); |
|
|
|
|
|
|
|
|
String pbody = "<pre>" + body.replaceAll("\\r?\\n", "<br />") + "</pre>"; |
|
|
|
|
|
|
|
|
|
|
|
// Execute action |
|
|
// Execute action |
|
|
if (action == R.id.action_delete) { |
|
|
if (action == R.id.action_delete) { |
|
|
draft.msgid = null; |
|
|
draft.msgid = null; |
|
@ -993,13 +1021,13 @@ public class FragmentCompose extends FragmentEx { |
|
|
|
|
|
|
|
|
} else if (action == R.id.action_save) { |
|
|
} else if (action == R.id.action_save) { |
|
|
db.message().updateMessage(draft); |
|
|
db.message().updateMessage(draft); |
|
|
draft.write(context, pbody); |
|
|
|
|
|
|
|
|
draft.write(context, body); |
|
|
|
|
|
|
|
|
EntityOperation.queue(db, draft, EntityOperation.ADD); |
|
|
EntityOperation.queue(db, draft, EntityOperation.ADD); |
|
|
|
|
|
|
|
|
} else if (action == R.id.action_send) { |
|
|
} else if (action == R.id.action_send) { |
|
|
db.message().updateMessage(draft); |
|
|
db.message().updateMessage(draft); |
|
|
draft.write(context, pbody); |
|
|
|
|
|
|
|
|
draft.write(context, body); |
|
|
|
|
|
|
|
|
// Check data |
|
|
// Check data |
|
|
if (draft.identity == null) |
|
|
if (draft.identity == null) |
|
@ -1030,7 +1058,7 @@ public class FragmentCompose extends FragmentEx { |
|
|
draft.msgid = msgid; |
|
|
draft.msgid = msgid; |
|
|
draft.ui_hide = false; |
|
|
draft.ui_hide = false; |
|
|
draft.id = db.message().insertMessage(draft); |
|
|
draft.id = db.message().insertMessage(draft); |
|
|
draft.write(getContext(), pbody); |
|
|
|
|
|
|
|
|
draft.write(getContext(), body); |
|
|
|
|
|
|
|
|
// Restore attachments |
|
|
// Restore attachments |
|
|
for (EntityAttachment attachment : attachments) { |
|
|
for (EntityAttachment attachment : attachments) { |
|
|