Refactoring to AnimatedEvent.
Change-Id: I87ce63201120dc687eccd63024801cc2c19bebd6
diff --git a/packages/SystemUI/src/com/android/systemui/recents/RecentsActivity.java b/packages/SystemUI/src/com/android/systemui/recents/RecentsActivity.java
index b3ce4a6..ffcc805 100644
--- a/packages/SystemUI/src/com/android/systemui/recents/RecentsActivity.java
+++ b/packages/SystemUI/src/com/android/systemui/recents/RecentsActivity.java
@@ -246,10 +246,7 @@
boolean dismissHistory() {
// Try and hide the history view first
if (mHistoryView != null && mHistoryView.isVisible()) {
- ReferenceCountedTrigger t = new ReferenceCountedTrigger(this);
- t.increment();
- EventBus.getDefault().send(new HideHistoryEvent(true /* animate */, t));
- t.decrement();
+ EventBus.getDefault().send(new HideHistoryEvent(true /* animate */));
return true;
}
return false;
@@ -301,8 +298,8 @@
*/
void dismissRecentsToHome(boolean animated) {
if (animated) {
- ReferenceCountedTrigger exitTrigger = new ReferenceCountedTrigger(this,
- null, mFinishLaunchHomeRunnable, null);
+ ReferenceCountedTrigger exitTrigger = new ReferenceCountedTrigger(null,
+ mFinishLaunchHomeRunnable, null);
mRecentsView.startExitToHomeAnimation(
new ViewAnimation.TaskViewExitContext(exitTrigger));
} else {
@@ -439,10 +436,7 @@
// Reset some states
mIgnoreAltTabRelease = false;
if (mHistoryView != null) {
- ReferenceCountedTrigger t = new ReferenceCountedTrigger(this);
- t.increment();
- EventBus.getDefault().send(new HideHistoryEvent(false /* animate */, t));
- t.decrement();
+ EventBus.getDefault().send(new HideHistoryEvent(false /* animate */));
}
// Notify that recents is now hidden
@@ -511,11 +505,7 @@
protected void onRestoreInstanceState(Bundle savedInstanceState) {
super.onRestoreInstanceState(savedInstanceState);
if (savedInstanceState.getBoolean(KEY_SAVED_STATE_HISTORY_VISIBLE, false)) {
- ReferenceCountedTrigger postHideStackAnimationTrigger =
- new ReferenceCountedTrigger(this);
- postHideStackAnimationTrigger.increment();
- EventBus.getDefault().send(new ShowHistoryEvent(postHideStackAnimationTrigger));
- postHideStackAnimationTrigger.decrement();
+ EventBus.getDefault().send(new ShowHistoryEvent());
}
}
@@ -644,16 +634,14 @@
} else if (event.triggeredFromHomeKey) {
// Otherwise, dismiss Recents to Home
if (mHistoryView != null && mHistoryView.isVisible()) {
- ReferenceCountedTrigger t = new ReferenceCountedTrigger(this);
- t.increment();
- t.addLastDecrementRunnable(new Runnable() {
+ HideHistoryEvent hideEvent = new HideHistoryEvent(true /* animate */);
+ hideEvent.addPostAnimationCallback(new Runnable() {
@Override
public void run() {
dismissRecentsToHome(true /* animated */);
}
});
- EventBus.getDefault().send(new HideHistoryEvent(true, t));
- t.decrement();
+ EventBus.getDefault().send(hideEvent);
} else {
dismissRecentsToHome(true /* animated */);
@@ -665,7 +653,7 @@
public final void onBusEvent(EnterRecentsWindowAnimationCompletedEvent event) {
// Try and start the enter animation (or restart it on configuration changed)
- ReferenceCountedTrigger t = new ReferenceCountedTrigger(this);
+ ReferenceCountedTrigger t = new ReferenceCountedTrigger();
ViewAnimation.TaskViewEnterContext ctx = new ViewAnimation.TaskViewEnterContext(t);
ctx.postAnimationTrigger.increment();
if (mSearchWidgetInfo != null) {
@@ -784,11 +772,11 @@
// provided.
mHistoryView.setSystemInsets(mRecentsView.getSystemInsets());
}
- mHistoryView.show(mRecentsView.getTaskStack(), event.postHideStackAnimationTrigger);
+ mHistoryView.show(mRecentsView.getTaskStack(), event.getAnimationTrigger());
}
public final void onBusEvent(HideHistoryEvent event) {
- mHistoryView.hide(event.animate, event.postHideHistoryAnimationTrigger);
+ mHistoryView.hide(event.animate, event.getAnimationTrigger());
}
private void refreshSearchWidgetView() {
diff --git a/packages/SystemUI/src/com/android/systemui/recents/events/EventBus.java b/packages/SystemUI/src/com/android/systemui/recents/events/EventBus.java
index d72218f..5c49ac3 100644
--- a/packages/SystemUI/src/com/android/systemui/recents/events/EventBus.java
+++ b/packages/SystemUI/src/com/android/systemui/recents/events/EventBus.java
@@ -28,6 +28,8 @@
import android.util.Log;
import android.util.MutableBoolean;
+import com.android.systemui.recents.misc.ReferenceCountedTrigger;
+
import java.lang.ref.WeakReference;
import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationTargetException;
@@ -220,6 +222,20 @@
// Only accessible from derived events
protected Event() {}
+ /**
+ * Called by the EventBus prior to dispatching this event to any subscriber of this event.
+ */
+ void onPreDispatch() {
+ // Do nothing
+ }
+
+ /**
+ * Called by the EventBus after dispatching this event to every subscriber of this event.
+ */
+ void onPostDispatch() {
+ // Do nothing
+ }
+
@Override
protected Object clone() throws CloneNotSupportedException {
Event evt = (Event) super.clone();
@@ -230,6 +246,51 @@
}
/**
+ * An event that represents an animated state change, which allows subscribers to coordinate
+ * callbacks which happen after the animation has taken place.
+ *
+ * Internally, it is guaranteed that increment() and decrement() will be called before and the
+ * after the event is dispatched.
+ */
+ public static class AnimatedEvent extends Event {
+
+ private final ReferenceCountedTrigger mTrigger = new ReferenceCountedTrigger();
+
+ // Only accessible from derived events
+ protected AnimatedEvent() {}
+
+ /**
+ * Returns the reference counted trigger that coordinates the animations for this event.
+ */
+ public ReferenceCountedTrigger getAnimationTrigger() {
+ return mTrigger;
+ }
+
+ /**
+ * Adds a callback that is guaranteed to be called after the state has changed regardless of
+ * whether an actual animation took place.
+ */
+ public void addPostAnimationCallback(Runnable r) {
+ mTrigger.addLastDecrementRunnable(r);
+ }
+
+ @Override
+ void onPreDispatch() {
+ mTrigger.increment();
+ }
+
+ @Override
+ void onPostDispatch() {
+ mTrigger.decrement();
+ }
+
+ @Override
+ protected Object clone() throws CloneNotSupportedException {
+ throw new CloneNotSupportedException();
+ }
+ }
+
+ /**
* An inter-process event super class that allows us to track user state across subscriber
* invocations.
*/
@@ -706,6 +767,11 @@
if (eventHandlers == null) {
return;
}
+
+ // Prepare this event
+ boolean hasPostedEvent = false;
+ event.onPreDispatch();
+
// We need to clone the list in case a subscriber unregisters itself during traversal
eventHandlers = (ArrayList<EventHandler>) eventHandlers.clone();
for (final EventHandler eventHandler : eventHandlers) {
@@ -717,11 +783,24 @@
processEvent(eventHandler, event);
}
});
+ hasPostedEvent = true;
} else {
processEvent(eventHandler, event);
}
}
}
+
+ // Clean up after this event, deferring until all subscribers have been called
+ if (hasPostedEvent) {
+ mHandler.post(new Runnable() {
+ @Override
+ public void run() {
+ event.onPostDispatch();
+ }
+ });
+ } else {
+ event.onPostDispatch();
+ }
}
/**
diff --git a/packages/SystemUI/src/com/android/systemui/recents/events/activity/HideHistoryEvent.java b/packages/SystemUI/src/com/android/systemui/recents/events/activity/HideHistoryEvent.java
index 3412852..e85dea3 100644
--- a/packages/SystemUI/src/com/android/systemui/recents/events/activity/HideHistoryEvent.java
+++ b/packages/SystemUI/src/com/android/systemui/recents/events/activity/HideHistoryEvent.java
@@ -22,17 +22,11 @@
/**
* This is sent when the history view will be closed.
*/
-public class HideHistoryEvent extends EventBus.Event {
+public class HideHistoryEvent extends EventBus.AnimatedEvent {
public final boolean animate;
- public final ReferenceCountedTrigger postHideHistoryAnimationTrigger;
- /**
- * @param postHideHistoryAnimationTrigger the trigger that gets called when all the history animations are finished
- * when transitioning from the history view
- */
- public HideHistoryEvent(boolean animate, ReferenceCountedTrigger postHideHistoryAnimationTrigger) {
+ public HideHistoryEvent(boolean animate) {
this.animate = animate;
- this.postHideHistoryAnimationTrigger = postHideHistoryAnimationTrigger;
}
}
diff --git a/packages/SystemUI/src/com/android/systemui/recents/events/activity/ShowHistoryEvent.java b/packages/SystemUI/src/com/android/systemui/recents/events/activity/ShowHistoryEvent.java
index c91752e..94e5a97 100644
--- a/packages/SystemUI/src/com/android/systemui/recents/events/activity/ShowHistoryEvent.java
+++ b/packages/SystemUI/src/com/android/systemui/recents/events/activity/ShowHistoryEvent.java
@@ -22,15 +22,8 @@
/**
* This is sent when the history view button is clicked.
*/
-public class ShowHistoryEvent extends EventBus.Event {
+public class ShowHistoryEvent extends EventBus.AnimatedEvent {
- public final ReferenceCountedTrigger postHideStackAnimationTrigger;
+ // Simple event
- /**
- * @param postHideStackAnimationTrigger the trigger that gets called when all the task animations are finished when
- * transitioning to the history view
- */
- public ShowHistoryEvent(ReferenceCountedTrigger postHideStackAnimationTrigger) {
- this.postHideStackAnimationTrigger = postHideStackAnimationTrigger;
- }
}
diff --git a/packages/SystemUI/src/com/android/systemui/recents/events/ui/dragndrop/DragEndEvent.java b/packages/SystemUI/src/com/android/systemui/recents/events/ui/dragndrop/DragEndEvent.java
index 3deeb47..8aa4631 100644
--- a/packages/SystemUI/src/com/android/systemui/recents/events/ui/dragndrop/DragEndEvent.java
+++ b/packages/SystemUI/src/com/android/systemui/recents/events/ui/dragndrop/DragEndEvent.java
@@ -25,18 +25,15 @@
/**
* This event is sent whenever a drag ends.
*/
-public class DragEndEvent extends EventBus.Event {
+public class DragEndEvent extends EventBus.AnimatedEvent {
public final Task task;
public final TaskView taskView;
public final DropTarget dropTarget;
- public final ReferenceCountedTrigger postAnimationTrigger;
- public DragEndEvent(Task task, TaskView taskView, DropTarget dropTarget,
- ReferenceCountedTrigger postAnimationTrigger) {
+ public DragEndEvent(Task task, TaskView taskView, DropTarget dropTarget) {
this.task = task;
this.taskView = taskView;
this.dropTarget = dropTarget;
- this.postAnimationTrigger = postAnimationTrigger;
}
}
diff --git a/packages/SystemUI/src/com/android/systemui/recents/history/RecentsHistoryAdapter.java b/packages/SystemUI/src/com/android/systemui/recents/history/RecentsHistoryAdapter.java
index 76439c0..4ed01f6 100644
--- a/packages/SystemUI/src/com/android/systemui/recents/history/RecentsHistoryAdapter.java
+++ b/packages/SystemUI/src/com/android/systemui/recents/history/RecentsHistoryAdapter.java
@@ -313,10 +313,7 @@
* Dismisses history back to the stack view.
*/
private void dismissHistory() {
- ReferenceCountedTrigger t = new ReferenceCountedTrigger(mContext);
- t.increment();
- EventBus.getDefault().send(new HideHistoryEvent(true /* animate */, t));
- t.decrement();
+ EventBus.getDefault().send(new HideHistoryEvent(true /* animate */));
EventBus.getDefault().send(new HideHistoryButtonEvent());
}
}
diff --git a/packages/SystemUI/src/com/android/systemui/recents/misc/ReferenceCountedTrigger.java b/packages/SystemUI/src/com/android/systemui/recents/misc/ReferenceCountedTrigger.java
index b06539a..367f2e2 100644
--- a/packages/SystemUI/src/com/android/systemui/recents/misc/ReferenceCountedTrigger.java
+++ b/packages/SystemUI/src/com/android/systemui/recents/misc/ReferenceCountedTrigger.java
@@ -29,9 +29,6 @@
*/
public class ReferenceCountedTrigger {
- private static final String TAG = "ReferenceCountedTrigger";
-
- Context mContext;
int mCount;
ArrayList<Runnable> mFirstIncRunnables = new ArrayList<Runnable>();
ArrayList<Runnable> mLastDecRunnables = new ArrayList<Runnable>();
@@ -51,13 +48,12 @@
}
};
- public ReferenceCountedTrigger(Context context) {
- this(context, null, null, null);
+ public ReferenceCountedTrigger() {
+ this(null, null, null);
}
- public ReferenceCountedTrigger(Context context, Runnable firstIncRunnable,
- Runnable lastDecRunnable, Runnable errorRunanable) {
- mContext = context;
+ public ReferenceCountedTrigger(Runnable firstIncRunnable, Runnable lastDecRunnable,
+ Runnable errorRunanable) {
if (firstIncRunnable != null) mFirstIncRunnables.add(firstIncRunnable);
if (lastDecRunnable != null) mLastDecRunnables.add(lastDecRunnable);
mErrorRunnable = errorRunanable;
@@ -81,22 +77,14 @@
/** Adds a runnable to the last-decrement runnables list. */
public void addLastDecrementRunnable(Runnable r) {
- // To ensure that the last decrement always calls, we increment and decrement after setting
- // the last decrement runnable
- boolean ensureLastDecrement = (mCount == 0);
- if (ensureLastDecrement) increment();
mLastDecRunnables.add(r);
- if (ensureLastDecrement) decrement();
}
/** Decrements the ref count */
public void decrement() {
mCount--;
- if (mCount == 0 && !mLastDecRunnables.isEmpty()) {
- int numRunnables = mLastDecRunnables.size();
- for (int i = 0; i < numRunnables; i++) {
- mLastDecRunnables.get(i).run();
- }
+ if (mCount == 0) {
+ flushLastDecrementRunnables();
} else if (mCount < 0) {
if (mErrorRunnable != null) {
mErrorRunnable.run();
@@ -106,6 +94,19 @@
}
}
+ /**
+ * Runs and clears all the last-decrement runnables now.
+ */
+ public void flushLastDecrementRunnables() {
+ if (!mLastDecRunnables.isEmpty()) {
+ int numRunnables = mLastDecRunnables.size();
+ for (int i = 0; i < numRunnables; i++) {
+ mLastDecRunnables.get(i).run();
+ }
+ }
+ mLastDecRunnables.clear();
+ }
+
/** Convenience method to decrement this trigger as a runnable. */
public Runnable decrementAsRunnable() {
return mDecrementRunnable;
diff --git a/packages/SystemUI/src/com/android/systemui/recents/views/RecentsView.java b/packages/SystemUI/src/com/android/systemui/recents/views/RecentsView.java
index 53c02cb..9b1315a 100644
--- a/packages/SystemUI/src/com/android/systemui/recents/views/RecentsView.java
+++ b/packages/SystemUI/src/com/android/systemui/recents/views/RecentsView.java
@@ -132,10 +132,7 @@
mHistoryButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
- ReferenceCountedTrigger postHideStackAnimationTrigger = new ReferenceCountedTrigger(v.getContext());
- postHideStackAnimationTrigger.increment();
- EventBus.getDefault().send(new ShowHistoryEvent(postHideStackAnimationTrigger));
- postHideStackAnimationTrigger.decrement();
+ EventBus.getDefault().send(new ShowHistoryEvent());
}
});
addView(mHistoryButton);
@@ -576,8 +573,8 @@
public final void onBusEvent(ShowHistoryEvent event) {
// Hide the history button when the history view is shown
hideHistoryButton(getResources().getInteger(R.integer.recents_history_transition_duration),
- event.postHideStackAnimationTrigger);
- event.postHideStackAnimationTrigger.addLastDecrementRunnable(new Runnable() {
+ event.getAnimationTrigger());
+ event.addPostAnimationCallback(new Runnable() {
@Override
public void run() {
setAlpha(0f);
@@ -589,7 +586,7 @@
// Show the history button when the history view is hidden
setAlpha(1f);
showHistoryButton(getResources().getInteger(R.integer.recents_history_transition_duration),
- event.postHideHistoryAnimationTrigger);
+ event.getAnimationTrigger());
}
public final void onBusEvent(ShowHistoryButtonEvent event) {
@@ -609,10 +606,9 @@
* Shows the history button.
*/
private void showHistoryButton(final int duration) {
- ReferenceCountedTrigger postAnimationTrigger = new ReferenceCountedTrigger(getContext());
- postAnimationTrigger.increment();
+ ReferenceCountedTrigger postAnimationTrigger = new ReferenceCountedTrigger();
showHistoryButton(duration, postAnimationTrigger);
- postAnimationTrigger.decrement();
+ postAnimationTrigger.flushLastDecrementRunnables();
}
private void showHistoryButton(final int duration,
@@ -638,10 +634,9 @@
* Hides the history button.
*/
private void hideHistoryButton(int duration) {
- ReferenceCountedTrigger postAnimationTrigger = new ReferenceCountedTrigger(getContext());
- postAnimationTrigger.increment();
+ ReferenceCountedTrigger postAnimationTrigger = new ReferenceCountedTrigger();
hideHistoryButton(duration, postAnimationTrigger);
- postAnimationTrigger.decrement();
+ postAnimationTrigger.flushLastDecrementRunnables();
}
private void hideHistoryButton(int duration,
diff --git a/packages/SystemUI/src/com/android/systemui/recents/views/RecentsViewTouchHandler.java b/packages/SystemUI/src/com/android/systemui/recents/views/RecentsViewTouchHandler.java
index 37a0194..318801d 100644
--- a/packages/SystemUI/src/com/android/systemui/recents/views/RecentsViewTouchHandler.java
+++ b/packages/SystemUI/src/com/android/systemui/recents/views/RecentsViewTouchHandler.java
@@ -188,12 +188,8 @@
case MotionEvent.ACTION_UP:
case MotionEvent.ACTION_CANCEL: {
if (mDragging) {
- ReferenceCountedTrigger postAnimationTrigger = new ReferenceCountedTrigger(
- mRv.getContext());
- postAnimationTrigger.increment();
EventBus.getDefault().send(new DragEndEvent(mDragTask, mTaskView,
- mLastDropTarget, postAnimationTrigger));
- postAnimationTrigger.decrement();
+ mLastDropTarget));
break;
}
}
diff --git a/packages/SystemUI/src/com/android/systemui/recents/views/TaskStackView.java b/packages/SystemUI/src/com/android/systemui/recents/views/TaskStackView.java
index 421e6a0..6770f29 100644
--- a/packages/SystemUI/src/com/android/systemui/recents/views/TaskStackView.java
+++ b/packages/SystemUI/src/com/android/systemui/recents/views/TaskStackView.java
@@ -1495,7 +1495,6 @@
(!isFreeformTask && event.dropTarget == mFreeformWorkspaceDropTarget) ||
(isFreeformTask && event.dropTarget == mStackDropTarget);
- event.postAnimationTrigger.increment();
if (hasChangedStacks) {
// Move the task to the right position in the stack (ie. the front of the stack if
// freeform or the front of the stack if fullscreen). Note, we MUST move the tasks
@@ -1508,7 +1507,7 @@
updateLayout(true);
// Move the task to the new stack in the system after the animation completes
- event.postAnimationTrigger.addLastDecrementRunnable(new Runnable() {
+ event.addPostAnimationCallback(new Runnable() {
@Override
public void run() {
SystemServicesProxy ssp = Recents.getSystemServices();
@@ -1516,8 +1515,8 @@
}
});
}
- event.taskView.animate()
- .withEndAction(event.postAnimationTrigger.decrementAsRunnable());
+ event.getAnimationTrigger().increment();
+ event.taskView.animate().withEndAction(event.getAnimationTrigger().decrementAsRunnable());
// We translated the view but we need to animate it back from the current layout-space rect
// to its final layout-space rect
@@ -1578,9 +1577,9 @@
.setUpdateListener(null)
.setListener(null)
.withLayer()
- .withEndAction(event.postHideStackAnimationTrigger.decrementAsRunnable())
+ .withEndAction(event.getAnimationTrigger().decrementAsRunnable())
.start();
- event.postHideStackAnimationTrigger.increment();
+ event.getAnimationTrigger().increment();
}
}
@@ -1593,7 +1592,7 @@
int taskViewCount = taskViews.size();
for (int i = taskViewCount - 1; i >= 0; i--) {
final TaskView tv = taskViews.get(i);
- event.postHideHistoryAnimationTrigger.addLastDecrementRunnable(new Runnable() {
+ event.addPostAnimationCallback(new Runnable() {
@Override
public void run() {
tv.animate()
diff --git a/packages/SystemUI/src/com/android/systemui/recents/views/TaskView.java b/packages/SystemUI/src/com/android/systemui/recents/views/TaskView.java
index df7b9a6..691a17d 100644
--- a/packages/SystemUI/src/com/android/systemui/recents/views/TaskView.java
+++ b/packages/SystemUI/src/com/android/systemui/recents/views/TaskView.java
@@ -771,7 +771,7 @@
public final void onBusEvent(DragEndEvent event) {
if (!(event.dropTarget instanceof TaskStack.DockState)) {
- event.postAnimationTrigger.addLastDecrementRunnable(new Runnable() {
+ event.addPostAnimationCallback(new Runnable() {
@Override
public void run() {
// Animate the drag view back from where it is, to the view location, then after