make media previews survive rotations

Daniel Gultsch created

Change summary

src/main/java/eu/siacs/conversations/ui/ConversationFragment.java        | 18 
src/main/java/eu/siacs/conversations/ui/adapter/MediaPreviewAdapter.java |  4 
src/main/java/eu/siacs/conversations/ui/util/Attachment.java             | 36 
3 files changed, 54 insertions(+), 4 deletions(-)

Detailed changes

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

@@ -139,12 +139,14 @@ public class ConversationFragment extends XmppFragment implements EditMessage.Ke
     public static final String RECENTLY_USED_QUICK_ACTION = "recently_used_quick_action";
     public static final String STATE_CONVERSATION_UUID = ConversationFragment.class.getName() + ".uuid";
     public static final String STATE_SCROLL_POSITION = ConversationFragment.class.getName() + ".scroll_position";
-    public static final String STATE_PHOTO_URI = ConversationFragment.class.getName() + ".take_photo_uri";
+    public static final String STATE_PHOTO_URI = ConversationFragment.class.getName() + ".media_previews";
+    public static final String STATE_MEDIA_PREVIEWS = ConversationFragment.class.getName() + ".take_photo_uri";
     private static final String STATE_LAST_MESSAGE_UUID = "state_last_message_uuid";
 
     private final List<Message> messageList = new ArrayList<>();
     private final PendingItem<ActivityResult> postponedActivityResult = new PendingItem<>();
     private final PendingItem<String> pendingConversationsUuid = new PendingItem<>();
+    private final PendingItem<ArrayList<Attachment>> pendingMediaPreviews = new PendingItem<>();
     private final PendingItem<Bundle> pendingExtras = new PendingItem<>();
     private final PendingItem<Uri> pendingTakePhotoUri = new PendingItem<>();
     private final PendingItem<ScrollState> pendingScrollState = new PendingItem<>();
@@ -1773,6 +1775,10 @@ public class ConversationFragment extends XmppFragment implements EditMessage.Ke
             if (scrollState != null) {
                 outState.putParcelable(STATE_SCROLL_POSITION, scrollState);
             }
+            final ArrayList<Attachment> attachments = mediaPreviewAdapter.getAttachments();
+            if (attachments.size() > 0) {
+                outState.putParcelableArrayList(STATE_MEDIA_PREVIEWS, attachments);
+            }
         }
     }
 
@@ -1783,10 +1789,14 @@ public class ConversationFragment extends XmppFragment implements EditMessage.Ke
             return;
         }
         String uuid = savedInstanceState.getString(STATE_CONVERSATION_UUID);
+        ArrayList<Attachment> attachments = savedInstanceState.getParcelableArrayList(STATE_MEDIA_PREVIEWS);
         pendingLastMessageUuid.push(savedInstanceState.getString(STATE_LAST_MESSAGE_UUID, null));
         if (uuid != null) {
             QuickLoader.set(uuid);
             this.pendingConversationsUuid.push(uuid);
+            if (attachments != null && attachments.size() > 0) {
+                this.pendingMediaPreviews.push(attachments);
+            }
             String takePhotoUri = savedInstanceState.getString(STATE_PHOTO_URI);
             if (takePhotoUri != null) {
                 pendingTakePhotoUri.push(Uri.parse(takePhotoUri));
@@ -2637,9 +2647,15 @@ public class ConversationFragment extends XmppFragment implements EditMessage.Ke
         reInit(conversation);
         ScrollState scrollState = pendingScrollState.pop();
         String lastMessageUuid = pendingLastMessageUuid.pop();
+        List<Attachment> attachments = pendingMediaPreviews.pop();
         if (scrollState != null) {
             setScrollPosition(scrollState, lastMessageUuid);
         }
+        if (attachments != null && attachments.size() > 0) {
+            Log.d(Config.LOGTAG,"had attachments on restore");
+            mediaPreviewAdapter.addMediaPreviews(attachments);
+            toggleInputMethod();
+        }
         return true;
     }
 

src/main/java/eu/siacs/conversations/ui/adapter/MediaPreviewAdapter.java 🔗

@@ -29,7 +29,7 @@ import eu.siacs.conversations.ui.util.StyledAttributes;
 
 public class MediaPreviewAdapter extends RecyclerView.Adapter<MediaPreviewAdapter.MediaPreviewViewHolder> {
 
-    private final List<Attachment> mediaPreviews = new ArrayList<>();
+    private final ArrayList<Attachment> mediaPreviews = new ArrayList<>();
 
     private final ConversationFragment conversationFragment;
 
@@ -150,7 +150,7 @@ public class MediaPreviewAdapter extends RecyclerView.Adapter<MediaPreviewAdapte
         return mediaPreviews.size() > 0;
     }
 
-    public List<Attachment> getAttachments() {
+    public ArrayList<Attachment> getAttachments() {
         return mediaPreviews;
     }
 

src/main/java/eu/siacs/conversations/ui/util/Attachment.java 🔗

@@ -33,6 +33,8 @@ import android.content.ClipData;
 import android.content.Context;
 import android.content.Intent;
 import android.net.Uri;
+import android.os.Parcel;
+import android.os.Parcelable;
 import android.util.Log;
 
 import java.util.ArrayList;
@@ -44,7 +46,39 @@ import eu.siacs.conversations.Config;
 import eu.siacs.conversations.utils.MimeUtils;
 import eu.siacs.conversations.xmpp.stanzas.IqPacket;
 
-public class Attachment {
+public class Attachment implements Parcelable {
+
+    Attachment(Parcel in) {
+        uri = in.readParcelable(Uri.class.getClassLoader());
+        mime = in.readString();
+        uuid = UUID.fromString(in.readString());
+        type = Type.valueOf(in.readString());
+    }
+
+    @Override
+    public void writeToParcel(Parcel dest, int flags) {
+        dest.writeParcelable(uri, flags);
+        dest.writeString(mime);
+        dest.writeString(uuid.toString());
+        dest.writeString(type.toString());
+    }
+
+    @Override
+    public int describeContents() {
+        return 0;
+    }
+
+    public static final Creator<Attachment> CREATOR = new Creator<Attachment>() {
+        @Override
+        public Attachment createFromParcel(Parcel in) {
+            return new Attachment(in);
+        }
+
+        @Override
+        public Attachment[] newArray(int size) {
+            return new Attachment[size];
+        }
+    };
 
     public String getMime() {
         return mime;