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; 344f347e811052f446c3958c76db278bcd7b39a44fAndy Huangimport com.android.mail.providers.Message; 351aee17e324f204080baaabceb64f4edf73681542Mark Weiimport com.android.mail.providers.UIProvider; 364aa1c1340556c646175c3d0b193be05876ad95a0Andrew Sappersteinimport com.android.mail.providers.UIProvider.AttachmentColumns; 371aee17e324f204080baaabceb64f4edf73681542Mark Weiimport com.android.mail.providers.UIProvider.AttachmentContentValueKeys; 384cb51dbce9635f4bf68a6de88f759e2f86d20325Andrew Sappersteinimport com.android.mail.providers.UIProvider.AttachmentDestination; 394aa1c1340556c646175c3d0b193be05876ad95a0Andrew Sappersteinimport com.android.mail.providers.UIProvider.AttachmentState; 40b334c9035e9b7a38766bb66c29da2208525d1e11Paul Westbrookimport com.android.mail.utils.LogTag; 41532f48253d23ffcb974ab61856df131021dde02aAndrew Sappersteinimport com.android.mail.utils.LogUtils; 42532f48253d23ffcb974ab61856df131021dde02aAndrew Sappersteinimport com.android.mail.utils.Utils; 43532f48253d23ffcb974ab61856df131021dde02aAndrew Sapperstein 44532f48253d23ffcb974ab61856df131021dde02aAndrew Sappersteinimport java.util.ArrayList; 454aa1c1340556c646175c3d0b193be05876ad95a0Andrew Sapperstein 468081df46ef5a7794374e41cd1836e778a2da9b31Paul Westbrookpublic class AttachmentActionHandler { 478081df46ef5a7794374e41cd1836e778a2da9b31Paul Westbrook private static final String PROGRESS_FRAGMENT_TAG = "attachment-progress"; 488081df46ef5a7794374e41cd1836e778a2da9b31Paul Westbrook 494f347e811052f446c3958c76db278bcd7b39a44fAndy Huang private String mAccount; 504f347e811052f446c3958c76db278bcd7b39a44fAndy Huang private Message mMessage; 514aa1c1340556c646175c3d0b193be05876ad95a0Andrew Sapperstein private Attachment mAttachment; 524aa1c1340556c646175c3d0b193be05876ad95a0Andrew Sapperstein 534aa1c1340556c646175c3d0b193be05876ad95a0Andrew Sapperstein private final AttachmentCommandHandler mCommandHandler; 544aa1c1340556c646175c3d0b193be05876ad95a0Andrew Sapperstein private final AttachmentViewInterface mView; 554aa1c1340556c646175c3d0b193be05876ad95a0Andrew Sapperstein private final Context mContext; 568081df46ef5a7794374e41cd1836e778a2da9b31Paul Westbrook private final Handler mHandler; 578081df46ef5a7794374e41cd1836e778a2da9b31Paul Westbrook private FragmentManager mFragmentManager; 58519c218db6109003ca72a35ffe276ed69b0230a4Martin Hibdon private boolean mViewOnFinish; 594aa1c1340556c646175c3d0b193be05876ad95a0Andrew Sapperstein 60b334c9035e9b7a38766bb66c29da2208525d1e11Paul Westbrook private static final String LOG_TAG = LogTag.getLogTag(); 61532f48253d23ffcb974ab61856df131021dde02aAndrew Sapperstein 624f347e811052f446c3958c76db278bcd7b39a44fAndy Huang private static OptionHandler sOptionHandler = new OptionHandler(); 634f347e811052f446c3958c76db278bcd7b39a44fAndy Huang 644aa1c1340556c646175c3d0b193be05876ad95a0Andrew Sapperstein public AttachmentActionHandler(Context context, AttachmentViewInterface view) { 654aa1c1340556c646175c3d0b193be05876ad95a0Andrew Sapperstein mCommandHandler = new AttachmentCommandHandler(context); 664aa1c1340556c646175c3d0b193be05876ad95a0Andrew Sapperstein mView = view; 674aa1c1340556c646175c3d0b193be05876ad95a0Andrew Sapperstein mContext = context; 688081df46ef5a7794374e41cd1836e778a2da9b31Paul Westbrook mHandler = new Handler(); 69519c218db6109003ca72a35ffe276ed69b0230a4Martin Hibdon mViewOnFinish = true; 708081df46ef5a7794374e41cd1836e778a2da9b31Paul Westbrook } 718081df46ef5a7794374e41cd1836e778a2da9b31Paul Westbrook 728081df46ef5a7794374e41cd1836e778a2da9b31Paul Westbrook public void initialize(FragmentManager fragmentManager) { 738081df46ef5a7794374e41cd1836e778a2da9b31Paul Westbrook mFragmentManager = fragmentManager; 744aa1c1340556c646175c3d0b193be05876ad95a0Andrew Sapperstein } 754aa1c1340556c646175c3d0b193be05876ad95a0Andrew Sapperstein 764f347e811052f446c3958c76db278bcd7b39a44fAndy Huang public void setAccount(String account) { 774f347e811052f446c3958c76db278bcd7b39a44fAndy Huang mAccount = account; 784f347e811052f446c3958c76db278bcd7b39a44fAndy Huang } 794f347e811052f446c3958c76db278bcd7b39a44fAndy Huang 804f347e811052f446c3958c76db278bcd7b39a44fAndy Huang public void setMessage(Message message) { 814f347e811052f446c3958c76db278bcd7b39a44fAndy Huang mMessage = message; 824f347e811052f446c3958c76db278bcd7b39a44fAndy Huang } 834f347e811052f446c3958c76db278bcd7b39a44fAndy Huang 844aa1c1340556c646175c3d0b193be05876ad95a0Andrew Sapperstein public void setAttachment(Attachment attachment) { 854aa1c1340556c646175c3d0b193be05876ad95a0Andrew Sapperstein mAttachment = attachment; 864aa1c1340556c646175c3d0b193be05876ad95a0Andrew Sapperstein } 874aa1c1340556c646175c3d0b193be05876ad95a0Andrew Sapperstein 88519c218db6109003ca72a35ffe276ed69b0230a4Martin Hibdon public void setViewOnFinish(boolean viewOnFinish) { 89519c218db6109003ca72a35ffe276ed69b0230a4Martin Hibdon mViewOnFinish = viewOnFinish; 90519c218db6109003ca72a35ffe276ed69b0230a4Martin Hibdon } 91519c218db6109003ca72a35ffe276ed69b0230a4Martin Hibdon 924aa1c1340556c646175c3d0b193be05876ad95a0Andrew Sapperstein public void showAttachment(int destination) { 937bed4bc31a49a2297a38eb9d7b595fba1fa1f849Mark Wei if (mView == null) { 947bed4bc31a49a2297a38eb9d7b595fba1fa1f849Mark Wei return; 957bed4bc31a49a2297a38eb9d7b595fba1fa1f849Mark Wei } 967bed4bc31a49a2297a38eb9d7b595fba1fa1f849Mark Wei 97a25b65e95e90e785012ea4e5ad53408e76e87139Paul Westbrook // If the caller requested that this attachments be saved to the external storage, we should 98a25b65e95e90e785012ea4e5ad53408e76e87139Paul Westbrook // verify that the it was saved there. 99a25b65e95e90e785012ea4e5ad53408e76e87139Paul Westbrook if (mAttachment.isPresentLocally() && 100a25b65e95e90e785012ea4e5ad53408e76e87139Paul Westbrook (destination == AttachmentDestination.CACHE || 101a25b65e95e90e785012ea4e5ad53408e76e87139Paul Westbrook mAttachment.destination == destination)) { 1024aa1c1340556c646175c3d0b193be05876ad95a0Andrew Sapperstein mView.viewAttachment(); 1034aa1c1340556c646175c3d0b193be05876ad95a0Andrew Sapperstein } else { 1049e2d407fdafeb874e640eb84017feaf784309075Scott Kennedy showDownloadingDialog(); 1054aa1c1340556c646175c3d0b193be05876ad95a0Andrew Sapperstein startDownloadingAttachment(destination); 1064aa1c1340556c646175c3d0b193be05876ad95a0Andrew Sapperstein } 1074aa1c1340556c646175c3d0b193be05876ad95a0Andrew Sapperstein } 1084aa1c1340556c646175c3d0b193be05876ad95a0Andrew Sapperstein 1097bed4bc31a49a2297a38eb9d7b595fba1fa1f849Mark Wei /** 1107bed4bc31a49a2297a38eb9d7b595fba1fa1f849Mark Wei * Start downloading the full size attachment set with 1117bed4bc31a49a2297a38eb9d7b595fba1fa1f849Mark Wei * {@link #setAttachment(Attachment)} immediately. 1127bed4bc31a49a2297a38eb9d7b595fba1fa1f849Mark Wei */ 1134aa1c1340556c646175c3d0b193be05876ad95a0Andrew Sapperstein public void startDownloadingAttachment(int destination) { 114267453587f13986acc7de3d52de95184c38fb4e1Mark Wei startDownloadingAttachment(destination, UIProvider.AttachmentRendition.BEST, 0, false); 1151aee17e324f204080baaabceb64f4edf73681542Mark Wei } 1161aee17e324f204080baaabceb64f4edf73681542Mark Wei 117267453587f13986acc7de3d52de95184c38fb4e1Mark Wei public void startDownloadingAttachment( 118267453587f13986acc7de3d52de95184c38fb4e1Mark Wei int destination, int rendition, int additionalPriority, boolean delayDownload) { 119267453587f13986acc7de3d52de95184c38fb4e1Mark Wei startDownloadingAttachment( 120267453587f13986acc7de3d52de95184c38fb4e1Mark Wei mAttachment, destination, rendition, additionalPriority, delayDownload); 1214cb51dbce9635f4bf68a6de88f759e2f86d20325Andrew Sapperstein } 1224cb51dbce9635f4bf68a6de88f759e2f86d20325Andrew Sapperstein 123267453587f13986acc7de3d52de95184c38fb4e1Mark Wei private void startDownloadingAttachment( 124267453587f13986acc7de3d52de95184c38fb4e1Mark Wei Attachment attachment, int destination, int rendition, int additionalPriority, 125267453587f13986acc7de3d52de95184c38fb4e1Mark Wei boolean delayDownload) { 1267434e800d4313a227120ca36bd95683752a7879fAndrew Sapperstein final ContentValues params = new ContentValues(5); 1274aa1c1340556c646175c3d0b193be05876ad95a0Andrew Sapperstein params.put(AttachmentColumns.STATE, AttachmentState.DOWNLOADING); 1284aa1c1340556c646175c3d0b193be05876ad95a0Andrew Sapperstein params.put(AttachmentColumns.DESTINATION, destination); 1291aee17e324f204080baaabceb64f4edf73681542Mark Wei params.put(AttachmentContentValueKeys.RENDITION, rendition); 130267453587f13986acc7de3d52de95184c38fb4e1Mark Wei params.put(AttachmentContentValueKeys.ADDITIONAL_PRIORITY, additionalPriority); 131267453587f13986acc7de3d52de95184c38fb4e1Mark Wei params.put(AttachmentContentValueKeys.DELAY_DOWNLOAD, delayDownload); 1324aa1c1340556c646175c3d0b193be05876ad95a0Andrew Sapperstein 1334cb51dbce9635f4bf68a6de88f759e2f86d20325Andrew Sapperstein mCommandHandler.sendCommand(attachment.uri, params); 1344aa1c1340556c646175c3d0b193be05876ad95a0Andrew Sapperstein } 1354aa1c1340556c646175c3d0b193be05876ad95a0Andrew Sapperstein 1364aa1c1340556c646175c3d0b193be05876ad95a0Andrew Sapperstein public void cancelAttachment() { 1374aa1c1340556c646175c3d0b193be05876ad95a0Andrew Sapperstein final ContentValues params = new ContentValues(1); 1384aa1c1340556c646175c3d0b193be05876ad95a0Andrew Sapperstein params.put(AttachmentColumns.STATE, AttachmentState.NOT_SAVED); 1394aa1c1340556c646175c3d0b193be05876ad95a0Andrew Sapperstein 1404aa1c1340556c646175c3d0b193be05876ad95a0Andrew Sapperstein mCommandHandler.sendCommand(mAttachment.uri, params); 1414aa1c1340556c646175c3d0b193be05876ad95a0Andrew Sapperstein } 1424aa1c1340556c646175c3d0b193be05876ad95a0Andrew Sapperstein 14347ca4e2a4c2d7387a7dd8d1925e2512acc553eabMark Wei public void startRedownloadingAttachment(Attachment attachment) { 14447ca4e2a4c2d7387a7dd8d1925e2512acc553eabMark Wei final ContentValues params = new ContentValues(2); 14547ca4e2a4c2d7387a7dd8d1925e2512acc553eabMark Wei params.put(AttachmentColumns.STATE, AttachmentState.REDOWNLOADING); 14647ca4e2a4c2d7387a7dd8d1925e2512acc553eabMark Wei params.put(AttachmentColumns.DESTINATION, attachment.destination); 14747ca4e2a4c2d7387a7dd8d1925e2512acc553eabMark Wei 14847ca4e2a4c2d7387a7dd8d1925e2512acc553eabMark Wei mCommandHandler.sendCommand(attachment.uri, params); 14947ca4e2a4c2d7387a7dd8d1925e2512acc553eabMark Wei } 15047ca4e2a4c2d7387a7dd8d1925e2512acc553eabMark Wei 1514aa1c1340556c646175c3d0b193be05876ad95a0Andrew Sapperstein /** 1524aa1c1340556c646175c3d0b193be05876ad95a0Andrew Sapperstein * Displays a loading dialog to be used for downloading attachments. 1534aa1c1340556c646175c3d0b193be05876ad95a0Andrew Sapperstein * Must be called on the UI thread. 1544aa1c1340556c646175c3d0b193be05876ad95a0Andrew Sapperstein */ 155ce9db80cf997f99b8c5d0ef8d22b074555aaf795Mark Wei public void showDownloadingDialog() { 1568081df46ef5a7794374e41cd1836e778a2da9b31Paul Westbrook final FragmentTransaction ft = mFragmentManager.beginTransaction(); 1578081df46ef5a7794374e41cd1836e778a2da9b31Paul Westbrook final Fragment prev = mFragmentManager.findFragmentByTag(PROGRESS_FRAGMENT_TAG); 1588081df46ef5a7794374e41cd1836e778a2da9b31Paul Westbrook if (prev != null) { 1598081df46ef5a7794374e41cd1836e778a2da9b31Paul Westbrook ft.remove(prev); 1608081df46ef5a7794374e41cd1836e778a2da9b31Paul Westbrook } 1618081df46ef5a7794374e41cd1836e778a2da9b31Paul Westbrook ft.addToBackStack(null); 1628081df46ef5a7794374e41cd1836e778a2da9b31Paul Westbrook 1638081df46ef5a7794374e41cd1836e778a2da9b31Paul Westbrook // Create and show the dialog. 1648081df46ef5a7794374e41cd1836e778a2da9b31Paul Westbrook final DialogFragment newFragment = AttachmentProgressDialogFragment.newInstance( 1659e2d407fdafeb874e640eb84017feaf784309075Scott Kennedy mAttachment); 1668081df46ef5a7794374e41cd1836e778a2da9b31Paul Westbrook newFragment.show(ft, PROGRESS_FRAGMENT_TAG); 1674aa1c1340556c646175c3d0b193be05876ad95a0Andrew Sapperstein } 1684aa1c1340556c646175c3d0b193be05876ad95a0Andrew Sapperstein 1694aa1c1340556c646175c3d0b193be05876ad95a0Andrew Sapperstein /** 1704aa1c1340556c646175c3d0b193be05876ad95a0Andrew Sapperstein * Update progress-related views. Will also trigger a view intent if a progress dialog was 1714aa1c1340556c646175c3d0b193be05876ad95a0Andrew Sapperstein * previously brought up (by tapping 'View') and the download has now finished. 1724aa1c1340556c646175c3d0b193be05876ad95a0Andrew Sapperstein */ 1738081df46ef5a7794374e41cd1836e778a2da9b31Paul Westbrook public void updateStatus(boolean loaderResult) { 1747bed4bc31a49a2297a38eb9d7b595fba1fa1f849Mark Wei if (mView == null) { 1757bed4bc31a49a2297a38eb9d7b595fba1fa1f849Mark Wei return; 1767bed4bc31a49a2297a38eb9d7b595fba1fa1f849Mark Wei } 1777bed4bc31a49a2297a38eb9d7b595fba1fa1f849Mark Wei 1784cb51dbce9635f4bf68a6de88f759e2f86d20325Andrew Sapperstein final boolean showProgress = mAttachment.shouldShowProgress(); 1794aa1c1340556c646175c3d0b193be05876ad95a0Andrew Sapperstein 1808081df46ef5a7794374e41cd1836e778a2da9b31Paul Westbrook final AttachmentProgressDialogFragment dialog = (AttachmentProgressDialogFragment) 1818081df46ef5a7794374e41cd1836e778a2da9b31Paul Westbrook mFragmentManager.findFragmentByTag(PROGRESS_FRAGMENT_TAG); 1828081df46ef5a7794374e41cd1836e778a2da9b31Paul Westbrook if (dialog != null && dialog.isShowingDialogForAttachment(mAttachment)) { 1838081df46ef5a7794374e41cd1836e778a2da9b31Paul Westbrook dialog.setProgress(mAttachment.downloadedSize); 184bedcad9e6d89ae2f058138e1aa0446fef4d8f8c7Paul Westbrook 185bedcad9e6d89ae2f058138e1aa0446fef4d8f8c7Paul Westbrook // We don't want the progress bar to switch back to indeterminate mode after 186bedcad9e6d89ae2f058138e1aa0446fef4d8f8c7Paul Westbrook // have been in determinate progress mode. 1878081df46ef5a7794374e41cd1836e778a2da9b31Paul Westbrook final boolean indeterminate = !showProgress && dialog.isIndeterminate(); 1888081df46ef5a7794374e41cd1836e778a2da9b31Paul Westbrook dialog.setIndeterminate(indeterminate); 1898081df46ef5a7794374e41cd1836e778a2da9b31Paul Westbrook 190bbe74aee04f669990e888095b0d6858dc1e17ce1Mark Wei if (loaderResult && mAttachment.isDownloadFinishedOrFailed()) { 1918081df46ef5a7794374e41cd1836e778a2da9b31Paul Westbrook mHandler.post(new Runnable() { 1928081df46ef5a7794374e41cd1836e778a2da9b31Paul Westbrook @Override 1938081df46ef5a7794374e41cd1836e778a2da9b31Paul Westbrook public void run() { 1948081df46ef5a7794374e41cd1836e778a2da9b31Paul Westbrook dialog.dismiss(); 1958081df46ef5a7794374e41cd1836e778a2da9b31Paul Westbrook } 1968081df46ef5a7794374e41cd1836e778a2da9b31Paul Westbrook }); 1974aa1c1340556c646175c3d0b193be05876ad95a0Andrew Sapperstein } 1984aa1c1340556c646175c3d0b193be05876ad95a0Andrew Sapperstein 199519c218db6109003ca72a35ffe276ed69b0230a4Martin Hibdon if (mAttachment.state == AttachmentState.SAVED && mViewOnFinish) { 2004aa1c1340556c646175c3d0b193be05876ad95a0Andrew Sapperstein mView.viewAttachment(); 2014aa1c1340556c646175c3d0b193be05876ad95a0Andrew Sapperstein } 2024aa1c1340556c646175c3d0b193be05876ad95a0Andrew Sapperstein } else { 2034aa1c1340556c646175c3d0b193be05876ad95a0Andrew Sapperstein mView.updateProgress(showProgress); 2044aa1c1340556c646175c3d0b193be05876ad95a0Andrew Sapperstein } 2054aa1c1340556c646175c3d0b193be05876ad95a0Andrew Sapperstein 206532f48253d23ffcb974ab61856df131021dde02aAndrew Sapperstein // Call on update status for the view so that it can do some specific things. 207532f48253d23ffcb974ab61856df131021dde02aAndrew Sapperstein mView.onUpdateStatus(); 208532f48253d23ffcb974ab61856df131021dde02aAndrew Sapperstein } 209532f48253d23ffcb974ab61856df131021dde02aAndrew Sapperstein 210a95161cf364baeea1a9bb098b4f6db961ec8705bAndrew Sapperstein public boolean isProgressDialogVisible() { 2118081df46ef5a7794374e41cd1836e778a2da9b31Paul Westbrook final Fragment dialog = mFragmentManager.findFragmentByTag(PROGRESS_FRAGMENT_TAG); 2128081df46ef5a7794374e41cd1836e778a2da9b31Paul Westbrook return dialog != null && dialog.isVisible(); 213a95161cf364baeea1a9bb098b4f6db961ec8705bAndrew Sapperstein } 214a95161cf364baeea1a9bb098b4f6db961ec8705bAndrew Sapperstein 215532f48253d23ffcb974ab61856df131021dde02aAndrew Sapperstein public void shareAttachment() { 216d2f279ff7f4d257ff268b27be7379d4195354798Sara Ting if (mAttachment.contentUri == null) { 217d2f279ff7f4d257ff268b27be7379d4195354798Sara Ting return; 218d2f279ff7f4d257ff268b27be7379d4195354798Sara Ting } 219d2f279ff7f4d257ff268b27be7379d4195354798Sara Ting 220532f48253d23ffcb974ab61856df131021dde02aAndrew Sapperstein Intent intent = new Intent(Intent.ACTION_SEND); 221532f48253d23ffcb974ab61856df131021dde02aAndrew Sapperstein intent.setFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION 222532f48253d23ffcb974ab61856df131021dde02aAndrew Sapperstein | Intent.FLAG_ACTIVITY_CLEAR_WHEN_TASK_RESET); 223532f48253d23ffcb974ab61856df131021dde02aAndrew Sapperstein 224532f48253d23ffcb974ab61856df131021dde02aAndrew Sapperstein final Uri uri = Utils.normalizeUri(mAttachment.contentUri); 225532f48253d23ffcb974ab61856df131021dde02aAndrew Sapperstein intent.putExtra(Intent.EXTRA_STREAM, uri); 2268750066b10f80e2a8080016973b3296d76d18266Mark Wei intent.setType(Utils.normalizeMimeType(mAttachment.getContentType())); 227532f48253d23ffcb974ab61856df131021dde02aAndrew Sapperstein 228532f48253d23ffcb974ab61856df131021dde02aAndrew Sapperstein try { 229532f48253d23ffcb974ab61856df131021dde02aAndrew Sapperstein mContext.startActivity(intent); 230532f48253d23ffcb974ab61856df131021dde02aAndrew Sapperstein } catch (ActivityNotFoundException e) { 231532f48253d23ffcb974ab61856df131021dde02aAndrew Sapperstein // couldn't find activity for SEND intent 232532f48253d23ffcb974ab61856df131021dde02aAndrew Sapperstein LogUtils.e(LOG_TAG, "Couldn't find Activity for intent", e); 233532f48253d23ffcb974ab61856df131021dde02aAndrew Sapperstein } 234532f48253d23ffcb974ab61856df131021dde02aAndrew Sapperstein } 235532f48253d23ffcb974ab61856df131021dde02aAndrew Sapperstein 236532f48253d23ffcb974ab61856df131021dde02aAndrew Sapperstein public void shareAttachments(ArrayList<Parcelable> uris) { 237532f48253d23ffcb974ab61856df131021dde02aAndrew Sapperstein Intent intent = new Intent(Intent.ACTION_SEND_MULTIPLE); 238532f48253d23ffcb974ab61856df131021dde02aAndrew Sapperstein intent.setFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION 239532f48253d23ffcb974ab61856df131021dde02aAndrew Sapperstein | Intent.FLAG_ACTIVITY_CLEAR_WHEN_TASK_RESET); 240532f48253d23ffcb974ab61856df131021dde02aAndrew Sapperstein 241532f48253d23ffcb974ab61856df131021dde02aAndrew Sapperstein intent.setType("image/*"); 242532f48253d23ffcb974ab61856df131021dde02aAndrew Sapperstein intent.putParcelableArrayListExtra( 243532f48253d23ffcb974ab61856df131021dde02aAndrew Sapperstein Intent.EXTRA_STREAM, uris); 244532f48253d23ffcb974ab61856df131021dde02aAndrew Sapperstein 245532f48253d23ffcb974ab61856df131021dde02aAndrew Sapperstein try { 246532f48253d23ffcb974ab61856df131021dde02aAndrew Sapperstein mContext.startActivity(intent); 247532f48253d23ffcb974ab61856df131021dde02aAndrew Sapperstein } catch (ActivityNotFoundException e) { 248532f48253d23ffcb974ab61856df131021dde02aAndrew Sapperstein // couldn't find activity for SEND_MULTIPLE intent 249532f48253d23ffcb974ab61856df131021dde02aAndrew Sapperstein LogUtils.e(LOG_TAG, "Couldn't find Activity for intent", e); 250532f48253d23ffcb974ab61856df131021dde02aAndrew Sapperstein } 2514aa1c1340556c646175c3d0b193be05876ad95a0Andrew Sapperstein } 2524f347e811052f446c3958c76db278bcd7b39a44fAndy Huang 2534f347e811052f446c3958c76db278bcd7b39a44fAndy Huang public static void setOptionHandler(OptionHandler handler) { 2544f347e811052f446c3958c76db278bcd7b39a44fAndy Huang sOptionHandler = handler; 2554f347e811052f446c3958c76db278bcd7b39a44fAndy Huang } 2564f347e811052f446c3958c76db278bcd7b39a44fAndy Huang 257a00a413f293b73b8b6d16c0707d08f881fd92e1cMartin Hibdon public boolean shouldShowExtraOption1(final String accountType, final String mimeType) { 258a00a413f293b73b8b6d16c0707d08f881fd92e1cMartin Hibdon return (sOptionHandler != null) && sOptionHandler.shouldShowExtraOption1( 259a00a413f293b73b8b6d16c0707d08f881fd92e1cMartin Hibdon accountType, mimeType); 2604f347e811052f446c3958c76db278bcd7b39a44fAndy Huang } 2614f347e811052f446c3958c76db278bcd7b39a44fAndy Huang 2624f347e811052f446c3958c76db278bcd7b39a44fAndy Huang public void handleOption1() { 2634f347e811052f446c3958c76db278bcd7b39a44fAndy Huang if (sOptionHandler == null) { 2644f347e811052f446c3958c76db278bcd7b39a44fAndy Huang return; 2654f347e811052f446c3958c76db278bcd7b39a44fAndy Huang } 2664f347e811052f446c3958c76db278bcd7b39a44fAndy Huang sOptionHandler.handleOption1(mContext, mAccount, mMessage, mAttachment, mFragmentManager); 2674f347e811052f446c3958c76db278bcd7b39a44fAndy Huang } 2684f347e811052f446c3958c76db278bcd7b39a44fAndy Huang 2694f347e811052f446c3958c76db278bcd7b39a44fAndy Huang /** 2704f347e811052f446c3958c76db278bcd7b39a44fAndy Huang * A default, no-op option class. Override this and set it globally with 2714f347e811052f446c3958c76db278bcd7b39a44fAndy Huang * {@link AttachmentActionHandler#setOptionHandler(OptionHandler)}.<br> 2724f347e811052f446c3958c76db278bcd7b39a44fAndy Huang * <br> 2734f347e811052f446c3958c76db278bcd7b39a44fAndy Huang * Subclasses of this type will live pretty much forever, so really, really try to avoid 2744f347e811052f446c3958c76db278bcd7b39a44fAndy Huang * keeping any state as member variables in them. 2754f347e811052f446c3958c76db278bcd7b39a44fAndy Huang */ 2764f347e811052f446c3958c76db278bcd7b39a44fAndy Huang public static class OptionHandler { 2774f347e811052f446c3958c76db278bcd7b39a44fAndy Huang 278a00a413f293b73b8b6d16c0707d08f881fd92e1cMartin Hibdon public boolean shouldShowExtraOption1(String accountType, String mimeType) { 2794f347e811052f446c3958c76db278bcd7b39a44fAndy Huang return false; 2804f347e811052f446c3958c76db278bcd7b39a44fAndy Huang } 2814f347e811052f446c3958c76db278bcd7b39a44fAndy Huang 2824f347e811052f446c3958c76db278bcd7b39a44fAndy Huang public void handleOption1(Context context, String account, Message message, 2834f347e811052f446c3958c76db278bcd7b39a44fAndy Huang Attachment attachment, FragmentManager fm) { 2844f347e811052f446c3958c76db278bcd7b39a44fAndy Huang // no-op 2854f347e811052f446c3958c76db278bcd7b39a44fAndy Huang } 286381c322eb30c39f63a2bb82812d63262eb3c1c1cAndrew Sapperstein } 2874aa1c1340556c646175c3d0b193be05876ad95a0Andrew Sapperstein} 288