From 5c86b5d9cd4543e6d04f8ef7fb1ba8f1c881c7ff Mon Sep 17 00:00:00 2001 From: Sunny Goyal Date: Thu, 22 Feb 2018 11:14:18 -0800 Subject: [PATCH] Synchronizing invalidating interaction handler with the eventQueue. In some cases, eventQueue could be running on the background thread where as the invalidate happens on the UI thread, which could cause race conditions in touch consumer Change-Id: Iebd84238eb2b5d6774beaa3bc21afdeb09e62561 --- .../quickstep/BaseSwipeInteractionHandler.java | 6 ++---- .../quickstep/NavBarSwipeInteractionHandler.java | 2 +- .../quickstep/OtherActivityTouchConsumer.java | 15 ++++++--------- .../quickstep/WindowTransformSwipeHandler.java | 2 +- 4 files changed, 10 insertions(+), 15 deletions(-) diff --git a/quickstep/src/com/android/quickstep/BaseSwipeInteractionHandler.java b/quickstep/src/com/android/quickstep/BaseSwipeInteractionHandler.java index 5bf7e4ec90..b3ebd772cc 100644 --- a/quickstep/src/com/android/quickstep/BaseSwipeInteractionHandler.java +++ b/quickstep/src/com/android/quickstep/BaseSwipeInteractionHandler.java @@ -20,13 +20,11 @@ import android.support.annotation.WorkerThread; import com.android.launcher3.states.InternalStateHandler; import com.android.quickstep.TouchConsumer.InteractionType; -import java.util.function.Consumer; - public abstract class BaseSwipeInteractionHandler extends InternalStateHandler { - protected Consumer mGestureEndCallback; + protected Runnable mGestureEndCallback; - public void setGestureEndCallback(Consumer gestureEndCallback) { + public void setGestureEndCallback(Runnable gestureEndCallback) { mGestureEndCallback = gestureEndCallback; } diff --git a/quickstep/src/com/android/quickstep/NavBarSwipeInteractionHandler.java b/quickstep/src/com/android/quickstep/NavBarSwipeInteractionHandler.java index ae70474c0d..ff7d434e7f 100644 --- a/quickstep/src/com/android/quickstep/NavBarSwipeInteractionHandler.java +++ b/quickstep/src/com/android/quickstep/NavBarSwipeInteractionHandler.java @@ -347,7 +347,7 @@ public class NavBarSwipeInteractionHandler extends BaseSwipeInteractionHandler i public void reset() { mCurrentShift.cancelAnimation(); if (mGestureEndCallback != null) { - mGestureEndCallback.accept(this); + mGestureEndCallback.run(); } } diff --git a/quickstep/src/com/android/quickstep/OtherActivityTouchConsumer.java b/quickstep/src/com/android/quickstep/OtherActivityTouchConsumer.java index 604b60b90d..786ade38bd 100644 --- a/quickstep/src/com/android/quickstep/OtherActivityTouchConsumer.java +++ b/quickstep/src/com/android/quickstep/OtherActivityTouchConsumer.java @@ -230,6 +230,9 @@ public class OtherActivityTouchConsumer extends ContextWrapper implements TouchC } private void notifyGestureStarted() { + if (mInteractionHandler == null) { + return; + } // Notify the handler that the gesture has actually started mInteractionHandler.onGestureStarted(); @@ -275,7 +278,7 @@ public class OtherActivityTouchConsumer extends ContextWrapper implements TouchC // Preload the plan mRecentsModel.loadTasks(mRunningTask.id, null); mInteractionHandler = handler; - mInteractionHandler.setGestureEndCallback(this::onFinish); + mInteractionHandler.setGestureEndCallback(mEventQueue::reset); } private Bitmap getCurrentTaskSnapshot() { @@ -314,7 +317,7 @@ public class OtherActivityTouchConsumer extends ContextWrapper implements TouchC // Preload the plan mRecentsModel.loadTasks(mRunningTask.id, null); mInteractionHandler = handler; - handler.setGestureEndCallback(this::onFinish); + handler.setGestureEndCallback(mEventQueue::reset); CountDownLatch drawWaitLock = new CountDownLatch(1); handler.setLauncherOnDrawCallback(() -> { @@ -408,8 +411,8 @@ public class OtherActivityTouchConsumer extends ContextWrapper implements TouchC // Clean up the old interaction handler if (mInteractionHandler != null) { final BaseSwipeInteractionHandler handler = mInteractionHandler; - mMainThreadExecutor.execute(handler::reset); mInteractionHandler = null; + mMainThreadExecutor.execute(handler::reset); } } @@ -450,12 +453,6 @@ public class OtherActivityTouchConsumer extends ContextWrapper implements TouchC } } - private void onFinish(BaseSwipeInteractionHandler handler) { - if (mInteractionHandler == handler) { - mInteractionHandler = null; - } - } - public void switchToMainChoreographer() { mEventQueue.setInterimChoreographer(null); } diff --git a/quickstep/src/com/android/quickstep/WindowTransformSwipeHandler.java b/quickstep/src/com/android/quickstep/WindowTransformSwipeHandler.java index ac253c70d9..a6192c2f50 100644 --- a/quickstep/src/com/android/quickstep/WindowTransformSwipeHandler.java +++ b/quickstep/src/com/android/quickstep/WindowTransformSwipeHandler.java @@ -688,7 +688,7 @@ public class WindowTransformSwipeHandler extends BaseSwipeInteractionHandler { mCurrentShift.cancelAnimation(); if (mGestureEndCallback != null) { - mGestureEndCallback.accept(this); + mGestureEndCallback.run(); } clearReference();