Added canceling of downloads

captchafix
Florens Douwes 11 years ago
parent e29fecb4b9
commit 87cad2f33e
  1. 100
      Clover/app/src/main/java/org/floens/chan/utils/ImageSaver.java
  2. 2
      Clover/app/src/main/res/values/strings.xml

@ -19,9 +19,11 @@ package org.floens.chan.utils;
import android.app.AlertDialog; import android.app.AlertDialog;
import android.app.DownloadManager; import android.app.DownloadManager;
import android.content.BroadcastReceiver;
import android.content.Context; import android.content.Context;
import android.content.DialogInterface; import android.content.DialogInterface;
import android.content.Intent; import android.content.Intent;
import android.content.IntentFilter;
import android.media.MediaScannerConnection; import android.media.MediaScannerConnection;
import android.net.Uri; import android.net.Uri;
import android.os.Environment; import android.os.Environment;
@ -40,25 +42,57 @@ import java.io.FileOutputStream;
import java.io.IOException; import java.io.IOException;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List; import java.util.List;
import java.util.concurrent.atomic.AtomicBoolean;
public class ImageSaver { public class ImageSaver {
private static final String TAG = "ImageSaver"; private static final String TAG = "ImageSaver";
private static BroadcastReceiver receiver;
public static void saveAll(final Context context, String folderName, final List<DownloadPair> list) { public static void saveAll(final Context context, String folderName, final List<DownloadPair> list) {
final DownloadManager dm = (DownloadManager) context.getSystemService(Context.DOWNLOAD_SERVICE);
folderName = filterName(folderName); folderName = filterName(folderName);
final File subFolder = findUnused(new File(ChanPreferences.getImageSaveDirectory() + File.separator + folderName), true); final File subFolder = findUnused(new File(ChanPreferences.getImageSaveDirectory() + File.separator + folderName), true);
String text = context.getString(R.string.download_confirm) String text = context.getString(R.string.download_confirm, Integer.toString(list.size()), subFolder.getAbsolutePath());
.replace("COUNT", Integer.toString(list.size()))
.replace("FOLDER", subFolder.getAbsolutePath());
new AlertDialog.Builder(context).setMessage(text).setNegativeButton(R.string.cancel, null) new AlertDialog.Builder(context).setMessage(text).setNegativeButton(R.string.cancel, null)
.setPositiveButton(R.string.ok, new DialogInterface.OnClickListener() { .setPositiveButton(R.string.ok, new DialogInterface.OnClickListener() {
@Override @Override
public void onClick(DialogInterface dialog, int which) { public void onClick(DialogInterface dialog, int which) {
listDownload(context, subFolder, list);
}
}).show();
}
public static void saveImage(final Context context, String imageUrl, String name, final String extension, final boolean share) {
File saveDir = ChanPreferences.getImageSaveDirectory();
if (!saveDir.isDirectory() && !saveDir.mkdirs()) {
Toast.makeText(context, R.string.image_save_directory_error, Toast.LENGTH_LONG).show();
return;
}
String fileName = filterName(name + "." + extension);
final File file = findUnused(new File(saveDir, fileName), false);
Logger.test(file.getAbsolutePath());
ChanApplication.getVolleyRequestQueue().add(new ByteArrayRequest(imageUrl, new Response.Listener<byte[]>() {
@Override
public void onResponse(byte[] data) {
storeImage(context, data, file, share);
}
}, new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
Toast.makeText(context, R.string.image_open_failed, Toast.LENGTH_LONG).show();
}
}));
}
private static void listDownload(Context context, File subFolder, final List<DownloadPair> list) {
final DownloadManager dm = (DownloadManager) context.getSystemService(Context.DOWNLOAD_SERVICE);
if (!subFolder.isDirectory() && !subFolder.mkdirs()) { if (!subFolder.isDirectory() && !subFolder.mkdirs()) {
Toast.makeText(context, R.string.image_save_directory_error, Toast.LENGTH_LONG).show(); Toast.makeText(context, R.string.image_save_directory_error, Toast.LENGTH_LONG).show();
return; return;
@ -77,10 +111,17 @@ public class ImageSaver {
files.add(p); files.add(p);
} }
final AtomicBoolean stopped = new AtomicBoolean(false);
final List<Long> ids = new ArrayList<>();
new Thread(new Runnable() { new Thread(new Runnable() {
@Override @Override
public void run() { public void run() {
for (Pair pair : files) { for (Pair pair : files) {
if (stopped.get()) {
break;
}
DownloadManager.Request request; DownloadManager.Request request;
try { try {
request = new DownloadManager.Request(pair.uri); request = new DownloadManager.Request(pair.uri);
@ -92,38 +133,41 @@ public class ImageSaver {
request.setVisibleInDownloadsUi(false); request.setVisibleInDownloadsUi(false);
request.allowScanningByMediaScanner(); request.allowScanningByMediaScanner();
dm.enqueue(request); synchronized (stopped) {
if (stopped.get()) {
break;
} }
ids.add(dm.enqueue(request));
} }
}).start();
} }
}).show();
} }
}).start();
public static void saveImage(final Context context, String imageUrl, String name, final String extension, final boolean share) { receiver = new BroadcastReceiver() {
File saveDir = ChanPreferences.getImageSaveDirectory(); @Override
public void onReceive(Context context, Intent intent) {
if (DownloadManager.ACTION_NOTIFICATION_CLICKED.equals(intent.getAction())) {
synchronized (stopped) {
stopped.set(true);
if (!saveDir.isDirectory() && !saveDir.mkdirs()) { for (Long id : ids) {
Toast.makeText(context, R.string.image_save_directory_error, Toast.LENGTH_LONG).show(); dm.remove(id);
return;
} }
String fileName = filterName(name + "." + extension);
final File file = findUnused(new File(saveDir, fileName), false);
Logger.test(file.getAbsolutePath());
ChanApplication.getVolleyRequestQueue().add(new ByteArrayRequest(imageUrl, new Response.Listener<byte[]>() {
@Override
public void onResponse(byte[] data) {
storeImage(context, data, file, share);
} }
}, new Response.ErrorListener() { } else if (DownloadManager.ACTION_DOWNLOAD_COMPLETE.equals(intent.getAction())) {
@Override if (receiver != null) {
public void onErrorResponse(VolleyError error) { context.unregisterReceiver(receiver);
Toast.makeText(context, R.string.image_open_failed, Toast.LENGTH_LONG).show(); receiver = null;
} }
})); }
}
};
IntentFilter filter = new IntentFilter();
filter.addAction(DownloadManager.ACTION_NOTIFICATION_CLICKED);
filter.addAction(DownloadManager.ACTION_DOWNLOAD_COMPLETE);
context.registerReceiver(receiver, filter);
} }
private static String filterName(String name) { private static String filterName(String name) {

@ -219,7 +219,7 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
<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> <string name="download_confirm">%1$s images will be downloaded to %2$s</string>
<string name="board_select_add">Add more&#8230;</string> <string name="board_select_add">Add more&#8230;</string>

Loading…
Cancel
Save