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

Reply via email to