Edit sender address per identity

This commit is contained in:
M66B
2019-04-17 17:27:57 +02:00
parent 3fe361c898
commit 35e3604e80
11 changed files with 1734 additions and 57 deletions

View File

@@ -424,8 +424,7 @@ class Core {
EntityIdentity identity =
(message.identity == null ? null : db.identity().getIdentity(message.identity));
imessage = MessageHelper.from(context, message, isession,
identity == null ? false : identity.plain_only);
imessage = MessageHelper.from(context, message, identity, isession);
} else {
// Cross account move
File file = message.getRawFile(context);

View File

@@ -50,7 +50,7 @@ import io.requery.android.database.sqlite.RequerySQLiteOpenHelperFactory;
// https://developer.android.com/topic/libraries/architecture/room.html
@Database(
version = 64,
version = 65,
entities = {
EntityIdentity.class,
EntityAccount.class,
@@ -694,6 +694,13 @@ public abstract class DB extends RoomDatabase {
db.execSQL("ALTER TABLE `message` ADD COLUMN `dmarc` INTEGER");
}
})
.addMigrations(new Migration(64, 65) {
@Override
public void migrate(SupportSQLiteDatabase db) {
Log.i("DB migration from version " + startVersion + " to " + endVersion);
db.execSQL("ALTER TABLE `identity` ADD COLUMN `sender_extra` INTEGER NOT NULL DEFAULT 0");
}
})
.build();
}

View File

