From 12ba1ac6a4d5f1b4c1015b8bf8a599a36feba36c Mon Sep 17 00:00:00 2001 From: Florens Douwes Date: Sun, 4 May 2014 15:39:41 +0200 Subject: [PATCH] Added album downloader. --- Chan/res/menu/image_view.xml | 14 ++++--- Chan/res/values/strings.xml | 3 ++ .../chan/ui/activity/ImageViewActivity.java | 21 ++++++++++ .../chan/ui/adapter/ImageViewAdapter.java | 5 +++ .../chan/ui/fragment/ImageViewFragment.java | 2 +- .../src/org/floens/chan/utils/ImageSaver.java | 41 +++++++++++++++++++ 6 files changed, 79 insertions(+), 7 deletions(-) diff --git a/Chan/res/menu/image_view.xml b/Chan/res/menu/image_view.xml index 43b8f929..265faee8 100644 --- a/Chan/res/menu/image_view.xml +++ b/Chan/res/menu/image_view.xml @@ -12,18 +12,20 @@ android:orderInCategory="2" android:showAsAction="never" android:title="@string/image_save"/> - - - + - + android:title="@string/action_share"/> + \ No newline at end of file diff --git a/Chan/res/values/strings.xml b/Chan/res/values/strings.xml index c51e6ccd..fedd57f8 100644 --- a/Chan/res/values/strings.xml +++ b/Chan/res/values/strings.xml @@ -20,6 +20,7 @@ Open in browser Open catalog Share + Download album Unsupported link Chan can\'t open this link. Opening it in your browser instead. @@ -150,6 +151,8 @@ Using 4chan pass Off Using 4chan pass + + COUNT images will be downloaded to FOLDER diff --git a/Chan/src/org/floens/chan/ui/activity/ImageViewActivity.java b/Chan/src/org/floens/chan/ui/activity/ImageViewActivity.java index aeb029b1..dc63caaa 100644 --- a/Chan/src/org/floens/chan/ui/activity/ImageViewActivity.java +++ b/Chan/src/org/floens/chan/ui/activity/ImageViewActivity.java @@ -18,16 +18,19 @@ package org.floens.chan.ui.activity; import java.util.ArrayList; +import java.util.List; import org.floens.chan.R; import org.floens.chan.core.model.Post; import org.floens.chan.ui.adapter.ImageViewAdapter; import org.floens.chan.ui.adapter.PostAdapter; import org.floens.chan.ui.fragment.ImageViewFragment; +import org.floens.chan.utils.ImageSaver; import org.floens.chan.utils.Logger; import android.app.ActionBar; import android.app.Activity; +import android.net.Uri; import android.os.Bundle; import android.support.v4.view.ViewPager; import android.view.Menu; @@ -160,6 +163,24 @@ public class ImageViewActivity extends Activity implements ViewPager.OnPageChang public boolean onOptionsItemSelected(MenuItem item) { if (item.getItemId() == android.R.id.home) { finish(); + return true; + } else if (item.getItemId() == R.id.action_download_album) { + List uris = new ArrayList(); + Post aPost = null; + for (Post post : adapter.getList()) { + uris.add(Uri.parse(post.imageUrl)); + aPost = post; + } + + if (uris.size() > 0) { + String name = "downloaded"; + if (aPost != null) { + name = aPost.board + "_" + aPost.resto; + } + + ImageSaver.saveAll(this, name, uris); + } + return true; } else { ImageViewFragment fragment = getFragment(currentPosition); diff --git a/Chan/src/org/floens/chan/ui/adapter/ImageViewAdapter.java b/Chan/src/org/floens/chan/ui/adapter/ImageViewAdapter.java index 601fb0ec..d6dab31f 100644 --- a/Chan/src/org/floens/chan/ui/adapter/ImageViewAdapter.java +++ b/Chan/src/org/floens/chan/ui/adapter/ImageViewAdapter.java @@ -18,6 +18,7 @@ package org.floens.chan.ui.adapter; import java.util.ArrayList; +import java.util.List; import org.floens.chan.core.model.Post; import org.floens.chan.ui.activity.ImageViewActivity; @@ -68,4 +69,8 @@ public class ImageViewAdapter extends FragmentStatePagerAdapter { notifyDataSetChanged(); } + + public List getList() { + return postList; + } } diff --git a/Chan/src/org/floens/chan/ui/fragment/ImageViewFragment.java b/Chan/src/org/floens/chan/ui/fragment/ImageViewFragment.java index 0de9e79c..fa67cb9a 100644 --- a/Chan/src/org/floens/chan/ui/fragment/ImageViewFragment.java +++ b/Chan/src/org/floens/chan/ui/fragment/ImageViewFragment.java @@ -132,7 +132,7 @@ public class ImageViewFragment extends Fragment implements ThumbnailImageViewCal } public void onDeselected() { - if (imageView != null && imageView.getVideoView() != null && imageView.getVideoView().isPlaying()) { + if (imageView != null && imageView.getVideoView() != null) { imageView.getVideoView().pause(); } } diff --git a/Chan/src/org/floens/chan/utils/ImageSaver.java b/Chan/src/org/floens/chan/utils/ImageSaver.java index e195af37..53659795 100644 --- a/Chan/src/org/floens/chan/utils/ImageSaver.java +++ b/Chan/src/org/floens/chan/utils/ImageSaver.java @@ -20,13 +20,17 @@ package org.floens.chan.utils; import java.io.File; import java.io.FileOutputStream; import java.io.IOException; +import java.util.List; import org.floens.chan.ChanApplication; import org.floens.chan.R; import org.floens.chan.core.ChanPreferences; import org.floens.chan.core.net.ByteArrayRequest; +import android.app.AlertDialog; +import android.app.DownloadManager; import android.content.Context; +import android.content.DialogInterface; import android.content.Intent; import android.media.MediaScannerConnection; import android.net.Uri; @@ -39,6 +43,43 @@ import com.android.volley.VolleyError; public class ImageSaver { private static final String TAG = "ImageSaver"; + public static void saveAll(Context context, String folderName, final List list) { + final DownloadManager dm = (DownloadManager) context.getSystemService(Context.DOWNLOAD_SERVICE); + + String folderPath = ChanPreferences.getImageSaveDirectory() + File.separator + folderName; + File folder = Environment.getExternalStoragePublicDirectory(folderPath); + int nextFileNameNumber = 0; + while (folder.exists() || folder.isFile()) { + folderPath = ChanPreferences.getImageSaveDirectory() + File.separator + folderName + "_" + + Integer.toString(nextFileNameNumber++); + folder = Environment.getExternalStoragePublicDirectory(folderPath); + } + + final String finalFolderPath = folderPath; + String text = context.getString(R.string.download_confirm).replace("COUNT", Integer.toString(list.size())) + .replace("FOLDER", folderPath); + new AlertDialog.Builder(context).setMessage(text).setNegativeButton(R.string.cancel, null) + .setPositiveButton(R.string.ok, new DialogInterface.OnClickListener() { + @Override + public void onClick(DialogInterface dialog, int which) { + for (Uri uri : list) { + DownloadManager.Request request = null; + try { + request = new DownloadManager.Request(uri); + } catch (IllegalArgumentException e) { + continue; + } + + request.setDestinationInExternalPublicDir(finalFolderPath, uri.getLastPathSegment()); + request.setVisibleInDownloadsUi(false); + request.allowScanningByMediaScanner(); + + dm.enqueue(request); + } + } + }).show(); + } + public static void save(final Context context, String imageUrl, final String name, final String extension, final boolean share) { ChanApplication.getVolleyRequestQueue().add(new ByteArrayRequest(imageUrl, new Response.Listener() {