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