@@ -77,6 +77,8 @@ public class EntityIdentity {
public Boolean synchronize;
@NonNull
public Boolean primary;
@NonNull
public boolean sender_extra = false;
public String replyto;
public String bcc;
@NonNull

View File

@@ -177,7 +177,6 @@ public class FragmentCompose extends FragmentBase {
private boolean autosave = false;
private boolean busy = false;
private boolean sender_extra = false;
private boolean prefix_once = false;
private boolean monospaced = false;
private boolean style = true;
@@ -193,7 +192,6 @@ public class FragmentCompose extends FragmentBase {
pro = Helper.isPro(getContext());
SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(getContext());
sender_extra = prefs.getBoolean("sender", false);
prefix_once = prefs.getBoolean("prefix_once", false);
monospaced = prefs.getBoolean("monospaced", false);
style = prefs.getBoolean("style_toolbar", true);
@@ -246,6 +244,7 @@ public class FragmentCompose extends FragmentBase {
int at = (identity == null ? -1 : identity.email.indexOf('@'));
etExtra.setHint(at < 0 ? null : identity.email.substring(0, at));
tvDomain.setText(at < 0 ? null : identity.email.substring(at));
grpExtra.setVisibility(identity != null && identity.sender_extra ? View.VISIBLE : View.GONE);
Spanned signature = null;
if (pro) {
@@ -1157,7 +1156,7 @@ public class FragmentCompose extends FragmentBase {
Properties props = MessageHelper.getSessionProperties(Helper.AUTH_TYPE_PASSWORD, null, false);
Session isession = Session.getInstance(props, null);
MimeMessage imessage = new MimeMessage(isession);
MessageHelper.build(context, message, imessage, identity == null ? false : identity.plain_only);
MessageHelper.build(context, message, identity, imessage);
// Serialize message
ByteArrayOutputStream os = new ByteArrayOutputStream();
@@ -1712,6 +1711,13 @@ public class FragmentCompose extends FragmentBase {
body = EntityAnswer.getAnswerText(db, answer, null) + body;
} else {
if ("reply".equals(action) || "reply_all".equals(action)) {
if (ref.to != null && ref.to.length > 0) {
String to = ((InternetAddress) ref.to[0]).getAddress();
int at = to.indexOf('@');
if (at > 0)
draft.extra = to.substring(0, at);
}
draft.references = (ref.references == null ? "" : ref.references + " ") + ref.msgid;
draft.inreplyto = ref.msgid;
draft.thread = ref.thread;
@@ -1909,7 +1915,6 @@ public class FragmentCompose extends FragmentBase {
etSubject.setTag(reference < 0 ? "" : etSubject.getText().toString());
grpHeader.setVisibility(View.VISIBLE);
grpExtra.setVisibility(sender_extra ? View.VISIBLE : View.GONE);
grpAddresses.setVisibility("reply_all".equals(action) ? View.VISIBLE : View.GONE);
getActivity().invalidateOptionsMenu();

View File

@@ -101,6 +101,7 @@ public class FragmentIdentity extends FragmentBase {
private CheckBox cbSynchronize;
private CheckBox cbPrimary;
private CheckBox cbSenderExtra;
private EditText etReplyTo;
private EditText etBcc;
private CheckBox cbPlainOnly;
@@ -171,6 +172,7 @@ public class FragmentIdentity extends FragmentBase {
cbSynchronize = view.findViewById(R.id.cbSynchronize);
cbPrimary = view.findViewById(R.id.cbPrimary);
cbSenderExtra = view.findViewById(R.id.cbSenderExtra);
etReplyTo = view.findViewById(R.id.etReplyTo);
etBcc = view.findViewById(R.id.etBcc);
cbPlainOnly = view.findViewById(R.id.cbPlainOnly);
@@ -494,6 +496,7 @@ public class FragmentIdentity extends FragmentBase {
args.putString("name", name);
args.putString("email", etEmail.getText().toString().trim());
args.putString("display", etDisplay.getText().toString());
args.putBoolean("sender_extra", cbSenderExtra.isChecked());
args.putString("replyto", etReplyTo.getText().toString().trim());
args.putString("bcc", etBcc.getText().toString().trim());
args.putBoolean("plain_only", cbPlainOnly.isChecked());
@@ -557,6 +560,7 @@ public class FragmentIdentity extends FragmentBase {
boolean synchronize = args.getBoolean("synchronize");
boolean primary = args.getBoolean("primary");
boolean sender_extra = args.getBoolean("sender_extra");
String replyto = args.getString("replyto");
String bcc = args.getString("bcc");
boolean plain_only = args.getBoolean("plain_only");
@@ -683,6 +687,7 @@ public class FragmentIdentity extends FragmentBase {
identity.synchronize = synchronize;
identity.primary = (identity.synchronize && primary);
identity.sender_extra = sender_extra;
identity.replyto = replyto;
identity.bcc = bcc;
identity.plain_only = plain_only;
@@ -789,6 +794,7 @@ public class FragmentIdentity extends FragmentBase {
cbSynchronize.setChecked(identity == null ? true : identity.synchronize);
cbPrimary.setChecked(identity == null ? true : identity.primary);
cbSenderExtra.setChecked(identity != null && identity.sender_extra);
etReplyTo.setText(identity == null ? null : identity.replyto);
etBcc.setText(identity == null ? null : identity.bcc);
cbPlainOnly.setChecked(identity == null ? false : identity.plain_only);

View File

@@ -97,7 +97,6 @@ public class FragmentOptions extends FragmentBase implements SharedPreferences.O
private SwitchCompat swAutoResize;
private Spinner spAutoResize;
private TextView tvAutoResize;
private SwitchCompat swSender;
private SwitchCompat swPrefixOnce;
private SwitchCompat swAutoSend;
@@ -129,7 +128,7 @@ public class FragmentOptions extends FragmentBase implements SharedPreferences.O
"startup", "date", "threading", "avatars", "identicons", "name_email", "subject_italic", "flags", "preview",
"addresses", "monospaced", "autohtml", "autoimages", "actionbar",
"pull", "swipenav", "autoexpand", "autoclose", "autonext", "collapse", "autoread", "automove",
"autoresize", "resize", "sender", "prefix_once", "autosend",
"autoresize", "resize", "prefix_once", "autosend",
"notify_preview", "search_local", "light", "sound",
"authentication", "paranoid", "english", "updates", "debug",
"first", "why", "last_update_check", "app_support", "message_swipe", "message_select", "folder_actions", "folder_sync",
@@ -180,7 +179,6 @@ public class FragmentOptions extends FragmentBase implements SharedPreferences.O
swAutoResize = view.findViewById(R.id.swAutoResize);
spAutoResize = view.findViewById(R.id.spAutoResize);
tvAutoResize = view.findViewById(R.id.tvAutoResize);
swSender = view.findViewById(R.id.swSender);
swPrefixOnce = view.findViewById(R.id.swPrefixOnce);
swAutoSend = view.findViewById(R.id.swAutoSend);
@@ -497,13 +495,6 @@ public class FragmentOptions extends FragmentBase implements SharedPreferences.O
}
});
swSender.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
@Override
public void onCheckedChanged(CompoundButton compoundButton, boolean checked) {
prefs.edit().putBoolean("sender", checked).apply();
}
});
swPrefixOnce.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
@Override
public void onCheckedChanged(CompoundButton compoundButton, boolean checked) {
@@ -689,7 +680,6 @@ public class FragmentOptions extends FragmentBase implements SharedPreferences.O
}
spAutoResize.setEnabled(swAutoResize.isChecked());
swSender.setChecked(prefs.getBoolean("sender", false));
swPrefixOnce.setChecked(prefs.getBoolean("prefix_once", false));
swAutoSend.setChecked(!prefs.getBoolean("autosend", false));

View File

@@ -189,7 +189,8 @@ public class MessageHelper {
return props;
}
static MimeMessageEx from(Context context, EntityMessage message, Session isession, boolean plainOnly) throws MessagingException, IOException {
static MimeMessageEx from(Context context, EntityMessage message, EntityIdentity identity, Session isession)
throws MessagingException, IOException {
DB db = DB.getInstance(context);
MimeMessageEx imessage = new MimeMessageEx(isession, message.msgid);
@@ -208,7 +209,7 @@ public class MessageHelper {
if (message.from != null && message.from.length > 0) {
String email = ((InternetAddress) message.from[0]).getAddress();
String name = ((InternetAddress) message.from[0]).getPersonal();
if (email != null && !TextUtils.isEmpty(message.extra)) {
if (email != null && identity != null && identity.sender_extra && !TextUtils.isEmpty(message.extra)) {
int at = email.indexOf('@');
email = message.extra + email.substring(at);
Log.i("extra=" + email);
@@ -282,22 +283,19 @@ public class MessageHelper {
return imessage;
}
build(context, message, imessage, plainOnly);
build(context, message, identity, imessage);
return imessage;
}
static void build(Context context, EntityMessage message, MimeMessage imessage, boolean plainOnly) throws IOException, MessagingException {
static void build(Context context, EntityMessage message, EntityIdentity identity, MimeMessage imessage) throws IOException, MessagingException {
DB db = DB.getInstance(context);
StringBuilder body = new StringBuilder();
body.append(Helper.readText(message.getFile(context)));
if (message.identity != null) {
EntityIdentity identity = db.identity().getIdentity(message.identity);
if (!TextUtils.isEmpty(identity.signature))
body.append(identity.signature);
}
if (identity != null && !TextUtils.isEmpty(identity.signature))
body.append(identity.signature);
File refFile = message.getRefFile(context);
if (refFile.exists())
@@ -334,7 +332,7 @@ public class MessageHelper {
Log.i("Attachments available=" + available);
if (available == 0)
if (plainOnly)
if (identity != null && identity.plain_only)
imessage.setContent(plainContent, "text/plain; charset=" + Charset.defaultCharset().name());
else
imessage.setContent(alternativePart);
@@ -342,7 +340,7 @@ public class MessageHelper {
Multipart mixedPart = new MimeMultipart("mixed");
BodyPart attachmentPart = new MimeBodyPart();
if (plainOnly)
if (identity != null && identity.plain_only)
attachmentPart.setContent(plainContent, "text/plain; charset=" + Charset.defaultCharset().name());
else
attachmentPart.setContent(alternativePart);

View File

@@ -286,7 +286,7 @@ public class ServiceSend extends LifecycleService {
isession.setDebug(debug);
// Create message
MimeMessage imessage = MessageHelper.from(this, message, isession, ident.plain_only);
MimeMessage imessage = MessageHelper.from(this, message, ident, isession);
// Add reply to
if (ident.replyto != null)