introduce media browser activity

Daniel Gultsch created

Change summary

src/main/AndroidManifest.xml                                             |  3 
src/main/java/eu/siacs/conversations/persistance/DatabaseBackend.java    |  4 
src/main/java/eu/siacs/conversations/services/XmppConnectionService.java |  6 
src/main/java/eu/siacs/conversations/ui/ConferenceDetailsActivity.java   |  1 
src/main/java/eu/siacs/conversations/ui/ContactDetailsActivity.java      |  7 
src/main/java/eu/siacs/conversations/ui/MediaBrowserActivity.java        | 77 
src/main/res/layout/activity_media_browser.xml                           | 24 
src/main/res/values/dimens.xml                                           |  1 
src/main/res/values/strings.xml                                          |  1 
9 files changed, 115 insertions(+), 9 deletions(-)

Detailed changes

src/main/AndroidManifest.xml 🔗

@@ -235,6 +235,9 @@
                   android:theme="@style/Base.Theme.AppCompat"/>
         <activity android:name=".ui.MemorizingActivity"/>
 
+        <activity android:name=".ui.MediaBrowserActivity"
+            android:label="@string/media_browser"/>
+
         <service android:name=".services.ExportLogsService"/>
         <service
             android:name=".services.ContactChooserTargetService"

src/main/java/eu/siacs/conversations/persistance/DatabaseBackend.java 🔗

@@ -775,10 +775,10 @@ public class DatabaseBackend extends SQLiteOpenHelper {
 		};
 	}
 
