10feb439af71976a0e4b35f94f9ac27d7d7bc64ddAndrew Sapperstein/*
20feb439af71976a0e4b35f94f9ac27d7d7bc64ddAndrew Sapperstein * Copyright (C) 2014 Google Inc.
30feb439af71976a0e4b35f94f9ac27d7d7bc64ddAndrew Sapperstein * Licensed to The Android Open Source Project.
40feb439af71976a0e4b35f94f9ac27d7d7bc64ddAndrew Sapperstein *
50feb439af71976a0e4b35f94f9ac27d7d7bc64ddAndrew Sapperstein * Licensed under the Apache License, Version 2.0 (the "License");
60feb439af71976a0e4b35f94f9ac27d7d7bc64ddAndrew Sapperstein * you may not use this file except in compliance with the License.
70feb439af71976a0e4b35f94f9ac27d7d7bc64ddAndrew Sapperstein * You may obtain a copy of the License at
80feb439af71976a0e4b35f94f9ac27d7d7bc64ddAndrew Sapperstein *
90feb439af71976a0e4b35f94f9ac27d7d7bc64ddAndrew Sapperstein *      http://www.apache.org/licenses/LICENSE-2.0
100feb439af71976a0e4b35f94f9ac27d7d7bc64ddAndrew Sapperstein *
110feb439af71976a0e4b35f94f9ac27d7d7bc64ddAndrew Sapperstein * Unless required by applicable law or agreed to in writing, software
120feb439af71976a0e4b35f94f9ac27d7d7bc64ddAndrew Sapperstein * distributed under the License is distributed on an "AS IS" BASIS,
130feb439af71976a0e4b35f94f9ac27d7d7bc64ddAndrew Sapperstein * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
140feb439af71976a0e4b35f94f9ac27d7d7bc64ddAndrew Sapperstein * See the License for the specific language governing permissions and
150feb439af71976a0e4b35f94f9ac27d7d7bc64ddAndrew Sapperstein * limitations under the License.
160feb439af71976a0e4b35f94f9ac27d7d7bc64ddAndrew Sapperstein */
170feb439af71976a0e4b35f94f9ac27d7d7bc64ddAndrew Sapperstein
180feb439af71976a0e4b35f94f9ac27d7d7bc64ddAndrew Sappersteinpackage com.android.mail.photo;
190feb439af71976a0e4b35f94f9ac27d7d7bc64ddAndrew Sapperstein
200feb439af71976a0e4b35f94f9ac27d7d7bc64ddAndrew Sappersteinimport android.app.FragmentManager;
210feb439af71976a0e4b35f94f9ac27d7d7bc64ddAndrew Sappersteinimport android.content.Context;
220feb439af71976a0e4b35f94f9ac27d7d7bc64ddAndrew Sappersteinimport android.content.Intent;
230feb439af71976a0e4b35f94f9ac27d7d7bc64ddAndrew Sappersteinimport android.database.Cursor;
240feb439af71976a0e4b35f94f9ac27d7d7bc64ddAndrew Sappersteinimport android.os.Bundle;
250feb439af71976a0e4b35f94f9ac27d7d7bc64ddAndrew Sappersteinimport android.os.Parcelable;
260feb439af71976a0e4b35f94f9ac27d7d7bc64ddAndrew Sappersteinimport android.support.v4.print.PrintHelper;
270feb439af71976a0e4b35f94f9ac27d7d7bc64ddAndrew Sappersteinimport android.view.Menu;
280feb439af71976a0e4b35f94f9ac27d7d7bc64ddAndrew Sappersteinimport android.view.MenuInflater;
290feb439af71976a0e4b35f94f9ac27d7d7bc64ddAndrew Sappersteinimport android.view.MenuItem;
300feb439af71976a0e4b35f94f9ac27d7d7bc64ddAndrew Sappersteinimport android.view.View;
310feb439af71976a0e4b35f94f9ac27d7d7bc64ddAndrew Sappersteinimport android.widget.ImageView;
320feb439af71976a0e4b35f94f9ac27d7d7bc64ddAndrew Sappersteinimport android.widget.TextView;
330feb439af71976a0e4b35f94f9ac27d7d7bc64ddAndrew Sapperstein
340feb439af71976a0e4b35f94f9ac27d7d7bc64ddAndrew Sappersteinimport com.android.ex.photo.ActionBarInterface;
350feb439af71976a0e4b35f94f9ac27d7d7bc64ddAndrew Sappersteinimport com.android.ex.photo.PhotoViewController;
360feb439af71976a0e4b35f94f9ac27d7d7bc64ddAndrew Sappersteinimport com.android.ex.photo.fragments.PhotoViewFragment;
370feb439af71976a0e4b35f94f9ac27d7d7bc64ddAndrew Sappersteinimport com.android.ex.photo.views.ProgressBarWrapper;
380feb439af71976a0e4b35f94f9ac27d7d7bc64ddAndrew Sappersteinimport com.android.mail.R;
390feb439af71976a0e4b35f94f9ac27d7d7bc64ddAndrew Sappersteinimport com.android.mail.analytics.Analytics;
400feb439af71976a0e4b35f94f9ac27d7d7bc64ddAndrew Sappersteinimport com.android.mail.browse.AttachmentActionHandler;
410feb439af71976a0e4b35f94f9ac27d7d7bc64ddAndrew Sappersteinimport com.android.mail.print.PrintUtils;
420feb439af71976a0e4b35f94f9ac27d7d7bc64ddAndrew Sappersteinimport com.android.mail.providers.Attachment;
430feb439af71976a0e4b35f94f9ac27d7d7bc64ddAndrew Sappersteinimport com.android.mail.providers.Message;
440feb439af71976a0e4b35f94f9ac27d7d7bc64ddAndrew Sappersteinimport com.android.mail.providers.UIProvider;
450feb439af71976a0e4b35f94f9ac27d7d7bc64ddAndrew Sappersteinimport com.android.mail.utils.AttachmentUtils;
460feb439af71976a0e4b35f94f9ac27d7d7bc64ddAndrew Sappersteinimport com.android.mail.utils.LogTag;
470feb439af71976a0e4b35f94f9ac27d7d7bc64ddAndrew Sappersteinimport com.android.mail.utils.LogUtils;
480feb439af71976a0e4b35f94f9ac27d7d7bc64ddAndrew Sappersteinimport com.android.mail.utils.Utils;
490feb439af71976a0e4b35f94f9ac27d7d7bc64ddAndrew Sappersteinimport com.google.common.collect.Lists;
500feb439af71976a0e4b35f94f9ac27d7d7bc64ddAndrew Sapperstein
510feb439af71976a0e4b35f94f9ac27d7d7bc64ddAndrew Sappersteinimport java.io.FileNotFoundException;
520feb439af71976a0e4b35f94f9ac27d7d7bc64ddAndrew Sappersteinimport java.util.ArrayList;
530feb439af71976a0e4b35f94f9ac27d7d7bc64ddAndrew Sappersteinimport java.util.List;
540feb439af71976a0e4b35f94f9ac27d7d7bc64ddAndrew Sapperstein
550feb439af71976a0e4b35f94f9ac27d7d7bc64ddAndrew Sapperstein/**
560feb439af71976a0e4b35f94f9ac27d7d7bc64ddAndrew Sapperstein * Derives from {@link PhotoViewController} to customize behavior
570feb439af71976a0e4b35f94f9ac27d7d7bc64ddAndrew Sapperstein * for UnifiedEmail's implementation of the photoviewer.
580feb439af71976a0e4b35f94f9ac27d7d7bc64ddAndrew Sapperstein * All of the work is actually performed here.
590feb439af71976a0e4b35f94f9ac27d7d7bc64ddAndrew Sapperstein */
600feb439af71976a0e4b35f94f9ac27d7d7bc64ddAndrew Sappersteinpublic class MailPhotoViewController extends PhotoViewController {
610feb439af71976a0e4b35f94f9ac27d7d7bc64ddAndrew Sapperstein
620feb439af71976a0e4b35f94f9ac27d7d7bc64ddAndrew Sapperstein    public interface ActivityInterface extends PhotoViewController.ActivityInterface {
630feb439af71976a0e4b35f94f9ac27d7d7bc64ddAndrew Sapperstein        FragmentManager getFragmentManager();
640feb439af71976a0e4b35f94f9ac27d7d7bc64ddAndrew Sapperstein        MenuInflater getMenuInflater();
650feb439af71976a0e4b35f94f9ac27d7d7bc64ddAndrew Sapperstein    }
660feb439af71976a0e4b35f94f9ac27d7d7bc64ddAndrew Sapperstein
670feb439af71976a0e4b35f94f9ac27d7d7bc64ddAndrew Sapperstein    private final ActivityInterface mMailActivity;
680feb439af71976a0e4b35f94f9ac27d7d7bc64ddAndrew Sapperstein
690feb439af71976a0e4b35f94f9ac27d7d7bc64ddAndrew Sapperstein    private static final String LOG_TAG = LogTag.getLogTag();
700feb439af71976a0e4b35f94f9ac27d7d7bc64ddAndrew Sapperstein
71a00a413f293b73b8b6d16c0707d08f881fd92e1cMartin Hibdon    private String mAccountType;
720feb439af71976a0e4b35f94f9ac27d7d7bc64ddAndrew Sapperstein    private MenuItem mSaveItem;
730feb439af71976a0e4b35f94f9ac27d7d7bc64ddAndrew Sapperstein    private MenuItem mSaveAllItem;
740feb439af71976a0e4b35f94f9ac27d7d7bc64ddAndrew Sapperstein    private MenuItem mShareItem;
750feb439af71976a0e4b35f94f9ac27d7d7bc64ddAndrew Sapperstein    private MenuItem mShareAllItem;
760feb439af71976a0e4b35f94f9ac27d7d7bc64ddAndrew Sapperstein    private MenuItem mPrintItem;
770feb439af71976a0e4b35f94f9ac27d7d7bc64ddAndrew Sapperstein    /**
780feb439af71976a0e4b35f94f9ac27d7d7bc64ddAndrew Sapperstein     * Only for attachments that are currently downloading. Attachments that failed show the
790feb439af71976a0e4b35f94f9ac27d7d7bc64ddAndrew Sapperstein     * retry button.
800feb439af71976a0e4b35f94f9ac27d7d7bc64ddAndrew Sapperstein     */
810feb439af71976a0e4b35f94f9ac27d7d7bc64ddAndrew Sapperstein    private MenuItem mDownloadAgainItem;
820feb439af71976a0e4b35f94f9ac27d7d7bc64ddAndrew Sapperstein    private MenuItem mExtraOption1Item;
830feb439af71976a0e4b35f94f9ac27d7d7bc64ddAndrew Sapperstein    protected AttachmentActionHandler mActionHandler;
840feb439af71976a0e4b35f94f9ac27d7d7bc64ddAndrew Sapperstein    private Menu mMenu;
850feb439af71976a0e4b35f94f9ac27d7d7bc64ddAndrew Sapperstein
860feb439af71976a0e4b35f94f9ac27d7d7bc64ddAndrew Sapperstein    private boolean mHideExtraOptionOne;
870feb439af71976a0e4b35f94f9ac27d7d7bc64ddAndrew Sapperstein
880feb439af71976a0e4b35f94f9ac27d7d7bc64ddAndrew Sapperstein    public MailPhotoViewController(ActivityInterface activity) {
890feb439af71976a0e4b35f94f9ac27d7d7bc64ddAndrew Sapperstein        super(activity);
900feb439af71976a0e4b35f94f9ac27d7d7bc64ddAndrew Sapperstein        mMailActivity = activity;
910feb439af71976a0e4b35f94f9ac27d7d7bc64ddAndrew Sapperstein    }
920feb439af71976a0e4b35f94f9ac27d7d7bc64ddAndrew Sapperstein
930feb439af71976a0e4b35f94f9ac27d7d7bc64ddAndrew Sapperstein    @Override
940feb439af71976a0e4b35f94f9ac27d7d7bc64ddAndrew Sapperstein    public void onCreate(Bundle savedInstanceState) {
950feb439af71976a0e4b35f94f9ac27d7d7bc64ddAndrew Sapperstein        super.onCreate(savedInstanceState);
960feb439af71976a0e4b35f94f9ac27d7d7bc64ddAndrew Sapperstein
970feb439af71976a0e4b35f94f9ac27d7d7bc64ddAndrew Sapperstein        mActionHandler = new AttachmentActionHandler(mMailActivity.getContext(), null);
980feb439af71976a0e4b35f94f9ac27d7d7bc64ddAndrew Sapperstein        mActionHandler.initialize(mMailActivity.getFragmentManager());
990feb439af71976a0e4b35f94f9ac27d7d7bc64ddAndrew Sapperstein
1000feb439af71976a0e4b35f94f9ac27d7d7bc64ddAndrew Sapperstein        final Intent intent = mMailActivity.getIntent();
101a00a413f293b73b8b6d16c0707d08f881fd92e1cMartin Hibdon        mAccountType = intent.getStringExtra(MailPhotoViewActivity.EXTRA_ACCOUNT_TYPE);
1020feb439af71976a0e4b35f94f9ac27d7d7bc64ddAndrew Sapperstein        final String account = intent.getStringExtra(MailPhotoViewActivity.EXTRA_ACCOUNT);
1030feb439af71976a0e4b35f94f9ac27d7d7bc64ddAndrew Sapperstein        final Message msg = intent.getParcelableExtra(MailPhotoViewActivity.EXTRA_MESSAGE);
1040feb439af71976a0e4b35f94f9ac27d7d7bc64ddAndrew Sapperstein        mHideExtraOptionOne = intent.getBooleanExtra(
1050feb439af71976a0e4b35f94f9ac27d7d7bc64ddAndrew Sapperstein                MailPhotoViewActivity.EXTRA_HIDE_EXTRA_OPTION_ONE, false);
1060feb439af71976a0e4b35f94f9ac27d7d7bc64ddAndrew Sapperstein        mActionHandler.setAccount(account);
1070feb439af71976a0e4b35f94f9ac27d7d7bc64ddAndrew Sapperstein        mActionHandler.setMessage(msg);
1080feb439af71976a0e4b35f94f9ac27d7d7bc64ddAndrew Sapperstein    }
1090feb439af71976a0e4b35f94f9ac27d7d7bc64ddAndrew Sapperstein
1100feb439af71976a0e4b35f94f9ac27d7d7bc64ddAndrew Sapperstein    @Override
1110feb439af71976a0e4b35f94f9ac27d7d7bc64ddAndrew Sapperstein    public boolean onCreateOptionsMenu(Menu menu) {
1120feb439af71976a0e4b35f94f9ac27d7d7bc64ddAndrew Sapperstein        MenuInflater inflater = mMailActivity.getMenuInflater();
1130feb439af71976a0e4b35f94f9ac27d7d7bc64ddAndrew Sapperstein
1140feb439af71976a0e4b35f94f9ac27d7d7bc64ddAndrew Sapperstein        inflater.inflate(R.menu.photo_view_menu, menu);
1150feb439af71976a0e4b35f94f9ac27d7d7bc64ddAndrew Sapperstein        mMenu = menu;
1160feb439af71976a0e4b35f94f9ac27d7d7bc64ddAndrew Sapperstein
1170feb439af71976a0e4b35f94f9ac27d7d7bc64ddAndrew Sapperstein        mSaveItem = mMenu.findItem(R.id.menu_save);
1180feb439af71976a0e4b35f94f9ac27d7d7bc64ddAndrew Sapperstein        mSaveAllItem = mMenu.findItem(R.id.menu_save_all);
1190feb439af71976a0e4b35f94f9ac27d7d7bc64ddAndrew Sapperstein        mShareItem = mMenu.findItem(R.id.menu_share);
1200feb439af71976a0e4b35f94f9ac27d7d7bc64ddAndrew Sapperstein        mShareAllItem = mMenu.findItem(R.id.menu_share_all);
1210feb439af71976a0e4b35f94f9ac27d7d7bc64ddAndrew Sapperstein        mPrintItem = mMenu.findItem(R.id.menu_print);
1220feb439af71976a0e4b35f94f9ac27d7d7bc64ddAndrew Sapperstein        mDownloadAgainItem = mMenu.findItem(R.id.menu_download_again);
1230feb439af71976a0e4b35f94f9ac27d7d7bc64ddAndrew Sapperstein        mExtraOption1Item = mMenu.findItem(R.id.attachment_extra_option1);
1240feb439af71976a0e4b35f94f9ac27d7d7bc64ddAndrew Sapperstein
1250feb439af71976a0e4b35f94f9ac27d7d7bc64ddAndrew Sapperstein        return true;
1260feb439af71976a0e4b35f94f9ac27d7d7bc64ddAndrew Sapperstein    }
1270feb439af71976a0e4b35f94f9ac27d7d7bc64ddAndrew Sapperstein
1280feb439af71976a0e4b35f94f9ac27d7d7bc64ddAndrew Sapperstein    @Override
1290feb439af71976a0e4b35f94f9ac27d7d7bc64ddAndrew Sapperstein    public boolean onPrepareOptionsMenu(Menu menu) {
1300feb439af71976a0e4b35f94f9ac27d7d7bc64ddAndrew Sapperstein        updateActionItems();
1310feb439af71976a0e4b35f94f9ac27d7d7bc64ddAndrew Sapperstein        return true;
1320feb439af71976a0e4b35f94f9ac27d7d7bc64ddAndrew Sapperstein    }
1330feb439af71976a0e4b35f94f9ac27d7d7bc64ddAndrew Sapperstein
1340feb439af71976a0e4b35f94f9ac27d7d7bc64ddAndrew Sapperstein    @Override
1350feb439af71976a0e4b35f94f9ac27d7d7bc64ddAndrew Sapperstein    public boolean onOptionsItemSelected(MenuItem item) {
1360feb439af71976a0e4b35f94f9ac27d7d7bc64ddAndrew Sapperstein        final int itemId = item.getItemId();
1370feb439af71976a0e4b35f94f9ac27d7d7bc64ddAndrew Sapperstein
1380feb439af71976a0e4b35f94f9ac27d7d7bc64ddAndrew Sapperstein        Analytics.getInstance().sendMenuItemEvent(Analytics.EVENT_CATEGORY_MENU_ITEM, itemId,
1390feb439af71976a0e4b35f94f9ac27d7d7bc64ddAndrew Sapperstein                "photo_viewer", 0);
1400feb439af71976a0e4b35f94f9ac27d7d7bc64ddAndrew Sapperstein
1410feb439af71976a0e4b35f94f9ac27d7d7bc64ddAndrew Sapperstein        if (itemId == android.R.id.home) {
1420feb439af71976a0e4b35f94f9ac27d7d7bc64ddAndrew Sapperstein            // app icon in action bar clicked; go back to conversation
1430feb439af71976a0e4b35f94f9ac27d7d7bc64ddAndrew Sapperstein            mMailActivity.finish();
1440feb439af71976a0e4b35f94f9ac27d7d7bc64ddAndrew Sapperstein        } else if (itemId == R.id.menu_save) { // save the current photo
1450feb439af71976a0e4b35f94f9ac27d7d7bc64ddAndrew Sapperstein            saveAttachment();
1460feb439af71976a0e4b35f94f9ac27d7d7bc64ddAndrew Sapperstein        } else if (itemId == R.id.menu_save_all) { // save all of the photos
1470feb439af71976a0e4b35f94f9ac27d7d7bc64ddAndrew Sapperstein            saveAllAttachments();
1480feb439af71976a0e4b35f94f9ac27d7d7bc64ddAndrew Sapperstein        } else if (itemId == R.id.menu_share) { // share the current photo
1490feb439af71976a0e4b35f94f9ac27d7d7bc64ddAndrew Sapperstein            shareAttachment();
1500feb439af71976a0e4b35f94f9ac27d7d7bc64ddAndrew Sapperstein        } else if (itemId == R.id.menu_share_all) { // share all of the photos
1510feb439af71976a0e4b35f94f9ac27d7d7bc64ddAndrew Sapperstein            shareAllAttachments();
1520feb439af71976a0e4b35f94f9ac27d7d7bc64ddAndrew Sapperstein        } else if (itemId == R.id.menu_print) { // print the current photo
1530feb439af71976a0e4b35f94f9ac27d7d7bc64ddAndrew Sapperstein            printAttachment();
1540feb439af71976a0e4b35f94f9ac27d7d7bc64ddAndrew Sapperstein        } else if (itemId == R.id.menu_download_again) { // redownload the current photo
1550feb439af71976a0e4b35f94f9ac27d7d7bc64ddAndrew Sapperstein            redownloadAttachment();
1560feb439af71976a0e4b35f94f9ac27d7d7bc64ddAndrew Sapperstein        } else if (itemId == R.id.attachment_extra_option1) {
1570feb439af71976a0e4b35f94f9ac27d7d7bc64ddAndrew Sapperstein            mActionHandler.setAttachment(getCurrentAttachment());
1580feb439af71976a0e4b35f94f9ac27d7d7bc64ddAndrew Sapperstein            mActionHandler.handleOption1();
1590feb439af71976a0e4b35f94f9ac27d7d7bc64ddAndrew Sapperstein        } else {
1600feb439af71976a0e4b35f94f9ac27d7d7bc64ddAndrew Sapperstein            return super.onOptionsItemSelected(item);
1610feb439af71976a0e4b35f94f9ac27d7d7bc64ddAndrew Sapperstein        }
1620feb439af71976a0e4b35f94f9ac27d7d7bc64ddAndrew Sapperstein        return true;
1630feb439af71976a0e4b35f94f9ac27d7d7bc64ddAndrew Sapperstein    }
1640feb439af71976a0e4b35f94f9ac27d7d7bc64ddAndrew Sapperstein
1650feb439af71976a0e4b35f94f9ac27d7d7bc64ddAndrew Sapperstein    /**
1660feb439af71976a0e4b35f94f9ac27d7d7bc64ddAndrew Sapperstein     * Updates the action items to tweak their visibility in case
1670feb439af71976a0e4b35f94f9ac27d7d7bc64ddAndrew Sapperstein     * there is functionality that is not relevant (eg, the Save
1680feb439af71976a0e4b35f94f9ac27d7d7bc64ddAndrew Sapperstein     * button should not appear if the photo has already been saved).
1690feb439af71976a0e4b35f94f9ac27d7d7bc64ddAndrew Sapperstein     */
1700feb439af71976a0e4b35f94f9ac27d7d7bc64ddAndrew Sapperstein    @Override
1710feb439af71976a0e4b35f94f9ac27d7d7bc64ddAndrew Sapperstein    public void updateActionItems() {
1720feb439af71976a0e4b35f94f9ac27d7d7bc64ddAndrew Sapperstein        final Attachment attachment = getCurrentAttachment();
1730feb439af71976a0e4b35f94f9ac27d7d7bc64ddAndrew Sapperstein
1740feb439af71976a0e4b35f94f9ac27d7d7bc64ddAndrew Sapperstein        if (attachment != null && mSaveItem != null && mShareItem != null) {
1750feb439af71976a0e4b35f94f9ac27d7d7bc64ddAndrew Sapperstein            mSaveItem.setEnabled(!attachment.isDownloading()
1760feb439af71976a0e4b35f94f9ac27d7d7bc64ddAndrew Sapperstein                    && attachment.canSave() && !attachment.isSavedToExternal());
1770feb439af71976a0e4b35f94f9ac27d7d7bc64ddAndrew Sapperstein            final boolean canShare = attachment.canShare();
1780feb439af71976a0e4b35f94f9ac27d7d7bc64ddAndrew Sapperstein            mShareItem.setEnabled(canShare);
1790feb439af71976a0e4b35f94f9ac27d7d7bc64ddAndrew Sapperstein            mPrintItem.setEnabled(canShare);
1800feb439af71976a0e4b35f94f9ac27d7d7bc64ddAndrew Sapperstein            mDownloadAgainItem.setEnabled(attachment.canSave() && attachment.isDownloading());
181a00a413f293b73b8b6d16c0707d08f881fd92e1cMartin Hibdon            mExtraOption1Item.setVisible(!mHideExtraOptionOne &&
182a00a413f293b73b8b6d16c0707d08f881fd92e1cMartin Hibdon                    mActionHandler.shouldShowExtraOption1(mAccountType,
183a00a413f293b73b8b6d16c0707d08f881fd92e1cMartin Hibdon                            attachment.getContentType()));
1840feb439af71976a0e4b35f94f9ac27d7d7bc64ddAndrew Sapperstein        } else {
1850feb439af71976a0e4b35f94f9ac27d7d7bc64ddAndrew Sapperstein            if (mMenu != null) {
1860feb439af71976a0e4b35f94f9ac27d7d7bc64ddAndrew Sapperstein                mMenu.setGroupEnabled(R.id.photo_view_menu_group, false);
1870feb439af71976a0e4b35f94f9ac27d7d7bc64ddAndrew Sapperstein            }
1880feb439af71976a0e4b35f94f9ac27d7d7bc64ddAndrew Sapperstein            return;
1890feb439af71976a0e4b35f94f9ac27d7d7bc64ddAndrew Sapperstein        }
1900feb439af71976a0e4b35f94f9ac27d7d7bc64ddAndrew Sapperstein
1910feb439af71976a0e4b35f94f9ac27d7d7bc64ddAndrew Sapperstein        List<Attachment> attachments = getAllAttachments();
1920feb439af71976a0e4b35f94f9ac27d7d7bc64ddAndrew Sapperstein        if (attachments != null) {
1930feb439af71976a0e4b35f94f9ac27d7d7bc64ddAndrew Sapperstein            boolean enabled = false;
1940feb439af71976a0e4b35f94f9ac27d7d7bc64ddAndrew Sapperstein            for (final Attachment a : attachments) {
1950feb439af71976a0e4b35f94f9ac27d7d7bc64ddAndrew Sapperstein                // If one attachment can be saved, enable save all
1960feb439af71976a0e4b35f94f9ac27d7d7bc64ddAndrew Sapperstein                if (!a.isDownloading() && a.canSave() && !a.isSavedToExternal()) {
1970feb439af71976a0e4b35f94f9ac27d7d7bc64ddAndrew Sapperstein                    enabled = true;
1980feb439af71976a0e4b35f94f9ac27d7d7bc64ddAndrew Sapperstein                    break;
1990feb439af71976a0e4b35f94f9ac27d7d7bc64ddAndrew Sapperstein                }
2000feb439af71976a0e4b35f94f9ac27d7d7bc64ddAndrew Sapperstein            }
2010feb439af71976a0e4b35f94f9ac27d7d7bc64ddAndrew Sapperstein            mSaveAllItem.setEnabled(enabled);
2020feb439af71976a0e4b35f94f9ac27d7d7bc64ddAndrew Sapperstein
2030feb439af71976a0e4b35f94f9ac27d7d7bc64ddAndrew Sapperstein            // all attachments must be present to be able to share all
2040feb439af71976a0e4b35f94f9ac27d7d7bc64ddAndrew Sapperstein            enabled = true;
2050feb439af71976a0e4b35f94f9ac27d7d7bc64ddAndrew Sapperstein            for (final Attachment a : attachments) {
2060feb439af71976a0e4b35f94f9ac27d7d7bc64ddAndrew Sapperstein                if (!a.canShare()) {
2070feb439af71976a0e4b35f94f9ac27d7d7bc64ddAndrew Sapperstein                    enabled = false;
2080feb439af71976a0e4b35f94f9ac27d7d7bc64ddAndrew Sapperstein                    break;
2090feb439af71976a0e4b35f94f9ac27d7d7bc64ddAndrew Sapperstein                }
2100feb439af71976a0e4b35f94f9ac27d7d7bc64ddAndrew Sapperstein            }
2110feb439af71976a0e4b35f94f9ac27d7d7bc64ddAndrew Sapperstein            mShareAllItem.setEnabled(enabled);
2120feb439af71976a0e4b35f94f9ac27d7d7bc64ddAndrew Sapperstein        }
2130feb439af71976a0e4b35f94f9ac27d7d7bc64ddAndrew Sapperstein
2140feb439af71976a0e4b35f94f9ac27d7d7bc64ddAndrew Sapperstein        // Turn off functionality that only works on JellyBean.
2150feb439af71976a0e4b35f94f9ac27d7d7bc64ddAndrew Sapperstein        if (!Utils.isRunningJellybeanOrLater()) {
2160feb439af71976a0e4b35f94f9ac27d7d7bc64ddAndrew Sapperstein            mShareItem.setVisible(false);
2170feb439af71976a0e4b35f94f9ac27d7d7bc64ddAndrew Sapperstein            mShareAllItem.setVisible(false);
2180feb439af71976a0e4b35f94f9ac27d7d7bc64ddAndrew Sapperstein        }
2190feb439af71976a0e4b35f94f9ac27d7d7bc64ddAndrew Sapperstein
2200feb439af71976a0e4b35f94f9ac27d7d7bc64ddAndrew Sapperstein        // Turn off functionality that only works on KitKat.
2210feb439af71976a0e4b35f94f9ac27d7d7bc64ddAndrew Sapperstein        if (!Utils.isRunningKitkatOrLater()) {
2220feb439af71976a0e4b35f94f9ac27d7d7bc64ddAndrew Sapperstein            mPrintItem.setVisible(false);
2230feb439af71976a0e4b35f94f9ac27d7d7bc64ddAndrew Sapperstein        }
2240feb439af71976a0e4b35f94f9ac27d7d7bc64ddAndrew Sapperstein    }
2250feb439af71976a0e4b35f94f9ac27d7d7bc64ddAndrew Sapperstein
2260feb439af71976a0e4b35f94f9ac27d7d7bc64ddAndrew Sapperstein
2270feb439af71976a0e4b35f94f9ac27d7d7bc64ddAndrew Sapperstein    /**
2280feb439af71976a0e4b35f94f9ac27d7d7bc64ddAndrew Sapperstein     * Adjusts the activity title and subtitle to reflect the image name and size.
2290feb439af71976a0e4b35f94f9ac27d7d7bc64ddAndrew Sapperstein     */
2300feb439af71976a0e4b35f94f9ac27d7d7bc64ddAndrew Sapperstein    @Override
2310feb439af71976a0e4b35f94f9ac27d7d7bc64ddAndrew Sapperstein    public void updateActionBar() {
2320feb439af71976a0e4b35f94f9ac27d7d7bc64ddAndrew Sapperstein        super.updateActionBar();
2330feb439af71976a0e4b35f94f9ac27d7d7bc64ddAndrew Sapperstein
2340feb439af71976a0e4b35f94f9ac27d7d7bc64ddAndrew Sapperstein        final Attachment attachment = getCurrentAttachment();
2350feb439af71976a0e4b35f94f9ac27d7d7bc64ddAndrew Sapperstein        final ActionBarInterface actionBar = mMailActivity.getActionBarInterface();
2360feb439af71976a0e4b35f94f9ac27d7d7bc64ddAndrew Sapperstein        final String size = AttachmentUtils.convertToHumanReadableSize(
2370feb439af71976a0e4b35f94f9ac27d7d7bc64ddAndrew Sapperstein                mMailActivity.getContext(), attachment.size);
2380feb439af71976a0e4b35f94f9ac27d7d7bc64ddAndrew Sapperstein
2390feb439af71976a0e4b35f94f9ac27d7d7bc64ddAndrew Sapperstein        // update the status
2400feb439af71976a0e4b35f94f9ac27d7d7bc64ddAndrew Sapperstein        // There are 3 states
2410feb439af71976a0e4b35f94f9ac27d7d7bc64ddAndrew Sapperstein        //      1. Saved, Attachment Size
2420feb439af71976a0e4b35f94f9ac27d7d7bc64ddAndrew Sapperstein        //      2. Saving...
2430feb439af71976a0e4b35f94f9ac27d7d7bc64ddAndrew Sapperstein        //      3. Default, Attachment Size
2440feb439af71976a0e4b35f94f9ac27d7d7bc64ddAndrew Sapperstein        if (attachment.isSavedToExternal()) {
2450feb439af71976a0e4b35f94f9ac27d7d7bc64ddAndrew Sapperstein            actionBar.setSubtitle(mMailActivity.getResources().getString(R.string.saved, size));
2460feb439af71976a0e4b35f94f9ac27d7d7bc64ddAndrew Sapperstein        } else if (attachment.isDownloading() &&
2470feb439af71976a0e4b35f94f9ac27d7d7bc64ddAndrew Sapperstein                attachment.destination == UIProvider.AttachmentDestination.EXTERNAL) {
2480feb439af71976a0e4b35f94f9ac27d7d7bc64ddAndrew Sapperstein            actionBar.setSubtitle(mMailActivity.getResources().getString(R.string.saving));
2490feb439af71976a0e4b35f94f9ac27d7d7bc64ddAndrew Sapperstein        } else {
2500feb439af71976a0e4b35f94f9ac27d7d7bc64ddAndrew Sapperstein            actionBar.setSubtitle(size);
2510feb439af71976a0e4b35f94f9ac27d7d7bc64ddAndrew Sapperstein        }
2520feb439af71976a0e4b35f94f9ac27d7d7bc64ddAndrew Sapperstein        updateActionItems();
2530feb439af71976a0e4b35f94f9ac27d7d7bc64ddAndrew Sapperstein    }
2540feb439af71976a0e4b35f94f9ac27d7d7bc64ddAndrew Sapperstein
2550feb439af71976a0e4b35f94f9ac27d7d7bc64ddAndrew Sapperstein    @Override
2560feb439af71976a0e4b35f94f9ac27d7d7bc64ddAndrew Sapperstein    public void onFragmentVisible(PhotoViewFragment fragment) {
2570feb439af71976a0e4b35f94f9ac27d7d7bc64ddAndrew Sapperstein        super.onFragmentVisible(fragment);
2580feb439af71976a0e4b35f94f9ac27d7d7bc64ddAndrew Sapperstein        final Attachment attachment = getCurrentAttachment();
2590feb439af71976a0e4b35f94f9ac27d7d7bc64ddAndrew Sapperstein        if (attachment.state == UIProvider.AttachmentState.PAUSED) {
2600feb439af71976a0e4b35f94f9ac27d7d7bc64ddAndrew Sapperstein            mActionHandler.setAttachment(attachment);
2610feb439af71976a0e4b35f94f9ac27d7d7bc64ddAndrew Sapperstein            mActionHandler.startDownloadingAttachment(attachment.destination);
2620feb439af71976a0e4b35f94f9ac27d7d7bc64ddAndrew Sapperstein        }
2630feb439af71976a0e4b35f94f9ac27d7d7bc64ddAndrew Sapperstein    }
2640feb439af71976a0e4b35f94f9ac27d7d7bc64ddAndrew Sapperstein
2650feb439af71976a0e4b35f94f9ac27d7d7bc64ddAndrew Sapperstein    @Override
2660feb439af71976a0e4b35f94f9ac27d7d7bc64ddAndrew Sapperstein    public void onCursorChanged(PhotoViewFragment fragment, Cursor cursor) {
2670feb439af71976a0e4b35f94f9ac27d7d7bc64ddAndrew Sapperstein        super.onCursorChanged(fragment, cursor);
2680feb439af71976a0e4b35f94f9ac27d7d7bc64ddAndrew Sapperstein        updateProgressAndEmptyViews(fragment, new Attachment(cursor));
2690feb439af71976a0e4b35f94f9ac27d7d7bc64ddAndrew Sapperstein    }
2700feb439af71976a0e4b35f94f9ac27d7d7bc64ddAndrew Sapperstein
2710feb439af71976a0e4b35f94f9ac27d7d7bc64ddAndrew Sapperstein    /**
2720feb439af71976a0e4b35f94f9ac27d7d7bc64ddAndrew Sapperstein     * Updates the empty views of the fragment based upon the current
2730feb439af71976a0e4b35f94f9ac27d7d7bc64ddAndrew Sapperstein     * state of the attachment.
2740feb439af71976a0e4b35f94f9ac27d7d7bc64ddAndrew Sapperstein     * @param fragment the current fragment
2750feb439af71976a0e4b35f94f9ac27d7d7bc64ddAndrew Sapperstein     */
2760feb439af71976a0e4b35f94f9ac27d7d7bc64ddAndrew Sapperstein    private void updateProgressAndEmptyViews(
2770feb439af71976a0e4b35f94f9ac27d7d7bc64ddAndrew Sapperstein            final PhotoViewFragment fragment, final Attachment attachment) {
2780feb439af71976a0e4b35f94f9ac27d7d7bc64ddAndrew Sapperstein        final ProgressBarWrapper progressBar = fragment.getPhotoProgressBar();
2790feb439af71976a0e4b35f94f9ac27d7d7bc64ddAndrew Sapperstein        final TextView emptyText = fragment.getEmptyText();
2800feb439af71976a0e4b35f94f9ac27d7d7bc64ddAndrew Sapperstein        final ImageView retryButton = fragment.getRetryButton();
2810feb439af71976a0e4b35f94f9ac27d7d7bc64ddAndrew Sapperstein
2820feb439af71976a0e4b35f94f9ac27d7d7bc64ddAndrew Sapperstein        // update the progress
2830feb439af71976a0e4b35f94f9ac27d7d7bc64ddAndrew Sapperstein        if (attachment.shouldShowProgress()) {
2840feb439af71976a0e4b35f94f9ac27d7d7bc64ddAndrew Sapperstein            progressBar.setMax(attachment.size);
2850feb439af71976a0e4b35f94f9ac27d7d7bc64ddAndrew Sapperstein            progressBar.setProgress(attachment.downloadedSize);
2860feb439af71976a0e4b35f94f9ac27d7d7bc64ddAndrew Sapperstein            progressBar.setIndeterminate(false);
2870feb439af71976a0e4b35f94f9ac27d7d7bc64ddAndrew Sapperstein        } else if (fragment.isProgressBarNeeded()) {
2880feb439af71976a0e4b35f94f9ac27d7d7bc64ddAndrew Sapperstein            progressBar.setIndeterminate(true);
2890feb439af71976a0e4b35f94f9ac27d7d7bc64ddAndrew Sapperstein        }
2900feb439af71976a0e4b35f94f9ac27d7d7bc64ddAndrew Sapperstein
2910feb439af71976a0e4b35f94f9ac27d7d7bc64ddAndrew Sapperstein        // If the download failed, show the empty text and retry button
2920feb439af71976a0e4b35f94f9ac27d7d7bc64ddAndrew Sapperstein        if (attachment.isDownloadFailed()) {
2930feb439af71976a0e4b35f94f9ac27d7d7bc64ddAndrew Sapperstein            emptyText.setText(R.string.photo_load_failed);
2940feb439af71976a0e4b35f94f9ac27d7d7bc64ddAndrew Sapperstein            emptyText.setVisibility(View.VISIBLE);
2950feb439af71976a0e4b35f94f9ac27d7d7bc64ddAndrew Sapperstein            retryButton.setVisibility(View.VISIBLE);
2960feb439af71976a0e4b35f94f9ac27d7d7bc64ddAndrew Sapperstein            retryButton.setOnClickListener(new View.OnClickListener() {
2970feb439af71976a0e4b35f94f9ac27d7d7bc64ddAndrew Sapperstein                @Override
2980feb439af71976a0e4b35f94f9ac27d7d7bc64ddAndrew Sapperstein                public void onClick(View view) {
2990feb439af71976a0e4b35f94f9ac27d7d7bc64ddAndrew Sapperstein                    redownloadAttachment();
3000feb439af71976a0e4b35f94f9ac27d7d7bc64ddAndrew Sapperstein                    emptyText.setVisibility(View.GONE);
3010feb439af71976a0e4b35f94f9ac27d7d7bc64ddAndrew Sapperstein                    retryButton.setVisibility(View.GONE);
3020feb439af71976a0e4b35f94f9ac27d7d7bc64ddAndrew Sapperstein                }
3030feb439af71976a0e4b35f94f9ac27d7d7bc64ddAndrew Sapperstein            });
3040feb439af71976a0e4b35f94f9ac27d7d7bc64ddAndrew Sapperstein            progressBar.setVisibility(View.GONE);
3050feb439af71976a0e4b35f94f9ac27d7d7bc64ddAndrew Sapperstein        }
3060feb439af71976a0e4b35f94f9ac27d7d7bc64ddAndrew Sapperstein    }
3070feb439af71976a0e4b35f94f9ac27d7d7bc64ddAndrew Sapperstein
3080feb439af71976a0e4b35f94f9ac27d7d7bc64ddAndrew Sapperstein    /**
3090feb439af71976a0e4b35f94f9ac27d7d7bc64ddAndrew Sapperstein     * Save the current attachment.
3100feb439af71976a0e4b35f94f9ac27d7d7bc64ddAndrew Sapperstein     */
3110feb439af71976a0e4b35f94f9ac27d7d7bc64ddAndrew Sapperstein    private void saveAttachment() {
3120feb439af71976a0e4b35f94f9ac27d7d7bc64ddAndrew Sapperstein        saveAttachment(getCurrentAttachment());
3130feb439af71976a0e4b35f94f9ac27d7d7bc64ddAndrew Sapperstein    }
3140feb439af71976a0e4b35f94f9ac27d7d7bc64ddAndrew Sapperstein
3150feb439af71976a0e4b35f94f9ac27d7d7bc64ddAndrew Sapperstein    /**
3160feb439af71976a0e4b35f94f9ac27d7d7bc64ddAndrew Sapperstein     * Redownloads the attachment.
3170feb439af71976a0e4b35f94f9ac27d7d7bc64ddAndrew Sapperstein     */
3180feb439af71976a0e4b35f94f9ac27d7d7bc64ddAndrew Sapperstein    private void redownloadAttachment() {
3190feb439af71976a0e4b35f94f9ac27d7d7bc64ddAndrew Sapperstein        final Attachment attachment = getCurrentAttachment();
3200feb439af71976a0e4b35f94f9ac27d7d7bc64ddAndrew Sapperstein        if (attachment != null && attachment.canSave()) {
3210feb439af71976a0e4b35f94f9ac27d7d7bc64ddAndrew Sapperstein            // REDOWNLOADING command is only for attachments that are finished or failed.
3220feb439af71976a0e4b35f94f9ac27d7d7bc64ddAndrew Sapperstein            // For an attachment that is downloading (or paused in the DownloadManager), we need to
3230feb439af71976a0e4b35f94f9ac27d7d7bc64ddAndrew Sapperstein            // cancel it first.
3240feb439af71976a0e4b35f94f9ac27d7d7bc64ddAndrew Sapperstein            mActionHandler.setAttachment(attachment);
3250feb439af71976a0e4b35f94f9ac27d7d7bc64ddAndrew Sapperstein            mActionHandler.cancelAttachment();
3260feb439af71976a0e4b35f94f9ac27d7d7bc64ddAndrew Sapperstein            mActionHandler.startDownloadingAttachment(attachment.destination);
3270feb439af71976a0e4b35f94f9ac27d7d7bc64ddAndrew Sapperstein        }
3280feb439af71976a0e4b35f94f9ac27d7d7bc64ddAndrew Sapperstein    }
3290feb439af71976a0e4b35f94f9ac27d7d7bc64ddAndrew Sapperstein
3300feb439af71976a0e4b35f94f9ac27d7d7bc64ddAndrew Sapperstein    /**
3310feb439af71976a0e4b35f94f9ac27d7d7bc64ddAndrew Sapperstein     * Saves the attachment.
3320feb439af71976a0e4b35f94f9ac27d7d7bc64ddAndrew Sapperstein     * @param attachment the attachment to save.
3330feb439af71976a0e4b35f94f9ac27d7d7bc64ddAndrew Sapperstein     */
3340feb439af71976a0e4b35f94f9ac27d7d7bc64ddAndrew Sapperstein    private void saveAttachment(final Attachment attachment) {
3350feb439af71976a0e4b35f94f9ac27d7d7bc64ddAndrew Sapperstein        if (attachment != null && attachment.canSave()) {
3360feb439af71976a0e4b35f94f9ac27d7d7bc64ddAndrew Sapperstein            mActionHandler.setAttachment(attachment);
3370feb439af71976a0e4b35f94f9ac27d7d7bc64ddAndrew Sapperstein            mActionHandler.startDownloadingAttachment(UIProvider.AttachmentDestination.EXTERNAL);
3380feb439af71976a0e4b35f94f9ac27d7d7bc64ddAndrew Sapperstein        }
3390feb439af71976a0e4b35f94f9ac27d7d7bc64ddAndrew Sapperstein    }
3400feb439af71976a0e4b35f94f9ac27d7d7bc64ddAndrew Sapperstein
3410feb439af71976a0e4b35f94f9ac27d7d7bc64ddAndrew Sapperstein    /**
3420feb439af71976a0e4b35f94f9ac27d7d7bc64ddAndrew Sapperstein     * Save all of the attachments in the cursor.
3430feb439af71976a0e4b35f94f9ac27d7d7bc64ddAndrew Sapperstein     */
3440feb439af71976a0e4b35f94f9ac27d7d7bc64ddAndrew Sapperstein    private void saveAllAttachments() {
3450feb439af71976a0e4b35f94f9ac27d7d7bc64ddAndrew Sapperstein        Cursor cursor = getCursorAtProperPosition();
3460feb439af71976a0e4b35f94f9ac27d7d7bc64ddAndrew Sapperstein
3470feb439af71976a0e4b35f94f9ac27d7d7bc64ddAndrew Sapperstein        if (cursor == null) {
3480feb439af71976a0e4b35f94f9ac27d7d7bc64ddAndrew Sapperstein            return;
3490feb439af71976a0e4b35f94f9ac27d7d7bc64ddAndrew Sapperstein        }
3500feb439af71976a0e4b35f94f9ac27d7d7bc64ddAndrew Sapperstein
3510feb439af71976a0e4b35f94f9ac27d7d7bc64ddAndrew Sapperstein        int i = -1;
3520feb439af71976a0e4b35f94f9ac27d7d7bc64ddAndrew Sapperstein        while (cursor.moveToPosition(++i)) {
3530feb439af71976a0e4b35f94f9ac27d7d7bc64ddAndrew Sapperstein            saveAttachment(new Attachment(cursor));
3540feb439af71976a0e4b35f94f9ac27d7d7bc64ddAndrew Sapperstein        }
3550feb439af71976a0e4b35f94f9ac27d7d7bc64ddAndrew Sapperstein    }
3560feb439af71976a0e4b35f94f9ac27d7d7bc64ddAndrew Sapperstein
3570feb439af71976a0e4b35f94f9ac27d7d7bc64ddAndrew Sapperstein    /**
3580feb439af71976a0e4b35f94f9ac27d7d7bc64ddAndrew Sapperstein     * Share the current attachment.
3590feb439af71976a0e4b35f94f9ac27d7d7bc64ddAndrew Sapperstein     */
3600feb439af71976a0e4b35f94f9ac27d7d7bc64ddAndrew Sapperstein    private void shareAttachment() {
3610feb439af71976a0e4b35f94f9ac27d7d7bc64ddAndrew Sapperstein        shareAttachment(getCurrentAttachment());
3620feb439af71976a0e4b35f94f9ac27d7d7bc64ddAndrew Sapperstein    }
3630feb439af71976a0e4b35f94f9ac27d7d7bc64ddAndrew Sapperstein
3640feb439af71976a0e4b35f94f9ac27d7d7bc64ddAndrew Sapperstein    /**
3650feb439af71976a0e4b35f94f9ac27d7d7bc64ddAndrew Sapperstein     * Shares the attachment
3660feb439af71976a0e4b35f94f9ac27d7d7bc64ddAndrew Sapperstein     * @param attachment the attachment to share
3670feb439af71976a0e4b35f94f9ac27d7d7bc64ddAndrew Sapperstein     */
3680feb439af71976a0e4b35f94f9ac27d7d7bc64ddAndrew Sapperstein    private void shareAttachment(final Attachment attachment) {
3690feb439af71976a0e4b35f94f9ac27d7d7bc64ddAndrew Sapperstein        if (attachment != null) {
3700feb439af71976a0e4b35f94f9ac27d7d7bc64ddAndrew Sapperstein            mActionHandler.setAttachment(attachment);
3710feb439af71976a0e4b35f94f9ac27d7d7bc64ddAndrew Sapperstein            mActionHandler.shareAttachment();
3720feb439af71976a0e4b35f94f9ac27d7d7bc64ddAndrew Sapperstein        }
3730feb439af71976a0e4b35f94f9ac27d7d7bc64ddAndrew Sapperstein    }
3740feb439af71976a0e4b35f94f9ac27d7d7bc64ddAndrew Sapperstein
3750feb439af71976a0e4b35f94f9ac27d7d7bc64ddAndrew Sapperstein    /**
3760feb439af71976a0e4b35f94f9ac27d7d7bc64ddAndrew Sapperstein     * Share all of the attachments in the cursor.
3770feb439af71976a0e4b35f94f9ac27d7d7bc64ddAndrew Sapperstein     */
3780feb439af71976a0e4b35f94f9ac27d7d7bc64ddAndrew Sapperstein    private void shareAllAttachments() {
3790feb439af71976a0e4b35f94f9ac27d7d7bc64ddAndrew Sapperstein        Cursor cursor = getCursorAtProperPosition();
3800feb439af71976a0e4b35f94f9ac27d7d7bc64ddAndrew Sapperstein
3810feb439af71976a0e4b35f94f9ac27d7d7bc64ddAndrew Sapperstein        if (cursor == null) {
3820feb439af71976a0e4b35f94f9ac27d7d7bc64ddAndrew Sapperstein            return;
3830feb439af71976a0e4b35f94f9ac27d7d7bc64ddAndrew Sapperstein        }
3840feb439af71976a0e4b35f94f9ac27d7d7bc64ddAndrew Sapperstein
3850feb439af71976a0e4b35f94f9ac27d7d7bc64ddAndrew Sapperstein        ArrayList<Parcelable> uris = new ArrayList<Parcelable>();
3860feb439af71976a0e4b35f94f9ac27d7d7bc64ddAndrew Sapperstein        int i = -1;
3870feb439af71976a0e4b35f94f9ac27d7d7bc64ddAndrew Sapperstein        while (cursor.moveToPosition(++i)) {
3880feb439af71976a0e4b35f94f9ac27d7d7bc64ddAndrew Sapperstein            uris.add(Utils.normalizeUri(new Attachment(cursor).contentUri));
3890feb439af71976a0e4b35f94f9ac27d7d7bc64ddAndrew Sapperstein        }
3900feb439af71976a0e4b35f94f9ac27d7d7bc64ddAndrew Sapperstein
3910feb439af71976a0e4b35f94f9ac27d7d7bc64ddAndrew Sapperstein        mActionHandler.shareAttachments(uris);
3920feb439af71976a0e4b35f94f9ac27d7d7bc64ddAndrew Sapperstein    }
3930feb439af71976a0e4b35f94f9ac27d7d7bc64ddAndrew Sapperstein
3940feb439af71976a0e4b35f94f9ac27d7d7bc64ddAndrew Sapperstein    private void printAttachment() {
3950feb439af71976a0e4b35f94f9ac27d7d7bc64ddAndrew Sapperstein        final Attachment attachment = getCurrentAttachment();
3960feb439af71976a0e4b35f94f9ac27d7d7bc64ddAndrew Sapperstein        final Context context = mMailActivity.getContext();
3970feb439af71976a0e4b35f94f9ac27d7d7bc64ddAndrew Sapperstein        final PrintHelper printHelper = new PrintHelper(context);
3980feb439af71976a0e4b35f94f9ac27d7d7bc64ddAndrew Sapperstein        try {
3990feb439af71976a0e4b35f94f9ac27d7d7bc64ddAndrew Sapperstein            printHelper.setScaleMode(PrintHelper.SCALE_MODE_FIT);
4000feb439af71976a0e4b35f94f9ac27d7d7bc64ddAndrew Sapperstein            printHelper.printBitmap(PrintUtils.buildPrintJobName(context, attachment.getName()),
4010feb439af71976a0e4b35f94f9ac27d7d7bc64ddAndrew Sapperstein                    attachment.contentUri);
4020feb439af71976a0e4b35f94f9ac27d7d7bc64ddAndrew Sapperstein        } catch (FileNotFoundException e) {
4030feb439af71976a0e4b35f94f9ac27d7d7bc64ddAndrew Sapperstein            // couldn't print a photo at the particular Uri. Should we notify the user?
4040feb439af71976a0e4b35f94f9ac27d7d7bc64ddAndrew Sapperstein            LogUtils.e(LOG_TAG, e, "Can't print photo");
4050feb439af71976a0e4b35f94f9ac27d7d7bc64ddAndrew Sapperstein        }
4060feb439af71976a0e4b35f94f9ac27d7d7bc64ddAndrew Sapperstein    }
4070feb439af71976a0e4b35f94f9ac27d7d7bc64ddAndrew Sapperstein
4080feb439af71976a0e4b35f94f9ac27d7d7bc64ddAndrew Sapperstein    /**
4090feb439af71976a0e4b35f94f9ac27d7d7bc64ddAndrew Sapperstein     * Helper method to get the currently visible attachment.
4100feb439af71976a0e4b35f94f9ac27d7d7bc64ddAndrew Sapperstein     */
4110feb439af71976a0e4b35f94f9ac27d7d7bc64ddAndrew Sapperstein    protected Attachment getCurrentAttachment() {
4120feb439af71976a0e4b35f94f9ac27d7d7bc64ddAndrew Sapperstein        final Cursor cursor = getCursorAtProperPosition();
4130feb439af71976a0e4b35f94f9ac27d7d7bc64ddAndrew Sapperstein
4140feb439af71976a0e4b35f94f9ac27d7d7bc64ddAndrew Sapperstein        if (cursor == null) {
4150feb439af71976a0e4b35f94f9ac27d7d7bc64ddAndrew Sapperstein            return null;
4160feb439af71976a0e4b35f94f9ac27d7d7bc64ddAndrew Sapperstein        }
4170feb439af71976a0e4b35f94f9ac27d7d7bc64ddAndrew Sapperstein
4180feb439af71976a0e4b35f94f9ac27d7d7bc64ddAndrew Sapperstein        return new Attachment(cursor);
4190feb439af71976a0e4b35f94f9ac27d7d7bc64ddAndrew Sapperstein    }
4200feb439af71976a0e4b35f94f9ac27d7d7bc64ddAndrew Sapperstein
4210feb439af71976a0e4b35f94f9ac27d7d7bc64ddAndrew Sapperstein    private List<Attachment> getAllAttachments() {
4220feb439af71976a0e4b35f94f9ac27d7d7bc64ddAndrew Sapperstein        final Cursor cursor = getCursor();
4230feb439af71976a0e4b35f94f9ac27d7d7bc64ddAndrew Sapperstein
4240feb439af71976a0e4b35f94f9ac27d7d7bc64ddAndrew Sapperstein        if (cursor == null || cursor.isClosed() || !cursor.moveToFirst()) {
4250feb439af71976a0e4b35f94f9ac27d7d7bc64ddAndrew Sapperstein            return null;
4260feb439af71976a0e4b35f94f9ac27d7d7bc64ddAndrew Sapperstein        }
4270feb439af71976a0e4b35f94f9ac27d7d7bc64ddAndrew Sapperstein
4280feb439af71976a0e4b35f94f9ac27d7d7bc64ddAndrew Sapperstein        List<Attachment> list = Lists.newArrayList();
4290feb439af71976a0e4b35f94f9ac27d7d7bc64ddAndrew Sapperstein        do {
4300feb439af71976a0e4b35f94f9ac27d7d7bc64ddAndrew Sapperstein            list.add(new Attachment(cursor));
4310feb439af71976a0e4b35f94f9ac27d7d7bc64ddAndrew Sapperstein        } while (cursor.moveToNext());
4320feb439af71976a0e4b35f94f9ac27d7d7bc64ddAndrew Sapperstein
4330feb439af71976a0e4b35f94f9ac27d7d7bc64ddAndrew Sapperstein        return list;
4340feb439af71976a0e4b35f94f9ac27d7d7bc64ddAndrew Sapperstein    }
4350feb439af71976a0e4b35f94f9ac27d7d7bc64ddAndrew Sapperstein
4360feb439af71976a0e4b35f94f9ac27d7d7bc64ddAndrew Sapperstein    public ActivityInterface getMailActivity() {
4370feb439af71976a0e4b35f94f9ac27d7d7bc64ddAndrew Sapperstein        return mMailActivity;
4380feb439af71976a0e4b35f94f9ac27d7d7bc64ddAndrew Sapperstein    }
4390feb439af71976a0e4b35f94f9ac27d7d7bc64ddAndrew Sapperstein}
440