Mholloway has uploaded a new change for review.
https://gerrit.wikimedia.org/r/297999
Change subject: Featured image card: enable image downloading from footer button
......................................................................
Featured image card: enable image downloading from footer button
Bug: T130962
Change-Id: I320c8ea6414d4edd7efcf3924505a89b93abae86
---
M app/src/main/java/org/wikipedia/Constants.java
M app/src/main/java/org/wikipedia/MainActivity.java
M app/src/main/java/org/wikipedia/feed/FeedFragment.java
M app/src/main/java/org/wikipedia/feed/FeedViewCallback.java
M app/src/main/java/org/wikipedia/feed/image/FeaturedImageCard.java
M app/src/main/java/org/wikipedia/feed/image/FeaturedImageCardView.java
M app/src/main/java/org/wikipedia/page/gallery/GalleryItemFragment.java
M app/src/main/java/org/wikipedia/page/gallery/MediaDownloadReceiver.java
M app/src/main/java/org/wikipedia/util/PermissionUtil.java
9 files changed, 99 insertions(+), 29 deletions(-)
git pull ssh://gerrit.wikimedia.org:29418/apps/android/wikipedia
refs/changes/99/297999/1
diff --git a/app/src/main/java/org/wikipedia/Constants.java
b/app/src/main/java/org/wikipedia/Constants.java
index 0b87dee..c24e121 100644
--- a/app/src/main/java/org/wikipedia/Constants.java
+++ b/app/src/main/java/org/wikipedia/Constants.java
@@ -9,6 +9,8 @@
public static final String WIKIPEDIA_URL = "https://wikipedia.org/";
+ public static final int WRITE_EXTERNAL_STORAGE_PERMISSION_REQUEST = 44;
+
public static final int MAX_SUGGESTION_RESULTS = 3;
public static final int SUGGESTION_REQUEST_ITEMS = 5;
diff --git a/app/src/main/java/org/wikipedia/MainActivity.java
b/app/src/main/java/org/wikipedia/MainActivity.java
index c1c298f..9bc8aef 100644
--- a/app/src/main/java/org/wikipedia/MainActivity.java
+++ b/app/src/main/java/org/wikipedia/MainActivity.java
@@ -58,6 +58,7 @@
import org.wikipedia.events.ThemeChangeEvent;
import org.wikipedia.events.WikipediaZeroStateChangeEvent;
import org.wikipedia.feed.FeedFragment;
+import org.wikipedia.feed.image.FeaturedImage;
import org.wikipedia.feed.news.NewsItemCard;
import org.wikipedia.history.HistoryEntry;
import org.wikipedia.interlanguage.LangLinksActivity;
@@ -69,6 +70,7 @@
import org.wikipedia.page.PageLoadStrategy;
import org.wikipedia.page.PageTitle;
import org.wikipedia.page.gallery.GalleryActivity;
+import org.wikipedia.page.gallery.MediaDownloadReceiver;
import org.wikipedia.page.linkpreview.LinkPreviewDialog;
import org.wikipedia.page.snippet.CompatActionMode;
import org.wikipedia.random.RandomHandler;
@@ -85,6 +87,7 @@
import org.wikipedia.useroption.sync.UserOptionContentResolver;
import org.wikipedia.util.ApiUtil;
import org.wikipedia.util.FeedbackUtil;
+import org.wikipedia.util.PermissionUtil;
import org.wikipedia.util.ShareUtil;
import org.wikipedia.util.log.L;
import org.wikipedia.views.WikiDrawerLayout;
@@ -872,6 +875,16 @@
startActivity(NewsActivity.newIntent(app, card.item(), card.site()));
}
+ @Override
+ public void onFeedDownloadImage(final FeaturedImage image) {
+ PermissionUtil.handleImageSaveRequest(this, new
PermissionUtil.OnGrantedCallback() {
+ @Override
+ public void onPermissionGranted() {
+ new MediaDownloadReceiver(MainActivity.this).download(image);
+ }
+ });
+ }
+
private void loadMainPageIfNoTabs() {
loadMainPage(false, TabPosition.CURRENT_TAB, true);
}
diff --git a/app/src/main/java/org/wikipedia/feed/FeedFragment.java
b/app/src/main/java/org/wikipedia/feed/FeedFragment.java
index 684230e..8278f07 100644
--- a/app/src/main/java/org/wikipedia/feed/FeedFragment.java
+++ b/app/src/main/java/org/wikipedia/feed/FeedFragment.java
@@ -23,6 +23,7 @@
import org.wikipedia.activity.CallbackFragment;
import org.wikipedia.activity.FragmentUtil;
import org.wikipedia.analytics.FeedFunnel;
+import org.wikipedia.feed.image.FeaturedImage;
import org.wikipedia.feed.model.Card;
import org.wikipedia.feed.view.FeedRecyclerAdapter;
import org.wikipedia.feed.news.NewsItemCard;
@@ -61,6 +62,7 @@
void onFeedAddPageToList(HistoryEntry entry);
void onFeedSharePage(HistoryEntry entry);
void onFeedNewsItemSelected(NewsItemCard card);
+ void onFeedDownloadImage(FeaturedImage image);
}
public static FeedFragment newInstance() {
@@ -220,6 +222,13 @@
getCallback().onFeedNewsItemSelected(card);
}
}
+
+ @Override
+ public void onDownloadImage(@NonNull FeaturedImage image) {
+ if (getCallback() != null) {
+ getCallback().onFeedDownloadImage(image);
+ }
+ }
}
private class FeedHeaderOffsetChangedListener implements
AppBarLayout.OnOffsetChangedListener {
diff --git a/app/src/main/java/org/wikipedia/feed/FeedViewCallback.java
b/app/src/main/java/org/wikipedia/feed/FeedViewCallback.java
index 79b2b93..a843979 100644
--- a/app/src/main/java/org/wikipedia/feed/FeedViewCallback.java
+++ b/app/src/main/java/org/wikipedia/feed/FeedViewCallback.java
@@ -3,6 +3,7 @@
import android.support.annotation.NonNull;
import org.wikipedia.PageTitleListCardItemCallback;
+import org.wikipedia.feed.image.FeaturedImage;
import org.wikipedia.feed.news.NewsItemCard;
import org.wikipedia.feed.model.Card;
import org.wikipedia.views.ItemTouchHelperSwipeAdapter;
@@ -14,4 +15,5 @@
void onVoiceSearchRequested();
boolean onRequestDismissCard(@NonNull Card card);
void onNewsItemSelected(@NonNull NewsItemCard card);
+ void onDownloadImage(@NonNull FeaturedImage image);
}
diff --git a/app/src/main/java/org/wikipedia/feed/image/FeaturedImageCard.java
b/app/src/main/java/org/wikipedia/feed/image/FeaturedImageCard.java
index d05ecd1..6c64676 100644
--- a/app/src/main/java/org/wikipedia/feed/image/FeaturedImageCard.java
+++ b/app/src/main/java/org/wikipedia/feed/image/FeaturedImageCard.java
@@ -22,6 +22,11 @@
this.date = date;
}
+ @NonNull
+ public FeaturedImage baseImage() {
+ return featuredImage;
+ }
+
@Override
@NonNull
public String title() {
diff --git
a/app/src/main/java/org/wikipedia/feed/image/FeaturedImageCardView.java
b/app/src/main/java/org/wikipedia/feed/image/FeaturedImageCardView.java
index 6f8b686..895a440 100644
--- a/app/src/main/java/org/wikipedia/feed/image/FeaturedImageCardView.java
+++ b/app/src/main/java/org/wikipedia/feed/image/FeaturedImageCardView.java
@@ -99,7 +99,7 @@
@Override
public void onClick(View v) {
if (getCallback() != null) {
-
//getCallback().onAddPageToList(card.historyEntry(HistoryEntry.SOURCE_FEED_FEATURED));
+ getCallback().onDownloadImage(card.baseImage());
}
}
}
diff --git
a/app/src/main/java/org/wikipedia/page/gallery/GalleryItemFragment.java
b/app/src/main/java/org/wikipedia/page/gallery/GalleryItemFragment.java
index a5bbe3b..414c13f 100644
--- a/app/src/main/java/org/wikipedia/page/gallery/GalleryItemFragment.java
+++ b/app/src/main/java/org/wikipedia/page/gallery/GalleryItemFragment.java
@@ -1,5 +1,6 @@
package org.wikipedia.page.gallery;
+import org.wikipedia.Constants;
import org.wikipedia.page.PageTitle;
import org.wikipedia.R;
import org.wikipedia.WikipediaApp;
@@ -8,8 +9,6 @@
import org.wikipedia.util.PermissionUtil;
import org.wikipedia.util.ShareUtil;
-import android.Manifest;
-import android.content.pm.PackageManager;
import android.graphics.Bitmap;
import android.graphics.Color;
import android.graphics.drawable.Animatable;
@@ -19,7 +18,6 @@
import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
import android.support.v4.app.Fragment;
-import android.support.v4.content.ContextCompat;
import android.text.TextUtils;
import android.util.Log;
import android.view.LayoutInflater;
@@ -48,8 +46,6 @@
public static final String ARG_PAGETITLE = "pageTitle";
public static final String ARG_MEDIATITLE = "imageTitle";
public static final String ARG_MIMETYPE = "mimeType";
- private static final int WRITE_EXTERNAL_STORAGE_PERMISSION_REQUEST = 44;
-
private WikipediaApp app;
private GalleryActivity parentActivity;
@@ -177,7 +173,7 @@
}
return true;
case R.id.menu_gallery_save:
- checkPermissionsToSaveImage();
+ PermissionUtil.handleImageSaveRequest(this, imageSaveCallback);
return true;
case R.id.menu_gallery_share:
shareImage();
@@ -409,30 +405,12 @@
}.get();
}
- /**
- * Checks runtime permissions first. If allowed it then proceeds with
saving the image
- * to the MediaStore.
- */
- private void checkPermissionsToSaveImage() {
- if (ContextCompat.checkSelfPermission(getActivity(),
- Manifest.permission.WRITE_EXTERNAL_STORAGE) !=
PackageManager.PERMISSION_GRANTED) {
-
requestWriteStorageRuntimePermissions(WRITE_EXTERNAL_STORAGE_PERMISSION_REQUEST);
- } else {
- saveImage();
- }
- }
-
- private void requestWriteStorageRuntimePermissions(int requestCode) {
- requestPermissions(new
String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE}, requestCode);
- // once permission is granted/denied it will continue with
onRequestPermissionsResult
- }
-
@Override
public void onRequestPermissionsResult(int requestCode,
@NonNull String[] permissions,
@NonNull int[] grantResults) {
switch (requestCode) {
- case WRITE_EXTERNAL_STORAGE_PERMISSION_REQUEST:
+ case Constants.WRITE_EXTERNAL_STORAGE_PERMISSION_REQUEST:
if (PermissionUtil.isPermitted(grantResults)) {
saveImage();
} else {
@@ -457,4 +435,13 @@
private boolean shouldHaveWhiteBackground(String mimeType) {
return mimeType.contains("svg") || mimeType.contains("png") ||
mimeType.contains("gif");
}
+
+
+ private PermissionUtil.OnGrantedCallback imageSaveCallback
+ = new PermissionUtil.OnGrantedCallback() {
+ @Override
+ public void onPermissionGranted() {
+ saveImage();
+ }
+ };
}
diff --git
a/app/src/main/java/org/wikipedia/page/gallery/MediaDownloadReceiver.java
b/app/src/main/java/org/wikipedia/page/gallery/MediaDownloadReceiver.java
index fb26654..63896b5 100644
--- a/app/src/main/java/org/wikipedia/page/gallery/MediaDownloadReceiver.java
+++ b/app/src/main/java/org/wikipedia/page/gallery/MediaDownloadReceiver.java
@@ -10,8 +10,11 @@
import android.net.Uri;
import android.os.Environment;
import android.provider.MediaStore;
+import android.support.annotation.NonNull;
+import android.support.annotation.Nullable;
import org.wikipedia.R;
+import org.wikipedia.feed.image.FeaturedImage;
import org.wikipedia.util.FeedbackUtil;
import org.wikipedia.util.FileUtil;
@@ -26,6 +29,12 @@
downloadManager = (DownloadManager)
activity.getSystemService(Context.DOWNLOAD_SERVICE);
}
+ public void download(FeaturedImage featuredImage) {
+ String filename = FileUtil.sanitizeFileName(featuredImage.title());
+ String targetDirectory = Environment.DIRECTORY_PICTURES;
+ performDownloadRequest(featuredImage.image().source(),
targetDirectory, filename, null);
+ }
+
public void download(GalleryItem galleryItem) {
String saveFilename =
FileUtil.sanitizeFileName(trimFileNamespace(galleryItem.getName()));
String targetDirectory;
@@ -38,11 +47,20 @@
} else {
targetDirectory = Environment.DIRECTORY_DOWNLOADS;
}
- DownloadManager.Request request = new
DownloadManager.Request(Uri.parse(galleryItem.getUrl()));
- request.setDestinationInExternalFilesDir(activity, targetDirectory,
saveFilename);
- request.setMimeType(galleryItem.getMimeType());
+ performDownloadRequest(Uri.parse(galleryItem.getUrl()),
targetDirectory, saveFilename,
+ galleryItem.getMimeType());
+ }
+
+ private void performDownloadRequest(@NonNull Uri uri, @NonNull String
targetDirectory,
+ @NonNull String filename, @Nullable
String mimeType) {
+ DownloadManager.Request request = new DownloadManager.Request(uri);
+ request.setDestinationInExternalFilesDir(activity, targetDirectory,
filename);
request.setNotificationVisibility(DownloadManager.Request.VISIBILITY_VISIBLE_NOTIFY_COMPLETED);
+ if (mimeType != null) {
+ request.setMimeType(mimeType);
+ }
request.allowScanningByMediaScanner();
+
downloadManager = (DownloadManager)
activity.getSystemService(Context.DOWNLOAD_SERVICE);
downloadManager.enqueue(request);
FeedbackUtil.showMessage(activity, R.string.gallery_save_progress);
diff --git a/app/src/main/java/org/wikipedia/util/PermissionUtil.java
b/app/src/main/java/org/wikipedia/util/PermissionUtil.java
index 91426ac..a735ca0 100644
--- a/app/src/main/java/org/wikipedia/util/PermissionUtil.java
+++ b/app/src/main/java/org/wikipedia/util/PermissionUtil.java
@@ -1,7 +1,13 @@
package org.wikipedia.util;
+import android.Manifest;
+import android.app.Activity;
import android.content.pm.PackageManager;
import android.support.annotation.NonNull;
+import android.support.v4.app.Fragment;
+import android.support.v4.content.ContextCompat;
+
+import org.wikipedia.Constants;
/**
* Common methods for dealing with runtime permissions.
@@ -14,5 +20,33 @@
&& grantResults[0] == PackageManager.PERMISSION_GRANTED;
}
+ public static void handleImageSaveRequest(Fragment fragment,
OnGrantedCallback cb) {
+ if (fragment.isAdded()) {
+ handleImageSaveRequest(fragment.getActivity(), cb);
+ }
+ }
+
+ /**
+ * Checks runtime permissions first. If allowed it then proceeds with
saving the image
+ * to the MediaStore.
+ */
+ public static void handleImageSaveRequest(Activity activity,
OnGrantedCallback cb) {
+ if (ContextCompat.checkSelfPermission(activity,
+ Manifest.permission.WRITE_EXTERNAL_STORAGE) !=
PackageManager.PERMISSION_GRANTED) {
+ requestWriteStorageRuntimePermissions(activity,
Constants.WRITE_EXTERNAL_STORAGE_PERMISSION_REQUEST);
+ } else {
+ cb.onPermissionGranted();
+ }
+ }
+
+ private static void requestWriteStorageRuntimePermissions(Activity
activity, int requestCode) {
+ activity.requestPermissions(new
String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE}, requestCode);
+ // once permission is granted/denied it will continue with
onRequestPermissionsResult
+ }
+
+ public interface OnGrantedCallback {
+ void onPermissionGranted();
+ }
+
private PermissionUtil() { }
}
--
To view, visit https://gerrit.wikimedia.org/r/297999
To unsubscribe, visit https://gerrit.wikimedia.org/r/settings
Gerrit-MessageType: newchange
Gerrit-Change-Id: I320c8ea6414d4edd7efcf3924505a89b93abae86
Gerrit-PatchSet: 1
Gerrit-Project: apps/android/wikipedia
Gerrit-Branch: master
Gerrit-Owner: Mholloway <[email protected]>
_______________________________________________
MediaWiki-commits mailing list
[email protected]
https://lists.wikimedia.org/mailman/listinfo/mediawiki-commits