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 1931cac30e46a293f6d0901e22c6ab0d083cae7021Owen Linimport android.content.Context; 201a4bd273afe5dd11592f7625c2f19853b6f174e9Owen Lin 21c3d8ac3b9504346dafc49e006b5f732dd1db21e8Owen Linimport com.android.gallery3d.app.AlbumDataLoader; 22f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Linimport com.android.gallery3d.app.GalleryActivity; 2331cac30e46a293f6d0901e22c6ab0d083cae7021Owen Linimport com.android.gallery3d.data.MediaObject; 2431cac30e46a293f6d0901e22c6ab0d083cae7021Owen Linimport com.android.gallery3d.data.Path; 25f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 26c3d8ac3b9504346dafc49e006b5f732dd1db21e8Owen Linpublic class AlbumSlotRenderer extends AbstractSlotRenderer { 27f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin @SuppressWarnings("unused") 28f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin private static final String TAG = "AlbumView"; 29616a70fdb4473d2fbd7b70772a3a82b908aeae1eOwen Lin 30616a70fdb4473d2fbd7b70772a3a82b908aeae1eOwen Lin public interface SlotFilter { 31616a70fdb4473d2fbd7b70772a3a82b908aeae1eOwen Lin public boolean acceptSlot(int index); 32616a70fdb4473d2fbd7b70772a3a82b908aeae1eOwen Lin } 33616a70fdb4473d2fbd7b70772a3a82b908aeae1eOwen Lin 34616a70fdb4473d2fbd7b70772a3a82b908aeae1eOwen Lin private static final int PLACEHOLDER_COLOR = 0xFF222222; 35cd36bfc52cc4e7f4b667ba3c5e8eb950647ae9d1Owen Lin private static final int CACHE_SIZE = 96; 36f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 37f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin private AlbumSlidingWindow mDataWindow; 38f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin private final GalleryActivity mActivity; 391a4bd273afe5dd11592f7625c2f19853b6f174e9Owen Lin private final ColorTexture mWaitLoadingTexture; 407260f6f74d465520e4497b23fe56f98abb0c15a2Owen Lin private final SlotView mSlotView; 4131cac30e46a293f6d0901e22c6ab0d083cae7021Owen Lin private final SelectionManager mSelectionManager; 42f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 4331cac30e46a293f6d0901e22c6ab0d083cae7021Owen Lin private int mPressedIndex = -1; 4490fe70f11b0961e1e5ae353cdf563236a55f502dYuli Huang private boolean mAnimatePressedUp; 4531cac30e46a293f6d0901e22c6ab0d083cae7021Owen Lin private Path mHighlightItemPath = null; 4631cac30e46a293f6d0901e22c6ab0d083cae7021Owen Lin private boolean mInSelectionMode; 471a4bd273afe5dd11592f7625c2f19853b6f174e9Owen Lin 48616a70fdb4473d2fbd7b70772a3a82b908aeae1eOwen Lin private SlotFilter mSlotFilter; 49616a70fdb4473d2fbd7b70772a3a82b908aeae1eOwen Lin 50c3d8ac3b9504346dafc49e006b5f732dd1db21e8Owen Lin public AlbumSlotRenderer(GalleryActivity activity, SlotView slotView, 5131cac30e46a293f6d0901e22c6ab0d083cae7021Owen Lin SelectionManager selectionManager) { 5231cac30e46a293f6d0901e22c6ab0d083cae7021Owen Lin super((Context) activity); 53f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin mActivity = activity; 5431cac30e46a293f6d0901e22c6ab0d083cae7021Owen Lin mSlotView = slotView; 5531cac30e46a293f6d0901e22c6ab0d083cae7021Owen Lin mSelectionManager = selectionManager; 561a4bd273afe5dd11592f7625c2f19853b6f174e9Owen Lin 571a4bd273afe5dd11592f7625c2f19853b6f174e9Owen Lin mWaitLoadingTexture = new ColorTexture(PLACEHOLDER_COLOR); 581a4bd273afe5dd11592f7625c2f19853b6f174e9Owen Lin mWaitLoadingTexture.setSize(1, 1); 59f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 60f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 6131cac30e46a293f6d0901e22c6ab0d083cae7021Owen Lin public void setPressedIndex(int index) { 6231cac30e46a293f6d0901e22c6ab0d083cae7021Owen Lin if (mPressedIndex == index) return; 6331cac30e46a293f6d0901e22c6ab0d083cae7021Owen Lin mPressedIndex = index; 6431cac30e46a293f6d0901e22c6ab0d083cae7021Owen Lin mSlotView.invalidate(); 6531cac30e46a293f6d0901e22c6ab0d083cae7021Owen Lin } 6631cac30e46a293f6d0901e22c6ab0d083cae7021Owen Lin 6790fe70f11b0961e1e5ae353cdf563236a55f502dYuli Huang public void setPressedUp() { 6890fe70f11b0961e1e5ae353cdf563236a55f502dYuli Huang if (mPressedIndex == -1) return; 6990fe70f11b0961e1e5ae353cdf563236a55f502dYuli Huang mAnimatePressedUp = true; 7090fe70f11b0961e1e5ae353cdf563236a55f502dYuli Huang mSlotView.invalidate(); 7190fe70f11b0961e1e5ae353cdf563236a55f502dYuli Huang } 7290fe70f11b0961e1e5ae353cdf563236a55f502dYuli Huang 7331cac30e46a293f6d0901e22c6ab0d083cae7021Owen Lin public void setHighlightItemPath(Path path) { 7431cac30e46a293f6d0901e22c6ab0d083cae7021Owen Lin if (mHighlightItemPath == path) return; 7531cac30e46a293f6d0901e22c6ab0d083cae7021Owen Lin mHighlightItemPath = path; 7631cac30e46a293f6d0901e22c6ab0d083cae7021Owen Lin mSlotView.invalidate(); 77f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 78f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 79c3d8ac3b9504346dafc49e006b5f732dd1db21e8Owen Lin public void setModel(AlbumDataLoader model) { 80f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin if (mDataWindow != null) { 81f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin mDataWindow.setListener(null); 827260f6f74d465520e4497b23fe56f98abb0c15a2Owen Lin mSlotView.setSlotCount(0); 83f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin mDataWindow = null; 84f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 85f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin if (model != null) { 861a4bd273afe5dd11592f7625c2f19853b6f174e9Owen Lin mDataWindow = new AlbumSlidingWindow(mActivity, model, CACHE_SIZE); 87f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin mDataWindow.setListener(new MyDataModelListener()); 887260f6f74d465520e4497b23fe56f98abb0c15a2Owen Lin mSlotView.setSlotCount(model.size()); 89f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 90f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 91f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 9237c605949219b8bf54c165c34d6405f5f2989f50Owen Lin private static Texture checkTexture(Texture texture) { 9337c605949219b8bf54c165c34d6405f5f2989f50Owen Lin return (texture instanceof UploadedTexture) 9437c605949219b8bf54c165c34d6405f5f2989f50Owen Lin && ((UploadedTexture) texture).isUploading() 95d8fb81f601830385a2343d08ad5dd171e4c7bfe0Owen Lin ? null 96d8fb81f601830385a2343d08ad5dd171e4c7bfe0Owen Lin : texture; 97d8fb81f601830385a2343d08ad5dd171e4c7bfe0Owen Lin } 98d8fb81f601830385a2343d08ad5dd171e4c7bfe0Owen Lin 99f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin @Override 1007260f6f74d465520e4497b23fe56f98abb0c15a2Owen Lin public int renderSlot(GLCanvas canvas, int index, int pass, int width, int height) { 101616a70fdb4473d2fbd7b70772a3a82b908aeae1eOwen Lin if (mSlotFilter != null && !mSlotFilter.acceptSlot(index)) return 0; 102616a70fdb4473d2fbd7b70772a3a82b908aeae1eOwen Lin 1031a4bd273afe5dd11592f7625c2f19853b6f174e9Owen Lin AlbumSlidingWindow.AlbumEntry entry = mDataWindow.get(index); 1041a4bd273afe5dd11592f7625c2f19853b6f174e9Owen Lin 10531cac30e46a293f6d0901e22c6ab0d083cae7021Owen Lin int renderRequestFlags = 0; 10631cac30e46a293f6d0901e22c6ab0d083cae7021Owen Lin 10737c605949219b8bf54c165c34d6405f5f2989f50Owen Lin Texture content = checkTexture(entry.content); 1081a4bd273afe5dd11592f7625c2f19853b6f174e9Owen Lin if (content == null) { 1091a4bd273afe5dd11592f7625c2f19853b6f174e9Owen Lin content = mWaitLoadingTexture; 1101a4bd273afe5dd11592f7625c2f19853b6f174e9Owen Lin entry.isWaitDisplayed = true; 1111a4bd273afe5dd11592f7625c2f19853b6f174e9Owen Lin } else if (entry.isWaitDisplayed) { 1121a4bd273afe5dd11592f7625c2f19853b6f174e9Owen Lin entry.isWaitDisplayed = false; 1133535d67239b1b1e4ee038f39dece64545b78f2edOwen Lin content = new FadeInTexture(PLACEHOLDER_COLOR, entry.bitmapTexture); 1143535d67239b1b1e4ee038f39dece64545b78f2edOwen Lin entry.content = content; 1151a4bd273afe5dd11592f7625c2f19853b6f174e9Owen Lin } 11631cac30e46a293f6d0901e22c6ab0d083cae7021Owen Lin drawContent(canvas, content, width, height, entry.rotation); 11731cac30e46a293f6d0901e22c6ab0d083cae7021Owen Lin if ((content instanceof FadeInTexture) && 11831cac30e46a293f6d0901e22c6ab0d083cae7021Owen Lin ((FadeInTexture) content).isAnimating()) { 11931cac30e46a293f6d0901e22c6ab0d083cae7021Owen Lin renderRequestFlags |= SlotView.RENDER_MORE_FRAME; 12031cac30e46a293f6d0901e22c6ab0d083cae7021Owen Lin } 1211a4bd273afe5dd11592f7625c2f19853b6f174e9Owen Lin 12231cac30e46a293f6d0901e22c6ab0d083cae7021Owen Lin if (entry.mediaType == MediaObject.MEDIA_TYPE_VIDEO) { 12331cac30e46a293f6d0901e22c6ab0d083cae7021Owen Lin drawVideoOverlay(canvas, width, height); 1247260f6f74d465520e4497b23fe56f98abb0c15a2Owen Lin } 12531cac30e46a293f6d0901e22c6ab0d083cae7021Owen Lin 12631cac30e46a293f6d0901e22c6ab0d083cae7021Owen Lin if (entry.isPanorama) { 12731cac30e46a293f6d0901e22c6ab0d083cae7021Owen Lin drawPanoramaBorder(canvas, width, height); 12831cac30e46a293f6d0901e22c6ab0d083cae7021Owen Lin } 12931cac30e46a293f6d0901e22c6ab0d083cae7021Owen Lin 13090fe70f11b0961e1e5ae353cdf563236a55f502dYuli Huang renderRequestFlags |= renderOverlay(canvas, index, entry, width, height); 13190fe70f11b0961e1e5ae353cdf563236a55f502dYuli Huang 13290fe70f11b0961e1e5ae353cdf563236a55f502dYuli Huang return renderRequestFlags; 13390fe70f11b0961e1e5ae353cdf563236a55f502dYuli Huang } 13490fe70f11b0961e1e5ae353cdf563236a55f502dYuli Huang 13590fe70f11b0961e1e5ae353cdf563236a55f502dYuli Huang private int renderOverlay(GLCanvas canvas, int index, 13690fe70f11b0961e1e5ae353cdf563236a55f502dYuli Huang AlbumSlidingWindow.AlbumEntry entry, int width, int height) { 13790fe70f11b0961e1e5ae353cdf563236a55f502dYuli Huang int renderRequestFlags = 0; 13831cac30e46a293f6d0901e22c6ab0d083cae7021Owen Lin if (mPressedIndex == index) { 13990fe70f11b0961e1e5ae353cdf563236a55f502dYuli Huang if (mAnimatePressedUp) { 14090fe70f11b0961e1e5ae353cdf563236a55f502dYuli Huang drawPressedUpFrame(canvas, width, height); 14190fe70f11b0961e1e5ae353cdf563236a55f502dYuli Huang renderRequestFlags |= SlotView.RENDER_MORE_FRAME; 14290fe70f11b0961e1e5ae353cdf563236a55f502dYuli Huang if (isPressedUpFrameFinished()) { 14390fe70f11b0961e1e5ae353cdf563236a55f502dYuli Huang mAnimatePressedUp = false; 14490fe70f11b0961e1e5ae353cdf563236a55f502dYuli Huang mPressedIndex = -1; 14590fe70f11b0961e1e5ae353cdf563236a55f502dYuli Huang } 14690fe70f11b0961e1e5ae353cdf563236a55f502dYuli Huang } else { 14790fe70f11b0961e1e5ae353cdf563236a55f502dYuli Huang drawPressedFrame(canvas, width, height); 14890fe70f11b0961e1e5ae353cdf563236a55f502dYuli Huang } 14931cac30e46a293f6d0901e22c6ab0d083cae7021Owen Lin } else if ((entry.path != null) && (mHighlightItemPath == entry.path)) { 15031cac30e46a293f6d0901e22c6ab0d083cae7021Owen Lin drawSelectedFrame(canvas, width, height); 15131cac30e46a293f6d0901e22c6ab0d083cae7021Owen Lin } else if (mInSelectionMode && mSelectionManager.isItemSelected(entry.path)) { 15231cac30e46a293f6d0901e22c6ab0d083cae7021Owen Lin drawSelectedFrame(canvas, width, height); 15331cac30e46a293f6d0901e22c6ab0d083cae7021Owen Lin } 15431cac30e46a293f6d0901e22c6ab0d083cae7021Owen Lin return renderRequestFlags; 155f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 156f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 157f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin private class MyDataModelListener implements AlbumSlidingWindow.Listener { 1587260f6f74d465520e4497b23fe56f98abb0c15a2Owen Lin @Override 1597260f6f74d465520e4497b23fe56f98abb0c15a2Owen Lin public void onContentChanged() { 1607260f6f74d465520e4497b23fe56f98abb0c15a2Owen Lin mSlotView.invalidate(); 161f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 162f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 1637260f6f74d465520e4497b23fe56f98abb0c15a2Owen Lin @Override 164f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin public void onSizeChanged(int size) { 1657260f6f74d465520e4497b23fe56f98abb0c15a2Owen Lin mSlotView.setSlotCount(size); 166f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 167f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 168f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 169f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin public void resume() { 170f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin mDataWindow.resume(); 171f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 172f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 173f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin public void pause() { 174f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin mDataWindow.pause(); 175f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 1767260f6f74d465520e4497b23fe56f98abb0c15a2Owen Lin 1777260f6f74d465520e4497b23fe56f98abb0c15a2Owen Lin @Override 1787260f6f74d465520e4497b23fe56f98abb0c15a2Owen Lin public void prepareDrawing() { 17931cac30e46a293f6d0901e22c6ab0d083cae7021Owen Lin mInSelectionMode = mSelectionManager.inSelectionMode(); 1807260f6f74d465520e4497b23fe56f98abb0c15a2Owen Lin } 1817260f6f74d465520e4497b23fe56f98abb0c15a2Owen Lin 1827260f6f74d465520e4497b23fe56f98abb0c15a2Owen Lin @Override 1837260f6f74d465520e4497b23fe56f98abb0c15a2Owen Lin public void onVisibleRangeChanged(int visibleStart, int visibleEnd) { 1847260f6f74d465520e4497b23fe56f98abb0c15a2Owen Lin if (mDataWindow != null) { 1857260f6f74d465520e4497b23fe56f98abb0c15a2Owen Lin mDataWindow.setActiveWindow(visibleStart, visibleEnd); 1867260f6f74d465520e4497b23fe56f98abb0c15a2Owen Lin } 1877260f6f74d465520e4497b23fe56f98abb0c15a2Owen Lin } 1881a4bd273afe5dd11592f7625c2f19853b6f174e9Owen Lin 1891a4bd273afe5dd11592f7625c2f19853b6f174e9Owen Lin @Override 1901a4bd273afe5dd11592f7625c2f19853b6f174e9Owen Lin public void onSlotSizeChanged(int width, int height) { 1911a4bd273afe5dd11592f7625c2f19853b6f174e9Owen Lin // Do nothing 1921a4bd273afe5dd11592f7625c2f19853b6f174e9Owen Lin } 193616a70fdb4473d2fbd7b70772a3a82b908aeae1eOwen Lin 194616a70fdb4473d2fbd7b70772a3a82b908aeae1eOwen Lin public void setSlotFilter(SlotFilter slotFilter) { 195616a70fdb4473d2fbd7b70772a3a82b908aeae1eOwen Lin mSlotFilter = slotFilter; 196616a70fdb4473d2fbd7b70772a3a82b908aeae1eOwen Lin } 197f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin} 198