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