From 279692670971cb51988315a9463871d8da691993 Mon Sep 17 00:00:00 2001
From: Torsten Grote <t@grobox.de>
Date: Mon, 18 Feb 2019 16:34:22 -0300
Subject: [PATCH] [android] Load image preview from database instead of content
 Uri

---
 .../conversation/AttachmentController.java    |  6 ++--
 .../conversation/AttachmentResult.java        | 11 ++++++-
 .../conversation/ConversationViewModel.java   |  9 +++---
 .../briar/android/view/ImagePreview.java      |  5 ++--
 .../android/view/ImagePreviewAdapter.java     | 13 ++++----
 .../briar/android/view/ImagePreviewItem.java  | 30 +++++++++++--------
 .../android/view/ImagePreviewViewHolder.java  |  2 +-
 .../view/TextAttachmentController.java        |  3 +-
 8 files changed, 49 insertions(+), 30 deletions(-)

diff --git a/briar-android/src/main/java/org/briarproject/briar/android/conversation/AttachmentController.java b/briar-android/src/main/java/org/briarproject/briar/android/conversation/AttachmentController.java
index bd52c84dbc..f7479beb7a 100644
--- a/briar-android/src/main/java/org/briarproject/briar/android/conversation/AttachmentController.java
+++ b/briar-android/src/main/java/org/briarproject/briar/android/conversation/AttachmentController.java
@@ -38,6 +38,7 @@ import static android.support.media.ExifInterface.ORIENTATION_TRANSVERSE;
 import static android.support.media.ExifInterface.TAG_IMAGE_LENGTH;
 import static android.support.media.ExifInterface.TAG_IMAGE_WIDTH;
 import static android.support.media.ExifInterface.TAG_ORIENTATION;
+import static java.util.Objects.requireNonNull;
 import static java.util.logging.Level.WARNING;
 import static java.util.logging.Logger.getLogger;
 import static org.briarproject.bramble.util.IoUtils.tryToClose;
@@ -122,13 +123,13 @@ class AttachmentController {
 	}
 
 	@DatabaseExecutor
