From 6e08f524ef07ebde864e677c2371fe453a40ee93 Mon Sep 17 00:00:00 2001 From: Wes Johnston Date: Mon, 12 May 2014 10:13:44 -0700 Subject: [PATCH] Bug 990642 - Reinsert code to share images instead of just urls. r=mfinkle --- mobile/android/base/GeckoAppShell.java | 62 +++++++++++++++++++ .../android/base/prompts/PromptListItem.java | 7 ++- .../base/widget/GeckoActionProvider.java | 6 ++ 3 files changed, 73 insertions(+), 2 deletions(-) diff --git a/mobile/android/base/GeckoAppShell.java b/mobile/android/base/GeckoAppShell.java index f222c5a04b0c..13db8d05930e 100644 --- a/mobile/android/base/GeckoAppShell.java +++ b/mobile/android/base/GeckoAppShell.java @@ -9,11 +9,15 @@ import java.io.BufferedReader; import java.io.Closeable; import java.io.File; import java.io.FileReader; +import java.io.FileOutputStream; import java.io.IOException; +import java.io.InputStream; import java.io.InputStreamReader; +import java.io.OutputStream; import java.io.PrintWriter; import java.io.StringWriter; import java.net.Proxy; +import java.net.URL; import java.nio.ByteBuffer; import java.util.ArrayList; import java.util.Iterator; @@ -106,6 +110,7 @@ import android.view.View; import android.view.inputmethod.InputMethodManager; import android.webkit.MimeTypeMap; import android.widget.AbsoluteLayout; +import android.widget.Toast; public class GeckoAppShell { @@ -2639,4 +2644,61 @@ public class GeckoAppShell return "DIRECT"; } + /* Downloads the uri pointed to by a share intent, and alters the intent to point to the locally stored file. + */ + public static void downloadImageForIntent(final Intent intent) { + final String src = intent.getStringExtra(Intent.EXTRA_TEXT); + final File dir = GeckoApp.getTempDirectory(); + + if (dir == null) { + showImageShareFailureToast(); + return; + } + + GeckoApp.deleteTempFiles(); + + OutputStream os = null; + try { + // Create a temporary file for the image + final String type = intent.getType().replace("image/", ""); + final File imageFile = File.createTempFile("image", "." + type, dir); + os = new FileOutputStream(imageFile); + + if (src.startsWith("data:")) { + int dataStart = src.indexOf(","); + byte[] buf = Base64.decode(src.substring(dataStart + 1), Base64.DEFAULT); + os.write(buf); + + intent.putExtra(Intent.EXTRA_STREAM, Uri.fromFile(imageFile)); + } else { + InputStream is = null; + try { + final byte[] buf = new byte[2048]; + final URL url = new URL(src); + is = url.openStream(); + + int length; + while ((length = is.read(buf)) != -1) { + os.write(buf, 0, length); + } + + intent.putExtra(Intent.EXTRA_STREAM, Uri.fromFile(imageFile)); + } finally { + safeStreamClose(is); + } + } + } catch(IOException ex) { + } finally { + safeStreamClose(os); + } + } + + // Don't fail silently, tell the user that we weren't able to share the image + private static final void showImageShareFailureToast() { + Toast toast = Toast.makeText(getContext(), + getContext().getResources().getString(R.string.share_image_failed), + Toast.LENGTH_SHORT); + toast.show(); + } + } diff --git a/mobile/android/base/prompts/PromptListItem.java b/mobile/android/base/prompts/PromptListItem.java index 5b970454edd2..5b078226a986 100644 --- a/mobile/android/base/prompts/PromptListItem.java +++ b/mobile/android/base/prompts/PromptListItem.java @@ -8,6 +8,7 @@ import org.json.JSONArray; import org.json.JSONObject; import org.json.JSONException; +import android.content.Context; import android.content.Intent; import android.graphics.drawable.Drawable; import android.util.Log; @@ -31,6 +32,7 @@ public class PromptListItem { public Drawable mIcon; PromptListItem(JSONObject aObject) { + Context context = GeckoAppShell.getContext(); label = aObject.isNull("label") ? "" : aObject.optString("label"); isGroup = aObject.optBoolean("isGroup"); inGroup = aObject.optBoolean("inGroup"); @@ -44,7 +46,8 @@ public class PromptListItem { String uri = obj.isNull("uri") ? "" : obj.optString("uri"); String type = obj.isNull("type") ? GeckoActionProvider.DEFAULT_MIME_TYPE : obj.optString("type", GeckoActionProvider.DEFAULT_MIME_TYPE); - mIntent = GeckoAppShell.getShareIntent(GeckoAppShell.getContext(), uri, type, ""); + + mIntent = GeckoAppShell.getShareIntent(context, uri, type, ""); isParent = true; } else { mIntent = null; @@ -55,7 +58,7 @@ public class PromptListItem { final String iconStr = aObject.optString("icon"); if (iconStr != null) { - BitmapUtils.getDrawable(GeckoAppShell.getContext(), iconStr, new BitmapUtils.BitmapLoader() { + BitmapUtils.getDrawable(context, iconStr, new BitmapUtils.BitmapLoader() { @Override public void onBitmapFound(Drawable d) { mIcon = d; diff --git a/mobile/android/base/widget/GeckoActionProvider.java b/mobile/android/base/widget/GeckoActionProvider.java index 6a577243316a..23a2ae6b7e07 100644 --- a/mobile/android/base/widget/GeckoActionProvider.java +++ b/mobile/android/base/widget/GeckoActionProvider.java @@ -184,6 +184,12 @@ public class GeckoActionProvider { ActivityChooserModel dataModel = ActivityChooserModel.get(mContext, mHistoryFileName); Intent launchIntent = dataModel.chooseActivity(index); if (launchIntent != null) { + // Share image syncrhonously downloads the image before sharing it. + String type = launchIntent.getType(); + if (Intent.ACTION_SEND.equals(launchIntent.getAction()) && type != null && type.startsWith("image/")) { + GeckoAppShell.downloadImageForIntent(launchIntent); + } + launchIntent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_WHEN_TASK_RESET); mContext.startActivity(launchIntent); }