Merge "Cancelling touch interaction on multi-touch event" into ub-launcher3-qt-dev
diff --git a/quickstep/recents_ui_overrides/src/com/android/quickstep/SwipeSharedState.java b/quickstep/recents_ui_overrides/src/com/android/quickstep/SwipeSharedState.java
index 194d073..5a039cd 100644
--- a/quickstep/recents_ui_overrides/src/com/android/quickstep/SwipeSharedState.java
+++ b/quickstep/recents_ui_overrides/src/com/android/quickstep/SwipeSharedState.java
@@ -22,6 +22,7 @@
 import com.android.quickstep.util.RecentsAnimationListenerSet;
 import com.android.quickstep.util.SwipeAnimationTargetSet;
 import com.android.quickstep.util.SwipeAnimationTargetSet.SwipeAnimationListener;
+import java.io.PrintWriter;
 
 /**
  * Utility class used to store state information shared across multiple transitions.
@@ -134,4 +135,13 @@
         nextRunningTaskId = -1;
         goingToLauncher = false;
     }
+
+    public void dump(String prefix, PrintWriter pw) {
+        pw.println(prefix + "goingToLauncher=" + goingToLauncher);
+        pw.println(prefix + "canGestureBeContinued=" + canGestureBeContinued);
+        pw.println(prefix + "recentsAnimationFinishInterrupted=" + recentsAnimationFinishInterrupted);
+        pw.println(prefix + "nextRunningTaskId=" + nextRunningTaskId);
+        pw.println(prefix + "lastAnimationCancelled=" + mLastAnimationCancelled);
+        pw.println(prefix + "lastAnimationRunning=" + mLastAnimationRunning);
+    }
 }
diff --git a/quickstep/recents_ui_overrides/src/com/android/quickstep/TaskSystemShortcut.java b/quickstep/recents_ui_overrides/src/com/android/quickstep/TaskSystemShortcut.java
index 2c919b3..213c5d3 100644
--- a/quickstep/recents_ui_overrides/src/com/android/quickstep/TaskSystemShortcut.java
+++ b/quickstep/recents_ui_overrides/src/com/android/quickstep/TaskSystemShortcut.java
@@ -226,7 +226,7 @@
             // TODO(b/118266305): Temporarily disable splitscreen for secondary display while new
             // implementation is enabled
             return !activity.getDeviceProfile().isMultiWindowMode
-                    && displayId == DEFAULT_DISPLAY;
+                    && (displayId == -1 || displayId == DEFAULT_DISPLAY);
         }
 
         @Override
diff --git a/quickstep/recents_ui_overrides/src/com/android/quickstep/TouchInteractionService.java b/quickstep/recents_ui_overrides/src/com/android/quickstep/TouchInteractionService.java
index c0e7871..0fd74bb 100644
--- a/quickstep/recents_ui_overrides/src/com/android/quickstep/TouchInteractionService.java
+++ b/quickstep/recents_ui_overrides/src/com/android/quickstep/TouchInteractionService.java
@@ -84,9 +84,32 @@
 import java.io.FileDescriptor;
 import java.io.PrintWriter;
 import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.LinkedList;
 import java.util.List;
 
 /**
+ * Wrapper around a list for processing arguments.
+ */
+class ArgList extends LinkedList<String> {
+    public ArgList(List<String> l) {
+        super(l);
+    }
+
+    public String peekArg() {
+        return peekFirst();
+    }
+
+    public String nextArg() {
+        return pollFirst().toLowerCase();
+    }
+
+    public String nextArgExact() {
+        return pollFirst();
+    }
+}
+
+/**
  * Service connected by system-UI for handling touch interaction.
  */
 @TargetApi(Build.VERSION_CODES.Q)
@@ -439,12 +462,18 @@
         mUncheckedConsumer.onMotionEvent(event);
     }
 
