Added image sharing

captchafix
Florens Douwes 11 years ago
parent bda83f18ca
commit 8b3d6c3ef4
  1. 6
      Chan/res/menu/image_view.xml
  2. 2
      Chan/src/org/floens/chan/ChanApplication.java
  3. 6
      Chan/src/org/floens/chan/ui/activity/ImageViewActivity.java
  4. 5
      Chan/src/org/floens/chan/ui/fragment/ImageViewFragment.java
  5. 98
      Chan/src/org/floens/chan/utils/ImageSaver.java

@ -18,6 +18,12 @@
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
android:id="@+id/action_share"
android:orderInCategory="4"
android:showAsAction="never"
android:title="@string/action_share" />
</menu> </menu>

@ -22,7 +22,7 @@ import com.android.volley.toolbox.ImageLoader;
import com.android.volley.toolbox.Volley; import com.android.volley.toolbox.Volley;
public class ChanApplication extends Application implements PinListener { 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 ChanApplication instance;
private static RequestQueue volleyRequestQueue; private static RequestQueue volleyRequestQueue;

@ -7,7 +7,6 @@ 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;
@ -144,11 +143,6 @@ 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_image_save) {
Post post = adapter.getPost(currentPosition);
ImageSaver.save(this, post.imageUrl, post.filename, post.ext);
return true; return true;
} else { } else {
ImageViewFragment fragment = getFragment(currentPosition); ImageViewFragment fragment = getFragment(currentPosition);

@ -7,6 +7,7 @@ import org.floens.chan.ui.activity.ImageViewActivity;
import org.floens.chan.ui.adapter.ImageViewAdapter; import org.floens.chan.ui.adapter.ImageViewAdapter;
import org.floens.chan.ui.view.ThumbnailImageView; import org.floens.chan.ui.view.ThumbnailImageView;
import org.floens.chan.ui.view.ThumbnailImageView.ThumbnailImageViewCallback; import org.floens.chan.ui.view.ThumbnailImageView.ThumbnailImageViewCallback;
import org.floens.chan.utils.ImageSaver;
import org.floens.chan.utils.Utils; import org.floens.chan.utils.Utils;
import android.app.Fragment; import android.app.Fragment;
@ -152,6 +153,10 @@ public class ImageViewFragment extends Fragment implements ThumbnailImageViewCal
activity.invalidateActionBar(); activity.invalidateActionBar();
} else if (item.getItemId() == R.id.action_open_browser) { } else if (item.getItemId() == R.id.action_open_browser) {
Utils.openLink(context, post.imageUrl); 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);
} }
} }

@ -10,6 +10,7 @@ import org.floens.chan.core.ChanPreferences;
import org.floens.chan.core.net.ByteArrayRequest; import org.floens.chan.core.net.ByteArrayRequest;
import android.content.Context; import android.content.Context;
import android.content.Intent;
import android.media.MediaScannerConnection; import android.media.MediaScannerConnection;
import android.net.Uri; import android.net.Uri;
import android.os.Environment; import android.os.Environment;
@ -21,23 +22,37 @@ 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 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,
ByteArrayRequest request = new ByteArrayRequest(imageUrl, new Response.Listener<byte[]>() { final boolean share) {
ChanApplication.getVolleyRequestQueue().add(new ByteArrayRequest(imageUrl, new Response.Listener<byte[]>() {
@Override @Override
public void onResponse(byte[] array) { public void onResponse(byte[] data) {
storeImage(context, array, name, extension); 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() { }, new Response.ErrorListener() {
@Override @Override
public void onErrorResponse(VolleyError error) { 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; String errorReason = null;
try { try {
@ -56,31 +71,26 @@ public class ImageSaver {
} }
} }
File file = new File(path, name + "." + extension); final File savedFile = saveFile(path, data, name, extension);
int nextFileNameNumber = 0; if (savedFile == null) {
String newName; errorReason = context.getString(R.string.image_save_failed);
while (file.exists()) { throw new IOException(errorReason);
newName = name + "_" + Integer.toString(nextFileNameNumber) + "." + extension;
file = new File(path, newName);
nextFileNameNumber++;
} }
Logger.i(TAG, "Saving image to: " + file.getPath()); MediaScannerConnection.scanFile(context, new String[] { savedFile.toString() }, null,
FileOutputStream outputStream = new FileOutputStream(file);
outputStream.write(data);
outputStream.close();
MediaScannerConnection.scanFile(context, new String[] { file.toString() }, null,
new MediaScannerConnection.OnScanCompletedListener() { new MediaScannerConnection.OnScanCompletedListener() {
@Override @Override
public void onScanCompleted(String path, Uri uri) { public void onScanCompleted(String path, final Uri uri) {
Logger.i(TAG, "Media scan succeeded: " + 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) { } catch (IOException e) {
e.printStackTrace(); e.printStackTrace();
@ -90,4 +100,38 @@ public class ImageSaver {
Toast.makeText(context, errorReason, Toast.LENGTH_LONG).show(); 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);
}
} }

Loading…
Cancel
Save