18f1c01e908d5986e8222dfd45ab82d6895b1ff3bAndrew Sapperstein/* 28f1c01e908d5986e8222dfd45ab82d6895b1ff3bAndrew Sapperstein * Copyright (C) 2012 Google Inc. 38f1c01e908d5986e8222dfd45ab82d6895b1ff3bAndrew Sapperstein * Licensed to The Android Open Source Project. 48f1c01e908d5986e8222dfd45ab82d6895b1ff3bAndrew Sapperstein * 58f1c01e908d5986e8222dfd45ab82d6895b1ff3bAndrew Sapperstein * Licensed under the Apache License, Version 2.0 (the "License"); 68f1c01e908d5986e8222dfd45ab82d6895b1ff3bAndrew Sapperstein * you may not use this file except in compliance with the License. 78f1c01e908d5986e8222dfd45ab82d6895b1ff3bAndrew Sapperstein * You may obtain a copy of the License at 88f1c01e908d5986e8222dfd45ab82d6895b1ff3bAndrew Sapperstein * 98f1c01e908d5986e8222dfd45ab82d6895b1ff3bAndrew Sapperstein * http://www.apache.org/licenses/LICENSE-2.0 108f1c01e908d5986e8222dfd45ab82d6895b1ff3bAndrew Sapperstein * 118f1c01e908d5986e8222dfd45ab82d6895b1ff3bAndrew Sapperstein * Unless required by applicable law or agreed to in writing, software 128f1c01e908d5986e8222dfd45ab82d6895b1ff3bAndrew Sapperstein * distributed under the License is distributed on an "AS IS" BASIS, 138f1c01e908d5986e8222dfd45ab82d6895b1ff3bAndrew Sapperstein * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 148f1c01e908d5986e8222dfd45ab82d6895b1ff3bAndrew Sapperstein * See the License for the specific language governing permissions and 158f1c01e908d5986e8222dfd45ab82d6895b1ff3bAndrew Sapperstein * limitations under the License. 168f1c01e908d5986e8222dfd45ab82d6895b1ff3bAndrew Sapperstein */ 178f1c01e908d5986e8222dfd45ab82d6895b1ff3bAndrew Sapperstein 184aa1c1340556c646175c3d0b193be05876ad95a0Andrew Sappersteinpackage com.android.mail.browse; 194aa1c1340556c646175c3d0b193be05876ad95a0Andrew Sapperstein 201aee17e324f204080baaabceb64f4edf73681542Mark Wei 218081df46ef5a7794374e41cd1836e778a2da9b31Paul Westbrookimport android.app.DialogFragment; 228081df46ef5a7794374e41cd1836e778a2da9b31Paul Westbrookimport android.app.Fragment; 238081df46ef5a7794374e41cd1836e778a2da9b31Paul Westbrookimport android.app.FragmentManager; 248081df46ef5a7794374e41cd1836e778a2da9b31Paul Westbrookimport android.app.FragmentTransaction; 25532f48253d23ffcb974ab61856df131021dde02aAndrew Sappersteinimport android.content.ActivityNotFoundException; 264aa1c1340556c646175c3d0b193be05876ad95a0Andrew Sappersteinimport android.content.ContentValues; 274aa1c1340556c646175c3d0b193be05876ad95a0Andrew Sappersteinimport android.content.Context; 28532f48253d23ffcb974ab61856df131021dde02aAndrew Sappersteinimport android.content.Intent; 294aa1c1340556c646175c3d0b193be05876ad95a0Andrew Sappersteinimport android.net.Uri; 308081df46ef5a7794374e41cd1836e778a2da9b31Paul Westbrookimport android.os.Handler; 31532f48253d23ffcb974ab61856df131021dde02aAndrew Sappersteinimport android.os.Parcelable; 324aa1c1340556c646175c3d0b193be05876ad95a0Andrew Sapperstein 334aa1c1340556c646175c3d0b193be05876ad95a0Andrew Sappersteinimport com.android.mail.providers.Attachment; 341aee17e324f204080baaabceb64f4edf73681542Mark Weiimport com.android.mail.providers.UIProvider; 354aa1c1340556c646175c3d0b193be05876ad95a0Andrew Sappersteinimport com.android.mail.providers.UIProvider.AttachmentColumns; 361aee17e324f204080baaabceb64f4edf73681542Mark Weiimport com.android.mail.providers.UIProvider.AttachmentContentValueKeys; 374cb51dbce9635f4bf68a6de88f759e2f86d20325Andrew Sappersteinimport com.android.mail.providers.UIProvider.AttachmentDestination; 384aa1c1340556c646175c3d0b193be05876ad95a0Andrew Sappersteinimport com.android.mail.providers.UIProvider.AttachmentState; 39b334c9035e9b7a38766bb66c29da2208525d1e11Paul Westbrookimport com.android.mail.utils.LogTag; 40532f48253d23ffcb974ab61856df131021dde02aAndrew Sappersteinimport com.android.mail.utils.LogUtils; 41532f48253d23ffcb974ab61856df131021dde02aAndrew Sappersteinimport com.android.mail.utils.Utils; 42532f48253d23ffcb974ab61856df131021dde02aAndrew Sapperstein 43532f48253d23ffcb974ab61856df131021dde02aAndrew Sappersteinimport java.util.ArrayList; 444aa1c1340556c646175c3d0b193be05876ad95a0Andrew Sapperstein 458081df46ef5a7794374e41cd1836e778a2da9b31Paul Westbrookpublic class AttachmentActionHandler { 468081df46ef5a7794374e41cd1836e778a2da9b31Paul Westbrook private static final String PROGRESS_FRAGMENT_TAG = "attachment-progress"; 478081df46ef5a7794374e41cd1836e778a2da9b31Paul Westbrook 484aa1c1340556c646175c3d0b193be05876ad95a0Andrew Sapperstein private Attachment mAttachment; 494aa1c1340556c646175c3d0b193be05876ad95a0Andrew Sapperstein 504aa1c1340556c646175c3d0b193be05876ad95a0Andrew Sapperstein private final AttachmentCommandHandler mCommandHandler; 514aa1c1340556c646175c3d0b193be05876ad95a0Andrew Sapperstein private final AttachmentViewInterface mView; 524aa1c1340556c646175c3d0b193be05876ad95a0Andrew Sapperstein private final Context mContext; 538081df46ef5a7794374e41cd1836e778a2da9b31Paul Westbrook private final Handler mHandler; 548081df46ef5a7794374e41cd1836e778a2da9b31Paul Westbrook private FragmentManager mFragmentManager; 55519c218db6109003ca72a35ffe276ed69b0230a4Martin Hibdon private boolean mViewOnFinish; 564aa1c1340556c646175c3d0b193be05876ad95a0Andrew Sapperstein 57b334c9035e9b7a38766bb66c29da2208525d1e11Paul Westbrook private static final String LOG_TAG = LogTag.getLogTag(); 58532f48253d23ffcb974ab61856df131021dde02aAndrew Sapperstein 594aa1c1340556c646175c3d0b193be05876ad95a0Andrew Sapperstein public AttachmentActionHandler(Context context, AttachmentViewInterface view) { 604aa1c1340556c646175c3d0b193be05876ad95a0Andrew Sapperstein mCommandHandler = new AttachmentCommandHandler(context); 614aa1c1340556c646175c3d0b193be05876ad95a0Andrew Sapperstein mView = view; 624aa1c1340556c646175c3d0b193be05876ad95a0Andrew Sapperstein mContext = context; 638081df46ef5a7794374e41cd1836e778a2da9b31Paul Westbrook mHandler = new Handler(); 64519c218db6109003ca72a35ffe276ed69b0230a4Martin Hibdon mViewOnFinish = true; 658081df46ef5a7794374e41cd1836e778a2da9b31Paul Westbrook } 668081df46ef5a7794374e41cd1836e778a2da9b31Paul Westbrook 678081df46ef5a7794374e41cd1836e778a2da9b31Paul Westbrook public void initialize(FragmentManager fragmentManager) { 688081df46ef5a7794374e41cd1836e778a2da9b31Paul Westbrook mFragmentManager = fragmentManager; 694aa1c1340556c646175c3d0b193be05876ad95a0Andrew Sapperstein } 704aa1c1340556c646175c3d0b193be05876ad95a0Andrew Sapperstein 714aa1c1340556c646175c3d0b193be05876ad95a0Andrew Sapperstein public void setAttachment(Attachment attachment) { 724aa1c1340556c646175c3d0b193be05876ad95a0Andrew Sapperstein mAttachment = attachment; 734aa1c1340556c646175c3d0b193be05876ad95a0Andrew Sapperstein } 744aa1c1340556c646175c3d0b193be05876ad95a0Andrew Sapperstein 75519c218db6109003ca72a35ffe276ed69b0230a4Martin Hibdon public void setViewOnFinish(boolean viewOnFinish) { 76519c218db6109003ca72a35ffe276ed69b0230a4Martin Hibdon mViewOnFinish = viewOnFinish; 77519c218db6109003ca72a35ffe276ed69b0230a4Martin Hibdon } 78519c218db6109003ca72a35ffe276ed69b0230a4Martin Hibdon 794aa1c1340556c646175c3d0b193be05876ad95a0Andrew Sapperstein public void showAttachment(int destination) { 807bed4bc31a49a2297a38eb9d7b595fba1fa1f849Mark Wei if (mView == null) { 817bed4bc31a49a2297a38eb9d7b595fba1fa1f849Mark Wei return; 827bed4bc31a49a2297a38eb9d7b595fba1fa1f849Mark Wei } 837bed4bc31a49a2297a38eb9d7b595fba1fa1f849Mark Wei 84a25b65e95e90e785012ea4e5ad53408e76e87139Paul Westbrook // If the caller requested that this attachments be saved to the external storage, we should 85a25b65e95e90e785012ea4e5ad53408e76e87139Paul Westbrook // verify that the it was saved there. 86a25b65e95e90e785012ea4e5ad53408e76e87139Paul Westbrook if (mAttachment.isPresentLocally() && 87a25b65e95e90e785012ea4e5ad53408e76e87139Paul Westbrook (destination == AttachmentDestination.CACHE || 88a25b65e95e90e785012ea4e5ad53408e76e87139Paul Westbrook mAttachment.destination == destination)) { 894aa1c1340556c646175c3d0b193be05876ad95a0Andrew Sapperstein mView.viewAttachment(); 904aa1c1340556c646175c3d0b193be05876ad95a0Andrew Sapperstein } else { 919e2d407fdafeb874e640eb84017feaf784309075Scott Kennedy showDownloadingDialog(); 924aa1c1340556c646175c3d0b193be05876ad95a0Andrew Sapperstein startDownloadingAttachment(destination); 934aa1c1340556c646175c3d0b193be05876ad95a0Andrew Sapperstein } 944aa1c1340556c646175c3d0b193be05876ad95a0Andrew Sapperstein } 954aa1c1340556c646175c3d0b193be05876ad95a0Andrew Sapperstein 967bed4bc31a49a2297a38eb9d7b595fba1fa1f849Mark Wei /** 977bed4bc31a49a2297a38eb9d7b595fba1fa1f849Mark Wei * Start downloading the full size attachment set with 987bed4bc31a49a2297a38eb9d7b595fba1fa1f849Mark Wei * {@link #setAttachment(Attachment)} immediately. 997bed4bc31a49a2297a38eb9d7b595fba1fa1f849Mark Wei */ 1004aa1c1340556c646175c3d0b193be05876ad95a0Andrew Sapperstein public void startDownloadingAttachment(int destination) { 101267453587f13986acc7de3d52de95184c38fb4e1Mark Wei startDownloadingAttachment(destination, UIProvider.AttachmentRendition.BEST, 0, false); 1021aee17e324f204080baaabceb64f4edf73681542Mark Wei } 1031aee17e324f204080baaabceb64f4edf73681542Mark Wei 104267453587f13986acc7de3d52de95184c38fb4e1Mark Wei public void startDownloadingAttachment( 105267453587f13986acc7de3d52de95184c38fb4e1Mark Wei int destination, int rendition, int additionalPriority, boolean delayDownload) { 106267453587f13986acc7de3d52de95184c38fb4e1Mark Wei startDownloadingAttachment( 107267453587f13986acc7de3d52de95184c38fb4e1Mark Wei mAttachment, destination, rendition, additionalPriority, delayDownload); 1084cb51dbce9635f4bf68a6de88f759e2f86d20325Andrew Sapperstein } 1094cb51dbce9635f4bf68a6de88f759e2f86d20325Andrew Sapperstein 110267453587f13986acc7de3d52de95184c38fb4e1Mark Wei private void startDownloadingAttachment( 111267453587f13986acc7de3d52de95184c38fb4e1Mark Wei Attachment attachment, int destination, int rendition, int additionalPriority, 112267453587f13986acc7de3d52de95184c38fb4e1Mark Wei boolean delayDownload) { 1137434e800d4313a227120ca36bd95683752a7879fAndrew Sapperstein final ContentValues params = new ContentValues(5); 1144aa1c1340556c646175c3d0b193be05876ad95a0Andrew Sapperstein params.put(AttachmentColumns.STATE, AttachmentState.DOWNLOADING); 1154aa1c1340556c646175c3d0b193be05876ad95a0Andrew Sapperstein params.put(AttachmentColumns.DESTINATION, destination); 1161aee17e324f204080baaabceb64f4edf73681542Mark Wei params.put(AttachmentContentValueKeys.RENDITION, rendition); 117267453587f13986acc7de3d52de95184c38fb4e1Mark Wei params.put(AttachmentContentValueKeys.ADDITIONAL_PRIORITY, additionalPriority); 118267453587f13986acc7de3d52de95184c38fb4e1Mark Wei params.put(AttachmentContentValueKeys.DELAY_DOWNLOAD, delayDownload); 1194aa1c1340556c646175c3d0b193be05876ad95a0Andrew Sapperstein 1204cb51dbce9635f4bf68a6de88f759e2f86d20325Andrew Sapperstein mCommandHandler.sendCommand(attachment.uri, params); 1214aa1c1340556c646175c3d0b193be05876ad95a0Andrew Sapperstein } 1224aa1c1340556c646175c3d0b193be05876ad95a0Andrew Sapperstein 1234aa1c1340556c646175c3d0b193be05876ad95a0Andrew Sapperstein public void cancelAttachment() { 1244aa1c1340556c646175c3d0b193be05876ad95a0Andrew Sapperstein final ContentValues params = new ContentValues(1); 1254aa1c1340556c646175c3d0b193be05876ad95a0Andrew Sapperstein params.put(AttachmentColumns.STATE, AttachmentState.NOT_SAVED); 1264aa1c1340556c646175c3d0b193be05876ad95a0Andrew Sapperstein 1274aa1c1340556c646175c3d0b193be05876ad95a0Andrew Sapperstein mCommandHandler.sendCommand(mAttachment.uri, params); 1284aa1c1340556c646175c3d0b193be05876ad95a0Andrew Sapperstein } 1294aa1c1340556c646175c3d0b193be05876ad95a0Andrew Sapperstein 13047ca4e2a4c2d7387a7dd8d1925e2512acc553eabMark Wei public void startRedownloadingAttachment(Attachment attachment) { 13147ca4e2a4c2d7387a7dd8d1925e2512acc553eabMark Wei final ContentValues params = new ContentValues(2); 13247ca4e2a4c2d7387a7dd8d1925e2512acc553eabMark Wei params.put(AttachmentColumns.STATE, AttachmentState.REDOWNLOADING); 13347ca4e2a4c2d7387a7dd8d1925e2512acc553eabMark Wei params.put(AttachmentColumns.DESTINATION, attachment.destination); 13447ca4e2a4c2d7387a7dd8d1925e2512acc553eabMark Wei 13547ca4e2a4c2d7387a7dd8d1925e2512acc553eabMark Wei mCommandHandler.sendCommand(attachment.uri, params); 13647ca4e2a4c2d7387a7dd8d1925e2512acc553eabMark Wei } 13747ca4e2a4c2d7387a7dd8d1925e2512acc553eabMark Wei 1384aa1c1340556c646175c3d0b193be05876ad95a0Andrew Sapperstein /** 1394aa1c1340556c646175c3d0b193be05876ad95a0Andrew Sapperstein * Displays a loading dialog to be used for downloading attachments. 1404aa1c1340556c646175c3d0b193be05876ad95a0Andrew Sapperstein * Must be called on the UI thread. 1414aa1c1340556c646175c3d0b193be05876ad95a0Andrew Sapperstein */ 142ce9db80cf997f99b8c5d0ef8d22b074555aaf795Mark Wei public void showDownloadingDialog() { 1438081df46ef5a7794374e41cd1836e778a2da9b31Paul Westbrook final FragmentTransaction ft = mFragmentManager.beginTransaction(); 1448081df46ef5a7794374e41cd1836e778a2da9b31Paul Westbrook final Fragment prev = mFragmentManager.findFragmentByTag(PROGRESS_FRAGMENT_TAG); 1458081df46ef5a7794374e41cd1836e778a2da9b31Paul Westbrook if (prev != null) { 1468081df46ef5a7794374e41cd1836e778a2da9b31Paul Westbrook ft.remove(prev); 1478081df46ef5a7794374e41cd1836e778a2da9b31Paul Westbrook } 1488081df46ef5a7794374e41cd1836e778a2da9b31Paul Westbrook ft.addToBackStack(null); 1498081df46ef5a7794374e41cd1836e778a2da9b31Paul Westbrook 1508081df46ef5a7794374e41cd1836e778a2da9b31Paul Westbrook // Create and show the dialog. 1518081df46ef5a7794374e41cd1836e778a2da9b31Paul Westbrook final DialogFragment newFragment = AttachmentProgressDialogFragment.newInstance( 1529e2d407fdafeb874e640eb84017feaf784309075Scott Kennedy mAttachment); 1538081df46ef5a7794374e41cd1836e778a2da9b31Paul Westbrook newFragment.show(ft, PROGRESS_FRAGMENT_TAG); 1544aa1c1340556c646175c3d0b193be05876ad95a0Andrew Sapperstein } 1554aa1c1340556c646175c3d0b193be05876ad95a0Andrew Sapperstein 1564aa1c1340556c646175c3d0b193be05876ad95a0Andrew Sapperstein /** 1574aa1c1340556c646175c3d0b193be05876ad95a0Andrew Sapperstein * Update progress-related views. Will also trigger a view intent if a progress dialog was 1584aa1c1340556c646175c3d0b193be05876ad95a0Andrew Sapperstein * previously brought up (by tapping 'View') and the download has now finished. 1594aa1c1340556c646175c3d0b193be05876ad95a0Andrew Sapperstein */ 1608081df46ef5a7794374e41cd1836e778a2da9b31Paul Westbrook public void updateStatus(boolean loaderResult) { 1617bed4bc31a49a2297a38eb9d7b595fba1fa1f849Mark Wei if (mView == null) { 1627bed4bc31a49a2297a38eb9d7b595fba1fa1f849Mark Wei return; 1637bed4bc31a49a2297a38eb9d7b595fba1fa1f849Mark Wei } 1647bed4bc31a49a2297a38eb9d7b595fba1fa1f849Mark Wei 1654cb51dbce9635f4bf68a6de88f759e2f86d20325Andrew Sapperstein final boolean showProgress = mAttachment.shouldShowProgress(); 1664aa1c1340556c646175c3d0b193be05876ad95a0Andrew Sapperstein 1678081df46ef5a7794374e41cd1836e778a2da9b31Paul Westbrook final AttachmentProgressDialogFragment dialog = (AttachmentProgressDialogFragment) 1688081df46ef5a7794374e41cd1836e778a2da9b31Paul Westbrook mFragmentManager.findFragmentByTag(PROGRESS_FRAGMENT_TAG); 1698081df46ef5a7794374e41cd1836e778a2da9b31Paul Westbrook if (dialog != null && dialog.isShowingDialogForAttachment(mAttachment)) { 1708081df46ef5a7794374e41cd1836e778a2da9b31Paul Westbrook dialog.setProgress(mAttachment.downloadedSize); 171bedcad9e6d89ae2f058138e1aa0446fef4d8f8c7Paul Westbrook 172bedcad9e6d89ae2f058138e1aa0446fef4d8f8c7Paul Westbrook // We don't want the progress bar to switch back to indeterminate mode after 173bedcad9e6d89ae2f058138e1aa0446fef4d8f8c7Paul Westbrook // have been in determinate progress mode. 1748081df46ef5a7794374e41cd1836e778a2da9b31Paul Westbrook final boolean indeterminate = !showProgress && dialog.isIndeterminate(); 1758081df46ef5a7794374e41cd1836e778a2da9b31Paul Westbrook dialog.setIndeterminate(indeterminate); 1768081df46ef5a7794374e41cd1836e778a2da9b31Paul Westbrook 177bbe74aee04f669990e888095b0d6858dc1e17ce1Mark Wei if (loaderResult && mAttachment.isDownloadFinishedOrFailed()) { 1788081df46ef5a7794374e41cd1836e778a2da9b31Paul Westbrook mHandler.post(new Runnable() { 1798081df46ef5a7794374e41cd1836e778a2da9b31Paul Westbrook @Override 1808081df46ef5a7794374e41cd1836e778a2da9b31Paul Westbrook public void run() { 1818081df46ef5a7794374e41cd1836e778a2da9b31Paul Westbrook dialog.dismiss(); 1828081df46ef5a7794374e41cd1836e778a2da9b31Paul Westbrook } 1838081df46ef5a7794374e41cd1836e778a2da9b31Paul Westbrook }); 1844aa1c1340556c646175c3d0b193be05876ad95a0Andrew Sapperstein } 1854aa1c1340556c646175c3d0b193be05876ad95a0Andrew Sapperstein 186519c218db6109003ca72a35ffe276ed69b0230a4Martin Hibdon if (mAttachment.state == AttachmentState.SAVED && mViewOnFinish) { 1874aa1c1340556c646175c3d0b193be05876ad95a0Andrew Sapperstein mView.viewAttachment(); 1884aa1c1340556c646175c3d0b193be05876ad95a0Andrew Sapperstein } 1894aa1c1340556c646175c3d0b193be05876ad95a0Andrew Sapperstein } else { 1904aa1c1340556c646175c3d0b193be05876ad95a0Andrew Sapperstein mView.updateProgress(showProgress); 1914aa1c1340556c646175c3d0b193be05876ad95a0Andrew Sapperstein } 1924aa1c1340556c646175c3d0b193be05876ad95a0Andrew Sapperstein 193532f48253d23ffcb974ab61856df131021dde02aAndrew Sapperstein // Call on update status for the view so that it can do some specific things. 194532f48253d23ffcb974ab61856df131021dde02aAndrew Sapperstein mView.onUpdateStatus(); 195532f48253d23ffcb974ab61856df131021dde02aAndrew Sapperstein } 196532f48253d23ffcb974ab61856df131021dde02aAndrew Sapperstein 197a95161cf364baeea1a9bb098b4f6db961ec8705bAndrew Sapperstein public boolean isProgressDialogVisible() { 1988081df46ef5a7794374e41cd1836e778a2da9b31Paul Westbrook final Fragment dialog = mFragmentManager.findFragmentByTag(PROGRESS_FRAGMENT_TAG); 1998081df46ef5a7794374e41cd1836e778a2da9b31Paul Westbrook return dialog != null && dialog.isVisible(); 200a95161cf364baeea1a9bb098b4f6db961ec8705bAndrew Sapperstein } 201a95161cf364baeea1a9bb098b4f6db961ec8705bAndrew Sapperstein 202532f48253d23ffcb974ab61856df131021dde02aAndrew Sapperstein public void shareAttachment() { 203d2f279ff7f4d257ff268b27be7379d4195354798Sara Ting if (mAttachment.contentUri == null) { 204d2f279ff7f4d257ff268b27be7379d4195354798Sara Ting return; 205d2f279ff7f4d257ff268b27be7379d4195354798Sara Ting } 206d2f279ff7f4d257ff268b27be7379d4195354798Sara Ting 207532f48253d23ffcb974ab61856df131021dde02aAndrew Sapperstein Intent intent = new Intent(Intent.ACTION_SEND); 208532f48253d23ffcb974ab61856df131021dde02aAndrew Sapperstein intent.setFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION 209532f48253d23ffcb974ab61856df131021dde02aAndrew Sapperstein | Intent.FLAG_ACTIVITY_CLEAR_WHEN_TASK_RESET); 210532f48253d23ffcb974ab61856df131021dde02aAndrew Sapperstein 211532f48253d23ffcb974ab61856df131021dde02aAndrew Sapperstein final Uri uri = Utils.normalizeUri(mAttachment.contentUri); 212532f48253d23ffcb974ab61856df131021dde02aAndrew Sapperstein intent.putExtra(Intent.EXTRA_STREAM, uri); 2138750066b10f80e2a8080016973b3296d76d18266Mark Wei intent.setType(Utils.normalizeMimeType(mAttachment.getContentType())); 214532f48253d23ffcb974ab61856df131021dde02aAndrew Sapperstein 215532f48253d23ffcb974ab61856df131021dde02aAndrew Sapperstein try { 216532f48253d23ffcb974ab61856df131021dde02aAndrew Sapperstein mContext.startActivity(intent); 217532f48253d23ffcb974ab61856df131021dde02aAndrew Sapperstein } catch (ActivityNotFoundException e) { 218532f48253d23ffcb974ab61856df131021dde02aAndrew Sapperstein // couldn't find activity for SEND intent 219532f48253d23ffcb974ab61856df131021dde02aAndrew Sapperstein LogUtils.e(LOG_TAG, "Couldn't find Activity for intent", e); 220532f48253d23ffcb974ab61856df131021dde02aAndrew Sapperstein } 221532f48253d23ffcb974ab61856df131021dde02aAndrew Sapperstein } 222532f48253d23ffcb974ab61856df131021dde02aAndrew Sapperstein 223532f48253d23ffcb974ab61856df131021dde02aAndrew Sapperstein public void shareAttachments(ArrayList<Parcelable> uris) { 224532f48253d23ffcb974ab61856df131021dde02aAndrew Sapperstein Intent intent = new Intent(Intent.ACTION_SEND_MULTIPLE); 225532f48253d23ffcb974ab61856df131021dde02aAndrew Sapperstein intent.setFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION 226532f48253d23ffcb974ab61856df131021dde02aAndrew Sapperstein | Intent.FLAG_ACTIVITY_CLEAR_WHEN_TASK_RESET); 227532f48253d23ffcb974ab61856df131021dde02aAndrew Sapperstein 228532f48253d23ffcb974ab61856df131021dde02aAndrew Sapperstein intent.setType("image/*"); 229532f48253d23ffcb974ab61856df131021dde02aAndrew Sapperstein intent.putParcelableArrayListExtra( 230532f48253d23ffcb974ab61856df131021dde02aAndrew Sapperstein Intent.EXTRA_STREAM, uris); 231532f48253d23ffcb974ab61856df131021dde02aAndrew Sapperstein 232532f48253d23ffcb974ab61856df131021dde02aAndrew Sapperstein try { 233532f48253d23ffcb974ab61856df131021dde02aAndrew Sapperstein mContext.startActivity(intent); 234532f48253d23ffcb974ab61856df131021dde02aAndrew Sapperstein } catch (ActivityNotFoundException e) { 235532f48253d23ffcb974ab61856df131021dde02aAndrew Sapperstein // couldn't find activity for SEND_MULTIPLE intent 236532f48253d23ffcb974ab61856df131021dde02aAndrew Sapperstein LogUtils.e(LOG_TAG, "Couldn't find Activity for intent", e); 237532f48253d23ffcb974ab61856df131021dde02aAndrew Sapperstein } 2384aa1c1340556c646175c3d0b193be05876ad95a0Andrew Sapperstein } 2394aa1c1340556c646175c3d0b193be05876ad95a0Andrew Sapperstein} 240