diff options
author | Danesh M <daneshm90@gmail.com> | 2015-10-07 13:08:21 -0700 |
---|---|---|
committer | jrizzoli <joey@cyanogenmoditalia.it> | 2016-04-26 20:25:35 +0200 |
commit | 22398a7d009567d9959d85de6f9c735044508c1b (patch) | |
tree | 9b755f273c80e50e53ebd3d097bb4cbc4806deff | |
parent | 71560d7f475855136f084332d20bfa7ff592e662 (diff) | |
download | android_packages_apps_Gello-22398a7d009567d9959d85de6f9c735044508c1b.tar.gz android_packages_apps_Gello-22398a7d009567d9959d85de6f9c735044508c1b.tar.bz2 android_packages_apps_Gello-22398a7d009567d9959d85de6f9c735044508c1b.zip |
Gello: Share bitmap via stream vs bitmap
High res devices run into issues when trying to share a preview of the
page as a bitmap. Use a file uri instead.
Cherry-picked from: https://github.com/CyanogenMod/android_packages_apps_Browser/commit/5eb5e2c3d36ad92e41eef66c2dadcd106f1e0e13
Change-Id: I3016a3a9844cfa581f2535935fffc530c2b34ed9
-rw-r--r-- | src/com/android/browser/FileProviderHelper.java | 27 | ||||
-rw-r--r-- | src/com/android/browser/ShareDialog.java | 86 |
2 files changed, 111 insertions, 2 deletions
diff --git a/src/com/android/browser/FileProviderHelper.java b/src/com/android/browser/FileProviderHelper.java new file mode 100644 index 00000000..3c40796c --- /dev/null +++ b/src/com/android/browser/FileProviderHelper.java @@ -0,0 +1,27 @@ +// Copyright 2014 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +package com.android.browser; + +import android.content.Context; +import android.net.Uri; +import android.support.v4.content.FileProvider; + +import org.chromium.base.ContentUriUtils; + +import java.io.File; + +/** + * Utilities for translating a file into content URI. + */ +public class FileProviderHelper implements ContentUriUtils.FileProviderUtil { + // Keep this variable in sync with the value defined in file_paths.xml. + private static final String API_AUTHORITY_SUFFIX = ".FileProvider"; + + @Override + public Uri getContentUriFromFile(Context context, File file) { + return FileProvider.getUriForFile(context, + context.getPackageName() + API_AUTHORITY_SUFFIX, file); + } +} diff --git a/src/com/android/browser/ShareDialog.java b/src/com/android/browser/ShareDialog.java index 0f44e5cb..63f6183f 100644 --- a/src/com/android/browser/ShareDialog.java +++ b/src/com/android/browser/ShareDialog.java @@ -40,6 +40,8 @@ import android.content.pm.ActivityInfo; import android.content.pm.ResolveInfo; import android.content.pm.PackageManager; import android.graphics.Bitmap; +import android.net.Uri; +import android.os.AsyncTask; import android.os.Build; import java.util.List; @@ -47,6 +49,12 @@ import java.util.Collections; import android.util.Log; +import org.chromium.base.ContentUriUtils; +import org.chromium.ui.UiUtils; + +import java.io.File; +import java.io.FileOutputStream; +import java.io.IOException; public class ShareDialog extends AppItem { private Activity activity = null; @@ -57,7 +65,8 @@ public class ShareDialog extends AppItem { private List<ResolveInfo>apps = null; public final static String EXTRA_SHARE_SCREENSHOT = "share_screenshot"; public final static String EXTRA_SHARE_FAVICON = "share_favicon"; - + private static final String SCREENSHOT_DIRECTORY_NAME = "screenshot_share"; + private static final int MAX_SCREENSHOT_COUNT = 10; public ShareDialog (Activity activity, String title, String url, Bitmap favicon, Bitmap screenshot) { super(null); @@ -67,6 +76,50 @@ public class ShareDialog extends AppItem { this.url = url; this.favicon = favicon; this.screenshot = screenshot; + + ContentUriUtils.setFileProviderUtil(new FileProviderHelper()); + trimScreenshots(); + } + + private void trimScreenshots() { + try { + File directory = getScreenshotDir(); + if (directory.list() != null && directory.list().length >= MAX_SCREENSHOT_COUNT) { + clearSharedScreenshots(); + } + } catch (IOException e) { + e.printStackTrace(); + clearSharedScreenshots(); + } + } + + private File getScreenshotDir() throws IOException { + File baseDir = UiUtils.getDirectoryForImageCapture(activity); + return new File(baseDir, SCREENSHOT_DIRECTORY_NAME); + } + + private void deleteScreenshotFiles(File file) { + if (!file.exists()) return; + if (file.isDirectory()) { + for (File f : file.listFiles()) deleteScreenshotFiles(f); + } + } + + /** + * Clears all shared screenshot files. + */ + private void clearSharedScreenshots() { + AsyncTask.execute(new Runnable() { + @Override + public void run() { + try { + File dir = getScreenshotDir(); + deleteScreenshotFiles(dir); + } catch (IOException ie) { + // Ignore exception. + } + } + }); } private List<ResolveInfo> getShareableApps() { @@ -114,7 +167,8 @@ public class ShareDialog extends AppItem { i.putExtra(Intent.EXTRA_TEXT, url); i.putExtra(Intent.EXTRA_SUBJECT, title); i.putExtra(EXTRA_SHARE_FAVICON, favicon); - i.putExtra(EXTRA_SHARE_SCREENSHOT, screenshot); + i.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION); + i.putExtra(Intent.EXTRA_STREAM, getShareBitmapUri(screenshot)); i.setComponent(name); activity.startActivity(i); } @@ -122,4 +176,32 @@ public class ShareDialog extends AppItem { builderSingle.show(); } + + public Uri getShareBitmapUri(Bitmap screenshot) { + Uri uri = null; + if (screenshot != null) { + FileOutputStream fOut = null; + try { + File path = getScreenshotDir(); + if (path.exists() || path.mkdir()) { + File saveFile = File.createTempFile( + String.valueOf(System.currentTimeMillis()), ".jpg", path); + fOut = new FileOutputStream(saveFile); + screenshot.compress(Bitmap.CompressFormat.JPEG, 90, fOut); + fOut.flush(); + fOut.close(); + uri = UiUtils.getUriForImageCaptureFile(activity, saveFile); + } + } catch (IOException ie) { + if (fOut != null) { + try { + fOut.close(); + } catch (IOException e) { + // Ignore exception. + } + } + } + } + return uri; + } } |