From 2ffe81dd9f58994a88f0578dc165213484fc1f4b Mon Sep 17 00:00:00 2001 From: Wes Johnston Date: Mon, 12 May 2014 10:13:45 -0700 Subject: [PATCH] Bug 990642 - Try harder to find an extension to use when sharing images. r=mfinkle --- mobile/android/base/GeckoAppShell.java | 27 +++++++++++++++---- .../base/widget/GeckoActionProvider.java | 1 + 2 files changed, 23 insertions(+), 5 deletions(-) diff --git a/mobile/android/base/GeckoAppShell.java b/mobile/android/base/GeckoAppShell.java index 13db8d05930e..34994e79756a 100644 --- a/mobile/android/base/GeckoAppShell.java +++ b/mobile/android/base/GeckoAppShell.java @@ -109,6 +109,7 @@ import android.view.TextureView; import android.view.View; import android.view.inputmethod.InputMethodManager; import android.webkit.MimeTypeMap; +import android.webkit.URLUtil; import android.widget.AbsoluteLayout; import android.widget.Toast; @@ -2657,37 +2658,53 @@ public class GeckoAppShell GeckoApp.deleteTempFiles(); + String type = intent.getType(); 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(","); + final int dataStart = src.indexOf(","); + + String extension = MimeTypeMap.getSingleton().getExtensionFromMimeType(type); + + // If we weren't given an explicit mimetype, try to dig one out of the data uri. + if (TextUtils.isEmpty(extension) && dataStart > 5) { + type = src.substring(5, dataStart).replace(";base64", ""); + extension = MimeTypeMap.getSingleton().getExtensionFromMimeType(type); + } + + final File imageFile = File.createTempFile("image", "." + extension, dir); + os = new FileOutputStream(imageFile); + byte[] buf = Base64.decode(src.substring(dataStart + 1), Base64.DEFAULT); os.write(buf); + // Only alter the intent when we're sure everything has worked 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); + final String filename = URLUtil.guessFileName(src, null, type); is = url.openStream(); + final File imageFile = new File(dir, filename); + os = new FileOutputStream(imageFile); + int length; while ((length = is.read(buf)) != -1) { os.write(buf, 0, length); } + // Only alter the intent when we're sure everything has worked intent.putExtra(Intent.EXTRA_STREAM, Uri.fromFile(imageFile)); } finally { safeStreamClose(is); } } } catch(IOException ex) { + // If something went wrong, we'll just leave the intent un-changed } finally { safeStreamClose(os); } diff --git a/mobile/android/base/widget/GeckoActionProvider.java b/mobile/android/base/widget/GeckoActionProvider.java index 23a2ae6b7e07..b04ccd6da6bc 100644 --- a/mobile/android/base/widget/GeckoActionProvider.java +++ b/mobile/android/base/widget/GeckoActionProvider.java @@ -5,6 +5,7 @@ package org.mozilla.gecko.widget; +import org.mozilla.gecko.GeckoAppShell; import org.mozilla.gecko.Telemetry; import org.mozilla.gecko.TelemetryContract; import org.mozilla.gecko.menu.MenuItemActionView;