aboutsummaryrefslogtreecommitdiffstats
path: root/src/main/java/de/pixart/messenger/ui/util
diff options
context:
space:
mode:
authorChristian Schneppe <christian@pix-art.de>2018-09-26 20:27:33 +0200
committerChristian Schneppe <christian@pix-art.de>2018-09-26 20:27:33 +0200
commitb2a122ec71c8c2af58ea6d99806d07d76efcb0f4 (patch)
tree5cb02e46240aaa316bbfa5d6d73d4ab1f7c7053a /src/main/java/de/pixart/messenger/ui/util
parent3c71297965573ffbd3eb423296790b416dc9ce05 (diff)
show conversation media in contact/conference details
Diffstat (limited to 'src/main/java/de/pixart/messenger/ui/util')
-rw-r--r--src/main/java/de/pixart/messenger/ui/util/Attachment.java14
-rw-r--r--src/main/java/de/pixart/messenger/ui/util/GridManager.java71
-rw-r--r--src/main/java/de/pixart/messenger/ui/util/ViewUtil.java50
3 files changed, 135 insertions, 0 deletions
diff --git a/src/main/java/de/pixart/messenger/ui/util/Attachment.java b/src/main/java/de/pixart/messenger/ui/util/Attachment.java
index f11efd0d1..96159c1bd 100644
--- a/src/main/java/de/pixart/messenger/ui/util/Attachment.java
+++ b/src/main/java/de/pixart/messenger/ui/util/Attachment.java
@@ -37,6 +37,7 @@ import android.os.Parcel;
import android.os.Parcelable;
import android.util.Log;
+import java.io.File;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
@@ -61,12 +62,21 @@ public class Attachment implements Parcelable {
private final Type type;
private final UUID uuid;
private final String mime;
+
Attachment(Parcel in) {
uri = in.readParcelable(Uri.class.getClassLoader());
mime = in.readString();
uuid = UUID.fromString(in.readString());
type = Type.valueOf(in.readString());
}
+
+ private Attachment(UUID uuid, Uri uri, Type type, String mime) {
+ this.uri = uri;
+ this.type = type;
+ this.mime = mime;
+ this.uuid = uuid;
+ }
+
private Attachment(Uri uri, Type type, String mime) {
this.uri = uri;
this.type = type;
@@ -88,6 +98,10 @@ public class Attachment implements Parcelable {
return attachments;
}
+ public static Attachment of(UUID uuid, final File file, String mime) {
+ return new Attachment(uuid, Uri.fromFile(file), mime != null && (mime.startsWith("image/") || mime.startsWith("video/")) ? Type.IMAGE : Type.FILE, mime);
+ }
+
public static List<Attachment> extractAttachments(final Context context, final Intent intent, Type type) {
List<Attachment> uris = new ArrayList<>();
if (intent == null) {
diff --git a/src/main/java/de/pixart/messenger/ui/util/GridManager.java b/src/main/java/de/pixart/messenger/ui/util/GridManager.java
new file mode 100644
index 000000000..717fef526
--- /dev/null
+++ b/src/main/java/de/pixart/messenger/ui/util/GridManager.java
@@ -0,0 +1,71 @@
+package de.pixart.messenger.ui.util;
+
+import android.content.Context;
+import android.support.annotation.DimenRes;
+import android.support.v7.widget.GridLayoutManager;
+import android.support.v7.widget.RecyclerView;
+import android.util.Log;
+import android.view.ViewTreeObserver;
+
+import de.pixart.messenger.Config;
+import de.pixart.messenger.ui.adapter.MediaAdapter;
+
+public class GridManager {
+
+ public static void setupLayoutManager(final Context context, RecyclerView recyclerView, @DimenRes int desiredSize) {
+ int maxWidth = context.getResources().getDisplayMetrics().widthPixels;
+ ColumnInfo columnInfo = calculateColumnCount(context, maxWidth, desiredSize);
+ Log.d(Config.LOGTAG, "preliminary count=" + columnInfo.count);
+ MediaAdapter.setMediaSize(recyclerView, columnInfo.width);
+ recyclerView.setLayoutManager(new GridLayoutManager(context, columnInfo.count));
+ recyclerView.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
+ @Override
+ public void onGlobalLayout() {
+ recyclerView.getViewTreeObserver().removeOnGlobalLayoutListener(this);
+ final ColumnInfo columnInfo = calculateColumnCount(context, recyclerView.getMeasuredWidth(), desiredSize);
+ Log.d(Config.LOGTAG, "final count " + columnInfo.count);
+ if (recyclerView.getAdapter().getItemCount() != 0) {
+ Log.e(Config.LOGTAG, "adapter already has items; just go with it now");
+ return;
+ }
+ setupLayoutManagerInternal(recyclerView, columnInfo);
+ MediaAdapter.setMediaSize(recyclerView, columnInfo.width);
+ }
+ });
+ }
+
+ private static void setupLayoutManagerInternal(RecyclerView recyclerView, final ColumnInfo columnInfo) {
+ RecyclerView.LayoutManager layoutManager = recyclerView.getLayoutManager();
+ if (layoutManager instanceof GridLayoutManager) {
+ ((GridLayoutManager) layoutManager).setSpanCount(columnInfo.count);
+ }
+ }
+
+ private static ColumnInfo calculateColumnCount(Context context, int availableWidth, @DimenRes int desiredSize) {
+ final float desiredWidth = context.getResources().getDimension(desiredSize);
+ final int columns = Math.round(availableWidth / desiredWidth);
+ final int realWidth = availableWidth / columns;
+ Log.d(Config.LOGTAG, "desired=" + desiredWidth + " real=" + realWidth);
+ return new ColumnInfo(columns, realWidth);
+ }
+
+ public static int getCurrentColumnCount(RecyclerView recyclerView) {
+ RecyclerView.LayoutManager layoutManager = recyclerView.getLayoutManager();
+ if (layoutManager instanceof GridLayoutManager) {
+ return ((GridLayoutManager) layoutManager).getSpanCount();
+ } else {
+ return 0;
+ }
+ }
+
+ public static class ColumnInfo {
+ private final int count;
+ private final int width;
+
+ private ColumnInfo(int count, int width) {
+ this.count = count;
+ this.width = width;
+ }
+ }
+
+} \ No newline at end of file
diff --git a/src/main/java/de/pixart/messenger/ui/util/ViewUtil.java b/src/main/java/de/pixart/messenger/ui/util/ViewUtil.java
new file mode 100644
index 000000000..2442df8dc
--- /dev/null
+++ b/src/main/java/de/pixart/messenger/ui/util/ViewUtil.java
@@ -0,0 +1,50 @@
+package de.pixart.messenger.ui.util;
+
+import android.content.ActivityNotFoundException;
+import android.content.Context;
+import android.content.Intent;
+import android.content.pm.PackageManager;
+import android.content.pm.ResolveInfo;
+import android.net.Uri;
+import android.util.Log;
+import android.widget.Toast;
+
+import java.io.File;
+import java.util.List;
+
+import de.pixart.messenger.Config;
+import de.pixart.messenger.R;
+import de.pixart.messenger.persistance.FileBackend;
+
+public class ViewUtil {
+
+ public static void view(Context context, Attachment attachment) {
+ File file = new File(attachment.getUri().getPath());
+ final String mime = attachment.getMime() == null ? "*/*" : attachment.getMime();
+ view(context, file, mime);
+ }
+
+ public static void view(Context context, File file, String mime) {
+ Intent openIntent = new Intent(Intent.ACTION_VIEW);
+ Uri uri;
+ try {
+ uri = FileBackend.getUriForFile(context, file);
+ } catch (SecurityException e) {
+ Log.d(Config.LOGTAG, "No permission to access " + file.getAbsolutePath(), e);
+ Toast.makeText(context, context.getString(R.string.no_permission_to_access_x, file.getAbsolutePath()), Toast.LENGTH_SHORT).show();
+ return;
+ }
+ openIntent.setDataAndType(uri, mime);
+ openIntent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
+ PackageManager manager = context.getPackageManager();
+ List<ResolveInfo> info = manager.queryIntentActivities(openIntent, 0);
+ if (info.size() == 0) {
+ openIntent.setDataAndType(uri, "*/*");
+ }
+ try {
+ context.startActivity(openIntent);
+ } catch (ActivityNotFoundException e) {
+ Toast.makeText(context, R.string.no_application_found_to_open_file, Toast.LENGTH_SHORT).show();
+ }
+ }
+} \ No newline at end of file