diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml
index 17f6770d2..45a647227 100644
--- a/app/src/main/AndroidManifest.xml
+++ b/app/src/main/AndroidManifest.xml
@@ -15,6 +15,7 @@
+
diff --git a/app/src/main/java/fr/free/nrw/commons/media/MediaDetailPagerFragment.java b/app/src/main/java/fr/free/nrw/commons/media/MediaDetailPagerFragment.java
index 62d1261cf..2c58e8dbb 100644
--- a/app/src/main/java/fr/free/nrw/commons/media/MediaDetailPagerFragment.java
+++ b/app/src/main/java/fr/free/nrw/commons/media/MediaDetailPagerFragment.java
@@ -2,9 +2,11 @@ package fr.free.nrw.commons.media;
import android.annotation.SuppressLint;
import android.app.DownloadManager;
+import android.app.WallpaperManager;
import android.content.Intent;
import android.content.SharedPreferences;
import android.database.DataSetObserver;
+import android.graphics.Bitmap;
import android.net.Uri;
import android.os.Build;
import android.os.Bundle;
@@ -26,6 +28,8 @@ import android.view.View;
import android.view.ViewGroup;
import android.widget.Toast;
+import java.io.IOException;
+
import butterknife.BindView;
import butterknife.ButterKnife;
import javax.inject.Inject;
@@ -38,12 +42,15 @@ import fr.free.nrw.commons.contributions.Contribution;
import fr.free.nrw.commons.contributions.ContributionsActivity;
import fr.free.nrw.commons.di.CommonsDaggerSupportFragment;
import fr.free.nrw.commons.mwapi.MediaWikiApi;
+import fr.free.nrw.commons.utils.ImageUtils;
+import timber.log.Timber;
import static android.Manifest.permission.READ_EXTERNAL_STORAGE;
import static android.content.Context.DOWNLOAD_SERVICE;
import static android.content.Intent.ACTION_VIEW;
import static android.content.pm.PackageManager.PERMISSION_GRANTED;
import static android.widget.Toast.LENGTH_SHORT;
+import static com.mapbox.mapboxsdk.Mapbox.getApplicationContext;
public class MediaDetailPagerFragment extends CommonsDaggerSupportFragment implements ViewPager.OnPageChangeListener {
@@ -140,6 +147,10 @@ public class MediaDetailPagerFragment extends CommonsDaggerSupportFragment imple
// Download
downloadMedia(m);
return true;
+ case R.id.menu_set_as_wallpaper:
+ // Set wallpaper
+ setWallpaper(m);
+ return true;
case R.id.menu_retry_current_image:
// Retry
((ContributionsActivity) getActivity()).retryUpload(pager.getCurrentItem());
@@ -155,6 +166,19 @@ public class MediaDetailPagerFragment extends CommonsDaggerSupportFragment imple
}
}
+ /**
+ * Set the media as the device's wallpaper if the imageUrl is not null
+ * Fails silently if setting the wallpaper fails
+ * @param media
+ */
+ private void setWallpaper(Media media) {
+ if(media.getImageUrl() == null || media.getImageUrl().isEmpty()) {
+ Timber.d("Media URL not present");
+ return;
+ }
+ ImageUtils.setWallpaperFromImageUrl(getActivity(), Uri.parse(media.getImageUrl()));
+ }
+
/**
* Start the media file downloading to the local SD card/storage.
* The file can then be opened in Gallery or other apps.
diff --git a/app/src/main/java/fr/free/nrw/commons/utils/ImageUtils.java b/app/src/main/java/fr/free/nrw/commons/utils/ImageUtils.java
index 4f6a6d456..a091d7758 100644
--- a/app/src/main/java/fr/free/nrw/commons/utils/ImageUtils.java
+++ b/app/src/main/java/fr/free/nrw/commons/utils/ImageUtils.java
@@ -1,12 +1,34 @@
package fr.free.nrw.commons.utils;
+import android.app.WallpaperManager;
+import android.content.Context;
import android.graphics.Bitmap;
+import android.graphics.BitmapFactory;
import android.graphics.BitmapRegionDecoder;
import android.graphics.Color;
import android.graphics.Rect;
+import android.net.Uri;
+import android.os.Build;
+import android.support.annotation.Nullable;
+import android.support.annotation.RequiresApi;
+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 java.io.IOException;
+
+import fr.free.nrw.commons.R;
import timber.log.Timber;
+import static com.mapbox.mapboxsdk.Mapbox.getApplicationContext;
+
/**
* Created by bluesir9 on 3/10/17.
*/
@@ -132,4 +154,52 @@ public class ImageUtils {
return isImageDark;
}
+
+ /**
+ * Downloads the image from the URL and sets it as the phone's wallpaper
+ * Fails silently if download or setting wallpaper fails.
+ * @param context
+ * @param imageUrl
+ */
+ public static void setWallpaperFromImageUrl(Context context, Uri imageUrl) {
+ Timber.d("Trying to set wallpaper from url %s", imageUrl.toString());
+ ImageRequest imageRequest = ImageRequestBuilder
+ .newBuilderWithSource(imageUrl)
+ .setAutoRotateEnabled(true)
+ .build();
+
+ ImagePipeline imagePipeline = Fresco.getImagePipeline();
+ final DataSource>
+ dataSource = imagePipeline.fetchDecodedImage(imageRequest, context);
+
+ dataSource.subscribe(new BaseBitmapDataSubscriber() {
+
+ @Override
+ public void onNewResultImpl(@Nullable Bitmap bitmap) {
+ if (dataSource.isFinished() && bitmap != null){
+ Timber.d("Bitmap loaded from url %s", imageUrl.toString());
+ setWallpaper(context, Bitmap.createBitmap(bitmap));
+ dataSource.close();
+ }
+ }
+
+ @Override
+ public void onFailureImpl(DataSource dataSource) {
+ Timber.d("Error getting bitmap from image url %s", imageUrl.toString());
+ if (dataSource != null) {
+ dataSource.close();
+ }
+ }
+ }, CallerThreadExecutor.getInstance());
+ }
+
+ private static void setWallpaper(Context context, Bitmap bitmap) {
+ WallpaperManager wallpaperManager = WallpaperManager.getInstance(context);
+ try {
+ wallpaperManager.setBitmap(bitmap);
+ ViewUtil.showLongToast(context, context.getString(R.string.wallpaper_set_successfully));
+ } catch (IOException e) {
+ Timber.e(e,"Error setting wallpaper");
+ }
+ }
}
diff --git a/app/src/main/res/menu/fragment_image_detail.xml b/app/src/main/res/menu/fragment_image_detail.xml
index e864dddb2..70a35951a 100644
--- a/app/src/main/res/menu/fragment_image_detail.xml
+++ b/app/src/main/res/menu/fragment_image_detail.xml
@@ -15,6 +15,10 @@
android:id="@+id/menu_download_current_image"
android:title="@string/menu_download"
app:showAsAction="never" />
+
- Coordinates were not specified during image selection
Error fetching nearby places.
+ Set wallpaper
+ Wallpaper set successfully!