1f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin/* 2f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin * Copyright (C) 2010 The Android Open Source Project 3f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin * 4f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin * Licensed under the Apache License, Version 2.0 (the "License"); 5f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin * you may not use this file except in compliance with the License. 6f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin * You may obtain a copy of the License at 7f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin * 8f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin * http://www.apache.org/licenses/LICENSE-2.0 9f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin * 10f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin * Unless required by applicable law or agreed to in writing, software 11f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin * distributed under the License is distributed on an "AS IS" BASIS, 12f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin * See the License for the specific language governing permissions and 14f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin * limitations under the License. 15f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin */ 16f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 17f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Linpackage com.android.gallery3d.ui; 18f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 19fc86994f86f8cfb31e151c9e730dc1e9dc7b3349Yuli Huangimport android.annotation.TargetApi; 202abaaf7caa9a83ba1ea759868aabde7f21387184John Reckimport android.app.Activity; 21f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Linimport android.content.Intent; 22f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Linimport android.net.Uri; 23af4ab4faeeb640b285311a305ff128b33b964389Martijn Coenenimport android.nfc.NfcAdapter; 24f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Linimport android.os.Handler; 252abaaf7caa9a83ba1ea759868aabde7f21387184John Reckimport android.view.ActionMode; 262abaaf7caa9a83ba1ea759868aabde7f21387184John Reckimport android.view.ActionMode.Callback; 27f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Linimport android.view.LayoutInflater; 282abaaf7caa9a83ba1ea759868aabde7f21387184John Reckimport android.view.Menu; 292abaaf7caa9a83ba1ea759868aabde7f21387184John Reckimport android.view.MenuItem; 30f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Linimport android.view.View; 31f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Linimport android.widget.Button; 322abaaf7caa9a83ba1ea759868aabde7f21387184John Reckimport android.widget.ShareActionProvider; 332abaaf7caa9a83ba1ea759868aabde7f21387184John Reckimport android.widget.ShareActionProvider.OnShareTargetSelectedListener; 340c1f2c80818a0326fa55e6f709b49584ceab60b1Ray Chen 350c1f2c80818a0326fa55e6f709b49584ceab60b1Ray Chenimport com.android.gallery3d.R; 36b21b8e58a604f6c701245d84b141b5b87663192bOwen Linimport com.android.gallery3d.app.AbstractGalleryActivity; 37fc86994f86f8cfb31e151c9e730dc1e9dc7b3349Yuli Huangimport com.android.gallery3d.common.ApiHelper; 380c1f2c80818a0326fa55e6f709b49584ceab60b1Ray Chenimport com.android.gallery3d.common.Utils; 390c1f2c80818a0326fa55e6f709b49584ceab60b1Ray Chenimport com.android.gallery3d.data.DataManager; 400c1f2c80818a0326fa55e6f709b49584ceab60b1Ray Chenimport com.android.gallery3d.data.MediaObject; 414b4dbd225685502f4249c2bf25bf74f7ce526645George Mountimport com.android.gallery3d.data.MediaObject.PanoramaSupportCallback; 420c1f2c80818a0326fa55e6f709b49584ceab60b1Ray Chenimport com.android.gallery3d.data.Path; 430c1f2c80818a0326fa55e6f709b49584ceab60b1Ray Chenimport com.android.gallery3d.ui.MenuExecutor.ProgressListener; 440c1f2c80818a0326fa55e6f709b49584ceab60b1Ray Chenimport com.android.gallery3d.util.Future; 450c1f2c80818a0326fa55e6f709b49584ceab60b1Ray Chenimport com.android.gallery3d.util.GalleryUtils; 460c1f2c80818a0326fa55e6f709b49584ceab60b1Ray Chenimport com.android.gallery3d.util.ThreadPool.Job; 470c1f2c80818a0326fa55e6f709b49584ceab60b1Ray Chenimport com.android.gallery3d.util.ThreadPool.JobContext; 48f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 49f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Linimport java.util.ArrayList; 50f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 51b21b8e58a604f6c701245d84b141b5b87663192bOwen Linpublic class ActionModeHandler implements Callback, PopupList.OnPopupItemClickListener { 522bb717f1ea38e2ce33dd102a23afe6bfacb5675cOwen Lin 537817979db0c52ffeacb951625b1e821eba303285Ahbong Chang @SuppressWarnings("unused") 54f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin private static final String TAG = "ActionModeHandler"; 552bb717f1ea38e2ce33dd102a23afe6bfacb5675cOwen Lin 565a352be0df79b03c942eb67a799ddb3aaa1a26a2Bobby Georgescu private static final int MAX_SELECTED_ITEMS_FOR_SHARE_INTENT = 300; 57549c968947cccc8bacca994f954629228b6b877fBobby Georgescu private static final int MAX_SELECTED_ITEMS_FOR_PANORAMA_SHARE_INTENT = 10; 58549c968947cccc8bacca994f954629228b6b877fBobby Georgescu 59f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin private static final int SUPPORT_MULTIPLE_MASK = MediaObject.SUPPORT_DELETE 60f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin | MediaObject.SUPPORT_ROTATE | MediaObject.SUPPORT_SHARE 61d3aac52ffb88ced53413d5eef29c641dd6982267Bobby Georgescu | MediaObject.SUPPORT_CACHE; 62f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 63f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin public interface ActionModeListener { 64f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin public boolean onActionItemClicked(MenuItem item); 65f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 66f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 67b21b8e58a604f6c701245d84b141b5b87663192bOwen Lin private final AbstractGalleryActivity mActivity; 68f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin private final MenuExecutor mMenuExecutor; 69f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin private final SelectionManager mSelectionManager; 70af4ab4faeeb640b285311a305ff128b33b964389Martijn Coenen private final NfcAdapter mNfcAdapter; 71f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin private Menu mMenu; 725172dee697c05235ddf932827d75e6fa0b81d382Mangesh Ghiware private MenuItem mSharePanoramaMenuItem; 73b21b8e58a604f6c701245d84b141b5b87663192bOwen Lin private MenuItem mShareMenuItem; 745172dee697c05235ddf932827d75e6fa0b81d382Mangesh Ghiware private ShareActionProvider mSharePanoramaActionProvider; 755172dee697c05235ddf932827d75e6fa0b81d382Mangesh Ghiware private ShareActionProvider mShareActionProvider; 7644ef42f215d68ade8b63d18fede944c244a2a1ddOwen Lin private SelectionMenu mSelectionMenu; 77f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin private ActionModeListener mListener; 78f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin private Future<?> mMenuTask; 790c1f2c80818a0326fa55e6f709b49584ceab60b1Ray Chen private final Handler mMainHandler; 80b21b8e58a604f6c701245d84b141b5b87663192bOwen Lin private ActionMode mActionMode; 81f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 824b4dbd225685502f4249c2bf25bf74f7ce526645George Mount private static class GetAllPanoramaSupports implements PanoramaSupportCallback { 834b4dbd225685502f4249c2bf25bf74f7ce526645George Mount private int mNumInfoRequired; 844b4dbd225685502f4249c2bf25bf74f7ce526645George Mount private JobContext mJobContext; 854b4dbd225685502f4249c2bf25bf74f7ce526645George Mount public boolean mAllPanoramas = true; 864b4dbd225685502f4249c2bf25bf74f7ce526645George Mount public boolean mAllPanorama360 = true; 874b4dbd225685502f4249c2bf25bf74f7ce526645George Mount public boolean mHasPanorama360 = false; 884b4dbd225685502f4249c2bf25bf74f7ce526645George Mount private Object mLock = new Object(); 894b4dbd225685502f4249c2bf25bf74f7ce526645George Mount 904b4dbd225685502f4249c2bf25bf74f7ce526645George Mount public GetAllPanoramaSupports(ArrayList<MediaObject> mediaObjects, JobContext jc) { 914b4dbd225685502f4249c2bf25bf74f7ce526645George Mount mJobContext = jc; 924b4dbd225685502f4249c2bf25bf74f7ce526645George Mount mNumInfoRequired = mediaObjects.size(); 934b4dbd225685502f4249c2bf25bf74f7ce526645George Mount for (MediaObject mediaObject : mediaObjects) { 944b4dbd225685502f4249c2bf25bf74f7ce526645George Mount mediaObject.getPanoramaSupport(this); 954b4dbd225685502f4249c2bf25bf74f7ce526645George Mount } 964b4dbd225685502f4249c2bf25bf74f7ce526645George Mount } 974b4dbd225685502f4249c2bf25bf74f7ce526645George Mount 984b4dbd225685502f4249c2bf25bf74f7ce526645George Mount @Override 994b4dbd225685502f4249c2bf25bf74f7ce526645George Mount public void panoramaInfoAvailable(MediaObject mediaObject, boolean isPanorama, 1004b4dbd225685502f4249c2bf25bf74f7ce526645George Mount boolean isPanorama360) { 1014b4dbd225685502f4249c2bf25bf74f7ce526645George Mount synchronized (mLock) { 1024b4dbd225685502f4249c2bf25bf74f7ce526645George Mount mNumInfoRequired--; 1034b4dbd225685502f4249c2bf25bf74f7ce526645George Mount mAllPanoramas = isPanorama && mAllPanoramas; 1044b4dbd225685502f4249c2bf25bf74f7ce526645George Mount mAllPanorama360 = isPanorama360 && mAllPanorama360; 1054b4dbd225685502f4249c2bf25bf74f7ce526645George Mount mHasPanorama360 = mHasPanorama360 || isPanorama360; 1064b4dbd225685502f4249c2bf25bf74f7ce526645George Mount if (mNumInfoRequired == 0 || mJobContext.isCancelled()) { 1074b4dbd225685502f4249c2bf25bf74f7ce526645George Mount mLock.notifyAll(); 1084b4dbd225685502f4249c2bf25bf74f7ce526645George Mount } 1094b4dbd225685502f4249c2bf25bf74f7ce526645George Mount } 1104b4dbd225685502f4249c2bf25bf74f7ce526645George Mount } 1114b4dbd225685502f4249c2bf25bf74f7ce526645George Mount 1124b4dbd225685502f4249c2bf25bf74f7ce526645George Mount public void waitForPanoramaSupport() { 1134b4dbd225685502f4249c2bf25bf74f7ce526645George Mount synchronized (mLock) { 1144b4dbd225685502f4249c2bf25bf74f7ce526645George Mount while (mNumInfoRequired != 0 && !mJobContext.isCancelled()) { 1154b4dbd225685502f4249c2bf25bf74f7ce526645George Mount try { 1164b4dbd225685502f4249c2bf25bf74f7ce526645George Mount mLock.wait(); 1174b4dbd225685502f4249c2bf25bf74f7ce526645George Mount } catch (InterruptedException e) { 1184b4dbd225685502f4249c2bf25bf74f7ce526645George Mount // May be a cancelled job context 1194b4dbd225685502f4249c2bf25bf74f7ce526645George Mount } 1204b4dbd225685502f4249c2bf25bf74f7ce526645George Mount } 1214b4dbd225685502f4249c2bf25bf74f7ce526645George Mount } 1224b4dbd225685502f4249c2bf25bf74f7ce526645George Mount } 1234b4dbd225685502f4249c2bf25bf74f7ce526645George Mount } 1244b4dbd225685502f4249c2bf25bf74f7ce526645George Mount 125f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin public ActionModeHandler( 126b21b8e58a604f6c701245d84b141b5b87663192bOwen Lin AbstractGalleryActivity activity, SelectionManager selectionManager) { 127f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin mActivity = Utils.checkNotNull(activity); 128f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin mSelectionManager = Utils.checkNotNull(selectionManager); 129f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin mMenuExecutor = new MenuExecutor(activity, selectionManager); 130f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin mMainHandler = new Handler(activity.getMainLooper()); 131af4ab4faeeb640b285311a305ff128b33b964389Martijn Coenen mNfcAdapter = NfcAdapter.getDefaultAdapter(mActivity.getAndroidContext()); 132f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 133f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 1342bb717f1ea38e2ce33dd102a23afe6bfacb5675cOwen Lin public void startActionMode() { 1352abaaf7caa9a83ba1ea759868aabde7f21387184John Reck Activity a = mActivity; 136b21b8e58a604f6c701245d84b141b5b87663192bOwen Lin mActionMode = a.startActionMode(this); 137f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin View customView = LayoutInflater.from(a).inflate( 138f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin R.layout.action_mode, null); 1392bb717f1ea38e2ce33dd102a23afe6bfacb5675cOwen Lin mActionMode.setCustomView(customView); 14044ef42f215d68ade8b63d18fede944c244a2a1ddOwen Lin mSelectionMenu = new SelectionMenu(a, 14144ef42f215d68ade8b63d18fede944c244a2a1ddOwen Lin (Button) customView.findViewById(R.id.selection_menu), this); 1429b54e8c645d14748b7dd75e25b4db9e97e3415a9Ray Chen updateSelectionMenu(); 1432bb717f1ea38e2ce33dd102a23afe6bfacb5675cOwen Lin } 14444ef42f215d68ade8b63d18fede944c244a2a1ddOwen Lin 1452bb717f1ea38e2ce33dd102a23afe6bfacb5675cOwen Lin public void finishActionMode() { 1462bb717f1ea38e2ce33dd102a23afe6bfacb5675cOwen Lin mActionMode.finish(); 147f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 148f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 149f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin public void setTitle(String title) { 150f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin mSelectionMenu.setTitle(title); 151f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 152f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 153f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin public void setActionModeListener(ActionModeListener listener) { 154f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin mListener = listener; 155f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 156f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 1570385a1abb62a11fff5dddee17325d1cb00cee0abBobby Georgescu private WakeLockHoldingProgressListener mDeleteProgressListener; 1580385a1abb62a11fff5dddee17325d1cb00cee0abBobby Georgescu 15948ba94ae713dbf57898cfa84ae69517da50cf7a0Owen Lin @Override 160b21b8e58a604f6c701245d84b141b5b87663192bOwen Lin public boolean onActionItemClicked(ActionMode mode, MenuItem item) { 16148ba94ae713dbf57898cfa84ae69517da50cf7a0Owen Lin GLRoot root = mActivity.getGLRoot(); 16248ba94ae713dbf57898cfa84ae69517da50cf7a0Owen Lin root.lockRenderThread(); 16348ba94ae713dbf57898cfa84ae69517da50cf7a0Owen Lin try { 16448ba94ae713dbf57898cfa84ae69517da50cf7a0Owen Lin boolean result; 16567098d1a72fd04e2af06d3a5939cde28c65f70d9Ray Chen // Give listener a chance to process this command before it's routed to 16667098d1a72fd04e2af06d3a5939cde28c65f70d9Ray Chen // ActionModeHandler, which handles command only based on the action id. 16767098d1a72fd04e2af06d3a5939cde28c65f70d9Ray Chen // Sometimes the listener may have more background information to handle 16867098d1a72fd04e2af06d3a5939cde28c65f70d9Ray Chen // an action command. 16948ba94ae713dbf57898cfa84ae69517da50cf7a0Owen Lin if (mListener != null) { 17048ba94ae713dbf57898cfa84ae69517da50cf7a0Owen Lin result = mListener.onActionItemClicked(item); 17148ba94ae713dbf57898cfa84ae69517da50cf7a0Owen Lin if (result) { 17248ba94ae713dbf57898cfa84ae69517da50cf7a0Owen Lin mSelectionManager.leaveSelectionMode(); 17348ba94ae713dbf57898cfa84ae69517da50cf7a0Owen Lin return result; 17448ba94ae713dbf57898cfa84ae69517da50cf7a0Owen Lin } 175f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 17648ba94ae713dbf57898cfa84ae69517da50cf7a0Owen Lin ProgressListener listener = null; 1779a033b07b8e0d9fe7419b7a0d876e9c7febf43c8Ray Chen String confirmMsg = null; 17867098d1a72fd04e2af06d3a5939cde28c65f70d9Ray Chen int action = item.getItemId(); 179d3aac52ffb88ced53413d5eef29c641dd6982267Bobby Georgescu if (action == R.id.action_delete) { 1809a033b07b8e0d9fe7419b7a0d876e9c7febf43c8Ray Chen confirmMsg = mActivity.getResources().getQuantityString( 1819a033b07b8e0d9fe7419b7a0d876e9c7febf43c8Ray Chen R.plurals.delete_selection, mSelectionManager.getSelectedCount()); 1820385a1abb62a11fff5dddee17325d1cb00cee0abBobby Georgescu if (mDeleteProgressListener == null) { 1830385a1abb62a11fff5dddee17325d1cb00cee0abBobby Georgescu mDeleteProgressListener = new WakeLockHoldingProgressListener(mActivity, 1840385a1abb62a11fff5dddee17325d1cb00cee0abBobby Georgescu "Gallery Delete Progress Listener"); 1850385a1abb62a11fff5dddee17325d1cb00cee0abBobby Georgescu } 1860385a1abb62a11fff5dddee17325d1cb00cee0abBobby Georgescu listener = mDeleteProgressListener; 18748ba94ae713dbf57898cfa84ae69517da50cf7a0Owen Lin } 1889a033b07b8e0d9fe7419b7a0d876e9c7febf43c8Ray Chen mMenuExecutor.onMenuClicked(item, confirmMsg, listener); 18944ef42f215d68ade8b63d18fede944c244a2a1ddOwen Lin } finally { 19044ef42f215d68ade8b63d18fede944c244a2a1ddOwen Lin root.unlockRenderThread(); 19144ef42f215d68ade8b63d18fede944c244a2a1ddOwen Lin } 19244ef42f215d68ade8b63d18fede944c244a2a1ddOwen Lin return true; 19344ef42f215d68ade8b63d18fede944c244a2a1ddOwen Lin } 19444ef42f215d68ade8b63d18fede944c244a2a1ddOwen Lin 19544ef42f215d68ade8b63d18fede944c244a2a1ddOwen Lin @Override 19644ef42f215d68ade8b63d18fede944c244a2a1ddOwen Lin public boolean onPopupItemClick(int itemId) { 19744ef42f215d68ade8b63d18fede944c244a2a1ddOwen Lin GLRoot root = mActivity.getGLRoot(); 19844ef42f215d68ade8b63d18fede944c244a2a1ddOwen Lin root.lockRenderThread(); 19944ef42f215d68ade8b63d18fede944c244a2a1ddOwen Lin try { 20044ef42f215d68ade8b63d18fede944c244a2a1ddOwen Lin if (itemId == R.id.action_select_all) { 201e99a6ba365b388985bb5f4238002d90c2df28251Ray Chen updateSupportedOperation(); 20244ef42f215d68ade8b63d18fede944c244a2a1ddOwen Lin mMenuExecutor.onMenuClicked(itemId, null, false, true); 203e99a6ba365b388985bb5f4238002d90c2df28251Ray Chen } 20444ef42f215d68ade8b63d18fede944c244a2a1ddOwen Lin return true; 20548ba94ae713dbf57898cfa84ae69517da50cf7a0Owen Lin } finally { 20648ba94ae713dbf57898cfa84ae69517da50cf7a0Owen Lin root.unlockRenderThread(); 207f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 208e3c968f892585490b938ea2bcef81f8dca4a81f8Ray Chen } 209f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 2109b54e8c645d14748b7dd75e25b4db9e97e3415a9Ray Chen private void updateSelectionMenu() { 2119b54e8c645d14748b7dd75e25b4db9e97e3415a9Ray Chen // update title 2129b54e8c645d14748b7dd75e25b4db9e97e3415a9Ray Chen int count = mSelectionManager.getSelectedCount(); 2139b54e8c645d14748b7dd75e25b4db9e97e3415a9Ray Chen String format = mActivity.getResources().getQuantityString( 2149b54e8c645d14748b7dd75e25b4db9e97e3415a9Ray Chen R.plurals.number_of_items_selected, count); 2159b54e8c645d14748b7dd75e25b4db9e97e3415a9Ray Chen setTitle(String.format(format, count)); 21644ef42f215d68ade8b63d18fede944c244a2a1ddOwen Lin 217e3c968f892585490b938ea2bcef81f8dca4a81f8Ray Chen // For clients who call SelectionManager.selectAll() directly, we need to ensure the 218e3c968f892585490b938ea2bcef81f8dca4a81f8Ray Chen // menu status is consistent with selection manager. 21944ef42f215d68ade8b63d18fede944c244a2a1ddOwen Lin mSelectionMenu.updateSelectAllMode(mSelectionManager.inSelectAllMode()); 220f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 221f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 222b21b8e58a604f6c701245d84b141b5b87663192bOwen Lin private final OnShareTargetSelectedListener mShareTargetSelectedListener = 223b21b8e58a604f6c701245d84b141b5b87663192bOwen Lin new OnShareTargetSelectedListener() { 224b21b8e58a604f6c701245d84b141b5b87663192bOwen Lin @Override 225b21b8e58a604f6c701245d84b141b5b87663192bOwen Lin public boolean onShareTargetSelected(ShareActionProvider source, Intent intent) { 226b21b8e58a604f6c701245d84b141b5b87663192bOwen Lin mSelectionManager.leaveSelectionMode(); 227b21b8e58a604f6c701245d84b141b5b87663192bOwen Lin return false; 228b21b8e58a604f6c701245d84b141b5b87663192bOwen Lin } 229b21b8e58a604f6c701245d84b141b5b87663192bOwen Lin }; 230b21b8e58a604f6c701245d84b141b5b87663192bOwen Lin 2317817979db0c52ffeacb951625b1e821eba303285Ahbong Chang @Override 232b21b8e58a604f6c701245d84b141b5b87663192bOwen Lin public boolean onPrepareActionMode(ActionMode mode, Menu menu) { 233b21b8e58a604f6c701245d84b141b5b87663192bOwen Lin return false; 234b21b8e58a604f6c701245d84b141b5b87663192bOwen Lin } 235b21b8e58a604f6c701245d84b141b5b87663192bOwen Lin 236b21b8e58a604f6c701245d84b141b5b87663192bOwen Lin @Override 237b21b8e58a604f6c701245d84b141b5b87663192bOwen Lin public boolean onCreateActionMode(ActionMode mode, Menu menu) { 238b21b8e58a604f6c701245d84b141b5b87663192bOwen Lin mode.getMenuInflater().inflate(R.menu.operation, menu); 2392bb717f1ea38e2ce33dd102a23afe6bfacb5675cOwen Lin 240f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin mMenu = menu; 2415172dee697c05235ddf932827d75e6fa0b81d382Mangesh Ghiware mSharePanoramaMenuItem = menu.findItem(R.id.action_share_panorama); 2425172dee697c05235ddf932827d75e6fa0b81d382Mangesh Ghiware if (mSharePanoramaMenuItem != null) { 2435172dee697c05235ddf932827d75e6fa0b81d382Mangesh Ghiware mSharePanoramaActionProvider = (ShareActionProvider) mSharePanoramaMenuItem 2445172dee697c05235ddf932827d75e6fa0b81d382Mangesh Ghiware .getActionProvider(); 2455172dee697c05235ddf932827d75e6fa0b81d382Mangesh Ghiware mSharePanoramaActionProvider.setOnShareTargetSelectedListener( 2465172dee697c05235ddf932827d75e6fa0b81d382Mangesh Ghiware mShareTargetSelectedListener); 2475172dee697c05235ddf932827d75e6fa0b81d382Mangesh Ghiware mSharePanoramaActionProvider.setShareHistoryFileName("panorama_share_history.xml"); 2485172dee697c05235ddf932827d75e6fa0b81d382Mangesh Ghiware } 249b21b8e58a604f6c701245d84b141b5b87663192bOwen Lin mShareMenuItem = menu.findItem(R.id.action_share); 250b21b8e58a604f6c701245d84b141b5b87663192bOwen Lin if (mShareMenuItem != null) { 2515172dee697c05235ddf932827d75e6fa0b81d382Mangesh Ghiware mShareActionProvider = (ShareActionProvider) mShareMenuItem 2525172dee697c05235ddf932827d75e6fa0b81d382Mangesh Ghiware .getActionProvider(); 2535172dee697c05235ddf932827d75e6fa0b81d382Mangesh Ghiware mShareActionProvider.setOnShareTargetSelectedListener( 2545172dee697c05235ddf932827d75e6fa0b81d382Mangesh Ghiware mShareTargetSelectedListener); 2555172dee697c05235ddf932827d75e6fa0b81d382Mangesh Ghiware mShareActionProvider.setShareHistoryFileName("share_history.xml"); 256b21b8e58a604f6c701245d84b141b5b87663192bOwen Lin } 257f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin return true; 258f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 259f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 2607817979db0c52ffeacb951625b1e821eba303285Ahbong Chang @Override 261b21b8e58a604f6c701245d84b141b5b87663192bOwen Lin public void onDestroyActionMode(ActionMode mode) { 262f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin mSelectionManager.leaveSelectionMode(); 263f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 264f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 2654b4dbd225685502f4249c2bf25bf74f7ce526645George Mount private ArrayList<MediaObject> getSelectedMediaObjects(JobContext jc) { 266301ea871a5f3b13adeae5ac1f0a36c86eff228e7Ray Chen ArrayList<Path> unexpandedPaths = mSelectionManager.getSelected(false); 267301ea871a5f3b13adeae5ac1f0a36c86eff228e7Ray Chen if (unexpandedPaths.isEmpty()) { 268301ea871a5f3b13adeae5ac1f0a36c86eff228e7Ray Chen // This happens when starting selection mode from overflow menu 269301ea871a5f3b13adeae5ac1f0a36c86eff228e7Ray Chen // (instead of long press a media object) 2704b4dbd225685502f4249c2bf25bf74f7ce526645George Mount return null; 271301ea871a5f3b13adeae5ac1f0a36c86eff228e7Ray Chen } 2724b4dbd225685502f4249c2bf25bf74f7ce526645George Mount ArrayList<MediaObject> selected = new ArrayList<MediaObject>(); 273f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin DataManager manager = mActivity.getDataManager(); 274301ea871a5f3b13adeae5ac1f0a36c86eff228e7Ray Chen for (Path path : unexpandedPaths) { 2754b4dbd225685502f4249c2bf25bf74f7ce526645George Mount if (jc.isCancelled()) { 2764b4dbd225685502f4249c2bf25bf74f7ce526645George Mount return null; 2774b4dbd225685502f4249c2bf25bf74f7ce526645George Mount } 2784b4dbd225685502f4249c2bf25bf74f7ce526645George Mount selected.add(manager.getMediaObject(path)); 2794b4dbd225685502f4249c2bf25bf74f7ce526645George Mount } 2804b4dbd225685502f4249c2bf25bf74f7ce526645George Mount 2814b4dbd225685502f4249c2bf25bf74f7ce526645George Mount return selected; 2824b4dbd225685502f4249c2bf25bf74f7ce526645George Mount } 2834b4dbd225685502f4249c2bf25bf74f7ce526645George Mount // Menu options are determined by selection set itself. 2844b4dbd225685502f4249c2bf25bf74f7ce526645George Mount // We cannot expand it because MenuExecuter executes it based on 2854b4dbd225685502f4249c2bf25bf74f7ce526645George Mount // the selection set instead of the expanded result. 2864b4dbd225685502f4249c2bf25bf74f7ce526645George Mount // e.g. LocalImage can be rotated but collections of them (LocalAlbum) can't. 2874b4dbd225685502f4249c2bf25bf74f7ce526645George Mount private int computeMenuOptions(ArrayList<MediaObject> selected) { 2884b4dbd225685502f4249c2bf25bf74f7ce526645George Mount int operation = MediaObject.SUPPORT_ALL; 2894b4dbd225685502f4249c2bf25bf74f7ce526645George Mount int type = 0; 2904b4dbd225685502f4249c2bf25bf74f7ce526645George Mount for (MediaObject mediaObject: selected) { 2914b4dbd225685502f4249c2bf25bf74f7ce526645George Mount int support = mediaObject.getSupportedOperations(); 2924b4dbd225685502f4249c2bf25bf74f7ce526645George Mount type |= mediaObject.getMediaType(); 293f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin operation &= support; 294f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 295f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 2964b4dbd225685502f4249c2bf25bf74f7ce526645George Mount switch (selected.size()) { 297301ea871a5f3b13adeae5ac1f0a36c86eff228e7Ray Chen case 1: 2985172dee697c05235ddf932827d75e6fa0b81d382Mangesh Ghiware final String mimeType = MenuExecutor.getMimeType(type); 299b21b8e58a604f6c701245d84b141b5b87663192bOwen Lin if (!GalleryUtils.isEditorAvailable(mActivity, mimeType)) { 300301ea871a5f3b13adeae5ac1f0a36c86eff228e7Ray Chen operation &= ~MediaObject.SUPPORT_EDIT; 301301ea871a5f3b13adeae5ac1f0a36c86eff228e7Ray Chen } 302301ea871a5f3b13adeae5ac1f0a36c86eff228e7Ray Chen break; 303301ea871a5f3b13adeae5ac1f0a36c86eff228e7Ray Chen default: 304301ea871a5f3b13adeae5ac1f0a36c86eff228e7Ray Chen operation &= SUPPORT_MULTIPLE_MASK; 305f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 306f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 307301ea871a5f3b13adeae5ac1f0a36c86eff228e7Ray Chen return operation; 308deff258ea4e5723b351739418919251ae1048e46Ray Chen } 309deff258ea4e5723b351739418919251ae1048e46Ray Chen 3106772173d2a49b87a1d209f42fe52b5f830596f99Chih-Chung Chang @TargetApi(ApiHelper.VERSION_CODES.JELLY_BEAN) 311fc86994f86f8cfb31e151c9e730dc1e9dc7b3349Yuli Huang private void setNfcBeamPushUris(Uri[] uris) { 3126772173d2a49b87a1d209f42fe52b5f830596f99Chih-Chung Chang if (mNfcAdapter != null && ApiHelper.HAS_SET_BEAM_PUSH_URIS) { 3132619f20d30123a391cc6d37515fe8eb9d81d5029John Reck mNfcAdapter.setBeamPushUrisCallback(null, mActivity); 314b21b8e58a604f6c701245d84b141b5b87663192bOwen Lin mNfcAdapter.setBeamPushUris(uris, mActivity); 315fc86994f86f8cfb31e151c9e730dc1e9dc7b3349Yuli Huang } 316fc86994f86f8cfb31e151c9e730dc1e9dc7b3349Yuli Huang } 317fc86994f86f8cfb31e151c9e730dc1e9dc7b3349Yuli Huang 318deff258ea4e5723b351739418919251ae1048e46Ray Chen // Share intent needs to expand the selection set so we can get URI of 319deff258ea4e5723b351739418919251ae1048e46Ray Chen // each media item 320549c968947cccc8bacca994f954629228b6b877fBobby Georgescu private Intent computePanoramaSharingIntent(JobContext jc, int maxItems) { 321549c968947cccc8bacca994f954629228b6b877fBobby Georgescu ArrayList<Path> expandedPaths = mSelectionManager.getSelected(true, maxItems); 322549c968947cccc8bacca994f954629228b6b877fBobby Georgescu if (expandedPaths == null || expandedPaths.size() == 0) { 323549c968947cccc8bacca994f954629228b6b877fBobby Georgescu return new Intent(); 3245172dee697c05235ddf932827d75e6fa0b81d382Mangesh Ghiware } 3255172dee697c05235ddf932827d75e6fa0b81d382Mangesh Ghiware final ArrayList<Uri> uris = new ArrayList<Uri>(); 3265172dee697c05235ddf932827d75e6fa0b81d382Mangesh Ghiware DataManager manager = mActivity.getDataManager(); 3275172dee697c05235ddf932827d75e6fa0b81d382Mangesh Ghiware final Intent intent = new Intent(); 3285172dee697c05235ddf932827d75e6fa0b81d382Mangesh Ghiware for (Path path : expandedPaths) { 3295172dee697c05235ddf932827d75e6fa0b81d382Mangesh Ghiware if (jc.isCancelled()) return null; 3305172dee697c05235ddf932827d75e6fa0b81d382Mangesh Ghiware uris.add(manager.getContentUri(path)); 3315172dee697c05235ddf932827d75e6fa0b81d382Mangesh Ghiware } 3325172dee697c05235ddf932827d75e6fa0b81d382Mangesh Ghiware 3335172dee697c05235ddf932827d75e6fa0b81d382Mangesh Ghiware final int size = uris.size(); 3345172dee697c05235ddf932827d75e6fa0b81d382Mangesh Ghiware if (size > 0) { 3355172dee697c05235ddf932827d75e6fa0b81d382Mangesh Ghiware if (size > 1) { 3365172dee697c05235ddf932827d75e6fa0b81d382Mangesh Ghiware intent.setAction(Intent.ACTION_SEND_MULTIPLE); 33751ebe5f71b9f00af95c8d64f1ff895fc7b9aa018Mangesh Ghiware intent.setType(GalleryUtils.MIME_TYPE_PANORAMA360); 3385172dee697c05235ddf932827d75e6fa0b81d382Mangesh Ghiware intent.putParcelableArrayListExtra(Intent.EXTRA_STREAM, uris); 3395172dee697c05235ddf932827d75e6fa0b81d382Mangesh Ghiware } else { 3405172dee697c05235ddf932827d75e6fa0b81d382Mangesh Ghiware intent.setAction(Intent.ACTION_SEND); 34151ebe5f71b9f00af95c8d64f1ff895fc7b9aa018Mangesh Ghiware intent.setType(GalleryUtils.MIME_TYPE_PANORAMA360); 3425172dee697c05235ddf932827d75e6fa0b81d382Mangesh Ghiware intent.putExtra(Intent.EXTRA_STREAM, uris.get(0)); 3435172dee697c05235ddf932827d75e6fa0b81d382Mangesh Ghiware } 344ca181a68a30ad830d55eb8886f62a323c64e1ba3Owen Lin intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION); 3455172dee697c05235ddf932827d75e6fa0b81d382Mangesh Ghiware } 3465172dee697c05235ddf932827d75e6fa0b81d382Mangesh Ghiware 3475172dee697c05235ddf932827d75e6fa0b81d382Mangesh Ghiware return intent; 3485172dee697c05235ddf932827d75e6fa0b81d382Mangesh Ghiware } 3495172dee697c05235ddf932827d75e6fa0b81d382Mangesh Ghiware 350549c968947cccc8bacca994f954629228b6b877fBobby Georgescu private Intent computeSharingIntent(JobContext jc, int maxItems) { 351549c968947cccc8bacca994f954629228b6b877fBobby Georgescu ArrayList<Path> expandedPaths = mSelectionManager.getSelected(true, maxItems); 352549c968947cccc8bacca994f954629228b6b877fBobby Georgescu if (expandedPaths == null || expandedPaths.size() == 0) { 353fc86994f86f8cfb31e151c9e730dc1e9dc7b3349Yuli Huang setNfcBeamPushUris(null); 354549c968947cccc8bacca994f954629228b6b877fBobby Georgescu return new Intent(); 355af4ab4faeeb640b285311a305ff128b33b964389Martijn Coenen } 356deff258ea4e5723b351739418919251ae1048e46Ray Chen final ArrayList<Uri> uris = new ArrayList<Uri>(); 357deff258ea4e5723b351739418919251ae1048e46Ray Chen DataManager manager = mActivity.getDataManager(); 358deff258ea4e5723b351739418919251ae1048e46Ray Chen int type = 0; 359deff258ea4e5723b351739418919251ae1048e46Ray Chen final Intent intent = new Intent(); 360301ea871a5f3b13adeae5ac1f0a36c86eff228e7Ray Chen for (Path path : expandedPaths) { 361301ea871a5f3b13adeae5ac1f0a36c86eff228e7Ray Chen if (jc.isCancelled()) return null; 3624b4dbd225685502f4249c2bf25bf74f7ce526645George Mount int support = manager.getSupportedOperations(path); 363deff258ea4e5723b351739418919251ae1048e46Ray Chen type |= manager.getMediaType(path); 364deff258ea4e5723b351739418919251ae1048e46Ray Chen 365deff258ea4e5723b351739418919251ae1048e46Ray Chen if ((support & MediaObject.SUPPORT_SHARE) != 0) { 366deff258ea4e5723b351739418919251ae1048e46Ray Chen uris.add(manager.getContentUri(path)); 367deff258ea4e5723b351739418919251ae1048e46Ray Chen } 368deff258ea4e5723b351739418919251ae1048e46Ray Chen } 369deff258ea4e5723b351739418919251ae1048e46Ray Chen 3708da5fdfe8f8d15aa688e504afd3ede2555de8bdeRay Chen final int size = uris.size(); 3718da5fdfe8f8d15aa688e504afd3ede2555de8bdeRay Chen if (size > 0) { 3725172dee697c05235ddf932827d75e6fa0b81d382Mangesh Ghiware final String mimeType = MenuExecutor.getMimeType(type); 3738da5fdfe8f8d15aa688e504afd3ede2555de8bdeRay Chen if (size > 1) { 3748da5fdfe8f8d15aa688e504afd3ede2555de8bdeRay Chen intent.setAction(Intent.ACTION_SEND_MULTIPLE).setType(mimeType); 3758da5fdfe8f8d15aa688e504afd3ede2555de8bdeRay Chen intent.putParcelableArrayListExtra(Intent.EXTRA_STREAM, uris); 3768da5fdfe8f8d15aa688e504afd3ede2555de8bdeRay Chen } else { 3778da5fdfe8f8d15aa688e504afd3ede2555de8bdeRay Chen intent.setAction(Intent.ACTION_SEND).setType(mimeType); 3788da5fdfe8f8d15aa688e504afd3ede2555de8bdeRay Chen intent.putExtra(Intent.EXTRA_STREAM, uris.get(0)); 3798da5fdfe8f8d15aa688e504afd3ede2555de8bdeRay Chen } 380ca181a68a30ad830d55eb8886f62a323c64e1ba3Owen Lin intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION); 381fc86994f86f8cfb31e151c9e730dc1e9dc7b3349Yuli Huang setNfcBeamPushUris(uris.toArray(new Uri[uris.size()])); 382af4ab4faeeb640b285311a305ff128b33b964389Martijn Coenen } else { 383fc86994f86f8cfb31e151c9e730dc1e9dc7b3349Yuli Huang setNfcBeamPushUris(null); 384deff258ea4e5723b351739418919251ae1048e46Ray Chen } 385301ea871a5f3b13adeae5ac1f0a36c86eff228e7Ray Chen 386301ea871a5f3b13adeae5ac1f0a36c86eff228e7Ray Chen return intent; 387f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 388f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 389f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin public void updateSupportedOperation(Path path, boolean selected) { 390f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin // TODO: We need to improve the performance 391f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin updateSupportedOperation(); 392f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 393f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 394f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin public void updateSupportedOperation() { 395301ea871a5f3b13adeae5ac1f0a36c86eff228e7Ray Chen // Interrupt previous unfinished task, mMenuTask is only accessed in main thread 396b21b8e58a604f6c701245d84b141b5b87663192bOwen Lin if (mMenuTask != null) mMenuTask.cancel(); 397f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 39821c2e665fdc1d1af0c91ab9c104d13fb7dc2444eRay Chen updateSelectionMenu(); 39921c2e665fdc1d1af0c91ab9c104d13fb7dc2444eRay Chen 4005172dee697c05235ddf932827d75e6fa0b81d382Mangesh Ghiware // Disable share actions until share intent is in good shape 4015172dee697c05235ddf932827d75e6fa0b81d382Mangesh Ghiware if (mSharePanoramaMenuItem != null) mSharePanoramaMenuItem.setEnabled(false); 402b21b8e58a604f6c701245d84b141b5b87663192bOwen Lin if (mShareMenuItem != null) mShareMenuItem.setEnabled(false); 403f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 404f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin // Generate sharing intent and update supported operations in the background 405301ea871a5f3b13adeae5ac1f0a36c86eff228e7Ray Chen // The task can take a long time and be canceled in the mean time. 406f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin mMenuTask = mActivity.getThreadPool().submit(new Job<Void>() { 4077817979db0c52ffeacb951625b1e821eba303285Ahbong Chang @Override 408301ea871a5f3b13adeae5ac1f0a36c86eff228e7Ray Chen public Void run(final JobContext jc) { 409301ea871a5f3b13adeae5ac1f0a36c86eff228e7Ray Chen // Pass1: Deal with unexpanded media object list for menu operation. 4104b4dbd225685502f4249c2bf25bf74f7ce526645George Mount ArrayList<MediaObject> selected = getSelectedMediaObjects(jc); 4114b4dbd225685502f4249c2bf25bf74f7ce526645George Mount if (selected == null) { 4122b85f0d788b9759dad3632561896e6c5dcbd4f99Doris Liu mMainHandler.post(new Runnable() { 4132b85f0d788b9759dad3632561896e6c5dcbd4f99Doris Liu @Override 4142b85f0d788b9759dad3632561896e6c5dcbd4f99Doris Liu public void run() { 4152b85f0d788b9759dad3632561896e6c5dcbd4f99Doris Liu mMenuTask = null; 4162b85f0d788b9759dad3632561896e6c5dcbd4f99Doris Liu if (jc.isCancelled()) return; 4172b85f0d788b9759dad3632561896e6c5dcbd4f99Doris Liu // Disable all the operations when no item is selected 4182b85f0d788b9759dad3632561896e6c5dcbd4f99Doris Liu MenuExecutor.updateMenuOperation(mMenu, 0); 4192b85f0d788b9759dad3632561896e6c5dcbd4f99Doris Liu } 4202b85f0d788b9759dad3632561896e6c5dcbd4f99Doris Liu }); 4214b4dbd225685502f4249c2bf25bf74f7ce526645George Mount return null; 4224b4dbd225685502f4249c2bf25bf74f7ce526645George Mount } 4234b4dbd225685502f4249c2bf25bf74f7ce526645George Mount final int operation = computeMenuOptions(selected); 4244b4dbd225685502f4249c2bf25bf74f7ce526645George Mount if (jc.isCancelled()) { 4254b4dbd225685502f4249c2bf25bf74f7ce526645George Mount return null; 4264b4dbd225685502f4249c2bf25bf74f7ce526645George Mount } 427549c968947cccc8bacca994f954629228b6b877fBobby Georgescu int numSelected = selected.size(); 428549c968947cccc8bacca994f954629228b6b877fBobby Georgescu final boolean canSharePanoramas = 429549c968947cccc8bacca994f954629228b6b877fBobby Georgescu numSelected < MAX_SELECTED_ITEMS_FOR_PANORAMA_SHARE_INTENT; 430549c968947cccc8bacca994f954629228b6b877fBobby Georgescu final boolean canShare = 431549c968947cccc8bacca994f954629228b6b877fBobby Georgescu numSelected < MAX_SELECTED_ITEMS_FOR_SHARE_INTENT; 432301ea871a5f3b13adeae5ac1f0a36c86eff228e7Ray Chen 433549c968947cccc8bacca994f954629228b6b877fBobby Georgescu final GetAllPanoramaSupports supportCallback = canSharePanoramas ? 434549c968947cccc8bacca994f954629228b6b877fBobby Georgescu new GetAllPanoramaSupports(selected, jc) 435549c968947cccc8bacca994f954629228b6b877fBobby Georgescu : null; 4364b4dbd225685502f4249c2bf25bf74f7ce526645George Mount 437549c968947cccc8bacca994f954629228b6b877fBobby Georgescu // Pass2: Deal with expanded media object list for sharing operation. 438549c968947cccc8bacca994f954629228b6b877fBobby Georgescu final Intent share_panorama_intent = canSharePanoramas ? 439549c968947cccc8bacca994f954629228b6b877fBobby Georgescu computePanoramaSharingIntent(jc, MAX_SELECTED_ITEMS_FOR_PANORAMA_SHARE_INTENT) 440549c968947cccc8bacca994f954629228b6b877fBobby Georgescu : new Intent(); 441549c968947cccc8bacca994f954629228b6b877fBobby Georgescu final Intent share_intent = canShare ? 442549c968947cccc8bacca994f954629228b6b877fBobby Georgescu computeSharingIntent(jc, MAX_SELECTED_ITEMS_FOR_SHARE_INTENT) 443549c968947cccc8bacca994f954629228b6b877fBobby Georgescu : new Intent(); 444549c968947cccc8bacca994f954629228b6b877fBobby Georgescu 445549c968947cccc8bacca994f954629228b6b877fBobby Georgescu if (canSharePanoramas) { 446549c968947cccc8bacca994f954629228b6b877fBobby Georgescu supportCallback.waitForPanoramaSupport(); 447549c968947cccc8bacca994f954629228b6b877fBobby Georgescu } 4484b4dbd225685502f4249c2bf25bf74f7ce526645George Mount if (jc.isCancelled()) { 4494b4dbd225685502f4249c2bf25bf74f7ce526645George Mount return null; 4504b4dbd225685502f4249c2bf25bf74f7ce526645George Mount } 451301ea871a5f3b13adeae5ac1f0a36c86eff228e7Ray Chen mMainHandler.post(new Runnable() { 4527817979db0c52ffeacb951625b1e821eba303285Ahbong Chang @Override 453301ea871a5f3b13adeae5ac1f0a36c86eff228e7Ray Chen public void run() { 454301ea871a5f3b13adeae5ac1f0a36c86eff228e7Ray Chen mMenuTask = null; 455b21b8e58a604f6c701245d84b141b5b87663192bOwen Lin if (jc.isCancelled()) return; 456b21b8e58a604f6c701245d84b141b5b87663192bOwen Lin MenuExecutor.updateMenuOperation(mMenu, operation); 457549c968947cccc8bacca994f954629228b6b877fBobby Georgescu MenuExecutor.updateMenuForPanorama(mMenu, 458549c968947cccc8bacca994f954629228b6b877fBobby Georgescu canSharePanoramas && supportCallback.mAllPanorama360, 459549c968947cccc8bacca994f954629228b6b877fBobby Georgescu canSharePanoramas && supportCallback.mHasPanorama360); 4605172dee697c05235ddf932827d75e6fa0b81d382Mangesh Ghiware if (mSharePanoramaMenuItem != null) { 4615172dee697c05235ddf932827d75e6fa0b81d382Mangesh Ghiware mSharePanoramaMenuItem.setEnabled(true); 462549c968947cccc8bacca994f954629228b6b877fBobby Georgescu if (canSharePanoramas && supportCallback.mAllPanorama360) { 463f98aafb7eb65b889b0f831d607828ca4f8af64b6Mangesh Ghiware mShareMenuItem.setShowAsAction(MenuItem.SHOW_AS_ACTION_NEVER); 4645172dee697c05235ddf932827d75e6fa0b81d382Mangesh Ghiware mShareMenuItem.setTitle( 4655172dee697c05235ddf932827d75e6fa0b81d382Mangesh Ghiware mActivity.getResources().getString(R.string.share_as_photo)); 4665172dee697c05235ddf932827d75e6fa0b81d382Mangesh Ghiware } else { 4675172dee697c05235ddf932827d75e6fa0b81d382Mangesh Ghiware mSharePanoramaMenuItem.setVisible(false); 4685172dee697c05235ddf932827d75e6fa0b81d382Mangesh Ghiware mShareMenuItem.setShowAsAction(MenuItem.SHOW_AS_ACTION_IF_ROOM); 4695172dee697c05235ddf932827d75e6fa0b81d382Mangesh Ghiware mShareMenuItem.setTitle( 4705172dee697c05235ddf932827d75e6fa0b81d382Mangesh Ghiware mActivity.getResources().getString(R.string.share)); 4715172dee697c05235ddf932827d75e6fa0b81d382Mangesh Ghiware } 4725172dee697c05235ddf932827d75e6fa0b81d382Mangesh Ghiware mSharePanoramaActionProvider.setShareIntent(share_panorama_intent); 4735172dee697c05235ddf932827d75e6fa0b81d382Mangesh Ghiware } 474b21b8e58a604f6c701245d84b141b5b87663192bOwen Lin if (mShareMenuItem != null) { 475549c968947cccc8bacca994f954629228b6b877fBobby Georgescu mShareMenuItem.setEnabled(canShare); 4765172dee697c05235ddf932827d75e6fa0b81d382Mangesh Ghiware mShareActionProvider.setShareIntent(share_intent); 477301ea871a5f3b13adeae5ac1f0a36c86eff228e7Ray Chen } 478301ea871a5f3b13adeae5ac1f0a36c86eff228e7Ray Chen } 479301ea871a5f3b13adeae5ac1f0a36c86eff228e7Ray Chen }); 480f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin return null; 481f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 482f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin }); 483f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 484f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 485f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin public void pause() { 486f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin if (mMenuTask != null) { 487f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin mMenuTask.cancel(); 488f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin mMenuTask = null; 489f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 490f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin mMenuExecutor.pause(); 491f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 492f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 493a2d0d34a90543ee19ea295e72c112fde18fb3828Bobby Georgescu public void destroy() { 494a2d0d34a90543ee19ea295e72c112fde18fb3828Bobby Georgescu mMenuExecutor.destroy(); 495a2d0d34a90543ee19ea295e72c112fde18fb3828Bobby Georgescu } 496a2d0d34a90543ee19ea295e72c112fde18fb3828Bobby Georgescu 497f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin public void resume() { 4980c1f2c80818a0326fa55e6f709b49584ceab60b1Ray Chen if (mSelectionManager.inSelectionMode()) updateSupportedOperation(); 499a2d0d34a90543ee19ea295e72c112fde18fb3828Bobby Georgescu mMenuExecutor.resume(); 500f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 501f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin} 502