Merge "Fixed an issue where the user could be stuck with pulse expanding" into sc-v2-dev am: 3ba0620ec6

Original change: https://googleplex-android-review.googlesource.com/c/platform/frameworks/base/+/16576585

Change-Id: I0918991d3982b919209b7cb70a3d8183960b5203
This commit is contained in:
TreeHugger Robot
2022-01-07 15:54:03 +00:00
committed by Automerger Merge Worker
7 changed files with 335 additions and 29 deletions

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 lockscreen to shade transition events. */
@Qualifier
@Documented
@Retention(RUNTIME)
public @interface LSShadeTransitionLog {
}

View File

@@ -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

View File

@@ -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
}

View File

@@ -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")
}
}
}

View File

@@ -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"
})
}
}

View File

@@ -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)

View File

@@ -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())