/* * Copyright (c) 2015, The Linux Foundation. All rights reserved. * Not a Contribution * * Copyright (C) 2010 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.android.gallery3d.ui; import com.android.gallery3d.app.AbstractGalleryActivity; import com.android.gallery3d.app.AlbumDataLoader; import com.android.gallery3d.app.AlbumPage; import com.android.gallery3d.data.MediaObject; import com.android.gallery3d.data.Path; import com.android.gallery3d.glrenderer.ColorTexture; import com.android.gallery3d.glrenderer.FadeInTexture; import com.android.gallery3d.glrenderer.GLCanvas; import com.android.gallery3d.glrenderer.Texture; import com.android.gallery3d.glrenderer.TiledTexture; import com.android.gallery3d.glrenderer.UploadedTexture; import com.android.gallery3d.ui.AlbumSlidingWindow.AlbumEntry; public class AlbumSlotRenderer extends AbstractSlotRenderer { @SuppressWarnings("unused") private static final String TAG = "AlbumView"; private boolean mIsGridViewShown; public static class LabelSpec { public int labelBackgroundHeight; public int titleFontSize; public int leftMargin; public int iconSize; public int titleLeftMargin; public int backgroundColor; public int titleColor; public int borderSize; } public interface SlotFilter { public boolean acceptSlot(int index); } private final int mPlaceholderColor; private static final int CACHE_SIZE = 96; private AlbumSlidingWindow mDataWindow; private final AbstractGalleryActivity mActivity; private final ColorTexture mWaitLoadingTexture; private SlotView mSlotView; private final SelectionManager mSelectionManager; private int mPressedIndex = -1; private boolean mAnimatePressedUp; private Path mHighlightItemPath = null; private boolean mInSelectionMode; private SlotFilter mSlotFilter; protected final LabelSpec mLabelSpec; public AlbumSlotRenderer(AbstractGalleryActivity activity, SlotView slotView, LabelSpec labelSpec, SelectionManager selectionManager, int placeholderColor, boolean viewType) { super(activity); mActivity = activity; mSlotView = slotView; mSelectionManager = selectionManager; mPlaceholderColor = placeholderColor; mLabelSpec = labelSpec; mWaitLoadingTexture = new ColorTexture(mPlaceholderColor); mWaitLoadingTexture.setSize(1, 1); mIsGridViewShown = viewType; } public void setPressedIndex(int index) { if (mPressedIndex == index) return; mPressedIndex = index; mSlotView.invalidate(); } public void setPressedUp() { if (mPressedIndex == -1) return; mAnimatePressedUp = true; mSlotView.invalidate(); } public void setHighlightItemPath(Path path) { if (mHighlightItemPath == path) return; mHighlightItemPath = path; mSlotView.invalidate(); } public void setModel(AlbumDataLoader model) { if (mDataWindow != null) { mDataWindow.setListener(null); mSlotView.setSlotCount(0); mDataWindow = null; } if (model != null) { mDataWindow = new AlbumSlidingWindow(mActivity, model, CACHE_SIZE, mLabelSpec, mIsGridViewShown); mDataWindow.setListener(new MyDataModelListener()); mSlotView.setSlotCount(model.size()); } } private static Texture checkTexture(Texture texture) { return (texture instanceof TiledTexture) && !((TiledTexture) texture).isReady() ? null : texture; } @Override public int renderSlot(GLCanvas canvas, int index, int pass, int width, int height) { int thumbSize = 0; if (!mIsGridViewShown) { thumbSize = mLabelSpec.iconSize; } if (mSlotFilter != null && !mSlotFilter.acceptSlot(index)) return 0; AlbumSlidingWindow.AlbumEntry entry = mDataWindow.get(index); int renderRequestFlags = 0; Texture content = checkTexture(entry.content); if (content == null) { content = mWaitLoadingTexture; entry.isWaitDisplayed = true; } else if (entry.isWaitDisplayed) { entry.isWaitDisplayed = false; content = new FadeInTexture(mPlaceholderColor, entry.bitmapTexture); entry.content = content; } if (mIsGridViewShown) { drawContent(canvas, content, width, height, entry.rotation); } else { // In List View, the content is always rendered in to the largest square that fits // inside the slot, aligned to the top of the slot. int minSize = Math.min(width, height); drawContent(canvas, content, minSize, minSize, entry.rotation); } if ((content instanceof FadeInTexture) && ((FadeInTexture) content).isAnimating()) { renderRequestFlags |= SlotView.RENDER_MORE_FRAME; } if (!mIsGridViewShown) renderRequestFlags |= renderLabel(canvas, entry, width, height); if (entry.mediaType == MediaObject.MEDIA_TYPE_VIDEO) { drawVideoOverlay(canvas, width, height, mIsGridViewShown, thumbSize); } if ((entry.mediaType == MediaObject.MEDIA_TYPE_DRM_VIDEO) || (entry.mediaType == MediaObject.MEDIA_TYPE_DRM_IMAGE)) { drawDrmOverlay(canvas, width, height, entry.mediaType, mIsGridViewShown, thumbSize); } if (entry.isPanorama) { drawPanoramaIcon(canvas, width, height, mIsGridViewShown, thumbSize); } renderRequestFlags |= renderOverlay(canvas, index, entry, width, height); return renderRequestFlags; } protected int renderLabel(GLCanvas canvas, AlbumEntry entry, int width, int height) { Texture content = checkLabelTexture(entry.labelTexture); if (content == null) { content = mWaitLoadingTexture; } int b = AlbumLabelMaker.getBorderSize(); int h = mLabelSpec.labelBackgroundHeight; content.draw(canvas, -b, height - h + b, width + b + b, h); return 0; } private int renderOverlay(GLCanvas canvas, int index, AlbumSlidingWindow.AlbumEntry entry, int width, int height) { int renderRequestFlags = 0; if (mPressedIndex == index) { if (mAnimatePressedUp) { drawPressedUpFrame(canvas, width, height); renderRequestFlags |= SlotView.RENDER_MORE_FRAME; if (isPressedUpFrameFinished()) { mAnimatePressedUp = false; mPressedIndex = -1; } } else { drawPressedFrame(canvas, width, height); } } else if ((entry.path != null) && (mHighlightItemPath == entry.path)) { drawSelectedFrame(canvas, width, height); } else if (mInSelectionMode && mSelectionManager.isItemSelected(entry.path)) { drawSelectedFrame(canvas, width, height); } return renderRequestFlags; } private static Texture checkLabelTexture(Texture texture) { return ((texture instanceof UploadedTexture) && ((UploadedTexture) texture) .isUploading()) ? null : texture; } private class MyDataModelListener implements AlbumSlidingWindow.Listener { @Override public void onContentChanged() { mSlotView.invalidate(); } @Override public void onSizeChanged(int size) { mSlotView.setSlotCount(size); mSlotView.invalidate(); } } public void resume() { mDataWindow.resume(); } public void pause() { mDataWindow.pause(); } @Override public void prepareDrawing() { mInSelectionMode = mSelectionManager.inSelectionMode(); } @Override public void onVisibleRangeChanged(int visibleStart, int visibleEnd) { if (mDataWindow != null) { mDataWindow.setActiveWindow(visibleStart, visibleEnd); } } @Override public void onSlotSizeChanged(int width, int height) { if (!mIsGridViewShown && mDataWindow != null) { mDataWindow.onSlotSizeChanged(width, height); } } public void setSlotFilter(SlotFilter slotFilter) { mSlotFilter = slotFilter; } }