summaryrefslogtreecommitdiffstats
path: root/src/com/android/camera/ui/GLListView.java
diff options
context:
space:
mode:
Diffstat (limited to 'src/com/android/camera/ui/GLListView.java')
-rw-r--r--src/com/android/camera/ui/GLListView.java405
1 files changed, 0 insertions, 405 deletions
diff --git a/src/com/android/camera/ui/GLListView.java b/src/com/android/camera/ui/GLListView.java
deleted file mode 100644
index ed22ea3..0000000
--- a/src/com/android/camera/ui/GLListView.java
+++ /dev/null
@@ -1,405 +0,0 @@
-/*
- * 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.camera.ui;
-
-import static android.view.View.MeasureSpec.makeMeasureSpec;
-import com.android.camera.Util;
-
-import android.content.Context;
-import android.graphics.Rect;
-import android.os.Handler;
-import android.os.Looper;
-import android.os.Message;
-import android.view.GestureDetector;
-import android.view.MotionEvent;
-import android.view.View.MeasureSpec;
-import android.view.animation.AlphaAnimation;
-import android.view.animation.Animation;
-import android.view.animation.Transformation;
-import android.widget.Scroller;
-
-import javax.microedition.khronos.opengles.GL11;
-
-class GLListView extends GLView {
- @SuppressWarnings("unused")
- private static final String TAG = "GLListView";
- private static final int INDEX_NONE = -1;
- private static final int SCROLL_BAR_TIMEOUT = 1000;
-
- private static final int HIDE_SCROLL_BAR = 1;
-
- private Model mModel;
- private Handler mHandler;
-
- private int mHighlightIndex = INDEX_NONE;
- private GLView mHighlightView;
-
- private Texture mHighLight;
- private NinePatchTexture mScrollbar;
-
- private int mVisibleStart = 0; // inclusive
- private int mVisibleEnd = 0; // exclusive
-
- private boolean mHasMeasured = false;
-
- private boolean mScrollBarVisible = false;
- private Animation mScrollBarAnimation;
- private OnItemSelectedListener mOnItemSelectedListener;
-
- private GestureDetector mGestureDetector;
- private final Scroller mScroller;
- private boolean mScrollable;
- private boolean mIsPressed = false;
-
- static public interface Model {
- public int size();
- public GLView getView(int index);
- public boolean isSelectable(int index);
- }
-
- static public interface OnItemSelectedListener {
- public void onItemSelected(GLView view, int position);
- }
-
- public GLListView(Context context) {
- mScroller = new Scroller(context);
- mHandler = new Handler(Looper.getMainLooper()) {
- @Override
- public void handleMessage(Message msg) {
- GLRootView root = getGLRootView();
- if (root != null) {
- synchronized (root) {
- handleMessageLocked(msg);
- }
- } else {
- handleMessageLocked(msg);
- }
- }
-
- private void handleMessageLocked(Message msg) {
- switch(msg.what) {
- case HIDE_SCROLL_BAR:
- setScrollBarVisible(false);
- break;
- }
- }
- };
- mGestureDetector = new GestureDetector(
- context, new MyGestureListener(), mHandler);
- }
-
- private final Runnable mHideScrollBar = new Runnable() {
- public void run() {
- setScrollBarVisible(false);
- }
- };
-
- @Override
- protected void onVisibilityChanged(int visibility) {
- super.onVisibilityChanged(visibility);
- if (mScrollHeight > getHeight()) updateScrollBar(visibility);
- }
-
- private void updateScrollBar(int visibility) {
- if (isVisible()) {
- setScrollBarVisible(true);
- mHandler.sendEmptyMessageDelayed(
- HIDE_SCROLL_BAR, SCROLL_BAR_TIMEOUT);
- } else {
- mHandler.removeMessages(HIDE_SCROLL_BAR);
- }
- }
-
- private void setScrollBarVisible(boolean visible) {
- if (mScrollBarVisible == visible || mScrollbar == null) return;
- mScrollBarVisible = visible;
- if (!visible) {
- mScrollBarAnimation = new AlphaAnimation(1, 0);
- mScrollBarAnimation.setDuration(300);
- mScrollBarAnimation.start();
- } else {
- mScrollBarAnimation = null;
- }
- invalidate();
- }
-
- public void setHighLight(Texture highLight) {
- mHighLight = highLight;
- }
-
- public void setDataModel(Model model) {
- mModel = model;
- mScrollY = 0;
- requestLayout();
- }
-
- public void setOnItemSelectedListener(OnItemSelectedListener l) {
- mOnItemSelectedListener = l;
- }
-
- private boolean drawWithAnimation(GLRootView root,
- Texture texture, int x, int y, int w, int h, Animation anim) {
- long now = root.currentAnimationTimeMillis();
- Transformation temp = root.obtainTransformation();
- boolean more = anim.getTransformation(now, temp);
- Transformation transformation = root.pushTransform();
- transformation.compose(temp);
- texture.draw(root, x, y, w, h);
- invalidate();
- root.popTransform();
- return more;
- }
-
- @Override
- protected void render(GLRootView root, GL11 gl) {
- root.clipRect(0, 0, getWidth(), getHeight());
- if (mHighlightIndex != INDEX_NONE) {
- GLView view = mModel.getView(mHighlightIndex);
- Rect bounds = view.bounds();
- if (mHighLight != null) {
- int width = bounds.width();
- int height = bounds.height();
- mHighLight.draw(root,
- bounds.left - mScrollX, bounds.top - mScrollY,
- width, height);
- }
- }
- super.render(root, gl);
- root.clearClip();
-
- if (mScrollBarAnimation != null || mScrollBarVisible) {
- int width = mScrollbar.getWidth();
- int height = getHeight() * getHeight() / mScrollHeight;
- int yoffset = mScrollY * getHeight() / mScrollHeight;
- if (mScrollBarAnimation != null) {
- if (!drawWithAnimation(
- root, mScrollbar, getWidth() - width, yoffset,
- width, height, mScrollBarAnimation)) {
- mScrollBarAnimation = null;
- }
- } else {
- mScrollbar.draw(
- root, getWidth() - width, yoffset, width, height);
- }
- }
- if (mScroller.computeScrollOffset()) {
- setScrollPosition(mScroller.getCurrY(), false);
- }
- }
-
- @Override
- protected void onMeasure(int widthSpec, int heightSpec) {
- // first get the total height
- int height = 0;
- int maxWidth = 0;
- for (int i = 0, n = mModel.size(); i < n; ++i) {
- GLView view = mModel.getView(i);
- view.measure(widthSpec, MeasureSpec.UNSPECIFIED);
- height += view.getMeasuredHeight();
- maxWidth = Math.max(maxWidth, view.getMeasuredWidth());
- }
- mScrollHeight = height;
- mHasMeasured = true;
- new MeasureHelper(this)
- .setPreferredContentSize(maxWidth, height)
- .measure(widthSpec, heightSpec);
- }
-
- @Override
- public int getComponentCount() {
- return mVisibleEnd - mVisibleStart;
- }
-
- @Override
- public GLView getComponent(int index) {
- if (index < 0 || index >= mVisibleEnd - mVisibleStart) {
- throw new ArrayIndexOutOfBoundsException(index);
- }
- return mModel.getView(mVisibleStart + index);
- }
-
- @Override
- public void requestLayout() {
- mHasMeasured = false;
- super.requestLayout();
- }
-
- @Override
- protected void onLayout(
- boolean change, int left, int top, int right, int bottom) {
-
- if (!mHasMeasured || mMeasuredWidth != (right - left)) {
- measure(makeMeasureSpec(right - left, MeasureSpec.EXACTLY),
- makeMeasureSpec(bottom - top, MeasureSpec.EXACTLY));
- }
-
- mScrollable = mScrollHeight > (bottom - top);
- int width = right - left;
- int yoffset = 0;
-
- for (int i = 0, n = mModel.size(); i < n; ++i) {
- GLView item = mModel.getView(i);
- item.onAddToParent(this);
- int nextOffset = yoffset + item.getMeasuredHeight();
- item.layout(0, yoffset, width, nextOffset);
- yoffset = nextOffset;
- }
- setScrollPosition(mScrollY, true);
- }
-
- private void setScrollPosition(int position, boolean force) {
- int height = getHeight();
-
- position = Util.clamp(position, 0, mScrollHeight - height);
-
- if (!force && position == mScrollY) return;
- mScrollY = position;
-
- int n = mModel.size();
-
- int start = 0;
- int end = 0;
- for (start = 0; start < n; ++start) {
- if (position < mModel.getView(start).mBounds.bottom) break;
- }
-
- int bottom = position + height;
- for (end = start; end < n; ++ end) {
- if (bottom <= mModel.getView(end).mBounds.top) break;
- }
- setVisibleRange(start , end);
- invalidate();
- }
-
- private void setVisibleRange(int start, int end) {
- if (start == mVisibleStart && end == mVisibleEnd) return;
- mVisibleStart = start;
- mVisibleEnd = end;
- }
-
- @Override
- protected boolean dispatchTouchEvent(MotionEvent event) {
- return onTouch(event);
- }
-
- @Override @SuppressWarnings("fallthrough")
- protected boolean onTouch(MotionEvent event) {
-
- mGestureDetector.onTouchEvent(event);
-
- switch (event.getAction()) {
- case MotionEvent.ACTION_DOWN:
- mIsPressed = true;
- mHandler.removeMessages(HIDE_SCROLL_BAR);
- setScrollBarVisible(mScrollHeight > getHeight());
- if (!mScroller.isFinished()) {
- mScroller.forceFinished(true);
- break;
- }
- // fallthrough: we need to highlight the item which is pressed
- case MotionEvent.ACTION_MOVE:
- if (!mScrollable) {
- findAndSetHighlightItem((int) event.getY());
- }
- break;
- case MotionEvent.ACTION_UP:
- mIsPressed = false;
- if (mScrollBarVisible) {
- mHandler.removeMessages(HIDE_SCROLL_BAR);
- mHandler.sendEmptyMessageDelayed(
- HIDE_SCROLL_BAR, SCROLL_BAR_TIMEOUT);
- }
- if (!mScrollable && mOnItemSelectedListener != null
- && mHighlightView != null) {
- mOnItemSelectedListener
- .onItemSelected(mHighlightView, mHighlightIndex);
- }
- case MotionEvent.ACTION_CANCEL:
- case MotionEvent.ACTION_OUTSIDE:
- setHighlightItem(null, INDEX_NONE);
- }
- return true;
- }
-
- private void findAndSetHighlightItem(int y) {
- int position = y + mScrollY;
- for (int i = mVisibleStart, n = mVisibleEnd; i < n; ++i) {
- GLView child = mModel.getView(i);
- if (child.mBounds.bottom > position) {
- if (mModel.isSelectable(i)) {
- setHighlightItem(child, i);
- return;
- }
- break;
- }
- }
- setHighlightItem(null, INDEX_NONE);
- }
-
- private void setHighlightItem(GLView view, int index) {
- if (index == mHighlightIndex) return;
- mHighlightIndex = index;
- mHighlightView = view;
- if (mHighLight != null) invalidate();
- }
-
- public void setScroller(NinePatchTexture scrollbar) {
- this.mScrollbar = scrollbar;
- requestLayout();
- }
-
- private class MyGestureListener
- extends GestureDetector.SimpleOnGestureListener {
-
- @Override
- public boolean onFling(MotionEvent e1,
- MotionEvent e2, float velocityX, float velocityY) {
- if (!mScrollable) return false;
- mScroller.fling(0, mScrollY,
- 0, -(int) velocityY, 0, 0, 0, mScrollHeight - getHeight());
- invalidate();
- return true;
- }
-
- @Override
- public boolean onScroll(MotionEvent e1,
- MotionEvent e2, float distanceX, float distanceY) {
- if (!mScrollable) return false;
- setHighlightItem(null, INDEX_NONE);
- setScrollPosition(mScrollY + (int) distanceY, false);
- return true;
- }
-
- @Override
- public void onShowPress(MotionEvent e) {
- if (!mScrollable || !mIsPressed) return;
- findAndSetHighlightItem((int) e.getY());
- }
-
- @Override
- public boolean onSingleTapUp(MotionEvent e) {
- if (!mScrollable) return false;
- findAndSetHighlightItem((int) e.getY());
- if (mOnItemSelectedListener != null && mHighlightView != null) {
- mOnItemSelectedListener
- .onItemSelected(mHighlightView, mHighlightIndex);
- }
- setHighlightItem(null, INDEX_NONE);
- return true;
- }
- }
-}