mirror of
https://github.com/oxen-io/session-android.git
synced 2025-10-24 07:48:42 +00:00
Refactor "parts" to contain MMS/PDU madness to MMS code paths.
Closes #4248 // FREEBIE
This commit is contained in:
@@ -8,14 +8,13 @@ import android.graphics.Color;
|
||||
import android.os.Build.VERSION;
|
||||
import android.os.Build.VERSION_CODES;
|
||||
import android.support.annotation.NonNull;
|
||||
import android.support.annotation.Nullable;
|
||||
import android.util.AttributeSet;
|
||||
import android.util.Log;
|
||||
import android.view.View;
|
||||
import android.widget.FrameLayout;
|
||||
import android.widget.ImageView;
|
||||
|
||||
import com.bumptech.glide.DrawableTypeRequest;
|
||||
import com.bumptech.glide.DrawableRequestBuilder;
|
||||
import com.bumptech.glide.GenericRequestBuilder;
|
||||
import com.bumptech.glide.Glide;
|
||||
import com.bumptech.glide.load.resource.bitmap.GlideBitmapDrawable;
|
||||
@@ -24,8 +23,9 @@ import com.bumptech.glide.request.RequestListener;
|
||||
import com.bumptech.glide.request.target.Target;
|
||||
|
||||
import org.thoughtcrime.securesms.R;
|
||||
import org.thoughtcrime.securesms.attachments.Attachment;
|
||||
import org.thoughtcrime.securesms.crypto.MasterSecret;
|
||||
import org.thoughtcrime.securesms.database.PartDatabase;
|
||||
import org.thoughtcrime.securesms.database.AttachmentDatabase;
|
||||
import org.thoughtcrime.securesms.mms.DecryptableStreamUriLoader.DecryptableUri;
|
||||
import org.thoughtcrime.securesms.mms.RoundedCorners;
|
||||
import org.thoughtcrime.securesms.mms.Slide;
|
||||
@@ -36,12 +36,9 @@ import org.thoughtcrime.securesms.util.Util;
|
||||
import org.thoughtcrime.securesms.util.ViewUtil;
|
||||
import org.whispersystems.libaxolotl.util.guava.Optional;
|
||||
|
||||
import ws.com.google.android.mms.pdu.PduPart;
|
||||
|
||||
public class ThumbnailView extends FrameLayout {
|
||||
private static final String TAG = ThumbnailView.class.getSimpleName();
|
||||
|
||||
private boolean hideControls;
|
||||
private ImageView image;
|
||||
private ImageView removeButton;
|
||||
private int backgroundColorHint;
|
||||
@@ -53,7 +50,6 @@ public class ThumbnailView extends FrameLayout {
|
||||
private SlideDeckListener slideDeckListener = null;
|
||||
private ThumbnailClickListener thumbnailClickListener = null;
|
||||
private ThumbnailClickListener downloadClickListener = null;
|
||||
private String slideId = null;
|
||||
private Slide slide = null;
|
||||
|
||||
public ThumbnailView(Context context) {
|
||||
@@ -78,21 +74,25 @@ public class ThumbnailView extends FrameLayout {
|
||||
}
|
||||
}
|
||||
|
||||
@Override public void setOnClickListener(OnClickListener l) {
|
||||
@Override
|
||||
public void setOnClickListener(OnClickListener l) {
|
||||
parentClickListener = l;
|
||||
}
|
||||
|
||||
@Override public void setFocusable(boolean focusable) {
|
||||
@Override
|
||||
public void setFocusable(boolean focusable) {
|
||||
super.setFocusable(focusable);
|
||||
if (transferControls.isPresent()) transferControls.get().setFocusable(focusable);
|
||||
}
|
||||
|
||||
@Override public void setClickable(boolean clickable) {
|
||||
@Override
|
||||
public void setClickable(boolean clickable) {
|
||||
super.setClickable(clickable);
|
||||
if (transferControls.isPresent()) transferControls.get().setClickable(clickable);
|
||||
}
|
||||
|
||||
@Override protected void onLayout(boolean changed, int left, int top, int right, int bottom) {
|
||||
@Override
|
||||
protected void onLayout(boolean changed, int left, int top, int right, int bottom) {
|
||||
super.onLayout(changed, left, top, right, bottom);
|
||||
if (removeButton != null) {
|
||||
final int paddingHorizontal = removeButton.getWidth() / 2;
|
||||
@@ -117,32 +117,30 @@ public class ThumbnailView extends FrameLayout {
|
||||
this.backgroundColorHint = color;
|
||||
}
|
||||
|
||||
public void setImageResource(@Nullable MasterSecret masterSecret,
|
||||
long id,
|
||||
long timestamp,
|
||||
@NonNull ListenableFutureTask<SlideDeck> slideDeckFuture)
|
||||
public void setImageResource(@NonNull MasterSecret masterSecret,
|
||||
@NonNull ListenableFutureTask<SlideDeck> slideDeckFuture,
|
||||
boolean showControls, boolean showRemove)
|
||||
{
|
||||
if (this.slideDeckFuture != null && this.slideDeckListener != null) {
|
||||
this.slideDeckFuture.removeListener(this.slideDeckListener);
|
||||
}
|
||||
|
||||
String slideId = id + "::" + timestamp;
|
||||
|
||||
if (!slideId.equals(this.slideId)) {
|
||||
if (!slideDeckFuture.equals(this.slideDeckFuture)) {
|
||||
if (transferControls.isPresent()) getTransferControls().clear();
|
||||
image.setImageDrawable(null);
|
||||
this.slide = null;
|
||||
this.slideId = slideId;
|
||||
this.slide = null;
|
||||
}
|
||||
|
||||
this.slideDeckListener = new SlideDeckListener(masterSecret);
|
||||
this.slideDeckListener = new SlideDeckListener(masterSecret, showControls, showRemove);
|
||||
this.slideDeckFuture = slideDeckFuture;
|
||||
this.slideDeckFuture.addListener(this.slideDeckListener);
|
||||
}
|
||||
|
||||
public void setImageResource(@NonNull Slide slide, @Nullable MasterSecret masterSecret) {
|
||||
public void setImageResource(@NonNull MasterSecret masterSecret, @NonNull Slide slide,
|
||||
boolean showControls, boolean showRemove)
|
||||
{
|
||||
if (Util.equals(slide, this.slide)) {
|
||||
Log.w(TAG, "Not re-loading slide " + slide.getPart().getPartId());
|
||||
Log.w(TAG, "Not re-loading slide " + slide.asAttachment().getDataUri());
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -151,16 +149,21 @@ public class ThumbnailView extends FrameLayout {
|
||||
return;
|
||||
}
|
||||
|
||||
Log.w(TAG, "loading part with id " + slide.getPart().getPartId()
|
||||
+ ", progress " + slide.getTransferProgress());
|
||||
|
||||
this.slide = slide;
|
||||
loadInto(slide, masterSecret, image);
|
||||
|
||||
if (!hideControls) {
|
||||
if (showControls) {
|
||||
getTransferControls().setSlide(slide);
|
||||
getTransferControls().setDownloadClickListener(new DownloadClickDispatcher());
|
||||
} else if (transferControls.isPresent()) {
|
||||
getTransferControls().setVisibility(View.GONE);
|
||||
}
|
||||
|
||||
Log.w(TAG, "loading part with id " + slide.asAttachment().getDataUri()
|
||||
+ ", progress " + slide.getTransferState());
|
||||
|
||||
this.slide = slide;
|
||||
|
||||
if (slide.getThumbnailUri() != null) buildThumbnailGlideRequest(slide, masterSecret, showRemove).into(image);
|
||||
else if (slide.hasPlaceholder()) buildPlaceholderGlideRequest(slide).into(image);
|
||||
else Glide.clear(image);
|
||||
}
|
||||
|
||||
public void setThumbnailClickListener(ThumbnailClickListener listener) {
|
||||
@@ -182,16 +185,10 @@ public class ThumbnailView extends FrameLayout {
|
||||
if (slideDeckFuture != null) slideDeckFuture.removeListener(slideDeckListener);
|
||||
if (transferControls.isPresent()) getTransferControls().clear();
|
||||
slide = null;
|
||||
slideId = null;
|
||||
slideDeckFuture = null;
|
||||
slideDeckListener = null;
|
||||
}
|
||||
|
||||
public void hideControls(boolean hideControls) {
|
||||
this.hideControls = hideControls;
|
||||
if (hideControls && transferControls.isPresent()) getTransferControls().setVisibility(View.GONE);
|
||||
}
|
||||
|
||||
public void showProgressSpinner() {
|
||||
getTransferControls().showProgressSpinner();
|
||||
}
|
||||
@@ -203,48 +200,19 @@ public class ThumbnailView extends FrameLayout {
|
||||
!((Activity)getContext()).isDestroyed();
|
||||
}
|
||||
|
||||
private void loadInto(@NonNull Slide slide,
|
||||
@Nullable MasterSecret masterSecret,
|
||||
@NonNull ImageView view)
|
||||
{
|
||||
if (slide.getThumbnailUri() != null) {
|
||||
buildThumbnailGlideRequest(slide, masterSecret).into(view);
|
||||
} else if (!slide.isInProgress()) {
|
||||
buildPlaceholderGlideRequest(slide).into(view);
|
||||
} else {
|
||||
Glide.clear(view);
|
||||
private GenericRequestBuilder buildThumbnailGlideRequest(@NonNull Slide slide, @NonNull MasterSecret masterSecret, boolean showRemove) {
|
||||
DrawableRequestBuilder<DecryptableUri> builder = Glide.with(getContext()).load(new DecryptableUri(masterSecret, slide.getThumbnailUri()))
|
||||
.crossFade()
|
||||
.transform(new RoundedCorners(getContext(), true, radius, backgroundColorHint));
|
||||
|
||||
if (showRemove) {
|
||||
builder = builder.listener(new ThumbnailSetListener(slide.asAttachment()));
|
||||
}
|
||||
}
|
||||
|
||||
private GenericRequestBuilder buildThumbnailGlideRequest(Slide slide, MasterSecret masterSecret) {
|
||||
final GenericRequestBuilder builder;
|
||||
|
||||
if (slide.isDraft()) builder = buildDraftGlideRequest(slide, masterSecret);
|
||||
else builder = buildPartGlideRequest(slide, masterSecret);
|
||||
|
||||
if (slide.isInProgress()) return builder;
|
||||
else return builder.error(R.drawable.ic_missing_thumbnail_picture);
|
||||
}
|
||||
|
||||
private GenericRequestBuilder buildDraftGlideRequest(Slide slide, MasterSecret masterSecret) {
|
||||
final DrawableTypeRequest<?> request;
|
||||
if (masterSecret == null) request = Glide.with(getContext()).load(slide.getThumbnailUri());
|
||||
else request = Glide.with(getContext()).load(new DecryptableUri(masterSecret, slide.getThumbnailUri()));
|
||||
|
||||
return request.transform(new RoundedCorners(getContext(), false, radius, backgroundColorHint))
|
||||
.listener(new PduThumbnailSetListener(slide.getPart()));
|
||||
}
|
||||
|
||||
private GenericRequestBuilder buildPartGlideRequest(Slide slide, MasterSecret masterSecret) {
|
||||
if (masterSecret == null) {
|
||||
throw new IllegalStateException("null MasterSecret when loading non-draft thumbnail");
|
||||
}
|
||||
|
||||
return Glide.with(getContext()).load(new DecryptableUri(masterSecret, slide.getThumbnailUri()))
|
||||
.crossFade()
|
||||
.transform(new RoundedCorners(getContext(), true, radius, backgroundColorHint));
|
||||
}
|
||||
|
||||
private GenericRequestBuilder buildPlaceholderGlideRequest(Slide slide) {
|
||||
return Glide.with(getContext()).load(slide.getPlaceholderRes(getContext().getTheme()))
|
||||
.asBitmap()
|
||||
@@ -253,9 +221,13 @@ public class ThumbnailView extends FrameLayout {
|
||||
|
||||
private class SlideDeckListener implements FutureTaskListener<SlideDeck> {
|
||||
private final MasterSecret masterSecret;
|
||||
private final boolean showControls;
|
||||
private final boolean showRemove;
|
||||
|
||||
public SlideDeckListener(MasterSecret masterSecret) {
|
||||
public SlideDeckListener(@NonNull MasterSecret masterSecret, boolean showControls, boolean showRemove) {
|
||||
this.masterSecret = masterSecret;
|
||||
this.showControls = showControls;
|
||||
this.showRemove = showRemove;
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -268,7 +240,7 @@ public class ThumbnailView extends FrameLayout {
|
||||
Util.runOnMain(new Runnable() {
|
||||
@Override
|
||||
public void run() {
|
||||
setImageResource(slide, masterSecret);
|
||||
setImageResource(masterSecret, slide, showControls, showRemove);
|
||||
}
|
||||
});
|
||||
} else {
|
||||
@@ -302,10 +274,10 @@ public class ThumbnailView extends FrameLayout {
|
||||
private class ThumbnailClickDispatcher implements View.OnClickListener {
|
||||
@Override
|
||||
public void onClick(View view) {
|
||||
if (thumbnailClickListener != null &&
|
||||
slide != null &&
|
||||
slide.getPart().getDataUri() != null &&
|
||||
slide.getTransferProgress() == PartDatabase.TRANSFER_PROGRESS_DONE)
|
||||
if (thumbnailClickListener != null &&
|
||||
slide != null &&
|
||||
slide.asAttachment().getDataUri() != null &&
|
||||
slide.getTransferState() == AttachmentDatabase.TRANSFER_PROGRESS_DONE)
|
||||
{
|
||||
thumbnailClickListener.onClick(view, slide);
|
||||
} else if (parentClickListener != null) {
|
||||
@@ -323,11 +295,12 @@ public class ThumbnailView extends FrameLayout {
|
||||
}
|
||||
}
|
||||
|
||||
private class PduThumbnailSetListener implements RequestListener<Object, GlideDrawable> {
|
||||
private PduPart part;
|
||||
private class ThumbnailSetListener implements RequestListener<Object, GlideDrawable> {
|
||||
|
||||
public PduThumbnailSetListener(@NonNull PduPart part) {
|
||||
this.part = part;
|
||||
private final Attachment attachment;
|
||||
|
||||
public ThumbnailSetListener(@NonNull Attachment attachment) {
|
||||
this.attachment = attachment;
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -339,7 +312,7 @@ public class ThumbnailView extends FrameLayout {
|
||||
public boolean onResourceReady(GlideDrawable resource, Object model, Target<GlideDrawable> target, boolean isFromMemoryCache, boolean isFirstResource) {
|
||||
if (resource instanceof GlideBitmapDrawable) {
|
||||
Log.w(TAG, "onResourceReady() for a Bitmap. Saving.");
|
||||
part.setThumbnail(((GlideBitmapDrawable)resource).getBitmap());
|
||||
attachment.setThumbnail(((GlideBitmapDrawable) resource).getBitmap());
|
||||
}
|
||||
LayoutParams layoutParams = (LayoutParams) getRemoveButton().getLayoutParams();
|
||||
if (resource.getIntrinsicWidth() < getWidth()) {
|
||||
|
||||
@@ -21,7 +21,7 @@ import com.nineoldandroids.animation.ValueAnimator.AnimatorUpdateListener;
|
||||
import com.pnikosis.materialishprogress.ProgressWheel;
|
||||
|
||||
import org.thoughtcrime.securesms.R;
|
||||
import org.thoughtcrime.securesms.database.PartDatabase;
|
||||
import org.thoughtcrime.securesms.database.AttachmentDatabase;
|
||||
import org.thoughtcrime.securesms.jobs.PartProgressEvent;
|
||||
import org.thoughtcrime.securesms.mms.Slide;
|
||||
import org.thoughtcrime.securesms.util.Util;
|
||||
@@ -92,7 +92,7 @@ public class TransferControlView extends FrameLayout {
|
||||
|
||||
public void setSlide(final @NonNull Slide slide) {
|
||||
this.slide = slide;
|
||||
if (slide.getTransferProgress() == PartDatabase.TRANSFER_PROGRESS_STARTED) {
|
||||
if (slide.getTransferState() == AttachmentDatabase.TRANSFER_PROGRESS_STARTED) {
|
||||
showProgressSpinner();
|
||||
} else if (slide.isPendingDownload()) {
|
||||
downloadDetails.setText(slide.getContentDescription());
|
||||
@@ -164,7 +164,7 @@ public class TransferControlView extends FrameLayout {
|
||||
|
||||
@SuppressWarnings("unused")
|
||||
public void onEventAsync(final PartProgressEvent event) {
|
||||
if (this.slide != null && event.partId.equals(this.slide.getPart().getPartId())) {
|
||||
if (this.slide != null && event.attachment.equals(this.slide.asAttachment())) {
|
||||
Util.runOnMain(new Runnable() {
|
||||
@Override
|
||||
public void run() {
|
||||
|
||||
Reference in New Issue
Block a user