Skip to content

Feature to zoom images #2427

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Closed
wants to merge 11 commits into from
53 changes: 53 additions & 0 deletions app/src/main/java/fr/free/nrw/commons/FrescoImageLoader.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,53 @@
package fr.free.nrw.commons;

import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.Canvas;
import android.graphics.Paint;
import android.net.Uri;

import com.facebook.common.executors.CallerThreadExecutor;
import com.facebook.common.references.CloseableReference;
import com.facebook.datasource.DataSource;
import com.facebook.drawee.backends.pipeline.Fresco;
import com.facebook.imagepipeline.core.ImagePipeline;
import com.facebook.imagepipeline.datasource.BaseBitmapDataSubscriber;
import com.facebook.imagepipeline.image.CloseableImage;
import com.facebook.imagepipeline.request.ImageRequest;
import com.facebook.imagepipeline.request.ImageRequestBuilder;

import androidx.annotation.Nullable;

public class FrescoImageLoader {

/**
* Uses Fresco to load an image from Url
* @param imageUrl
* @param context
*/
public static Bitmap loadImageFromUrl(String imageUrl,
Context context) {
ImageRequest request = ImageRequestBuilder.newBuilderWithSource(Uri.parse(imageUrl)).build();
ImagePipeline imagePipeline = Fresco.getImagePipeline();
DataSource<CloseableReference<CloseableImage>> dataSource
= imagePipeline.fetchDecodedImage(request, context);
final Bitmap[] bitmap = {null};
dataSource.subscribe(new BaseBitmapDataSubscriber() {
@Override
protected void onNewResultImpl(@Nullable Bitmap tempBitmap) {
if (tempBitmap != null) {
bitmap[0] = Bitmap.createBitmap(tempBitmap.getWidth(), tempBitmap.getHeight(), Bitmap.Config.ARGB_8888);
Canvas canvas = new Canvas(bitmap[0]);
canvas.drawBitmap(tempBitmap, 0f, 0f, new Paint());
}
}

@Override
protected void onFailureImpl(DataSource<CloseableReference<CloseableImage>> dataSource) {
// Ignore failure for now.
}
}, CallerThreadExecutor.getInstance());

return bitmap[0];
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,9 @@
import android.app.AlertDialog;
import android.content.Intent;
import android.database.DataSetObserver;
import android.graphics.Bitmap;
import android.graphics.drawable.BitmapDrawable;
import android.graphics.drawable.Drawable;
import android.net.Uri;
import android.os.AsyncTask;
import android.os.Bundle;
Expand All @@ -17,12 +20,15 @@
import android.view.ViewTreeObserver;
import android.widget.ArrayAdapter;
import android.widget.Button;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.ScrollView;
import android.widget.Spinner;
import android.widget.TextView;
import android.widget.Toast;

import com.github.chrisbanes.photoview.PhotoView;

import java.io.IOException;
import java.util.ArrayList;
import java.util.Date;
Expand All @@ -34,6 +40,7 @@
import butterknife.BindView;
import butterknife.ButterKnife;
import butterknife.OnClick;
import fr.free.nrw.commons.FrescoImageLoader;
import fr.free.nrw.commons.License;
import fr.free.nrw.commons.LicenseList;
import fr.free.nrw.commons.Media;
Expand Down Expand Up @@ -124,6 +131,8 @@ public static MediaDetailFragment forMedia(int index, boolean editable, boolean
Button delete;
@BindView(R.id.mediaDetailScrollView)
ScrollView scrollView;
@BindView(R.id.imagePhotoView)
PhotoView photoView;

private ArrayList<String> categoryNames;
private boolean categoriesLoaded = false;
Expand Down Expand Up @@ -265,6 +274,14 @@ public void onChanged() {
private void displayMediaDetails() {
//Always load image from Internet to allow viewing the desc, license, and cats
image.setMedia(media);
Bitmap bitmap = FrescoImageLoader.loadImageFromUrl(media.getImageUrl(), getContext());
Drawable drawable = new BitmapDrawable(getResources(), bitmap);

if(drawable != null) {
photoView.setImageDrawable(drawable);
photoView.setScaleType(ImageView.ScaleType.CENTER_CROP);
}


// FIXME: For transparent images
// FIXME: keep the spinner going while we load data
Expand Down Expand Up @@ -333,6 +350,10 @@ public void onDestroyView() {
detailProvider.unregisterDataSetObserver(dataObserver);
dataObserver = null;
}

if(photoView.getVisibility() == View.VISIBLE) {
photoView.setVisibility(GONE);
}
super.onDestroyView();
}

Expand Down Expand Up @@ -362,6 +383,12 @@ private void setTextFields(Media media) {
checkDeletion(media);
}

@OnClick(R.id.mediaDetailLinearLayout)
public void onMediaDetailImageClicked() {
photoView.setVisibility(VISIBLE);
photoView.setZoomable(true);
}

@OnClick(R.id.mediaDetailLicense)
public void onMediaDetailLicenceClicked(){
if (!TextUtils.isEmpty(licenseLink(media))) {
Expand Down Expand Up @@ -583,4 +610,4 @@ private void openMap(LatLng coordinates) {
startActivity(mapIntent);
}
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -10,18 +10,9 @@
import androidx.annotation.Nullable;
import android.widget.RemoteViews;

import com.facebook.common.executors.CallerThreadExecutor;
import com.facebook.common.references.CloseableReference;
import com.facebook.datasource.DataSource;
import com.facebook.drawee.backends.pipeline.Fresco;
import com.facebook.imagepipeline.core.ImagePipeline;
import com.facebook.imagepipeline.datasource.BaseBitmapDataSubscriber;
import com.facebook.imagepipeline.image.CloseableImage;
import com.facebook.imagepipeline.request.ImageRequest;
import com.facebook.imagepipeline.request.ImageRequestBuilder;

import javax.inject.Inject;

import fr.free.nrw.commons.FrescoImageLoader;
import fr.free.nrw.commons.R;
import fr.free.nrw.commons.di.ApplicationlessInjection;
import fr.free.nrw.commons.mwapi.OkHttpJsonApiClient;
Expand Down Expand Up @@ -61,50 +52,15 @@ private void loadPictureOfTheDay(Context context,
.subscribe(
response -> {
if (response != null) {
loadImageFromUrl(response.getImageUrl(), context, views, appWidgetManager, appWidgetId);
Bitmap bitmap = FrescoImageLoader.loadImageFromUrl(response.getImageUrl(), context);
views.setImageViewBitmap(R.id.appwidget_image, bitmap);
appWidgetManager.updateAppWidget(appWidgetId, views);
}
},
t -> Timber.e(t, "Fetching picture of the day failed")
));
}

/**
* Uses Fresco to load an image from Url
* @param imageUrl
* @param context
* @param views
* @param appWidgetManager
* @param appWidgetId
*/
private void loadImageFromUrl(String imageUrl,
Context context,
RemoteViews views,
AppWidgetManager appWidgetManager,
int appWidgetId) {
ImageRequest request = ImageRequestBuilder.newBuilderWithSource(Uri.parse(imageUrl)).build();
ImagePipeline imagePipeline = Fresco.getImagePipeline();
DataSource<CloseableReference<CloseableImage>> dataSource
= imagePipeline.fetchDecodedImage(request, context);
dataSource.subscribe(new BaseBitmapDataSubscriber() {
@Override
protected void onNewResultImpl(@Nullable Bitmap tempBitmap) {
Bitmap bitmap = null;
if (tempBitmap != null) {
bitmap = Bitmap.createBitmap(tempBitmap.getWidth(), tempBitmap.getHeight(), Bitmap.Config.ARGB_8888);
Canvas canvas = new Canvas(bitmap);
canvas.drawBitmap(tempBitmap, 0f, 0f, new Paint());
}
views.setImageViewBitmap(R.id.appwidget_image, bitmap);
appWidgetManager.updateAppWidget(appWidgetId, views);
}

@Override
protected void onFailureImpl(DataSource<CloseableReference<CloseableImage>> dataSource) {
// Ignore failure for now.
}
}, CallerThreadExecutor.getInstance());
}

@Override
public void onUpdate(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds) {
ApplicationlessInjection
Expand Down
6 changes: 6 additions & 0 deletions app/src/main/res/layout/fragment_media_detail.xml
Original file line number Diff line number Diff line change
Expand Up @@ -34,6 +34,7 @@
android:fillViewport="true">

<LinearLayout
android:id="@+id/mediaDetailLinearLayout"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical">
Expand Down Expand Up @@ -330,4 +331,9 @@
</LinearLayout>
</ScrollView>

<com.github.chrisbanes.photoview.PhotoView
android:id="@+id/imagePhotoView"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:visibility="gone" />
</FrameLayout>