AlbumSetSlidingWindow.java revision c3d8ac3b9504346dafc49e006b5f732dd1db21e8
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; 23c3d8ac3b9504346dafc49e006b5f732dd1db21e8Owen Linimport com.android.gallery3d.app.AlbumSetDataLoader; 24f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Linimport com.android.gallery3d.app.GalleryActivity; 25f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Linimport com.android.gallery3d.common.Utils; 2631cac30e46a293f6d0901e22c6ab0d083cae7021Owen Linimport com.android.gallery3d.data.DataSourceType; 27f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Linimport com.android.gallery3d.data.MediaItem; 281a4bd273afe5dd11592f7625c2f19853b6f174e9Owen Linimport com.android.gallery3d.data.MediaObject; 29f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Linimport com.android.gallery3d.data.MediaSet; 30f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Linimport com.android.gallery3d.data.Path; 31f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Linimport com.android.gallery3d.util.Future; 32f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Linimport com.android.gallery3d.util.FutureListener; 33bc2154199aee16762e3758ad0cfed685323d9a9fChih-Chung Changimport com.android.gallery3d.util.GalleryUtils; 34f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Linimport com.android.gallery3d.util.ThreadPool; 35f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 36c3d8ac3b9504346dafc49e006b5f732dd1db21e8Owen Linpublic class AlbumSetSlidingWindow implements AlbumSetDataLoader.DataListener { 371a4bd273afe5dd11592f7625c2f19853b6f174e9Owen Lin private static final String TAG = "AlbumSetSlidingWindow"; 381a4bd273afe5dd11592f7625c2f19853b6f174e9Owen Lin private static final int MSG_UPDATE_ALBUM_ENTRY = 1; 39f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 40f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin public static interface Listener { 41f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin public void onSizeChanged(int size); 427260f6f74d465520e4497b23fe56f98abb0c15a2Owen Lin public void onContentChanged(); 43f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 44f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 45c3d8ac3b9504346dafc49e006b5f732dd1db21e8Owen Lin private final AlbumSetDataLoader mSource; 46f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin private int mSize; 47f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 48f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin private int mContentStart = 0; 49f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin private int mContentEnd = 0; 50f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 51f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin private int mActiveStart = 0; 52f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin private int mActiveEnd = 0; 53f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 54f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin private Listener mListener; 55f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 561a4bd273afe5dd11592f7625c2f19853b6f174e9Owen Lin private final AlbumSetEntry mData[]; 57dbf4ba12afba115888493caa34937643257e2bb1Ray Chen private final SynchronizedHandler mHandler; 58dbf4ba12afba115888493caa34937643257e2bb1Ray Chen private final ThreadPool mThreadPool; 591a4bd273afe5dd11592f7625c2f19853b6f174e9Owen Lin private final AlbumLabelMaker mLabelMaker; 601a4bd273afe5dd11592f7625c2f19853b6f174e9Owen Lin private final String mLoadingText; 61d8fb81f601830385a2343d08ad5dd171e4c7bfe0Owen Lin private final TextureUploader mTextureUploader; 62f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 63f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin private int mActiveRequestCount = 0; 64f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin private boolean mIsActive = false; 651a4bd273afe5dd11592f7625c2f19853b6f174e9Owen Lin private BitmapTexture mLoadingLabel; 661a4bd273afe5dd11592f7625c2f19853b6f174e9Owen Lin 671a4bd273afe5dd11592f7625c2f19853b6f174e9Owen Lin private int mSlotWidth; 68f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 691a4bd273afe5dd11592f7625c2f19853b6f174e9Owen Lin public static class AlbumSetEntry { 701a4bd273afe5dd11592f7625c2f19853b6f174e9Owen Lin public MediaSet album; 711a4bd273afe5dd11592f7625c2f19853b6f174e9Owen Lin public MediaItem coverItem; 721a4bd273afe5dd11592f7625c2f19853b6f174e9Owen Lin public Texture content; 731a4bd273afe5dd11592f7625c2f19853b6f174e9Owen Lin public Texture label; 74f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin public Path setPath; 75f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin public int sourceType; 76f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin public int cacheFlag; 77f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin public int cacheStatus; 781a4bd273afe5dd11592f7625c2f19853b6f174e9Owen Lin public int rotation; 791a4bd273afe5dd11592f7625c2f19853b6f174e9Owen Lin public int mediaType; 801a4bd273afe5dd11592f7625c2f19853b6f174e9Owen Lin public boolean isPanorama; 811a4bd273afe5dd11592f7625c2f19853b6f174e9Owen Lin public boolean isWaitLoadingDisplayed; 821a4bd273afe5dd11592f7625c2f19853b6f174e9Owen Lin public long setDataVersion; 831a4bd273afe5dd11592f7625c2f19853b6f174e9Owen Lin public long coverDataVersion; 841a4bd273afe5dd11592f7625c2f19853b6f174e9Owen Lin private BitmapLoader labelLoader; 851a4bd273afe5dd11592f7625c2f19853b6f174e9Owen Lin private BitmapLoader coverLoader; 86f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 87f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 889201679ed1c485767f2e334aa618bd733024af03Chih-Chung Chang public AlbumSetSlidingWindow(GalleryActivity activity, 89c3d8ac3b9504346dafc49e006b5f732dd1db21e8Owen Lin AlbumSetDataLoader source, AlbumSetSlotRenderer.LabelSpec labelSpec, int cacheSize) { 90f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin source.setModelListener(this); 91f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin mSource = source; 921a4bd273afe5dd11592f7625c2f19853b6f174e9Owen Lin mData = new AlbumSetEntry[cacheSize]; 93f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin mSize = source.size(); 941a4bd273afe5dd11592f7625c2f19853b6f174e9Owen Lin mThreadPool = activity.getThreadPool(); 95f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 961a4bd273afe5dd11592f7625c2f19853b6f174e9Owen Lin mLabelMaker = new AlbumLabelMaker(activity.getAndroidContext(), labelSpec); 971a4bd273afe5dd11592f7625c2f19853b6f174e9Owen Lin mLoadingText = activity.getAndroidContext().getString(R.string.loading); 98d8fb81f601830385a2343d08ad5dd171e4c7bfe0Owen Lin mTextureUploader = new TextureUploader(activity.getGLRoot()); 99f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 100f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin mHandler = new SynchronizedHandler(activity.getGLRoot()) { 101f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin @Override 102f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin public void handleMessage(Message message) { 1031a4bd273afe5dd11592f7625c2f19853b6f174e9Owen Lin Utils.assertTrue(message.what == MSG_UPDATE_ALBUM_ENTRY); 1041a4bd273afe5dd11592f7625c2f19853b6f174e9Owen Lin ((EntryUpdater) message.obj).updateEntry(); 105f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 106f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin }; 107f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 108f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 109f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin public void setListener(Listener listener) { 110f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin mListener = listener; 111f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 112f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 1131a4bd273afe5dd11592f7625c2f19853b6f174e9Owen Lin public AlbumSetEntry get(int slotIndex) { 114cfa105d3934c4dfa14f02b693bfa97c8d17d56a9Chih-Chung Chang if (!isActiveSlot(slotIndex)) { 115cfa105d3934c4dfa14f02b693bfa97c8d17d56a9Chih-Chung Chang Utils.fail("invalid slot: %s outsides (%s, %s)", 116cfa105d3934c4dfa14f02b693bfa97c8d17d56a9Chih-Chung Chang slotIndex, mActiveStart, mActiveEnd); 117cfa105d3934c4dfa14f02b693bfa97c8d17d56a9Chih-Chung Chang } 118f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin return mData[slotIndex % mData.length]; 119f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 120f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 121f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin public int size() { 122f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin return mSize; 123f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 124f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 125f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin public boolean isActiveSlot(int slotIndex) { 126f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin return slotIndex >= mActiveStart && slotIndex < mActiveEnd; 127f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 128f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 129f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin private void setContentWindow(int contentStart, int contentEnd) { 130f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin if (contentStart == mContentStart && contentEnd == mContentEnd) return; 131f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 132f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin if (contentStart >= mContentEnd || mContentStart >= contentEnd) { 133f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin for (int i = mContentStart, n = mContentEnd; i < n; ++i) { 134f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin freeSlotContent(i); 135f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 136f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin mSource.setActiveWindow(contentStart, contentEnd); 137f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin for (int i = contentStart; i < contentEnd; ++i) { 138f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin prepareSlotContent(i); 139f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 140f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } else { 141f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin for (int i = mContentStart; i < contentStart; ++i) { 142f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin freeSlotContent(i); 143f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 144f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin for (int i = contentEnd, n = mContentEnd; i < n; ++i) { 145f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin freeSlotContent(i); 146f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 147f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin mSource.setActiveWindow(contentStart, contentEnd); 148f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin for (int i = contentStart, n = mContentStart; i < n; ++i) { 149f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin prepareSlotContent(i); 150f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 151f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin for (int i = mContentEnd; i < contentEnd; ++i) { 152f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin prepareSlotContent(i); 153f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 154f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 155f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 156f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin mContentStart = contentStart; 157f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin mContentEnd = contentEnd; 158f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 159f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 160f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin public void setActiveWindow(int start, int end) { 161cfa105d3934c4dfa14f02b693bfa97c8d17d56a9Chih-Chung Chang if (!(start <= end && end - start <= mData.length && end <= mSize)) { 162cfa105d3934c4dfa14f02b693bfa97c8d17d56a9Chih-Chung Chang Utils.fail("start = %s, end = %s, length = %s, size = %s", 163cfa105d3934c4dfa14f02b693bfa97c8d17d56a9Chih-Chung Chang start, end, mData.length, mSize); 164cfa105d3934c4dfa14f02b693bfa97c8d17d56a9Chih-Chung Chang } 165f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 1661a4bd273afe5dd11592f7625c2f19853b6f174e9Owen Lin AlbumSetEntry data[] = mData; 167f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin mActiveStart = start; 168f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin mActiveEnd = end; 169f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin int contentStart = Utils.clamp((start + end) / 2 - data.length / 2, 170f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 0, Math.max(0, mSize - data.length)); 171f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin int contentEnd = Math.min(contentStart + data.length, mSize); 172f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin setContentWindow(contentStart, contentEnd); 173d8fb81f601830385a2343d08ad5dd171e4c7bfe0Owen Lin 174d8fb81f601830385a2343d08ad5dd171e4c7bfe0Owen Lin if (mIsActive) { 175d8fb81f601830385a2343d08ad5dd171e4c7bfe0Owen Lin updateTextureUploadQueue(); 176d8fb81f601830385a2343d08ad5dd171e4c7bfe0Owen Lin updateAllImageRequests(); 177d8fb81f601830385a2343d08ad5dd171e4c7bfe0Owen Lin } 178f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 179f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 180f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin // We would like to request non active slots in the following order: 181f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin // Order: 8 6 4 2 1 3 5 7 182f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin // |---------|---------------|---------| 183f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin // |<- active ->| 184f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin // |<-------- cached range ----------->| 185f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin private void requestNonactiveImages() { 186f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin int range = Math.max( 187f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin mContentEnd - mActiveEnd, mActiveStart - mContentStart); 188f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin for (int i = 0 ;i < range; ++i) { 189f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin requestImagesInSlot(mActiveEnd + i); 190f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin requestImagesInSlot(mActiveStart - 1 - i); 191f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 192f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 193f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 194f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin private void cancelNonactiveImages() { 195f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin int range = Math.max( 196f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin mContentEnd - mActiveEnd, mActiveStart - mContentStart); 197f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin for (int i = 0 ;i < range; ++i) { 198f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin cancelImagesInSlot(mActiveEnd + i); 199f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin cancelImagesInSlot(mActiveStart - 1 - i); 200f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 201f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 202f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 203f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin private void requestImagesInSlot(int slotIndex) { 204f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin if (slotIndex < mContentStart || slotIndex >= mContentEnd) return; 2051a4bd273afe5dd11592f7625c2f19853b6f174e9Owen Lin AlbumSetEntry entry = mData[slotIndex % mData.length]; 2061a4bd273afe5dd11592f7625c2f19853b6f174e9Owen Lin if (entry.coverLoader != null) entry.coverLoader.startLoad(); 2071a4bd273afe5dd11592f7625c2f19853b6f174e9Owen Lin if (entry.labelLoader != null) entry.labelLoader.startLoad(); 208f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 209f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 210f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin private void cancelImagesInSlot(int slotIndex) { 211f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin if (slotIndex < mContentStart || slotIndex >= mContentEnd) return; 2121a4bd273afe5dd11592f7625c2f19853b6f174e9Owen Lin AlbumSetEntry entry = mData[slotIndex % mData.length]; 2131a4bd273afe5dd11592f7625c2f19853b6f174e9Owen Lin if (entry.coverLoader != null) entry.coverLoader.cancelLoad(); 2141a4bd273afe5dd11592f7625c2f19853b6f174e9Owen Lin if (entry.labelLoader != null) entry.labelLoader.cancelLoad(); 2151a4bd273afe5dd11592f7625c2f19853b6f174e9Owen Lin } 2161a4bd273afe5dd11592f7625c2f19853b6f174e9Owen Lin 2171a4bd273afe5dd11592f7625c2f19853b6f174e9Owen Lin private static long getDataVersion(MediaObject object) { 2181a4bd273afe5dd11592f7625c2f19853b6f174e9Owen Lin return object == null 2191a4bd273afe5dd11592f7625c2f19853b6f174e9Owen Lin ? MediaSet.INVALID_DATA_VERSION 2201a4bd273afe5dd11592f7625c2f19853b6f174e9Owen Lin : object.getDataVersion(); 221f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 222f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 223f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin private void freeSlotContent(int slotIndex) { 2241a4bd273afe5dd11592f7625c2f19853b6f174e9Owen Lin AlbumSetEntry entry = mData[slotIndex % mData.length]; 2251a4bd273afe5dd11592f7625c2f19853b6f174e9Owen Lin if (entry.coverLoader != null) entry.coverLoader.recycle(); 2261a4bd273afe5dd11592f7625c2f19853b6f174e9Owen Lin if (entry.labelLoader != null) entry.labelLoader.recycle(); 2271a4bd273afe5dd11592f7625c2f19853b6f174e9Owen Lin mData[slotIndex % mData.length] = null; 228f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 229f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 2301a4bd273afe5dd11592f7625c2f19853b6f174e9Owen Lin private void updateAlbumSetEntry(AlbumSetEntry entry, 2311a4bd273afe5dd11592f7625c2f19853b6f174e9Owen Lin int slotIndex, MediaSet album, MediaItem cover) { 2321a4bd273afe5dd11592f7625c2f19853b6f174e9Owen Lin entry.album = album; 2331a4bd273afe5dd11592f7625c2f19853b6f174e9Owen Lin entry.setDataVersion = getDataVersion(album); 23431cac30e46a293f6d0901e22c6ab0d083cae7021Owen Lin entry.sourceType = DataSourceType.identifySourceType(album); 2351a4bd273afe5dd11592f7625c2f19853b6f174e9Owen Lin entry.cacheFlag = identifyCacheFlag(album); 2361a4bd273afe5dd11592f7625c2f19853b6f174e9Owen Lin entry.cacheStatus = identifyCacheStatus(album); 2371a4bd273afe5dd11592f7625c2f19853b6f174e9Owen Lin entry.setPath = (album == null) ? null : album.getPath(); 2381a4bd273afe5dd11592f7625c2f19853b6f174e9Owen Lin 2391a4bd273afe5dd11592f7625c2f19853b6f174e9Owen Lin if (entry.labelLoader != null) { 2401a4bd273afe5dd11592f7625c2f19853b6f174e9Owen Lin entry.labelLoader.recycle(); 2411a4bd273afe5dd11592f7625c2f19853b6f174e9Owen Lin entry.labelLoader = null; 2421a4bd273afe5dd11592f7625c2f19853b6f174e9Owen Lin entry.label = null; 2431a4bd273afe5dd11592f7625c2f19853b6f174e9Owen Lin } 2441a4bd273afe5dd11592f7625c2f19853b6f174e9Owen Lin if (album != null) { 245d8fb81f601830385a2343d08ad5dd171e4c7bfe0Owen Lin entry.labelLoader = 246d8fb81f601830385a2343d08ad5dd171e4c7bfe0Owen Lin new AlbumLabelLoader(slotIndex, album, entry.sourceType); 2471a4bd273afe5dd11592f7625c2f19853b6f174e9Owen Lin } 2481a4bd273afe5dd11592f7625c2f19853b6f174e9Owen Lin 2491a4bd273afe5dd11592f7625c2f19853b6f174e9Owen Lin entry.coverItem = cover; 2501a4bd273afe5dd11592f7625c2f19853b6f174e9Owen Lin if (getDataVersion(cover) != entry.coverDataVersion) { 2511a4bd273afe5dd11592f7625c2f19853b6f174e9Owen Lin entry.coverDataVersion = getDataVersion(cover); 2521a4bd273afe5dd11592f7625c2f19853b6f174e9Owen Lin entry.isPanorama = GalleryUtils.isPanorama(cover); 2531a4bd273afe5dd11592f7625c2f19853b6f174e9Owen Lin entry.rotation = (cover == null) ? 0 : cover.getRotation(); 2541a4bd273afe5dd11592f7625c2f19853b6f174e9Owen Lin entry.mediaType = (cover == null) ? 0 : cover.getMediaType(); 2551a4bd273afe5dd11592f7625c2f19853b6f174e9Owen Lin if (entry.coverLoader != null) { 2561a4bd273afe5dd11592f7625c2f19853b6f174e9Owen Lin entry.coverLoader.recycle(); 2571a4bd273afe5dd11592f7625c2f19853b6f174e9Owen Lin entry.coverLoader = null; 2581a4bd273afe5dd11592f7625c2f19853b6f174e9Owen Lin entry.content = null; 2591a4bd273afe5dd11592f7625c2f19853b6f174e9Owen Lin } 2601a4bd273afe5dd11592f7625c2f19853b6f174e9Owen Lin if (cover != null) { 2611a4bd273afe5dd11592f7625c2f19853b6f174e9Owen Lin entry.coverLoader = new AlbumCoverLoader(slotIndex, cover); 2621a4bd273afe5dd11592f7625c2f19853b6f174e9Owen Lin } 2631a4bd273afe5dd11592f7625c2f19853b6f174e9Owen Lin } 264f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 265f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 266f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin private void prepareSlotContent(int slotIndex) { 267f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin MediaSet set = mSource.getMediaSet(slotIndex); 2681a4bd273afe5dd11592f7625c2f19853b6f174e9Owen Lin MediaItem coverItem = mSource.getCoverItem(slotIndex); 2691a4bd273afe5dd11592f7625c2f19853b6f174e9Owen Lin AlbumSetEntry entry = new AlbumSetEntry(); 2701a4bd273afe5dd11592f7625c2f19853b6f174e9Owen Lin updateAlbumSetEntry(entry, slotIndex, set, coverItem); 2711a4bd273afe5dd11592f7625c2f19853b6f174e9Owen Lin mData[slotIndex % mData.length] = entry; 272f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 273f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 2741a4bd273afe5dd11592f7625c2f19853b6f174e9Owen Lin private static boolean startLoadBitmap(BitmapLoader loader) { 2751a4bd273afe5dd11592f7625c2f19853b6f174e9Owen Lin if (loader == null) return false; 2761a4bd273afe5dd11592f7625c2f19853b6f174e9Owen Lin loader.startLoad(); 2771a4bd273afe5dd11592f7625c2f19853b6f174e9Owen Lin return loader.isRequestInProgress(); 278f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 279f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 280cd36bfc52cc4e7f4b667ba3c5e8eb950647ae9d1Owen Lin private void uploadBackgroundTextureInSlot(int index) { 281cd36bfc52cc4e7f4b667ba3c5e8eb950647ae9d1Owen Lin if (index < mContentStart || index >= mContentEnd) return; 282cd36bfc52cc4e7f4b667ba3c5e8eb950647ae9d1Owen Lin AlbumSetEntry entry = mData[index % mData.length]; 283cd36bfc52cc4e7f4b667ba3c5e8eb950647ae9d1Owen Lin if (entry.content instanceof BitmapTexture) { 284cd36bfc52cc4e7f4b667ba3c5e8eb950647ae9d1Owen Lin mTextureUploader.addBgTexture((BitmapTexture) entry.content); 285cd36bfc52cc4e7f4b667ba3c5e8eb950647ae9d1Owen Lin } 286cd36bfc52cc4e7f4b667ba3c5e8eb950647ae9d1Owen Lin if (entry.label instanceof BitmapTexture) { 287cd36bfc52cc4e7f4b667ba3c5e8eb950647ae9d1Owen Lin mTextureUploader.addBgTexture((BitmapTexture) entry.label); 288f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 289d8fb81f601830385a2343d08ad5dd171e4c7bfe0Owen Lin } 2901a4bd273afe5dd11592f7625c2f19853b6f174e9Owen Lin 291d8fb81f601830385a2343d08ad5dd171e4c7bfe0Owen Lin private void updateTextureUploadQueue() { 292d8fb81f601830385a2343d08ad5dd171e4c7bfe0Owen Lin if (!mIsActive) return; 293d8fb81f601830385a2343d08ad5dd171e4c7bfe0Owen Lin mTextureUploader.clear(); 294cd36bfc52cc4e7f4b667ba3c5e8eb950647ae9d1Owen Lin 295cd36bfc52cc4e7f4b667ba3c5e8eb950647ae9d1Owen Lin // Upload foreground texture 296cd36bfc52cc4e7f4b667ba3c5e8eb950647ae9d1Owen Lin for (int i = mActiveStart, n = mActiveEnd; i < n; ++i) { 297d8fb81f601830385a2343d08ad5dd171e4c7bfe0Owen Lin AlbumSetEntry entry = mData[i % mData.length]; 298cd36bfc52cc4e7f4b667ba3c5e8eb950647ae9d1Owen Lin if (entry.content instanceof BitmapTexture) { 299cd36bfc52cc4e7f4b667ba3c5e8eb950647ae9d1Owen Lin mTextureUploader.addFgTexture((BitmapTexture) entry.content); 300cd36bfc52cc4e7f4b667ba3c5e8eb950647ae9d1Owen Lin } 301cd36bfc52cc4e7f4b667ba3c5e8eb950647ae9d1Owen Lin if (entry.label instanceof BitmapTexture) { 302cd36bfc52cc4e7f4b667ba3c5e8eb950647ae9d1Owen Lin mTextureUploader.addFgTexture((BitmapTexture) entry.label); 303cd36bfc52cc4e7f4b667ba3c5e8eb950647ae9d1Owen Lin } 304cd36bfc52cc4e7f4b667ba3c5e8eb950647ae9d1Owen Lin } 305cd36bfc52cc4e7f4b667ba3c5e8eb950647ae9d1Owen Lin 306cd36bfc52cc4e7f4b667ba3c5e8eb950647ae9d1Owen Lin // add background textures 307cd36bfc52cc4e7f4b667ba3c5e8eb950647ae9d1Owen Lin int range = Math.max( 308cd36bfc52cc4e7f4b667ba3c5e8eb950647ae9d1Owen Lin (mContentEnd - mActiveEnd), (mActiveStart - mContentStart)); 309cd36bfc52cc4e7f4b667ba3c5e8eb950647ae9d1Owen Lin for (int i = 0; i < range; ++i) { 310cd36bfc52cc4e7f4b667ba3c5e8eb950647ae9d1Owen Lin uploadBackgroundTextureInSlot(mActiveEnd + i); 311cd36bfc52cc4e7f4b667ba3c5e8eb950647ae9d1Owen Lin uploadBackgroundTextureInSlot(mActiveStart - i - 1); 312f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 313f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 314f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 315f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin private void updateAllImageRequests() { 316f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin mActiveRequestCount = 0; 317f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin for (int i = mActiveStart, n = mActiveEnd; i < n; ++i) { 3181a4bd273afe5dd11592f7625c2f19853b6f174e9Owen Lin AlbumSetEntry entry = mData[i % mData.length]; 3191a4bd273afe5dd11592f7625c2f19853b6f174e9Owen Lin if (startLoadBitmap(entry.coverLoader)) ++mActiveRequestCount; 3201a4bd273afe5dd11592f7625c2f19853b6f174e9Owen Lin if (startLoadBitmap(entry.labelLoader)) ++mActiveRequestCount; 321f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 322f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin if (mActiveRequestCount == 0) { 323f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin requestNonactiveImages(); 324f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } else { 325f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin cancelNonactiveImages(); 326f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 327f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 328f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 3291a4bd273afe5dd11592f7625c2f19853b6f174e9Owen Lin @Override 3301a4bd273afe5dd11592f7625c2f19853b6f174e9Owen Lin public void onSizeChanged(int size) { 3311a4bd273afe5dd11592f7625c2f19853b6f174e9Owen Lin if (mIsActive && mSize != size) { 3321a4bd273afe5dd11592f7625c2f19853b6f174e9Owen Lin mSize = size; 3331a4bd273afe5dd11592f7625c2f19853b6f174e9Owen Lin if (mListener != null) mListener.onSizeChanged(mSize); 334f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 3351a4bd273afe5dd11592f7625c2f19853b6f174e9Owen Lin } 336f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 3371a4bd273afe5dd11592f7625c2f19853b6f174e9Owen Lin @Override 338c3d8ac3b9504346dafc49e006b5f732dd1db21e8Owen Lin public void onContentChanged(int index) { 3391a4bd273afe5dd11592f7625c2f19853b6f174e9Owen Lin if (!mIsActive) { 3401a4bd273afe5dd11592f7625c2f19853b6f174e9Owen Lin // paused, ignore slot changed event 3411a4bd273afe5dd11592f7625c2f19853b6f174e9Owen Lin return; 3424bb5912e85f6d1bd8a6b78d6d52b4c4da7aeb740Owen Lin } 343d8fb81f601830385a2343d08ad5dd171e4c7bfe0Owen Lin 344d8fb81f601830385a2343d08ad5dd171e4c7bfe0Owen Lin // If the updated content is not cached, ignore it 345d8fb81f601830385a2343d08ad5dd171e4c7bfe0Owen Lin if (index < mContentStart || index >= mContentEnd) { 346d8fb81f601830385a2343d08ad5dd171e4c7bfe0Owen Lin Log.w(TAG, String.format( 347d8fb81f601830385a2343d08ad5dd171e4c7bfe0Owen Lin "invalid update: %s is outside (%s, %s)", 348d8fb81f601830385a2343d08ad5dd171e4c7bfe0Owen Lin index, mContentStart, mContentEnd) ); 349d8fb81f601830385a2343d08ad5dd171e4c7bfe0Owen Lin return; 350d8fb81f601830385a2343d08ad5dd171e4c7bfe0Owen Lin } 351d8fb81f601830385a2343d08ad5dd171e4c7bfe0Owen Lin 352d8fb81f601830385a2343d08ad5dd171e4c7bfe0Owen Lin AlbumSetEntry entry = mData[index % mData.length]; 353d8fb81f601830385a2343d08ad5dd171e4c7bfe0Owen Lin MediaSet set = mSource.getMediaSet(index); 354d8fb81f601830385a2343d08ad5dd171e4c7bfe0Owen Lin MediaItem coverItem = mSource.getCoverItem(index); 355d8fb81f601830385a2343d08ad5dd171e4c7bfe0Owen Lin updateAlbumSetEntry(entry, index, set, coverItem); 356d8fb81f601830385a2343d08ad5dd171e4c7bfe0Owen Lin updateAllImageRequests(); 357d8fb81f601830385a2343d08ad5dd171e4c7bfe0Owen Lin updateTextureUploadQueue(); 358d8fb81f601830385a2343d08ad5dd171e4c7bfe0Owen Lin if (mListener != null && isActiveSlot(index)) { 359d8fb81f601830385a2343d08ad5dd171e4c7bfe0Owen Lin mListener.onContentChanged(); 360d8fb81f601830385a2343d08ad5dd171e4c7bfe0Owen Lin } 3611a4bd273afe5dd11592f7625c2f19853b6f174e9Owen Lin } 3624bb5912e85f6d1bd8a6b78d6d52b4c4da7aeb740Owen Lin 3631a4bd273afe5dd11592f7625c2f19853b6f174e9Owen Lin public BitmapTexture getLoadingTexture() { 3641a4bd273afe5dd11592f7625c2f19853b6f174e9Owen Lin if (mLoadingLabel == null) { 3651a4bd273afe5dd11592f7625c2f19853b6f174e9Owen Lin Bitmap bitmap = mLabelMaker.requestLabel(mLoadingText, null, 36631cac30e46a293f6d0901e22c6ab0d083cae7021Owen Lin DataSourceType.TYPE_NOT_CATEGORIZED) 3671a4bd273afe5dd11592f7625c2f19853b6f174e9Owen Lin .run(ThreadPool.JOB_CONTEXT_STUB); 3681a4bd273afe5dd11592f7625c2f19853b6f174e9Owen Lin mLoadingLabel = new BitmapTexture(bitmap); 3691a4bd273afe5dd11592f7625c2f19853b6f174e9Owen Lin mLoadingLabel.setOpaque(false); 370f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 3711a4bd273afe5dd11592f7625c2f19853b6f174e9Owen Lin return mLoadingLabel; 3721a4bd273afe5dd11592f7625c2f19853b6f174e9Owen Lin } 373f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 3741a4bd273afe5dd11592f7625c2f19853b6f174e9Owen Lin public void pause() { 3751a4bd273afe5dd11592f7625c2f19853b6f174e9Owen Lin mIsActive = false; 3761a4bd273afe5dd11592f7625c2f19853b6f174e9Owen Lin for (int i = mContentStart, n = mContentEnd; i < n; ++i) { 3771a4bd273afe5dd11592f7625c2f19853b6f174e9Owen Lin freeSlotContent(i); 3789201679ed1c485767f2e334aa618bd733024af03Chih-Chung Chang } 379d8fb81f601830385a2343d08ad5dd171e4c7bfe0Owen Lin mLabelMaker.clearRecycledLabels(); 3801a4bd273afe5dd11592f7625c2f19853b6f174e9Owen Lin } 381f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 3821a4bd273afe5dd11592f7625c2f19853b6f174e9Owen Lin public void resume() { 3831a4bd273afe5dd11592f7625c2f19853b6f174e9Owen Lin mIsActive = true; 3841a4bd273afe5dd11592f7625c2f19853b6f174e9Owen Lin for (int i = mContentStart, n = mContentEnd; i < n; ++i) { 3851a4bd273afe5dd11592f7625c2f19853b6f174e9Owen Lin prepareSlotContent(i); 3861a4bd273afe5dd11592f7625c2f19853b6f174e9Owen Lin } 3871a4bd273afe5dd11592f7625c2f19853b6f174e9Owen Lin updateAllImageRequests(); 3881a4bd273afe5dd11592f7625c2f19853b6f174e9Owen Lin } 389f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 3901a4bd273afe5dd11592f7625c2f19853b6f174e9Owen Lin private static interface EntryUpdater { 3911a4bd273afe5dd11592f7625c2f19853b6f174e9Owen Lin public void updateEntry(); 3921a4bd273afe5dd11592f7625c2f19853b6f174e9Owen Lin } 393da071d27a1435cce080b5c609d0d833555e5a175Chih-Chung Chang 3941a4bd273afe5dd11592f7625c2f19853b6f174e9Owen Lin private class AlbumCoverLoader extends BitmapLoader implements EntryUpdater { 3951a4bd273afe5dd11592f7625c2f19853b6f174e9Owen Lin private MediaItem mMediaItem; 3961a4bd273afe5dd11592f7625c2f19853b6f174e9Owen Lin private final int mSlotIndex; 3976c1f01e21406a05dc7d3258001aa901bd8628a79Chih-Chung Chang 3981a4bd273afe5dd11592f7625c2f19853b6f174e9Owen Lin public AlbumCoverLoader(int slotIndex, MediaItem item) { 3991a4bd273afe5dd11592f7625c2f19853b6f174e9Owen Lin mSlotIndex = slotIndex; 4001a4bd273afe5dd11592f7625c2f19853b6f174e9Owen Lin mMediaItem = item; 401f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 402f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 403f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin @Override 4041a4bd273afe5dd11592f7625c2f19853b6f174e9Owen Lin protected void recycleBitmap(Bitmap bitmap) { 405d8fb81f601830385a2343d08ad5dd171e4c7bfe0Owen Lin MediaItem.getMicroThumbPool().recycle(bitmap); 406f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 407f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 408f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin @Override 4091a4bd273afe5dd11592f7625c2f19853b6f174e9Owen Lin protected Future<Bitmap> submitBitmapTask(FutureListener<Bitmap> l) { 4101a4bd273afe5dd11592f7625c2f19853b6f174e9Owen Lin return mThreadPool.submit(mMediaItem.requestImage( 4111a4bd273afe5dd11592f7625c2f19853b6f174e9Owen Lin MediaItem.TYPE_MICROTHUMBNAIL), l); 412f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 413f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 414f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin @Override 4151a4bd273afe5dd11592f7625c2f19853b6f174e9Owen Lin protected void onLoadComplete(Bitmap bitmap) { 4161a4bd273afe5dd11592f7625c2f19853b6f174e9Owen Lin mHandler.obtainMessage(MSG_UPDATE_ALBUM_ENTRY, this).sendToTarget(); 417f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 418f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 419f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin @Override 4201a4bd273afe5dd11592f7625c2f19853b6f174e9Owen Lin public void updateEntry() { 4211a4bd273afe5dd11592f7625c2f19853b6f174e9Owen Lin Bitmap bitmap = getBitmap(); 422d8fb81f601830385a2343d08ad5dd171e4c7bfe0Owen Lin if (bitmap == null) return; // error or recycled 4231a4bd273afe5dd11592f7625c2f19853b6f174e9Owen Lin 4241a4bd273afe5dd11592f7625c2f19853b6f174e9Owen Lin AlbumSetEntry entry = mData[mSlotIndex % mData.length]; 425d8fb81f601830385a2343d08ad5dd171e4c7bfe0Owen Lin BitmapTexture texture = new BitmapTexture(bitmap); 426d8fb81f601830385a2343d08ad5dd171e4c7bfe0Owen Lin entry.content = texture; 4271a4bd273afe5dd11592f7625c2f19853b6f174e9Owen Lin 4281a4bd273afe5dd11592f7625c2f19853b6f174e9Owen Lin if (isActiveSlot(mSlotIndex)) { 429d8fb81f601830385a2343d08ad5dd171e4c7bfe0Owen Lin mTextureUploader.addFgTexture(texture); 4301a4bd273afe5dd11592f7625c2f19853b6f174e9Owen Lin --mActiveRequestCount; 4311a4bd273afe5dd11592f7625c2f19853b6f174e9Owen Lin if (mActiveRequestCount == 0) requestNonactiveImages(); 4321a4bd273afe5dd11592f7625c2f19853b6f174e9Owen Lin if (mListener != null) mListener.onContentChanged(); 433d8fb81f601830385a2343d08ad5dd171e4c7bfe0Owen Lin } else { 434d8fb81f601830385a2343d08ad5dd171e4c7bfe0Owen Lin mTextureUploader.addBgTexture(texture); 4351a4bd273afe5dd11592f7625c2f19853b6f174e9Owen Lin } 436f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 437f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 438f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 439f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin private static int identifyCacheFlag(MediaSet set) { 440f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin if (set == null || (set.getSupportedOperations() 441f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin & MediaSet.SUPPORT_CACHE) == 0) { 442f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin return MediaSet.CACHE_FLAG_NO; 443f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 444f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 445f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin return set.getCacheFlag(); 446f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 447f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 448f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin private static int identifyCacheStatus(MediaSet set) { 449f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin if (set == null || (set.getSupportedOperations() 450f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin & MediaSet.SUPPORT_CACHE) == 0) { 451f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin return MediaSet.CACHE_STATUS_NOT_CACHED; 452f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 453f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 454f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin return set.getCacheStatus(); 455f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 456f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 4571a4bd273afe5dd11592f7625c2f19853b6f174e9Owen Lin private class AlbumLabelLoader extends BitmapLoader implements EntryUpdater { 4581a4bd273afe5dd11592f7625c2f19853b6f174e9Owen Lin private final MediaSet mMediaSet; 459f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin private final int mSlotIndex; 4601a4bd273afe5dd11592f7625c2f19853b6f174e9Owen Lin private final int mSourceType; 461f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 462d8fb81f601830385a2343d08ad5dd171e4c7bfe0Owen Lin public AlbumLabelLoader( 463d8fb81f601830385a2343d08ad5dd171e4c7bfe0Owen Lin int slotIndex, MediaSet mediaSet, int sourceType) { 464f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin mSlotIndex = slotIndex; 4651a4bd273afe5dd11592f7625c2f19853b6f174e9Owen Lin mMediaSet = mediaSet; 4661a4bd273afe5dd11592f7625c2f19853b6f174e9Owen Lin mSourceType = sourceType; 467f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 468f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 4691a4bd273afe5dd11592f7625c2f19853b6f174e9Owen Lin @Override 4701a4bd273afe5dd11592f7625c2f19853b6f174e9Owen Lin protected Future<Bitmap> submitBitmapTask(FutureListener<Bitmap> l) { 4711a4bd273afe5dd11592f7625c2f19853b6f174e9Owen Lin return mThreadPool.submit(mLabelMaker.requestLabel( 472d8fb81f601830385a2343d08ad5dd171e4c7bfe0Owen Lin mMediaSet, mSourceType), l); 473f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 474f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 475f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin @Override 4761a4bd273afe5dd11592f7625c2f19853b6f174e9Owen Lin protected void recycleBitmap(Bitmap bitmap) { 477d8fb81f601830385a2343d08ad5dd171e4c7bfe0Owen Lin mLabelMaker.reycleLabel(bitmap); 478f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 479f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 480f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin @Override 4811a4bd273afe5dd11592f7625c2f19853b6f174e9Owen Lin protected void onLoadComplete(Bitmap bitmap) { 4821a4bd273afe5dd11592f7625c2f19853b6f174e9Owen Lin mHandler.obtainMessage(MSG_UPDATE_ALBUM_ENTRY, this).sendToTarget(); 483f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 484f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 4851a4bd273afe5dd11592f7625c2f19853b6f174e9Owen Lin @Override 4861a4bd273afe5dd11592f7625c2f19853b6f174e9Owen Lin public void updateEntry() { 4871a4bd273afe5dd11592f7625c2f19853b6f174e9Owen Lin Bitmap bitmap = getBitmap(); 488d8fb81f601830385a2343d08ad5dd171e4c7bfe0Owen Lin if (bitmap == null) return; // Error or recycled 489f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 4901a4bd273afe5dd11592f7625c2f19853b6f174e9Owen Lin AlbumSetEntry entry = mData[mSlotIndex % mData.length]; 491d8fb81f601830385a2343d08ad5dd171e4c7bfe0Owen Lin BitmapTexture texture = new BitmapTexture(bitmap); 492d8fb81f601830385a2343d08ad5dd171e4c7bfe0Owen Lin texture.setOpaque(false); 493d8fb81f601830385a2343d08ad5dd171e4c7bfe0Owen Lin entry.label = texture; 4941a4bd273afe5dd11592f7625c2f19853b6f174e9Owen Lin 4951a4bd273afe5dd11592f7625c2f19853b6f174e9Owen Lin if (isActiveSlot(mSlotIndex)) { 496d8fb81f601830385a2343d08ad5dd171e4c7bfe0Owen Lin mTextureUploader.addFgTexture(texture); 4971a4bd273afe5dd11592f7625c2f19853b6f174e9Owen Lin --mActiveRequestCount; 4981a4bd273afe5dd11592f7625c2f19853b6f174e9Owen Lin if (mActiveRequestCount == 0) requestNonactiveImages(); 4991a4bd273afe5dd11592f7625c2f19853b6f174e9Owen Lin if (mListener != null) mListener.onContentChanged(); 500d8fb81f601830385a2343d08ad5dd171e4c7bfe0Owen Lin } else { 501d8fb81f601830385a2343d08ad5dd171e4c7bfe0Owen Lin mTextureUploader.addBgTexture(texture); 5021a4bd273afe5dd11592f7625c2f19853b6f174e9Owen Lin } 503f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 504f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 505f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 5061a4bd273afe5dd11592f7625c2f19853b6f174e9Owen Lin public void onSlotSizeChanged(int width, int height) { 5071a4bd273afe5dd11592f7625c2f19853b6f174e9Owen Lin if (mSlotWidth == width) return; 508d8fb81f601830385a2343d08ad5dd171e4c7bfe0Owen Lin 5091a4bd273afe5dd11592f7625c2f19853b6f174e9Owen Lin mSlotWidth = width; 5101a4bd273afe5dd11592f7625c2f19853b6f174e9Owen Lin mLoadingLabel = null; 511d8fb81f601830385a2343d08ad5dd171e4c7bfe0Owen Lin mLabelMaker.setLabelWidth(mSlotWidth); 512d8fb81f601830385a2343d08ad5dd171e4c7bfe0Owen Lin 513d8fb81f601830385a2343d08ad5dd171e4c7bfe0Owen Lin if (!mIsActive) return; 5141a4bd273afe5dd11592f7625c2f19853b6f174e9Owen Lin 515f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin for (int i = mContentStart, n = mContentEnd; i < n; ++i) { 5161a4bd273afe5dd11592f7625c2f19853b6f174e9Owen Lin AlbumSetEntry entry = mData[i % mData.length]; 5171a4bd273afe5dd11592f7625c2f19853b6f174e9Owen Lin if (entry.labelLoader != null) { 5181a4bd273afe5dd11592f7625c2f19853b6f174e9Owen Lin entry.labelLoader.recycle(); 5191a4bd273afe5dd11592f7625c2f19853b6f174e9Owen Lin entry.labelLoader = null; 5201a4bd273afe5dd11592f7625c2f19853b6f174e9Owen Lin entry.label = null; 5211a4bd273afe5dd11592f7625c2f19853b6f174e9Owen Lin } 5221a4bd273afe5dd11592f7625c2f19853b6f174e9Owen Lin entry.labelLoader = (entry.album == null) 5231a4bd273afe5dd11592f7625c2f19853b6f174e9Owen Lin ? null 524d8fb81f601830385a2343d08ad5dd171e4c7bfe0Owen Lin : new AlbumLabelLoader(i, entry.album, entry.sourceType); 525f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 526f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin updateAllImageRequests(); 527d8fb81f601830385a2343d08ad5dd171e4c7bfe0Owen Lin updateTextureUploadQueue(); 528f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 529f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin} 530