diff --git a/app/src/main/java/eu/faircode/email/ActivityView.java b/app/src/main/java/eu/faircode/email/ActivityView.java index 7706ede4cc..82830eddce 100644 --- a/app/src/main/java/eu/faircode/email/ActivityView.java +++ b/app/src/main/java/eu/faircode/email/ActivityView.java @@ -168,54 +168,62 @@ public class ActivityView extends ActivityBase implements FragmentManager.OnBack protected Long onLoad(Context context, Bundle args) throws Throwable { File file = new File(context.getCacheDir(), "crash.log"); if (file.exists()) { + Address to = new InternetAddress("marcel+email@faircode.eu", "FairCode"); + + // Get version info + StringBuilder sb = new StringBuilder(); + sb.append(String.format("%s: %s/%d\r\n", BuildConfig.APPLICATION_ID, BuildConfig.VERSION_NAME, BuildConfig.VERSION_CODE)); + sb.append(String.format("Android: %s (SDK %d)\r\n", Build.VERSION.RELEASE, Build.VERSION.SDK_INT)); + sb.append("\r\n"); + + // Get device info + sb.append(String.format("Brand: %s\r\n", Build.BRAND)); + sb.append(String.format("Manufacturer: %s\r\n", Build.MANUFACTURER)); + sb.append(String.format("Model: %s\r\n", Build.MODEL)); + sb.append(String.format("Product: %s\r\n", Build.PRODUCT)); + sb.append(String.format("Device: %s\r\n", Build.DEVICE)); + sb.append(String.format("Host: %s\r\n", Build.HOST)); + sb.append(String.format("Display: %s\r\n", Build.DISPLAY)); + sb.append(String.format("Id: %s\r\n", Build.ID)); + sb.append("\r\n"); + + BufferedReader in = null; + try { + String line; + in = new BufferedReader(new FileReader(file)); + while ((line = in.readLine()) != null) + sb.append(line); + } finally { + if (in != null) + in.close(); + } + + file.delete(); + DB db = DB.getInstance(context); - EntityFolder drafts = db.folder().getPrimaryDrafts(); - if (drafts != null) { - Address to = new InternetAddress("marcel+email@faircode.eu", "FairCode"); + try { + db.beginTransaction(); - // Get version info - StringBuilder sb = new StringBuilder(); - sb.append(String.format("%s: %s/%d\r\n", BuildConfig.APPLICATION_ID, BuildConfig.VERSION_NAME, BuildConfig.VERSION_CODE)); - sb.append(String.format("Android: %s (SDK %d)\r\n", Build.VERSION.RELEASE, Build.VERSION.SDK_INT)); - sb.append("\r\n"); + EntityFolder drafts = db.folder().getPrimaryDrafts(); + if (drafts != null) { + EntityMessage draft = new EntityMessage(); + draft.account = drafts.account; + draft.folder = drafts.id; + draft.to = new Address[]{to}; + draft.subject = context.getString(R.string.app_name) + " crash log"; + draft.body = "
" + sb.toString().replaceAll("\\r?\\n", "
") + "";
+ draft.received = new Date().getTime();
+ draft.seen = false;
+ draft.ui_seen = false;
+ draft.ui_hide = false;
+ draft.id = db.message().insertMessage(draft);
- // Get device info
- sb.append(String.format("Brand: %s\r\n", Build.BRAND));
- sb.append(String.format("Manufacturer: %s\r\n", Build.MANUFACTURER));
- sb.append(String.format("Model: %s\r\n", Build.MODEL));
- sb.append(String.format("Product: %s\r\n", Build.PRODUCT));
- sb.append(String.format("Device: %s\r\n", Build.DEVICE));
- sb.append(String.format("Host: %s\r\n", Build.HOST));
- sb.append(String.format("Display: %s\r\n", Build.DISPLAY));
- sb.append(String.format("Id: %s\r\n", Build.ID));
- sb.append("\r\n");
-
- BufferedReader in = null;
- try {
- String line;
- in = new BufferedReader(new FileReader(file));
- while ((line = in.readLine()) != null)
- sb.append(line);
- } finally {
- if (in != null)
- in.close();
+ return draft.id;
}
- EntityMessage draft = new EntityMessage();
- draft.account = drafts.account;
- draft.folder = drafts.id;
- draft.to = new Address[]{to};
- draft.subject = context.getString(R.string.app_name) + " crash log";
- draft.body = "" + sb.toString().replaceAll("\\r?\\n", "
") + "";
- draft.received = new Date().getTime();
- draft.seen = false;
- draft.ui_seen = false;
- draft.ui_hide = false;
- draft.id = db.message().insertMessage(draft);
-
- file.delete();
-
- return draft.id;
+ db.setTransactionSuccessful();
+ } finally {
+ db.endTransaction();
}
}
@@ -327,11 +335,21 @@ public class ActivityView extends ActivityBase implements FragmentManager.OnBack
@Override
protected Void onLoad(Context context, Bundle args) {
long time = args.getLong("time");
- DaoAccount dao = DB.getInstance(context).account();
- for (EntityAccount account : dao.getAccounts(true)) {
- account.seen_until = time;
- dao.updateAccount(account);
+
+ DB db = DB.getInstance(context);
+ try {
+ db.beginTransaction();
+
+ for (EntityAccount account : db.account().getAccounts(true)) {
+ account.seen_until = time;
+ db.account().updateAccount(account);
+ }
+
+ db.setTransactionSuccessful();
+ } finally {
+ db.endTransaction();
}
+
return null;
}
@@ -449,30 +467,31 @@ public class ActivityView extends ActivityBase implements FragmentManager.OnBack
@Override
protected Void onLoad(Context context, Bundle args) {
long id = args.getLong("id");
- DB db = DB.getInstance(context);
- EntityMessage message = db.message().getMessage(id);
- EntityFolder folder = db.folder().getFolder(message.folder);
- if (!EntityFolder.OUTBOX.equals(folder.type) &&
- !EntityFolder.ARCHIVE.equals(folder.type)) {
- if (!message.seen && !message.ui_seen) {
- try {
- db.beginTransaction();
+ DB db = DB.getInstance(context);
+ try {
+ db.beginTransaction();
+
+ EntityMessage message = db.message().getMessage(id);
+ EntityFolder folder = db.folder().getFolder(message.folder);
+ if (!EntityFolder.OUTBOX.equals(folder.type) &&
+ !EntityFolder.ARCHIVE.equals(folder.type)) {
+ if (!message.seen && !message.ui_seen) {
message.ui_seen = !message.ui_seen;
db.message().updateMessage(message);
if (message.uid != null)
EntityOperation.queue(db, message, EntityOperation.SEEN, message.ui_seen);
-
- db.setTransactionSuccessful();
- } finally {
- db.endTransaction();
}
-
- EntityOperation.process(context);
}
+
+ db.setTransactionSuccessful();
+ } finally {
+ db.endTransaction();
}
+ EntityOperation.process(context);
+
return null;
}
diff --git a/app/src/main/java/eu/faircode/email/AdapterAttachment.java b/app/src/main/java/eu/faircode/email/AdapterAttachment.java
index 6a879c8ed9..4bf21657a8 100644
--- a/app/src/main/java/eu/faircode/email/AdapterAttachment.java
+++ b/app/src/main/java/eu/faircode/email/AdapterAttachment.java
@@ -199,12 +199,20 @@ public class AdapterAttachment extends RecyclerView.Adapter" + info.toString().replaceAll("\\r?\\n", "
") + "";
- draft.received = new Date().getTime();
- draft.seen = false;
- draft.ui_seen = false;
- draft.ui_hide = false;
- draft.id = db.message().insertMessage(draft);
+ DB db = DB.getInstance(context);
+ try {
+ db.beginTransaction();
- return draft.id;
+ EntityFolder drafts = db.folder().getPrimaryDrafts();
+ if (drafts == null)
+ throw new IllegalArgumentException(context.getString(R.string.title_no_drafts));
+
+ EntityMessage draft = new EntityMessage();
+ draft.account = drafts.account;
+ draft.folder = drafts.id;
+ draft.to = new Address[]{to};
+ draft.subject = BuildConfig.APPLICATION_ID + " debug info";
+ draft.body = "" + info.toString().replaceAll("\\r?\\n", "
") + "";
+ draft.received = new Date().getTime();
+ draft.seen = false;
+ draft.ui_seen = false;
+ draft.ui_hide = false;
+ draft.id = db.message().insertMessage(draft);
+
+ db.setTransactionSuccessful();
+
+ return draft.id;
+ } finally {
+ db.endTransaction();
+ }
}
@Override
diff --git a/app/src/main/java/eu/faircode/email/FragmentAccount.java b/app/src/main/java/eu/faircode/email/FragmentAccount.java
index 004457c8d9..f12a120b43 100644
--- a/app/src/main/java/eu/faircode/email/FragmentAccount.java
+++ b/app/src/main/java/eu/faircode/email/FragmentAccount.java
@@ -192,7 +192,6 @@ public class FragmentAccount extends FragmentEx {
throw new Throwable(getContext().getString(R.string.title_no_password));
// Check IMAP server / get folders
- DB db = DB.getInstance(getContext());
List" + body.replaceAll("\\r?\\n", "
") + "";
- draft.received = new Date().getTime();
-
- db.message().updateMessage(draft);
-
- // Check data
try {
db.beginTransaction();
+ EntityMessage draft = db.message().getMessageByMsgId(id);
+ EntityIdentity identity = db.identity().getIdentity(iid);
+
+ // Draft deleted by server
+ // TODO: better handling of remote deleted message
+ if (draft == null)
+ throw new MessageRemovedException();
+
+ Log.i(Helper.TAG, "Load action id=" + draft.id + " msgid=" + draft.msgid + " action=" + action);
+
+ // Convert data
+ Address afrom[] = (identity == null ? null : new Address[]{new InternetAddress(identity.email, identity.name)});
+ Address ato[] = (TextUtils.isEmpty(to) ? null : InternetAddress.parse(to));
+ Address acc[] = (TextUtils.isEmpty(cc) ? null : InternetAddress.parse(cc));
+ Address abcc[] = (TextUtils.isEmpty(bcc) ? null : InternetAddress.parse(bcc));
+
+ // Update draft
+ draft.identity = (identity == null ? null : identity.id);
+ draft.from = afrom;
+ draft.to = ato;
+ draft.cc = acc;
+ draft.bcc = abcc;
+ draft.subject = subject;
+ draft.body = "" + body.replaceAll("\\r?\\n", "
") + "";
+ draft.received = new Date().getTime();
+
+ db.message().updateMessage(draft);
+
+ // Execute action
if (action == R.id.action_trash) {
draft.ui_hide = true;
db.message().updateMessage(draft);
diff --git a/app/src/main/java/eu/faircode/email/FragmentFolder.java b/app/src/main/java/eu/faircode/email/FragmentFolder.java
index 4cd46fde44..5b5dc6829d 100644
--- a/app/src/main/java/eu/faircode/email/FragmentFolder.java
+++ b/app/src/main/java/eu/faircode/email/FragmentFolder.java
@@ -85,14 +85,21 @@ public class FragmentFolder extends FragmentEx {
int days = (TextUtils.isEmpty(after) ? 7 : Integer.parseInt(after));
DB db = DB.getInstance(getContext());
- DaoFolder dao = db.folder();
- EntityFolder folder = dao.getFolder(id);
- folder.synchronize = synchronize;
- folder.after = days;
- dao.updateFolder(folder);
+ try {
+ db.beginTransaction();
- if (!folder.synchronize)
- db.message().deleteMessages(folder.id);
+ EntityFolder folder = db.folder().getFolder(id);
+ folder.synchronize = synchronize;
+ folder.after = days;
+ db.folder().updateFolder(folder);
+
+ if (!folder.synchronize)
+ db.message().deleteMessages(folder.id);
+
+ db.setTransactionSuccessful();
+ } finally {
+ db.endTransaction();
+ }
return null;
} finally {
diff --git a/app/src/main/java/eu/faircode/email/FragmentIdentity.java b/app/src/main/java/eu/faircode/email/FragmentIdentity.java
index 378214c45d..3b3df122e2 100644
--- a/app/src/main/java/eu/faircode/email/FragmentIdentity.java
+++ b/app/src/main/java/eu/faircode/email/FragmentIdentity.java
@@ -42,7 +42,6 @@ import android.widget.Toast;
import com.google.android.material.textfield.TextInputLayout;
import java.util.List;
-import java.util.Objects;
import java.util.Properties;
import javax.mail.Session;
@@ -212,6 +211,7 @@ public class FragmentIdentity extends FragmentEx {
String port = args.getString("port");
String user = args.getString("user");
String password = args.getString("password");
+ boolean synchronize = args.getBoolean("synchronize");
if (TextUtils.isEmpty(name))
throw new IllegalArgumentException(getContext().getString(R.string.title_no_name));
@@ -231,38 +231,38 @@ public class FragmentIdentity extends FragmentEx {
if (TextUtils.isEmpty(replyto))
replyto = null;
- DB db = DB.getInstance(getContext());
- EntityIdentity identity = db.identity().getIdentity(id);
- boolean update = (identity != null);
- if (identity == null)
- identity = new EntityIdentity();
- identity.name = name;
- identity.email = email;
- identity.replyto = replyto;
- identity.account = account;
- identity.host = Objects.requireNonNull(host);
- identity.port = Integer.parseInt(port);
- identity.starttls = starttls;
- identity.user = user;
- identity.password = password;
- identity.synchronize = args.getBoolean("synchronize");
- identity.primary = (identity.synchronize && args.getBoolean("primary"));
-
// Check SMTP server
- if (identity.synchronize) {
+ if (synchronize) {
Properties props = MessageHelper.getSessionProperties();
Session isession = Session.getInstance(props, null);
- Transport itransport = isession.getTransport(identity.starttls ? "smtp" : "smtps");
+ Transport itransport = isession.getTransport(starttls ? "smtp" : "smtps");
try {
- itransport.connect(identity.host, identity.port, identity.user, identity.password);
+ itransport.connect(host, Integer.parseInt(port), user, password);
} finally {
itransport.close();
}
}
+ DB db = DB.getInstance(getContext());
try {
db.beginTransaction();
+ EntityIdentity identity = db.identity().getIdentity(id);
+ boolean update = (identity != null);
+ if (identity == null)
+ identity = new EntityIdentity();
+ identity.name = name;
+ identity.email = email;
+ identity.replyto = replyto;
+ identity.account = account;
+ identity.host = host;
+ identity.port = Integer.parseInt(port);
+ identity.starttls = starttls;
+ identity.user = user;
+ identity.password = password;
+ identity.synchronize = synchronize;
+ identity.primary = (identity.synchronize && args.getBoolean("primary"));
+
if (identity.primary)
db.identity().resetPrimary();
diff --git a/app/src/main/java/eu/faircode/email/FragmentMessage.java b/app/src/main/java/eu/faircode/email/FragmentMessage.java
index 83975d5f18..588bd354bc 100644
--- a/app/src/main/java/eu/faircode/email/FragmentMessage.java
+++ b/app/src/main/java/eu/faircode/email/FragmentMessage.java
@@ -433,7 +433,7 @@ public class FragmentMessage extends FragmentEx {
}.load(this, args);
}
- private void onActionEdit(long id) {
+ private void onActionEdit(final long id) {
final MenuItem item = top_navigation.getMenu().findItem(R.id.action_edit);
item.setEnabled(false);
@@ -443,22 +443,32 @@ public class FragmentMessage extends FragmentEx {
Bundle args = new Bundle();
args.putLong("id", id);
- new SimpleTask