OLD | NEW |
1 // Copyright 2014 The Chromium Authors. All rights reserved. | 1 // Copyright 2014 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 package org.chromium.chrome.browser.share; | 5 package org.chromium.chrome.browser.share; |
6 | 6 |
7 import android.app.Activity; | 7 import android.app.Activity; |
8 import android.app.AlertDialog; | 8 import android.app.AlertDialog; |
9 import android.content.ComponentName; | 9 import android.content.ComponentName; |
10 import android.content.Context; | 10 import android.content.Context; |
11 import android.content.Intent; | 11 import android.content.Intent; |
12 import android.content.SharedPreferences; | 12 import android.content.SharedPreferences; |
13 import android.content.pm.ActivityInfo; | 13 import android.content.pm.ActivityInfo; |
14 import android.content.pm.ApplicationInfo; | 14 import android.content.pm.ApplicationInfo; |
15 import android.content.pm.PackageManager; | 15 import android.content.pm.PackageManager; |
16 import android.content.pm.PackageManager.NameNotFoundException; | 16 import android.content.pm.PackageManager.NameNotFoundException; |
17 import android.content.pm.ResolveInfo; | 17 import android.content.pm.ResolveInfo; |
18 import android.graphics.Bitmap; | 18 import android.graphics.Bitmap; |
19 import android.graphics.drawable.Drawable; | 19 import android.graphics.drawable.Drawable; |
| 20 import android.net.Uri; |
20 import android.os.AsyncTask; | 21 import android.os.AsyncTask; |
21 import android.preference.PreferenceManager; | 22 import android.preference.PreferenceManager; |
22 import android.util.Log; | 23 import android.util.Log; |
23 import android.view.MenuItem; | 24 import android.view.MenuItem; |
24 import android.view.View; | 25 import android.view.View; |
25 import android.widget.AdapterView; | 26 import android.widget.AdapterView; |
26 import android.widget.AdapterView.OnItemClickListener; | 27 import android.widget.AdapterView.OnItemClickListener; |
27 | 28 |
28 import org.chromium.base.ApiCompatibilityUtils; | 29 import org.chromium.base.ApiCompatibilityUtils; |
29 import org.chromium.base.ApplicationState; | 30 import org.chromium.base.ApplicationState; |
(...skipping 82 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
112 /** | 113 /** |
113 * Creates and shows a share intent picker dialog. | 114 * Creates and shows a share intent picker dialog. |
114 * | 115 * |
115 * @param activity Activity that is used to access package manager. | 116 * @param activity Activity that is used to access package manager. |
116 * @param title Title of the page to be shared. | 117 * @param title Title of the page to be shared. |
117 * @param url URL of the page to be shared. | 118 * @param url URL of the page to be shared. |
118 * @param screenshot Screenshot of the page to be shared. | 119 * @param screenshot Screenshot of the page to be shared. |
119 */ | 120 */ |
120 private static void showShareDialog(final Activity activity, final String ti
tle, | 121 private static void showShareDialog(final Activity activity, final String ti
tle, |
121 final String url, final Bitmap screenshot) { | 122 final String url, final Bitmap screenshot) { |
122 Intent intent = getShareIntent(activity, title, url, null); | 123 Intent intent = getShareIntent(title, url, null); |
123 PackageManager manager = activity.getPackageManager(); | 124 PackageManager manager = activity.getPackageManager(); |
124 List<ResolveInfo> resolveInfoList = manager.queryIntentActivities(intent
, 0); | 125 List<ResolveInfo> resolveInfoList = manager.queryIntentActivities(intent
, 0); |
125 assert resolveInfoList.size() > 0; | 126 assert resolveInfoList.size() > 0; |
126 if (resolveInfoList.size() == 0) return; | 127 if (resolveInfoList.size() == 0) return; |
127 Collections.sort(resolveInfoList, new ResolveInfo.DisplayNameComparator(
manager)); | 128 Collections.sort(resolveInfoList, new ResolveInfo.DisplayNameComparator(
manager)); |
128 | 129 |
129 final ShareDialogAdapter adapter = | 130 final ShareDialogAdapter adapter = |
130 new ShareDialogAdapter(activity, manager, resolveInfoList); | 131 new ShareDialogAdapter(activity, manager, resolveInfoList); |
131 AlertDialog.Builder builder = new AlertDialog.Builder(activity); | 132 AlertDialog.Builder builder = new AlertDialog.Builder(activity); |
132 builder.setTitle(activity.getString(R.string.share_link_chooser_title)); | 133 builder.setTitle(activity.getString(R.string.share_link_chooser_title)); |
(...skipping 26 matching lines...) Expand all Loading... |
159 private static void shareWithLastUsed( | 160 private static void shareWithLastUsed( |
160 Activity activity, String title, String url, Bitmap screenshot) { | 161 Activity activity, String title, String url, Bitmap screenshot) { |
161 ComponentName component = getLastShareComponentName(activity); | 162 ComponentName component = getLastShareComponentName(activity); |
162 if (component == null) return; | 163 if (component == null) return; |
163 makeIntentAndShare(activity, title, url, screenshot, component); | 164 makeIntentAndShare(activity, title, url, screenshot, component); |
164 } | 165 } |
165 | 166 |
166 private static void makeIntentAndShare(final Activity activity, final String
title, | 167 private static void makeIntentAndShare(final Activity activity, final String
title, |
167 final String url, final Bitmap screenshot, final ComponentName compo
nent) { | 168 final String url, final Bitmap screenshot, final ComponentName compo
nent) { |
168 if (screenshot == null) { | 169 if (screenshot == null) { |
169 activity.startActivity( | 170 activity.startActivity(getDirectShareIntentForComponent(title, url,
null, component)); |
170 getDirectShareIntentForComponent(activity, title, url, null,
component)); | |
171 } else { | 171 } else { |
172 new AsyncTask<Void, Void, Intent>() { | 172 new AsyncTask<Void, Void, File>() { |
173 @Override | 173 @Override |
174 protected Intent doInBackground(Void... params) { | 174 protected File doInBackground(Void... params) { |
175 return getDirectShareIntentForComponent( | 175 FileOutputStream fOut = null; |
176 activity, title, url, screenshot, component); | 176 try { |
| 177 File path = new File(UiUtils.getDirectoryForImageCapture
(activity), |
| 178 SCREENSHOT_DIRECTORY_NAME); |
| 179 if (path.exists() || path.mkdir()) { |
| 180 File saveFile = File.createTempFile( |
| 181 String.valueOf(System.currentTimeMillis()),
".jpg", path); |
| 182 fOut = new FileOutputStream(saveFile); |
| 183 screenshot.compress(Bitmap.CompressFormat.JPEG, 85,
fOut); |
| 184 fOut.flush(); |
| 185 fOut.close(); |
| 186 |
| 187 return saveFile; |
| 188 } |
| 189 } catch (IOException ie) { |
| 190 if (fOut != null) { |
| 191 try { |
| 192 fOut.close(); |
| 193 } catch (IOException e) { |
| 194 // Ignore exception. |
| 195 } |
| 196 } |
| 197 } |
| 198 |
| 199 return null; |
177 } | 200 } |
178 | 201 |
179 @Override | 202 @Override |
180 protected void onPostExecute(Intent intent) { | 203 protected void onPostExecute(File saveFile) { |
181 if (ApplicationStatus.getStateForApplication() | 204 if (ApplicationStatus.getStateForApplication() |
182 != ApplicationState.HAS_DESTROYED_ACTIVITIES) { | 205 != ApplicationState.HAS_DESTROYED_ACTIVITIES) { |
183 activity.startActivity(intent); | 206 Uri screenshotUri = saveFile == null |
| 207 ? null : UiUtils.getUriForImageCaptureFile(activ
ity, saveFile); |
| 208 activity.startActivity(getDirectShareIntentForComponent( |
| 209 title, url, screenshotUri, component)); |
184 } | 210 } |
185 } | 211 } |
186 }.execute(); | 212 }.execute(); |
187 } | 213 } |
188 } | 214 } |
189 | 215 |
190 /** | 216 /** |
191 * Set the icon and the title for the menu item used for direct share. | 217 * Set the icon and the title for the menu item used for direct share. |
192 * | 218 * |
193 * @param activity Activity that is used to access the package manager. | 219 * @param activity Activity that is used to access the package manager. |
(...skipping 16 matching lines...) Expand all Loading... |
210 } | 236 } |
211 | 237 |
212 item.setIcon(directShareIcon); | 238 item.setIcon(directShareIcon); |
213 if (directShareTitle != null) { | 239 if (directShareTitle != null) { |
214 item.setTitle(activity.getString(R.string.accessibility_menu_share_v
ia, | 240 item.setTitle(activity.getString(R.string.accessibility_menu_share_v
ia, |
215 directShareTitle)); | 241 directShareTitle)); |
216 } | 242 } |
217 } | 243 } |
218 | 244 |
219 @VisibleForTesting | 245 @VisibleForTesting |
220 public static Intent getShareIntent( | 246 public static Intent getShareIntent(String title, String url, Uri screenshot
Uri) { |
221 Context context, String title, String url, Bitmap screenshot) { | |
222 url = DomDistillerUrlUtils.getOriginalUrlFromDistillerUrl(url); | 247 url = DomDistillerUrlUtils.getOriginalUrlFromDistillerUrl(url); |
223 Intent intent = new Intent(Intent.ACTION_SEND); | 248 Intent intent = new Intent(Intent.ACTION_SEND); |
224 intent.addFlags(ApiCompatibilityUtils.getActivityNewDocumentFlag()); | 249 intent.addFlags(ApiCompatibilityUtils.getActivityNewDocumentFlag()); |
225 intent.setType("text/plain"); | 250 intent.setType("text/plain"); |
226 intent.putExtra(Intent.EXTRA_SUBJECT, title); | 251 intent.putExtra(Intent.EXTRA_SUBJECT, title); |
227 intent.putExtra(Intent.EXTRA_TEXT, url); | 252 intent.putExtra(Intent.EXTRA_TEXT, url); |
228 if (screenshot != null) { | 253 if (screenshotUri != null) intent.putExtra(Intent.EXTRA_STREAM, screensh
otUri); |
229 FileOutputStream fOut = null; | |
230 try { | |
231 File path = new File( | |
232 UiUtils.getDirectoryForImageCapture(context), SCREENSHOT
_DIRECTORY_NAME); | |
233 if (path.exists() || path.mkdir()) { | |
234 File saveFile = File.createTempFile( | |
235 String.valueOf(System.currentTimeMillis()), ".jpg",
path); | |
236 fOut = new FileOutputStream(saveFile); | |
237 screenshot.compress(Bitmap.CompressFormat.JPEG, 85, fOut); | |
238 fOut.flush(); | |
239 fOut.close(); | |
240 | |
241 intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION); | |
242 intent.putExtra(Intent.EXTRA_STREAM, | |
243 UiUtils.getUriForImageCaptureFile(context, saveFile)
); | |
244 } | |
245 } catch (IOException ie) { | |
246 if (fOut != null) { | |
247 try { | |
248 fOut.close(); | |
249 } catch (IOException e) { | |
250 // Ignore exception. | |
251 } | |
252 } | |
253 } | |
254 } | |
255 return intent; | 254 return intent; |
256 } | 255 } |
257 | 256 |
258 private static Intent getDirectShareIntentForComponent( | 257 private static Intent getDirectShareIntentForComponent( |
259 Context context, String title, String url, Bitmap screenshot, Compon
entName component) { | 258 String title, String url, Uri screenshotUri, ComponentName component
) { |
260 Intent intent = getShareIntent(context, title, url, screenshot); | 259 Intent intent = getShareIntent(title, url, screenshotUri); |
261 intent.addFlags(Intent.FLAG_ACTIVITY_FORWARD_RESULT | 260 intent.addFlags(Intent.FLAG_ACTIVITY_FORWARD_RESULT |
262 | Intent.FLAG_ACTIVITY_PREVIOUS_IS_TOP); | 261 | Intent.FLAG_ACTIVITY_PREVIOUS_IS_TOP); |
263 intent.setComponent(component); | 262 intent.setComponent(component); |
264 return intent; | 263 return intent; |
265 } | 264 } |
266 | 265 |
267 private static ComponentName getLastShareComponentName(Context context) { | 266 private static ComponentName getLastShareComponentName(Context context) { |
268 SharedPreferences preferences = PreferenceManager.getDefaultSharedPrefer
ences(context); | 267 SharedPreferences preferences = PreferenceManager.getDefaultSharedPrefer
ences(context); |
269 String packageName = preferences.getString(PACKAGE_NAME_KEY, null); | 268 String packageName = preferences.getString(PACKAGE_NAME_KEY, null); |
270 String className = preferences.getString(CLASS_NAME_KEY, null); | 269 String className = preferences.getString(CLASS_NAME_KEY, null); |
271 if (packageName == null || className == null) return null; | 270 if (packageName == null || className == null) return null; |
272 return new ComponentName(packageName, className); | 271 return new ComponentName(packageName, className); |
273 } | 272 } |
274 | 273 |
275 private static void setLastShareComponentName(Context context, ComponentName
component) { | 274 private static void setLastShareComponentName(Context context, ComponentName
component) { |
276 SharedPreferences preferences = PreferenceManager.getDefaultSharedPrefer
ences(context); | 275 SharedPreferences preferences = PreferenceManager.getDefaultSharedPrefer
ences(context); |
277 SharedPreferences.Editor editor = preferences.edit(); | 276 SharedPreferences.Editor editor = preferences.edit(); |
278 editor.putString(PACKAGE_NAME_KEY, component.getPackageName()); | 277 editor.putString(PACKAGE_NAME_KEY, component.getPackageName()); |
279 editor.putString(CLASS_NAME_KEY, component.getClassName()); | 278 editor.putString(CLASS_NAME_KEY, component.getClassName()); |
280 editor.apply(); | 279 editor.apply(); |
281 } | 280 } |
282 } | 281 } |
OLD | NEW |