AlbumSetSlidingWindow.java revision bc2154199aee16762e3758ad0cfed685323d9a9f
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 19f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Linimport com.android.gallery3d.R; 20f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Linimport com.android.gallery3d.app.GalleryActivity; 21f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Linimport com.android.gallery3d.common.Utils; 22f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Linimport com.android.gallery3d.data.MediaItem; 23f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Linimport com.android.gallery3d.data.MediaSet; 24f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Linimport com.android.gallery3d.data.Path; 25f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Linimport com.android.gallery3d.ui.AlbumSetView.AlbumSetItem; 26f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Linimport com.android.gallery3d.util.Future; 27f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Linimport com.android.gallery3d.util.FutureListener; 28bc2154199aee16762e3758ad0cfed685323d9a9fChih-Chung Changimport com.android.gallery3d.util.GalleryUtils; 29f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Linimport com.android.gallery3d.util.MediaSetUtils; 30f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Linimport com.android.gallery3d.util.ThreadPool; 31f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 32f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Linimport android.graphics.Bitmap; 33f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Linimport android.graphics.Color; 34f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Linimport android.os.Message; 35f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 36f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Linpublic class AlbumSetSlidingWindow implements AlbumSetView.ModelListener { 37f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin private static final String TAG = "GallerySlidingWindow"; 38f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin private static final int MSG_LOAD_BITMAP_DONE = 0; 39f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 40f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin public static interface Listener { 41f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin public void onSizeChanged(int size); 42f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin public void onContentInvalidated(); 43f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin public void onWindowContentChanged( 44f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin int slot, AlbumSetItem old, AlbumSetItem update); 45f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 46f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 47f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin private final AlbumSetView.Model mSource; 48f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin private int mSize; 499201679ed1c485767f2e334aa618bd733024af03Chih-Chung Chang private AlbumSetView.LabelSpec mLabelSpec; 50f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 51f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin private int mContentStart = 0; 52f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin private int mContentEnd = 0; 53f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 54f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin private int mActiveStart = 0; 55f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin private int mActiveEnd = 0; 56f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 57f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin private Listener mListener; 58f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 59f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin private final MyAlbumSetItem mData[]; 60f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin private SelectionDrawer mSelectionDrawer; 61f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin private final ColorTexture mWaitLoadingTexture; 62f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 63f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin private SynchronizedHandler mHandler; 64f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin private ThreadPool mThreadPool; 65f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 66f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin private int mActiveRequestCount = 0; 67f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin private String mLoadingLabel; 68f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin private boolean mIsActive = false; 69f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 70f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin private static class MyAlbumSetItem extends AlbumSetItem { 71f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin public Path setPath; 72f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin public int sourceType; 73f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin public int cacheFlag; 74f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin public int cacheStatus; 75f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 76f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 779201679ed1c485767f2e334aa618bd733024af03Chih-Chung Chang public AlbumSetSlidingWindow(GalleryActivity activity, 789201679ed1c485767f2e334aa618bd733024af03Chih-Chung Chang AlbumSetView.LabelSpec labelSpec, SelectionDrawer drawer, 79f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin AlbumSetView.Model source, int cacheSize) { 80f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin source.setModelListener(this); 819201679ed1c485767f2e334aa618bd733024af03Chih-Chung Chang mLabelSpec = labelSpec; 82f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin mLoadingLabel = activity.getAndroidContext().getString(R.string.loading); 83f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin mSource = source; 84f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin mSelectionDrawer = drawer; 85f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin mData = new MyAlbumSetItem[cacheSize]; 86f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin mSize = source.size(); 87f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 88f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin mWaitLoadingTexture = new ColorTexture(Color.TRANSPARENT); 89f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin mWaitLoadingTexture.setSize(1, 1); 90f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 91f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin mHandler = new SynchronizedHandler(activity.getGLRoot()) { 92f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin @Override 93f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin public void handleMessage(Message message) { 94f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin Utils.assertTrue(message.what == MSG_LOAD_BITMAP_DONE); 95f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin ((GalleryDisplayItem) message.obj).onLoadBitmapDone(); 96f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 97f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin }; 98f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 99f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin mThreadPool = activity.getThreadPool(); 100f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 101f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 102f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin public void setSelectionDrawer(SelectionDrawer drawer) { 103f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin mSelectionDrawer = drawer; 104f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 105f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 106f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin public void setListener(Listener listener) { 107f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin mListener = listener; 108f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 109f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 110f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin public AlbumSetItem get(int slotIndex) { 111f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin Utils.assertTrue(isActiveSlot(slotIndex), 112f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin "invalid slot: %s outsides (%s, %s)", 113f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin slotIndex, mActiveStart, mActiveEnd); 114f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin return mData[slotIndex % mData.length]; 115f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 116f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 117f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin public int size() { 118f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin return mSize; 119f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 120f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 121f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin public boolean isActiveSlot(int slotIndex) { 122f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin return slotIndex >= mActiveStart && slotIndex < mActiveEnd; 123f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 124f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 125f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin private void setContentWindow(int contentStart, int contentEnd) { 126f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin if (contentStart == mContentStart && contentEnd == mContentEnd) return; 127f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 128f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin if (contentStart >= mContentEnd || mContentStart >= contentEnd) { 129f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin for (int i = mContentStart, n = mContentEnd; i < n; ++i) { 130f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin freeSlotContent(i); 131f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 132f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin mSource.setActiveWindow(contentStart, contentEnd); 133f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin for (int i = contentStart; i < contentEnd; ++i) { 134f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin prepareSlotContent(i); 135f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 136f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } else { 137f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin for (int i = mContentStart; i < contentStart; ++i) { 138f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin freeSlotContent(i); 139f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 140f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin for (int i = contentEnd, n = mContentEnd; i < n; ++i) { 141f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin freeSlotContent(i); 142f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 143f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin mSource.setActiveWindow(contentStart, contentEnd); 144f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin for (int i = contentStart, n = mContentStart; i < n; ++i) { 145f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin prepareSlotContent(i); 146f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 147f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin for (int i = mContentEnd; i < contentEnd; ++i) { 148f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin prepareSlotContent(i); 149f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 150f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 151f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 152f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin mContentStart = contentStart; 153f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin mContentEnd = contentEnd; 154f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 155f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 156f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin public void setActiveWindow(int start, int end) { 157f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin Utils.assertTrue( 158f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin start <= end && end - start <= mData.length && end <= mSize, 159f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin "start = %s, end = %s, length = %s, size = %s", 160f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin start, end, mData.length, mSize); 161f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 162f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin AlbumSetItem data[] = mData; 163f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 164f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin mActiveStart = start; 165f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin mActiveEnd = end; 166f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 167f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin // If no data is visible, keep the cache content 168f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin if (start == end) return; 169f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 170f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin int contentStart = Utils.clamp((start + end) / 2 - data.length / 2, 171f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 0, Math.max(0, mSize - data.length)); 172f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin int contentEnd = Math.min(contentStart + data.length, mSize); 173f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin setContentWindow(contentStart, contentEnd); 174f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin if (mIsActive) updateAllImageRequests(); 175f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 176f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 177f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin // We would like to request non active slots in the following order: 178f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin // Order: 8 6 4 2 1 3 5 7 179f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin // |---------|---------------|---------| 180f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin // |<- active ->| 181f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin // |<-------- cached range ----------->| 182f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin private void requestNonactiveImages() { 183f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin int range = Math.max( 184f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin mContentEnd - mActiveEnd, mActiveStart - mContentStart); 185f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin for (int i = 0 ;i < range; ++i) { 186f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin requestImagesInSlot(mActiveEnd + i); 187f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin requestImagesInSlot(mActiveStart - 1 - i); 188f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 189f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 190f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 191f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin private void cancelNonactiveImages() { 192f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin int range = Math.max( 193f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin mContentEnd - mActiveEnd, mActiveStart - mContentStart); 194f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin for (int i = 0 ;i < range; ++i) { 195f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin cancelImagesInSlot(mActiveEnd + i); 196f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin cancelImagesInSlot(mActiveStart - 1 - i); 197f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 198f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 199f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 200f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin private void requestImagesInSlot(int slotIndex) { 201f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin if (slotIndex < mContentStart || slotIndex >= mContentEnd) return; 202f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin AlbumSetItem items = mData[slotIndex % mData.length]; 203f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin for (DisplayItem item : items.covers) { 204f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin ((GalleryDisplayItem) item).requestImage(); 205f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 206f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 207f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 208f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin private void cancelImagesInSlot(int slotIndex) { 209f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin if (slotIndex < mContentStart || slotIndex >= mContentEnd) return; 210f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin AlbumSetItem items = mData[slotIndex % mData.length]; 211f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin for (DisplayItem item : items.covers) { 212f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin ((GalleryDisplayItem) item).cancelImageRequest(); 213f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 214f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 215f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 216f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin private void freeSlotContent(int slotIndex) { 217f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin AlbumSetItem data[] = mData; 218f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin int index = slotIndex % data.length; 219f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin AlbumSetItem original = data[index]; 220f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin if (original != null) { 221f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin data[index] = null; 222f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin for (DisplayItem item : original.covers) { 223f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin ((GalleryDisplayItem) item).recycle(); 224f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 225f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 226f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 227f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 228f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin private long getMediaSetDataVersion(MediaSet set) { 229f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin return set == null 230f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin ? MediaSet.INVALID_DATA_VERSION 231f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin : set.getDataVersion(); 232f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 233f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 234f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin private void prepareSlotContent(int slotIndex) { 235f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin MediaSet set = mSource.getMediaSet(slotIndex); 236f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 237f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin MyAlbumSetItem item = new MyAlbumSetItem(); 238f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin MediaItem[] coverItems = mSource.getCoverItems(slotIndex); 239f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin item.covers = new GalleryDisplayItem[coverItems.length]; 240f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin item.sourceType = identifySourceType(set); 241f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin item.cacheFlag = identifyCacheFlag(set); 242f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin item.cacheStatus = identifyCacheStatus(set); 243f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin item.setPath = set == null ? null : set.getPath(); 244f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 245f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin for (int i = 0; i < coverItems.length; ++i) { 246f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin item.covers[i] = new GalleryDisplayItem(slotIndex, i, coverItems[i]); 247f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 248f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin item.labelItem = new LabelDisplayItem(slotIndex); 249f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin item.setDataVersion = getMediaSetDataVersion(set); 250f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin mData[slotIndex % mData.length] = item; 251f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 252f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 253f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin private boolean isCoverItemsChanged(int slotIndex) { 254f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin AlbumSetItem original = mData[slotIndex % mData.length]; 255f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin if (original == null) return true; 256f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin MediaItem[] coverItems = mSource.getCoverItems(slotIndex); 257f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 258f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin if (original.covers.length != coverItems.length) return true; 259f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin for (int i = 0, n = coverItems.length; i < n; ++i) { 260f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin GalleryDisplayItem g = (GalleryDisplayItem) original.covers[i]; 261f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin if (g.mDataVersion != coverItems[i].getDataVersion()) return true; 262f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 263f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin return false; 264f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 265f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 266f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin private void updateSlotContent(final int slotIndex) { 267f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 268f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin MyAlbumSetItem data[] = mData; 269f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin int pos = slotIndex % data.length; 270f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin MyAlbumSetItem original = data[pos]; 271f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 272f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin if (!isCoverItemsChanged(slotIndex)) { 273f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin MediaSet set = mSource.getMediaSet(slotIndex); 274f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin original.sourceType = identifySourceType(set); 275f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin original.cacheFlag = identifyCacheFlag(set); 276f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin original.cacheStatus = identifyCacheStatus(set); 277f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin original.setPath = set == null ? null : set.getPath(); 278f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin ((LabelDisplayItem) original.labelItem).updateContent(); 279f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin if (mListener != null) mListener.onContentInvalidated(); 280f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin return; 281f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 282f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 283f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin prepareSlotContent(slotIndex); 284f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin AlbumSetItem update = data[pos]; 285f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 286f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin if (mListener != null && isActiveSlot(slotIndex)) { 287f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin mListener.onWindowContentChanged(slotIndex, original, update); 288f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 289f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin if (original != null) { 290f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin for (DisplayItem item : original.covers) { 291f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin ((GalleryDisplayItem) item).recycle(); 292f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 293f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 294f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 295f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 296f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin private void notifySlotChanged(int slotIndex) { 297f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin // If the updated content is not cached, ignore it 298f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin if (slotIndex < mContentStart || slotIndex >= mContentEnd) { 299f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin Log.w(TAG, String.format( 300f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin "invalid update: %s is outside (%s, %s)", 301f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin slotIndex, mContentStart, mContentEnd) ); 302f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin return; 303f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 304f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin updateSlotContent(slotIndex); 305f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin boolean isActiveSlot = isActiveSlot(slotIndex); 306f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin if (mActiveRequestCount == 0 || isActiveSlot) { 307f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin for (DisplayItem item : mData[slotIndex % mData.length].covers) { 308f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin GalleryDisplayItem galleryItem = (GalleryDisplayItem) item; 309f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin galleryItem.requestImage(); 310f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin if (isActiveSlot && galleryItem.isRequestInProgress()) { 311f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin ++mActiveRequestCount; 312f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 313f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 314f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 315f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 316f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 317f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin private void updateAllImageRequests() { 318f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin mActiveRequestCount = 0; 319f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin for (int i = mActiveStart, n = mActiveEnd; i < n; ++i) { 320f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin for (DisplayItem item : mData[i % mData.length].covers) { 321f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin GalleryDisplayItem coverItem = (GalleryDisplayItem) item; 322f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin coverItem.requestImage(); 323f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin if (coverItem.isRequestInProgress()) ++mActiveRequestCount; 324f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 325f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 326f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin if (mActiveRequestCount == 0) { 327f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin requestNonactiveImages(); 328f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } else { 329f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin cancelNonactiveImages(); 330f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 331f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 332f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 333f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin private class GalleryDisplayItem extends AbstractDisplayItem 334f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin implements FutureListener<Bitmap> { 335f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin private Future<Bitmap> mFuture; 336f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin private final int mSlotIndex; 337f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin private final int mCoverIndex; 338f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin private final int mMediaType; 339f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin private Texture mContent; 340f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin private final long mDataVersion; 341bc2154199aee16762e3758ad0cfed685323d9a9fChih-Chung Chang private boolean mIsPanorama; 342f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 343f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin public GalleryDisplayItem(int slotIndex, int coverIndex, MediaItem item) { 344f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin super(item); 345f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin mSlotIndex = slotIndex; 346f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin mCoverIndex = coverIndex; 347f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin mMediaType = item.getMediaType(); 348f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin mDataVersion = item.getDataVersion(); 349bc2154199aee16762e3758ad0cfed685323d9a9fChih-Chung Chang mIsPanorama = GalleryUtils.isPanorama(item); 350f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin updateContent(mWaitLoadingTexture); 351f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 352f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 353f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin @Override 354f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin protected void onBitmapAvailable(Bitmap bitmap) { 355f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin if (isActiveSlot(mSlotIndex)) { 356f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin --mActiveRequestCount; 357f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin if (mActiveRequestCount == 0) requestNonactiveImages(); 358f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 359f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin if (bitmap != null) { 360f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin BitmapTexture texture = new BitmapTexture(bitmap); 361f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin texture.setThrottled(true); 362f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin updateContent(texture); 363f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin if (mListener != null) mListener.onContentInvalidated(); 364f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 365f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 366f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 367f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin private void updateContent(Texture content) { 368f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin mContent = content; 3699201679ed1c485767f2e334aa618bd733024af03Chih-Chung Chang } 370f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 3719201679ed1c485767f2e334aa618bd733024af03Chih-Chung Chang @Override 3729201679ed1c485767f2e334aa618bd733024af03Chih-Chung Chang public boolean render(GLCanvas canvas, int pass) { 3739201679ed1c485767f2e334aa618bd733024af03Chih-Chung Chang // Fit the content into the box 3749201679ed1c485767f2e334aa618bd733024af03Chih-Chung Chang int width = mContent.getWidth(); 3759201679ed1c485767f2e334aa618bd733024af03Chih-Chung Chang int height = mContent.getHeight(); 376f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 3779201679ed1c485767f2e334aa618bd733024af03Chih-Chung Chang float scalex = mBoxWidth / (float) width; 3789201679ed1c485767f2e334aa618bd733024af03Chih-Chung Chang float scaley = mBoxHeight / (float) height; 3799201679ed1c485767f2e334aa618bd733024af03Chih-Chung Chang float scale = Math.min(scalex, scaley); 380f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 381f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin width = (int) Math.floor(width * scale); 382f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin height = (int) Math.floor(height * scale); 383f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 3849201679ed1c485767f2e334aa618bd733024af03Chih-Chung Chang // Now draw it 385f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin int sourceType = SelectionDrawer.DATASOURCE_TYPE_NOT_CATEGORIZED; 386f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin int cacheFlag = MediaSet.CACHE_FLAG_NO; 387f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin int cacheStatus = MediaSet.CACHE_STATUS_NOT_CACHED; 388f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin MyAlbumSetItem set = mData[mSlotIndex % mData.length]; 389f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin Path path = set.setPath; 390f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin if (mCoverIndex == 0) { 391f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin sourceType = set.sourceType; 392f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin cacheFlag = set.cacheFlag; 393f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin cacheStatus = set.cacheStatus; 394f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 395f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 3969201679ed1c485767f2e334aa618bd733024af03Chih-Chung Chang mSelectionDrawer.draw(canvas, mContent, width, height, 397f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin getRotation(), path, mCoverIndex, sourceType, mMediaType, 398bc2154199aee16762e3758ad0cfed685323d9a9fChih-Chung Chang mIsPanorama, mLabelSpec.labelBackgroundHeight, 399f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin cacheFlag == MediaSet.CACHE_FLAG_FULL, 400f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin (cacheFlag == MediaSet.CACHE_FLAG_FULL) 401f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin && (cacheStatus != MediaSet.CACHE_STATUS_CACHED_FULL)); 402f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin return false; 403f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 404f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 405f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin @Override 406f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin public void startLoadBitmap() { 407f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin mFuture = mThreadPool.submit(mMediaItem.requestImage( 408f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin MediaItem.TYPE_MICROTHUMBNAIL), this); 409f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 410f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 411f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin @Override 412f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin public void cancelLoadBitmap() { 413f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin mFuture.cancel(); 414f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 415f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 416f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin @Override 417f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin public void onFutureDone(Future<Bitmap> future) { 418f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin mHandler.sendMessage(mHandler.obtainMessage(MSG_LOAD_BITMAP_DONE, this)); 419f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 420f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 421f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin private void onLoadBitmapDone() { 422f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin Future<Bitmap> future = mFuture; 423f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin mFuture = null; 424f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin updateImage(future.get(), future.isCancelled()); 425f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 426f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 427f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin @Override 428f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin public String toString() { 429f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin return String.format("GalleryDisplayItem(%s, %s)", mSlotIndex, mCoverIndex); 430f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 431f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 432f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 433f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin private static int identifySourceType(MediaSet set) { 434f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin if (set == null) { 435f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin return SelectionDrawer.DATASOURCE_TYPE_NOT_CATEGORIZED; 436f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 437f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 438f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin Path path = set.getPath(); 439f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin if (MediaSetUtils.isCameraSource(path)) { 440f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin return SelectionDrawer.DATASOURCE_TYPE_CAMERA; 441f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 442f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 443f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin int type = SelectionDrawer.DATASOURCE_TYPE_NOT_CATEGORIZED; 444f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin String prefix = path.getPrefix(); 445f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 446f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin if (prefix.equals("picasa")) { 447f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin type = SelectionDrawer.DATASOURCE_TYPE_PICASA; 448f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } else if (prefix.equals("local") || prefix.equals("merge")) { 449f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin type = SelectionDrawer.DATASOURCE_TYPE_LOCAL; 450f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } else if (prefix.equals("mtp")) { 451f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin type = SelectionDrawer.DATASOURCE_TYPE_MTP; 452f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 453f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 454f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin return type; 455f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 456f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 457f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin private static int identifyCacheFlag(MediaSet set) { 458f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin if (set == null || (set.getSupportedOperations() 459f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin & MediaSet.SUPPORT_CACHE) == 0) { 460f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin return MediaSet.CACHE_FLAG_NO; 461f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 462f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 463f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin return set.getCacheFlag(); 464f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 465f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 466f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin private static int identifyCacheStatus(MediaSet set) { 467f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin if (set == null || (set.getSupportedOperations() 468f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin & MediaSet.SUPPORT_CACHE) == 0) { 469f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin return MediaSet.CACHE_STATUS_NOT_CACHED; 470f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 471f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 472f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin return set.getCacheStatus(); 473f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 474f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 475f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin private class LabelDisplayItem extends DisplayItem { 4769201679ed1c485767f2e334aa618bd733024af03Chih-Chung Chang private static final int FONT_COLOR_TITLE = Color.WHITE; 477bc2154199aee16762e3758ad0cfed685323d9a9fChih-Chung Chang private static final int FONT_COLOR_COUNT = 0x80FFFFFF; // 50% white 4789201679ed1c485767f2e334aa618bd733024af03Chih-Chung Chang 4799201679ed1c485767f2e334aa618bd733024af03Chih-Chung Chang private StringTexture mTextureTitle; 480bc2154199aee16762e3758ad0cfed685323d9a9fChih-Chung Chang private StringTexture mTextureCount; 4819201679ed1c485767f2e334aa618bd733024af03Chih-Chung Chang private String mTitle; 482bc2154199aee16762e3758ad0cfed685323d9a9fChih-Chung Chang private String mCount; 4839201679ed1c485767f2e334aa618bd733024af03Chih-Chung Chang private int mLastWidth; 484f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin private final int mSlotIndex; 485bc2154199aee16762e3758ad0cfed685323d9a9fChih-Chung Chang private boolean mHasIcon; 486f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 487f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin public LabelDisplayItem(int slotIndex) { 488f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin mSlotIndex = slotIndex; 489f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 490f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 491f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin public boolean updateContent() { 4929201679ed1c485767f2e334aa618bd733024af03Chih-Chung Chang String title = mLoadingLabel; 493bc2154199aee16762e3758ad0cfed685323d9a9fChih-Chung Chang String count = ""; 494f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin MediaSet set = mSource.getMediaSet(mSlotIndex); 495f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin if (set != null) { 4969201679ed1c485767f2e334aa618bd733024af03Chih-Chung Chang title = Utils.ensureNotNull(set.getName()); 497bc2154199aee16762e3758ad0cfed685323d9a9fChih-Chung Chang count = "" + set.getTotalMediaItemCount(); 4989201679ed1c485767f2e334aa618bd733024af03Chih-Chung Chang } 4999201679ed1c485767f2e334aa618bd733024af03Chih-Chung Chang if (Utils.equals(title, mTitle) 500bc2154199aee16762e3758ad0cfed685323d9a9fChih-Chung Chang && Utils.equals(count, mCount) 5019201679ed1c485767f2e334aa618bd733024af03Chih-Chung Chang && Utils.equals(mBoxWidth, mLastWidth)) { 5029201679ed1c485767f2e334aa618bd733024af03Chih-Chung Chang return false; 503f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 5049201679ed1c485767f2e334aa618bd733024af03Chih-Chung Chang mTitle = title; 505bc2154199aee16762e3758ad0cfed685323d9a9fChih-Chung Chang mCount = count; 5069201679ed1c485767f2e334aa618bd733024af03Chih-Chung Chang mLastWidth = mBoxWidth; 507bc2154199aee16762e3758ad0cfed685323d9a9fChih-Chung Chang mHasIcon = (identifySourceType(set) != 508bc2154199aee16762e3758ad0cfed685323d9a9fChih-Chung Chang SelectionDrawer.DATASOURCE_TYPE_NOT_CATEGORIZED); 5099201679ed1c485767f2e334aa618bd733024af03Chih-Chung Chang 5109201679ed1c485767f2e334aa618bd733024af03Chih-Chung Chang AlbumSetView.LabelSpec s = mLabelSpec; 5119201679ed1c485767f2e334aa618bd733024af03Chih-Chung Chang mTextureTitle = StringTexture.newInstance( 5129201679ed1c485767f2e334aa618bd733024af03Chih-Chung Chang title, s.titleFontSize, FONT_COLOR_TITLE, 5139201679ed1c485767f2e334aa618bd733024af03Chih-Chung Chang mBoxWidth - s.leftMargin, false); 514bc2154199aee16762e3758ad0cfed685323d9a9fChih-Chung Chang mTextureCount = StringTexture.newInstance( 515bc2154199aee16762e3758ad0cfed685323d9a9fChih-Chung Chang count, s.countFontSize, FONT_COLOR_COUNT, 5169201679ed1c485767f2e334aa618bd733024af03Chih-Chung Chang mBoxWidth - s.leftMargin, true); 5179201679ed1c485767f2e334aa618bd733024af03Chih-Chung Chang 518f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin return true; 519f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 520f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 521f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin @Override 522f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin public boolean render(GLCanvas canvas, int pass) { 5239201679ed1c485767f2e334aa618bd733024af03Chih-Chung Chang if (mBoxWidth != mLastWidth) { 5249201679ed1c485767f2e334aa618bd733024af03Chih-Chung Chang updateContent(); 5259201679ed1c485767f2e334aa618bd733024af03Chih-Chung Chang } 5269201679ed1c485767f2e334aa618bd733024af03Chih-Chung Chang 5279201679ed1c485767f2e334aa618bd733024af03Chih-Chung Chang AlbumSetView.LabelSpec s = mLabelSpec; 5289201679ed1c485767f2e334aa618bd733024af03Chih-Chung Chang int x = -mBoxWidth / 2; 529bc2154199aee16762e3758ad0cfed685323d9a9fChih-Chung Chang int y = (mBoxHeight + 1) / 2 - s.labelBackgroundHeight; 5309201679ed1c485767f2e334aa618bd733024af03Chih-Chung Chang y += s.titleOffset; 5319201679ed1c485767f2e334aa618bd733024af03Chih-Chung Chang mTextureTitle.draw(canvas, x + s.leftMargin, y); 532bc2154199aee16762e3758ad0cfed685323d9a9fChih-Chung Chang y += s.titleFontSize + s.countOffset; 533bc2154199aee16762e3758ad0cfed685323d9a9fChih-Chung Chang x += mHasIcon ? s.iconSize : s.leftMargin; 534bc2154199aee16762e3758ad0cfed685323d9a9fChih-Chung Chang mTextureCount.draw(canvas, x, y); 535f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin return false; 536f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 537f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 538f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin @Override 539f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin public long getIdentity() { 540f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin return System.identityHashCode(this); 541f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 542f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 543f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 544f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin public void onSizeChanged(int size) { 545f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin if (mSize != size) { 546f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin mSize = size; 547f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin if (mListener != null && mIsActive) mListener.onSizeChanged(mSize); 548f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 549f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 550f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 551f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin public void onWindowContentChanged(int index) { 552f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin if (!mIsActive) { 553f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin // paused, ignore slot changed event 554f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin return; 555f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 556f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin notifySlotChanged(index); 557f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 558f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 559f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin public void pause() { 560f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin mIsActive = false; 561f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin for (int i = mContentStart, n = mContentEnd; i < n; ++i) { 562f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin freeSlotContent(i); 563f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 564f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 565f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 566f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin public void resume() { 567f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin mIsActive = true; 568f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin for (int i = mContentStart, n = mContentEnd; i < n; ++i) { 569f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin prepareSlotContent(i); 570f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 571f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin updateAllImageRequests(); 572f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 573f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin} 574