| /* |
| * Copyright (c) 2014, The Linux Foundation. All rights reserved. |
| * |
| * Redistribution and use in source and binary forms, with or without |
| * modification, are permitted provided that the following conditions are |
| * met: |
| * * Redistributions of source code must retain the above copyright |
| * notice, this list of conditions and the following disclaimer. |
| * * Redistributions in binary form must reproduce the above |
| * copyright notice, this list of conditions and the following |
| * disclaimer in the documentation and/or other materials provided |
| * with the distribution. |
| * * Neither the name of The Linux Foundation nor the names of its |
| * contributors may be used to endorse or promote products derived |
| * from this software without specific prior written permission. |
| * |
| * THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED |
| * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF |
| * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT |
| * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS |
| * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR |
| * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF |
| * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR |
| * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, |
| * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE |
| * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN |
| * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
| * |
| */ |
| package com.android.browser; |
| |
| import android.app.Activity; |
| import android.content.Context; |
| import android.content.Intent; |
| import android.content.pm.ActivityInfo; |
| import android.content.pm.ResolveInfo; |
| import android.graphics.Bitmap; |
| import android.net.Uri; |
| import android.os.AsyncTask; |
| import android.os.Environment; |
| |
| import java.util.List; |
| import java.util.Collections; |
| |
| import android.util.Log; |
| |
| import org.chromium.base.ContentUriUtils; |
| |
| import java.io.File; |
| import java.io.FileOutputStream; |
| import java.io.IOException; |
| |
| public class ShareDialog { |
| private Activity activity = null; |
| public String title = null; |
| public String url = null; |
| public Bitmap favicon = null; |
| public Bitmap screenshot = 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 static final String EXTERNAL_IMAGE_FILE_PATH = "browser-images"; |
| public static final String IMAGE_FILE_PATH = "images"; |
| |
| public ShareDialog (Activity activity, String title, String url, Bitmap favicon, Bitmap screenshot) { |
| this.activity = activity; |
| this.title = title; |
| 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 = 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. |
| } |
| } |
| }); |
| } |
| |
| 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 = getUriForImageCaptureFile(activity, saveFile); |
| } |
| } catch (IOException ie) { |
| if (fOut != null) { |
| try { |
| fOut.close(); |
| } catch (IOException e) { |
| // Ignore exception. |
| } |
| } |
| } |
| } |
| return uri; |
| } |
| |
| public static Uri getUriForImageCaptureFile(Context context, File file) { |
| return ContentUriUtils.getContentUriFromFile(context, file); |
| } |
| |
| public static File getDirectoryForImageCapture(Context context) throws IOException { |
| File path = new File(context.getFilesDir(), IMAGE_FILE_PATH); |
| if (!path.exists() && !path.mkdir()) { |
| throw new IOException("Folder cannot be created."); |
| } |
| return path; |
| } |
| |
| public void sharePage() { |
| Intent intent = new Intent(Intent.ACTION_SEND); |
| intent.setType("text/plain"); |
| intent.addFlags(Intent.FLAG_ACTIVITY_FORWARD_RESULT | |
| Intent.FLAG_ACTIVITY_PREVIOUS_IS_TOP | |
| Intent.FLAG_ACTIVITY_NEW_DOCUMENT | |
| Intent.FLAG_GRANT_READ_URI_PERMISSION); |
| intent.putExtra(Intent.EXTRA_TEXT, url); |
| intent.putExtra(Intent.EXTRA_SUBJECT, title); |
| intent.putExtra(EXTRA_SHARE_FAVICON, favicon); |
| intent.putExtra(Intent.EXTRA_STREAM, getShareBitmapUri(screenshot)); |
| |
| activity.startActivity(Intent.createChooser(intent, |
| activity.getString(R.string.choosertitle_sharevia))); |
| } |
| |
| } |