Skip to content

Commit e471226

Browse files
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
1 parent 78d519f commit e471226

File tree

5 files changed

+54
-29
lines changed

5 files changed

+54
-29
lines changed

app/build.gradle

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,6 @@ dependencies {
3737

3838
// UI
3939
implementation 'fr.avianey.com.viewpagerindicator:library:2.4.1.1@aar'
40-
implementation 'com.github.chrisbanes:PhotoView:2.0.0'
4140
implementation 'com.github.pedrovgs:renderers:3.3.3'
4241
implementation 'com.mapbox.mapboxsdk:mapbox-android-sdk:8.6.2'
4342
implementation 'com.mapbox.mapboxsdk:mapbox-android-plugin-localization-v8:0.11.0'

app/src/main/java/fr/free/nrw/commons/media/ZoomableActivity.java

Lines changed: 0 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -23,18 +23,11 @@
2323
import com.facebook.drawee.generic.GenericDraweeHierarchy;
2424
import com.facebook.drawee.generic.GenericDraweeHierarchyBuilder;
2525
import com.facebook.drawee.interfaces.DraweeController;
26-
import android.view.LayoutInflater;
2726
import android.view.View;
28-
import android.view.ViewGroup;
2927
import android.widget.ProgressBar;
3028

31-
import com.facebook.drawee.view.SimpleDraweeView;
3229
import com.facebook.imagepipeline.image.ImageInfo;
33-
import com.github.chrisbanes.photoview.PhotoView;
3430

35-
import java.io.InputStream;
36-
import java.net.HttpURLConnection;
37-
import java.net.URL;
3831

3932
public class ZoomableActivity extends AppCompatActivity {
4033
private Uri imageUri;

app/src/main/java/fr/free/nrw/commons/media/zoomControllers/zoomable/ZoomableDraweeView.java

Lines changed: 18 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,7 @@ public class ZoomableDraweeView extends DraweeView<GenericDraweeHierarchy>
4747

4848
private boolean mIsDialtoneEnabled = false;
4949
private boolean mZoomingEnabled = true;
50+
private TransformationListener transformationListener;
5051

5152
private final ControllerListener mControllerListener =
5253
new BaseControllerListener<Object>() {
@@ -73,9 +74,18 @@ public void onTransformChanged(Matrix transform) {
7374
}
7475

7576
@Override
76-
public void onTransformEnd(Matrix transform) {}
77+
public void onTransformEnd(Matrix transform) {
78+
if (null != transformationListener) {
79+
transformationListener.onTransformationEnd();
80+
}
81+
}
7782
};
7883

84+
public void setTransformationListener(
85+
TransformationListener transformationListener) {
86+
this.transformationListener = transformationListener;
87+
}
88+
7989
private final GestureListenerWrapper mTapListenerWrapper = new GestureListenerWrapper();
8090

8191
public ZoomableDraweeView(Context context, GenericDraweeHierarchy hierarchy) {
@@ -397,4 +407,11 @@ protected Class<?> getLogTag() {
397407
protected ZoomableController createZoomableController() {
398408
return AnimatedZoomableController.newInstance();
399409
}
410+
411+
/**
412+
* Use this, If someone is willing to listen to scale change
413+
*/
414+
public interface TransformationListener{
415+
void onTransformationEnd();
416+
}
400417
}

app/src/main/java/fr/free/nrw/commons/upload/mediaDetails/UploadMediaDetailFragment.java

Lines changed: 33 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44

55
import android.annotation.SuppressLint;
66
import android.content.Context;
7+
import android.net.Uri;
78
import android.os.Bundle;
89
import android.text.TextUtils;
910
import android.util.DisplayMetrics;
@@ -23,13 +24,19 @@
2324
import butterknife.BindView;
2425
import butterknife.ButterKnife;
2526
import butterknife.OnClick;
26-
import com.github.chrisbanes.photoview.PhotoView;
27+
import com.facebook.drawee.backends.pipeline.Fresco;
28+
import com.facebook.drawee.drawable.ScalingUtils.ScaleType;
29+
import com.facebook.drawee.generic.GenericDraweeHierarchy;
30+
import com.facebook.drawee.generic.GenericDraweeHierarchyBuilder;
31+
import com.facebook.drawee.interfaces.DraweeController;
2732
import com.jakewharton.rxbinding2.widget.RxTextView;
2833
import fr.free.nrw.commons.R;
2934
import fr.free.nrw.commons.Utils;
3035
import fr.free.nrw.commons.filepicker.UploadableFile;
3136
import fr.free.nrw.commons.kvstore.JsonKvStore;
3237
import fr.free.nrw.commons.location.LatLng;
38+
import fr.free.nrw.commons.media.zoomControllers.zoomable.DoubleTapGestureListener;
39+
import fr.free.nrw.commons.media.zoomControllers.zoomable.ZoomableDraweeView;
3340
import fr.free.nrw.commons.nearby.Place;
3441
import fr.free.nrw.commons.settings.Prefs;
3542
import fr.free.nrw.commons.upload.Description;
@@ -44,6 +51,7 @@
4451
import fr.free.nrw.commons.utils.ImageUtils;
4552
import fr.free.nrw.commons.utils.ViewUtil;
4653
import io.reactivex.disposables.Disposable;
54+
import java.io.File;
4755
import java.util.ArrayList;
4856
import java.util.Arrays;
4957
import java.util.List;
@@ -69,7 +77,7 @@ public class UploadMediaDetailFragment extends UploadBaseFragment implements
6977
@BindView(R.id.rv_descriptions)
7078
RecyclerView rvDescriptions;
7179
@BindView(R.id.backgroundImage)
72-
PhotoView photoViewBackgroundImage;
80+
ZoomableDraweeView photoViewBackgroundImage;
7381
@BindView(R.id.btn_next)
7482
AppCompatButton btnNext;
7583
@BindView(R.id.btn_previous)
@@ -164,11 +172,26 @@ private void init() {
164172
btnCopyPreviousTitleDesc.setVisibility(View.VISIBLE);
165173
}
166174

167-
attachImageViewScaleChangeListener();
168-
169175
addEtTitleTouchListener();
170176
}
171177

178+
private void showImageWithLocalUri(Uri imageUri) {
179+
if (imageUri != null) {
180+
GenericDraweeHierarchy hierarchy = GenericDraweeHierarchyBuilder.newInstance(getResources())
181+
.setActualImageScaleType(ScaleType.FIT_XY)
182+
.build();
183+
photoViewBackgroundImage.setHierarchy(hierarchy);
184+
photoViewBackgroundImage
185+
.setTapListener(new DoubleTapGestureListener(photoViewBackgroundImage));
186+
DraweeController controller = Fresco.newDraweeControllerBuilder()
187+
.setUri(Uri.fromFile(new File(imageUri.getPath())))
188+
.build();
189+
photoViewBackgroundImage.setTransformationListener(
190+
() -> expandCollapseMediaDetail(false));
191+
photoViewBackgroundImage.setController(controller);
192+
}
193+
}
194+
172195
/**
173196
* Handles the drawable click listener for Edit Text
174197
*/
@@ -200,17 +223,6 @@ private float convertDpToPixel(float dp, Context context) {
200223
return dp * ((float) context.getResources().getDisplayMetrics().densityDpi / DisplayMetrics.DENSITY_DEFAULT);
201224
}
202225

203-
/**
204-
* Attaches the scale change listener to the image view
205-
*/
206-
private void attachImageViewScaleChangeListener() {
207-
photoViewBackgroundImage.setOnScaleChangeListener(
208-
(scaleFactor, focusX, focusY) -> {
209-
//Whenever the uses plays with the image, lets collapse the media detail container
210-
expandCollapseLlMediaDetail(false);
211-
});
212-
}
213-
214226
/**
215227
* attach the presenter with the view
216228
*/
@@ -286,7 +298,7 @@ public void onImageProcessed(UploadItem uploadItem, Place place) {
286298
}
287299

288300
descriptions = uploadItem.getDescriptions();
289-
photoViewBackgroundImage.setImageURI(uploadItem.getMediaUri());
301+
showImageWithLocalUri(uploadItem.getMediaUri());
290302
setDescriptionsInAdapter(descriptions);
291303
}
292304

@@ -395,14 +407,17 @@ public void onDestroyView() {
395407

396408
@OnClick(R.id.rl_container_title)
397409
public void onRlContainerTitleClicked() {
398-
expandCollapseLlMediaDetail(!isExpanded);
410+
expandCollapseMediaDetail(!isExpanded);
399411
}
400412

401413
/**
402414
* show hide media detail based on
403415
* @param shouldExpand
404416
*/
405-
private void expandCollapseLlMediaDetail(boolean shouldExpand){
417+
private void expandCollapseMediaDetail(boolean shouldExpand){
418+
if (isExpanded == shouldExpand) {
419+
return;
420+
}
406421
llContainerMediaDetail.setVisibility(shouldExpand ? View.VISIBLE : View.GONE);
407422
isExpanded = !isExpanded;
408423
ibExpandCollapse.setRotation(ibExpandCollapse.getRotation() + 180);

app/src/main/res/layout/fragment_upload_media_detail_fragment.xml

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,11 +6,12 @@
66
android:layout_width="match_parent"
77
android:layout_height="match_parent">
88

9-
<com.github.chrisbanes.photoview.PhotoView
9+
<fr.free.nrw.commons.media.zoomControllers.zoomable.ZoomableDraweeView
1010
android:id="@+id/backgroundImage"
1111
android:layout_width="match_parent"
1212
android:layout_height="match_parent"
13-
app:actualImageScaleType="fitXY" />
13+
android:scaleType="fitXY"
14+
/>
1415

1516
<androidx.cardview.widget.CardView
1617
android:layout_width="match_parent"

0 commit comments

Comments
 (0)