+    private boolean validSystemUiFlags() {
+        return (mSystemUiStateFlags & SYSUI_STATE_NAV_BAR_HIDDEN) == 0
+                && (mSystemUiStateFlags & SYSUI_STATE_NOTIFICATION_PANEL_EXPANDED) == 0;
+    }
+
+    private boolean topTaskLocked() {
+        return ActivityManagerWrapper.getInstance().isLockToAppActive();
+    }
 
     private InputConsumer newConsumer(boolean useSharedState, MotionEvent event) {
-        boolean validSystemUIFlags = (mSystemUiStateFlags & SYSUI_STATE_NAV_BAR_HIDDEN) == 0
-                && (mSystemUiStateFlags & SYSUI_STATE_NOTIFICATION_PANEL_EXPANDED) == 0;
-        boolean topTaskLocked = ActivityManagerWrapper.getInstance().isLockToAppActive();
-        boolean isInValidSystemUiState = validSystemUIFlags && !topTaskLocked;
+        boolean topTaskLocked = topTaskLocked();
+        boolean isInValidSystemUiState = validSystemUiFlags() && !topTaskLocked;
 
         if (!mIsUserUnlocked) {
             if (isInValidSystemUiState) {
@@ -540,7 +569,55 @@
     }
 
     @Override
-    protected void dump(FileDescriptor fd, PrintWriter pw, String[] args) {
-        TOUCH_INTERACTION_LOG.dump("", pw);
+    protected void dump(FileDescriptor fd, PrintWriter pw, String[] rawArgs) {
+        if (rawArgs.length > 0 && Utilities.IS_DEBUG_DEVICE) {
+            ArgList args = new ArgList(Arrays.asList(rawArgs));
+            switch (args.nextArg()) {
+                case "cmd":
+                    if (args.peekArg() == null) {
+                        printAvailableCommands(pw);
+                    } else {
+                        onCommand(pw, args);
+                    }
+                    break;
+            }
+        } else {
+            // Dump everything
+            pw.println("TouchState:");
+            pw.println("  navMode=" + mMode);
+            pw.println("  validSystemUiFlags=" + validSystemUiFlags()
+                    + " flags=" + mSystemUiStateFlags);
+            pw.println("  topTaskLocked=" + topTaskLocked());
+            pw.println("  isDeviceLocked=" + mKM.isDeviceLocked());
+            pw.println("  screenPinned=" +
+                    ActivityManagerWrapper.getInstance().isScreenPinningActive());
+            pw.println("  assistantAvailable=" + mAssistantAvailable);
+            pw.println("  a11yClickable="
+                    + ((mSystemUiStateFlags & SYSUI_STATE_A11Y_BUTTON_CLICKABLE) != 0));
+            pw.println("  a11yLongClickable="
+                    + ((mSystemUiStateFlags & SYSUI_STATE_A11Y_BUTTON_LONG_CLICKABLE) != 0));
+            pw.println("  resumed="
+                    + mOverviewComponentObserver.getActivityControlHelper().isResumed());
+            pw.println("  useSharedState=" + mConsumer.useSharedSwipeState());
+            if (mConsumer.useSharedSwipeState()) {
+                mSwipeSharedState.dump("    ", pw);
+            }
+            pw.println("  mConsumer=" + mConsumer.getName());
+            TOUCH_INTERACTION_LOG.dump("", pw);
+
+        }
+    }
+
+    private void printAvailableCommands(PrintWriter pw) {
+        pw.println("Available commands:");
+        pw.println("  clear-touch-log: Clears the touch interaction log");
+    }
+
+    private void onCommand(PrintWriter pw, ArgList args) {
+        switch (args.nextArg()) {
+            case "clear-touch-log":
+                TOUCH_INTERACTION_LOG.clear();
+                break;
+        }
     }
 }
diff --git a/quickstep/recents_ui_overrides/src/com/android/quickstep/inputconsumers/InputConsumer.java b/quickstep/recents_ui_overrides/src/com/android/quickstep/inputconsumers/InputConsumer.java
index 2e8880d..6e7cb8f 100644
--- a/quickstep/recents_ui_overrides/src/com/android/quickstep/inputconsumers/InputConsumer.java
+++ b/quickstep/recents_ui_overrides/src/com/android/quickstep/inputconsumers/InputConsumer.java
@@ -63,4 +63,23 @@
             onKeyEvent((KeyEvent) ev);
         }
     }
+
+    default String getName() {
+        switch (getType()) {
+            case TYPE_OVERVIEW:
+                return "OVERVIEW";
+            case TYPE_OTHER_ACTIVITY:
+                return "OTHER_ACTIVITY";
+            case TYPE_ASSISTANT:
+                return "ASSISTANT";
+            case TYPE_DEVICE_LOCKED:
+                return "DEVICE_LOCKED";
+            case TYPE_ACCESSIBILITY:
+                return "ACCESSIBILITY";
+            case TYPE_SCREEN_PINNED:
+                return "SCREEN_PINNED";
+            default:
+                return "NO_OP";
+        }
+    }
 }
diff --git a/src/com/android/launcher3/logging/EventLogArray.java b/src/com/android/launcher3/logging/EventLogArray.java
index bfb3792..f20f365 100644
--- a/src/com/android/launcher3/logging/EventLogArray.java
+++ b/src/com/android/launcher3/logging/EventLogArray.java
@@ -18,6 +18,7 @@
 
 import java.io.PrintWriter;
 import java.text.SimpleDateFormat;
+import java.util.Arrays;
 import java.util.Date;
 import java.util.Locale;
 
@@ -76,8 +77,12 @@
         nextIndex = (nextIndex + 1) % logs.length;
     }
 
+    public void clear() {
+        Arrays.setAll(logs, (i) -> null);
+    }
+
     public void dump(String prefix, PrintWriter writer) {
-        writer.println(prefix + name + " event history:");
+        writer.println(prefix + "EventLog (" + name + ") history:");
         SimpleDateFormat sdf = new SimpleDateFormat("  HH:mm:ss.SSSZ  ", Locale.US);
         Date date = new Date();