diff --git a/app/schemas/eu.faircode.email.DB/1.json b/app/schemas/eu.faircode.email.DB/1.json index 8390c9a4ea..cfa71823bf 100644 --- a/app/schemas/eu.faircode.email.DB/1.json +++ b/app/schemas/eu.faircode.email.DB/1.json @@ -2,7 +2,7 @@ "formatVersion": 1, "database": { "version": 1, - "identityHash": "7814b856d44afe54b8912106df1e673b", + "identityHash": "262ca4c3e0dbf6673b00b8b19fc219de", "entities": [ { "tableName": "identity", @@ -660,7 +660,7 @@ }, { "tableName": "operation", - "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` INTEGER PRIMARY KEY AUTOINCREMENT, `folder` INTEGER NOT NULL, `message` INTEGER NOT NULL, `name` TEXT NOT NULL, `args` TEXT NOT NULL, `error` TEXT, FOREIGN KEY(`folder`) REFERENCES `folder`(`id`) ON UPDATE NO ACTION ON DELETE CASCADE , FOREIGN KEY(`message`) REFERENCES `message`(`id`) ON UPDATE NO ACTION ON DELETE CASCADE )", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` INTEGER PRIMARY KEY AUTOINCREMENT, `folder` INTEGER NOT NULL, `message` INTEGER NOT NULL, `name` TEXT NOT NULL, `args` TEXT NOT NULL, `created` INTEGER NOT NULL, FOREIGN KEY(`folder`) REFERENCES `folder`(`id`) ON UPDATE NO ACTION ON DELETE CASCADE , FOREIGN KEY(`message`) REFERENCES `message`(`id`) ON UPDATE NO ACTION ON DELETE CASCADE )", "fields": [ { "fieldPath": "id", @@ -693,10 +693,10 @@ "notNull": true }, { - "fieldPath": "error", - "columnName": "error", - "affinity": "TEXT", - "notNull": false + "fieldPath": "created", + "columnName": "created", + "affinity": "INTEGER", + "notNull": true } ], "primaryKey": { @@ -751,7 +751,7 @@ ], "setupQueries": [ "CREATE TABLE IF NOT EXISTS room_master_table (id INTEGER PRIMARY KEY,identity_hash TEXT)", - "INSERT OR REPLACE INTO room_master_table (id,identity_hash) VALUES(42, \"7814b856d44afe54b8912106df1e673b\")" + "INSERT OR REPLACE INTO room_master_table (id,identity_hash) VALUES(42, \"262ca4c3e0dbf6673b00b8b19fc219de\")" ] } } \ No newline at end of file diff --git a/app/src/main/java/eu/faircode/email/AdapterAttachment.java b/app/src/main/java/eu/faircode/email/AdapterAttachment.java index fd52321927..6a879c8ed9 100644 --- a/app/src/main/java/eu/faircode/email/AdapterAttachment.java +++ b/app/src/main/java/eu/faircode/email/AdapterAttachment.java @@ -24,6 +24,7 @@ import android.content.Intent; import android.content.pm.PackageManager; import android.content.pm.ResolveInfo; import android.net.Uri; +import android.os.Bundle; import android.text.TextUtils; import android.util.Log; import android.view.LayoutInflater; @@ -40,18 +41,17 @@ import java.util.ArrayList; import java.util.Collections; import java.util.Comparator; import java.util.List; -import java.util.concurrent.ExecutorService; -import java.util.concurrent.Executors; import androidx.annotation.NonNull; import androidx.core.content.FileProvider; +import androidx.lifecycle.LifecycleOwner; import androidx.recyclerview.widget.DiffUtil; import androidx.recyclerview.widget.ListUpdateCallback; import androidx.recyclerview.widget.RecyclerView; public class AdapterAttachment extends RecyclerView.Adapter { private Context context; - private ExecutorService executor = Executors.newCachedThreadPool(); + private LifecycleOwner owner; private List all = new ArrayList<>(); private List filtered = new ArrayList<>(); @@ -140,58 +140,84 @@ public class AdapterAttachment extends RecyclerView.Adapter() { @Override - public void run() { - try { - // Create file - if (!file.exists()) { - dir.mkdir(); - file.createNewFile(); - - // Get attachment content - byte[] content = DB.getInstance(context).attachment().getContent(attachment.id); - - // Write attachment content to file - FileOutputStream fos = null; - try { - fos = new FileOutputStream(file); - fos.write(content); - } finally { - if (fos != null) - fos.close(); - } + protected Void onLoad(Context context, Bundle args) throws Throwable { + long id = args.getLong("id"); + File file = (File) args.getSerializable("file"); + File dir = (File) args.getSerializable("dir"); + + // Create file + if (!file.exists()) { + dir.mkdir(); + file.createNewFile(); + + // Get attachment content + byte[] content = DB.getInstance(context).attachment().getContent(id); + + // Write attachment content to file + FileOutputStream fos = null; + try { + fos = new FileOutputStream(file); + fos.write(content); + } finally { + if (fos != null) + fos.close(); } - - // Start viewer - context.startActivity(intent); - } catch (Throwable ex) { - Log.i(Helper.TAG, ex + "\n" + Log.getStackTraceString(ex)); } + + return null; } - }); + + @Override + protected void onLoaded(Bundle args, Void data) { + context.startActivity(intent); + } + + @Override + protected void onException(Bundle args, Throwable ex) { + Toast.makeText(context, ex.toString(), Toast.LENGTH_LONG).show(); + } + }.load(context, owner, args); } else { - if (attachment.progress == null) - // Download - executor.submit(new Runnable() { + if (attachment.progress == null) { + Bundle args = new Bundle(); + args.putLong("id", attachment.id); + args.putLong("message", attachment.message); + args.putInt("sequence", attachment.sequence); + + new SimpleTask() { @Override - public void run() { + protected Void onLoad(Context context, Bundle args) { + long id = args.getLong("id"); + long message = args.getLong("message"); + long sequence = args.getInt("sequence"); + // No need for a transaction DB db = DB.getInstance(context); - db.attachment().setProgress(attachment.id, 0); + db.attachment().setProgress(id, 0); - EntityMessage message = db.message().getMessage(attachment.message); - EntityOperation.queue(db, message, EntityOperation.ATTACHMENT, attachment.sequence); + EntityMessage msg = db.message().getMessage(message); + EntityOperation.queue(db, msg, EntityOperation.ATTACHMENT, sequence); EntityOperation.process(context); + + return null; } - }); + }.load(context, owner, args); + } } } } - AdapterAttachment(Context context) { + AdapterAttachment(Context context, LifecycleOwner owner) { this.context = context; + this.owner = owner; setHasStableIds(true); } diff --git a/app/src/main/java/eu/faircode/email/AdapterMessage.java b/app/src/main/java/eu/faircode/email/AdapterMessage.java index 3281847994..e9d22f6560 100644 --- a/app/src/main/java/eu/faircode/email/AdapterMessage.java +++ b/app/src/main/java/eu/faircode/email/AdapterMessage.java @@ -31,7 +31,14 @@ import android.widget.ImageView; import android.widget.ProgressBar; import android.widget.TextView; +import java.text.DateFormat; +import java.text.SimpleDateFormat; +import java.util.Date; +import java.util.List; + import androidx.annotation.NonNull; +import androidx.lifecycle.LifecycleOwner; +import androidx.lifecycle.Observer; import androidx.localbroadcastmanager.content.LocalBroadcastManager; import androidx.paging.PagedListAdapter; import androidx.recyclerview.widget.DiffUtil; @@ -39,8 +46,11 @@ import androidx.recyclerview.widget.RecyclerView; public class AdapterMessage extends PagedListAdapter { private Context context; + private LifecycleOwner owner; private ViewType viewType; + private boolean debug; + private DateFormat df = SimpleDateFormat.getDateTimeInstance(SimpleDateFormat.SHORT, SimpleDateFormat.LONG); enum ViewType {FOLDER, THREAD} @@ -87,7 +97,7 @@ public class AdapterMessage extends PagedListAdapter