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:showAsAction="never"
android:title="@string/image_save"/>
<item
android:id="@+id/action_open_browser"
android:orderInCategory="3"
android:showAsAction="never"
android:title="@string/action_open_browser" />
<item
android:title="@string/action_open_browser"/>
<item
android:id="@+id/action_share"
android:orderInCategory="4"
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>

@ -20,6 +20,7 @@
<string name="action_open_browser">Open in browser</string>
<string name="action_catalog">Open catalog</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">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_disabled">Off</string>
<string name="pass_using">Using 4chan pass</string>
<string name="download_confirm">COUNT images will be downloaded to FOLDER</string>
</resources>

@ -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<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;
} else {
ImageViewFragment fragment = getFragment(currentPosition);

@ -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<Post> getList() {
return postList;
}
}

@ -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();
}
}

@ -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<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,
final boolean share) {
ChanApplication.getVolleyRequestQueue().add(new ByteArrayRequest(imageUrl, new Response.Listener<byte[]>() {

Loading…
Cancel
Save