OSDN Git Service

Log various types of back gesture using StatsLog
authorHyunyoung Song <hyunyoungs@google.com>
Tue, 6 Aug 2019 00:19:54 +0000 (17:19 -0700)
committerHyunyoung Song <hyunyoungs@google.com>
Fri, 9 Aug 2019 05:40:27 +0000 (22:40 -0700)
Bug: 135152789
Test: m statsd_testdrive -j31
Test: out/host/linux-x86/bin/statsd_testdrive 224

<Verified all four types of back gesture>
  data {
    elapsed_timestamp_nanos: 113275964369614
    atom {
      back_gesture_reported_reported {
        type: INCOMPLETE
        y_coordinate: 900
        x_location: LEFT
      }
    }
  }
  data {
    elapsed_timestamp_nanos: 113281680894558
    atom {
      back_gesture_reported_reported {
        type: COMPLETED
        y_coordinate: 912
        x_location: LEFT
      }
    }
  }
  data {
    elapsed_timestamp_nanos: 113285878610809
    atom {
      back_gesture_reported_reported {
        type: INCOMPLETE_EXCLUDED
        y_coordinate: 2496
        x_location: LEFT
      }
    }
  }
  data {
    elapsed_timestamp_nanos: 39490430338
    atom {
      back_gesture_reported_reported {
        type: COMPLETED_REJECTED
        y_coordinate: 856
        x_location: LEFT
      }
    }
  }

Change-Id: I986a64c296cc2a1e33db8f7ea81b05b0ee96cdd5

packages/SystemUI/src/com/android/systemui/statusbar/phone/EdgeBackGestureHandler.java

index e0c6c55..74ecbe1 100644 (file)
@@ -33,6 +33,7 @@ import android.os.RemoteException;
 import android.os.SystemClock;
 import android.util.Log;
 import android.util.MathUtils;
+import android.util.StatsLog;
 import android.view.Gravity;
 import android.view.IPinnedStackController;
 import android.view.IPinnedStackListener;
@@ -105,7 +106,11 @@ public class EdgeBackGestureHandler implements DisplayListener {
                 public void onSystemGestureExclusionChanged(int displayId,
                         Region systemGestureExclusion, Region unrestrictedOrNull) {
                     if (displayId == mDisplayId) {
-                        mMainExecutor.execute(() -> mExcludeRegion.set(systemGestureExclusion));
+                        mMainExecutor.execute(() -> {
+                            mExcludeRegion.set(systemGestureExclusion);
+                            mUnrestrictedExcludeRegion.set(unrestrictedOrNull != null
+                                    ? unrestrictedOrNull : systemGestureExclusion);
+                        });
                     }
                 }
             };
@@ -119,6 +124,8 @@ public class EdgeBackGestureHandler implements DisplayListener {
     private final Executor mMainExecutor;
 
     private final Region mExcludeRegion = new Region();
+    private final Region mUnrestrictedExcludeRegion = new Region();
+
     // The edge width where touch down is allowed
     private int mEdgeWidth;
     // The slop to distinguish between horizontal and vertical motion
@@ -137,6 +144,7 @@ public class EdgeBackGestureHandler implements DisplayListener {
     private final PointF mDownPoint = new PointF();
     private boolean mThresholdCrossed = false;
     private boolean mAllowGesture = false;
+    private boolean mInRejectedExclusion = false;
     private boolean mIsOnLeftEdge;
 
     private int mImeHeight = 0;
@@ -316,6 +324,12 @@ public class EdgeBackGestureHandler implements DisplayListener {
         if (isInExcludedRegion) {
             mOverviewProxyService.notifyBackAction(false /* completed */, -1, -1,
                     false /* isButton */, !mIsOnLeftEdge);
+            StatsLog.write(StatsLog.BACK_GESTURE_REPORTED_REPORTED,
+                    StatsLog.BACK_GESTURE__TYPE__INCOMPLETE_EXCLUDED, y,
+                    mIsOnLeftEdge ? StatsLog.BACK_GESTURE__X_LOCATION__LEFT :
+                            StatsLog.BACK_GESTURE__X_LOCATION__RIGHT);
+        } else {
+            mInRejectedExclusion = mUnrestrictedExcludeRegion.contains(x, y);
         }
         return !isInExcludedRegion;
     }
@@ -323,6 +337,7 @@ public class EdgeBackGestureHandler implements DisplayListener {
     private void cancelGesture(MotionEvent ev) {
         // Send action cancel to reset all the touch events
         mAllowGesture = false;
+        mInRejectedExclusion = false;
         MotionEvent cancelEv = MotionEvent.obtain(ev);
         cancelEv.setAction(MotionEvent.ACTION_CANCEL);
         mEdgePanel.handleTouch(cancelEv);
@@ -336,6 +351,7 @@ public class EdgeBackGestureHandler implements DisplayListener {
             // either the bouncer is showing or the notification panel is hidden
             int stateFlags = mOverviewProxyService.getSystemUiStateFlags();
             mIsOnLeftEdge = ev.getX() <= mEdgeWidth + mLeftInset;
+            mInRejectedExclusion = false;
             mAllowGesture = !QuickStepContract.isBackGestureDisabled(stateFlags)
                     && isWithinTouchRegion((int) ev.getX(), (int) ev.getY());
             if (mAllowGesture) {
@@ -390,6 +406,14 @@ public class EdgeBackGestureHandler implements DisplayListener {
                 }
                 mOverviewProxyService.notifyBackAction(performAction, (int) mDownPoint.x,
                         (int) mDownPoint.y, false /* isButton */, !mIsOnLeftEdge);
+                int backtype = performAction ? (mInRejectedExclusion
+                        ? StatsLog.BACK_GESTURE__TYPE__COMPLETED_REJECTED :
+                                StatsLog.BACK_GESTURE__TYPE__COMPLETED) :
+                                        StatsLog.BACK_GESTURE__TYPE__INCOMPLETE;
+                StatsLog.write(StatsLog.BACK_GESTURE_REPORTED_REPORTED, backtype,
+                        (int) mDownPoint.y, mIsOnLeftEdge
+                                ? StatsLog.BACK_GESTURE__X_LOCATION__LEFT :
+                                StatsLog.BACK_GESTURE__X_LOCATION__RIGHT);
             }
             if (isUp || action == MotionEvent.ACTION_CANCEL) {
                 mRegionSamplingHelper.stop();
@@ -461,7 +485,9 @@ public class EdgeBackGestureHandler implements DisplayListener {
         pw.println("EdgeBackGestureHandler:");
         pw.println("  mIsEnabled=" + mIsEnabled);
         pw.println("  mAllowGesture=" + mAllowGesture);
+        pw.println("  mInRejectedExclusion" + mInRejectedExclusion);
         pw.println("  mExcludeRegion=" + mExcludeRegion);
+        pw.println("  mUnrestrictedExcludeRegion=" + mUnrestrictedExcludeRegion);
         pw.println("  mImeHeight=" + mImeHeight);
         pw.println("  mIsAttached=" + mIsAttached);
         pw.println("  mEdgeWidth=" + mEdgeWidth);