Signal-Android/src/org/thoughtcrime/securesms/revealable/ViewOnceMessageView.java

169 lines
6.2 KiB
Java

package org.thoughtcrime.securesms.revealable;
import android.content.Context;
import android.content.res.TypedArray;
import android.graphics.Color;
import android.util.AttributeSet;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.TextView;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.annotation.StringRes;
import com.pnikosis.materialishprogress.ProgressWheel;
import org.greenrobot.eventbus.EventBus;
import org.greenrobot.eventbus.Subscribe;
import org.greenrobot.eventbus.ThreadMode;
import org.thoughtcrime.securesms.R;
import org.thoughtcrime.securesms.attachments.Attachment;
import org.thoughtcrime.securesms.database.AttachmentDatabase;
import org.thoughtcrime.securesms.database.model.MmsMessageRecord;
import org.thoughtcrime.securesms.events.PartProgressEvent;
import org.thoughtcrime.securesms.logging.Log;
import org.thoughtcrime.securesms.mms.Slide;
import org.thoughtcrime.securesms.util.MediaUtil;
import org.thoughtcrime.securesms.util.Util;
public class ViewOnceMessageView extends LinearLayout {
private static final String TAG = Log.tag(ViewOnceMessageView.class);
private ImageView icon;
private ProgressWheel progress;
private TextView text;
private Attachment attachment;
private int unopenedForegroundColor;
private int openedForegroundColor;
private int foregroundColor;
public ViewOnceMessageView(Context context) {
super(context);
init(null);
}
public ViewOnceMessageView(Context context, @Nullable AttributeSet attrs) {
super(context, attrs);
init(attrs);
}
private void init(@Nullable AttributeSet attrs) {
inflate(getContext(), R.layout.revealable_message_view, this);
setOrientation(LinearLayout.HORIZONTAL);
if (attrs != null) {
TypedArray typedArray = getContext().getTheme().obtainStyledAttributes(attrs, R.styleable.ViewOnceMessageView, 0, 0);
unopenedForegroundColor = typedArray.getColor(R.styleable.ViewOnceMessageView_revealable_unopenedForegroundColor, Color.BLACK);
openedForegroundColor = typedArray.getColor(R.styleable.ViewOnceMessageView_revealable_openedForegroundColor, Color.BLACK);
typedArray.recycle();
}
this.icon = findViewById(R.id.revealable_icon);
this.progress = findViewById(R.id.revealable_progress);
this.text = findViewById(R.id.revealable_text);
}
@Override
protected void onAttachedToWindow() {
super.onAttachedToWindow();
if (!EventBus.getDefault().isRegistered(this)) {
EventBus.getDefault().register(this);
}
}
@Override
protected void onDetachedFromWindow() {
super.onDetachedFromWindow();
EventBus.getDefault().unregister(this);
}
public boolean requiresTapToDownload(@NonNull MmsMessageRecord messageRecord) {
if (messageRecord.isOutgoing() || messageRecord.getSlideDeck().getThumbnailSlide() == null) {
return false;
}
Attachment attachment = messageRecord.getSlideDeck().getThumbnailSlide().asAttachment();
return attachment.getTransferState() == AttachmentDatabase.TRANSFER_PROGRESS_FAILED ||
attachment.getTransferState() == AttachmentDatabase.TRANSFER_PROGRESS_PENDING;
}
public void setMessage(@NonNull MmsMessageRecord message) {
this.attachment = message.getSlideDeck().getThumbnailSlide() != null ? message.getSlideDeck().getThumbnailSlide().asAttachment() : null;
presentMessage(message);
}
public void presentMessage(@NonNull MmsMessageRecord message) {
presentText(message);
}
private void presentText(@NonNull MmsMessageRecord messageRecord) {
if (messageRecord.isOutgoing()) {
foregroundColor = openedForegroundColor;
text.setText(R.string.RevealableMessageView_outgoing_media);
icon.setImageResource(R.drawable.ic_play_outline_24);
progress.setVisibility(GONE);
} else if (ViewOnceUtil.isViewable(messageRecord)) {
foregroundColor = unopenedForegroundColor;
text.setText(getDescriptionId(messageRecord));
icon.setImageResource(R.drawable.ic_play_solid_24);
progress.setVisibility(GONE);
} else if (networkInProgress(messageRecord)) {
foregroundColor = unopenedForegroundColor;
text.setText("");
icon.setImageResource(0);
progress.setVisibility(VISIBLE);
} else if (requiresTapToDownload(messageRecord)) {
foregroundColor = unopenedForegroundColor;
text.setText(formatFileSize(messageRecord));
icon.setImageResource(R.drawable.ic_arrow_down_circle_outline_24);
progress.setVisibility(GONE);
} else {
foregroundColor = openedForegroundColor;
text.setText(R.string.RevealableMessageView_viewed);
icon.setImageResource(R.drawable.ic_play_outline_24);
progress.setVisibility(GONE);
}
text.setTextColor(foregroundColor);
icon.setColorFilter(foregroundColor);
progress.setBarColor(foregroundColor);
progress.setRimColor(Color.TRANSPARENT);
}
private boolean networkInProgress(@NonNull MmsMessageRecord messageRecord) {
if (messageRecord.getSlideDeck().getThumbnailSlide() == null) return false;
Attachment attachment = messageRecord.getSlideDeck().getThumbnailSlide().asAttachment();
return attachment.getTransferState() == AttachmentDatabase.TRANSFER_PROGRESS_STARTED;
}
private @NonNull String formatFileSize(@NonNull MmsMessageRecord messageRecord) {
if (messageRecord.getSlideDeck().getThumbnailSlide() == null) return "";
long size = messageRecord.getSlideDeck().getThumbnailSlide().getFileSize();
return Util.getPrettyFileSize(size);
}
private static @StringRes int getDescriptionId(@NonNull MmsMessageRecord messageRecord) {
Slide thumbnailSlide = messageRecord.getSlideDeck().getThumbnailSlide();
if (thumbnailSlide != null && MediaUtil.isVideoType(thumbnailSlide.getContentType())) {
return R.string.RevealableMessageView_video;
}
return R.string.RevealableMessageView_photo;
}
@Subscribe(sticky = true, threadMode = ThreadMode.MAIN)
public void onEventAsync(final PartProgressEvent event) {
if (event.attachment.equals(attachment)) {
progress.setInstantProgress((float) event.progress / (float) event.total);
}
}
}