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); + } }