1869f4a62594c4508aa57a8622b461b6825b74e7cBobby Georgescu/*
2869f4a62594c4508aa57a8622b461b6825b74e7cBobby Georgescu * Copyright (C) 2013 The Android Open Source Project
3869f4a62594c4508aa57a8622b461b6825b74e7cBobby Georgescu *
4869f4a62594c4508aa57a8622b461b6825b74e7cBobby Georgescu * Licensed under the Apache License, Version 2.0 (the "License");
5869f4a62594c4508aa57a8622b461b6825b74e7cBobby Georgescu * you may not use this file except in compliance with the License.
6869f4a62594c4508aa57a8622b461b6825b74e7cBobby Georgescu * You may obtain a copy of the License at
7869f4a62594c4508aa57a8622b461b6825b74e7cBobby Georgescu *
8869f4a62594c4508aa57a8622b461b6825b74e7cBobby Georgescu *      http://www.apache.org/licenses/LICENSE-2.0
9869f4a62594c4508aa57a8622b461b6825b74e7cBobby Georgescu *
10869f4a62594c4508aa57a8622b461b6825b74e7cBobby Georgescu * Unless required by applicable law or agreed to in writing, software
11869f4a62594c4508aa57a8622b461b6825b74e7cBobby Georgescu * distributed under the License is distributed on an "AS IS" BASIS,
12869f4a62594c4508aa57a8622b461b6825b74e7cBobby Georgescu * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13869f4a62594c4508aa57a8622b461b6825b74e7cBobby Georgescu * See the License for the specific language governing permissions and
14869f4a62594c4508aa57a8622b461b6825b74e7cBobby Georgescu * limitations under the License.
15869f4a62594c4508aa57a8622b461b6825b74e7cBobby Georgescu */
16869f4a62594c4508aa57a8622b461b6825b74e7cBobby Georgescu
17869f4a62594c4508aa57a8622b461b6825b74e7cBobby Georgescupackage com.android.photos;
18869f4a62594c4508aa57a8622b461b6825b74e7cBobby Georgescu
191a719804ddd5c6fc9a6914ef5a2b6e914834d1f9Bobby Georgescuimport android.app.Activity;
20869f4a62594c4508aa57a8622b461b6825b74e7cBobby Georgescuimport android.content.Context;
21869f4a62594c4508aa57a8622b461b6825b74e7cBobby Georgescuimport android.content.Intent;
22869f4a62594c4508aa57a8622b461b6825b74e7cBobby Georgescuimport android.net.Uri;
23869f4a62594c4508aa57a8622b461b6825b74e7cBobby Georgescuimport android.os.AsyncTask;
241a719804ddd5c6fc9a6914ef5a2b6e914834d1f9Bobby Georgescuimport android.provider.MediaStore.Files.FileColumns;
25869f4a62594c4508aa57a8622b461b6825b74e7cBobby Georgescuimport android.util.SparseBooleanArray;
26869f4a62594c4508aa57a8622b461b6825b74e7cBobby Georgescuimport android.view.ActionMode;
27869f4a62594c4508aa57a8622b461b6825b74e7cBobby Georgescuimport android.view.Menu;
28869f4a62594c4508aa57a8622b461b6825b74e7cBobby Georgescuimport android.view.MenuInflater;
29869f4a62594c4508aa57a8622b461b6825b74e7cBobby Georgescuimport android.view.MenuItem;
30869f4a62594c4508aa57a8622b461b6825b74e7cBobby Georgescuimport android.widget.AbsListView.MultiChoiceModeListener;
31869f4a62594c4508aa57a8622b461b6825b74e7cBobby Georgescuimport android.widget.ShareActionProvider;
32869f4a62594c4508aa57a8622b461b6825b74e7cBobby Georgescuimport android.widget.ShareActionProvider.OnShareTargetSelectedListener;
33869f4a62594c4508aa57a8622b461b6825b74e7cBobby Georgescu
34869f4a62594c4508aa57a8622b461b6825b74e7cBobby Georgescuimport com.android.gallery3d.R;
351a719804ddd5c6fc9a6914ef5a2b6e914834d1f9Bobby Georgescuimport com.android.gallery3d.app.TrimVideo;
36869f4a62594c4508aa57a8622b461b6825b74e7cBobby Georgescuimport com.android.gallery3d.data.MediaObject;
371a719804ddd5c6fc9a6914ef5a2b6e914834d1f9Bobby Georgescuimport com.android.gallery3d.filtershow.FilterShowActivity;
38d25fdea42988c72312ab3be0be76ab75e4d944c8Ruben Brunkimport com.android.gallery3d.filtershow.crop.CropActivity;
391a719804ddd5c6fc9a6914ef5a2b6e914834d1f9Bobby Georgescuimport com.android.gallery3d.util.GalleryUtils;
40869f4a62594c4508aa57a8622b461b6825b74e7cBobby Georgescu
41869f4a62594c4508aa57a8622b461b6825b74e7cBobby Georgescuimport java.util.ArrayList;
42869f4a62594c4508aa57a8622b461b6825b74e7cBobby Georgescuimport java.util.List;
43869f4a62594c4508aa57a8622b461b6825b74e7cBobby Georgescu
44869f4a62594c4508aa57a8622b461b6825b74e7cBobby Georgescupublic class MultiChoiceManager implements MultiChoiceModeListener,
45869f4a62594c4508aa57a8622b461b6825b74e7cBobby Georgescu    OnShareTargetSelectedListener, SelectionManager.SelectedUriSource {
46869f4a62594c4508aa57a8622b461b6825b74e7cBobby Georgescu
47c1a015f3b9a896179d2b4778e50988460cfd34fbBobby Georgescu    public interface Provider {
48c1a015f3b9a896179d2b4778e50988460cfd34fbBobby Georgescu        public MultiChoiceManager getMultiChoiceManager();
49c1a015f3b9a896179d2b4778e50988460cfd34fbBobby Georgescu    }
50c1a015f3b9a896179d2b4778e50988460cfd34fbBobby Georgescu
51869f4a62594c4508aa57a8622b461b6825b74e7cBobby Georgescu    public interface Delegate {
52869f4a62594c4508aa57a8622b461b6825b74e7cBobby Georgescu        public SparseBooleanArray getSelectedItemPositions();
53869f4a62594c4508aa57a8622b461b6825b74e7cBobby Georgescu        public int getSelectedItemCount();
54869f4a62594c4508aa57a8622b461b6825b74e7cBobby Georgescu        public int getItemMediaType(Object item);
55869f4a62594c4508aa57a8622b461b6825b74e7cBobby Georgescu        public int getItemSupportedOperations(Object item);
56869f4a62594c4508aa57a8622b461b6825b74e7cBobby Georgescu        public ArrayList<Uri> getSubItemUrisForItem(Object item);
571a719804ddd5c6fc9a6914ef5a2b6e914834d1f9Bobby Georgescu        public Uri getItemUri(Object item);
58869f4a62594c4508aa57a8622b461b6825b74e7cBobby Georgescu        public Object getItemAtPosition(int position);
59869f4a62594c4508aa57a8622b461b6825b74e7cBobby Georgescu        public Object getPathForItemAtPosition(int position);
60869f4a62594c4508aa57a8622b461b6825b74e7cBobby Georgescu        public void deleteItemWithPath(Object itemPath);
61869f4a62594c4508aa57a8622b461b6825b74e7cBobby Georgescu    }
62869f4a62594c4508aa57a8622b461b6825b74e7cBobby Georgescu
63869f4a62594c4508aa57a8622b461b6825b74e7cBobby Georgescu    private SelectionManager mSelectionManager;
64869f4a62594c4508aa57a8622b461b6825b74e7cBobby Georgescu    private ShareActionProvider mShareActionProvider;
65869f4a62594c4508aa57a8622b461b6825b74e7cBobby Georgescu    private ActionMode mActionMode;
66869f4a62594c4508aa57a8622b461b6825b74e7cBobby Georgescu    private Context mContext;
67869f4a62594c4508aa57a8622b461b6825b74e7cBobby Georgescu    private Delegate mDelegate;
68869f4a62594c4508aa57a8622b461b6825b74e7cBobby Georgescu
691a719804ddd5c6fc9a6914ef5a2b6e914834d1f9Bobby Georgescu    private ArrayList<Uri> mSelectedShareableUrisArray = new ArrayList<Uri>();
70869f4a62594c4508aa57a8622b461b6825b74e7cBobby Georgescu
71ef43b57345a7fbb39e22289328f52f16dcd45635Bobby Georgescu    public MultiChoiceManager(Activity activity) {
72ef43b57345a7fbb39e22289328f52f16dcd45635Bobby Georgescu        mContext = activity;
73ef43b57345a7fbb39e22289328f52f16dcd45635Bobby Georgescu        mSelectionManager = new SelectionManager(activity);
74869f4a62594c4508aa57a8622b461b6825b74e7cBobby Georgescu    }
75869f4a62594c4508aa57a8622b461b6825b74e7cBobby Georgescu
76ef43b57345a7fbb39e22289328f52f16dcd45635Bobby Georgescu    public void setDelegate(Delegate delegate) {
77ef43b57345a7fbb39e22289328f52f16dcd45635Bobby Georgescu        if (mDelegate == delegate) {
78ef43b57345a7fbb39e22289328f52f16dcd45635Bobby Georgescu            return;
79ef43b57345a7fbb39e22289328f52f16dcd45635Bobby Georgescu        }
80ef43b57345a7fbb39e22289328f52f16dcd45635Bobby Georgescu        if (mActionMode != null) {
81ef43b57345a7fbb39e22289328f52f16dcd45635Bobby Georgescu            mActionMode.finish();
82ef43b57345a7fbb39e22289328f52f16dcd45635Bobby Georgescu        }
83ef43b57345a7fbb39e22289328f52f16dcd45635Bobby Georgescu        mDelegate = delegate;
84869f4a62594c4508aa57a8622b461b6825b74e7cBobby Georgescu    }
85869f4a62594c4508aa57a8622b461b6825b74e7cBobby Georgescu
86869f4a62594c4508aa57a8622b461b6825b74e7cBobby Georgescu    @Override
87869f4a62594c4508aa57a8622b461b6825b74e7cBobby Georgescu    public ArrayList<Uri> getSelectedShareableUris() {
881a719804ddd5c6fc9a6914ef5a2b6e914834d1f9Bobby Georgescu        return mSelectedShareableUrisArray;
89869f4a62594c4508aa57a8622b461b6825b74e7cBobby Georgescu    }
90869f4a62594c4508aa57a8622b461b6825b74e7cBobby Georgescu
91869f4a62594c4508aa57a8622b461b6825b74e7cBobby Georgescu    private void updateSelectedTitle(ActionMode mode) {
92869f4a62594c4508aa57a8622b461b6825b74e7cBobby Georgescu        int count = mDelegate.getSelectedItemCount();
93869f4a62594c4508aa57a8622b461b6825b74e7cBobby Georgescu        mode.setTitle(mContext.getResources().getQuantityString(
94869f4a62594c4508aa57a8622b461b6825b74e7cBobby Georgescu                R.plurals.number_of_items_selected, count, count));
95869f4a62594c4508aa57a8622b461b6825b74e7cBobby Georgescu    }
96869f4a62594c4508aa57a8622b461b6825b74e7cBobby Georgescu
971a719804ddd5c6fc9a6914ef5a2b6e914834d1f9Bobby Georgescu    private String getItemMimetype(Object item) {
981a719804ddd5c6fc9a6914ef5a2b6e914834d1f9Bobby Georgescu        int type = mDelegate.getItemMediaType(item);
991a719804ddd5c6fc9a6914ef5a2b6e914834d1f9Bobby Georgescu        if (type == FileColumns.MEDIA_TYPE_IMAGE) {
1001a719804ddd5c6fc9a6914ef5a2b6e914834d1f9Bobby Georgescu            return GalleryUtils.MIME_TYPE_IMAGE;
1011a719804ddd5c6fc9a6914ef5a2b6e914834d1f9Bobby Georgescu        } else if (type == FileColumns.MEDIA_TYPE_VIDEO) {
1021a719804ddd5c6fc9a6914ef5a2b6e914834d1f9Bobby Georgescu            return GalleryUtils.MIME_TYPE_VIDEO;
1031a719804ddd5c6fc9a6914ef5a2b6e914834d1f9Bobby Georgescu        } else {
1041a719804ddd5c6fc9a6914ef5a2b6e914834d1f9Bobby Georgescu            return GalleryUtils.MIME_TYPE_ALL;
1051a719804ddd5c6fc9a6914ef5a2b6e914834d1f9Bobby Georgescu        }
1061a719804ddd5c6fc9a6914ef5a2b6e914834d1f9Bobby Georgescu    }
107ef43b57345a7fbb39e22289328f52f16dcd45635Bobby Georgescu
108869f4a62594c4508aa57a8622b461b6825b74e7cBobby Georgescu    @Override
109869f4a62594c4508aa57a8622b461b6825b74e7cBobby Georgescu    public void onItemCheckedStateChanged(ActionMode mode, int position, long id,
110869f4a62594c4508aa57a8622b461b6825b74e7cBobby Georgescu            boolean checked) {
111869f4a62594c4508aa57a8622b461b6825b74e7cBobby Georgescu        updateSelectedTitle(mode);
112869f4a62594c4508aa57a8622b461b6825b74e7cBobby Georgescu        Object item = mDelegate.getItemAtPosition(position);
113869f4a62594c4508aa57a8622b461b6825b74e7cBobby Georgescu
1141a719804ddd5c6fc9a6914ef5a2b6e914834d1f9Bobby Georgescu        int supported = mDelegate.getItemSupportedOperations(item);
1151a719804ddd5c6fc9a6914ef5a2b6e914834d1f9Bobby Georgescu
1161a719804ddd5c6fc9a6914ef5a2b6e914834d1f9Bobby Georgescu        if ((supported & MediaObject.SUPPORT_SHARE) > 0) {
1171a719804ddd5c6fc9a6914ef5a2b6e914834d1f9Bobby Georgescu            ArrayList<Uri> subItems = mDelegate.getSubItemUrisForItem(item);
1181a719804ddd5c6fc9a6914ef5a2b6e914834d1f9Bobby Georgescu            if (checked) {
1191a719804ddd5c6fc9a6914ef5a2b6e914834d1f9Bobby Georgescu                mSelectedShareableUrisArray.addAll(subItems);
1201a719804ddd5c6fc9a6914ef5a2b6e914834d1f9Bobby Georgescu            } else {
1211a719804ddd5c6fc9a6914ef5a2b6e914834d1f9Bobby Georgescu                mSelectedShareableUrisArray.removeAll(subItems);
1221a719804ddd5c6fc9a6914ef5a2b6e914834d1f9Bobby Georgescu            }
123869f4a62594c4508aa57a8622b461b6825b74e7cBobby Georgescu        }
124869f4a62594c4508aa57a8622b461b6825b74e7cBobby Georgescu
125869f4a62594c4508aa57a8622b461b6825b74e7cBobby Georgescu        mSelectionManager.onItemSelectedStateChanged(mShareActionProvider,
126869f4a62594c4508aa57a8622b461b6825b74e7cBobby Georgescu                mDelegate.getItemMediaType(item),
1271a719804ddd5c6fc9a6914ef5a2b6e914834d1f9Bobby Georgescu                supported,
128869f4a62594c4508aa57a8622b461b6825b74e7cBobby Georgescu                checked);
129869f4a62594c4508aa57a8622b461b6825b74e7cBobby Georgescu        updateActionItemVisibilities(mode.getMenu(),
130869f4a62594c4508aa57a8622b461b6825b74e7cBobby Georgescu                mSelectionManager.getSupportedOperations());
131869f4a62594c4508aa57a8622b461b6825b74e7cBobby Georgescu    }
132869f4a62594c4508aa57a8622b461b6825b74e7cBobby Georgescu
133869f4a62594c4508aa57a8622b461b6825b74e7cBobby Georgescu    private void updateActionItemVisibilities(Menu menu, int supportedOperations) {
1341a719804ddd5c6fc9a6914ef5a2b6e914834d1f9Bobby Georgescu        MenuItem editItem = menu.findItem(R.id.menu_edit);
135869f4a62594c4508aa57a8622b461b6825b74e7cBobby Georgescu        MenuItem deleteItem = menu.findItem(R.id.menu_delete);
1361a719804ddd5c6fc9a6914ef5a2b6e914834d1f9Bobby Georgescu        MenuItem shareItem = menu.findItem(R.id.menu_share);
1371a719804ddd5c6fc9a6914ef5a2b6e914834d1f9Bobby Georgescu        MenuItem cropItem = menu.findItem(R.id.menu_crop);
1381a719804ddd5c6fc9a6914ef5a2b6e914834d1f9Bobby Georgescu        MenuItem trimItem = menu.findItem(R.id.menu_trim);
1391a719804ddd5c6fc9a6914ef5a2b6e914834d1f9Bobby Georgescu        MenuItem muteItem = menu.findItem(R.id.menu_mute);
1401a719804ddd5c6fc9a6914ef5a2b6e914834d1f9Bobby Georgescu        MenuItem setAsItem = menu.findItem(R.id.menu_set_as);
1411a719804ddd5c6fc9a6914ef5a2b6e914834d1f9Bobby Georgescu
1421a719804ddd5c6fc9a6914ef5a2b6e914834d1f9Bobby Georgescu        editItem.setVisible((supportedOperations & MediaObject.SUPPORT_EDIT) > 0);
143869f4a62594c4508aa57a8622b461b6825b74e7cBobby Georgescu        deleteItem.setVisible((supportedOperations & MediaObject.SUPPORT_DELETE) > 0);
1441a719804ddd5c6fc9a6914ef5a2b6e914834d1f9Bobby Georgescu        shareItem.setVisible((supportedOperations & MediaObject.SUPPORT_SHARE) > 0);
1451a719804ddd5c6fc9a6914ef5a2b6e914834d1f9Bobby Georgescu        cropItem.setVisible((supportedOperations & MediaObject.SUPPORT_CROP) > 0);
1461a719804ddd5c6fc9a6914ef5a2b6e914834d1f9Bobby Georgescu        trimItem.setVisible((supportedOperations & MediaObject.SUPPORT_TRIM) > 0);
1471a719804ddd5c6fc9a6914ef5a2b6e914834d1f9Bobby Georgescu        muteItem.setVisible((supportedOperations & MediaObject.SUPPORT_MUTE) > 0);
1481a719804ddd5c6fc9a6914ef5a2b6e914834d1f9Bobby Georgescu        setAsItem.setVisible((supportedOperations & MediaObject.SUPPORT_SETAS) > 0);
149869f4a62594c4508aa57a8622b461b6825b74e7cBobby Georgescu    }
150869f4a62594c4508aa57a8622b461b6825b74e7cBobby Georgescu
151869f4a62594c4508aa57a8622b461b6825b74e7cBobby Georgescu    @Override
152869f4a62594c4508aa57a8622b461b6825b74e7cBobby Georgescu    public boolean onCreateActionMode(ActionMode mode, Menu menu) {
153869f4a62594c4508aa57a8622b461b6825b74e7cBobby Georgescu        mSelectionManager.setSelectedUriSource(this);
154869f4a62594c4508aa57a8622b461b6825b74e7cBobby Georgescu        mActionMode = mode;
155869f4a62594c4508aa57a8622b461b6825b74e7cBobby Georgescu        MenuInflater inflater = mode.getMenuInflater();
156869f4a62594c4508aa57a8622b461b6825b74e7cBobby Georgescu        inflater.inflate(R.menu.gallery_multiselect, menu);
157869f4a62594c4508aa57a8622b461b6825b74e7cBobby Georgescu        MenuItem menuItem = menu.findItem(R.id.menu_share);
158869f4a62594c4508aa57a8622b461b6825b74e7cBobby Georgescu        mShareActionProvider = (ShareActionProvider) menuItem.getActionProvider();
159869f4a62594c4508aa57a8622b461b6825b74e7cBobby Georgescu        mShareActionProvider.setOnShareTargetSelectedListener(this);
160869f4a62594c4508aa57a8622b461b6825b74e7cBobby Georgescu        updateSelectedTitle(mode);
161869f4a62594c4508aa57a8622b461b6825b74e7cBobby Georgescu        return true;
162869f4a62594c4508aa57a8622b461b6825b74e7cBobby Georgescu    }
163869f4a62594c4508aa57a8622b461b6825b74e7cBobby Georgescu
164869f4a62594c4508aa57a8622b461b6825b74e7cBobby Georgescu    @Override
165869f4a62594c4508aa57a8622b461b6825b74e7cBobby Georgescu    public void onDestroyActionMode(ActionMode mode) {
166869f4a62594c4508aa57a8622b461b6825b74e7cBobby Georgescu        // onDestroyActionMode gets called when the share target was selected,
167869f4a62594c4508aa57a8622b461b6825b74e7cBobby Georgescu        // but apparently before the ArrayList is serialized in the intent
168869f4a62594c4508aa57a8622b461b6825b74e7cBobby Georgescu        // so we can't clear the old one here.
1691a719804ddd5c6fc9a6914ef5a2b6e914834d1f9Bobby Georgescu        mSelectedShareableUrisArray = new ArrayList<Uri>();
170869f4a62594c4508aa57a8622b461b6825b74e7cBobby Georgescu        mSelectionManager.onClearSelection();
171869f4a62594c4508aa57a8622b461b6825b74e7cBobby Georgescu        mSelectionManager.setSelectedUriSource(null);
172869f4a62594c4508aa57a8622b461b6825b74e7cBobby Georgescu        mShareActionProvider = null;
173869f4a62594c4508aa57a8622b461b6825b74e7cBobby Georgescu        mActionMode = null;
174869f4a62594c4508aa57a8622b461b6825b74e7cBobby Georgescu    }
175869f4a62594c4508aa57a8622b461b6825b74e7cBobby Georgescu
176869f4a62594c4508aa57a8622b461b6825b74e7cBobby Georgescu    @Override
177869f4a62594c4508aa57a8622b461b6825b74e7cBobby Georgescu    public boolean onPrepareActionMode(ActionMode mode, Menu menu) {
178869f4a62594c4508aa57a8622b461b6825b74e7cBobby Georgescu        updateSelectedTitle(mode);
179869f4a62594c4508aa57a8622b461b6825b74e7cBobby Georgescu        return false;
180869f4a62594c4508aa57a8622b461b6825b74e7cBobby Georgescu    }
181869f4a62594c4508aa57a8622b461b6825b74e7cBobby Georgescu
182869f4a62594c4508aa57a8622b461b6825b74e7cBobby Georgescu    @Override
183869f4a62594c4508aa57a8622b461b6825b74e7cBobby Georgescu    public boolean onShareTargetSelected(ShareActionProvider provider, Intent intent) {
184869f4a62594c4508aa57a8622b461b6825b74e7cBobby Georgescu        mActionMode.finish();
185869f4a62594c4508aa57a8622b461b6825b74e7cBobby Georgescu        return false;
186869f4a62594c4508aa57a8622b461b6825b74e7cBobby Georgescu    }
187869f4a62594c4508aa57a8622b461b6825b74e7cBobby Georgescu
188869f4a62594c4508aa57a8622b461b6825b74e7cBobby Georgescu    private static class BulkDeleteTask extends AsyncTask<Void, Void, Void> {
189869f4a62594c4508aa57a8622b461b6825b74e7cBobby Georgescu        private Delegate mDelegate;
190869f4a62594c4508aa57a8622b461b6825b74e7cBobby Georgescu        private List<Object> mPaths;
191869f4a62594c4508aa57a8622b461b6825b74e7cBobby Georgescu
192869f4a62594c4508aa57a8622b461b6825b74e7cBobby Georgescu        public BulkDeleteTask(Delegate delegate, List<Object> paths) {
193869f4a62594c4508aa57a8622b461b6825b74e7cBobby Georgescu            mDelegate = delegate;
194869f4a62594c4508aa57a8622b461b6825b74e7cBobby Georgescu            mPaths = paths;
195869f4a62594c4508aa57a8622b461b6825b74e7cBobby Georgescu        }
196869f4a62594c4508aa57a8622b461b6825b74e7cBobby Georgescu
197869f4a62594c4508aa57a8622b461b6825b74e7cBobby Georgescu        @Override
198869f4a62594c4508aa57a8622b461b6825b74e7cBobby Georgescu        protected Void doInBackground(Void... ignored) {
199869f4a62594c4508aa57a8622b461b6825b74e7cBobby Georgescu            for (Object path : mPaths) {
200869f4a62594c4508aa57a8622b461b6825b74e7cBobby Georgescu                mDelegate.deleteItemWithPath(path);
201869f4a62594c4508aa57a8622b461b6825b74e7cBobby Georgescu            }
202869f4a62594c4508aa57a8622b461b6825b74e7cBobby Georgescu            return null;
203869f4a62594c4508aa57a8622b461b6825b74e7cBobby Georgescu        }
204869f4a62594c4508aa57a8622b461b6825b74e7cBobby Georgescu    }
205869f4a62594c4508aa57a8622b461b6825b74e7cBobby Georgescu
206869f4a62594c4508aa57a8622b461b6825b74e7cBobby Georgescu    @Override
207869f4a62594c4508aa57a8622b461b6825b74e7cBobby Georgescu    public boolean onActionItemClicked(ActionMode mode, MenuItem item) {
2081a719804ddd5c6fc9a6914ef5a2b6e914834d1f9Bobby Georgescu        int actionItemId = item.getItemId();
2091a719804ddd5c6fc9a6914ef5a2b6e914834d1f9Bobby Georgescu        switch (actionItemId) {
210869f4a62594c4508aa57a8622b461b6825b74e7cBobby Georgescu            case R.id.menu_delete:
211869f4a62594c4508aa57a8622b461b6825b74e7cBobby Georgescu                BulkDeleteTask deleteTask = new BulkDeleteTask(mDelegate,
212869f4a62594c4508aa57a8622b461b6825b74e7cBobby Georgescu                        getPathsForSelectedItems());
2131a719804ddd5c6fc9a6914ef5a2b6e914834d1f9Bobby Georgescu                deleteTask.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR);
2141a719804ddd5c6fc9a6914ef5a2b6e914834d1f9Bobby Georgescu                mode.finish();
2151a719804ddd5c6fc9a6914ef5a2b6e914834d1f9Bobby Georgescu                return true;
2161a719804ddd5c6fc9a6914ef5a2b6e914834d1f9Bobby Georgescu            case R.id.menu_edit:
2171a719804ddd5c6fc9a6914ef5a2b6e914834d1f9Bobby Georgescu            case R.id.menu_crop:
2181a719804ddd5c6fc9a6914ef5a2b6e914834d1f9Bobby Georgescu            case R.id.menu_trim:
2191a719804ddd5c6fc9a6914ef5a2b6e914834d1f9Bobby Georgescu            case R.id.menu_mute:
2201a719804ddd5c6fc9a6914ef5a2b6e914834d1f9Bobby Georgescu            case R.id.menu_set_as:
2211a719804ddd5c6fc9a6914ef5a2b6e914834d1f9Bobby Georgescu                singleItemAction(getSelectedItem(), actionItemId);
222869f4a62594c4508aa57a8622b461b6825b74e7cBobby Georgescu                mode.finish();
223869f4a62594c4508aa57a8622b461b6825b74e7cBobby Georgescu                return true;
224869f4a62594c4508aa57a8622b461b6825b74e7cBobby Georgescu            default:
225869f4a62594c4508aa57a8622b461b6825b74e7cBobby Georgescu                return false;
226869f4a62594c4508aa57a8622b461b6825b74e7cBobby Georgescu        }
227869f4a62594c4508aa57a8622b461b6825b74e7cBobby Georgescu    }
228869f4a62594c4508aa57a8622b461b6825b74e7cBobby Georgescu
2291a719804ddd5c6fc9a6914ef5a2b6e914834d1f9Bobby Georgescu    private void singleItemAction(Object item, int actionItemId) {
2301a719804ddd5c6fc9a6914ef5a2b6e914834d1f9Bobby Georgescu        Intent intent = new Intent();
2311a719804ddd5c6fc9a6914ef5a2b6e914834d1f9Bobby Georgescu        String mime = getItemMimetype(item);
2321a719804ddd5c6fc9a6914ef5a2b6e914834d1f9Bobby Georgescu        Uri uri = mDelegate.getItemUri(item);
2331a719804ddd5c6fc9a6914ef5a2b6e914834d1f9Bobby Georgescu        switch (actionItemId) {
2341a719804ddd5c6fc9a6914ef5a2b6e914834d1f9Bobby Georgescu            case R.id.menu_edit:
2351a719804ddd5c6fc9a6914ef5a2b6e914834d1f9Bobby Georgescu                intent.setDataAndType(uri, mime)
2361a719804ddd5c6fc9a6914ef5a2b6e914834d1f9Bobby Georgescu                      .setFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION)
2371a719804ddd5c6fc9a6914ef5a2b6e914834d1f9Bobby Georgescu                      .setAction(Intent.ACTION_EDIT);
2381a719804ddd5c6fc9a6914ef5a2b6e914834d1f9Bobby Georgescu                mContext.startActivity(Intent.createChooser(intent, null));
2391a719804ddd5c6fc9a6914ef5a2b6e914834d1f9Bobby Georgescu                return;
2401a719804ddd5c6fc9a6914ef5a2b6e914834d1f9Bobby Georgescu            case R.id.menu_crop:
2411a719804ddd5c6fc9a6914ef5a2b6e914834d1f9Bobby Georgescu                intent.setDataAndType(uri, mime)
2421a719804ddd5c6fc9a6914ef5a2b6e914834d1f9Bobby Georgescu                      .setFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION)
243d25fdea42988c72312ab3be0be76ab75e4d944c8Ruben Brunk                      .setAction(CropActivity.CROP_ACTION)
2441a719804ddd5c6fc9a6914ef5a2b6e914834d1f9Bobby Georgescu                      .setClass(mContext, FilterShowActivity.class);
2451a719804ddd5c6fc9a6914ef5a2b6e914834d1f9Bobby Georgescu                mContext.startActivity(intent);
2461a719804ddd5c6fc9a6914ef5a2b6e914834d1f9Bobby Georgescu                return;
2471a719804ddd5c6fc9a6914ef5a2b6e914834d1f9Bobby Georgescu            case R.id.menu_trim:
2481a719804ddd5c6fc9a6914ef5a2b6e914834d1f9Bobby Georgescu                intent.setData(uri)
2491a719804ddd5c6fc9a6914ef5a2b6e914834d1f9Bobby Georgescu                      .setClass(mContext, TrimVideo.class);
2501a719804ddd5c6fc9a6914ef5a2b6e914834d1f9Bobby Georgescu                mContext.startActivity(intent);
2511a719804ddd5c6fc9a6914ef5a2b6e914834d1f9Bobby Georgescu                return;
2521a719804ddd5c6fc9a6914ef5a2b6e914834d1f9Bobby Georgescu            case R.id.menu_mute:
2531a719804ddd5c6fc9a6914ef5a2b6e914834d1f9Bobby Georgescu                /* TODO need a way to get the file path of an item
2541a719804ddd5c6fc9a6914ef5a2b6e914834d1f9Bobby Georgescu                MuteVideo muteVideo = new MuteVideo(filePath,
2551a719804ddd5c6fc9a6914ef5a2b6e914834d1f9Bobby Georgescu                        uri, (Activity) mContext);
2561a719804ddd5c6fc9a6914ef5a2b6e914834d1f9Bobby Georgescu                muteVideo.muteInBackground();
2571a719804ddd5c6fc9a6914ef5a2b6e914834d1f9Bobby Georgescu                */
2581a719804ddd5c6fc9a6914ef5a2b6e914834d1f9Bobby Georgescu                return;
2591a719804ddd5c6fc9a6914ef5a2b6e914834d1f9Bobby Georgescu            case R.id.menu_set_as:
2601a719804ddd5c6fc9a6914ef5a2b6e914834d1f9Bobby Georgescu                intent.setDataAndType(uri, mime)
2611a719804ddd5c6fc9a6914ef5a2b6e914834d1f9Bobby Georgescu                      .setFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION)
2621a719804ddd5c6fc9a6914ef5a2b6e914834d1f9Bobby Georgescu                      .setAction(Intent.ACTION_ATTACH_DATA)
2631a719804ddd5c6fc9a6914ef5a2b6e914834d1f9Bobby Georgescu                      .putExtra("mimeType", mime);
2641a719804ddd5c6fc9a6914ef5a2b6e914834d1f9Bobby Georgescu                mContext.startActivity(Intent.createChooser(
2651a719804ddd5c6fc9a6914ef5a2b6e914834d1f9Bobby Georgescu                        intent, mContext.getString(R.string.set_as)));
2661a719804ddd5c6fc9a6914ef5a2b6e914834d1f9Bobby Georgescu                return;
2671a719804ddd5c6fc9a6914ef5a2b6e914834d1f9Bobby Georgescu            default:
2681a719804ddd5c6fc9a6914ef5a2b6e914834d1f9Bobby Georgescu                return;
2691a719804ddd5c6fc9a6914ef5a2b6e914834d1f9Bobby Georgescu        }
2701a719804ddd5c6fc9a6914ef5a2b6e914834d1f9Bobby Georgescu    }
2711a719804ddd5c6fc9a6914ef5a2b6e914834d1f9Bobby Georgescu
272869f4a62594c4508aa57a8622b461b6825b74e7cBobby Georgescu    private List<Object> getPathsForSelectedItems() {
273869f4a62594c4508aa57a8622b461b6825b74e7cBobby Georgescu        List<Object> paths = new ArrayList<Object>();
274869f4a62594c4508aa57a8622b461b6825b74e7cBobby Georgescu        SparseBooleanArray selected = mDelegate.getSelectedItemPositions();
275869f4a62594c4508aa57a8622b461b6825b74e7cBobby Georgescu        for (int i = 0; i < selected.size(); i++) {
276869f4a62594c4508aa57a8622b461b6825b74e7cBobby Georgescu            if (selected.valueAt(i)) {
277869f4a62594c4508aa57a8622b461b6825b74e7cBobby Georgescu                paths.add(mDelegate.getPathForItemAtPosition(i));
278869f4a62594c4508aa57a8622b461b6825b74e7cBobby Georgescu            }
279869f4a62594c4508aa57a8622b461b6825b74e7cBobby Georgescu        }
280869f4a62594c4508aa57a8622b461b6825b74e7cBobby Georgescu        return paths;
281869f4a62594c4508aa57a8622b461b6825b74e7cBobby Georgescu    }
2821a719804ddd5c6fc9a6914ef5a2b6e914834d1f9Bobby Georgescu
2831a719804ddd5c6fc9a6914ef5a2b6e914834d1f9Bobby Georgescu    public Object getSelectedItem() {
2841a719804ddd5c6fc9a6914ef5a2b6e914834d1f9Bobby Georgescu        if (mDelegate.getSelectedItemCount() != 1) {
2851a719804ddd5c6fc9a6914ef5a2b6e914834d1f9Bobby Georgescu            return null;
2861a719804ddd5c6fc9a6914ef5a2b6e914834d1f9Bobby Georgescu        }
2871a719804ddd5c6fc9a6914ef5a2b6e914834d1f9Bobby Georgescu        SparseBooleanArray selected = mDelegate.getSelectedItemPositions();
2881a719804ddd5c6fc9a6914ef5a2b6e914834d1f9Bobby Georgescu        for (int i = 0; i < selected.size(); i++) {
2891a719804ddd5c6fc9a6914ef5a2b6e914834d1f9Bobby Georgescu            if (selected.valueAt(i)) {
2901a719804ddd5c6fc9a6914ef5a2b6e914834d1f9Bobby Georgescu                return mDelegate.getItemAtPosition(selected.keyAt(i));
2911a719804ddd5c6fc9a6914ef5a2b6e914834d1f9Bobby Georgescu            }
2921a719804ddd5c6fc9a6914ef5a2b6e914834d1f9Bobby Georgescu        }
2931a719804ddd5c6fc9a6914ef5a2b6e914834d1f9Bobby Georgescu        return null;
2941a719804ddd5c6fc9a6914ef5a2b6e914834d1f9Bobby Georgescu    }
295869f4a62594c4508aa57a8622b461b6825b74e7cBobby Georgescu}
296