Merge "Add a Shade log buffer and lots of logging to QS expand touches" into tm-qpr-dev

This commit is contained in:
Justin Weir
2022-08-21 13:12:41 +00:00
committed by Android (Google) Code Review
6 changed files with 133 additions and 14 deletions

View File

@@ -84,6 +84,14 @@ public class LogModule {
return factory.create("LSShadeTransitionLog", 50); return factory.create("LSShadeTransitionLog", 50);
} }
/** Provides a logging buffer for Shade messages. */
@Provides
@SysUISingleton
@ShadeLog
public static LogBuffer provideShadeLogBuffer(LogBufferFactory factory) {
return factory.create("ShadeLog", 500, false);
}
/** Provides a logging buffer for all logs related to managing notification sections. */ /** Provides a logging buffer for all logs related to managing notification sections. */
@Provides @Provides
@SysUISingleton @SysUISingleton

View File

@@ -0,0 +1,33 @@
/*
* Copyright (C) 2022 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.android.systemui.log.dagger;
import static java.lang.annotation.RetentionPolicy.RUNTIME;
import com.android.systemui.log.LogBuffer;
import java.lang.annotation.Documented;
import java.lang.annotation.Retention;
import javax.inject.Qualifier;
/** A {@link LogBuffer} for Shade touch handling messages. */
@Qualifier
@Documented
@Retention(RUNTIME)
public @interface ShadeLog {
}

View File

