Added album downloader.

captchafix
Florens Douwes 11 years ago
parent a12fed932e
commit 12ba1ac6a4
  1. 14
      Chan/res/menu/image_view.xml
  2. 3
      Chan/res/values/strings.xml
  3. 21
      Chan/src/org/floens/chan/ui/activity/ImageViewActivity.java
  4. 5
      Chan/src/org/floens/chan/ui/adapter/ImageViewAdapter.java
  5. 2
      Chan/src/org/floens/chan/ui/fragment/ImageViewFragment.java
  6. 41
      Chan/src/org/floens/chan/utils/ImageSaver.java

@ -12,18 +12,20 @@
android:orderInCategory="2" android:orderInCategory="2"
android:showAsAction="never" android:showAsAction="never"
android:title="@string/image_save"/> android:title="@string/image_save"/>
<item <item
android:id="@+id/action_open_browser" android:id="@+id/action_open_browser"
android:orderInCategory="3" android:orderInCategory="3"
android:showAsAction="never" android:showAsAction="never"
android:title="@string/action_open_browser" /> android:title="@string/action_open_browser"/>
<item
<item
android:id="@+id/action_share" android:id="@+id/action_share"
android:orderInCategory="4" android:orderInCategory="4"
android:showAsAction="never" android:showAsAction="never"
android:title="@string/action_share" /> android:title="@string/action_share"/>
<item
android:id="@+id/action_download_album"
android:orderInCategory="5"
android:showAsAction="never"
android:title="@string/action_download_album"/>
</menu> </menu>

@ -20,6 +20,7 @@
<string name="action_open_browser">Open in browser</string> <string name="action_open_browser">Open in browser</string>
<string name="action_catalog">Open catalog</string> <string name="action_catalog">Open catalog</string>
<string name="action_share">Share</string> <string name="action_share">Share</string>
<string name="action_download_album">Download album</string>
<string name="open_unknown_title">Unsupported link</string> <string name="open_unknown_title">Unsupported link</string>
<string name="open_unknown">Chan can\'t open this link. Opening it in your browser instead.</string> <string name="open_unknown">Chan can\'t open this link. Opening it in your browser instead.</string>
@ -150,6 +151,8 @@
<string name="pass_summary_enabled">Using 4chan pass</string> <string name="pass_summary_enabled">Using 4chan pass</string>
<string name="pass_summary_disabled">Off</string> <string name="pass_summary_disabled">Off</string>
<string name="pass_using">Using 4chan pass</string> <string name="pass_using">Using 4chan pass</string>
<string name="download_confirm">COUNT images will be downloaded to FOLDER</string>
</resources> </resources>

@ -18,16 +18,19 @@
package org.floens.chan.ui.activity; package org.floens.chan.ui.activity;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List;
import org.floens.chan.R; import org.floens.chan.R;
import org.floens.chan.core.model.Post; import org.floens.chan.core.model.Post;
import org.floens.chan.ui.adapter.ImageViewAdapter; import org.floens.chan.ui.adapter.ImageViewAdapter;
import org.floens.chan.ui.adapter.PostAdapter; import org.floens.chan.ui.adapter.PostAdapter;
import org.floens.chan.ui.fragment.ImageViewFragment; import org.floens.chan.ui.fragment.ImageViewFragment;
import org.floens.chan.utils.ImageSaver;
import org.floens.chan.utils.Logger; import org.floens.chan.utils.Logger;
import android.app.ActionBar; import android.app.ActionBar;
import android.app.Activity; import android.app.Activity;
import android.net.Uri;
import android.os.Bundle; import android.os.Bundle;
import android.support.v4.view.ViewPager; import android.support.v4.view.ViewPager;
import android.view.Menu; import android.view.Menu;
@ -160,6 +163,24 @@ public class ImageViewActivity extends Activity implements ViewPager.OnPageChang
public boolean onOptionsItemSelected(MenuItem item) { public boolean onOptionsItemSelected(MenuItem item) {
if (item.getItemId() == android.R.id.home) { if (item.getItemId() == android.R.id.home) {
finish(); finish();
return true;
} else if (item.getItemId() == R.id.action_download_album) {
List<Uri> uris = new ArrayList<Uri>();
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; return true;
} else { } else {
ImageViewFragment fragment = getFragment(currentPosition); ImageViewFragment fragment = getFragment(currentPosition);

@ -18,6 +18,7 @@
package org.floens.chan.ui.adapter; package org.floens.chan.ui.adapter;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List;
import org.floens.chan.core.model.Post; import org.floens.chan.core.model.Post;
import org.floens.chan.ui.activity.ImageViewActivity; import org.floens.chan.ui.activity.ImageViewActivity;
@ -68,4 +69,8 @@ public class ImageViewAdapter extends FragmentStatePagerAdapter {
notifyDataSetChanged(); notifyDataSetChanged();
} }
public List<Post> getList() {
return postList;
}
} }

@ -132,7 +132,7 @@ public class ImageViewFragment extends Fragment implements ThumbnailImageViewCal
} }
public void onDeselected() { public void onDeselected() {
if (imageView != null && imageView.getVideoView() != null && imageView.getVideoView().isPlaying()) { if (imageView != null && imageView.getVideoView() != null) {
imageView.getVideoView().pause(); imageView.getVideoView().pause();
} }
} }

@ -20,13 +20,17 @@ package org.floens.chan.utils;
import java.io.File; import java.io.File;
import java.io.FileOutputStream; import java.io.FileOutputStream;
import java.io.IOException; import java.io.IOException;
import java.util.List;
import org.floens.chan.ChanApplication; import org.floens.chan.ChanApplication;
import org.floens.chan.R; import org.floens.chan.R;
import org.floens.chan.core.ChanPreferences; import org.floens.chan.core.ChanPreferences;
import org.floens.chan.core.net.ByteArrayRequest; import org.floens.chan.core.net.ByteArrayRequest;
import android.app.AlertDialog;
import android.app.DownloadManager;
import android.content.Context; import android.content.Context;
import android.content.DialogInterface;
import android.content.Intent; import android.content.Intent;
import android.media.MediaScannerConnection; import android.media.MediaScannerConnection;
import android.net.Uri; import android.net.Uri;
@ -39,6 +43,43 @@ import com.android.volley.VolleyError;
public class ImageSaver { public class ImageSaver {
private static final String TAG = "ImageSaver"; private static final String TAG = "ImageSaver";
public static void saveAll(Context context, String folderName, final List<Uri> 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, public static void save(final Context context, String imageUrl, final String name, final String extension,
final boolean share) { final boolean share) {
ChanApplication.getVolleyRequestQueue().add(new ByteArrayRequest(imageUrl, new Response.Listener<byte[]>() { ChanApplication.getVolleyRequestQueue().add(new ByteArrayRequest(imageUrl, new Response.Listener<byte[]>() {

Loading…
Cancel
Save