From 3d0b691b8f7a844093e8de9267ffa2ce16d0c5a9 Mon Sep 17 00:00:00 2001 From: Angus Kong Date: Fri, 9 Aug 2013 13:05:55 -0700 Subject: Fix DataAdapter wrapper classes callback mechanism. Also to fix FilmStripView to avoid NPE before data is loaded. Change-Id: I6c8a3d215d9f1dc72b4207e52023c1e27e9df123 --- .../android/camera/data/FixedFirstDataAdapter.java | 24 +++++++++++++++++--- src/com/android/camera/ui/FilmStripView.java | 26 +++++++++++++++++++--- 2 files changed, 44 insertions(+), 6 deletions(-) diff --git a/src/com/android/camera/data/FixedFirstDataAdapter.java b/src/com/android/camera/data/FixedFirstDataAdapter.java index 2bff22aa4..ecb9c1402 100644 --- a/src/com/android/camera/data/FixedFirstDataAdapter.java +++ b/src/com/android/camera/data/FixedFirstDataAdapter.java @@ -133,6 +133,11 @@ public class FixedFirstDataAdapter extends AbstractLocalDataAdapterWrapper public void setListener(Listener listener) { mListener = listener; mAdapter.setListener((listener == null) ? null : this); + // The first data is always there. Thus, When the listener is set, + // we should call listener.onDataLoaded(). + if (mListener != null) { + mListener.onDataLoaded(); + } } @Override @@ -145,7 +150,20 @@ public class FixedFirstDataAdapter extends AbstractLocalDataAdapterWrapper @Override public void onDataLoaded() { - mListener.onDataLoaded(); + if (mListener == null) { + return; + } + mListener.onDataUpdated(new UpdateReporter() { + @Override + public boolean isDataRemoved(int dataID) { + return false; + } + + @Override + public boolean isDataUpdated(int dataID) { + return (dataID != 0); + } + }); } @Override @@ -153,12 +171,12 @@ public class FixedFirstDataAdapter extends AbstractLocalDataAdapterWrapper mListener.onDataUpdated(new UpdateReporter() { @Override public boolean isDataRemoved(int dataID) { - return reporter.isDataRemoved(dataID - 1); + return (dataID != 0) && reporter.isDataRemoved(dataID - 1); } @Override public boolean isDataUpdated(int dataID) { - return reporter.isDataUpdated(dataID - 1); + return (dataID != 0) && reporter.isDataUpdated(dataID - 1); } }); } diff --git a/src/com/android/camera/ui/FilmStripView.java b/src/com/android/camera/ui/FilmStripView.java index c21f2b2a2..c11b93fd1 100644 --- a/src/com/android/camera/ui/FilmStripView.java +++ b/src/com/android/camera/ui/FilmStripView.java @@ -491,6 +491,9 @@ public class FilmStripView extends ViewGroup { } public boolean isAnchoredTo(int id) { + if (mViewInfo[mCurrentInfo] == null) { + return false; + } if (mViewInfo[mCurrentInfo].getID() == id && mViewInfo[mCurrentInfo].getCenterX() == mCenterX) { return true; @@ -511,7 +514,7 @@ public class FilmStripView extends ViewGroup { @Override public void onDraw(Canvas c) { - if (mController.hasNewGeometry()) { + if (mViewInfo[mCurrentInfo] != null && mController.hasNewGeometry()) { layoutChildren(); } } @@ -796,6 +799,9 @@ public class FilmStripView extends ViewGroup { } private void layoutChildren() { + if (mViewInfo[mCurrentInfo] == null) { + return; + } if (mAnchorPending) { mCenterX = mViewInfo[mCurrentInfo].getCenterX(); mAnchorPending = false; @@ -1261,6 +1267,9 @@ public class FilmStripView extends ViewGroup { mViewInfo[mCurrentInfo] = buildInfoFromData(0); mViewInfo[mCurrentInfo].setLeftPosition(0); + if (mViewInfo[mCurrentInfo] == null) { + return; + } if (getCurrentType() == ImageData.TYPE_CAMERA_PREVIEW) { // we are in camera mode by default. mController.lockAtCurrentView(); @@ -1437,8 +1446,9 @@ public class FilmStripView extends ViewGroup { @Override public boolean stopScrolling() { - if (!mCanStopScroll) + if (!mCanStopScroll) { return false; + } mScroller.forceFinished(true); mHasNewPosition = false; return true; @@ -1451,8 +1461,9 @@ public class FilmStripView extends ViewGroup { @Override public void scrollTo(int position, int duration, boolean interruptible) { - if (!stopScrolling() || mIsPositionLocked) + if (!stopScrolling() || mIsPositionLocked) { return; + } mCanStopScroll = interruptible; stopScrolling(); mScroller.startScroll(mCenterX, 0, position - mCenterX, @@ -1461,6 +1472,9 @@ public class FilmStripView extends ViewGroup { } private void scaleTo(float scale, int duration) { + if (mViewInfo[mCurrentInfo] == null) { + return; + } stopScale(); mScaleAnimator.setDuration(duration); mScaleAnimator.setFloatValues(mScale, scale); @@ -1518,6 +1532,9 @@ public class FilmStripView extends ViewGroup { @Override public void onAnimationUpdate(ValueAnimator animation) { + if (mViewInfo[mCurrentInfo] == null) { + return; + } mHasNewScale = true; mNewScale = (Float) animation.getAnimatedValue(); layoutChildren(); @@ -1628,6 +1645,9 @@ public class FilmStripView extends ViewGroup { @Override public boolean onScroll(float x, float y, float dx, float dy) { + if (mViewInfo[mCurrentInfo] == null) { + return false; + } int deltaX = (int) (dx / mScale); if (inFilmStrip()) { if (Math.abs(dx) > Math.abs(dy)) { -- cgit v1.2.3