diff --git a/res/layout/media_preview_activity.xml b/res/layout/media_preview_activity.xml index a84a746818..e5fa237f1c 100644 --- a/res/layout/media_preview_activity.xml +++ b/res/layout/media_preview_activity.xml @@ -5,20 +5,10 @@ android:layout_height="match_parent" android:background="@color/gray95"> - - - + android:contentDescription="@string/media_preview_activity__image_content_description" /> diff --git a/src/org/thoughtcrime/securesms/MediaPreviewActivity.java b/src/org/thoughtcrime/securesms/MediaPreviewActivity.java index 09198f5771..7a12cb3aae 100644 --- a/src/org/thoughtcrime/securesms/MediaPreviewActivity.java +++ b/src/org/thoughtcrime/securesms/MediaPreviewActivity.java @@ -21,8 +21,6 @@ import android.content.DialogInterface; import android.content.Intent; import android.graphics.Bitmap; import android.net.Uri; -import android.opengl.GLES20; -import android.os.AsyncTask; import android.os.Build.VERSION; import android.os.Build.VERSION_CODES; import android.os.Bundle; @@ -33,25 +31,18 @@ import android.view.MenuInflater; import android.view.MenuItem; import android.view.View; import android.view.WindowManager; -import android.widget.ImageView; -import android.widget.TextView; import android.widget.Toast; +import org.thoughtcrime.securesms.components.ZoomingImageView; import org.thoughtcrime.securesms.crypto.MasterSecret; import org.thoughtcrime.securesms.recipients.Recipient; import org.thoughtcrime.securesms.recipients.Recipient.RecipientModifiedListener; import org.thoughtcrime.securesms.recipients.RecipientFactory; -import org.thoughtcrime.securesms.util.BitmapDecodingException; -import org.thoughtcrime.securesms.util.BitmapUtil; import org.thoughtcrime.securesms.util.DateUtils; import org.thoughtcrime.securesms.util.DynamicLanguage; import org.thoughtcrime.securesms.util.SaveAttachmentTask; import org.thoughtcrime.securesms.util.SaveAttachmentTask.Attachment; -import java.io.IOException; - -import uk.co.senab.photoview.PhotoViewAttacher; - /** * Activity for displaying media attachments in-app */ @@ -64,12 +55,9 @@ public class MediaPreviewActivity extends PassphraseRequiredActionBarActivity im private final DynamicLanguage dynamicLanguage = new DynamicLanguage(); private MasterSecret masterSecret; - private boolean paused; - private TextView errorText; private Bitmap bitmap; - private ImageView image; - private PhotoViewAttacher imageAttacher; + private ZoomingImageView image; private Uri mediaUri; private String mediaType; private Recipient recipient; @@ -114,14 +102,14 @@ public class MediaPreviewActivity extends PassphraseRequiredActionBarActivity im } else { relativeTimeSpan = null; } - getSupportActionBar().setTitle(recipient == null ? getString(R.string.MediaPreviewActivity_you) : recipient.toShortString()); + getSupportActionBar().setTitle(recipient == null ? getString(R.string.MediaPreviewActivity_you) + : recipient.toShortString()); getSupportActionBar().setSubtitle(relativeTimeSpan); } @Override public void onResume() { super.onResume(); - paused = false; dynamicLanguage.onResume(this); if (recipient != null) recipient.addListener(this); initializeMedia(); @@ -130,7 +118,6 @@ public class MediaPreviewActivity extends PassphraseRequiredActionBarActivity im @Override public void onPause() { super.onPause(); - paused = true; if (recipient != null) recipient.removeListener(this); cleanupMedia(); } @@ -145,9 +132,7 @@ public class MediaPreviewActivity extends PassphraseRequiredActionBarActivity im } private void initializeViews() { - errorText = (TextView) findViewById(R.id.error); - image = (ImageView) findViewById(R.id.image); - imageAttacher = new PhotoViewAttacher(image); + image = (ZoomingImageView)findViewById(R.id.image); } private void initializeResources() { @@ -175,7 +160,7 @@ public class MediaPreviewActivity extends PassphraseRequiredActionBarActivity im Log.w(TAG, "Loading Part URI: " + mediaUri); if (mediaType != null && mediaType.startsWith("image/")) { - displayImage(); + image.setImageUri(masterSecret, mediaUri); } } @@ -187,42 +172,6 @@ public class MediaPreviewActivity extends PassphraseRequiredActionBarActivity im } } - private void displayImage() { - new AsyncTask() { - @Override - protected Bitmap doInBackground(Void... params) { - try { - int[] maxTextureSizeParams = new int[1]; - GLES20.glGetIntegerv(GLES20.GL_MAX_TEXTURE_SIZE, maxTextureSizeParams, 0); - int maxTextureSize = Math.max(maxTextureSizeParams[0], 2048); - Log.w(TAG, "reported GL_MAX_TEXTURE_SIZE: " + maxTextureSize); - return BitmapUtil.createScaledBitmap(MediaPreviewActivity.this, masterSecret, mediaUri, - maxTextureSize, maxTextureSize); - } catch (IOException | BitmapDecodingException e) { - return null; - } - } - - @Override - protected void onPostExecute(Bitmap bitmap) { - if (paused) { - if (bitmap != null) bitmap.recycle(); - return; - } - - if (bitmap == null) { - errorText.setText(R.string.MediaPreviewActivity_cant_display); - errorText.setVisibility(View.VISIBLE); - } else { - MediaPreviewActivity.this.bitmap = bitmap; - image.setImageBitmap(bitmap); - image.setVisibility(View.VISIBLE); - imageAttacher.update(); - } - } - }.execute(); - } - private void saveToDisk() { SaveAttachmentTask.showWarningDialog(this, new DialogInterface.OnClickListener() { @Override diff --git a/src/org/thoughtcrime/securesms/components/ZoomingImageView.java b/src/org/thoughtcrime/securesms/components/ZoomingImageView.java new file mode 100644 index 0000000000..bc175ce329 --- /dev/null +++ b/src/org/thoughtcrime/securesms/components/ZoomingImageView.java @@ -0,0 +1,45 @@ +package org.thoughtcrime.securesms.components; + +import android.content.Context; +import android.graphics.Bitmap; +import android.net.Uri; +import android.util.AttributeSet; +import android.widget.ImageView; + +import com.bumptech.glide.Glide; +import com.bumptech.glide.request.target.BitmapImageViewTarget; + +import org.thoughtcrime.securesms.crypto.MasterSecret; +import org.thoughtcrime.securesms.mms.DecryptableStreamUriLoader.DecryptableUri; + +import uk.co.senab.photoview.PhotoViewAttacher; + +public class ZoomingImageView extends ImageView { + private PhotoViewAttacher attacher = new PhotoViewAttacher(this); + + public ZoomingImageView(Context context) { + super(context); + } + + public ZoomingImageView(Context context, AttributeSet attrs) { + super(context, attrs); + } + + public ZoomingImageView(Context context, AttributeSet attrs, int defStyleAttr) { + super(context, attrs, defStyleAttr); + } + + public void setImageUri(MasterSecret masterSecret, Uri uri) { + Glide.with(getContext()) + .load(new DecryptableUri(masterSecret, uri)) + .asBitmap() + .dontTransform() + .dontAnimate() + .into(new BitmapImageViewTarget(this) { + @Override protected void setResource(Bitmap resource) { + super.setResource(resource); + attacher.update(); + } + }); + } +}