/*
* Copyright (C) 2015 Open Whisper Systems
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see .
*/
package org.tm.archive.mediaoverview;
import android.content.Context;
import android.net.Uri;
import android.os.Handler;
import android.os.Looper;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.lifecycle.Observer;
import androidx.recyclerview.widget.RecyclerView;
import com.annimon.stream.Collectors;
import com.annimon.stream.Stream;
import com.bumptech.glide.RequestManager;
import com.codewaves.stickyheadergrid.StickyHeaderGridAdapter;
import org.signal.libsignal.protocol.util.Pair;
import org.tm.archive.R;
import org.tm.archive.attachments.AttachmentId;
import org.tm.archive.components.AudioView;
import org.tm.archive.components.ThumbnailView;
import org.tm.archive.components.voice.VoiceNotePlaybackState;
import org.tm.archive.database.MediaTable;
import org.tm.archive.database.MediaTable.MediaRecord;
import org.tm.archive.database.loaders.GroupedThreadMediaLoader.GroupedThreadMedia;
import org.tm.archive.mediapreview.MediaPreviewCache;
import org.tm.archive.mms.AudioSlide;
import org.tm.archive.mms.Slide;
import org.tm.archive.recipients.LiveRecipient;
import org.tm.archive.recipients.Recipient;
import org.tm.archive.util.DateUtils;
import org.tm.archive.util.MediaUtil;
import org.tm.archive.util.Util;
import org.tm.archive.util.livedata.LiveDataPair;
import java.util.Collection;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Locale;
import java.util.Map;
import java.util.Objects;
import java.util.Optional;
import java.util.concurrent.TimeUnit;
final class MediaGalleryAllAdapter extends StickyHeaderGridAdapter {
private static final long SELECTION_ANIMATION_DURATION = TimeUnit.MILLISECONDS.toMillis(150);
private final Context context;
private final boolean showThread;
private final RequestManager requestManager;
private final ItemClickListener itemClickListener;
private final Map selected = new HashMap<>();
private final AudioItemListener audioItemListener;
private GroupedThreadMedia media;
private boolean showFileSizes;
private boolean detailView;
private static final int AUDIO_DETAIL = 1;
public static final int GALLERY = 2;
private static final int GALLERY_DETAIL = 3;
private static final int DOCUMENT_DETAIL = 4;
private static final int PAYLOAD_SELECTED = 1;
void detach(RecyclerView.ViewHolder holder) {
if (holder instanceof SelectableViewHolder) {
((SelectableViewHolder) holder).onDetached();
}
}
private static class HeaderHolder extends HeaderViewHolder {
TextView textView;
HeaderHolder(View itemView) {
super(itemView);
textView = itemView.findViewById(R.id.text);
}
}
MediaGalleryAllAdapter(@NonNull Context context,
@NonNull RequestManager requestManager,
GroupedThreadMedia media,
ItemClickListener clickListener,
@NonNull AudioItemListener audioItemListener,
boolean showFileSizes,
boolean showThread)
{
this.context = context;
this.requestManager = requestManager;
this.media = media;
this.itemClickListener = clickListener;
this.audioItemListener = audioItemListener;
this.showFileSizes = showFileSizes;
this.showThread = showThread;
}
public void setMedia(GroupedThreadMedia media) {
this.media = media;
}
@Override
public HeaderViewHolder onCreateHeaderViewHolder(ViewGroup parent, int headerType) {
return new HeaderHolder(LayoutInflater.from(context).inflate(R.layout.media_overview_item_header, parent, false));
}
@Override
public ItemViewHolder onCreateItemViewHolder(ViewGroup parent, int itemType) {
switch (itemType) {
case GALLERY:
return new GalleryViewHolder(LayoutInflater.from(context).inflate(R.layout.media_overview_gallery_item, parent, false));
case GALLERY_DETAIL:
return new GalleryDetailViewHolder(LayoutInflater.from(context).inflate(R.layout.media_overview_detail_item_media, parent, false));
case AUDIO_DETAIL:
return new AudioDetailViewHolder(LayoutInflater.from(context).inflate(R.layout.media_overview_detail_item_audio, parent, false));
default:
return new DocumentDetailViewHolder(LayoutInflater.from(context).inflate(R.layout.media_overview_detail_item_document, parent, false));
}
}
@Override
public int getSectionItemViewType(int section, int offset) {
MediaTable.MediaRecord mediaRecord = media.get(section, offset);
Slide slide = MediaUtil.getSlideForAttachment(mediaRecord.getAttachment());
if (slide.hasAudio()) return AUDIO_DETAIL;
if (slide.hasImage() || slide.hasVideo()) return detailView ? GALLERY_DETAIL : GALLERY;
if (slide.hasDocument()) return DOCUMENT_DETAIL;
return 0;
}
@Override
public void onBindHeaderViewHolder(HeaderViewHolder viewHolder, int section) {
((HeaderHolder) viewHolder).textView.setText(media.getName(section));
}
@Override
public void onBindViewHolder(@NonNull ViewHolder holder, int position, @NonNull List