-	void createAttachmentHeader(ContentResolver contentResolver,
+	AttachmentItem createAttachmentHeader(ContentResolver contentResolver,
 			GroupId groupId, Uri uri, boolean needsSize)
 			throws IOException, DbException {
 		if (unsentItems.containsKey(uri)) {
 			// This can happen due to configuration (screen orientation) change.
 			// So don't create a new attachment, if we have one already.
-			return;
+			return requireNonNull(unsentItems.get(uri));
 		}
 		long start = now();
 		InputStream is = contentResolver.openInputStream(uri);
@@ -145,6 +146,7 @@ class AttachmentController {
 				getAttachmentItem(contentResolver, uri, h, needsSize);
 		if (item.hasError()) throw new IOException();
 		unsentItems.put(uri, item);
+		return item;
 	}
 
 	boolean isValidMimeType(@Nullable String mimeType) {
diff --git a/briar-android/src/main/java/org/briarproject/briar/android/conversation/AttachmentResult.java b/briar-android/src/main/java/org/briarproject/briar/android/conversation/AttachmentResult.java
index 926d32fab3..2a84252a2c 100644
--- a/briar-android/src/main/java/org/briarproject/briar/android/conversation/AttachmentResult.java
+++ b/briar-android/src/main/java/org/briarproject/briar/android/conversation/AttachmentResult.java
@@ -14,15 +14,19 @@ public class AttachmentResult {
 	@Nullable
 	private final Uri uri;
 	@Nullable
+	private final AttachmentItem item;
+	@Nullable
 	private final String errorMsg;
 
-	public AttachmentResult(Uri uri) {
+	public AttachmentResult(Uri uri, AttachmentItem item) {
 		this.uri = uri;
+		this.item = item;
 		this.errorMsg = null;
 	}
 
 	public AttachmentResult(@Nullable String errorMsg) {
 		this.uri = null;
+		this.item = null;
 		this.errorMsg = errorMsg;
 	}
 
@@ -31,6 +35,11 @@ public class AttachmentResult {
 		return uri;
 	}
 
+	@Nullable
+	public AttachmentItem getItem() {
+		return item;
+	}
+
 	public boolean isError() {
 		return errorMsg != null;
 	}
diff --git a/briar-android/src/main/java/org/briarproject/briar/android/conversation/ConversationViewModel.java b/briar-android/src/main/java/org/briarproject/briar/android/conversation/ConversationViewModel.java
index 2ab1992efa..663e94e98f 100644
--- a/briar-android/src/main/java/org/briarproject/briar/android/conversation/ConversationViewModel.java
+++ b/briar-android/src/main/java/org/briarproject/briar/android/conversation/ConversationViewModel.java
@@ -213,9 +213,10 @@ public class ConversationViewModel extends AndroidViewModel implements
 			if (groupId == null) throw new IllegalStateException();
 			long start = now();
 			try {
-				attachmentController.createAttachmentHeader(contentResolver,
-						groupId, uri, needsSize);
-				result.postValue(new AttachmentResult(uri));
+				AttachmentItem item = attachmentController
+						.createAttachmentHeader(contentResolver, groupId, uri,
+								needsSize);
+				result.postValue(new AttachmentResult(uri, item));
 			} catch(FileTooBigException e) {
 				logException(LOG, WARNING, e);
 				int mb = MAX_IMAGE_SIZE / 1024 / 1024;
@@ -224,7 +225,7 @@ public class ConversationViewModel extends AndroidViewModel implements
 				result.postValue(new AttachmentResult(errorMsg));
 			} catch (DbException | IOException e) {
 				logException(LOG, WARNING, e);
-				result.postValue(new AttachmentResult((String) null));
+				result.postValue(new AttachmentResult(null));
 			}
 			logDuration(LOG, "Storing attachment", start);
 		}));
diff --git a/briar-android/src/main/java/org/briarproject/briar/android/view/ImagePreview.java b/briar-android/src/main/java/org/briarproject/briar/android/view/ImagePreview.java
index 78f74a1890..9e71c30d35 100644
--- a/briar-android/src/main/java/org/briarproject/briar/android/view/ImagePreview.java
+++ b/briar-android/src/main/java/org/briarproject/briar/android/view/ImagePreview.java
@@ -9,6 +9,7 @@ import android.view.LayoutInflater;
 
 import org.briarproject.bramble.api.nullsafety.NotNullByDefault;
 import org.briarproject.briar.R;
+import org.briarproject.briar.android.conversation.AttachmentResult;
 
 import java.util.Collection;
 
@@ -71,10 +72,10 @@ public class ImagePreview extends ConstraintLayout {
 		imageList.setAdapter(adapter);
 	}
 
-	void loadPreviewImage(ImagePreviewItem item) {
+	void loadPreviewImage(AttachmentResult result) {
 		ImagePreviewAdapter adapter =
 				((ImagePreviewAdapter) imageList.getAdapter());
-		requireNonNull(adapter).loadItemPreview(item);
+		requireNonNull(adapter).loadItemPreview(result);
 	}
 
 	interface ImagePreviewListener {
diff --git a/briar-android/src/main/java/org/briarproject/briar/android/view/ImagePreviewAdapter.java b/briar-android/src/main/java/org/briarproject/briar/android/view/ImagePreviewAdapter.java
index 70735fdd64..a5587ccaf1 100644
--- a/briar-android/src/main/java/org/briarproject/briar/android/view/ImagePreviewAdapter.java
+++ b/briar-android/src/main/java/org/briarproject/briar/android/view/ImagePreviewAdapter.java
@@ -8,6 +8,7 @@ import android.view.ViewGroup;
 
 import org.briarproject.bramble.api.nullsafety.NotNullByDefault;
 import org.briarproject.briar.R;
+import org.briarproject.briar.android.conversation.AttachmentResult;
 import org.briarproject.briar.android.view.ImagePreview.ImagePreviewListener;
 
 import java.util.ArrayList;
@@ -53,12 +54,14 @@ class ImagePreviewAdapter extends Adapter<ImagePreviewViewHolder> {
 		return items.size();
 	}
 
-	void loadItemPreview(ImagePreviewItem item) {
-		int pos = items.indexOf(item);
+	void loadItemPreview(AttachmentResult result) {
+		ImagePreviewItem newItem =
+				new ImagePreviewItem(requireNonNull(result.getUri()));
+		int pos = items.indexOf(newItem);
 		if (pos == NO_POSITION) throw new AssertionError();
-		ImagePreviewItem newItem = items.get(pos);
-		newItem.setWaitForLoading(false);
-		notifyItemChanged(pos, newItem);
+		ImagePreviewItem item = items.get(pos);
+		item.setItem(requireNonNull(result.getItem()));
+		notifyItemChanged(pos, item);
 	}
 
 }
diff --git a/briar-android/src/main/java/org/briarproject/briar/android/view/ImagePreviewItem.java b/briar-android/src/main/java/org/briarproject/briar/android/view/ImagePreviewItem.java
index bf1ba71fb9..e9c1d05856 100644
--- a/briar-android/src/main/java/org/briarproject/briar/android/view/ImagePreviewItem.java
+++ b/briar-android/src/main/java/org/briarproject/briar/android/view/ImagePreviewItem.java
@@ -4,6 +4,7 @@ import android.net.Uri;
 import android.support.annotation.Nullable;
 
 import org.briarproject.bramble.api.nullsafety.NotNullByDefault;
+import org.briarproject.briar.android.conversation.AttachmentItem;
 
 import java.util.ArrayList;
 import java.util.Collection;
@@ -13,22 +14,12 @@ import java.util.List;
 class ImagePreviewItem {
 
 	private final Uri uri;
-	private boolean waitForLoading = true;
+	@Nullable
+	private AttachmentItem item;
 
 	ImagePreviewItem(Uri uri) {
 		this.uri = uri;
-	}
-
-	Uri getUri() {
-		return uri;
-	}
-
-	void setWaitForLoading(boolean waitForLoading) {
-		this.waitForLoading = waitForLoading;
-	}
-
-	boolean waitForLoading() {
-		return waitForLoading;
+		this.item = null;
 	}
 
 	static List<ImagePreviewItem> fromUris(Collection<Uri> uris) {
@@ -39,6 +30,19 @@ class ImagePreviewItem {
 		return items;
 	}
 
+	Uri getUri() {
+		return uri;
+	}
+
+	public void setItem(AttachmentItem item) {
+		this.item = item;
+	}
+
+	@Nullable
+	public AttachmentItem getItem() {
+		return item;
+	}
+
 	@Override
 	public boolean equals(@Nullable Object o) {
 		return o instanceof ImagePreviewItem &&
diff --git a/briar-android/src/main/java/org/briarproject/briar/android/view/ImagePreviewViewHolder.java b/briar-android/src/main/java/org/briarproject/briar/android/view/ImagePreviewViewHolder.java
index a18ae3c171..b7b9c8509f 100644
--- a/briar-android/src/main/java/org/briarproject/briar/android/view/ImagePreviewViewHolder.java
+++ b/briar-android/src/main/java/org/briarproject/briar/android/view/ImagePreviewViewHolder.java
@@ -42,7 +42,7 @@ class ImagePreviewViewHolder extends ViewHolder {
 	}
 
 	void bind(ImagePreviewItem item) {
-		if (item.waitForLoading()) return;
+		if (item.getItem() == null) return;
 		GlideApp.with(imageView)
 				.load(item.getUri())
 				.diskCacheStrategy(NONE)
diff --git a/briar-android/src/main/java/org/briarproject/briar/android/view/TextAttachmentController.java b/briar-android/src/main/java/org/briarproject/briar/android/view/TextAttachmentController.java
index db8723caff..0b6e30ef56 100644
--- a/briar-android/src/main/java/org/briarproject/briar/android/view/TextAttachmentController.java
+++ b/briar-android/src/main/java/org/briarproject/briar/android/view/TextAttachmentController.java
@@ -161,8 +161,7 @@ public class TextAttachmentController extends TextSendController
 		if (result.isError() || result.getUri() == null) {
 			onError(result.getErrorMsg());
 		} else {
-			ImagePreviewItem item = new ImagePreviewItem(result.getUri());
-			imagePreview.loadPreviewImage(item);
+			imagePreview.loadPreviewImage(result);
 		}
 	}
 
-- 
GitLab