Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(3554)

Unified Diff: chrome/android/java/src/org/chromium/chrome/browser/share/ShareHelper.java

Issue 913033002: Extend ShareHelper#share to share a screenshot as a stream (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Fix findbugs Created 5 years, 10 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « no previous file | chrome/android/javatests/src/org/chromium/chrome/browser/share/ShareUrlTest.java » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: chrome/android/java/src/org/chromium/chrome/browser/share/ShareHelper.java
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/share/ShareHelper.java b/chrome/android/java/src/org/chromium/chrome/browser/share/ShareHelper.java
index 62d2926c61cb6ded5d51ef57685679a66d9aaebc..5fcad3e7556c5490d9826ae85f0434bf5c183333 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/share/ShareHelper.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/share/ShareHelper.java
@@ -17,17 +17,25 @@ import android.content.pm.PackageManager.NameNotFoundException;
import android.content.pm.ResolveInfo;
import android.graphics.Bitmap;
import android.graphics.drawable.Drawable;
+import android.os.AsyncTask;
import android.preference.PreferenceManager;
+import android.util.Log;
import android.view.MenuItem;
import android.view.View;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import org.chromium.base.ApiCompatibilityUtils;
+import org.chromium.base.ApplicationState;
+import org.chromium.base.ApplicationStatus;
import org.chromium.base.VisibleForTesting;
import org.chromium.chrome.R;
import org.chromium.components.dom_distiller.core.DomDistillerUrlUtils;
+import org.chromium.ui.UiUtils;
+import java.io.File;
+import java.io.FileOutputStream;
+import java.io.IOException;
import java.util.Collections;
import java.util.List;
@@ -36,22 +44,55 @@ import java.util.List;
*/
public class ShareHelper {
+ private static final String TAG = "ShareHelper";
+
private static final String PACKAGE_NAME_KEY = "last_shared_package_name";
private static final String CLASS_NAME_KEY = "last_shared_class_name";
/**
- * Intent extra for sharing screenshots via the Share intent.
- *
- * Copied from {@link android.provider.Browser} as it is marked as {@literal @hide}.
+ * Directory name for screenshots.
*/
- private static final String EXTRA_SHARE_SCREENSHOT = "share_screenshot";
+ private static final String SCREENSHOT_DIRECTORY_NAME = "screenshot";
private ShareHelper() {}
+ private static void deleteScreenshotFiles(File file) {
+ if (!file.exists()) return;
+ if (file.isDirectory()) {
+ for (File f : file.listFiles()) deleteScreenshotFiles(f);
+ }
+ if (!file.delete()) {
+ Log.w(TAG, "Failed to delete screenshot file: " + file.getAbsolutePath());
+ }
+ }
+
+ /**
+ * Clears all shared screenshot files.
+ */
+ public static void clearSharedScreenshots(final Context context) {
+ new AsyncTask<Void, Void, Void>() {
+ @Override
+ protected Void doInBackground(Void... params) {
+ try {
+ File imagePath = UiUtils.getDirectoryForImageCapture(context);
+ deleteScreenshotFiles(new File(imagePath, SCREENSHOT_DIRECTORY_NAME));
+ } catch (IOException ie) {
+ // Ignore exception.
+ }
+ return null;
+ }
+ }.execute();
+ }
+
/**
* Creates and shows a share intent picker dialog or starts a share intent directly with the
* activity that was most recently used to share based on shareDirectly value.
*
+ * This function will save |screenshot| under {app's root}/files/images/screenshot (or
+ * /sdcard/DCIM/browser-images/screenshot if ADK is lower than JB MR2).
+ * Cleaning up doesn't happen automatically, and so an app should call clearSharedScreenshots()
+ * explicitly when needed.
+ *
* @param shareDirectly Whether it should share directly with the activity that was most
* recently used to share.
* @param activity Activity that is used to access package manager.
@@ -78,7 +119,7 @@ public class ShareHelper {
*/
private static void showShareDialog(final Activity activity, final String title,
final String url, final Bitmap screenshot) {
- Intent intent = getShareIntent(title, url, screenshot);
+ Intent intent = getShareIntent(activity, title, url, null);
PackageManager manager = activity.getPackageManager();
List<ResolveInfo> resolveInfoList = manager.queryIntentActivities(intent, 0);
assert resolveInfoList.size() > 0;
@@ -101,8 +142,7 @@ public class ShareHelper {
ComponentName component =
new ComponentName(ai.applicationInfo.packageName, ai.name);
setLastShareComponentName(activity, component);
- Intent intent = getDirectShareIntentForComponent(title, url, screenshot, component);
- activity.startActivity(intent);
+ makeIntentAndShare(activity, title, url, screenshot, component);
dialog.dismiss();
}
});
@@ -120,8 +160,31 @@ public class ShareHelper {
Activity activity, String title, String url, Bitmap screenshot) {
ComponentName component = getLastShareComponentName(activity);
if (component == null) return;
- Intent intent = getDirectShareIntentForComponent(title, url, screenshot, component);
- activity.startActivity(intent);
+ makeIntentAndShare(activity, title, url, screenshot, component);
+ }
+
+ private static void makeIntentAndShare(final Activity activity, final String title,
+ final String url, final Bitmap screenshot, final ComponentName component) {
+ if (screenshot == null) {
+ activity.startActivity(
+ getDirectShareIntentForComponent(activity, title, url, null, component));
+ } else {
+ new AsyncTask<Void, Void, Intent>() {
+ @Override
+ protected Intent doInBackground(Void... params) {
+ return getDirectShareIntentForComponent(
+ activity, title, url, screenshot, component);
+ }
+
+ @Override
+ protected void onPostExecute(Intent intent) {
+ if (ApplicationStatus.getStateForApplication()
+ != ApplicationState.HAS_DESTROYED_ACTIVITIES) {
+ activity.startActivity(intent);
+ }
+ }
+ }.execute();
+ }
}
/**
@@ -154,20 +217,47 @@ public class ShareHelper {
}
@VisibleForTesting
- public static Intent getShareIntent(String title, String url, Bitmap screenshot) {
+ public static Intent getShareIntent(
+ Context context, String title, String url, Bitmap screenshot) {
url = DomDistillerUrlUtils.getOriginalUrlFromDistillerUrl(url);
Intent intent = new Intent(Intent.ACTION_SEND);
intent.addFlags(ApiCompatibilityUtils.getActivityNewDocumentFlag());
intent.setType("text/plain");
intent.putExtra(Intent.EXTRA_SUBJECT, title);
intent.putExtra(Intent.EXTRA_TEXT, url);
- if (screenshot != null) intent.putExtra(EXTRA_SHARE_SCREENSHOT, screenshot);
+ if (screenshot != null) {
+ FileOutputStream fOut = null;
+ try {
+ File path = new File(
+ UiUtils.getDirectoryForImageCapture(context), SCREENSHOT_DIRECTORY_NAME);
+ if (path.exists() || path.mkdir()) {
+ File saveFile = File.createTempFile(
+ String.valueOf(System.currentTimeMillis()), ".jpg", path);
+ fOut = new FileOutputStream(saveFile);
+ screenshot.compress(Bitmap.CompressFormat.JPEG, 85, fOut);
+ fOut.flush();
+ fOut.close();
+
+ intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
+ intent.putExtra(Intent.EXTRA_STREAM,
+ UiUtils.getUriForImageCaptureFile(context, saveFile));
+ }
+ } catch (IOException ie) {
+ if (fOut != null) {
+ try {
+ fOut.close();
+ } catch (IOException e) {
+ // Ignore exception.
+ }
+ }
+ }
+ }
return intent;
}
- private static Intent getDirectShareIntentForComponent(String title, String url,
- Bitmap screenshot, ComponentName component) {
- Intent intent = getShareIntent(title, url, screenshot);
+ private static Intent getDirectShareIntentForComponent(
+ Context context, String title, String url, Bitmap screenshot, ComponentName component) {
+ Intent intent = getShareIntent(context, title, url, screenshot);
intent.addFlags(Intent.FLAG_ACTIVITY_FORWARD_RESULT
| Intent.FLAG_ACTIVITY_PREVIOUS_IS_TOP);
intent.setComponent(component);
« no previous file with comments | « no previous file | chrome/android/javatests/src/org/chromium/chrome/browser/share/ShareUrlTest.java » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698