Fixed an issue where the user could be stuck with pulse expanding
Added a lot more logging and dumping to the LS shade controller and the pulse expansion handler. Also added a safeguard and fixed a bug where the pulse expansion wasn't reset in lockedDown mode. Fixed an issue where aborting the unlock in docked down shade wouldn't reset the dragdown amount. Always allowing the set the dragdown amount if it's a reset. Fixes: 209839390 Fixes: 198098523 Test: see repo steps in bug, avoid it manually, run regular tests Merged-In: I3398763141e8f828c00fb5d5184d64ffc66d3237 Change-Id: I3398763141e8f828c00fb5d5184d64ffc66d3237
This commit is contained in:
@@ -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 lockscreen to shade transition events. */
|
||||
@Qualifier
|
||||
@Documented
|
||||
@Retention(RUNTIME)
|
||||
public @interface LSShadeTransitionLog {
|
||||
}
|
||||
@@ -52,6 +52,14 @@ public class LogModule {
|
||||
return factory.create("NotifLog", 1000);
|
||||
}
|
||||
|
||||
/** Provides a logging buffer for all logs for lockscreen to shade transition events. */
|
||||
@Provides
|
||||
@SysUISingleton
|
||||
@LSShadeTransitionLog
|
||||
public static LogBuffer provideLSShadeTransitionControllerBuffer(LogBufferFactory factory) {
|
||||
return factory.create("LSShadeTransitionLog", 50);
|
||||
}
|
||||
|
||||
/** Provides a logging buffer for all logs related to managing notification sections. */
|
||||
@Provides
|
||||
@SysUISingleton
|
||||
|
||||
@@ -8,12 +8,13 @@ import android.content.Context
|
||||
import android.content.res.Configuration
|
||||
import android.os.SystemClock
|
||||
import android.util.DisplayMetrics
|
||||
import android.util.IndentingPrintWriter
|
||||
import android.util.MathUtils
|
||||
import android.view.MotionEvent
|
||||
import android.view.View
|
||||
import android.view.ViewConfiguration
|
||||
import androidx.annotation.VisibleForTesting
|
||||
import com.android.internal.logging.nano.MetricsProto.MetricsEvent
|
||||
import com.android.systemui.Dumpable
|
||||
import com.android.systemui.ExpandHelper
|
||||
import com.android.systemui.Gefingerpoken
|
||||
import com.android.systemui.R
|
||||
@@ -22,23 +23,26 @@ import com.android.systemui.biometrics.UdfpsKeyguardViewController
|
||||
import com.android.systemui.classifier.Classifier
|
||||
import com.android.systemui.classifier.FalsingCollector
|
||||
import com.android.systemui.dagger.SysUISingleton
|
||||
import com.android.systemui.dump.DumpManager
|
||||
import com.android.systemui.media.MediaHierarchyManager
|
||||
import com.android.systemui.plugins.ActivityStarter.OnDismissAction
|
||||
import com.android.systemui.plugins.FalsingManager
|
||||
import com.android.systemui.plugins.qs.QS
|
||||
import com.android.systemui.plugins.statusbar.StatusBarStateController
|
||||
import com.android.systemui.statusbar.notification.collection.NotificationEntry
|
||||
import com.android.systemui.statusbar.notification.row.ExpandableNotificationRow
|
||||
import com.android.systemui.statusbar.notification.row.ExpandableView
|
||||
import com.android.systemui.statusbar.notification.stack.AmbientState
|
||||
import com.android.systemui.statusbar.notification.stack.NotificationStackScrollLayoutController
|
||||
import com.android.systemui.statusbar.phone.KeyguardBypassController
|
||||
import com.android.systemui.statusbar.phone.LockscreenGestureLogger
|
||||
import com.android.systemui.statusbar.phone.LockscreenGestureLogger.LockscreenUiEvent
|
||||
import com.android.systemui.statusbar.phone.LSShadeTransitionLogger
|
||||
import com.android.systemui.statusbar.phone.NotificationPanelViewController
|
||||
import com.android.systemui.statusbar.phone.ScrimController
|
||||
import com.android.systemui.statusbar.phone.StatusBar
|
||||
import com.android.systemui.statusbar.policy.ConfigurationController
|
||||
import com.android.systemui.util.Utils
|
||||
import java.io.FileDescriptor
|
||||
import java.io.PrintWriter
|
||||
import javax.inject.Inject
|
||||
|
||||
private const val SPRING_BACK_ANIMATION_LENGTH_MS = 375L
|
||||
@@ -51,19 +55,19 @@ private const val RUBBERBAND_FACTOR_EXPANDABLE = 0.5f
|
||||
@SysUISingleton
|
||||
class LockscreenShadeTransitionController @Inject constructor(
|
||||
private val statusBarStateController: SysuiStatusBarStateController,
|
||||
private val lockscreenGestureLogger: LockscreenGestureLogger,
|
||||
private val logger: LSShadeTransitionLogger,
|
||||
private val keyguardBypassController: KeyguardBypassController,
|
||||
private val lockScreenUserManager: NotificationLockscreenUserManager,
|
||||
private val falsingCollector: FalsingCollector,
|
||||
private val ambientState: AmbientState,
|
||||
private val displayMetrics: DisplayMetrics,
|
||||
private val mediaHierarchyManager: MediaHierarchyManager,
|
||||
private val scrimController: ScrimController,
|
||||
private val depthController: NotificationShadeDepthController,
|
||||
private val context: Context,
|
||||
configurationController: ConfigurationController,
|
||||
falsingManager: FalsingManager
|
||||
) {
|
||||
falsingManager: FalsingManager,
|
||||
dumpManager: DumpManager,
|
||||
) : Dumpable {
|
||||
private var pulseHeight: Float = 0f
|
||||
private var useSplitShade: Boolean = false
|
||||
private lateinit var nsslController: NotificationStackScrollLayoutController
|
||||
@@ -139,6 +143,23 @@ class LockscreenShadeTransitionController @Inject constructor(
|
||||
touchHelper.updateResources(context)
|
||||
}
|
||||
})
|
||||
dumpManager.registerDumpable(this)
|
||||
statusBarStateController.addCallback(object : StatusBarStateController.StateListener {
|
||||
override fun onExpandedChanged(isExpanded: Boolean) {
|
||||
// safeguard: When the panel is fully collapsed, let's make sure to reset.
|
||||
// See b/198098523
|
||||
if (!isExpanded) {
|
||||
if (dragDownAmount != 0f && dragDownAnimator?.isRunning != true) {
|
||||
logger.logDragDownAmountResetWhenFullyCollapsed()
|
||||
dragDownAmount = 0f
|
||||
}
|
||||
if (pulseHeight != 0f && pulseHeightAnimator?.isRunning != true) {
|
||||
logger.logPulseHeightNotResetWhenFullyCollapsed()
|
||||
setPulseHeight(0f, animate = false)
|
||||
}
|
||||
}
|
||||
}
|
||||
})
|
||||
}
|
||||
|
||||
private fun updateResources() {
|
||||
@@ -182,19 +203,19 @@ class LockscreenShadeTransitionController @Inject constructor(
|
||||
*/
|
||||
internal fun onDraggedDown(startingChild: View?, dragLengthY: Int) {
|
||||
if (canDragDown()) {
|
||||
val cancelRunnable = Runnable {
|
||||
logger.logGoingToLockedShadeAborted()
|
||||
setDragDownAmountAnimated(0f)
|
||||
}
|
||||
if (nsslController.isInLockedDownShade()) {
|
||||
logger.logDraggedDownLockDownShade(startingChild)
|
||||
statusBarStateController.setLeaveOpenOnKeyguardHide(true)
|
||||
statusbar.dismissKeyguardThenExecute(OnDismissAction {
|
||||
nextHideKeyguardNeedsNoAnimation = true
|
||||
false
|
||||
},
|
||||
null /* cancelRunnable */, false /* afterKeyguardGone */)
|
||||
}, cancelRunnable, false /* afterKeyguardGone */)
|
||||
} else {
|
||||
lockscreenGestureLogger.write(
|
||||
MetricsEvent.ACTION_LS_SHADE,
|
||||
(dragLengthY / displayMetrics.density).toInt(),
|
||||
0 /* velocityDp */)
|
||||
lockscreenGestureLogger.log(LockscreenUiEvent.LOCKSCREEN_PULL_SHADE_OPEN)
|
||||
logger.logDraggedDown(startingChild, dragLengthY)
|
||||
if (!ambientState.isDozing() || startingChild != null) {
|
||||
// go to locked shade while animating the drag down amount from its current
|
||||
// value
|
||||
@@ -216,11 +237,11 @@ class LockscreenShadeTransitionController @Inject constructor(
|
||||
dragDownAmount = 0f
|
||||
forceApplyAmount = false
|
||||
}
|
||||
val cancelRunnable = Runnable { setDragDownAmountAnimated(0f) }
|
||||
goToLockedShadeInternal(startingChild, animationHandler, cancelRunnable)
|
||||
}
|
||||
}
|
||||
} else {
|
||||
logger.logUnSuccessfulDragDown(startingChild)
|
||||
setDragDownAmountAnimated(0f)
|
||||
}
|
||||
}
|
||||
@@ -229,6 +250,7 @@ class LockscreenShadeTransitionController @Inject constructor(
|
||||
* Called by the touch helper when the drag down was aborted and should be reset.
|
||||
*/
|
||||
internal fun onDragDownReset() {
|
||||
logger.logDragDownAborted()
|
||||
nsslController.setDimmed(true /* dimmed */, true /* animated */)
|
||||
nsslController.resetScrollPosition()
|
||||
nsslController.resetCheckSnoozeLeavebehind()
|
||||
@@ -246,10 +268,16 @@ class LockscreenShadeTransitionController @Inject constructor(
|
||||
/**
|
||||
* Called by the touch helper when the drag down was started
|
||||
*/
|
||||
internal fun onDragDownStarted() {
|
||||
internal fun onDragDownStarted(startingChild: ExpandableView?) {
|
||||
logger.logDragDownStarted(startingChild)
|
||||
nsslController.cancelLongPress()
|
||||
nsslController.checkSnoozeLeavebehind()
|
||||
dragDownAnimator?.cancel()
|
||||
dragDownAnimator?.apply {
|
||||
if (isRunning) {
|
||||
logger.logAnimationCancelled(isPulse = false)
|
||||
cancel()
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -294,7 +322,7 @@ class LockscreenShadeTransitionController @Inject constructor(
|
||||
set(value) {
|
||||
if (field != value || forceApplyAmount) {
|
||||
field = value
|
||||
if (!nsslController.isInLockedDownShade() || forceApplyAmount) {
|
||||
if (!nsslController.isInLockedDownShade() || field == 0f || forceApplyAmount) {
|
||||
nsslController.setTransitionToFullShadeAmount(field)
|
||||
notificationPanelController.setTransitionToFullShadeAmount(field,
|
||||
false /* animate */, 0 /* delay */)
|
||||
@@ -322,6 +350,7 @@ class LockscreenShadeTransitionController @Inject constructor(
|
||||
delay: Long = 0,
|
||||
endlistener: (() -> Unit)? = null
|
||||
) {
|
||||
logger.logDragDownAnimation(target)
|
||||
val dragDownAnimator = ValueAnimator.ofFloat(dragDownAmount, target)
|
||||
dragDownAnimator.interpolator = Interpolators.FAST_OUT_SLOW_IN
|
||||
dragDownAnimator.duration = SPRING_BACK_ANIMATION_LENGTH_MS
|
||||
@@ -377,7 +406,9 @@ class LockscreenShadeTransitionController @Inject constructor(
|
||||
*/
|
||||
@JvmOverloads
|
||||
fun goToLockedShade(expandedView: View?, needsQSAnimation: Boolean = true) {
|
||||
if (statusBarStateController.state == StatusBarState.KEYGUARD) {
|
||||
val isKeyguard = statusBarStateController.state == StatusBarState.KEYGUARD
|
||||
logger.logTryGoToLockedShade(isKeyguard)
|
||||
if (isKeyguard) {
|
||||
val animationHandler: ((Long) -> Unit)?
|
||||
if (needsQSAnimation) {
|
||||
// Let's use the default animation
|
||||
@@ -413,6 +444,7 @@ class LockscreenShadeTransitionController @Inject constructor(
|
||||
) {
|
||||
if (statusbar.isShadeDisabled) {
|
||||
cancelAction?.run()
|
||||
logger.logShadeDisabledOnGoToLockedShade()
|
||||
return
|
||||
}
|
||||
var userId: Int = lockScreenUserManager.getCurrentUserId()
|
||||
@@ -451,9 +483,11 @@ class LockscreenShadeTransitionController @Inject constructor(
|
||||
}
|
||||
cancelAction?.run()
|
||||
}
|
||||
logger.logShowBouncerOnGoToLockedShade()
|
||||
statusbar.showBouncerWithDimissAndCancelIfKeyguard(onDismissAction, cancelHandler)
|
||||
draggedDownEntry = entry
|
||||
} else {
|
||||
logger.logGoingToLockedShade(animationHandler != null)
|
||||
statusBarStateController.setState(StatusBarState.SHADE_LOCKED)
|
||||
// This call needs to be after updating the shade state since otherwise
|
||||
// the scrimstate resets too early
|
||||
@@ -473,6 +507,7 @@ class LockscreenShadeTransitionController @Inject constructor(
|
||||
* @param previousState which state were we in when we hid the keyguard?
|
||||
*/
|
||||
fun onHideKeyguard(delay: Long, previousState: Int) {
|
||||
logger.logOnHideKeyguard()
|
||||
if (animationHandlerOnKeyguardDismiss != null) {
|
||||
animationHandlerOnKeyguardDismiss!!.invoke(delay)
|
||||
animationHandlerOnKeyguardDismiss = null
|
||||
@@ -495,6 +530,7 @@ class LockscreenShadeTransitionController @Inject constructor(
|
||||
* not triggered by gestures, e.g. when clicking on the shelf or expand button.
|
||||
*/
|
||||
private fun performDefaultGoToFullShadeAnimation(delay: Long) {
|
||||
logger.logDefaultGoToFullShadeAnimation(delay)
|
||||
notificationPanelController.animateToFullShade(delay)
|
||||
animateAppear(delay)
|
||||
}
|
||||
@@ -531,6 +567,7 @@ class LockscreenShadeTransitionController @Inject constructor(
|
||||
* @param cancelled was the interaction cancelled and this is a reset?
|
||||
*/
|
||||
fun finishPulseAnimation(cancelled: Boolean) {
|
||||
logger.logPulseExpansionFinished(cancelled)
|
||||
if (cancelled) {
|
||||
setPulseHeight(0f, animate = true)
|
||||
} else {
|
||||
@@ -543,7 +580,27 @@ class LockscreenShadeTransitionController @Inject constructor(
|
||||
* Notify this class that a pulse expansion is starting
|
||||
*/
|
||||
fun onPulseExpansionStarted() {
|
||||
pulseHeightAnimator?.cancel()
|
||||
logger.logPulseExpansionStarted()
|
||||
pulseHeightAnimator?.apply {
|
||||
if (isRunning) {
|
||||
logger.logAnimationCancelled(isPulse = true)
|
||||
cancel()
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
override fun dump(fd: FileDescriptor, pw: PrintWriter, args: Array<out String>) {
|
||||
IndentingPrintWriter(pw, " ").let {
|
||||
it.println("LSShadeTransitionController:")
|
||||
it.increaseIndent()
|
||||
it.println("pulseHeight: $pulseHeight")
|
||||
it.println("useSplitShade: $useSplitShade")
|
||||
it.println("dragDownAmount: $dragDownAmount")
|
||||
it.println("isDragDownAnywhereEnabled: $isDragDownAnywhereEnabled")
|
||||
it.println("isFalsingCheckNeeded: $isFalsingCheckNeeded")
|
||||
it.println("hasPendingHandlerOnKeyguardDismiss: " +
|
||||
"${animationHandlerOnKeyguardDismiss != null}")
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -623,7 +680,7 @@ class DragDownHelper(
|
||||
captureStartingChild(initialTouchX, initialTouchY)
|
||||
initialTouchY = y
|
||||
initialTouchX = x
|
||||
dragDownCallback.onDragDownStarted()
|
||||
dragDownCallback.onDragDownStarted(startingChild)
|
||||
dragDownAmountOnStart = dragDownCallback.dragDownAmount
|
||||
return startingChild != null || dragDownCallback.isDragDownAnywhereEnabled
|
||||
}
|
||||
|
||||
@@ -24,15 +24,18 @@ import android.content.res.Configuration
|
||||
import android.os.PowerManager
|
||||
import android.os.PowerManager.WAKE_REASON_GESTURE
|
||||
import android.os.SystemClock
|
||||
import android.util.IndentingPrintWriter
|
||||
import android.view.MotionEvent
|
||||
import android.view.VelocityTracker
|
||||
import android.view.ViewConfiguration
|
||||
import com.android.systemui.Dumpable
|
||||
import com.android.systemui.Gefingerpoken
|
||||
import com.android.systemui.R
|
||||
import com.android.systemui.animation.Interpolators
|
||||
import com.android.systemui.classifier.Classifier.NOTIFICATION_DRAG_DOWN
|
||||
import com.android.systemui.classifier.FalsingCollector
|
||||
import com.android.systemui.dagger.SysUISingleton
|
||||
import com.android.systemui.dump.DumpManager
|
||||
import com.android.systemui.plugins.FalsingManager
|
||||
import com.android.systemui.plugins.statusbar.StatusBarStateController
|
||||
import com.android.systemui.statusbar.notification.NotificationWakeUpCoordinator
|
||||
@@ -43,6 +46,8 @@ import com.android.systemui.statusbar.notification.stack.NotificationStackScroll
|
||||
import com.android.systemui.statusbar.phone.HeadsUpManagerPhone
|
||||
import com.android.systemui.statusbar.phone.KeyguardBypassController
|
||||
import com.android.systemui.statusbar.policy.ConfigurationController
|
||||
import java.io.FileDescriptor
|
||||
import java.io.PrintWriter
|
||||
import javax.inject.Inject
|
||||
import kotlin.math.max
|
||||
|
||||
@@ -61,8 +66,9 @@ constructor(
|
||||
private val statusBarStateController: StatusBarStateController,
|
||||
private val falsingManager: FalsingManager,
|
||||
private val lockscreenShadeTransitionController: LockscreenShadeTransitionController,
|
||||
private val falsingCollector: FalsingCollector
|
||||
) : Gefingerpoken {
|
||||
private val falsingCollector: FalsingCollector,
|
||||
dumpManager: DumpManager
|
||||
) : Gefingerpoken, Dumpable {
|
||||
companion object {
|
||||
private val SPRING_BACK_ANIMATION_LENGTH_MS = 375
|
||||
}
|
||||
@@ -120,6 +126,7 @@ constructor(
|
||||
}
|
||||
})
|
||||
mPowerManager = context.getSystemService(PowerManager::class.java)
|
||||
dumpManager.registerDumpable(this)
|
||||
}
|
||||
|
||||
private fun initResources(context: Context) {
|
||||
@@ -329,4 +336,17 @@ constructor(
|
||||
fun onStartedWakingUp() {
|
||||
isWakingToShadeLocked = false
|
||||
}
|
||||
|
||||
override fun dump(fd: FileDescriptor, pw: PrintWriter, args: Array<out String>) {
|
||||
IndentingPrintWriter(pw, " ").let {
|
||||
it.println("PulseExpansionHandler:")
|
||||
it.increaseIndent()
|
||||
it.println("isExpanding: $isExpanding")
|
||||
it.println("leavingLockscreen: $leavingLockscreen")
|
||||
it.println("mPulsing: $mPulsing")
|
||||
it.println("isWakingToShadeLocked: $isWakingToShadeLocked")
|
||||
it.println("qsExpanded: $qsExpanded")
|
||||
it.println("bouncerShowing: $bouncerShowing")
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -0,0 +1,183 @@
|
||||
/*
|
||||
* 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.statusbar.phone
|
||||
|
||||
import android.util.DisplayMetrics
|
||||
import android.view.View
|
||||
import com.android.internal.logging.nano.MetricsProto.MetricsEvent
|
||||
import com.android.systemui.log.LogBuffer
|
||||
import com.android.systemui.log.LogLevel
|
||||
import com.android.systemui.log.dagger.LSShadeTransitionLog
|
||||
import com.android.systemui.statusbar.notification.row.ExpandableNotificationRow
|
||||
import com.android.systemui.statusbar.notification.row.ExpandableView
|
||||
import javax.inject.Inject
|
||||
|
||||
private const val TAG = "LockscreenShadeTransitionController"
|
||||
|
||||
class LSShadeTransitionLogger @Inject constructor(
|
||||
@LSShadeTransitionLog private val buffer: LogBuffer,
|
||||
private val lockscreenGestureLogger: LockscreenGestureLogger,
|
||||
private val displayMetrics: DisplayMetrics
|
||||
) {
|
||||
fun logUnSuccessfulDragDown(startingChild: View?) {
|
||||
val entry = (startingChild as ExpandableNotificationRow?)?.entry
|
||||
buffer.log(TAG, LogLevel.INFO, {
|
||||
str1 = entry?.key ?: "no entry"
|
||||
}, {
|
||||
"Tried to drag down but can't drag down on $str1"
|
||||
})
|
||||
}
|
||||
|
||||
fun logDragDownAborted() {
|
||||
buffer.log(TAG, LogLevel.INFO, {}, {
|
||||
"The drag down was reset"
|
||||
})
|
||||
}
|
||||
|
||||
fun logDragDownStarted(startingChild: ExpandableView?) {
|
||||
val entry = (startingChild as ExpandableNotificationRow?)?.entry
|
||||
buffer.log(TAG, LogLevel.INFO, {
|
||||
str1 = entry?.key ?: "no entry"
|
||||
}, {
|
||||
"The drag down has started on $str1"
|
||||
})
|
||||
}
|
||||
|
||||
fun logDraggedDownLockDownShade(startingChild: View?) {
|
||||
val entry = (startingChild as ExpandableNotificationRow?)?.entry
|
||||
buffer.log(TAG, LogLevel.INFO, {
|
||||
str1 = entry?.key ?: "no entry"
|
||||
}, {
|
||||
"Dragged down in locked down shade on $str1"
|
||||
})
|
||||
}
|
||||
|
||||
fun logDraggedDown(startingChild: View?, dragLengthY: Int) {
|
||||
val entry = (startingChild as ExpandableNotificationRow?)?.entry
|
||||
buffer.log(TAG, LogLevel.INFO, {
|
||||
str1 = entry?.key ?: "no entry"
|
||||
}, {
|
||||
"Drag down succeeded on $str1"
|
||||
})
|
||||
// Do logging to event log not just our own buffer
|
||||
lockscreenGestureLogger.write(
|
||||
MetricsEvent.ACTION_LS_SHADE,
|
||||
(dragLengthY / displayMetrics.density).toInt(),
|
||||
0 /* velocityDp */)
|
||||
lockscreenGestureLogger.log(
|
||||
LockscreenGestureLogger.LockscreenUiEvent.LOCKSCREEN_PULL_SHADE_OPEN)
|
||||
}
|
||||
|
||||
fun logDefaultGoToFullShadeAnimation(delay: Long) {
|
||||
buffer.log(TAG, LogLevel.DEBUG, {
|
||||
long1 = delay
|
||||
}, {
|
||||
"Default animation started to full shade with delay $long1"
|
||||
})
|
||||
}
|
||||
|
||||
fun logTryGoToLockedShade(keyguard: Boolean) {
|
||||
buffer.log(TAG, LogLevel.INFO, {
|
||||
bool1 = keyguard
|
||||
}, {
|
||||
"Trying to go to locked shade " + if (bool1) "from keyguard" else "not from keyguard"
|
||||
})
|
||||
}
|
||||
|
||||
fun logShadeDisabledOnGoToLockedShade() {
|
||||
buffer.log(TAG, LogLevel.WARNING, {}, {
|
||||
"The shade was disabled when trying to go to the locked shade"
|
||||
})
|
||||
}
|
||||
|
||||
fun logShowBouncerOnGoToLockedShade() {
|
||||
buffer.log(TAG, LogLevel.INFO, {}, {
|
||||
"Showing bouncer when trying to go to the locked shade"
|
||||
})
|
||||
}
|
||||
|
||||
fun logGoingToLockedShade(customAnimationHandler: Boolean) {
|
||||
buffer.log(TAG, LogLevel.INFO, {
|
||||
bool1 = customAnimationHandler
|
||||
}, {
|
||||
"Going to locked shade " + if (customAnimationHandler) "with" else "without" +
|
||||
" a custom handler"
|
||||
})
|
||||
}
|
||||
|
||||
fun logOnHideKeyguard() {
|
||||
buffer.log(TAG, LogLevel.INFO, {}, {
|
||||
"Notified that the keyguard is being hidden"
|
||||
})
|
||||
}
|
||||
|
||||
fun logPulseExpansionStarted() {
|
||||
buffer.log(TAG, LogLevel.INFO, {}, {
|
||||
"Pulse Expansion has started"
|
||||
})
|
||||
}
|
||||
|
||||
fun logPulseExpansionFinished(cancelled: Boolean) {
|
||||
if (cancelled) {
|
||||
buffer.log(TAG, LogLevel.INFO, {}, {
|
||||
"Pulse Expansion is requested to cancel"
|
||||
})
|
||||
} else {
|
||||
buffer.log(TAG, LogLevel.INFO, {}, {
|
||||
"Pulse Expansion is requested to finish"
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
fun logDragDownAnimation(target: Float) {
|
||||
buffer.log(TAG, LogLevel.DEBUG, {
|
||||
double1 = target.toDouble()
|
||||
}, {
|
||||
"Drag down amount animating to " + double1
|
||||
})
|
||||
}
|
||||
|
||||
fun logAnimationCancelled(isPulse: Boolean) {
|
||||
if (isPulse) {
|
||||
buffer.log(TAG, LogLevel.DEBUG, {}, {
|
||||
"Pulse animation cancelled"
|
||||
})
|
||||
} else {
|
||||
buffer.log(TAG, LogLevel.DEBUG, {}, {
|
||||
"drag down animation cancelled"
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
fun logDragDownAmountResetWhenFullyCollapsed() {
|
||||
buffer.log(TAG, LogLevel.WARNING, {}, {
|
||||
"Drag down amount stuck and reset after shade was fully collapsed"
|
||||
})
|
||||
}
|
||||
|
||||
fun logPulseHeightNotResetWhenFullyCollapsed() {
|
||||
buffer.log(TAG, LogLevel.WARNING, {}, {
|
||||
"Pulse height stuck and reset after shade was fully collapsed"
|
||||
})
|
||||
}
|
||||
|
||||
fun logGoingToLockedShadeAborted() {
|
||||
buffer.log(TAG, LogLevel.INFO, {}, {
|
||||
"Going to the Locked Shade has been aborted"
|
||||
})
|
||||
}
|
||||
}
|
||||
@@ -9,6 +9,8 @@ import com.android.systemui.ExpandHelper
|
||||
import com.android.systemui.R
|
||||
import com.android.systemui.SysuiTestCase
|
||||
import com.android.systemui.classifier.FalsingCollector
|
||||
import com.android.systemui.dump.DumpManager
|
||||
import com.android.systemui.log.LogBuffer
|
||||
import com.android.systemui.media.MediaHierarchyManager
|
||||
import com.android.systemui.plugins.FalsingManager
|
||||
import com.android.systemui.plugins.qs.QS
|
||||
@@ -18,7 +20,7 @@ import com.android.systemui.statusbar.notification.stack.AmbientState
|
||||
import com.android.systemui.statusbar.notification.stack.NotificationStackScrollLayout
|
||||
import com.android.systemui.statusbar.notification.stack.NotificationStackScrollLayoutController
|
||||
import com.android.systemui.statusbar.phone.KeyguardBypassController
|
||||
import com.android.systemui.statusbar.phone.LockscreenGestureLogger
|
||||
import com.android.systemui.statusbar.phone.LSShadeTransitionLogger
|
||||
import com.android.systemui.statusbar.phone.NotificationPanelViewController
|
||||
import com.android.systemui.statusbar.phone.ScrimController
|
||||
import com.android.systemui.statusbar.phone.StatusBar
|
||||
@@ -56,7 +58,8 @@ class LockscreenShadeTransitionControllerTest : SysuiTestCase() {
|
||||
lateinit var transitionController: LockscreenShadeTransitionController
|
||||
lateinit var row: ExpandableNotificationRow
|
||||
@Mock lateinit var statusbarStateController: SysuiStatusBarStateController
|
||||
@Mock lateinit var lockscreenGestureLogger: LockscreenGestureLogger
|
||||
@Mock lateinit var logger: LSShadeTransitionLogger
|
||||
@Mock lateinit var dumpManager: DumpManager
|
||||
@Mock lateinit var keyguardBypassController: KeyguardBypassController
|
||||
@Mock lateinit var lockScreenUserManager: NotificationLockscreenUserManager
|
||||
@Mock lateinit var falsingCollector: FalsingCollector
|
||||
@@ -66,6 +69,7 @@ class LockscreenShadeTransitionControllerTest : SysuiTestCase() {
|
||||
@Mock lateinit var scrimController: ScrimController
|
||||
@Mock lateinit var configurationController: ConfigurationController
|
||||
@Mock lateinit var falsingManager: FalsingManager
|
||||
@Mock lateinit var buffer: LogBuffer
|
||||
@Mock lateinit var notificationPanelController: NotificationPanelViewController
|
||||
@Mock lateinit var nsslController: NotificationStackScrollLayoutController
|
||||
@Mock lateinit var depthController: NotificationShadeDepthController
|
||||
@@ -86,18 +90,18 @@ class LockscreenShadeTransitionControllerTest : SysuiTestCase() {
|
||||
.addOverride(R.bool.config_use_split_notification_shade, false)
|
||||
transitionController = LockscreenShadeTransitionController(
|
||||
statusBarStateController = statusbarStateController,
|
||||
lockscreenGestureLogger = lockscreenGestureLogger,
|
||||
logger = logger,
|
||||
keyguardBypassController = keyguardBypassController,
|
||||
lockScreenUserManager = lockScreenUserManager,
|
||||
falsingCollector = falsingCollector,
|
||||
ambientState = ambientState,
|
||||
displayMetrics = displayMetrics,
|
||||
mediaHierarchyManager = mediaHierarchyManager,
|
||||
scrimController = scrimController,
|
||||
depthController = depthController,
|
||||
context = context,
|
||||
configurationController = configurationController,
|
||||
falsingManager = falsingManager
|
||||
falsingManager = falsingManager,
|
||||
dumpManager = dumpManager
|
||||
)
|
||||
whenever(nsslController.view).thenReturn(stackscroller)
|
||||
whenever(nsslController.expandHelperCallback).thenReturn(expandHelperCallback)
|
||||
|
||||
@@ -385,7 +385,8 @@ public class NotificationPanelViewControllerTest extends SysuiTestCase {
|
||||
mStatusBarStateController,
|
||||
mFalsingManager,
|
||||
mLockscreenShadeTransitionController,
|
||||
new FalsingCollectorFake());
|
||||
new FalsingCollectorFake(),
|
||||
mDumpManager);
|
||||
when(mKeyguardStatusViewComponentFactory.build(any()))
|
||||
.thenReturn(mKeyguardStatusViewComponent);
|
||||
when(mKeyguardStatusViewComponent.getKeyguardClockSwitchController())
|
||||
|
||||
Reference in New Issue
Block a user