From e471226405d776991fa47e35352e5558145eae42 Mon Sep 17 00:00:00 2001 From: Ashish Kumar Date: Wed, 24 Jun 2020 14:27:25 +0530 Subject: [PATCH] DownSample Upload image to be shown in UploadMediaDetailFragment to handle OOM, Bitmap Too large exception (#3830) * Fixes #3829 * DownSample Upload image to be shown in UploadMediaDetailFragment to handle OOM, Bitmap Too large exception * removed unused imports, handled possible exceptions * Let Fresco handle the downsampling of image * invalidate in onTransformEnd * Expose an interface TransformationListener in ZoomableDraweeView to listen to transformation change end * removed photoView dependency * removed unused imports in ZoomableActivity * Bugfix, expand/collapse * changed functio name --- app/build.gradle | 1 - .../nrw/commons/media/ZoomableActivity.java | 7 --- .../zoomable/ZoomableDraweeView.java | 19 ++++++- .../UploadMediaDetailFragment.java | 51 ++++++++++++------- .../fragment_upload_media_detail_fragment.xml | 5 +- 5 files changed, 54 insertions(+), 29 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index 57240c522..3024a388d 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -37,7 +37,6 @@ dependencies { // UI implementation 'fr.avianey.com.viewpagerindicator:library:2.4.1.1@aar' - implementation 'com.github.chrisbanes:PhotoView:2.0.0' implementation 'com.github.pedrovgs:renderers:3.3.3' implementation 'com.mapbox.mapboxsdk:mapbox-android-sdk:8.6.2' implementation 'com.mapbox.mapboxsdk:mapbox-android-plugin-localization-v8:0.11.0' diff --git a/app/src/main/java/fr/free/nrw/commons/media/ZoomableActivity.java b/app/src/main/java/fr/free/nrw/commons/media/ZoomableActivity.java index 089d16a0a..63b582550 100644 --- a/app/src/main/java/fr/free/nrw/commons/media/ZoomableActivity.java +++ b/app/src/main/java/fr/free/nrw/commons/media/ZoomableActivity.java @@ -23,18 +23,11 @@ import com.facebook.drawee.drawable.ScalingUtils; import com.facebook.drawee.generic.GenericDraweeHierarchy; import com.facebook.drawee.generic.GenericDraweeHierarchyBuilder; import com.facebook.drawee.interfaces.DraweeController; -import android.view.LayoutInflater; import android.view.View; -import android.view.ViewGroup; import android.widget.ProgressBar; -import com.facebook.drawee.view.SimpleDraweeView; import com.facebook.imagepipeline.image.ImageInfo; -import com.github.chrisbanes.photoview.PhotoView; -import java.io.InputStream; -import java.net.HttpURLConnection; -import java.net.URL; public class ZoomableActivity extends AppCompatActivity { private Uri imageUri; diff --git a/app/src/main/java/fr/free/nrw/commons/media/zoomControllers/zoomable/ZoomableDraweeView.java b/app/src/main/java/fr/free/nrw/commons/media/zoomControllers/zoomable/ZoomableDraweeView.java index 3cb2b2f91..02d93622b 100644 --- a/app/src/main/java/fr/free/nrw/commons/media/zoomControllers/zoomable/ZoomableDraweeView.java +++ b/app/src/main/java/fr/free/nrw/commons/media/zoomControllers/zoomable/ZoomableDraweeView.java @@ -47,6 +47,7 @@ public class ZoomableDraweeView extends DraweeView private boolean mIsDialtoneEnabled = false; private boolean mZoomingEnabled = true; + private TransformationListener transformationListener; private final ControllerListener mControllerListener = new BaseControllerListener() { @@ -73,9 +74,18 @@ public class ZoomableDraweeView extends DraweeView } @Override - public void onTransformEnd(Matrix transform) {} + public void onTransformEnd(Matrix transform) { + if (null != transformationListener) { + transformationListener.onTransformationEnd(); + } + } }; + public void setTransformationListener( + TransformationListener transformationListener) { + this.transformationListener = transformationListener; + } + private final GestureListenerWrapper mTapListenerWrapper = new GestureListenerWrapper(); public ZoomableDraweeView(Context context, GenericDraweeHierarchy hierarchy) { @@ -397,4 +407,11 @@ public class ZoomableDraweeView extends DraweeView protected ZoomableController createZoomableController() { return AnimatedZoomableController.newInstance(); } + + /** + * Use this, If someone is willing to listen to scale change + */ + public interface TransformationListener{ + void onTransformationEnd(); + } } \ No newline at end of file diff --git a/app/src/main/java/fr/free/nrw/commons/upload/mediaDetails/UploadMediaDetailFragment.java b/app/src/main/java/fr/free/nrw/commons/upload/mediaDetails/UploadMediaDetailFragment.java index 04c4537de..d231525bc 100644 --- a/app/src/main/java/fr/free/nrw/commons/upload/mediaDetails/UploadMediaDetailFragment.java +++ b/app/src/main/java/fr/free/nrw/commons/upload/mediaDetails/UploadMediaDetailFragment.java @@ -4,6 +4,7 @@ import static fr.free.nrw.commons.utils.ImageUtils.getErrorMessageForResult; import android.annotation.SuppressLint; import android.content.Context; +import android.net.Uri; import android.os.Bundle; import android.text.TextUtils; import android.util.DisplayMetrics; @@ -23,13 +24,19 @@ import androidx.recyclerview.widget.RecyclerView; import butterknife.BindView; import butterknife.ButterKnife; import butterknife.OnClick; -import com.github.chrisbanes.photoview.PhotoView; +import com.facebook.drawee.backends.pipeline.Fresco; +import com.facebook.drawee.drawable.ScalingUtils.ScaleType; +import com.facebook.drawee.generic.GenericDraweeHierarchy; +import com.facebook.drawee.generic.GenericDraweeHierarchyBuilder; +import com.facebook.drawee.interfaces.DraweeController; import com.jakewharton.rxbinding2.widget.RxTextView; import fr.free.nrw.commons.R; import fr.free.nrw.commons.Utils; import fr.free.nrw.commons.filepicker.UploadableFile; import fr.free.nrw.commons.kvstore.JsonKvStore; import fr.free.nrw.commons.location.LatLng; +import fr.free.nrw.commons.media.zoomControllers.zoomable.DoubleTapGestureListener; +import fr.free.nrw.commons.media.zoomControllers.zoomable.ZoomableDraweeView; import fr.free.nrw.commons.nearby.Place; import fr.free.nrw.commons.settings.Prefs; import fr.free.nrw.commons.upload.Description; @@ -44,6 +51,7 @@ import fr.free.nrw.commons.utils.DialogUtil; import fr.free.nrw.commons.utils.ImageUtils; import fr.free.nrw.commons.utils.ViewUtil; import io.reactivex.disposables.Disposable; +import java.io.File; import java.util.ArrayList; import java.util.Arrays; import java.util.List; @@ -69,7 +77,7 @@ public class UploadMediaDetailFragment extends UploadBaseFragment implements @BindView(R.id.rv_descriptions) RecyclerView rvDescriptions; @BindView(R.id.backgroundImage) - PhotoView photoViewBackgroundImage; + ZoomableDraweeView photoViewBackgroundImage; @BindView(R.id.btn_next) AppCompatButton btnNext; @BindView(R.id.btn_previous) @@ -164,11 +172,26 @@ public class UploadMediaDetailFragment extends UploadBaseFragment implements btnCopyPreviousTitleDesc.setVisibility(View.VISIBLE); } - attachImageViewScaleChangeListener(); - addEtTitleTouchListener(); } + private void showImageWithLocalUri(Uri imageUri) { + if (imageUri != null) { + GenericDraweeHierarchy hierarchy = GenericDraweeHierarchyBuilder.newInstance(getResources()) + .setActualImageScaleType(ScaleType.FIT_XY) + .build(); + photoViewBackgroundImage.setHierarchy(hierarchy); + photoViewBackgroundImage + .setTapListener(new DoubleTapGestureListener(photoViewBackgroundImage)); + DraweeController controller = Fresco.newDraweeControllerBuilder() + .setUri(Uri.fromFile(new File(imageUri.getPath()))) + .build(); + photoViewBackgroundImage.setTransformationListener( + () -> expandCollapseMediaDetail(false)); + photoViewBackgroundImage.setController(controller); + } + } + /** * Handles the drawable click listener for Edit Text */ @@ -200,17 +223,6 @@ public class UploadMediaDetailFragment extends UploadBaseFragment implements return dp * ((float) context.getResources().getDisplayMetrics().densityDpi / DisplayMetrics.DENSITY_DEFAULT); } - /** - * Attaches the scale change listener to the image view - */ - private void attachImageViewScaleChangeListener() { - photoViewBackgroundImage.setOnScaleChangeListener( - (scaleFactor, focusX, focusY) -> { - //Whenever the uses plays with the image, lets collapse the media detail container - expandCollapseLlMediaDetail(false); - }); - } - /** * attach the presenter with the view */ @@ -286,7 +298,7 @@ public class UploadMediaDetailFragment extends UploadBaseFragment implements } descriptions = uploadItem.getDescriptions(); - photoViewBackgroundImage.setImageURI(uploadItem.getMediaUri()); + showImageWithLocalUri(uploadItem.getMediaUri()); setDescriptionsInAdapter(descriptions); } @@ -395,14 +407,17 @@ public class UploadMediaDetailFragment extends UploadBaseFragment implements @OnClick(R.id.rl_container_title) public void onRlContainerTitleClicked() { - expandCollapseLlMediaDetail(!isExpanded); + expandCollapseMediaDetail(!isExpanded); } /** * show hide media detail based on * @param shouldExpand */ - private void expandCollapseLlMediaDetail(boolean shouldExpand){ + private void expandCollapseMediaDetail(boolean shouldExpand){ + if (isExpanded == shouldExpand) { + return; + } llContainerMediaDetail.setVisibility(shouldExpand ? View.VISIBLE : View.GONE); isExpanded = !isExpanded; ibExpandCollapse.setRotation(ibExpandCollapse.getRotation() + 180); diff --git a/app/src/main/res/layout/fragment_upload_media_detail_fragment.xml b/app/src/main/res/layout/fragment_upload_media_detail_fragment.xml index d3495d760..8d0c83597 100644 --- a/app/src/main/res/layout/fragment_upload_media_detail_fragment.xml +++ b/app/src/main/res/layout/fragment_upload_media_detail_fragment.xml @@ -6,11 +6,12 @@ android:layout_width="match_parent" android:layout_height="match_parent"> - + android:scaleType="fitXY" + />