diff --git a/Chan/res/menu/image_view.xml b/Chan/res/menu/image_view.xml
index 236d2ae5..43b8f929 100644
--- a/Chan/res/menu/image_view.xml
+++ b/Chan/res/menu/image_view.xml
@@ -18,6 +18,12 @@
android:orderInCategory="3"
android:showAsAction="never"
android:title="@string/action_open_browser" />
+
+
\ No newline at end of file
diff --git a/Chan/src/org/floens/chan/ChanApplication.java b/Chan/src/org/floens/chan/ChanApplication.java
index fe4ad952..c4eeadf7 100644
--- a/Chan/src/org/floens/chan/ChanApplication.java
+++ b/Chan/src/org/floens/chan/ChanApplication.java
@@ -22,7 +22,7 @@ import com.android.volley.toolbox.ImageLoader;
import com.android.volley.toolbox.Volley;
public class ChanApplication extends Application implements PinListener {
- public static final boolean DEVELOPER_MODE = false;
+ public static final boolean DEVELOPER_MODE = true;
private static ChanApplication instance;
private static RequestQueue volleyRequestQueue;
diff --git a/Chan/src/org/floens/chan/ui/activity/ImageViewActivity.java b/Chan/src/org/floens/chan/ui/activity/ImageViewActivity.java
index 9fb92b88..470312a0 100644
--- a/Chan/src/org/floens/chan/ui/activity/ImageViewActivity.java
+++ b/Chan/src/org/floens/chan/ui/activity/ImageViewActivity.java
@@ -7,7 +7,6 @@ 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;
@@ -144,11 +143,6 @@ 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_image_save) {
- Post post = adapter.getPost(currentPosition);
- ImageSaver.save(this, post.imageUrl, post.filename, post.ext);
-
return true;
} else {
ImageViewFragment fragment = getFragment(currentPosition);
diff --git a/Chan/src/org/floens/chan/ui/fragment/ImageViewFragment.java b/Chan/src/org/floens/chan/ui/fragment/ImageViewFragment.java
index 6f27a103..afa839e5 100644
--- a/Chan/src/org/floens/chan/ui/fragment/ImageViewFragment.java
+++ b/Chan/src/org/floens/chan/ui/fragment/ImageViewFragment.java
@@ -7,6 +7,7 @@ import org.floens.chan.ui.activity.ImageViewActivity;
import org.floens.chan.ui.adapter.ImageViewAdapter;
import org.floens.chan.ui.view.ThumbnailImageView;
import org.floens.chan.ui.view.ThumbnailImageView.ThumbnailImageViewCallback;
+import org.floens.chan.utils.ImageSaver;
import org.floens.chan.utils.Utils;
import android.app.Fragment;
@@ -152,6 +153,10 @@ public class ImageViewFragment extends Fragment implements ThumbnailImageViewCal
activity.invalidateActionBar();
} else if (item.getItemId() == R.id.action_open_browser) {
Utils.openLink(context, post.imageUrl);
+ } else if (item.getItemId() == R.id.action_image_save) {
+ ImageSaver.save(context, post.imageUrl, post.filename, post.ext, false);
+ } else if (item.getItemId() == R.id.action_share) {
+ ImageSaver.save(context, post.imageUrl, post.filename, post.ext, true);
}
}
diff --git a/Chan/src/org/floens/chan/utils/ImageSaver.java b/Chan/src/org/floens/chan/utils/ImageSaver.java
index e7046dab..2dff6daf 100644
--- a/Chan/src/org/floens/chan/utils/ImageSaver.java
+++ b/Chan/src/org/floens/chan/utils/ImageSaver.java
@@ -10,6 +10,7 @@ import org.floens.chan.core.ChanPreferences;
import org.floens.chan.core.net.ByteArrayRequest;
import android.content.Context;
+import android.content.Intent;
import android.media.MediaScannerConnection;
import android.net.Uri;
import android.os.Environment;
@@ -21,23 +22,37 @@ import com.android.volley.VolleyError;
public class ImageSaver {
private static final String TAG = "ImageSaver";
- public static void save(final Context context, String imageUrl, final String name, final String extension) {
- ByteArrayRequest request = new ByteArrayRequest(imageUrl, new Response.Listener() {
+ 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() {
@Override
- public void onResponse(byte[] array) {
- storeImage(context, array, name, extension);
+ public void onResponse(byte[] data) {
+ storeImage(context, data, name, extension, new SaveCallback() {
+ @Override
+ public void onUri(String name, Uri uri) {
+ if (!share) {
+ String message = context.getResources().getString(R.string.image_save_succeeded) + " "
+ + name;
+ Toast.makeText(context, message, Toast.LENGTH_LONG).show();
+ } else {
+ Intent intent = new Intent(Intent.ACTION_SEND);
+ intent.setType("image/*");
+ intent.putExtra(Intent.EXTRA_STREAM, uri);
+ context.startActivity(Intent.createChooser(intent, "WAT"));
+ }
+ }
+ });
}
}, new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
- Toast.makeText(context, R.string.image_preview_failed, Toast.LENGTH_LONG).show();
+ Toast.makeText(context, R.string.image_open_failed, Toast.LENGTH_LONG).show();
}
- });
-
- ChanApplication.getVolleyRequestQueue().add(request);
+ }));
}
- private static void storeImage(final Context context, byte[] data, String name, String extension) {
+ private static void storeImage(final Context context, byte[] data, String name, String extension,
+ final SaveCallback callback) {
String errorReason = null;
try {
@@ -56,31 +71,26 @@ public class ImageSaver {
}
}
- File file = new File(path, name + "." + extension);
- int nextFileNameNumber = 0;
- String newName;
- while (file.exists()) {
- newName = name + "_" + Integer.toString(nextFileNameNumber) + "." + extension;
- file = new File(path, newName);
- nextFileNameNumber++;
+ final File savedFile = saveFile(path, data, name, extension);
+ if (savedFile == null) {
+ errorReason = context.getString(R.string.image_save_failed);
+ throw new IOException(errorReason);
}
- Logger.i(TAG, "Saving image to: " + file.getPath());
-
- FileOutputStream outputStream = new FileOutputStream(file);
- outputStream.write(data);
- outputStream.close();
-
- MediaScannerConnection.scanFile(context, new String[] { file.toString() }, null,
+ MediaScannerConnection.scanFile(context, new String[] { savedFile.toString() }, null,
new MediaScannerConnection.OnScanCompletedListener() {
@Override
- public void onScanCompleted(String path, Uri uri) {
- Logger.i(TAG, "Media scan succeeded: " + uri);
+ public void onScanCompleted(String path, final Uri uri) {
+ Utils.runOnUiThread(new Runnable() {
+ @Override
+ public void run() {
+ Logger.i(TAG, "Media scan succeeded: " + uri);
+ callback.onUri(savedFile.toString(), uri);
+ }
+ });
}
});
- String message = context.getResources().getString(R.string.image_save_succeeded) + " " + file.getName();
- Toast.makeText(context, message, Toast.LENGTH_LONG).show();
} catch (IOException e) {
e.printStackTrace();
@@ -90,4 +100,38 @@ public class ImageSaver {
Toast.makeText(context, errorReason, Toast.LENGTH_LONG).show();
}
}
+
+ private static File saveFile(File path, byte[] source, String name, String extension) {
+ File destination = new File(path, name + "." + extension);
+ int nextFileNameNumber = 0;
+ String newName;
+ while (destination.exists()) {
+ newName = name + "_" + Integer.toString(nextFileNameNumber++) + "." + extension;
+ destination = new File(path, newName);
+ }
+
+ FileOutputStream outputStream = null;
+ try {
+ outputStream = new FileOutputStream(destination);
+ outputStream.write(source);
+ outputStream.close();
+ } catch (IOException e) {
+ e.printStackTrace();
+ } finally {
+ if (outputStream != null) {
+ try {
+ outputStream.close();
+ } catch (IOException e) {
+ }
+ }
+ }
+
+ Logger.i(TAG, "Saved image to: " + destination.getPath());
+
+ return destination;
+ }
+
+ private static interface SaveCallback {
+ public void onUri(String name, Uri uri);
+ }
}