summaryrefslogtreecommitdiffstats
path: root/src/com/android/dreams/phototable/PhotoTable.java
diff options
context:
space:
mode:
Diffstat (limited to 'src/com/android/dreams/phototable/PhotoTable.java')
-rw-r--r--src/com/android/dreams/phototable/PhotoTable.java47
1 files changed, 26 insertions, 21 deletions
diff --git a/src/com/android/dreams/phototable/PhotoTable.java b/src/com/android/dreams/phototable/PhotoTable.java
index 2837309..1ba95b9 100644
--- a/src/com/android/dreams/phototable/PhotoTable.java
+++ b/src/com/android/dreams/phototable/PhotoTable.java
@@ -34,6 +34,7 @@ import android.view.LayoutInflater;
import android.view.MotionEvent;
import android.view.View;
import android.view.ViewGroup;
+import android.view.ViewParent;
import android.view.ViewPropertyAnimator;
import android.view.animation.DecelerateInterpolator;
import android.view.animation.Interpolator;
@@ -44,7 +45,6 @@ import java.util.ArrayList;
import java.util.Formatter;
import java.util.HashSet;
import java.util.LinkedList;
-import java.util.List;
import java.util.Random;
import java.util.Set;
@@ -109,8 +109,6 @@ public class PhotoTable extends FrameLayout {
private final long mPickUpDuration;
private final int mMaxSelectionTime;
private final int mMaxFocusTime;
- private final List<View> mAnimating;
-
private DreamService mDream;
private PhotoLaunchTask mPhotoLaunchTask;
private LoadNaturalSiblingTask mLoadOnDeckTasks[];
@@ -127,6 +125,7 @@ public class PhotoTable extends FrameLayout {
private ViewGroup mBackground;
private ViewGroup mStageLeft;
private View mScrim;
+ private final Set<View> mWaitingToJoinBackground;
public PhotoTable(Context context, AttributeSet as) {
super(context, as);
@@ -157,7 +156,7 @@ public class PhotoTable extends FrameLayout {
mOnTable = new LinkedList<View>();
mPhotoSource = new PhotoSourcePlexor(getContext(),
getContext().getSharedPreferences(PhotoTableDreamSettings.PREFS_NAME, 0));
- mAnimating = new ArrayList<View>();
+ mWaitingToJoinBackground = new HashSet<View>();
mLauncher = new Launcher();
mFocusReaper = new FocusReaper();
mSelectionReaper = new SelectionReaper();
@@ -607,6 +606,7 @@ public class PhotoTable extends FrameLayout {
/** De-emphasize the other photos on the table. */
public void fadeOutBackground(final View photo) {
+ resolveBackgroundQueue();
if (mBackgroudOptimization) {
mBackground.animate()
.withLayer()
@@ -628,7 +628,7 @@ public class PhotoTable extends FrameLayout {
/** Return the other photos to foreground status. */
public void fadeInBackground(final View photo) {
if (mBackgroudOptimization) {
- mAnimating.add(photo);
+ mWaitingToJoinBackground.add(photo);
mBackground.animate()
.withLayer()
.setDuration(mPickUpDuration)
@@ -636,10 +636,7 @@ public class PhotoTable extends FrameLayout {
.withEndAction(new Runnable() {
@Override
public void run() {
- mAnimating.remove(photo);
- if (!mAnimating.contains(photo)) {
- moveToBackground(photo);
- }
+ resolveBackgroundQueue();
}
});
} else {
@@ -658,6 +655,13 @@ public class PhotoTable extends FrameLayout {
}
}
+ private void resolveBackgroundQueue() {
+ for(View photo: mWaitingToJoinBackground) {
+ moveToBackground(photo);
+ }
+ mWaitingToJoinBackground.clear();
+ }
+
/** Dispose of the photo gracefully, in case we can see some of it. */
public void fadeAway(final View photo, final boolean replace) {
// fade out of view
@@ -854,7 +858,7 @@ public class PhotoTable extends FrameLayout {
log("animate it");
// toss onto table
- mAnimating.add(photo);
+ resolveBackgroundQueue();
photo.animate()
.withLayer()
.scaleX(mTableRatio / mImageRatio)
@@ -867,32 +871,32 @@ public class PhotoTable extends FrameLayout {
.withEndAction(new Runnable() {
@Override
public void run() {
- mAnimating.remove(photo);
- if (!mAnimating.contains(photo)) {
- moveToBackground(photo);
- }
+ mWaitingToJoinBackground.add(photo);
}
});
}
private void moveToBackground(View photo) {
if (mBackgroudOptimization && !isInBackground(photo)) {
- removeView(photo);
+ removeViewFromParent(photo);
mBackground.addView(photo, new LayoutParams(LayoutParams.WRAP_CONTENT,
LayoutParams.WRAP_CONTENT));
}
}
private void exitStageLeft(View photo) {
- if (isInBackground(photo)) {
- mBackground.removeView(photo);
- } else {
- removeView(photo);
- }
+ removeViewFromParent(photo);
mStageLeft.addView(photo, new LayoutParams(LayoutParams.WRAP_CONTENT,
LayoutParams.WRAP_CONTENT));
}
+ private void removeViewFromParent(View photo) {
+ ViewParent parent = photo.getParent();
+ if (parent != null) { // should never be null, just being paranoid
+ ((ViewGroup) parent).removeView(photo);
+ }
+ }
+
private void moveToForeground(View photo) {
if (mBackgroudOptimization && isInBackground(photo)) {
mBackground.removeView(photo);
@@ -929,6 +933,7 @@ public class PhotoTable extends FrameLayout {
log("animate it");
// lift up to the glass for a good look
+ mWaitingToJoinBackground.remove(photo);
moveToForeground(photo);
photo.animate()
.withLayer()
@@ -967,7 +972,7 @@ public class PhotoTable extends FrameLayout {
private void recycle(View photo) {
if (photo != null) {
- removeView(photo);
+ removeViewFromParent(photo);
mPhotoSource.recycle(getBitmap(photo));
}
}