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
1943ba9f6644e4183b8ee27f96de3dda703d136c52Bobby Georgescuimport com.android.gallery3d.R;
20b21b8e58a604f6c701245d84b141b5b87663192bOwen Linimport com.android.gallery3d.app.AbstractGalleryActivity;
21c3d8ac3b9504346dafc49e006b5f732dd1db21e8Owen Linimport com.android.gallery3d.app.AlbumSetDataLoader;
2231cac30e46a293f6d0901e22c6ab0d083cae7021Owen Linimport com.android.gallery3d.data.MediaObject;
2331cac30e46a293f6d0901e22c6ab0d083cae7021Owen Linimport com.android.gallery3d.data.Path;
24a4eae1abb4f2547dfbda84301ee764ce35464881John Reckimport com.android.gallery3d.glrenderer.ColorTexture;
25a4eae1abb4f2547dfbda84301ee764ce35464881John Reckimport com.android.gallery3d.glrenderer.FadeInTexture;
26a4eae1abb4f2547dfbda84301ee764ce35464881John Reckimport com.android.gallery3d.glrenderer.GLCanvas;
27a4eae1abb4f2547dfbda84301ee764ce35464881John Reckimport com.android.gallery3d.glrenderer.ResourceTexture;
28a4eae1abb4f2547dfbda84301ee764ce35464881John Reckimport com.android.gallery3d.glrenderer.Texture;
29a4eae1abb4f2547dfbda84301ee764ce35464881John Reckimport com.android.gallery3d.glrenderer.TiledTexture;
30a4eae1abb4f2547dfbda84301ee764ce35464881John Reckimport com.android.gallery3d.glrenderer.UploadedTexture;
311a4bd273afe5dd11592f7625c2f19853b6f174e9Owen Linimport com.android.gallery3d.ui.AlbumSetSlidingWindow.AlbumSetEntry;
32f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
33c3d8ac3b9504346dafc49e006b5f732dd1db21e8Owen Linpublic class AlbumSetSlotRenderer extends AbstractSlotRenderer {
34f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    @SuppressWarnings("unused")
35f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    private static final String TAG = "AlbumSetView";
36cd36bfc52cc4e7f4b667ba3c5e8eb950647ae9d1Owen Lin    private static final int CACHE_SIZE = 96;
37915c2c5b2c367df71599370613af0924bd7c4887Bobby Georgescu    private final int mPlaceholderColor;
38f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
391a4bd273afe5dd11592f7625c2f19853b6f174e9Owen Lin    private final ColorTexture mWaitLoadingTexture;
4043ba9f6644e4183b8ee27f96de3dda703d136c52Bobby Georgescu    private final ResourceTexture mCameraOverlay;
41b21b8e58a604f6c701245d84b141b5b87663192bOwen Lin    private final AbstractGalleryActivity mActivity;
4231cac30e46a293f6d0901e22c6ab0d083cae7021Owen Lin    private final SelectionManager mSelectionManager;
4331cac30e46a293f6d0901e22c6ab0d083cae7021Owen Lin    protected final LabelSpec mLabelSpec;
44f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
4531cac30e46a293f6d0901e22c6ab0d083cae7021Owen Lin    protected AlbumSetSlidingWindow mDataWindow;
467260f6f74d465520e4497b23fe56f98abb0c15a2Owen Lin    private SlotView mSlotView;
47f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
4831cac30e46a293f6d0901e22c6ab0d083cae7021Owen Lin    private int mPressedIndex = -1;
4990fe70f11b0961e1e5ae353cdf563236a55f502dYuli Huang    private boolean mAnimatePressedUp;
5031cac30e46a293f6d0901e22c6ab0d083cae7021Owen Lin    private Path mHighlightItemPath = null;
5131cac30e46a293f6d0901e22c6ab0d083cae7021Owen Lin    private boolean mInSelectionMode;
5231cac30e46a293f6d0901e22c6ab0d083cae7021Owen Lin
539201679ed1c485767f2e334aa618bd733024af03Chih-Chung Chang    public static class LabelSpec {
54bc2154199aee16762e3758ad0cfed685323d9a9fChih-Chung Chang        public int labelBackgroundHeight;
559201679ed1c485767f2e334aa618bd733024af03Chih-Chung Chang        public int titleOffset;
56bc2154199aee16762e3758ad0cfed685323d9a9fChih-Chung Chang        public int countOffset;
579201679ed1c485767f2e334aa618bd733024af03Chih-Chung Chang        public int titleFontSize;
58bc2154199aee16762e3758ad0cfed685323d9a9fChih-Chung Chang        public int countFontSize;
599201679ed1c485767f2e334aa618bd733024af03Chih-Chung Chang        public int leftMargin;
609201679ed1c485767f2e334aa618bd733024af03Chih-Chung Chang        public int iconSize;
61e24cc7208a6d3760a87dfd4b80a7a6683fe146ebBobby Georgescu        public int titleRightMargin;
62915c2c5b2c367df71599370613af0924bd7c4887Bobby Georgescu        public int backgroundColor;
63915c2c5b2c367df71599370613af0924bd7c4887Bobby Georgescu        public int titleColor;
64915c2c5b2c367df71599370613af0924bd7c4887Bobby Georgescu        public int countColor;
65915c2c5b2c367df71599370613af0924bd7c4887Bobby Georgescu        public int borderSize;
669201679ed1c485767f2e334aa618bd733024af03Chih-Chung Chang    }
679201679ed1c485767f2e334aa618bd733024af03Chih-Chung Chang
68b21b8e58a604f6c701245d84b141b5b87663192bOwen Lin    public AlbumSetSlotRenderer(AbstractGalleryActivity activity,
69b21b8e58a604f6c701245d84b141b5b87663192bOwen Lin            SelectionManager selectionManager,
70915c2c5b2c367df71599370613af0924bd7c4887Bobby Georgescu            SlotView slotView, LabelSpec labelSpec, int placeholderColor) {
71b21b8e58a604f6c701245d84b141b5b87663192bOwen Lin        super (activity);
72f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        mActivity = activity;
7331cac30e46a293f6d0901e22c6ab0d083cae7021Owen Lin        mSelectionManager = selectionManager;
747260f6f74d465520e4497b23fe56f98abb0c15a2Owen Lin        mSlotView = slotView;
7531cac30e46a293f6d0901e22c6ab0d083cae7021Owen Lin        mLabelSpec = labelSpec;
76915c2c5b2c367df71599370613af0924bd7c4887Bobby Georgescu        mPlaceholderColor = placeholderColor;
771a4bd273afe5dd11592f7625c2f19853b6f174e9Owen Lin
78915c2c5b2c367df71599370613af0924bd7c4887Bobby Georgescu        mWaitLoadingTexture = new ColorTexture(mPlaceholderColor);
791a4bd273afe5dd11592f7625c2f19853b6f174e9Owen Lin        mWaitLoadingTexture.setSize(1, 1);
8043ba9f6644e4183b8ee27f96de3dda703d136c52Bobby Georgescu        mCameraOverlay = new ResourceTexture(activity,
811f7c5d1e683b369225ec812ed0c45c7fa3d42b96Bobby Georgescu                R.drawable.ic_cameraalbum_overlay);
8231cac30e46a293f6d0901e22c6ab0d083cae7021Owen Lin    }
831a4bd273afe5dd11592f7625c2f19853b6f174e9Owen Lin
8431cac30e46a293f6d0901e22c6ab0d083cae7021Owen Lin    public void setPressedIndex(int index) {
8531cac30e46a293f6d0901e22c6ab0d083cae7021Owen Lin        if (mPressedIndex == index) return;
8631cac30e46a293f6d0901e22c6ab0d083cae7021Owen Lin        mPressedIndex = index;
8731cac30e46a293f6d0901e22c6ab0d083cae7021Owen Lin        mSlotView.invalidate();
88f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    }
89f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
9090fe70f11b0961e1e5ae353cdf563236a55f502dYuli Huang    public void setPressedUp() {
9190fe70f11b0961e1e5ae353cdf563236a55f502dYuli Huang        if (mPressedIndex == -1) return;
9290fe70f11b0961e1e5ae353cdf563236a55f502dYuli Huang        mAnimatePressedUp = true;
9390fe70f11b0961e1e5ae353cdf563236a55f502dYuli Huang        mSlotView.invalidate();
9490fe70f11b0961e1e5ae353cdf563236a55f502dYuli Huang    }
9590fe70f11b0961e1e5ae353cdf563236a55f502dYuli Huang
9631cac30e46a293f6d0901e22c6ab0d083cae7021Owen Lin    public void setHighlightItemPath(Path path) {
9731cac30e46a293f6d0901e22c6ab0d083cae7021Owen Lin        if (mHighlightItemPath == path) return;
9831cac30e46a293f6d0901e22c6ab0d083cae7021Owen Lin        mHighlightItemPath = path;
991a4bd273afe5dd11592f7625c2f19853b6f174e9Owen Lin        mSlotView.invalidate();
100f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    }
101f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
102c3d8ac3b9504346dafc49e006b5f732dd1db21e8Owen Lin    public void setModel(AlbumSetDataLoader model) {
103f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        if (mDataWindow != null) {
104f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            mDataWindow.setListener(null);
105f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            mDataWindow = null;
1067260f6f74d465520e4497b23fe56f98abb0c15a2Owen Lin            mSlotView.setSlotCount(0);
107f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        }
108f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        if (model != null) {
10931cac30e46a293f6d0901e22c6ab0d083cae7021Owen Lin            mDataWindow = new AlbumSetSlidingWindow(
11031cac30e46a293f6d0901e22c6ab0d083cae7021Owen Lin                    mActivity, model, mLabelSpec, CACHE_SIZE);
111f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            mDataWindow.setListener(new MyCacheListener());
1127260f6f74d465520e4497b23fe56f98abb0c15a2Owen Lin            mSlotView.setSlotCount(mDataWindow.size());
113f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        }
114f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    }
115f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
116adee31f028d839e7baa8f9e052dc4e4d60b137daOwen Lin    private static Texture checkLabelTexture(Texture texture) {
11737c605949219b8bf54c165c34d6405f5f2989f50Owen Lin        return ((texture instanceof UploadedTexture)
11837c605949219b8bf54c165c34d6405f5f2989f50Owen Lin                && ((UploadedTexture) texture).isUploading())
119d8fb81f601830385a2343d08ad5dd171e4c7bfe0Owen Lin                ? null
120d8fb81f601830385a2343d08ad5dd171e4c7bfe0Owen Lin                : texture;
121d8fb81f601830385a2343d08ad5dd171e4c7bfe0Owen Lin    }
122d8fb81f601830385a2343d08ad5dd171e4c7bfe0Owen Lin
123adee31f028d839e7baa8f9e052dc4e4d60b137daOwen Lin    private static Texture checkContentTexture(Texture texture) {
124adee31f028d839e7baa8f9e052dc4e4d60b137daOwen Lin        return ((texture instanceof TiledTexture)
125adee31f028d839e7baa8f9e052dc4e4d60b137daOwen Lin                && !((TiledTexture) texture).isReady())
126adee31f028d839e7baa8f9e052dc4e4d60b137daOwen Lin                ? null
127adee31f028d839e7baa8f9e052dc4e4d60b137daOwen Lin                : texture;
128adee31f028d839e7baa8f9e052dc4e4d60b137daOwen Lin    }
129adee31f028d839e7baa8f9e052dc4e4d60b137daOwen Lin
1307260f6f74d465520e4497b23fe56f98abb0c15a2Owen Lin    @Override
1317260f6f74d465520e4497b23fe56f98abb0c15a2Owen Lin    public int renderSlot(GLCanvas canvas, int index, int pass, int width, int height) {
1321a4bd273afe5dd11592f7625c2f19853b6f174e9Owen Lin        AlbumSetEntry entry = mDataWindow.get(index);
13331cac30e46a293f6d0901e22c6ab0d083cae7021Owen Lin        int renderRequestFlags = 0;
13431cac30e46a293f6d0901e22c6ab0d083cae7021Owen Lin        renderRequestFlags |= renderContent(canvas, entry, width, height);
13531cac30e46a293f6d0901e22c6ab0d083cae7021Owen Lin        renderRequestFlags |= renderLabel(canvas, entry, width, height);
13631cac30e46a293f6d0901e22c6ab0d083cae7021Owen Lin        renderRequestFlags |= renderOverlay(canvas, index, entry, width, height);
13731cac30e46a293f6d0901e22c6ab0d083cae7021Owen Lin        return renderRequestFlags;
13831cac30e46a293f6d0901e22c6ab0d083cae7021Owen Lin    }
13931cac30e46a293f6d0901e22c6ab0d083cae7021Owen Lin
14031cac30e46a293f6d0901e22c6ab0d083cae7021Owen Lin    protected int renderOverlay(
14131cac30e46a293f6d0901e22c6ab0d083cae7021Owen Lin            GLCanvas canvas, int index, AlbumSetEntry entry, int width, int height) {
14290fe70f11b0961e1e5ae353cdf563236a55f502dYuli Huang        int renderRequestFlags = 0;
14343ba9f6644e4183b8ee27f96de3dda703d136c52Bobby Georgescu        if (entry.album != null && entry.album.isCameraRoll()) {
1448a8b9cfdd15bf36ccd068563451d98a011a5eeabBobby Georgescu            int uncoveredHeight = height - mLabelSpec.labelBackgroundHeight;
1458a8b9cfdd15bf36ccd068563451d98a011a5eeabBobby Georgescu            int dim = uncoveredHeight / 2;
1468a8b9cfdd15bf36ccd068563451d98a011a5eeabBobby Georgescu            mCameraOverlay.draw(canvas, (width - dim) / 2,
1478a8b9cfdd15bf36ccd068563451d98a011a5eeabBobby Georgescu                    (uncoveredHeight - dim) / 2, dim, dim);
14843ba9f6644e4183b8ee27f96de3dda703d136c52Bobby Georgescu        }
14931cac30e46a293f6d0901e22c6ab0d083cae7021Owen Lin        if (mPressedIndex == index) {
15090fe70f11b0961e1e5ae353cdf563236a55f502dYuli Huang            if (mAnimatePressedUp) {
15190fe70f11b0961e1e5ae353cdf563236a55f502dYuli Huang                drawPressedUpFrame(canvas, width, height);
15290fe70f11b0961e1e5ae353cdf563236a55f502dYuli Huang                renderRequestFlags |= SlotView.RENDER_MORE_FRAME;
15390fe70f11b0961e1e5ae353cdf563236a55f502dYuli Huang                if (isPressedUpFrameFinished()) {
15490fe70f11b0961e1e5ae353cdf563236a55f502dYuli Huang                    mAnimatePressedUp = false;
15590fe70f11b0961e1e5ae353cdf563236a55f502dYuli Huang                    mPressedIndex = -1;
15690fe70f11b0961e1e5ae353cdf563236a55f502dYuli Huang                }
15790fe70f11b0961e1e5ae353cdf563236a55f502dYuli Huang            } else {
15890fe70f11b0961e1e5ae353cdf563236a55f502dYuli Huang                drawPressedFrame(canvas, width, height);
15990fe70f11b0961e1e5ae353cdf563236a55f502dYuli Huang            }
16090fe70f11b0961e1e5ae353cdf563236a55f502dYuli Huang        } else if ((mHighlightItemPath != null) && (mHighlightItemPath == entry.setPath)) {
16131cac30e46a293f6d0901e22c6ab0d083cae7021Owen Lin            drawSelectedFrame(canvas, width, height);
16290fe70f11b0961e1e5ae353cdf563236a55f502dYuli Huang        } else if (mInSelectionMode && mSelectionManager.isItemSelected(entry.setPath)) {
16331cac30e46a293f6d0901e22c6ab0d083cae7021Owen Lin            drawSelectedFrame(canvas, width, height);
16431cac30e46a293f6d0901e22c6ab0d083cae7021Owen Lin        }
16590fe70f11b0961e1e5ae353cdf563236a55f502dYuli Huang        return renderRequestFlags;
1661a4bd273afe5dd11592f7625c2f19853b6f174e9Owen Lin    }
1671a4bd273afe5dd11592f7625c2f19853b6f174e9Owen Lin
16831cac30e46a293f6d0901e22c6ab0d083cae7021Owen Lin    protected int renderContent(
16931cac30e46a293f6d0901e22c6ab0d083cae7021Owen Lin            GLCanvas canvas, AlbumSetEntry entry, int width, int height) {
17031cac30e46a293f6d0901e22c6ab0d083cae7021Owen Lin        int renderRequestFlags = 0;
1711a4bd273afe5dd11592f7625c2f19853b6f174e9Owen Lin
172adee31f028d839e7baa8f9e052dc4e4d60b137daOwen Lin        Texture content = checkContentTexture(entry.content);
1731a4bd273afe5dd11592f7625c2f19853b6f174e9Owen Lin        if (content == null) {
1741a4bd273afe5dd11592f7625c2f19853b6f174e9Owen Lin            content = mWaitLoadingTexture;
1751a4bd273afe5dd11592f7625c2f19853b6f174e9Owen Lin            entry.isWaitLoadingDisplayed = true;
1761a4bd273afe5dd11592f7625c2f19853b6f174e9Owen Lin        } else if (entry.isWaitLoadingDisplayed) {
1771a4bd273afe5dd11592f7625c2f19853b6f174e9Owen Lin            entry.isWaitLoadingDisplayed = false;
178915c2c5b2c367df71599370613af0924bd7c4887Bobby Georgescu            content = new FadeInTexture(mPlaceholderColor, entry.bitmapTexture);
1793535d67239b1b1e4ee038f39dece64545b78f2edOwen Lin            entry.content = content;
1801a4bd273afe5dd11592f7625c2f19853b6f174e9Owen Lin        }
18131cac30e46a293f6d0901e22c6ab0d083cae7021Owen Lin        drawContent(canvas, content, width, height, entry.rotation);
1821a4bd273afe5dd11592f7625c2f19853b6f174e9Owen Lin        if ((content instanceof FadeInTexture) &&
1831a4bd273afe5dd11592f7625c2f19853b6f174e9Owen Lin                ((FadeInTexture) content).isAnimating()) {
18431cac30e46a293f6d0901e22c6ab0d083cae7021Owen Lin            renderRequestFlags |= SlotView.RENDER_MORE_FRAME;
1851a4bd273afe5dd11592f7625c2f19853b6f174e9Owen Lin        }
1861a4bd273afe5dd11592f7625c2f19853b6f174e9Owen Lin
18731cac30e46a293f6d0901e22c6ab0d083cae7021Owen Lin        return renderRequestFlags;
18831cac30e46a293f6d0901e22c6ab0d083cae7021Owen Lin    }
1891a4bd273afe5dd11592f7625c2f19853b6f174e9Owen Lin
19031cac30e46a293f6d0901e22c6ab0d083cae7021Owen Lin    protected int renderLabel(
19131cac30e46a293f6d0901e22c6ab0d083cae7021Owen Lin            GLCanvas canvas, AlbumSetEntry entry, int width, int height) {
192adee31f028d839e7baa8f9e052dc4e4d60b137daOwen Lin        Texture content = checkLabelTexture(entry.labelTexture);
193541e25df9f933d58d4678f58519558473db5a333Bobby Georgescu        if (content == null) {
194541e25df9f933d58d4678f58519558473db5a333Bobby Georgescu            content = mWaitLoadingTexture;
195f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        }
196541e25df9f933d58d4678f58519558473db5a333Bobby Georgescu        int b = AlbumLabelMaker.getBorderSize();
197541e25df9f933d58d4678f58519558473db5a333Bobby Georgescu        int h = mLabelSpec.labelBackgroundHeight;
198541e25df9f933d58d4678f58519558473db5a333Bobby Georgescu        content.draw(canvas, -b, height - h + b, width + b + b, h);
199541e25df9f933d58d4678f58519558473db5a333Bobby Georgescu
2001a4bd273afe5dd11592f7625c2f19853b6f174e9Owen Lin        return 0;
201f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    }
202f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
203f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    @Override
2047260f6f74d465520e4497b23fe56f98abb0c15a2Owen Lin    public void prepareDrawing() {
20531cac30e46a293f6d0901e22c6ab0d083cae7021Owen Lin        mInSelectionMode = mSelectionManager.inSelectionMode();
206f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    }
207f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
208f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    private class MyCacheListener implements AlbumSetSlidingWindow.Listener {
209f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
2107260f6f74d465520e4497b23fe56f98abb0c15a2Owen Lin        @Override
211f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        public void onSizeChanged(int size) {
2127260f6f74d465520e4497b23fe56f98abb0c15a2Owen Lin            mSlotView.setSlotCount(size);
213f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        }
214f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
2157260f6f74d465520e4497b23fe56f98abb0c15a2Owen Lin        @Override
2167260f6f74d465520e4497b23fe56f98abb0c15a2Owen Lin        public void onContentChanged() {
2177260f6f74d465520e4497b23fe56f98abb0c15a2Owen Lin            mSlotView.invalidate();
218f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        }
219f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    }
220f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
221f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    public void pause() {
222f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        mDataWindow.pause();
223f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    }
224f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
225f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    public void resume() {
226f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        mDataWindow.resume();
2277260f6f74d465520e4497b23fe56f98abb0c15a2Owen Lin    }
2287260f6f74d465520e4497b23fe56f98abb0c15a2Owen Lin
2297260f6f74d465520e4497b23fe56f98abb0c15a2Owen Lin    @Override
2307260f6f74d465520e4497b23fe56f98abb0c15a2Owen Lin    public void onVisibleRangeChanged(int visibleStart, int visibleEnd) {
2317260f6f74d465520e4497b23fe56f98abb0c15a2Owen Lin        if (mDataWindow != null) {
2327260f6f74d465520e4497b23fe56f98abb0c15a2Owen Lin            mDataWindow.setActiveWindow(visibleStart, visibleEnd);
233f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        }
234f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    }
2351a4bd273afe5dd11592f7625c2f19853b6f174e9Owen Lin
2361a4bd273afe5dd11592f7625c2f19853b6f174e9Owen Lin    @Override
2371a4bd273afe5dd11592f7625c2f19853b6f174e9Owen Lin    public void onSlotSizeChanged(int width, int height) {
2381a4bd273afe5dd11592f7625c2f19853b6f174e9Owen Lin        if (mDataWindow != null) {
2391a4bd273afe5dd11592f7625c2f19853b6f174e9Owen Lin            mDataWindow.onSlotSizeChanged(width, height);
2401a4bd273afe5dd11592f7625c2f19853b6f174e9Owen Lin        }
2411a4bd273afe5dd11592f7625c2f19853b6f174e9Owen Lin    }
242f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin}
243