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
19b21b8e58a604f6c701245d84b141b5b87663192bOwen Linimport com.android.gallery3d.app.AbstractGalleryActivity;
20f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Linimport com.android.gallery3d.data.DataManager;
21f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Linimport com.android.gallery3d.data.MediaItem;
22f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Linimport com.android.gallery3d.data.MediaSet;
23f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Linimport com.android.gallery3d.data.Path;
24f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
25f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Linimport java.util.ArrayList;
26f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Linimport java.util.HashSet;
27f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Linimport java.util.Set;
28f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
29f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Linpublic class SelectionManager {
30f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    @SuppressWarnings("unused")
31f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    private static final String TAG = "SelectionManager";
32f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
33f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    public static final int ENTER_SELECTION_MODE = 1;
34f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    public static final int LEAVE_SELECTION_MODE = 2;
35f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    public static final int SELECT_ALL_MODE = 3;
36f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
37f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    private Set<Path> mClickedSet;
38f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    private MediaSet mSourceMediaSet;
39f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    private SelectionListener mListener;
40f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    private DataManager mDataManager;
41f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    private boolean mInverseSelection;
42f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    private boolean mIsAlbumSet;
43f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    private boolean mInSelectionMode;
44f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    private boolean mAutoLeave = true;
45f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    private int mTotal;
46f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
47f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    public interface SelectionListener {
48f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        public void onSelectionModeChange(int mode);
49f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        public void onSelectionChange(Path path, boolean selected);
50f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    }
51f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
52b21b8e58a604f6c701245d84b141b5b87663192bOwen Lin    public SelectionManager(AbstractGalleryActivity activity, boolean isAlbumSet) {
53b21b8e58a604f6c701245d84b141b5b87663192bOwen Lin        mDataManager = activity.getDataManager();
54f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        mClickedSet = new HashSet<Path>();
55f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        mIsAlbumSet = isAlbumSet;
56f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        mTotal = -1;
57f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    }
58f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
59f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    // Whether we will leave selection mode automatically once the number of
60f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    // selected items is down to zero.
61f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    public void setAutoLeaveSelectionMode(boolean enable) {
62f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        mAutoLeave = enable;
63f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    }
64f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
65f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    public void setSelectionListener(SelectionListener listener) {
66f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        mListener = listener;
67f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    }
68f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
69f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    public void selectAll() {
70f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        mInverseSelection = true;
71f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        mClickedSet.clear();
7261c634ab70a10cbd68482ad03caa4470e9e9ecc5John Hoford        mTotal = -1;
73e3c968f892585490b938ea2bcef81f8dca4a81f8Ray Chen        enterSelectionMode();
74f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        if (mListener != null) mListener.onSelectionModeChange(SELECT_ALL_MODE);
75f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    }
76f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
77f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    public void deSelectAll() {
78f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        leaveSelectionMode();
79f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        mInverseSelection = false;
80f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        mClickedSet.clear();
81f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    }
82f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
83f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    public boolean inSelectAllMode() {
84f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        return mInverseSelection;
85f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    }
86f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
87f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    public boolean inSelectionMode() {
88f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        return mInSelectionMode;
89f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    }
90f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
91f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    public void enterSelectionMode() {
92f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        if (mInSelectionMode) return;
93f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
94f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        mInSelectionMode = true;
95f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        if (mListener != null) mListener.onSelectionModeChange(ENTER_SELECTION_MODE);
96f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    }
97f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
98f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    public void leaveSelectionMode() {
99f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        if (!mInSelectionMode) return;
100f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
101f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        mInSelectionMode = false;
102f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        mInverseSelection = false;
103f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        mClickedSet.clear();
104f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        if (mListener != null) mListener.onSelectionModeChange(LEAVE_SELECTION_MODE);
105f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    }
106f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
107f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    public boolean isItemSelected(Path itemId) {
108f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        return mInverseSelection ^ mClickedSet.contains(itemId);
109f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    }
110f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
11121c2e665fdc1d1af0c91ab9c104d13fb7dc2444eRay Chen    private int getTotalCount() {
11221c2e665fdc1d1af0c91ab9c104d13fb7dc2444eRay Chen        if (mSourceMediaSet == null) return -1;
11321c2e665fdc1d1af0c91ab9c104d13fb7dc2444eRay Chen
11421c2e665fdc1d1af0c91ab9c104d13fb7dc2444eRay Chen        if (mTotal < 0) {
11521c2e665fdc1d1af0c91ab9c104d13fb7dc2444eRay Chen            mTotal = mIsAlbumSet
11621c2e665fdc1d1af0c91ab9c104d13fb7dc2444eRay Chen                    ? mSourceMediaSet.getSubMediaSetCount()
11721c2e665fdc1d1af0c91ab9c104d13fb7dc2444eRay Chen                    : mSourceMediaSet.getMediaItemCount();
11821c2e665fdc1d1af0c91ab9c104d13fb7dc2444eRay Chen        }
11921c2e665fdc1d1af0c91ab9c104d13fb7dc2444eRay Chen        return mTotal;
12021c2e665fdc1d1af0c91ab9c104d13fb7dc2444eRay Chen    }
12121c2e665fdc1d1af0c91ab9c104d13fb7dc2444eRay Chen
122f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    public int getSelectedCount() {
123f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        int count = mClickedSet.size();
124f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        if (mInverseSelection) {
12521c2e665fdc1d1af0c91ab9c104d13fb7dc2444eRay Chen            count = getTotalCount() - count;
126f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        }
127f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        return count;
128f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    }
129f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
130f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    public void toggle(Path path) {
131f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        if (mClickedSet.contains(path)) {
132f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            mClickedSet.remove(path);
133f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        } else {
134f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            enterSelectionMode();
135f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            mClickedSet.add(path);
136f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        }
137f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
13821c2e665fdc1d1af0c91ab9c104d13fb7dc2444eRay Chen        // Convert to inverse selection mode if everything is selected.
13921c2e665fdc1d1af0c91ab9c104d13fb7dc2444eRay Chen        int count = getSelectedCount();
14021c2e665fdc1d1af0c91ab9c104d13fb7dc2444eRay Chen        if (count == getTotalCount()) {
14121c2e665fdc1d1af0c91ab9c104d13fb7dc2444eRay Chen            selectAll();
14221c2e665fdc1d1af0c91ab9c104d13fb7dc2444eRay Chen        }
14321c2e665fdc1d1af0c91ab9c104d13fb7dc2444eRay Chen
144f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        if (mListener != null) mListener.onSelectionChange(path, isItemSelected(path));
14521c2e665fdc1d1af0c91ab9c104d13fb7dc2444eRay Chen        if (count == 0 && mAutoLeave) {
146f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            leaveSelectionMode();
147f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        }
148f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    }
149f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
150549c968947cccc8bacca994f954629228b6b877fBobby Georgescu    private static boolean expandMediaSet(ArrayList<Path> items, MediaSet set, int maxSelection) {
151f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        int subCount = set.getSubMediaSetCount();
152f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        for (int i = 0; i < subCount; i++) {
153549c968947cccc8bacca994f954629228b6b877fBobby Georgescu            if (!expandMediaSet(items, set.getSubMediaSet(i), maxSelection)) {
154549c968947cccc8bacca994f954629228b6b877fBobby Georgescu                return false;
155549c968947cccc8bacca994f954629228b6b877fBobby Georgescu            }
156f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        }
157f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        int total = set.getMediaItemCount();
158f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        int batch = 50;
159f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        int index = 0;
160f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
161f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        while (index < total) {
162f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            int count = index + batch < total
163f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                    ? batch
164f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                    : total - index;
165f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            ArrayList<MediaItem> list = set.getMediaItem(index, count);
166549c968947cccc8bacca994f954629228b6b877fBobby Georgescu            if (list != null
167549c968947cccc8bacca994f954629228b6b877fBobby Georgescu                    && list.size() > (maxSelection - items.size())) {
168549c968947cccc8bacca994f954629228b6b877fBobby Georgescu                return false;
169549c968947cccc8bacca994f954629228b6b877fBobby Georgescu            }
170f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            for (MediaItem item : list) {
171f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                items.add(item.getPath());
172f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            }
173f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            index += batch;
174f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        }
175549c968947cccc8bacca994f954629228b6b877fBobby Georgescu        return true;
176f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    }
177f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
178f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    public ArrayList<Path> getSelected(boolean expandSet) {
179549c968947cccc8bacca994f954629228b6b877fBobby Georgescu        return getSelected(expandSet, Integer.MAX_VALUE);
180549c968947cccc8bacca994f954629228b6b877fBobby Georgescu    }
181549c968947cccc8bacca994f954629228b6b877fBobby Georgescu
182549c968947cccc8bacca994f954629228b6b877fBobby Georgescu    public ArrayList<Path> getSelected(boolean expandSet, int maxSelection) {
183f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        ArrayList<Path> selected = new ArrayList<Path>();
184f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        if (mIsAlbumSet) {
185f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            if (mInverseSelection) {
18621c2e665fdc1d1af0c91ab9c104d13fb7dc2444eRay Chen                int total = getTotalCount();
18721c2e665fdc1d1af0c91ab9c104d13fb7dc2444eRay Chen                for (int i = 0; i < total; i++) {
188f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                    MediaSet set = mSourceMediaSet.getSubMediaSet(i);
189f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                    Path id = set.getPath();
190f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                    if (!mClickedSet.contains(id)) {
191faf2f040f38532213fa237cf45c9794cf1a85859Bobby Georgescu                        if (expandSet) {
192faf2f040f38532213fa237cf45c9794cf1a85859Bobby Georgescu                            if (!expandMediaSet(selected, set, maxSelection)) {
193faf2f040f38532213fa237cf45c9794cf1a85859Bobby Georgescu                                return null;
194faf2f040f38532213fa237cf45c9794cf1a85859Bobby Georgescu                            }
195f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                        } else {
196f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                            selected.add(id);
197549c968947cccc8bacca994f954629228b6b877fBobby Georgescu                            if (selected.size() > maxSelection) {
198549c968947cccc8bacca994f954629228b6b877fBobby Georgescu                                return null;
199549c968947cccc8bacca994f954629228b6b877fBobby Georgescu                            }
200f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                        }
201f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                    }
202f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                }
203f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            } else {
204f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                for (Path id : mClickedSet) {
205faf2f040f38532213fa237cf45c9794cf1a85859Bobby Georgescu                    if (expandSet) {
206faf2f040f38532213fa237cf45c9794cf1a85859Bobby Georgescu                        if (!expandMediaSet(selected, mDataManager.getMediaSet(id),
207faf2f040f38532213fa237cf45c9794cf1a85859Bobby Georgescu                                maxSelection)) {
208faf2f040f38532213fa237cf45c9794cf1a85859Bobby Georgescu                            return null;
209faf2f040f38532213fa237cf45c9794cf1a85859Bobby Georgescu                        }
210f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                    } else {
211f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                        selected.add(id);
212549c968947cccc8bacca994f954629228b6b877fBobby Georgescu                        if (selected.size() > maxSelection) {
213549c968947cccc8bacca994f954629228b6b877fBobby Georgescu                            return null;
214549c968947cccc8bacca994f954629228b6b877fBobby Georgescu                        }
215f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                    }
216f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                }
217f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            }
218f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        } else {
219f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            if (mInverseSelection) {
22021c2e665fdc1d1af0c91ab9c104d13fb7dc2444eRay Chen                int total = getTotalCount();
221f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                int index = 0;
222f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                while (index < total) {
223f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                    int count = Math.min(total - index, MediaSet.MEDIAITEM_BATCH_FETCH_COUNT);
224f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                    ArrayList<MediaItem> list = mSourceMediaSet.getMediaItem(index, count);
225f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                    for (MediaItem item : list) {
226f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                        Path id = item.getPath();
227549c968947cccc8bacca994f954629228b6b877fBobby Georgescu                        if (!mClickedSet.contains(id)) {
228549c968947cccc8bacca994f954629228b6b877fBobby Georgescu                            selected.add(id);
229549c968947cccc8bacca994f954629228b6b877fBobby Georgescu                            if (selected.size() > maxSelection) {
230549c968947cccc8bacca994f954629228b6b877fBobby Georgescu                                return null;
231549c968947cccc8bacca994f954629228b6b877fBobby Georgescu                            }
232549c968947cccc8bacca994f954629228b6b877fBobby Georgescu                        }
233f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                    }
234f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                    index += count;
235f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                }
236f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            } else {
237f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                for (Path id : mClickedSet) {
238f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                    selected.add(id);
239549c968947cccc8bacca994f954629228b6b877fBobby Georgescu                    if (selected.size() > maxSelection) {
240549c968947cccc8bacca994f954629228b6b877fBobby Georgescu                        return null;
241549c968947cccc8bacca994f954629228b6b877fBobby Georgescu                    }
242f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                }
243f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            }
244f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        }
245f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        return selected;
246f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    }
247f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
248f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    public void setSourceMediaSet(MediaSet set) {
249f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        mSourceMediaSet = set;
250f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        mTotal = -1;
251f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    }
252f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin}
253