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