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