@@ -448,7 +448,6 @@ public final class NotificationPanelViewController extends PanelViewController {
*/ */
private boolean mQsAnimatorExpand; private boolean mQsAnimatorExpand;
private boolean mIsLaunchTransitionFinished; private boolean mIsLaunchTransitionFinished;
private boolean mOnlyAffordanceInThisMotion;
private ValueAnimator mQsSizeChangeAnimator; private ValueAnimator mQsSizeChangeAnimator;
private boolean mQsScrimEnabled = true; private boolean mQsScrimEnabled = true;
@@ -726,6 +725,7 @@ public final class NotificationPanelViewController extends PanelViewController {
AccessibilityManager accessibilityManager, @DisplayId int displayId, AccessibilityManager accessibilityManager, @DisplayId int displayId,
KeyguardUpdateMonitor keyguardUpdateMonitor, KeyguardUpdateMonitor keyguardUpdateMonitor,
MetricsLogger metricsLogger, MetricsLogger metricsLogger,
ShadeLogger shadeLogger,
ConfigurationController configurationController, ConfigurationController configurationController,
Provider<FlingAnimationUtils.Builder> flingAnimationUtilsBuilder, Provider<FlingAnimationUtils.Builder> flingAnimationUtilsBuilder,
StatusBarTouchableRegionManager statusBarTouchableRegionManager, StatusBarTouchableRegionManager statusBarTouchableRegionManager,
@@ -792,6 +792,7 @@ public final class NotificationPanelViewController extends PanelViewController {
panelExpansionStateManager, panelExpansionStateManager,
ambientState, ambientState,
interactionJankMonitor, interactionJankMonitor,
shadeLogger,
systemClock); systemClock);
mView = view; mView = view;
mVibratorHelper = vibratorHelper; mVibratorHelper = vibratorHelper;
@@ -1887,6 +1888,8 @@ public final class NotificationPanelViewController extends PanelViewController {
} }
if (mQsExpansionAnimator != null) { if (mQsExpansionAnimator != null) {
mInitialHeightOnTouch = mQsExpansionHeight; mInitialHeightOnTouch = mQsExpansionHeight;
mShadeLog.logMotionEvent(event,
"onQsIntercept: down action, QS tracking enabled");
mQsTracking = true; mQsTracking = true;
traceQsJank(true /* startTracing */, false /* wasCancelled */); traceQsJank(true /* startTracing */, false /* wasCancelled */);
mNotificationStackScrollLayoutController.cancelLongPress(); mNotificationStackScrollLayoutController.cancelLongPress();
@@ -1914,12 +1917,16 @@ public final class NotificationPanelViewController extends PanelViewController {
setQsExpansion(h + mInitialHeightOnTouch); setQsExpansion(h + mInitialHeightOnTouch);
trackMovement(event); trackMovement(event);
return true; return true;
} else {
mShadeLog.logMotionEvent(event,
"onQsIntercept: move ignored because qs tracking disabled");
} }
if ((h > getTouchSlop(event) || (h < -getTouchSlop(event) && mQsExpanded)) if ((h > getTouchSlop(event) || (h < -getTouchSlop(event) && mQsExpanded))
&& Math.abs(h) > Math.abs(x - mInitialTouchX) && Math.abs(h) > Math.abs(x - mInitialTouchX)
&& shouldQuickSettingsIntercept(mInitialTouchX, mInitialTouchY, h)) { && shouldQuickSettingsIntercept(mInitialTouchX, mInitialTouchY, h)) {
if (DEBUG_LOGCAT) Log.d(TAG, "onQsIntercept - start tracking expansion"); if (DEBUG_LOGCAT) Log.d(TAG, "onQsIntercept - start tracking expansion");
mView.getParent().requestDisallowInterceptTouchEvent(true); mView.getParent().requestDisallowInterceptTouchEvent(true);
mShadeLog.onQsInterceptMoveQsTrackingEnabled(h);
mQsTracking = true; mQsTracking = true;
traceQsJank(true /* startTracing */, false /* wasCancelled */); traceQsJank(true /* startTracing */, false /* wasCancelled */);
onQsExpansionStarted(); onQsExpansionStarted();
@@ -1935,6 +1942,7 @@ public final class NotificationPanelViewController extends PanelViewController {
case MotionEvent.ACTION_CANCEL: case MotionEvent.ACTION_CANCEL:
case MotionEvent.ACTION_UP: case MotionEvent.ACTION_UP:
trackMovement(event); trackMovement(event);
mShadeLog.logMotionEvent(event, "onQsIntercept: up action, QS tracking disabled");
mQsTracking = false; mQsTracking = false;
break; break;
} }
@@ -1972,7 +1980,6 @@ public final class NotificationPanelViewController extends PanelViewController {
private void initDownStates(MotionEvent event) { private void initDownStates(MotionEvent event) {
if (event.getActionMasked() == MotionEvent.ACTION_DOWN) { if (event.getActionMasked() == MotionEvent.ACTION_DOWN) {
mOnlyAffordanceInThisMotion = false;
mQsTouchAboveFalsingThreshold = mQsFullyExpanded; mQsTouchAboveFalsingThreshold = mQsFullyExpanded;
mDozingOnDown = isDozing(); mDozingOnDown = isDozing();
mDownX = event.getX(); mDownX = event.getX();
@@ -2111,6 +2118,7 @@ public final class NotificationPanelViewController extends PanelViewController {
&& collapsedQs && isQsExpansionEnabled(); && collapsedQs && isQsExpansionEnabled();
if (action == MotionEvent.ACTION_DOWN && expandedShadeCollapsedQs) { if (action == MotionEvent.ACTION_DOWN && expandedShadeCollapsedQs) {
// Down in the empty area while fully expanded - go to QS. // Down in the empty area while fully expanded - go to QS.
mShadeLog.logMotionEvent(event, "handleQsTouch: down action, QS tracking enabled");
mQsTracking = true; mQsTracking = true;
traceQsJank(true /* startTracing */, false /* wasCancelled */); traceQsJank(true /* startTracing */, false /* wasCancelled */);
mConflictingQsExpansionGesture = true; mConflictingQsExpansionGesture = true;
@@ -2125,6 +2133,8 @@ public final class NotificationPanelViewController extends PanelViewController {
if (!mQsExpandImmediate && mQsTracking) { if (!mQsExpandImmediate && mQsTracking) {
onQsTouch(event); onQsTouch(event);
if (!mConflictingQsExpansionGesture && !mSplitShadeEnabled) { if (!mConflictingQsExpansionGesture && !mSplitShadeEnabled) {
mShadeLog.logMotionEvent(event,
"handleQsTouch: not immediate expand or conflicting gesture");
return true; return true;
} }
} }
@@ -2192,6 +2202,7 @@ public final class NotificationPanelViewController extends PanelViewController {
event.getX(), event.getY(), -1)) { event.getX(), event.getY(), -1)) {
if (DEBUG_LOGCAT) Log.d(TAG, "handleQsDown"); if (DEBUG_LOGCAT) Log.d(TAG, "handleQsDown");
mFalsingCollector.onQsDown(); mFalsingCollector.onQsDown();
mShadeLog.logMotionEvent(event, "handleQsDown: down action, QS tracking enabled");
mQsTracking = true; mQsTracking = true;
onQsExpansionStarted(); onQsExpansionStarted();
mInitialHeightOnTouch = mQsExpansionHeight; mInitialHeightOnTouch = mQsExpansionHeight;
@@ -2274,6 +2285,7 @@ public final class NotificationPanelViewController extends PanelViewController {
switch (event.getActionMasked()) { switch (event.getActionMasked()) {
case MotionEvent.ACTION_DOWN: case MotionEvent.ACTION_DOWN:
mShadeLog.logMotionEvent(event, "onQsTouch: down action, QS tracking enabled");
mQsTracking = true; mQsTracking = true;
traceQsJank(true /* startTracing */, false /* wasCancelled */); traceQsJank(true /* startTracing */, false /* wasCancelled */);
mInitialTouchY = y; mInitialTouchY = y;
@@ -2300,6 +2312,7 @@ public final class NotificationPanelViewController extends PanelViewController {
case MotionEvent.ACTION_MOVE: case MotionEvent.ACTION_MOVE:
if (DEBUG_LOGCAT) Log.d(TAG, "onQSTouch move"); if (DEBUG_LOGCAT) Log.d(TAG, "onQSTouch move");
mShadeLog.logMotionEvent(event, "onQsTouch: move action, setting QS expansion");
setQsExpansion(h + mInitialHeightOnTouch); setQsExpansion(h + mInitialHeightOnTouch);
if (h >= getFalsingThreshold()) { if (h >= getFalsingThreshold()) {
mQsTouchAboveFalsingThreshold = true; mQsTouchAboveFalsingThreshold = true;
@@ -2309,6 +2322,8 @@ public final class NotificationPanelViewController extends PanelViewController {
case MotionEvent.ACTION_UP: case MotionEvent.ACTION_UP:
case MotionEvent.ACTION_CANCEL: case MotionEvent.ACTION_CANCEL:
mShadeLog.logMotionEvent(event,
"onQsTouch: up/cancel action, QS tracking disabled");
mQsTracking = false; mQsTracking = false;
mTrackingPointer = -1; mTrackingPointer = -1;
trackMovement(event); trackMovement(event);
@@ -3131,8 +3146,8 @@ public final class NotificationPanelViewController extends PanelViewController {
positionClockAndNotifications(); positionClockAndNotifications();
} }
} }
if (mQsExpandImmediate || mQsExpanded && !mQsTracking && mQsExpansionAnimator == null if (mQsExpandImmediate || (mQsExpanded && !mQsTracking && mQsExpansionAnimator == null
&& !mQsExpansionFromOverscroll) { && !mQsExpansionFromOverscroll)) {
float t; float t;
if (mKeyguardShowing) { if (mKeyguardShowing) {
@@ -4224,6 +4239,7 @@ public final class NotificationPanelViewController extends PanelViewController {
|| mPulseExpansionHandler.isExpanding(); || mPulseExpansionHandler.isExpanding();
if (pulseShouldGetTouch && mPulseExpansionHandler.onTouchEvent(event)) { if (pulseShouldGetTouch && mPulseExpansionHandler.onTouchEvent(event)) {
// We're expanding all the other ones shouldn't get this anymore // We're expanding all the other ones shouldn't get this anymore
mShadeLog.logMotionEvent(event, "onTouch: PulseExpansionHandler handled event");
return true; return true;
} }
if (mListenForHeadsUp && !mHeadsUpTouchHelper.isTrackingHeadsUp() if (mListenForHeadsUp && !mHeadsUpTouchHelper.isTrackingHeadsUp()
@@ -4231,14 +4247,10 @@ public final class NotificationPanelViewController extends PanelViewController {
&& mHeadsUpTouchHelper.onInterceptTouchEvent(event)) { && mHeadsUpTouchHelper.onInterceptTouchEvent(event)) {
mMetricsLogger.count(COUNTER_PANEL_OPEN_PEEK, 1); mMetricsLogger.count(COUNTER_PANEL_OPEN_PEEK, 1);
} }
boolean handled = false; boolean handled = mHeadsUpTouchHelper.onTouchEvent(event);
if (mOnlyAffordanceInThisMotion) {
return true;
}
handled |= mHeadsUpTouchHelper.onTouchEvent(event);
if (!mHeadsUpTouchHelper.isTrackingHeadsUp() && handleQsTouch(event)) { if (!mHeadsUpTouchHelper.isTrackingHeadsUp() && handleQsTouch(event)) {
if (DEBUG_LOGCAT) Log.d(TAG, "handleQsTouch true"); mShadeLog.logMotionEvent(event, "onTouch: handleQsTouch handled event");
return true; return true;
} }
if (event.getActionMasked() == MotionEvent.ACTION_DOWN && isFullyCollapsed()) { if (event.getActionMasked() == MotionEvent.ACTION_DOWN && isFullyCollapsed()) {
@@ -4810,6 +4822,8 @@ public final class NotificationPanelViewController extends PanelViewController {
} }
} else if (!mQsExpanded && mQsExpansionAnimator == null) { } else if (!mQsExpanded && mQsExpansionAnimator == null) {
setQsExpansion(mQsMinExpansionHeight + mLastOverscroll); setQsExpansion(mQsMinExpansionHeight + mLastOverscroll);
} else {
mShadeLog.v("onLayoutChange: qs expansion not set");
} }
updateExpandedHeight(getExpandedHeight()); updateExpandedHeight(getExpandedHeight());
updateHeader(); updateHeader();

View File

@@ -202,6 +202,8 @@ public abstract class PanelViewController {
private final InteractionJankMonitor mInteractionJankMonitor; private final InteractionJankMonitor mInteractionJankMonitor;
protected final SystemClock mSystemClock; protected final SystemClock mSystemClock;
protected final ShadeLogger mShadeLog;
protected abstract void onExpandingFinished(); protected abstract void onExpandingFinished();
protected void onExpandingStarted() { protected void onExpandingStarted() {
@@ -242,6 +244,7 @@ public abstract class PanelViewController {
PanelExpansionStateManager panelExpansionStateManager, PanelExpansionStateManager panelExpansionStateManager,
AmbientState ambientState, AmbientState ambientState,
InteractionJankMonitor interactionJankMonitor, InteractionJankMonitor interactionJankMonitor,
ShadeLogger shadeLogger,
SystemClock systemClock) { SystemClock systemClock) {
keyguardStateController.addCallback(new KeyguardStateController.Callback() { keyguardStateController.addCallback(new KeyguardStateController.Callback() {
@Override @Override
@@ -254,6 +257,7 @@ public abstract class PanelViewController {
mStatusBarKeyguardViewManager = statusBarKeyguardViewManager; mStatusBarKeyguardViewManager = statusBarKeyguardViewManager;
mLockscreenGestureLogger = lockscreenGestureLogger; mLockscreenGestureLogger = lockscreenGestureLogger;
mPanelExpansionStateManager = panelExpansionStateManager; mPanelExpansionStateManager = panelExpansionStateManager;
mShadeLog = shadeLogger;
TouchHandler touchHandler = createTouchHandler(); TouchHandler touchHandler = createTouchHandler();
mView.addOnAttachStateChangeListener(new View.OnAttachStateChangeListener() { mView.addOnAttachStateChangeListener(new View.OnAttachStateChangeListener() {
@Override @Override
@@ -1275,9 +1279,16 @@ public abstract class PanelViewController {
@Override @Override
public boolean onTouch(View v, MotionEvent event) { public boolean onTouch(View v, MotionEvent event) {
if (mInstantExpanding || (mTouchDisabled if (mInstantExpanding) {
&& event.getActionMasked() != MotionEvent.ACTION_CANCEL) || (mMotionAborted mShadeLog.logMotionEvent(event, "onTouch: touch ignored due to instant expanding");
&& event.getActionMasked() != MotionEvent.ACTION_DOWN)) { return false;
}
if (mTouchDisabled && event.getActionMasked() != MotionEvent.ACTION_CANCEL) {
mShadeLog.logMotionEvent(event, "onTouch: non-cancel action, touch disabled");
return false;
}
if (mMotionAborted && event.getActionMasked() != MotionEvent.ACTION_DOWN) {
mShadeLog.logMotionEvent(event, "onTouch: non-down action, motion was aborted");
return false; return false;
} }
@@ -1287,6 +1298,7 @@ public abstract class PanelViewController {
// Turn off tracking if it's on or the shade can get stuck in the down position. // Turn off tracking if it's on or the shade can get stuck in the down position.
onTrackingStopped(true /* expand */); onTrackingStopped(true /* expand */);
} }
mShadeLog.logMotionEvent(event, "onTouch: drag not enabled");
return false; return false;
} }

View File

@@ -0,0 +1,48 @@
package com.android.systemui.shade
import android.view.MotionEvent
import com.android.systemui.log.LogBuffer
import com.android.systemui.log.LogLevel
import com.android.systemui.log.LogMessage
import com.android.systemui.log.dagger.ShadeLog
import com.google.errorprone.annotations.CompileTimeConstant
import javax.inject.Inject
private const val TAG = "systemui.shade"
/** Lightweight logging utility for the Shade. */
class ShadeLogger @Inject constructor(
@ShadeLog
private val buffer: LogBuffer
) {
fun v(@CompileTimeConstant msg: String) {
buffer.log(TAG, LogLevel.VERBOSE, msg)
}
private inline fun log(
logLevel: LogLevel,
initializer: LogMessage.() -> Unit,
noinline printer: LogMessage.() -> String
) {
buffer.log(TAG, logLevel, initializer, printer)
}
fun onQsInterceptMoveQsTrackingEnabled(h: Float) {
log(LogLevel.VERBOSE,
{ double1 = h.toDouble() },
{ "onQsIn[tercept: move action, QS tracking enabled. h = $double1" })
}
fun logMotionEvent(event: MotionEvent, message: String) {
log(LogLevel.VERBOSE, {
str1 = message
long1 = event.eventTime
long2 = event.downTime
int1 = event.action
int2 = event.classification
double1 = event.y.toDouble()
}, {
"$str1\neventTime=$long1,downTime=$long2,y=$double1,action=$int1,classification=$int2"
})
}
}

View File

@@ -238,6 +238,8 @@ public class NotificationPanelViewControllerTest extends SysuiTestCase {
@Mock @Mock
private DozeLog mDozeLog; private DozeLog mDozeLog;
@Mock @Mock
private ShadeLogger mShadeLog;
@Mock
private CommandQueue mCommandQueue; private CommandQueue mCommandQueue;
@Mock @Mock
private VibratorHelper mVibratorHelper; private VibratorHelper mVibratorHelper;
@@ -524,7 +526,9 @@ public class NotificationPanelViewControllerTest extends SysuiTestCase {
mNotificationShadeWindowController, mNotificationShadeWindowController,
mDozeLog, mDozeParameters, mCommandQueue, mVibratorHelper, mDozeLog, mDozeParameters, mCommandQueue, mVibratorHelper,
mLatencyTracker, mPowerManager, mAccessibilityManager, 0, mUpdateMonitor, mLatencyTracker, mPowerManager, mAccessibilityManager, 0, mUpdateMonitor,
mMetricsLogger, mConfigurationController, mMetricsLogger,
mShadeLog,
mConfigurationController,
() -> flingAnimationUtilsBuilder, mStatusBarTouchableRegionManager, () -> flingAnimationUtilsBuilder, mStatusBarTouchableRegionManager,
mConversationNotificationManager, mMediaHiearchyManager, mConversationNotificationManager, mMediaHiearchyManager,
mStatusBarKeyguardViewManager, mStatusBarKeyguardViewManager,