• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (C) 2010 The Android Open Source Project
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  *      http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16 
17 package com.android.gallery3d.ui;
18 
19 import android.content.Context;
20 
21 import com.android.gallery3d.app.AlbumSetDataLoader;
22 import com.android.gallery3d.app.GalleryActivity;
23 import com.android.gallery3d.data.MediaObject;
24 import com.android.gallery3d.data.Path;
25 import com.android.gallery3d.ui.AlbumSetSlidingWindow.AlbumSetEntry;
26 
27 public class AlbumSetSlotRenderer extends AbstractSlotRenderer {
28     @SuppressWarnings("unused")
29     private static final String TAG = "AlbumSetView";
30     private static final int CACHE_SIZE = 96;
31     private static final int PLACEHOLDER_COLOR = 0xFF222222;
32 
33     private final ColorTexture mWaitLoadingTexture;
34     private final GalleryActivity mActivity;
35     private final SelectionManager mSelectionManager;
36     protected final LabelSpec mLabelSpec;
37 
38     protected AlbumSetSlidingWindow mDataWindow;
39     private SlotView mSlotView;
40 
41     private int mPressedIndex = -1;
42     private boolean mAnimatePressedUp;
43     private Path mHighlightItemPath = null;
44     private boolean mInSelectionMode;
45 
46     public static class LabelSpec {
47         public int labelBackgroundHeight;
48         public int titleOffset;
49         public int countOffset;
50         public int titleFontSize;
51         public int countFontSize;
52         public int leftMargin;
53         public int iconSize;
54     }
55 
AlbumSetSlotRenderer(GalleryActivity activity, SelectionManager selectionManager, SlotView slotView, LabelSpec labelSpec)56     public AlbumSetSlotRenderer(GalleryActivity activity, SelectionManager selectionManager,
57             SlotView slotView, LabelSpec labelSpec) {
58         super ((Context) activity);
59         mActivity = activity;
60         mSelectionManager = selectionManager;
61         mSlotView = slotView;
62         mLabelSpec = labelSpec;
63 
64         mWaitLoadingTexture = new ColorTexture(PLACEHOLDER_COLOR);
65         mWaitLoadingTexture.setSize(1, 1);
66 
67         Context context = activity.getAndroidContext();
68     }
69 
setPressedIndex(int index)70     public void setPressedIndex(int index) {
71         if (mPressedIndex == index) return;
72         mPressedIndex = index;
73         mSlotView.invalidate();
74     }
75 
setPressedUp()76     public void setPressedUp() {
77         if (mPressedIndex == -1) return;
78         mAnimatePressedUp = true;
79         mSlotView.invalidate();
80     }
81 
setHighlightItemPath(Path path)82     public void setHighlightItemPath(Path path) {
83         if (mHighlightItemPath == path) return;
84         mHighlightItemPath = path;
85         mSlotView.invalidate();
86     }
87 
setModel(AlbumSetDataLoader model)88     public void setModel(AlbumSetDataLoader model) {
89         if (mDataWindow != null) {
90             mDataWindow.setListener(null);
91             mDataWindow = null;
92             mSlotView.setSlotCount(0);
93         }
94         if (model != null) {
95             mDataWindow = new AlbumSetSlidingWindow(
96                     mActivity, model, mLabelSpec, CACHE_SIZE);
97             mDataWindow.setListener(new MyCacheListener());
98             mSlotView.setSlotCount(mDataWindow.size());
99         }
100     }
101 
checkTexture(Texture texture)102     private static Texture checkTexture(Texture texture) {
103         return ((texture instanceof UploadedTexture)
104                 && ((UploadedTexture) texture).isUploading())
105                 ? null
106                 : texture;
107     }
108 
109     @Override
renderSlot(GLCanvas canvas, int index, int pass, int width, int height)110     public int renderSlot(GLCanvas canvas, int index, int pass, int width, int height) {
111         AlbumSetEntry entry = mDataWindow.get(index);
112         int renderRequestFlags = 0;
113         renderRequestFlags |= renderContent(canvas, entry, width, height);
114         renderRequestFlags |= renderLabel(canvas, entry, width, height);
115         renderRequestFlags |= renderOverlay(canvas, index, entry, width, height);
116         return renderRequestFlags;
117     }
118 
renderOverlay( GLCanvas canvas, int index, AlbumSetEntry entry, int width, int height)119     protected int renderOverlay(
120             GLCanvas canvas, int index, AlbumSetEntry entry, int width, int height) {
121         int renderRequestFlags = 0;
122         if (mPressedIndex == index) {
123             if (mAnimatePressedUp) {
124                 drawPressedUpFrame(canvas, width, height);
125                 renderRequestFlags |= SlotView.RENDER_MORE_FRAME;
126                 if (isPressedUpFrameFinished()) {
127                     mAnimatePressedUp = false;
128                     mPressedIndex = -1;
129                 }
130             } else {
131                 drawPressedFrame(canvas, width, height);
132             }
133         } else if ((mHighlightItemPath != null) && (mHighlightItemPath == entry.setPath)) {
134             drawSelectedFrame(canvas, width, height);
135         } else if (mInSelectionMode && mSelectionManager.isItemSelected(entry.setPath)) {
136             drawSelectedFrame(canvas, width, height);
137         }
138         return renderRequestFlags;
139     }
140 
renderContent( GLCanvas canvas, AlbumSetEntry entry, int width, int height)141     protected int renderContent(
142             GLCanvas canvas, AlbumSetEntry entry, int width, int height) {
143         int renderRequestFlags = 0;
144 
145         Texture content = checkTexture(entry.content);
146         if (content == null) {
147             content = mWaitLoadingTexture;
148             entry.isWaitLoadingDisplayed = true;
149         } else if (entry.isWaitLoadingDisplayed) {
150             entry.isWaitLoadingDisplayed = false;
151             content = new FadeInTexture(PLACEHOLDER_COLOR, entry.bitmapTexture);
152             entry.content = content;
153         }
154         drawContent(canvas, content, width, height, entry.rotation);
155         if ((content instanceof FadeInTexture) &&
156                 ((FadeInTexture) content).isAnimating()) {
157             renderRequestFlags |= SlotView.RENDER_MORE_FRAME;
158         }
159 
160         if (entry.mediaType == MediaObject.MEDIA_TYPE_VIDEO) {
161             drawVideoOverlay(canvas, width, height);
162         }
163 
164         if (entry.isPanorama) {
165             drawPanoramaBorder(canvas, width, height);
166         }
167 
168         return renderRequestFlags;
169     }
170 
renderLabel( GLCanvas canvas, AlbumSetEntry entry, int width, int height)171     protected int renderLabel(
172             GLCanvas canvas, AlbumSetEntry entry, int width, int height) {
173         Texture content = checkTexture(entry.labelTexture);
174         if (content != null) {
175             int b = AlbumLabelMaker.getBorderSize();
176             int h = content.getHeight();
177             content.draw(canvas, -b, height - h + b, width + b + b, h);
178         }
179         return 0;
180     }
181 
182     @Override
prepareDrawing()183     public void prepareDrawing() {
184         mInSelectionMode = mSelectionManager.inSelectionMode();
185     }
186 
187     private class MyCacheListener implements AlbumSetSlidingWindow.Listener {
188 
189         @Override
onSizeChanged(int size)190         public void onSizeChanged(int size) {
191             mSlotView.setSlotCount(size);
192         }
193 
194         @Override
onContentChanged()195         public void onContentChanged() {
196             mSlotView.invalidate();
197         }
198     }
199 
pause()200     public void pause() {
201         mDataWindow.pause();
202     }
203 
resume()204     public void resume() {
205         mDataWindow.resume();
206     }
207 
208     @Override
onVisibleRangeChanged(int visibleStart, int visibleEnd)209     public void onVisibleRangeChanged(int visibleStart, int visibleEnd) {
210         if (mDataWindow != null) {
211             mDataWindow.setActiveWindow(visibleStart, visibleEnd);
212         }
213     }
214 
215     @Override
onSlotSizeChanged(int width, int height)216     public void onSlotSizeChanged(int width, int height) {
217         if (mDataWindow != null) {
218             mDataWindow.onSlotSizeChanged(width, height);
219         }
220     }
221 }
222