Added auto CC

This commit is contained in:
M66B 2020-03-22 11:28:44 +01:00
parent df679874a3
commit cc8f00b846
7 changed files with 2284 additions and 26 deletions

File diff suppressed because it is too large Load Diff

View File

@ -60,7 +60,7 @@ import io.requery.android.database.sqlite.SQLiteDatabase;
// https://developer.android.com/topic/libraries/architecture/room.html
@Database(
version = 147,
version = 148,
entities = {
EntityIdentity.class,
EntityAccount.class,
@ -1408,6 +1408,13 @@ public abstract class DB extends RoomDatabase {
Log.i("DB migration from version " + startVersion + " to " + endVersion);
db.execSQL("ALTER TABLE `account` ADD COLUMN `thread` INTEGER");
}
})
.addMigrations(new Migration(147, 148) {
@Override
public void migrate(@NonNull SupportSQLiteDatabase db) {
Log.i("DB migration from version " + startVersion + " to " + endVersion);
db.execSQL("ALTER TABLE `identity` ADD COLUMN `cc` TEXT");
}
});
}

View File

@ -92,6 +92,7 @@ public class EntityIdentity {
public Boolean sender_extra = false;
public String sender_extra_regex;
public String replyto;
public String cc;
public String bcc;
@NonNull
public Boolean plain_only = false; // obsolete
@ -187,6 +188,7 @@ public class EntityIdentity {
json.put("sender_extra_regex", sender_extra_regex);
json.put("replyto", replyto);
json.put("cc", cc);
json.put("bcc", bcc);
// not plain_only
@ -240,6 +242,8 @@ public class EntityIdentity {
if (json.has("replyto") && !json.isNull("replyto"))
identity.replyto = json.getString("replyto");
if (json.has("cc") && !json.isNull("cc"))
identity.cc = json.getString("cc");
if (json.has("bcc") && !json.isNull("bcc"))
identity.bcc = json.getString("bcc");
@ -270,6 +274,7 @@ public class EntityIdentity {
this.sender_extra.equals(sender_extra) &&
Objects.equals(this.sender_extra_regex, other.sender_extra_regex) &&
Objects.equals(this.replyto, other.replyto) &&
Objects.equals(this.cc, other.cc) &&
Objects.equals(this.bcc, other.bcc) &&
Objects.equals(this.sign_key, other.sign_key) &&
Objects.equals(this.sign_key_alias, other.sign_key_alias) &&

View File

@ -109,6 +109,7 @@ public class FragmentIdentity extends FragmentBase {
private CheckBox cbSenderExtra;
private TextView etSenderExtra;
private EditText etReplyTo;
private EditText etCc;
private EditText etBcc;
private Button btnSave;
@ -197,6 +198,7 @@ public class FragmentIdentity extends FragmentBase {
cbSenderExtra = view.findViewById(R.id.cbSenderExtra);
etSenderExtra = view.findViewById(R.id.etSenderExtra);
etReplyTo = view.findViewById(R.id.etReplyTo);
etCc = view.findViewById(R.id.etCc);
etBcc = view.findViewById(R.id.etBcc);
btnSave = view.findViewById(R.id.btnSave);
@ -573,6 +575,7 @@ public class FragmentIdentity extends FragmentBase {
args.putBoolean("sender_extra", cbSenderExtra.isChecked());
args.putString("sender_extra_regex", etSenderExtra.getText().toString());
args.putString("replyto", etReplyTo.getText().toString().trim());
args.putString("cc", etCc.getText().toString().trim());
args.putString("bcc", etBcc.getText().toString().trim());
args.putLong("account", account == null ? -1 : account.id);
args.putString("host", etHost.getText().toString().trim());
@ -643,6 +646,7 @@ public class FragmentIdentity extends FragmentBase {
boolean sender_extra = args.getBoolean("sender_extra");
String sender_extra_regex = args.getString("sender_extra_regex");
String replyto = args.getString("replyto");
String cc = args.getString("cc");
String bcc = args.getString("bcc");
boolean should = args.getBoolean("should");
@ -676,6 +680,14 @@ public class FragmentIdentity extends FragmentBase {
throw new IllegalArgumentException(context.getString(R.string.title_email_invalid, replyto));
}
}
if (!TextUtils.isEmpty(cc) && !should)
try {
InternetAddress.parse(cc);
} catch (AddressException ex) {
throw new IllegalArgumentException(context.getString(R.string.title_email_invalid, cc));
}
if (!TextUtils.isEmpty(bcc) && !should)
try {
InternetAddress.parse(bcc);
@ -695,6 +707,9 @@ public class FragmentIdentity extends FragmentBase {
if (TextUtils.isEmpty(replyto))
replyto = null;
if (TextUtils.isEmpty(cc))
cc = null;
if (TextUtils.isEmpty(bcc))
bcc = null;
@ -754,6 +769,8 @@ public class FragmentIdentity extends FragmentBase {
return true;
if (!Objects.equals(identity.replyto, replyto))
return true;
if (!Objects.equals(identity.cc, cc))
return true;
if (!Objects.equals(identity.bcc, bcc))
return true;
@ -831,6 +848,7 @@ public class FragmentIdentity extends FragmentBase {
identity.sender_extra = sender_extra;
identity.sender_extra_regex = sender_extra_regex;
identity.replyto = replyto;
identity.cc = cc;
identity.bcc = bcc;
identity.sent_folder = null;
identity.sign_key = null;
@ -1037,6 +1055,7 @@ public class FragmentIdentity extends FragmentBase {
cbSenderExtra.setChecked(identity != null && identity.sender_extra);
etSenderExtra.setText(identity == null ? null : identity.sender_extra_regex);
etReplyTo.setText(identity == null ? null : identity.replyto);
etCc.setText(identity == null ? null : identity.cc);
etBcc.setText(identity == null ? null : identity.bcc);
auth = (identity == null ? EmailService.AUTH_TYPE_PASSWORD : identity.auth_type);

View File

@ -204,30 +204,13 @@ public class MessageHelper {
if (identity.replyto != null)
imessage.setReplyTo(InternetAddress.parse(identity.replyto));
// Add extra cc
if (identity.cc != null)
addAddress(identity.cc, Message.RecipientType.CC, imessage);
// Add extra bcc
if (identity.bcc != null) {
List<Address> bcc = new ArrayList<>();
Address[] existing = imessage.getRecipients(Message.RecipientType.BCC);
if (existing != null)
bcc.addAll(Arrays.asList(existing));
Address[] all = imessage.getAllRecipients();
Address[] abccs = InternetAddress.parse(identity.bcc);
for (Address abcc : abccs) {
boolean found = false;
if (all != null)
for (Address a : all)
if (equalEmail(a, abcc)) {
found = true;
break;
}
if (!found)
bcc.add(abcc);
}
imessage.setRecipients(Message.RecipientType.BCC, bcc.toArray(new Address[0]));
}
if (identity.bcc != null)
addAddress(identity.bcc, Message.RecipientType.BCC, imessage);
// Delivery/read request
if (message.receipt_request != null && message.receipt_request) {
@ -474,6 +457,30 @@ public class MessageHelper {
return imessage;
}
private static void addAddress(String email, Message.RecipientType type, MimeMessage imessage) throws MessagingException {
List<Address> result = new ArrayList<>();
Address[] existing = imessage.getRecipients(type);
if (existing != null)
result.addAll(Arrays.asList(existing));
Address[] all = imessage.getAllRecipients();
Address[] addresses = InternetAddress.parse(email);
for (Address address : addresses) {
boolean found = false;
if (all != null)
for (Address a : all)
if (equalEmail(a, address)) {
found = true;
break;
}
if (!found)
result.add(address);
}
imessage.setRecipients(type, result.toArray(new Address[0]));
}
static void build(Context context, EntityMessage message, List<EntityAttachment> attachments, EntityIdentity identity, MimeMessage imessage) throws IOException, MessagingException {
if (message.receipt != null && message.receipt) {
// https://www.ietf.org/rfc/rfc3798.txt

View File

@ -397,6 +397,7 @@ public class ServiceSend extends ServiceBase {
message.folder = sent.id;
message.identity = null;
message.from = helper.getFrom();
message.cc = helper.getCc();
message.bcc = helper.getBcc();
message.reply = helper.getReply();
message.received = new Date().getTime();

View File

@ -566,6 +566,38 @@
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@id/tvReplyTo" />
<eu.faircode.email.FixedTextView
android:id="@+id/tvCc"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="12dp"
android:text="@string/title_cc"
android:textAppearance="@style/TextAppearance.AppCompat.Small"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@id/etReplyTo" />
<eu.faircode.email.EditTextPlain
android:id="@+id/etCc"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:autofillHints="emailAddress"
android:hint="@string/title_optional"
android:inputType="textEmailAddress"
android:textAppearance="@style/TextAppearance.AppCompat.Medium"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@id/tvCc" />
<eu.faircode.email.FixedTextView
android:id="@+id/tvCcHint"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/title_advanced_bcc_hint"
android:textAppearance="@style/TextAppearance.AppCompat.Small"
android:textStyle="italic"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@id/etCc" />
<eu.faircode.email.FixedTextView
android:id="@+id/tvBcc"
android:layout_width="wrap_content"
@ -574,7 +606,7 @@
android:text="@string/title_bcc"
android:textAppearance="@style/TextAppearance.AppCompat.Small"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@id/etReplyTo" />
app:layout_constraintTop_toBottomOf="@id/tvCcHint" />
<eu.faircode.email.EditTextPlain
android:id="@+id/etBcc"
@ -719,7 +751,7 @@
cbUseIp,tvUseIpHint,
cbSynchronize,cbPrimary,
cbSenderExtra,tvSenderExtra,etSenderExtra,tvSenderExtraHint,
tvReplyTo,etReplyTo,tvBcc,etBcc,tvBccHint" />
tvReplyTo,etReplyTo,tvCc,etCc,tvCcHint,tvBcc,etBcc,tvBccHint" />
<androidx.constraintlayout.widget.Group
android:id="@+id/grpError"