AlbumSetSlidingWindow.java revision 1a4bd273afe5dd11592f7625c2f19853b6f174e9
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 19dbf4ba12afba115888493caa34937643257e2bb1Ray Chenimport android.graphics.Bitmap; 20dbf4ba12afba115888493caa34937643257e2bb1Ray Chenimport android.os.Message; 21dbf4ba12afba115888493caa34937643257e2bb1Ray Chen 22f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Linimport com.android.gallery3d.R; 23f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Linimport com.android.gallery3d.app.GalleryActivity; 24f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Linimport com.android.gallery3d.common.Utils; 25f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Linimport com.android.gallery3d.data.MediaItem; 261a4bd273afe5dd11592f7625c2f19853b6f174e9Owen Linimport com.android.gallery3d.data.MediaObject; 27f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Linimport com.android.gallery3d.data.MediaSet; 28f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Linimport com.android.gallery3d.data.Path; 29f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Linimport com.android.gallery3d.util.Future; 30f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Linimport com.android.gallery3d.util.FutureListener; 31bc2154199aee16762e3758ad0cfed685323d9a9fChih-Chung Changimport com.android.gallery3d.util.GalleryUtils; 32f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Linimport com.android.gallery3d.util.MediaSetUtils; 33f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Linimport com.android.gallery3d.util.ThreadPool; 34f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 35f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Linpublic class AlbumSetSlidingWindow implements AlbumSetView.ModelListener { 361a4bd273afe5dd11592f7625c2f19853b6f174e9Owen Lin private static final String TAG = "AlbumSetSlidingWindow"; 371a4bd273afe5dd11592f7625c2f19853b6f174e9Owen Lin private static final int MSG_UPDATE_ALBUM_ENTRY = 1; 38f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 39f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin public static interface Listener { 40f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin public void onSizeChanged(int size); 417260f6f74d465520e4497b23fe56f98abb0c15a2Owen Lin public void onContentChanged(); 42f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 43f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 44f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin private final AlbumSetView.Model mSource; 45f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin private int mSize; 46f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 47f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin private int mContentStart = 0; 48f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin private int mContentEnd = 0; 49f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 50f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin private int mActiveStart = 0; 51f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin private int mActiveEnd = 0; 52f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 53f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin private Listener mListener; 54f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 551a4bd273afe5dd11592f7625c2f19853b6f174e9Owen Lin private final AlbumSetEntry mData[]; 56dbf4ba12afba115888493caa34937643257e2bb1Ray Chen private final SynchronizedHandler mHandler; 57dbf4ba12afba115888493caa34937643257e2bb1Ray Chen private final ThreadPool mThreadPool; 581a4bd273afe5dd11592f7625c2f19853b6f174e9Owen Lin private final AlbumLabelMaker mLabelMaker; 591a4bd273afe5dd11592f7625c2f19853b6f174e9Owen Lin private final String mLoadingText; 60f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 61f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin private int mActiveRequestCount = 0; 62f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin private boolean mIsActive = false; 631a4bd273afe5dd11592f7625c2f19853b6f174e9Owen Lin private BitmapTexture mLoadingLabel; 641a4bd273afe5dd11592f7625c2f19853b6f174e9Owen Lin 651a4bd273afe5dd11592f7625c2f19853b6f174e9Owen Lin private int mSlotWidth; 66f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 671a4bd273afe5dd11592f7625c2f19853b6f174e9Owen Lin public static class AlbumSetEntry { 681a4bd273afe5dd11592f7625c2f19853b6f174e9Owen Lin public MediaSet album; 691a4bd273afe5dd11592f7625c2f19853b6f174e9Owen Lin public MediaItem coverItem; 701a4bd273afe5dd11592f7625c2f19853b6f174e9Owen Lin public Texture content; 711a4bd273afe5dd11592f7625c2f19853b6f174e9Owen Lin public Texture label; 72f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin public Path setPath; 73f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin public int sourceType; 74f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin public int cacheFlag; 75f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin public int cacheStatus; 761a4bd273afe5dd11592f7625c2f19853b6f174e9Owen Lin public int rotation; 771a4bd273afe5dd11592f7625c2f19853b6f174e9Owen Lin public int mediaType; 781a4bd273afe5dd11592f7625c2f19853b6f174e9Owen Lin public boolean isPanorama; 791a4bd273afe5dd11592f7625c2f19853b6f174e9Owen Lin public boolean isWaitLoadingDisplayed; 801a4bd273afe5dd11592f7625c2f19853b6f174e9Owen Lin public long setDataVersion; 811a4bd273afe5dd11592f7625c2f19853b6f174e9Owen Lin public long coverDataVersion; 821a4bd273afe5dd11592f7625c2f19853b6f174e9Owen Lin private BitmapLoader labelLoader; 831a4bd273afe5dd11592f7625c2f19853b6f174e9Owen Lin private BitmapLoader coverLoader; 84f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 85f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 869201679ed1c485767f2e334aa618bd733024af03Chih-Chung Chang public AlbumSetSlidingWindow(GalleryActivity activity, 879201679ed1c485767f2e334aa618bd733024af03Chih-Chung Chang AlbumSetView.LabelSpec labelSpec, SelectionDrawer drawer, 88f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin AlbumSetView.Model source, int cacheSize) { 89f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin source.setModelListener(this); 90f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin mSource = source; 911a4bd273afe5dd11592f7625c2f19853b6f174e9Owen Lin mData = new AlbumSetEntry[cacheSize]; 92f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin mSize = source.size(); 931a4bd273afe5dd11592f7625c2f19853b6f174e9Owen Lin mThreadPool = activity.getThreadPool(); 94f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 951a4bd273afe5dd11592f7625c2f19853b6f174e9Owen Lin mLabelMaker = new AlbumLabelMaker(activity.getAndroidContext(), labelSpec); 961a4bd273afe5dd11592f7625c2f19853b6f174e9Owen Lin mLoadingText = activity.getAndroidContext().getString(R.string.loading); 97f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 98f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin mHandler = new SynchronizedHandler(activity.getGLRoot()) { 99f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin @Override 100f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin public void handleMessage(Message message) { 1011a4bd273afe5dd11592f7625c2f19853b6f174e9Owen Lin Utils.assertTrue(message.what == MSG_UPDATE_ALBUM_ENTRY); 1021a4bd273afe5dd11592f7625c2f19853b6f174e9Owen Lin ((EntryUpdater) message.obj).updateEntry(); 103f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 104f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin }; 105f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 106f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 107f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin public void setListener(Listener listener) { 108f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin mListener = listener; 109f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 110f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 1111a4bd273afe5dd11592f7625c2f19853b6f174e9Owen Lin public AlbumSetEntry get(int slotIndex) { 112cfa105d3934c4dfa14f02b693bfa97c8d17d56a9Chih-Chung Chang if (!isActiveSlot(slotIndex)) { 113cfa105d3934c4dfa14f02b693bfa97c8d17d56a9Chih-Chung Chang Utils.fail("invalid slot: %s outsides (%s, %s)", 114cfa105d3934c4dfa14f02b693bfa97c8d17d56a9Chih-Chung Chang slotIndex, mActiveStart, mActiveEnd); 115cfa105d3934c4dfa14f02b693bfa97c8d17d56a9Chih-Chung Chang } 116f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin return mData[slotIndex % mData.length]; 117f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 118f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 119f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin public int size() { 120f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin return mSize; 121f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 122f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 123f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin public boolean isActiveSlot(int slotIndex) { 124f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin return slotIndex >= mActiveStart && slotIndex < mActiveEnd; 125f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 126f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 127f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin private void setContentWindow(int contentStart, int contentEnd) { 128f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin if (contentStart == mContentStart && contentEnd == mContentEnd) return; 129f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 130f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin if (contentStart >= mContentEnd || mContentStart >= contentEnd) { 131f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin for (int i = mContentStart, n = mContentEnd; i < n; ++i) { 132f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin freeSlotContent(i); 133f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 134f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin mSource.setActiveWindow(contentStart, contentEnd); 135f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin for (int i = contentStart; i < contentEnd; ++i) { 136f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin prepareSlotContent(i); 137f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 138f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } else { 139f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin for (int i = mContentStart; i < contentStart; ++i) { 140f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin freeSlotContent(i); 141f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 142f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin for (int i = contentEnd, n = mContentEnd; i < n; ++i) { 143f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin freeSlotContent(i); 144f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 145f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin mSource.setActiveWindow(contentStart, contentEnd); 146f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin for (int i = contentStart, n = mContentStart; i < n; ++i) { 147f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin prepareSlotContent(i); 148f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 149f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin for (int i = mContentEnd; i < contentEnd; ++i) { 150f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin prepareSlotContent(i); 151f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 152f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 153f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 154f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin mContentStart = contentStart; 155f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin mContentEnd = contentEnd; 156f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 157f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 158f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin public void setActiveWindow(int start, int end) { 159cfa105d3934c4dfa14f02b693bfa97c8d17d56a9Chih-Chung Chang if (!(start <= end && end - start <= mData.length && end <= mSize)) { 160cfa105d3934c4dfa14f02b693bfa97c8d17d56a9Chih-Chung Chang Utils.fail("start = %s, end = %s, length = %s, size = %s", 161cfa105d3934c4dfa14f02b693bfa97c8d17d56a9Chih-Chung Chang start, end, mData.length, mSize); 162cfa105d3934c4dfa14f02b693bfa97c8d17d56a9Chih-Chung Chang } 163f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 1641a4bd273afe5dd11592f7625c2f19853b6f174e9Owen Lin AlbumSetEntry data[] = mData; 165f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin mActiveStart = start; 166f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin mActiveEnd = end; 167f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin int contentStart = Utils.clamp((start + end) / 2 - data.length / 2, 168f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 0, Math.max(0, mSize - data.length)); 169f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin int contentEnd = Math.min(contentStart + data.length, mSize); 170f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin setContentWindow(contentStart, contentEnd); 171f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin if (mIsActive) updateAllImageRequests(); 172f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 173f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 174f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin // We would like to request non active slots in the following order: 175f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin // Order: 8 6 4 2 1 3 5 7 176f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin // |---------|---------------|---------| 177f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin // |<- active ->| 178f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin // |<-------- cached range ----------->| 179f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin private void requestNonactiveImages() { 180f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin int range = Math.max( 181f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin mContentEnd - mActiveEnd, mActiveStart - mContentStart); 182f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin for (int i = 0 ;i < range; ++i) { 183f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin requestImagesInSlot(mActiveEnd + i); 184f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin requestImagesInSlot(mActiveStart - 1 - i); 185f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 186f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 187f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 188f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin private void cancelNonactiveImages() { 189f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin int range = Math.max( 190f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin mContentEnd - mActiveEnd, mActiveStart - mContentStart); 191f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin for (int i = 0 ;i < range; ++i) { 192f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin cancelImagesInSlot(mActiveEnd + i); 193f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin cancelImagesInSlot(mActiveStart - 1 - i); 194f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 195f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 196f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 197f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin private void requestImagesInSlot(int slotIndex) { 198f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin if (slotIndex < mContentStart || slotIndex >= mContentEnd) return; 1991a4bd273afe5dd11592f7625c2f19853b6f174e9Owen Lin AlbumSetEntry entry = mData[slotIndex % mData.length]; 2001a4bd273afe5dd11592f7625c2f19853b6f174e9Owen Lin if (entry.coverLoader != null) entry.coverLoader.startLoad(); 2011a4bd273afe5dd11592f7625c2f19853b6f174e9Owen Lin if (entry.labelLoader != null) entry.labelLoader.startLoad(); 202f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 203f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 204f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin private void cancelImagesInSlot(int slotIndex) { 205f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin if (slotIndex < mContentStart || slotIndex >= mContentEnd) return; 2061a4bd273afe5dd11592f7625c2f19853b6f174e9Owen Lin AlbumSetEntry entry = mData[slotIndex % mData.length]; 2071a4bd273afe5dd11592f7625c2f19853b6f174e9Owen Lin if (entry.coverLoader != null) entry.coverLoader.cancelLoad(); 2081a4bd273afe5dd11592f7625c2f19853b6f174e9Owen Lin if (entry.labelLoader != null) entry.labelLoader.cancelLoad(); 2091a4bd273afe5dd11592f7625c2f19853b6f174e9Owen Lin } 2101a4bd273afe5dd11592f7625c2f19853b6f174e9Owen Lin 2111a4bd273afe5dd11592f7625c2f19853b6f174e9Owen Lin private static long getDataVersion(MediaObject object) { 2121a4bd273afe5dd11592f7625c2f19853b6f174e9Owen Lin return object == null 2131a4bd273afe5dd11592f7625c2f19853b6f174e9Owen Lin ? MediaSet.INVALID_DATA_VERSION 2141a4bd273afe5dd11592f7625c2f19853b6f174e9Owen Lin : object.getDataVersion(); 215f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 216f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 217f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin private void freeSlotContent(int slotIndex) { 2181a4bd273afe5dd11592f7625c2f19853b6f174e9Owen Lin AlbumSetEntry entry = mData[slotIndex % mData.length]; 2191a4bd273afe5dd11592f7625c2f19853b6f174e9Owen Lin if (entry.coverLoader != null) entry.coverLoader.recycle(); 2201a4bd273afe5dd11592f7625c2f19853b6f174e9Owen Lin if (entry.labelLoader != null) entry.labelLoader.recycle(); 2211a4bd273afe5dd11592f7625c2f19853b6f174e9Owen Lin mData[slotIndex % mData.length] = null; 222f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 223f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 2241a4bd273afe5dd11592f7625c2f19853b6f174e9Owen Lin private void updateAlbumSetEntry(AlbumSetEntry entry, 2251a4bd273afe5dd11592f7625c2f19853b6f174e9Owen Lin int slotIndex, MediaSet album, MediaItem cover) { 2261a4bd273afe5dd11592f7625c2f19853b6f174e9Owen Lin entry.album = album; 2271a4bd273afe5dd11592f7625c2f19853b6f174e9Owen Lin entry.setDataVersion = getDataVersion(album); 2281a4bd273afe5dd11592f7625c2f19853b6f174e9Owen Lin entry.sourceType = identifySourceType(album); 2291a4bd273afe5dd11592f7625c2f19853b6f174e9Owen Lin entry.cacheFlag = identifyCacheFlag(album); 2301a4bd273afe5dd11592f7625c2f19853b6f174e9Owen Lin entry.cacheStatus = identifyCacheStatus(album); 2311a4bd273afe5dd11592f7625c2f19853b6f174e9Owen Lin entry.setPath = (album == null) ? null : album.getPath(); 2321a4bd273afe5dd11592f7625c2f19853b6f174e9Owen Lin 2331a4bd273afe5dd11592f7625c2f19853b6f174e9Owen Lin if (entry.labelLoader != null) { 2341a4bd273afe5dd11592f7625c2f19853b6f174e9Owen Lin entry.labelLoader.recycle(); 2351a4bd273afe5dd11592f7625c2f19853b6f174e9Owen Lin entry.labelLoader = null; 2361a4bd273afe5dd11592f7625c2f19853b6f174e9Owen Lin entry.label = null; 2371a4bd273afe5dd11592f7625c2f19853b6f174e9Owen Lin } 2381a4bd273afe5dd11592f7625c2f19853b6f174e9Owen Lin if (album != null) { 2391a4bd273afe5dd11592f7625c2f19853b6f174e9Owen Lin entry.labelLoader = new AlbumLabelLoader( 2401a4bd273afe5dd11592f7625c2f19853b6f174e9Owen Lin slotIndex, album, entry.sourceType, mSlotWidth); 2411a4bd273afe5dd11592f7625c2f19853b6f174e9Owen Lin } 2421a4bd273afe5dd11592f7625c2f19853b6f174e9Owen Lin 2431a4bd273afe5dd11592f7625c2f19853b6f174e9Owen Lin entry.coverItem = cover; 2441a4bd273afe5dd11592f7625c2f19853b6f174e9Owen Lin if (getDataVersion(cover) != entry.coverDataVersion) { 2451a4bd273afe5dd11592f7625c2f19853b6f174e9Owen Lin entry.coverDataVersion = getDataVersion(cover); 2461a4bd273afe5dd11592f7625c2f19853b6f174e9Owen Lin entry.isPanorama = GalleryUtils.isPanorama(cover); 2471a4bd273afe5dd11592f7625c2f19853b6f174e9Owen Lin entry.rotation = (cover == null) ? 0 : cover.getRotation(); 2481a4bd273afe5dd11592f7625c2f19853b6f174e9Owen Lin entry.mediaType = (cover == null) ? 0 : cover.getMediaType(); 2491a4bd273afe5dd11592f7625c2f19853b6f174e9Owen Lin if (entry.coverLoader != null) { 2501a4bd273afe5dd11592f7625c2f19853b6f174e9Owen Lin entry.coverLoader.recycle(); 2511a4bd273afe5dd11592f7625c2f19853b6f174e9Owen Lin entry.coverLoader = null; 2521a4bd273afe5dd11592f7625c2f19853b6f174e9Owen Lin entry.content = null; 2531a4bd273afe5dd11592f7625c2f19853b6f174e9Owen Lin } 2541a4bd273afe5dd11592f7625c2f19853b6f174e9Owen Lin if (cover != null) { 2551a4bd273afe5dd11592f7625c2f19853b6f174e9Owen Lin entry.coverLoader = new AlbumCoverLoader(slotIndex, cover); 2561a4bd273afe5dd11592f7625c2f19853b6f174e9Owen Lin } 2571a4bd273afe5dd11592f7625c2f19853b6f174e9Owen Lin } 258f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 259f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 260f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin private void prepareSlotContent(int slotIndex) { 261f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin MediaSet set = mSource.getMediaSet(slotIndex); 2621a4bd273afe5dd11592f7625c2f19853b6f174e9Owen Lin MediaItem coverItem = mSource.getCoverItem(slotIndex); 2631a4bd273afe5dd11592f7625c2f19853b6f174e9Owen Lin AlbumSetEntry entry = new AlbumSetEntry(); 2641a4bd273afe5dd11592f7625c2f19853b6f174e9Owen Lin updateAlbumSetEntry(entry, slotIndex, set, coverItem); 2651a4bd273afe5dd11592f7625c2f19853b6f174e9Owen Lin mData[slotIndex % mData.length] = entry; 266f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 267f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 2681a4bd273afe5dd11592f7625c2f19853b6f174e9Owen Lin private static boolean startLoadBitmap(BitmapLoader loader) { 2691a4bd273afe5dd11592f7625c2f19853b6f174e9Owen Lin if (loader == null) return false; 2701a4bd273afe5dd11592f7625c2f19853b6f174e9Owen Lin loader.startLoad(); 2711a4bd273afe5dd11592f7625c2f19853b6f174e9Owen Lin return loader.isRequestInProgress(); 272f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 273f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 274f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin private void notifySlotChanged(int slotIndex) { 275f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin // If the updated content is not cached, ignore it 276f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin if (slotIndex < mContentStart || slotIndex >= mContentEnd) { 277f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin Log.w(TAG, String.format( 278f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin "invalid update: %s is outside (%s, %s)", 279f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin slotIndex, mContentStart, mContentEnd) ); 280f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin return; 281f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 2821a4bd273afe5dd11592f7625c2f19853b6f174e9Owen Lin 2831a4bd273afe5dd11592f7625c2f19853b6f174e9Owen Lin AlbumSetEntry entry = mData[slotIndex % mData.length]; 2841a4bd273afe5dd11592f7625c2f19853b6f174e9Owen Lin MediaSet set = mSource.getMediaSet(slotIndex); 2851a4bd273afe5dd11592f7625c2f19853b6f174e9Owen Lin MediaItem coverItem = mSource.getCoverItem(slotIndex); 2861a4bd273afe5dd11592f7625c2f19853b6f174e9Owen Lin updateAlbumSetEntry(entry, slotIndex, set, coverItem); 2871a4bd273afe5dd11592f7625c2f19853b6f174e9Owen Lin updateAllImageRequests(); 2881a4bd273afe5dd11592f7625c2f19853b6f174e9Owen Lin if (mListener != null && isActiveSlot(slotIndex)) { 2891a4bd273afe5dd11592f7625c2f19853b6f174e9Owen Lin mListener.onContentChanged(); 290f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 291f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 292f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 293f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin private void updateAllImageRequests() { 294f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin mActiveRequestCount = 0; 295f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin for (int i = mActiveStart, n = mActiveEnd; i < n; ++i) { 2961a4bd273afe5dd11592f7625c2f19853b6f174e9Owen Lin AlbumSetEntry entry = mData[i % mData.length]; 2971a4bd273afe5dd11592f7625c2f19853b6f174e9Owen Lin if (startLoadBitmap(entry.coverLoader)) ++mActiveRequestCount; 2981a4bd273afe5dd11592f7625c2f19853b6f174e9Owen Lin if (startLoadBitmap(entry.labelLoader)) ++mActiveRequestCount; 299f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 300f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin if (mActiveRequestCount == 0) { 301f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin requestNonactiveImages(); 302f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } else { 303f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin cancelNonactiveImages(); 304f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 305f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 306f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 3071a4bd273afe5dd11592f7625c2f19853b6f174e9Owen Lin @Override 3081a4bd273afe5dd11592f7625c2f19853b6f174e9Owen Lin public void onSizeChanged(int size) { 3091a4bd273afe5dd11592f7625c2f19853b6f174e9Owen Lin if (mIsActive && mSize != size) { 3101a4bd273afe5dd11592f7625c2f19853b6f174e9Owen Lin mSize = size; 3111a4bd273afe5dd11592f7625c2f19853b6f174e9Owen Lin if (mListener != null) mListener.onSizeChanged(mSize); 312f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 3131a4bd273afe5dd11592f7625c2f19853b6f174e9Owen Lin } 314f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 3151a4bd273afe5dd11592f7625c2f19853b6f174e9Owen Lin @Override 3161a4bd273afe5dd11592f7625c2f19853b6f174e9Owen Lin public void onWindowContentChanged(int index) { 3171a4bd273afe5dd11592f7625c2f19853b6f174e9Owen Lin if (!mIsActive) { 3181a4bd273afe5dd11592f7625c2f19853b6f174e9Owen Lin // paused, ignore slot changed event 3191a4bd273afe5dd11592f7625c2f19853b6f174e9Owen Lin return; 3204bb5912e85f6d1bd8a6b78d6d52b4c4da7aeb740Owen Lin } 3211a4bd273afe5dd11592f7625c2f19853b6f174e9Owen Lin notifySlotChanged(index); 3221a4bd273afe5dd11592f7625c2f19853b6f174e9Owen Lin } 3234bb5912e85f6d1bd8a6b78d6d52b4c4da7aeb740Owen Lin 3241a4bd273afe5dd11592f7625c2f19853b6f174e9Owen Lin public BitmapTexture getLoadingTexture() { 3251a4bd273afe5dd11592f7625c2f19853b6f174e9Owen Lin if (mLoadingLabel == null) { 3261a4bd273afe5dd11592f7625c2f19853b6f174e9Owen Lin Bitmap bitmap = mLabelMaker.requestLabel(mLoadingText, null, 3271a4bd273afe5dd11592f7625c2f19853b6f174e9Owen Lin SelectionDrawer.DATASOURCE_TYPE_NOT_CATEGORIZED, mSlotWidth) 3281a4bd273afe5dd11592f7625c2f19853b6f174e9Owen Lin .run(ThreadPool.JOB_CONTEXT_STUB); 3291a4bd273afe5dd11592f7625c2f19853b6f174e9Owen Lin mLoadingLabel = new BitmapTexture(bitmap); 3301a4bd273afe5dd11592f7625c2f19853b6f174e9Owen Lin mLoadingLabel.setOpaque(false); 331f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 3321a4bd273afe5dd11592f7625c2f19853b6f174e9Owen Lin return mLoadingLabel; 3331a4bd273afe5dd11592f7625c2f19853b6f174e9Owen Lin } 334f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 3351a4bd273afe5dd11592f7625c2f19853b6f174e9Owen Lin public void pause() { 3361a4bd273afe5dd11592f7625c2f19853b6f174e9Owen Lin mIsActive = false; 3371a4bd273afe5dd11592f7625c2f19853b6f174e9Owen Lin for (int i = mContentStart, n = mContentEnd; i < n; ++i) { 3381a4bd273afe5dd11592f7625c2f19853b6f174e9Owen Lin freeSlotContent(i); 3399201679ed1c485767f2e334aa618bd733024af03Chih-Chung Chang } 3401a4bd273afe5dd11592f7625c2f19853b6f174e9Owen Lin } 341f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 3421a4bd273afe5dd11592f7625c2f19853b6f174e9Owen Lin public void resume() { 3431a4bd273afe5dd11592f7625c2f19853b6f174e9Owen Lin mIsActive = true; 3441a4bd273afe5dd11592f7625c2f19853b6f174e9Owen Lin for (int i = mContentStart, n = mContentEnd; i < n; ++i) { 3451a4bd273afe5dd11592f7625c2f19853b6f174e9Owen Lin prepareSlotContent(i); 3461a4bd273afe5dd11592f7625c2f19853b6f174e9Owen Lin } 3471a4bd273afe5dd11592f7625c2f19853b6f174e9Owen Lin updateAllImageRequests(); 3481a4bd273afe5dd11592f7625c2f19853b6f174e9Owen Lin } 349f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 3501a4bd273afe5dd11592f7625c2f19853b6f174e9Owen Lin private static interface EntryUpdater { 3511a4bd273afe5dd11592f7625c2f19853b6f174e9Owen Lin public void updateEntry(); 3521a4bd273afe5dd11592f7625c2f19853b6f174e9Owen Lin } 353da071d27a1435cce080b5c609d0d833555e5a175Chih-Chung Chang 3541a4bd273afe5dd11592f7625c2f19853b6f174e9Owen Lin private class AlbumCoverLoader extends BitmapLoader implements EntryUpdater { 3551a4bd273afe5dd11592f7625c2f19853b6f174e9Owen Lin private MediaItem mMediaItem; 3561a4bd273afe5dd11592f7625c2f19853b6f174e9Owen Lin private final int mSlotIndex; 3576c1f01e21406a05dc7d3258001aa901bd8628a79Chih-Chung Chang 3581a4bd273afe5dd11592f7625c2f19853b6f174e9Owen Lin public AlbumCoverLoader(int slotIndex, MediaItem item) { 3591a4bd273afe5dd11592f7625c2f19853b6f174e9Owen Lin mSlotIndex = slotIndex; 3601a4bd273afe5dd11592f7625c2f19853b6f174e9Owen Lin mMediaItem = item; 361f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 362f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 363f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin @Override 3641a4bd273afe5dd11592f7625c2f19853b6f174e9Owen Lin protected void recycleBitmap(Bitmap bitmap) { 3651a4bd273afe5dd11592f7625c2f19853b6f174e9Owen Lin BitmapPool.recycle(BitmapPool.TYPE_MICRO_THUMB, bitmap); 366f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 367f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 368f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin @Override 3691a4bd273afe5dd11592f7625c2f19853b6f174e9Owen Lin protected Future<Bitmap> submitBitmapTask(FutureListener<Bitmap> l) { 3701a4bd273afe5dd11592f7625c2f19853b6f174e9Owen Lin return mThreadPool.submit(mMediaItem.requestImage( 3711a4bd273afe5dd11592f7625c2f19853b6f174e9Owen Lin MediaItem.TYPE_MICROTHUMBNAIL), l); 372f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 373f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 374f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin @Override 3751a4bd273afe5dd11592f7625c2f19853b6f174e9Owen Lin protected void onLoadComplete(Bitmap bitmap) { 3761a4bd273afe5dd11592f7625c2f19853b6f174e9Owen Lin mHandler.obtainMessage(MSG_UPDATE_ALBUM_ENTRY, this).sendToTarget(); 377f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 378f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 379f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin @Override 3801a4bd273afe5dd11592f7625c2f19853b6f174e9Owen Lin public void updateEntry() { 3811a4bd273afe5dd11592f7625c2f19853b6f174e9Owen Lin Bitmap bitmap = getBitmap(); 3821a4bd273afe5dd11592f7625c2f19853b6f174e9Owen Lin if (bitmap == null) return; 3831a4bd273afe5dd11592f7625c2f19853b6f174e9Owen Lin 3841a4bd273afe5dd11592f7625c2f19853b6f174e9Owen Lin AlbumSetEntry entry = mData[mSlotIndex % mData.length]; 3851a4bd273afe5dd11592f7625c2f19853b6f174e9Owen Lin BitmapTexture content = new BitmapTexture(bitmap); 3861a4bd273afe5dd11592f7625c2f19853b6f174e9Owen Lin entry.content = content; 3871a4bd273afe5dd11592f7625c2f19853b6f174e9Owen Lin 3881a4bd273afe5dd11592f7625c2f19853b6f174e9Owen Lin if (isActiveSlot(mSlotIndex)) { 3891a4bd273afe5dd11592f7625c2f19853b6f174e9Owen Lin --mActiveRequestCount; 3901a4bd273afe5dd11592f7625c2f19853b6f174e9Owen Lin if (mActiveRequestCount == 0) requestNonactiveImages(); 3911a4bd273afe5dd11592f7625c2f19853b6f174e9Owen Lin if (mListener != null) mListener.onContentChanged(); 3921a4bd273afe5dd11592f7625c2f19853b6f174e9Owen Lin } 393f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 394f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 395f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 396f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin private static int identifySourceType(MediaSet set) { 397f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin if (set == null) { 398f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin return SelectionDrawer.DATASOURCE_TYPE_NOT_CATEGORIZED; 399f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 400f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 401f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin Path path = set.getPath(); 402f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin if (MediaSetUtils.isCameraSource(path)) { 403f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin return SelectionDrawer.DATASOURCE_TYPE_CAMERA; 404f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 405f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 406f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin int type = SelectionDrawer.DATASOURCE_TYPE_NOT_CATEGORIZED; 407f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin String prefix = path.getPrefix(); 408f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 409f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin if (prefix.equals("picasa")) { 410f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin type = SelectionDrawer.DATASOURCE_TYPE_PICASA; 411f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } else if (prefix.equals("local") || prefix.equals("merge")) { 412f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin type = SelectionDrawer.DATASOURCE_TYPE_LOCAL; 413f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } else if (prefix.equals("mtp")) { 414f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin type = SelectionDrawer.DATASOURCE_TYPE_MTP; 415f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 416f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 417f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin return type; 418f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 419f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 420f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin private static int identifyCacheFlag(MediaSet set) { 421f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin if (set == null || (set.getSupportedOperations() 422f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin & MediaSet.SUPPORT_CACHE) == 0) { 423f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin return MediaSet.CACHE_FLAG_NO; 424f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 425f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 426f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin return set.getCacheFlag(); 427f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 428f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 429f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin private static int identifyCacheStatus(MediaSet set) { 430f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin if (set == null || (set.getSupportedOperations() 431f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin & MediaSet.SUPPORT_CACHE) == 0) { 432f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin return MediaSet.CACHE_STATUS_NOT_CACHED; 433f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 434f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 435f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin return set.getCacheStatus(); 436f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 437f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 4381a4bd273afe5dd11592f7625c2f19853b6f174e9Owen Lin private class AlbumLabelLoader extends BitmapLoader implements EntryUpdater { 4391a4bd273afe5dd11592f7625c2f19853b6f174e9Owen Lin private final MediaSet mMediaSet; 440f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin private final int mSlotIndex; 4411a4bd273afe5dd11592f7625c2f19853b6f174e9Owen Lin private final int mSourceType; 4421a4bd273afe5dd11592f7625c2f19853b6f174e9Owen Lin private final int mLabelWidth; 443f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 4441a4bd273afe5dd11592f7625c2f19853b6f174e9Owen Lin public AlbumLabelLoader(int slotIndex, 4451a4bd273afe5dd11592f7625c2f19853b6f174e9Owen Lin MediaSet mediaSet, int sourceType, int labelWidth) { 446f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin mSlotIndex = slotIndex; 4471a4bd273afe5dd11592f7625c2f19853b6f174e9Owen Lin mMediaSet = mediaSet; 4481a4bd273afe5dd11592f7625c2f19853b6f174e9Owen Lin mSourceType = sourceType; 4491a4bd273afe5dd11592f7625c2f19853b6f174e9Owen Lin mLabelWidth = labelWidth; 450f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 451f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 4521a4bd273afe5dd11592f7625c2f19853b6f174e9Owen Lin @Override 4531a4bd273afe5dd11592f7625c2f19853b6f174e9Owen Lin protected Future<Bitmap> submitBitmapTask(FutureListener<Bitmap> l) { 4541a4bd273afe5dd11592f7625c2f19853b6f174e9Owen Lin return mThreadPool.submit(mLabelMaker.requestLabel( 4551a4bd273afe5dd11592f7625c2f19853b6f174e9Owen Lin mMediaSet, mSourceType, mLabelWidth), l); 456f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 457f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 458f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin @Override 4591a4bd273afe5dd11592f7625c2f19853b6f174e9Owen Lin protected void recycleBitmap(Bitmap bitmap) { 460f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 461f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 462f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin @Override 4631a4bd273afe5dd11592f7625c2f19853b6f174e9Owen Lin protected void onLoadComplete(Bitmap bitmap) { 4641a4bd273afe5dd11592f7625c2f19853b6f174e9Owen Lin mHandler.obtainMessage(MSG_UPDATE_ALBUM_ENTRY, this).sendToTarget(); 465f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 466f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 4671a4bd273afe5dd11592f7625c2f19853b6f174e9Owen Lin @Override 4681a4bd273afe5dd11592f7625c2f19853b6f174e9Owen Lin public void updateEntry() { 4691a4bd273afe5dd11592f7625c2f19853b6f174e9Owen Lin if (isRecycled()) return; 470f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 4711a4bd273afe5dd11592f7625c2f19853b6f174e9Owen Lin Bitmap bitmap = getBitmap(); 4721a4bd273afe5dd11592f7625c2f19853b6f174e9Owen Lin if (bitmap == null) return; 473f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 4741a4bd273afe5dd11592f7625c2f19853b6f174e9Owen Lin AlbumSetEntry entry = mData[mSlotIndex % mData.length]; 4751a4bd273afe5dd11592f7625c2f19853b6f174e9Owen Lin BitmapTexture content = new BitmapTexture(bitmap); 4761a4bd273afe5dd11592f7625c2f19853b6f174e9Owen Lin content.setOpaque(false); 4771a4bd273afe5dd11592f7625c2f19853b6f174e9Owen Lin entry.label = content; 4781a4bd273afe5dd11592f7625c2f19853b6f174e9Owen Lin 4791a4bd273afe5dd11592f7625c2f19853b6f174e9Owen Lin if (isActiveSlot(mSlotIndex)) { 4801a4bd273afe5dd11592f7625c2f19853b6f174e9Owen Lin --mActiveRequestCount; 4811a4bd273afe5dd11592f7625c2f19853b6f174e9Owen Lin if (mActiveRequestCount == 0) requestNonactiveImages(); 4821a4bd273afe5dd11592f7625c2f19853b6f174e9Owen Lin if (mListener != null) mListener.onContentChanged(); 4831a4bd273afe5dd11592f7625c2f19853b6f174e9Owen Lin } 484f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 485f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 486f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 4871a4bd273afe5dd11592f7625c2f19853b6f174e9Owen Lin public void onSlotSizeChanged(int width, int height) { 4881a4bd273afe5dd11592f7625c2f19853b6f174e9Owen Lin if (mSlotWidth == width) return; 4891a4bd273afe5dd11592f7625c2f19853b6f174e9Owen Lin mSlotWidth = width; 4901a4bd273afe5dd11592f7625c2f19853b6f174e9Owen Lin mLoadingLabel = null; 4911a4bd273afe5dd11592f7625c2f19853b6f174e9Owen Lin 492f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin for (int i = mContentStart, n = mContentEnd; i < n; ++i) { 4931a4bd273afe5dd11592f7625c2f19853b6f174e9Owen Lin AlbumSetEntry entry = mData[i % mData.length]; 4941a4bd273afe5dd11592f7625c2f19853b6f174e9Owen Lin if (entry.labelLoader != null) { 4951a4bd273afe5dd11592f7625c2f19853b6f174e9Owen Lin entry.labelLoader.recycle(); 4961a4bd273afe5dd11592f7625c2f19853b6f174e9Owen Lin entry.labelLoader = null; 4971a4bd273afe5dd11592f7625c2f19853b6f174e9Owen Lin entry.label = null; 4981a4bd273afe5dd11592f7625c2f19853b6f174e9Owen Lin } 4991a4bd273afe5dd11592f7625c2f19853b6f174e9Owen Lin entry.labelLoader = (entry.album == null) 5001a4bd273afe5dd11592f7625c2f19853b6f174e9Owen Lin ? null 5011a4bd273afe5dd11592f7625c2f19853b6f174e9Owen Lin : new AlbumLabelLoader(i, entry.album, entry.sourceType, width); 502f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 503f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin updateAllImageRequests(); 504f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 505f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin} 506