diff options
Diffstat (limited to 'src/com/android/gallery3d/ui/AlbumView.java')
-rw-r--r-- | src/com/android/gallery3d/ui/AlbumView.java | 197 |
1 files changed, 197 insertions, 0 deletions
diff --git a/src/com/android/gallery3d/ui/AlbumView.java b/src/com/android/gallery3d/ui/AlbumView.java new file mode 100644 index 000000000..417611a69 --- /dev/null +++ b/src/com/android/gallery3d/ui/AlbumView.java @@ -0,0 +1,197 @@ +/* + * 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.GalleryActivity; +import com.android.gallery3d.data.MediaItem; +import com.android.gallery3d.ui.PositionRepository.Position; + +import android.graphics.Rect; + +public class AlbumView extends SlotView { + @SuppressWarnings("unused") + private static final String TAG = "AlbumView"; + private static final int CACHE_SIZE = 64; + + private int mVisibleStart = 0; + private int mVisibleEnd = 0; + + private AlbumSlidingWindow mDataWindow; + private final GalleryActivity mActivity; + private SelectionDrawer mSelectionDrawer; + private int mSlotWidth, mSlotHeight; + private int mDisplayItemSize; + + private boolean mIsActive = false; + + public static interface Model { + public int size(); + public MediaItem get(int index); + public void setActiveWindow(int start, int end); + public void setModelListener(ModelListener listener); + } + + public static interface ModelListener { + public void onWindowContentChanged(int index); + public void onSizeChanged(int size); + } + + public AlbumView(GalleryActivity activity, + int slotWidth, int slotHeight, int displayItemSize) { + super(activity.getAndroidContext()); + mSlotWidth = slotWidth; + mSlotHeight = slotHeight; + mDisplayItemSize = displayItemSize; + setSlotSize(slotWidth, slotHeight); + mActivity = activity; + } + + public void setSelectionDrawer(SelectionDrawer drawer) { + mSelectionDrawer = drawer; + if (mDataWindow != null) mDataWindow.setSelectionDrawer(drawer); + } + + public void setModel(Model model) { + if (mDataWindow != null) { + mDataWindow.setListener(null); + setSlotCount(0); + mDataWindow = null; + } + if (model != null) { + mDataWindow = new AlbumSlidingWindow( + mActivity, model, CACHE_SIZE, + mSlotWidth, mSlotHeight, mDisplayItemSize); + mDataWindow.setSelectionDrawer(mSelectionDrawer); + mDataWindow.setListener(new MyDataModelListener()); + setSlotCount(model.size()); + updateVisibleRange(getVisibleStart(), getVisibleEnd()); + } + } + + public void setFocusIndex(int slotIndex) { + if (mDataWindow != null) { + mDataWindow.setFocusIndex(slotIndex); + } + } + + private void putSlotContent(int slotIndex, DisplayItem item) { + Rect rect = getSlotRect(slotIndex); + Position position = new Position( + (rect.left + rect.right) / 2, (rect.top + rect.bottom) / 2, 0); + putDisplayItem(position, position, item); + } + + private void updateVisibleRange(int start, int end) { + if (start == mVisibleStart && end == mVisibleEnd) { + // we need to set the mDataWindow active range in any case. + mDataWindow.setActiveWindow(start, end); + return; + } + + if (!mIsActive) { + mVisibleStart = start; + mVisibleEnd = end; + mDataWindow.setActiveWindow(start, end); + return; + } + + if (start >= mVisibleEnd || mVisibleStart >= end) { + for (int i = mVisibleStart, n = mVisibleEnd; i < n; ++i) { + DisplayItem item = mDataWindow.get(i); + if (item != null) removeDisplayItem(item); + } + mDataWindow.setActiveWindow(start, end); + for (int i = start; i < end; ++i) { + putSlotContent(i, mDataWindow.get(i)); + } + } else { + for (int i = mVisibleStart; i < start; ++i) { + DisplayItem item = mDataWindow.get(i); + if (item != null) removeDisplayItem(item); + } + for (int i = end, n = mVisibleEnd; i < n; ++i) { + DisplayItem item = mDataWindow.get(i); + if (item != null) removeDisplayItem(item); + } + mDataWindow.setActiveWindow(start, end); + for (int i = start, n = mVisibleStart; i < n; ++i) { + putSlotContent(i, mDataWindow.get(i)); + } + for (int i = mVisibleEnd; i < end; ++i) { + putSlotContent(i, mDataWindow.get(i)); + } + } + + mVisibleStart = start; + mVisibleEnd = end; + } + + @Override + protected void onLayoutChanged(int width, int height) { + // Reput all the items + updateVisibleRange(0, 0); + updateVisibleRange(getVisibleStart(), getVisibleEnd()); + } + + @Override + protected void onScrollPositionChanged(int position) { + super.onScrollPositionChanged(position); + updateVisibleRange(getVisibleStart(), getVisibleEnd()); + } + + @Override + protected void render(GLCanvas canvas) { + mSelectionDrawer.prepareDrawing(); + super.render(canvas); + } + + private class MyDataModelListener implements AlbumSlidingWindow.Listener { + + public void onContentInvalidated() { + invalidate(); + } + + public void onSizeChanged(int size) { + // If the layout parameters are changed, we need reput all items. + if (setSlotCount(size)) updateVisibleRange(0, 0); + updateVisibleRange(getVisibleStart(), getVisibleEnd()); + invalidate(); + } + + public void onWindowContentChanged( + int slotIndex, DisplayItem old, DisplayItem update) { + removeDisplayItem(old); + putSlotContent(slotIndex, update); + } + } + + public void resume() { + mIsActive = true; + mDataWindow.resume(); + for (int i = mVisibleStart, n = mVisibleEnd; i < n; ++i) { + putSlotContent(i, mDataWindow.get(i)); + } + } + + public void pause() { + mIsActive = false; + for (int i = mVisibleStart, n = mVisibleEnd; i < n; ++i) { + removeDisplayItem(mDataWindow.get(i)); + } + mDataWindow.pause(); + } +} |