diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/NotificationActivityStarter.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/NotificationActivityStarter.java index 129fa5a7cc179..0c341cc92f834 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/NotificationActivityStarter.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/NotificationActivityStarter.java @@ -17,7 +17,6 @@ package com.android.systemui.statusbar.notification; import android.content.Intent; -import android.service.notification.StatusBarNotification; import android.view.View; import com.android.systemui.statusbar.notification.collection.NotificationEntry; @@ -29,7 +28,7 @@ import com.android.systemui.statusbar.notification.row.ExpandableNotificationRow */ public interface NotificationActivityStarter { /** Called when the user clicks on the surface of a notification. */ - void onNotificationClicked(StatusBarNotification sbn, ExpandableNotificationRow row); + void onNotificationClicked(NotificationEntry entry, ExpandableNotificationRow row); /** Called when the user clicks on a button in the notification guts which fires an intent. */ void startNotificationGutsIntent(Intent intent, int appUid, diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/NotificationClicker.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/NotificationClicker.java index 392145ad306a1..c3ce593b54fdf 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/NotificationClicker.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/NotificationClicker.java @@ -104,7 +104,7 @@ public final class NotificationClicker implements View.OnClickListener { mBubblesOptional.get().collapseStack(); } - mNotificationActivityStarter.onNotificationClicked(entry.getSbn(), row); + mNotificationActivityStarter.onNotificationClicked(entry, row); } private boolean isMenuVisible(ExpandableNotificationRow row) { diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/NotificationClickerLogger.kt b/packages/SystemUI/src/com/android/systemui/statusbar/notification/NotificationClickerLogger.kt index fbf033bd22912..ad3dfedcdb969 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/NotificationClickerLogger.kt +++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/NotificationClickerLogger.kt @@ -27,7 +27,7 @@ class NotificationClickerLogger @Inject constructor( ) { fun logOnClick(entry: NotificationEntry) { buffer.log(TAG, LogLevel.DEBUG, { - str1 = entry.key + str1 = entry.logKey str2 = entry.ranking.channel.id }, { "CLICK $str1 (channel=$str2)" @@ -36,7 +36,7 @@ class NotificationClickerLogger @Inject constructor( fun logMenuVisible(entry: NotificationEntry) { buffer.log(TAG, LogLevel.DEBUG, { - str1 = entry.key + str1 = entry.logKey }, { "Ignoring click on $str1; menu is visible" }) @@ -44,7 +44,7 @@ class NotificationClickerLogger @Inject constructor( fun logParentMenuVisible(entry: NotificationEntry) { buffer.log(TAG, LogLevel.DEBUG, { - str1 = entry.key + str1 = entry.logKey }, { "Ignoring click on $str1; parent menu is visible" }) @@ -52,7 +52,7 @@ class NotificationClickerLogger @Inject constructor( fun logChildrenExpanded(entry: NotificationEntry) { buffer.log(TAG, LogLevel.DEBUG, { - str1 = entry.key + str1 = entry.logKey }, { "Ignoring click on $str1; children are expanded" }) @@ -60,7 +60,7 @@ class NotificationClickerLogger @Inject constructor( fun logGutsExposed(entry: NotificationEntry) { buffer.log(TAG, LogLevel.DEBUG, { - str1 = entry.key + str1 = entry.logKey }, { "Ignoring click on $str1; guts are exposed" }) diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/NotificationUtils.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/NotificationUtils.java index c3cc97bc14a3f..7cfb1571ccf07 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/NotificationUtils.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/NotificationUtils.java @@ -24,7 +24,8 @@ import android.widget.ImageView; import com.android.internal.util.ContrastColorUtil; import com.android.systemui.R; -import com.android.systemui.statusbar.notification.collection.NotificationEntry; +import com.android.systemui.statusbar.notification.collection.ListEntry; +import com.android.systemui.util.Compile; /** * A util class for various reusable functions @@ -74,12 +75,18 @@ public class NotificationUtils { return (int) (dimensionPixelSize * factor); } + private static final boolean INCLUDE_HASH_CODE_IN_LIST_ENTRY_LOG_KEY = false; + /** Get the notification key, reformatted for logging, for the (optional) entry */ - public static String logKey(NotificationEntry entry) { + public static String logKey(ListEntry entry) { if (entry == null) { return "null"; } - return logKey(entry.getKey()); + if (Compile.IS_DEBUG && INCLUDE_HASH_CODE_IN_LIST_ENTRY_LOG_KEY) { + return logKey(entry.getKey()) + "@" + Integer.toHexString(entry.hashCode()); + } else { + return logKey(entry.getKey()); + } } /** Removes newlines from the notification key to prettify apps that have these in the tag */ diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/NotificationUtils.kt b/packages/SystemUI/src/com/android/systemui/statusbar/notification/NotificationUtils.kt new file mode 100644 index 0000000000000..432bac49fa9b5 --- /dev/null +++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/NotificationUtils.kt @@ -0,0 +1,31 @@ +/* + * 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.notification + +import android.service.notification.StatusBarNotification +import com.android.systemui.statusbar.notification.collection.ListEntry + +/** Get the notification key, reformatted for logging, for the (optional) entry */ +val ListEntry?.logKey: String? + get() = this?.let { NotificationUtils.logKey(it) } + +/** Get the notification key, reformatted for logging, for the (optional) sbn */ +val StatusBarNotification?.logKey: String? + get() = this?.key?.let { NotificationUtils.logKey(it) } + +/** Removes newlines from the notification key to prettify apps that have these in the tag */ +fun logKey(key: String?): String? = NotificationUtils.logKey(key) \ No newline at end of file diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarNotificationActivityStarter.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarNotificationActivityStarter.java index 87ca942edff2c..af4c81b4181d8 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarNotificationActivityStarter.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarNotificationActivityStarter.java @@ -229,14 +229,13 @@ class StatusBarNotificationActivityStarter implements NotificationActivityStarte /** * Called when a notification is clicked. * - * @param sbn notification that was clicked + * @param entry notification that was clicked * @param row row for that notification */ @Override - public void onNotificationClicked(StatusBarNotification sbn, ExpandableNotificationRow row) { - mLogger.logStartingActivityFromClick(sbn.getKey()); + public void onNotificationClicked(NotificationEntry entry, ExpandableNotificationRow row) { + mLogger.logStartingActivityFromClick(entry); - final NotificationEntry entry = row.getEntry(); if (mRemoteInputManager.isRemoteInputActive(entry) && !TextUtils.isEmpty(row.getActiveRemoteInputText())) { // We have an active remote input typed and the user clicked on the notification. @@ -244,7 +243,7 @@ class StatusBarNotificationActivityStarter implements NotificationActivityStarte mRemoteInputManager.closeRemoteInputs(); return; } - Notification notification = sbn.getNotification(); + Notification notification = entry.getSbn().getNotification(); final PendingIntent intent = notification.contentIntent != null ? notification.contentIntent : notification.fullScreenIntent; @@ -254,7 +253,7 @@ class StatusBarNotificationActivityStarter implements NotificationActivityStarte // The only valid case is Bubble notifications. Guard against other cases // entering here. if (intent == null && !isBubble) { - mLogger.logNonClickableNotification(sbn.getKey()); + mLogger.logNonClickableNotification(entry); return; } @@ -299,7 +298,7 @@ class StatusBarNotificationActivityStarter implements NotificationActivityStarte boolean isActivityIntent, boolean animate, boolean showOverLockscreen) { - mLogger.logHandleClickAfterKeyguardDismissed(entry.getKey()); + mLogger.logHandleClickAfterKeyguardDismissed(entry); final Runnable runnable = () -> handleNotificationClickAfterPanelCollapsed( entry, row, intent, isActivityIntent, animate); @@ -326,7 +325,7 @@ class StatusBarNotificationActivityStarter implements NotificationActivityStarte boolean isActivityIntent, boolean animate) { String notificationKey = entry.getKey(); - mLogger.logHandleClickAfterPanelCollapsed(notificationKey); + mLogger.logHandleClickAfterPanelCollapsed(entry); try { // The intent we are sending is for the application, which @@ -367,7 +366,7 @@ class StatusBarNotificationActivityStarter implements NotificationActivityStarte } final boolean canBubble = entry.canBubble(); if (canBubble) { - mLogger.logExpandingBubble(notificationKey); + mLogger.logExpandingBubble(entry); removeHunAfterClick(row); expandBubbleStackOnMainThread(entry); mMainThreadHandler.post( @@ -489,7 +488,7 @@ class StatusBarNotificationActivityStarter implements NotificationActivityStarte ExpandableNotificationRow row, boolean animate, boolean isActivityIntent) { - mLogger.logStartNotificationIntent(entry.getKey()); + mLogger.logStartNotificationIntent(entry); try { Runnable onFinishAnimationCallback = animate ? () -> mLaunchEventsEmitter.notifyFinishLaunchNotifActivity(entry) @@ -515,7 +514,7 @@ class StatusBarNotificationActivityStarter implements NotificationActivityStarte : getActivityOptions(mCentralSurfaces.getDisplayId(), adapter); int result = intent.sendAndReturnResult(mContext, 0, fillInIntent, null, null, null, options); - mLogger.logSendPendingIntent(entry.getKey(), intent, result); + mLogger.logSendPendingIntent(entry, intent, result); return result; }); } catch (PendingIntent.CanceledException e) { @@ -622,9 +621,9 @@ class StatusBarNotificationActivityStarter implements NotificationActivityStarte void handleFullScreenIntent(NotificationEntry entry) { if (mNotificationInterruptStateProvider.shouldLaunchFullScreenIntentWhenAdded(entry)) { if (shouldSuppressFullScreenIntent(entry)) { - mLogger.logFullScreenIntentSuppressedByDnD(entry.getKey()); + mLogger.logFullScreenIntentSuppressedByDnD(entry); } else if (entry.getImportance() < NotificationManager.IMPORTANCE_HIGH) { - mLogger.logFullScreenIntentNotImportantEnough(entry.getKey()); + mLogger.logFullScreenIntentNotImportantEnough(entry); } else { // Stop screensaver if the notification has a fullscreen intent. // (like an incoming phone call) @@ -639,7 +638,7 @@ class StatusBarNotificationActivityStarter implements NotificationActivityStarte // not immersive & a fullscreen alert should be shown final PendingIntent fullscreenIntent = entry.getSbn().getNotification().fullScreenIntent; - mLogger.logSendingFullScreenIntent(entry.getKey(), fullscreenIntent); + mLogger.logSendingFullScreenIntent(entry, fullscreenIntent); try { EventLog.writeEvent(EventLogTags.SYSUI_FULLSCREEN_NOTIFICATION, entry.getKey()); diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarNotificationActivityStarterLogger.kt b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarNotificationActivityStarterLogger.kt index 2fbe520a4b610..b9a1413ff7914 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarNotificationActivityStarterLogger.kt +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarNotificationActivityStarterLogger.kt @@ -23,46 +23,48 @@ import com.android.systemui.log.LogLevel.ERROR import com.android.systemui.log.LogLevel.INFO import com.android.systemui.log.LogLevel.WARNING import com.android.systemui.log.dagger.NotifInteractionLog +import com.android.systemui.statusbar.notification.collection.NotificationEntry +import com.android.systemui.statusbar.notification.logKey import javax.inject.Inject class StatusBarNotificationActivityStarterLogger @Inject constructor( @NotifInteractionLog private val buffer: LogBuffer ) { - fun logStartingActivityFromClick(key: String) { + fun logStartingActivityFromClick(entry: NotificationEntry) { buffer.log(TAG, DEBUG, { - str1 = key + str1 = entry.logKey }, { "(1/5) onNotificationClicked: $str1" }) } - fun logHandleClickAfterKeyguardDismissed(key: String) { + fun logHandleClickAfterKeyguardDismissed(entry: NotificationEntry) { buffer.log(TAG, DEBUG, { - str1 = key + str1 = entry.logKey }, { "(2/5) handleNotificationClickAfterKeyguardDismissed: $str1" }) } - fun logHandleClickAfterPanelCollapsed(key: String) { + fun logHandleClickAfterPanelCollapsed(entry: NotificationEntry) { buffer.log(TAG, DEBUG, { - str1 = key + str1 = entry.logKey }, { "(3/5) handleNotificationClickAfterPanelCollapsed: $str1" }) } - fun logStartNotificationIntent(key: String) { + fun logStartNotificationIntent(entry: NotificationEntry) { buffer.log(TAG, INFO, { - str1 = key + str1 = entry.logKey }, { "(4/5) startNotificationIntent: $str1" }) } - fun logSendPendingIntent(key: String, pendingIntent: PendingIntent, result: Int) { + fun logSendPendingIntent(entry: NotificationEntry, pendingIntent: PendingIntent, result: Int) { buffer.log(TAG, INFO, { - str1 = key + str1 = entry.logKey str2 = pendingIntent.intent.toString() int1 = result }, { @@ -70,9 +72,9 @@ class StatusBarNotificationActivityStarterLogger @Inject constructor( }) } - fun logExpandingBubble(key: String) { + fun logExpandingBubble(entry: NotificationEntry) { buffer.log(TAG, DEBUG, { - str1 = key + str1 = entry.logKey }, { "Expanding bubble for $str1 (rather than firing intent)" }) @@ -86,33 +88,33 @@ class StatusBarNotificationActivityStarterLogger @Inject constructor( }) } - fun logNonClickableNotification(key: String) { + fun logNonClickableNotification(entry: NotificationEntry) { buffer.log(TAG, ERROR, { - str1 = key + str1 = entry.logKey }, { "onNotificationClicked called for non-clickable notification! $str1" }) } - fun logFullScreenIntentSuppressedByDnD(key: String) { + fun logFullScreenIntentSuppressedByDnD(entry: NotificationEntry) { buffer.log(TAG, DEBUG, { - str1 = key + str1 = entry.logKey }, { "No Fullscreen intent: suppressed by DND: $str1" }) } - fun logFullScreenIntentNotImportantEnough(key: String) { + fun logFullScreenIntentNotImportantEnough(entry: NotificationEntry) { buffer.log(TAG, DEBUG, { - str1 = key + str1 = entry.logKey }, { "No Fullscreen intent: not important enough: $str1" }) } - fun logSendingFullScreenIntent(key: String, pendingIntent: PendingIntent) { + fun logSendingFullScreenIntent(entry: NotificationEntry, pendingIntent: PendingIntent) { buffer.log(TAG, INFO, { - str1 = key + str1 = entry.logKey str2 = pendingIntent.intent.toString() }, { "Notification $str1 has fullScreenIntent; sending fullScreenIntent $str2" diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/StatusBarNotificationActivityStarterTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/StatusBarNotificationActivityStarterTest.java index fa867e2796f7c..f1a6eba129525 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/StatusBarNotificationActivityStarterTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/StatusBarNotificationActivityStarterTest.java @@ -265,15 +265,16 @@ public class StatusBarNotificationActivityStarterTest extends SysuiTestCase { public void testOnNotificationClicked_keyGuardShowing() throws PendingIntent.CanceledException, RemoteException { // Given - StatusBarNotification sbn = mNotificationRow.getEntry().getSbn(); - sbn.getNotification().contentIntent = mContentIntent; - sbn.getNotification().flags |= Notification.FLAG_AUTO_CANCEL; + NotificationEntry entry = mNotificationRow.getEntry(); + Notification notification = entry.getSbn().getNotification(); + notification.contentIntent = mContentIntent; + notification.flags |= Notification.FLAG_AUTO_CANCEL; when(mKeyguardStateController.isShowing()).thenReturn(true); when(mCentralSurfaces.isOccluded()).thenReturn(true); // When - mNotificationActivityStarter.onNotificationClicked(sbn, mNotificationRow); + mNotificationActivityStarter.onNotificationClicked(entry, mNotificationRow); // Then verify(mShadeController, atLeastOnce()).collapsePanel(); @@ -285,22 +286,23 @@ public class StatusBarNotificationActivityStarterTest extends SysuiTestCase { InOrder orderVerifier = Mockito.inOrder(mClickNotifier, mOnUserInteractionCallback); orderVerifier.verify(mClickNotifier).onNotificationClick( - eq(sbn.getKey()), any(NotificationVisibility.class)); + eq(entry.getKey()), any(NotificationVisibility.class)); // Notification calls dismiss callback to remove notification due to FLAG_AUTO_CANCEL - orderVerifier.verify(mOnUserInteractionCallback).onDismiss(mNotificationRow.getEntry(), + orderVerifier.verify(mOnUserInteractionCallback).onDismiss(entry, REASON_CLICK, null); } @Test public void testOnNotificationClicked_bubble_noContentIntent_noKeyGuard() throws RemoteException { - StatusBarNotification sbn = mBubbleNotificationRow.getEntry().getSbn(); + NotificationEntry entry = mBubbleNotificationRow.getEntry(); + StatusBarNotification sbn = entry.getSbn(); // Given sbn.getNotification().contentIntent = null; // When - mNotificationActivityStarter.onNotificationClicked(sbn, mBubbleNotificationRow); + mNotificationActivityStarter.onNotificationClicked(entry, mBubbleNotificationRow); // Then verify(mBubblesManager).expandStackAndSelectBubble(eq(mBubbleNotificationRow.getEntry())); @@ -311,7 +313,7 @@ public class StatusBarNotificationActivityStarterTest extends SysuiTestCase { verify(mAssistManager).hideAssist(); verify(mClickNotifier).onNotificationClick( - eq(sbn.getKey()), any(NotificationVisibility.class)); + eq(entry.getKey()), any(NotificationVisibility.class)); // The content intent should NOT be sent on click. verifyZeroInteractions(mContentIntent); @@ -324,7 +326,8 @@ public class StatusBarNotificationActivityStarterTest extends SysuiTestCase { @Test public void testOnNotificationClicked_bubble_noContentIntent_keyGuardShowing() throws RemoteException { - StatusBarNotification sbn = mBubbleNotificationRow.getEntry().getSbn(); + NotificationEntry entry = mBubbleNotificationRow.getEntry(); + StatusBarNotification sbn = entry.getSbn(); // Given sbn.getNotification().contentIntent = null; @@ -332,7 +335,7 @@ public class StatusBarNotificationActivityStarterTest extends SysuiTestCase { when(mCentralSurfaces.isOccluded()).thenReturn(true); // When - mNotificationActivityStarter.onNotificationClicked(sbn, mBubbleNotificationRow); + mNotificationActivityStarter.onNotificationClicked(entry, mBubbleNotificationRow); // Then verify(mBubblesManager).expandStackAndSelectBubble(eq(mBubbleNotificationRow.getEntry())); @@ -342,7 +345,7 @@ public class StatusBarNotificationActivityStarterTest extends SysuiTestCase { verify(mAssistManager).hideAssist(); verify(mClickNotifier).onNotificationClick( - eq(sbn.getKey()), any(NotificationVisibility.class)); + eq(entry.getKey()), any(NotificationVisibility.class)); // The content intent should NOT be sent on click. verifyZeroInteractions(mContentIntent); @@ -354,7 +357,8 @@ public class StatusBarNotificationActivityStarterTest extends SysuiTestCase { @Test public void testOnNotificationClicked_bubble_withContentIntent_keyGuardShowing() throws RemoteException { - StatusBarNotification sbn = mBubbleNotificationRow.getEntry().getSbn(); + NotificationEntry entry = mBubbleNotificationRow.getEntry(); + StatusBarNotification sbn = entry.getSbn(); // Given sbn.getNotification().contentIntent = mContentIntent; @@ -362,7 +366,7 @@ public class StatusBarNotificationActivityStarterTest extends SysuiTestCase { when(mCentralSurfaces.isOccluded()).thenReturn(true); // When - mNotificationActivityStarter.onNotificationClicked(sbn, mBubbleNotificationRow); + mNotificationActivityStarter.onNotificationClicked(entry, mBubbleNotificationRow); // Then verify(mBubblesManager).expandStackAndSelectBubble(mBubbleNotificationRow.getEntry()); @@ -372,7 +376,7 @@ public class StatusBarNotificationActivityStarterTest extends SysuiTestCase { verify(mAssistManager).hideAssist(); verify(mClickNotifier).onNotificationClick( - eq(sbn.getKey()), any(NotificationVisibility.class)); + eq(entry.getKey()), any(NotificationVisibility.class)); // The content intent should NOT be sent on click. verify(mContentIntent).getIntent(); @@ -408,16 +412,17 @@ public class StatusBarNotificationActivityStarterTest extends SysuiTestCase { @Test public void testNotifActivityStarterEventSourceStartEvent_onNotificationClicked() { + final NotificationEntry entry = mNotificationRow.getEntry(); NotifActivityLaunchEvents.Listener listener = mock(NotifActivityLaunchEvents.Listener.class); mLaunchEventsEmitter.registerListener(listener); - mNotificationActivityStarter - .onNotificationClicked(mNotificationRow.getEntry().getSbn(), mNotificationRow); - verify(listener).onStartLaunchNotifActivity(mNotificationRow.getEntry()); + mNotificationActivityStarter.onNotificationClicked(entry, mNotificationRow); + verify(listener).onStartLaunchNotifActivity(entry); } @Test public void testNotifActivityStarterEventSourceFinishEvent_dismissKeyguardCancelled() { + final NotificationEntry entry = mNotificationRow.getEntry(); NotifActivityLaunchEvents.Listener listener = mock(NotifActivityLaunchEvents.Listener.class); mLaunchEventsEmitter.registerListener(listener); @@ -428,34 +433,36 @@ public class StatusBarNotificationActivityStarterTest extends SysuiTestCase { .when(mActivityStarter) .dismissKeyguardThenExecute(any(OnDismissAction.class), any(), anyBoolean()); mNotificationActivityStarter - .onNotificationClicked(mNotificationRow.getEntry().getSbn(), mNotificationRow); - verify(listener).onFinishLaunchNotifActivity(mNotificationRow.getEntry()); + .onNotificationClicked(entry, mNotificationRow); + verify(listener).onFinishLaunchNotifActivity(entry); } @Test public void testNotifActivityStarterEventSourceFinishEvent_postPanelCollapse() throws Exception { + final NotificationEntry entry = mNotificationRow.getEntry(); NotifActivityLaunchEvents.Listener listener = mock(NotifActivityLaunchEvents.Listener.class); mLaunchEventsEmitter.registerListener(listener); mNotificationActivityStarter - .onNotificationClicked(mNotificationRow.getEntry().getSbn(), mNotificationRow); + .onNotificationClicked(entry, mNotificationRow); ArgumentCaptor controllerCaptor = ArgumentCaptor.forClass(ActivityLaunchAnimator.Controller.class); verify(mActivityLaunchAnimator).startPendingIntentWithAnimation( controllerCaptor.capture(), anyBoolean(), any(), any()); controllerCaptor.getValue().onIntentStarted(false); - verify(listener).onFinishLaunchNotifActivity(mNotificationRow.getEntry()); + verify(listener).onFinishLaunchNotifActivity(entry); } @Test public void testNotifActivityStarterEventSourceFinishEvent_postPanelCollapse_noAnimate() { + final NotificationEntry entry = mNotificationRow.getEntry(); NotifActivityLaunchEvents.Listener listener = mock(NotifActivityLaunchEvents.Listener.class); mLaunchEventsEmitter.registerListener(listener); when(mCentralSurfaces.shouldAnimateLaunch(anyBoolean())).thenReturn(false); mNotificationActivityStarter - .onNotificationClicked(mNotificationRow.getEntry().getSbn(), mNotificationRow); - verify(listener).onFinishLaunchNotifActivity(mNotificationRow.getEntry()); + .onNotificationClicked(entry, mNotificationRow); + verify(listener).onFinishLaunchNotifActivity(entry); } }