-	public List<FilePath> getRelativeFilePaths(Account account, Jid jid, int limit) {
+	public List<FilePath> getRelativeFilePaths(String account, Jid jid, int limit) {
 		SQLiteDatabase db = this.getReadableDatabase();
 		final String SQL = "select uuid,relativeFilePath from messages where type in (1,2) and conversationUuid=(select uuid from conversations where accountUuid=? and (contactJid=? or contactJid like ?)) order by timeSent desc";
-		final String[] args = {account.getUuid(), jid.asBareJid().toEscapedString(), jid.asBareJid().toEscapedString()+"/%"};
+		final String[] args = {account, jid.toEscapedString(), jid.toEscapedString()+"/%"};
 		Cursor cursor = db.rawQuery(SQL+(limit > 0 ? " limit "+String.valueOf(limit) : ""), args);
 		List<FilePath> filesPaths = new ArrayList<>();
 		while(cursor.moveToNext()) {

src/main/java/eu/siacs/conversations/services/XmppConnectionService.java 🔗

@@ -2425,8 +2425,12 @@ public class XmppConnectionService extends Service {
         getAttachments(conversation.getAccount(), conversation.getJid().asBareJid(), limit, onMediaLoaded);
     }
 
+    public void getAttachments(final Account account, final Jid jid, final int limit, final OnMediaLoaded onMediaLoaded) {
+        getAttachments(account.getUuid(),jid.asBareJid(),limit, onMediaLoaded);
+    }
+
 
-	public void getAttachments(final Account account, final Jid jid, final int limit, final OnMediaLoaded onMediaLoaded) {
+	public void getAttachments(final String account, final Jid jid, final int limit, final OnMediaLoaded onMediaLoaded) {
         new Thread(() -> onMediaLoaded.onMediaLoaded(fileBackend.convertToAttachments(databaseBackend.getRelativeFilePaths(account, jid, limit)))).start();
     }
 

src/main/java/eu/siacs/conversations/ui/ConferenceDetailsActivity.java 🔗

@@ -488,6 +488,7 @@ public class ConferenceDetailsActivity extends XmppActivity implements OnConvers
             if (this.mConversation != null) {
                 final int limit = GridManager.getCurrentColumnCount(this.binding.media);
                 xmppConnectionService.getAttachments(this.mConversation, limit, this);
+                this.binding.showMedia.setOnClickListener((v)->MediaBrowserActivity.launch(this,mConversation));
                 updateView();
             }
         }

src/main/java/eu/siacs/conversations/ui/ContactDetailsActivity.java 🔗

@@ -1,7 +1,6 @@
 package eu.siacs.conversations.ui;
 
 import android.content.ActivityNotFoundException;
-import android.content.Context;
 import android.content.DialogInterface;
 import android.content.Intent;
 import android.content.SharedPreferences;
@@ -12,18 +11,13 @@ import android.preference.PreferenceManager;
 import android.provider.ContactsContract.CommonDataKinds;
 import android.provider.ContactsContract.Contacts;
 import android.provider.ContactsContract.Intents;
-import android.support.v4.content.ContextCompat;
 import android.support.v7.app.AlertDialog;
-import android.support.v7.widget.GridLayoutManager;
-import android.support.v7.widget.RecyclerView;
 import android.support.v7.widget.Toolbar;
-import android.util.Log;
 import android.view.LayoutInflater;
 import android.view.Menu;
 import android.view.MenuItem;
 import android.view.View;
 import android.view.View.OnClickListener;
-import android.view.ViewTreeObserver;
 import android.widget.CompoundButton;
 import android.widget.CompoundButton.OnCheckedChangeListener;
 import android.widget.TextView;
@@ -488,6 +482,7 @@ public class ContactDetailsActivity extends OmemoActivity implements OnAccountUp
 
             final int limit = GridManager.getCurrentColumnCount(this.binding.media);
             xmppConnectionService.getAttachments(account, contact.getJid().asBareJid(), limit, this);
+            this.binding.showMedia.setOnClickListener((v)->MediaBrowserActivity.launch(this,contact));
             populateView();
         }
     }

src/main/java/eu/siacs/conversations/ui/MediaBrowserActivity.java 🔗

@@ -0,0 +1,77 @@
+package eu.siacs.conversations.ui;
+
+import android.content.Context;
+import android.content.Intent;
+import android.databinding.DataBindingUtil;
+import android.os.Bundle;
+import android.support.v7.widget.Toolbar;
+
+import java.util.List;
+
+import eu.siacs.conversations.R;
+import eu.siacs.conversations.entities.Account;
+import eu.siacs.conversations.entities.Contact;
+import eu.siacs.conversations.entities.Conversation;
+
+import eu.siacs.conversations.databinding.ActivityMediaBrowserBinding;
+import eu.siacs.conversations.ui.adapter.MediaAdapter;
+import eu.siacs.conversations.ui.interfaces.OnMediaLoaded;
+import eu.siacs.conversations.ui.util.Attachment;
+import eu.siacs.conversations.ui.util.GridManager;
+import rocks.xmpp.addr.Jid;
+
+public class MediaBrowserActivity extends XmppActivity implements OnMediaLoaded {
+
+    private ActivityMediaBrowserBinding binding;
+
+    private MediaAdapter mMediaAdapter;
+
+    @Override
+    protected void onCreate(final Bundle savedInstanceState) {
+        super.onCreate(savedInstanceState);
+        this.binding = DataBindingUtil.setContentView(this,R.layout.activity_media_browser);
+        setSupportActionBar((Toolbar) binding.toolbar);
+        configureActionBar(getSupportActionBar());
+        mMediaAdapter = new MediaAdapter(this, R.dimen.media_size);
+        this.binding.media.setAdapter(mMediaAdapter);
+        GridManager.setupLayoutManager(this, this.binding.media, R.dimen.browser_media_size);
+
+    }
+
+    @Override
+    protected void refreshUiReal() {
+
+    }
+
+    @Override
+    void onBackendConnected() {
+        Intent intent = getIntent();
+        String account = intent == null ? null : intent.getStringExtra("account");
+        String jid = intent == null ? null : intent.getStringExtra("jid");
+        if (account != null && jid != null) {
+            xmppConnectionService.getAttachments(account, Jid.of(jid), 0, this);
+        }
+    }
+
+    public static void launch(Context context, Contact contact) {
+        launch(context, contact.getAccount(), contact.getJid().asBareJid().toEscapedString());
+    }
+
+    public static void launch(Context context, Conversation conversation) {
+        launch(context, conversation.getAccount(), conversation.getJid().asBareJid().toEscapedString());
+    }
+
+    private static void launch(Context context, Account account, String jid) {
+        final Intent intent = new Intent(context, MediaBrowserActivity.class);
+        intent.putExtra("account",account.getUuid());
+        intent.putExtra("jid",jid);
+        context.startActivity(intent);
+    }
+
+    @Override
+    public void onMediaLoaded(List<Attachment> attachments) {
+        runOnUiThread(()->{
+            mMediaAdapter.setAttachments(attachments);
+        });
+    }
+}

src/main/res/layout/activity_media_browser.xml 🔗

@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="utf-8"?>
+<layout xmlns:android="http://schemas.android.com/apk/res/android">
+
+    <LinearLayout
+        android:layout_width="match_parent"
+        android:layout_height="match_parent"
+        android:background="?attr/color_background_primary"
+        android:orientation="vertical">
+
+        <include
+            android:id="@+id/toolbar"
+            layout="@layout/toolbar"/>
+
+        <android.support.v7.widget.RecyclerView
+            android:id="@+id/media"
+            android:layout_width="match_parent"
+            android:layout_height="wrap_content"
+            android:orientation="horizontal"
+            android:clipToPadding="false"
+            android:padding="2dp"
+            android:scrollbars="vertical"/>
+
+    </LinearLayout>
+</layout>

src/main/res/values/dimens.xml 🔗

@@ -13,6 +13,7 @@
 
 	<dimen name="media_preview_size">80dp</dimen>
 	<dimen name="media_size">64dp</dimen>
+	<dimen name="browser_media_size">96dp</dimen>
 	<dimen name="toolbar_elevation">4dp</dimen>
 
 	<dimen name="publish_avatar_top_margin">8dp</dimen>

src/main/res/values/strings.xml 🔗

@@ -735,4 +735,5 @@
     <string name="pref_more_notification_settings_summary">Importance, Sound, Vibrate</string>
     <string name="video_compression_channel_name">Video compression</string>
     <string name="show_media">Show media</string>
+    <string name="media_browser">Media browser</string>
 </resources>