diff options
6 files changed, 133 insertions, 14 deletions
diff --git a/packages/SystemUI/src/com/android/systemui/log/dagger/LogModule.java b/packages/SystemUI/src/com/android/systemui/log/dagger/LogModule.java index c858bc3e2c81..d9aa7212a71b 100644 --- a/packages/SystemUI/src/com/android/systemui/log/dagger/LogModule.java +++ b/packages/SystemUI/src/com/android/systemui/log/dagger/LogModule.java @@ -84,6 +84,14 @@ public class LogModule { 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 @SysUISingleton diff --git a/packages/SystemUI/src/com/android/systemui/log/dagger/ShadeLog.java b/packages/SystemUI/src/com/android/systemui/log/dagger/ShadeLog.java new file mode 100644 index 000000000000..bd0d298ebdee --- /dev/null +++ b/packages/SystemUI/src/com/android/systemui/log/dagger/ShadeLog.java @@ -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 { +} diff --git a/packages/SystemUI/src/com/android/systemui/shade/NotificationPanelViewController.java b/packages/SystemUI/src/com/android/systemui/shade/NotificationPanelViewController.java index e8ed00b76f20..7a4c87766114 100644 --- a/packages/SystemUI/src/com/android/systemui/shade/NotificationPanelViewController.java +++ b/packages/SystemUI/src/com/android/systemui/shade/NotificationPanelViewController.java @@ -442,7 +442,6 @@ public final class NotificationPanelViewController extends PanelViewController { */ private boolean mQsAnimatorExpand; private boolean mIsLaunchTransitionFinished; - private boolean mOnlyAffordanceInThisMotion; private ValueAnimator mQsSizeChangeAnimator; private boolean mQsScrimEnabled = true; @@ -720,6 +719,7 @@ public final class NotificationPanelViewController extends PanelViewController { AccessibilityManager accessibilityManager, @DisplayId int displayId, KeyguardUpdateMonitor keyguardUpdateMonitor, MetricsLogger metricsLogger, + ShadeLogger shadeLogger, ConfigurationController configurationController, Provider<FlingAnimationUtils.Builder> flingAnimationUtilsBuilder, StatusBarTouchableRegionManager statusBarTouchableRegionManager, @@ -786,6 +786,7 @@ public final class NotificationPanelViewController extends PanelViewController { panelExpansionStateManager, ambientState, interactionJankMonitor, + shadeLogger, systemClock); mView = view; mVibratorHelper = vibratorHelper; @@ -1832,6 +1833,8 @@ public final class NotificationPanelViewController extends PanelViewController { } if (mQsExpansionAnimator != null) { mInitialHeightOnTouch = mQsExpansionHeight; + mShadeLog.logMotionEvent(event, + "onQsIntercept: down action, QS tracking enabled"); mQsTracking = true; traceQsJank(true /* startTracing */, false /* wasCancelled */); mNotificationStackScrollLayoutController.cancelLongPress(); @@ -1859,12 +1862,16 @@ public final class NotificationPanelViewController extends PanelViewController { setQsExpansion(h + mInitialHeightOnTouch); trackMovement(event); return true; + } else { + mShadeLog.logMotionEvent(event, + "onQsIntercept: move ignored because qs tracking disabled"); } if ((h > getTouchSlop(event) || (h < -getTouchSlop(event) && mQsExpanded)) && Math.abs(h) > Math.abs(x - mInitialTouchX) && shouldQuickSettingsIntercept(mInitialTouchX, mInitialTouchY, h)) { if (DEBUG_LOGCAT) Log.d(TAG, "onQsIntercept - start tracking expansion"); mView.getParent().requestDisallowInterceptTouchEvent(true); + mShadeLog.onQsInterceptMoveQsTrackingEnabled(h); mQsTracking = true; traceQsJank(true /* startTracing */, false /* wasCancelled */); onQsExpansionStarted(); @@ -1880,6 +1887,7 @@ public final class NotificationPanelViewController extends PanelViewController { case MotionEvent.ACTION_CANCEL: case MotionEvent.ACTION_UP: trackMovement(event); + mShadeLog.logMotionEvent(event, "onQsIntercept: up action, QS tracking disabled"); mQsTracking = false; break; } @@ -1917,7 +1925,6 @@ public final class NotificationPanelViewController extends PanelViewController { private void initDownStates(MotionEvent event) { if (event.getActionMasked() == MotionEvent.ACTION_DOWN) { - mOnlyAffordanceInThisMotion = false; mQsTouchAboveFalsingThreshold = mQsFullyExpanded; mDozingOnDown = isDozing(); mDownX = event.getX(); @@ -2056,6 +2063,7 @@ public final class NotificationPanelViewController extends PanelViewController { && collapsedQs && isQsExpansionEnabled(); if (action == MotionEvent.ACTION_DOWN && expandedShadeCollapsedQs) { // Down in the empty area while fully expanded - go to QS. + mShadeLog.logMotionEvent(event, "handleQsTouch: down action, QS tracking enabled"); mQsTracking = true; traceQsJank(true /* startTracing */, false /* wasCancelled */); mConflictingQsExpansionGesture = true; @@ -2070,6 +2078,8 @@ public final class NotificationPanelViewController extends PanelViewController { if (!mQsExpandImmediate && mQsTracking) { onQsTouch(event); if (!mConflictingQsExpansionGesture && !mSplitShadeEnabled) { + mShadeLog.logMotionEvent(event, + "handleQsTouch: not immediate expand or conflicting gesture"); return true; } } @@ -2137,6 +2147,7 @@ public final class NotificationPanelViewController extends PanelViewController { event.getX(), event.getY(), -1)) { if (DEBUG_LOGCAT) Log.d(TAG, "handleQsDown"); mFalsingCollector.onQsDown(); + mShadeLog.logMotionEvent(event, "handleQsDown: down action, QS tracking enabled"); mQsTracking = true; onQsExpansionStarted(); mInitialHeightOnTouch = mQsExpansionHeight; @@ -2219,6 +2230,7 @@ public final class NotificationPanelViewController extends PanelViewController { switch (event.getActionMasked()) { case MotionEvent.ACTION_DOWN: + mShadeLog.logMotionEvent(event, "onQsTouch: down action, QS tracking enabled"); mQsTracking = true; traceQsJank(true /* startTracing */, false /* wasCancelled */); mInitialTouchY = y; @@ -2245,6 +2257,7 @@ public final class NotificationPanelViewController extends PanelViewController { case MotionEvent.ACTION_MOVE: if (DEBUG_LOGCAT) Log.d(TAG, "onQSTouch move"); + mShadeLog.logMotionEvent(event, "onQsTouch: move action, setting QS expansion"); setQsExpansion(h + mInitialHeightOnTouch); if (h >= getFalsingThreshold()) { mQsTouchAboveFalsingThreshold = true; @@ -2254,6 +2267,8 @@ public final class NotificationPanelViewController extends PanelViewController { case MotionEvent.ACTION_UP: case MotionEvent.ACTION_CANCEL: + mShadeLog.logMotionEvent(event, + "onQsTouch: up/cancel action, QS tracking disabled"); mQsTracking = false; mTrackingPointer = -1; trackMovement(event); @@ -3076,8 +3091,8 @@ public final class NotificationPanelViewController extends PanelViewController { positionClockAndNotifications(); } } - if (mQsExpandImmediate || mQsExpanded && !mQsTracking && mQsExpansionAnimator == null - && !mQsExpansionFromOverscroll) { + if (mQsExpandImmediate || (mQsExpanded && !mQsTracking && mQsExpansionAnimator == null + && !mQsExpansionFromOverscroll)) { float t; if (mKeyguardShowing) { @@ -4167,6 +4182,7 @@ public final class NotificationPanelViewController extends PanelViewController { || mPulseExpansionHandler.isExpanding(); if (pulseShouldGetTouch && mPulseExpansionHandler.onTouchEvent(event)) { // We're expanding all the other ones shouldn't get this anymore + mShadeLog.logMotionEvent(event, "onTouch: PulseExpansionHandler handled event"); return true; } if (mListenForHeadsUp && !mHeadsUpTouchHelper.isTrackingHeadsUp() @@ -4174,14 +4190,10 @@ public final class NotificationPanelViewController extends PanelViewController { && mHeadsUpTouchHelper.onInterceptTouchEvent(event)) { mMetricsLogger.count(COUNTER_PANEL_OPEN_PEEK, 1); } - boolean handled = false; - if (mOnlyAffordanceInThisMotion) { - return true; - } - handled |= mHeadsUpTouchHelper.onTouchEvent(event); + boolean handled = mHeadsUpTouchHelper.onTouchEvent(event); if (!mHeadsUpTouchHelper.isTrackingHeadsUp() && handleQsTouch(event)) { - if (DEBUG_LOGCAT) Log.d(TAG, "handleQsTouch true"); + mShadeLog.logMotionEvent(event, "onTouch: handleQsTouch handled event"); return true; } if (event.getActionMasked() == MotionEvent.ACTION_DOWN && isFullyCollapsed()) { @@ -4749,6 +4761,8 @@ public final class NotificationPanelViewController extends PanelViewController { } } else if (!mQsExpanded && mQsExpansionAnimator == null) { setQsExpansion(mQsMinExpansionHeight + mLastOverscroll); + } else { + mShadeLog.v("onLayoutChange: qs expansion not set"); } updateExpandedHeight(getExpandedHeight()); updateHeader(); diff --git a/packages/SystemUI/src/com/android/systemui/shade/PanelViewController.java b/packages/SystemUI/src/com/android/systemui/shade/PanelViewController.java index 4aad245f96fd..73eaa852e345 100644 --- a/packages/SystemUI/src/com/android/systemui/shade/PanelViewController.java +++ b/packages/SystemUI/src/com/android/systemui/shade/PanelViewController.java @@ -202,6 +202,8 @@ public abstract class PanelViewController { private final InteractionJankMonitor mInteractionJankMonitor; protected final SystemClock mSystemClock; + protected final ShadeLogger mShadeLog; + protected abstract void onExpandingFinished(); protected void onExpandingStarted() { @@ -242,6 +244,7 @@ public abstract class PanelViewController { PanelExpansionStateManager panelExpansionStateManager, AmbientState ambientState, InteractionJankMonitor interactionJankMonitor, + ShadeLogger shadeLogger, SystemClock systemClock) { keyguardStateController.addCallback(new KeyguardStateController.Callback() { @Override @@ -254,6 +257,7 @@ public abstract class PanelViewController { mStatusBarKeyguardViewManager = statusBarKeyguardViewManager; mLockscreenGestureLogger = lockscreenGestureLogger; mPanelExpansionStateManager = panelExpansionStateManager; + mShadeLog = shadeLogger; TouchHandler touchHandler = createTouchHandler(); mView.addOnAttachStateChangeListener(new View.OnAttachStateChangeListener() { @Override @@ -1275,9 +1279,16 @@ public abstract class PanelViewController { @Override public boolean onTouch(View v, MotionEvent event) { - if (mInstantExpanding || (mTouchDisabled - && event.getActionMasked() != MotionEvent.ACTION_CANCEL) || (mMotionAborted - && event.getActionMasked() != MotionEvent.ACTION_DOWN)) { + if (mInstantExpanding) { + mShadeLog.logMotionEvent(event, "onTouch: touch ignored due to instant expanding"); + 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; } @@ -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. onTrackingStopped(true /* expand */); } + mShadeLog.logMotionEvent(event, "onTouch: drag not enabled"); return false; } diff --git a/packages/SystemUI/src/com/android/systemui/shade/ShadeLogger.kt b/packages/SystemUI/src/com/android/systemui/shade/ShadeLogger.kt new file mode 100644 index 000000000000..f1e44ce5736e --- /dev/null +++ b/packages/SystemUI/src/com/android/systemui/shade/ShadeLogger.kt @@ -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" + }) + } +} diff --git a/packages/SystemUI/tests/src/com/android/systemui/shade/NotificationPanelViewControllerTest.java b/packages/SystemUI/tests/src/com/android/systemui/shade/NotificationPanelViewControllerTest.java index 3f4e2a9b4d65..95211c0c8ec8 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/shade/NotificationPanelViewControllerTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/shade/NotificationPanelViewControllerTest.java @@ -238,6 +238,8 @@ public class NotificationPanelViewControllerTest extends SysuiTestCase { @Mock private DozeLog mDozeLog; @Mock + private ShadeLogger mShadeLog; + @Mock private CommandQueue mCommandQueue; @Mock private VibratorHelper mVibratorHelper; @@ -524,7 +526,9 @@ public class NotificationPanelViewControllerTest extends SysuiTestCase { mNotificationShadeWindowController, mDozeLog, mDozeParameters, mCommandQueue, mVibratorHelper, mLatencyTracker, mPowerManager, mAccessibilityManager, 0, mUpdateMonitor, - mMetricsLogger, mConfigurationController, + mMetricsLogger, + mShadeLog, + mConfigurationController, () -> flingAnimationUtilsBuilder, mStatusBarTouchableRegionManager, mConversationNotificationManager, mMediaHiearchyManager, mStatusBarKeyguardViewManager, |