Loading packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/notification/collection/NotificationEntryAdapterTest.kt +36 −14 Original line number Diff line number Diff line Loading @@ -23,6 +23,7 @@ import android.app.PendingIntent import android.os.UserHandle import android.platform.test.annotations.EnableFlags import android.platform.test.flag.junit.SetFlagsRule import android.service.notification.NotificationListenerService.REASON_CANCEL import android.testing.TestableLooper.RunWithLooper import androidx.test.ext.junit.runners.AndroidJUnit4 import androidx.test.filters.SmallTest Loading @@ -35,6 +36,7 @@ import com.android.systemui.statusbar.notification.collection.provider.mockHighP import com.android.systemui.statusbar.notification.mockNotificationActivityStarter import com.android.systemui.statusbar.notification.people.PeopleNotificationIdentifier.Companion.TYPE_FULL_PERSON import com.android.systemui.statusbar.notification.row.ExpandableNotificationRow import com.android.systemui.statusbar.notification.row.OnUserInteractionCallback import com.android.systemui.statusbar.notification.row.entryAdapterFactory import com.android.systemui.statusbar.notification.row.mockNotificationActionClickManager import com.android.systemui.statusbar.notification.shared.NotificationBundleUi Loading @@ -46,10 +48,11 @@ import org.junit.Test import org.junit.runner.RunWith import org.mockito.ArgumentMatchers.anyLong import org.mockito.Mockito import org.mockito.Mockito.mock import org.mockito.Mockito.verify import org.mockito.kotlin.mock import org.mockito.kotlin.verify import org.mockito.kotlin.any import org.mockito.kotlin.eq import org.mockito.kotlin.whenever @SmallTest @RunWith(AndroidJUnit4::class) Loading Loading @@ -121,7 +124,7 @@ class NotificationEntryAdapterTest : SysuiTestCase() { @Test fun getRow_adapter() { val row = mock(ExpandableNotificationRow::class.java) val row : ExpandableNotificationRow = mock() val notification: Notification = Notification.Builder(mContext, "").setSmallIcon(R.drawable.ic_person).build() Loading @@ -138,7 +141,7 @@ class NotificationEntryAdapterTest : SysuiTestCase() { @Test fun isGroupRoot_adapter_groupSummary() { val row = mock(ExpandableNotificationRow::class.java) val row : ExpandableNotificationRow = mock() val notification: Notification = Notification.Builder(mContext, "") .setSmallIcon(R.drawable.ic_person) Loading Loading @@ -183,7 +186,7 @@ class NotificationEntryAdapterTest : SysuiTestCase() { @Test fun isClearable_adapter() { val row = mock(ExpandableNotificationRow::class.java) val row : ExpandableNotificationRow = mock() val notification: Notification = Notification.Builder(mContext, "").setSmallIcon(R.drawable.ic_person).build() Loading @@ -200,7 +203,7 @@ class NotificationEntryAdapterTest : SysuiTestCase() { @Test fun getSummarization_adapter() { val row = mock(ExpandableNotificationRow::class.java) val row : ExpandableNotificationRow = mock() val notification: Notification = Notification.Builder(mContext, "").setSmallIcon(R.drawable.ic_person).build() Loading @@ -219,7 +222,7 @@ class NotificationEntryAdapterTest : SysuiTestCase() { @Test fun getIcons_adapter() { val row = mock(ExpandableNotificationRow::class.java) val row : ExpandableNotificationRow = mock() val notification: Notification = Notification.Builder(mContext, "").setSmallIcon(R.drawable.ic_person).build() Loading Loading @@ -321,7 +324,7 @@ class NotificationEntryAdapterTest : SysuiTestCase() { assertThat(underTest.isMarkedForUserTriggeredMovement) .isEqualTo(entry.isMarkedForUserTriggeredMovement) underTest.markForUserTriggeredMovement() underTest.markForUserTriggeredMovement(true) assertThat(underTest.isMarkedForUserTriggeredMovement) .isEqualTo(entry.isMarkedForUserTriggeredMovement) } Loading Loading @@ -358,7 +361,7 @@ class NotificationEntryAdapterTest : SysuiTestCase() { @Test fun canDragAndDrop() { val pi = mock(PendingIntent::class.java) val pi : PendingIntent = mock() Mockito.`when`(pi.isActivity).thenReturn(true) val notification: Notification = Notification.Builder(mContext, "") Loading Loading @@ -444,7 +447,7 @@ class NotificationEntryAdapterTest : SysuiTestCase() { val notification: Notification = Notification.Builder(mContext, "") .setSmallIcon(R.drawable.ic_person) .setFullScreenIntent(mock(PendingIntent::class.java), true) .setFullScreenIntent(mock(), true) .build() val entry = Loading @@ -462,7 +465,7 @@ class NotificationEntryAdapterTest : SysuiTestCase() { val notification: Notification = Notification.Builder(mContext, "") .setSmallIcon(R.drawable.ic_person) .addAction(mock(Notification.Action::class.java)) .addAction(mock()) .build() val entry = NotificationEntryBuilder().setNotification(notification).build() Loading Loading @@ -490,7 +493,7 @@ class NotificationEntryAdapterTest : SysuiTestCase() { val notification: Notification = Notification.Builder(mContext, "") .setSmallIcon(R.drawable.ic_person) .addAction(mock(Notification.Action::class.java)) .addAction(mock()) .build() val entry = NotificationEntryBuilder().setNotification(notification).build() Loading Loading @@ -518,10 +521,10 @@ class NotificationEntryAdapterTest : SysuiTestCase() { val notification: Notification = Notification.Builder(mContext, "") .setSmallIcon(R.drawable.ic_person) .addAction(mock(Notification.Action::class.java)) .addAction(mock()) .build() val entry = NotificationEntryBuilder().setNotification(notification).build() val row = mock(ExpandableNotificationRow::class.java) val row : ExpandableNotificationRow= mock() underTest = factory.create(entry) as NotificationEntryAdapter Loading @@ -530,6 +533,25 @@ class NotificationEntryAdapterTest : SysuiTestCase() { } @Test fun registerFutureDismissal() { val notification: Notification = Notification.Builder(mContext, "") .setSmallIcon(R.drawable.ic_person) .addAction(mock()) .build() val entry = NotificationEntryBuilder().setNotification(notification).build() val callback: OnUserInteractionCallback = mock() whenever(callback.registerFutureDismissal(any(), any())).thenReturn(mock()) underTest = factory.create(entry) as NotificationEntryAdapter underTest.registerFutureDismissal( callback, REASON_CANCEL, ) verify(callback).registerFutureDismissal(entry, REASON_CANCEL) } fun getRemoteInputEntryAdapter() { val notification: Notification = Notification.Builder(mContext, "").setSmallIcon(R.drawable.ic_person).build() Loading packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/notification/stack/NotificationStackScrollLayoutControllerTest.java +31 −11 Original line number Diff line number Diff line Loading @@ -87,6 +87,7 @@ import com.android.systemui.statusbar.notification.row.ExpandableNotificationRow import com.android.systemui.statusbar.notification.row.NotificationGutsManager; import com.android.systemui.statusbar.notification.row.NotificationTestHelper; import com.android.systemui.statusbar.notification.shared.GroupHunAnimationFix; import com.android.systemui.statusbar.notification.shared.NotificationBundleUi; import com.android.systemui.statusbar.notification.stack.NotificationStackScrollLayoutController.NotificationPanelEvent; import com.android.systemui.statusbar.notification.stack.NotificationSwipeHelper.NotificationCallback; import com.android.systemui.statusbar.notification.stack.ui.viewbinder.NotificationListViewBinder; Loading Loading @@ -124,7 +125,6 @@ public class NotificationStackScrollLayoutControllerTest extends SysuiTestCase { @Mock private NotificationsController mNotificationsController; @Mock private NotificationVisibilityProvider mVisibilityProvider; @Mock private NotificationWakeUpCoordinator mNotificationWakeUpCoordinator; @Mock private HeadsUpManager mHeadsUpManager; @Mock private HeadsUpTouchHelper.Callback mHeadsUpCallback; @Mock private Provider<IStatusBarService> mStatusBarService; @Mock private NotificationRoundnessManager mNotificationRoundnessManager; Loading Loading @@ -227,7 +227,7 @@ public class NotificationStackScrollLayoutControllerTest extends SysuiTestCase { row.setHeadsUpAnimatingAway(true); // Then: mHeadsUpManager.onEntryAnimatingAwayEnded is not called verify(mHeadsUpManager, never()).onEntryAnimatingAwayEnded(row.getEntry()); verify(mKosmos.getMockHeadsUpManager(), never()).onEntryAnimatingAwayEnded(row.getEntry()); } @Test Loading @@ -238,7 +238,7 @@ public class NotificationStackScrollLayoutControllerTest extends SysuiTestCase { initController(/* viewIsAttached= */ true); mController.setHeadsUpAppearanceController(mock(HeadsUpAppearanceController.class)); NotificationListContainer listContainer = mController.getNotificationListContainer(); ExpandableNotificationRow row = mNotificationTestHelper.createRow(); ExpandableNotificationRow row = mKosmos.createRow(); listContainer.bindRow(row); row.setHeadsUpAnimatingAway(true); Loading @@ -246,7 +246,7 @@ public class NotificationStackScrollLayoutControllerTest extends SysuiTestCase { row.setHeadsUpAnimatingAway(false); // Then: mHeadsUpManager.onEntryAnimatingAwayEnded is called verify(mHeadsUpManager).onEntryAnimatingAwayEnded(row.getEntry()); verify(mKosmos.getMockHeadsUpManager()).onEntryAnimatingAwayEnded(any()); } @Test public void testOnDensityOrFontScaleChanged_reInflatesFooterViews() { Loading Loading @@ -570,8 +570,13 @@ public class NotificationStackScrollLayoutControllerTest extends SysuiTestCase { @Test public void testOnMenuShownLogging() { ExpandableNotificationRow row = mock(ExpandableNotificationRow.class, RETURNS_DEEP_STUBS); when(row.getEntry().getSbn().getLogMaker()).thenReturn(new LogMaker( if (NotificationBundleUi.isEnabled()) { when(row.getEntryAdapter().getSbn().getLogMaker()).thenReturn(new LogMaker( MetricsProto.MetricsEvent.VIEW_UNKNOWN)); } else { when(row.getEntryLegacy().getSbn().getLogMaker()).thenReturn(new LogMaker( MetricsProto.MetricsEvent.VIEW_UNKNOWN)); } ArgumentCaptor<OnMenuEventListener> onMenuEventListenerArgumentCaptor = ArgumentCaptor.forClass(OnMenuEventListener.class); Loading @@ -583,7 +588,12 @@ public class NotificationStackScrollLayoutControllerTest extends SysuiTestCase { OnMenuEventListener onMenuEventListener = onMenuEventListenerArgumentCaptor.getValue(); onMenuEventListener.onMenuShown(row); verify(row.getEntry().getSbn()).getLogMaker(); // This writes most of the log data // This writes most of the log data if (NotificationBundleUi.isEnabled()) { verify(row.getEntryAdapter().getSbn()).getLogMaker(); } else { verify(row.getEntryLegacy().getSbn()).getLogMaker(); } verify(mMetricsLogger).write(logMatcher(MetricsProto.MetricsEvent.ACTION_REVEAL_GEAR, MetricsProto.MetricsEvent.TYPE_ACTION)); } Loading Loading @@ -621,8 +631,13 @@ public class NotificationStackScrollLayoutControllerTest extends SysuiTestCase { @Test public void testOnMenuClickedLogging() { ExpandableNotificationRow row = mock(ExpandableNotificationRow.class, RETURNS_DEEP_STUBS); when(row.getEntry().getSbn().getLogMaker()).thenReturn(new LogMaker( if (NotificationBundleUi.isEnabled()) { when(row.getEntryAdapter().getSbn().getLogMaker()).thenReturn(new LogMaker( MetricsProto.MetricsEvent.VIEW_UNKNOWN)); } else { when(row.getEntryLegacy().getSbn().getLogMaker()).thenReturn(new LogMaker( MetricsProto.MetricsEvent.VIEW_UNKNOWN)); } ArgumentCaptor<OnMenuEventListener> onMenuEventListenerArgumentCaptor = ArgumentCaptor.forClass(OnMenuEventListener.class); Loading @@ -635,7 +650,12 @@ public class NotificationStackScrollLayoutControllerTest extends SysuiTestCase { onMenuEventListener.onMenuClicked(row, 0, 0, mock( NotificationMenuRowPlugin.MenuItem.class)); verify(row.getEntry().getSbn()).getLogMaker(); // This writes most of the log data // This writes most of the log data if (NotificationBundleUi.isEnabled()) { verify(row.getEntryAdapter().getSbn()).getLogMaker(); } else { verify(row.getEntryLegacy().getSbn()).getLogMaker(); } verify(mMetricsLogger).write(logMatcher(MetricsProto.MetricsEvent.ACTION_TOUCH_GEAR, MetricsProto.MetricsEvent.TYPE_ACTION)); } Loading Loading @@ -764,7 +784,7 @@ public class NotificationStackScrollLayoutControllerTest extends SysuiTestCase { mNotificationsController, mVisibilityProvider, mNotificationWakeUpCoordinator, mHeadsUpManager, mKosmos.getMockHeadsUpManager(), mStatusBarService, mNotificationRoundnessManager, mTunerService, Loading packages/SystemUI/src/com/android/systemui/statusbar/HeadsUpStatusBarView.java +3 −2 Original line number Diff line number Diff line Loading @@ -29,7 +29,7 @@ import com.android.keyguard.AlphaOptimizedLinearLayout; import com.android.systemui.plugins.DarkIconDispatcher; import com.android.systemui.res.R; import com.android.systemui.statusbar.notification.collection.NotificationEntry; import com.android.systemui.statusbar.notification.collection.NotificationEntry.OnSensitivityChangedListener; import com.android.systemui.statusbar.notification.collection.PipelineEntry; import java.util.ArrayList; Loading Loading @@ -125,7 +125,8 @@ public class HeadsUpStatusBarView extends AlphaOptimizedLinearLayout { } } private final OnSensitivityChangedListener mOnSensitivityChangedListener = entry -> { private final PipelineEntry.OnSensitivityChangedListener mOnSensitivityChangedListener = entry -> { if (entry != mShowingEntry) { throw new IllegalStateException("Got a sensitivity change for " + entry + " but mShowingEntry is " + mShowingEntry); Loading packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/BundleEntryAdapter.kt +51 −1 Original line number Diff line number Diff line Loading @@ -27,6 +27,9 @@ import com.android.systemui.statusbar.notification.collection.provider.HighPrior import com.android.systemui.statusbar.notification.icon.IconPack import com.android.systemui.statusbar.notification.people.PeopleNotificationIdentifier.Companion.TYPE_NON_PERSON import com.android.systemui.statusbar.notification.row.ExpandableNotificationRow import com.android.systemui.statusbar.notification.row.NotifBindPipeline import com.android.systemui.statusbar.notification.row.OnUserInteractionCallback import com.android.systemui.statusbar.notification.row.RowContentBindStage import kotlinx.coroutines.flow.StateFlow class BundleEntryAdapter( Loading Loading @@ -120,7 +123,7 @@ class BundleEntryAdapter( Log.wtf(TAG, "onImportanceChanged() called") } override fun markForUserTriggeredMovement() { override fun markForUserTriggeredMovement(marked: Boolean) { Log.wtf(TAG, "markForUserTriggeredMovement() called") } Loading Loading @@ -200,6 +203,53 @@ class BundleEntryAdapter( override fun getRemoteInputEntryAdapter(): RemoteInputEntryAdapter? { return null } override fun addOnSensitivityChangedListener( listener: PipelineEntry.OnSensitivityChangedListener? ) { entry.addOnSensitivityChangedListener(listener) } override fun removeOnSensitivityChangedListener( listener: PipelineEntry.OnSensitivityChangedListener? ) { entry.removeOnSensitivityChangedListener(listener) } override fun setSeenInShade(seen: Boolean) { entry.isSeenInShade = seen } override fun isSeenInShade(): Boolean { return entry.isSeenInShade } override fun onEntryAnimatingAwayEnded() { Log.wtf(TAG, "onEntryAnimatingAwayEnded() called") } override fun registerFutureDismissal( callback: OnUserInteractionCallback, reason: Int, ): Runnable? { // TODO(b/389839319): what should the pipeline do when a bundle is dismissed? return null } override fun markForReinflation(stage: RowContentBindStage) { Log.wtf(TAG, "markForReinflation() called") } override fun isViewBacked(): Boolean { return false } override fun requestRebind( stage: RowContentBindStage, callback: NotifBindPipeline.BindCallback, ) { Log.wtf(TAG, "requestRebind() called") } } private const val TAG = "BundleEntryAdapter" packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/EntryAdapter.java +27 −1 Original line number Diff line number Diff line Loading @@ -27,6 +27,9 @@ import com.android.systemui.statusbar.notification.collection.notifcollection.No import com.android.systemui.statusbar.notification.icon.IconPack; import com.android.systemui.statusbar.notification.people.PeopleNotificationIdentifier; import com.android.systemui.statusbar.notification.row.ExpandableNotificationRow; import com.android.systemui.statusbar.notification.row.NotifBindPipeline; import com.android.systemui.statusbar.notification.row.OnUserInteractionCallback; import com.android.systemui.statusbar.notification.row.RowContentBindStage; import kotlinx.coroutines.flow.StateFlow; Loading Loading @@ -148,7 +151,7 @@ public interface EntryAdapter { * in the shade and change something about its appearance to delay the appearance change until * the ranking reordering is likely to have settled. */ void markForUserTriggeredMovement(); void markForUserTriggeredMovement(boolean marked); /** * Determines whether a row is considered 'high priority'. Loading Loading @@ -202,5 +205,28 @@ public interface EntryAdapter { void onEntryClicked(ExpandableNotificationRow row); @Nullable RemoteInputEntryAdapter getRemoteInputEntryAdapter(); /** Add a listener to be notified when the entry's sensitivity changes. */ void addOnSensitivityChangedListener( PipelineEntry.OnSensitivityChangedListener listener); /** Remove a listener that was registered above. */ void removeOnSensitivityChangedListener( PipelineEntry.OnSensitivityChangedListener listener); void setSeenInShade(boolean seen); boolean isSeenInShade(); void onEntryAnimatingAwayEnded(); Runnable registerFutureDismissal(@NonNull OnUserInteractionCallback callback, int reason); void markForReinflation(@NonNull RowContentBindStage stage); boolean isViewBacked(); void requestRebind(@NonNull RowContentBindStage stage, @NonNull NotifBindPipeline.BindCallback callback); } Loading
packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/notification/collection/NotificationEntryAdapterTest.kt +36 −14 Original line number Diff line number Diff line Loading @@ -23,6 +23,7 @@ import android.app.PendingIntent import android.os.UserHandle import android.platform.test.annotations.EnableFlags import android.platform.test.flag.junit.SetFlagsRule import android.service.notification.NotificationListenerService.REASON_CANCEL import android.testing.TestableLooper.RunWithLooper import androidx.test.ext.junit.runners.AndroidJUnit4 import androidx.test.filters.SmallTest Loading @@ -35,6 +36,7 @@ import com.android.systemui.statusbar.notification.collection.provider.mockHighP import com.android.systemui.statusbar.notification.mockNotificationActivityStarter import com.android.systemui.statusbar.notification.people.PeopleNotificationIdentifier.Companion.TYPE_FULL_PERSON import com.android.systemui.statusbar.notification.row.ExpandableNotificationRow import com.android.systemui.statusbar.notification.row.OnUserInteractionCallback import com.android.systemui.statusbar.notification.row.entryAdapterFactory import com.android.systemui.statusbar.notification.row.mockNotificationActionClickManager import com.android.systemui.statusbar.notification.shared.NotificationBundleUi Loading @@ -46,10 +48,11 @@ import org.junit.Test import org.junit.runner.RunWith import org.mockito.ArgumentMatchers.anyLong import org.mockito.Mockito import org.mockito.Mockito.mock import org.mockito.Mockito.verify import org.mockito.kotlin.mock import org.mockito.kotlin.verify import org.mockito.kotlin.any import org.mockito.kotlin.eq import org.mockito.kotlin.whenever @SmallTest @RunWith(AndroidJUnit4::class) Loading Loading @@ -121,7 +124,7 @@ class NotificationEntryAdapterTest : SysuiTestCase() { @Test fun getRow_adapter() { val row = mock(ExpandableNotificationRow::class.java) val row : ExpandableNotificationRow = mock() val notification: Notification = Notification.Builder(mContext, "").setSmallIcon(R.drawable.ic_person).build() Loading @@ -138,7 +141,7 @@ class NotificationEntryAdapterTest : SysuiTestCase() { @Test fun isGroupRoot_adapter_groupSummary() { val row = mock(ExpandableNotificationRow::class.java) val row : ExpandableNotificationRow = mock() val notification: Notification = Notification.Builder(mContext, "") .setSmallIcon(R.drawable.ic_person) Loading Loading @@ -183,7 +186,7 @@ class NotificationEntryAdapterTest : SysuiTestCase() { @Test fun isClearable_adapter() { val row = mock(ExpandableNotificationRow::class.java) val row : ExpandableNotificationRow = mock() val notification: Notification = Notification.Builder(mContext, "").setSmallIcon(R.drawable.ic_person).build() Loading @@ -200,7 +203,7 @@ class NotificationEntryAdapterTest : SysuiTestCase() { @Test fun getSummarization_adapter() { val row = mock(ExpandableNotificationRow::class.java) val row : ExpandableNotificationRow = mock() val notification: Notification = Notification.Builder(mContext, "").setSmallIcon(R.drawable.ic_person).build() Loading @@ -219,7 +222,7 @@ class NotificationEntryAdapterTest : SysuiTestCase() { @Test fun getIcons_adapter() { val row = mock(ExpandableNotificationRow::class.java) val row : ExpandableNotificationRow = mock() val notification: Notification = Notification.Builder(mContext, "").setSmallIcon(R.drawable.ic_person).build() Loading Loading @@ -321,7 +324,7 @@ class NotificationEntryAdapterTest : SysuiTestCase() { assertThat(underTest.isMarkedForUserTriggeredMovement) .isEqualTo(entry.isMarkedForUserTriggeredMovement) underTest.markForUserTriggeredMovement() underTest.markForUserTriggeredMovement(true) assertThat(underTest.isMarkedForUserTriggeredMovement) .isEqualTo(entry.isMarkedForUserTriggeredMovement) } Loading Loading @@ -358,7 +361,7 @@ class NotificationEntryAdapterTest : SysuiTestCase() { @Test fun canDragAndDrop() { val pi = mock(PendingIntent::class.java) val pi : PendingIntent = mock() Mockito.`when`(pi.isActivity).thenReturn(true) val notification: Notification = Notification.Builder(mContext, "") Loading Loading @@ -444,7 +447,7 @@ class NotificationEntryAdapterTest : SysuiTestCase() { val notification: Notification = Notification.Builder(mContext, "") .setSmallIcon(R.drawable.ic_person) .setFullScreenIntent(mock(PendingIntent::class.java), true) .setFullScreenIntent(mock(), true) .build() val entry = Loading @@ -462,7 +465,7 @@ class NotificationEntryAdapterTest : SysuiTestCase() { val notification: Notification = Notification.Builder(mContext, "") .setSmallIcon(R.drawable.ic_person) .addAction(mock(Notification.Action::class.java)) .addAction(mock()) .build() val entry = NotificationEntryBuilder().setNotification(notification).build() Loading Loading @@ -490,7 +493,7 @@ class NotificationEntryAdapterTest : SysuiTestCase() { val notification: Notification = Notification.Builder(mContext, "") .setSmallIcon(R.drawable.ic_person) .addAction(mock(Notification.Action::class.java)) .addAction(mock()) .build() val entry = NotificationEntryBuilder().setNotification(notification).build() Loading Loading @@ -518,10 +521,10 @@ class NotificationEntryAdapterTest : SysuiTestCase() { val notification: Notification = Notification.Builder(mContext, "") .setSmallIcon(R.drawable.ic_person) .addAction(mock(Notification.Action::class.java)) .addAction(mock()) .build() val entry = NotificationEntryBuilder().setNotification(notification).build() val row = mock(ExpandableNotificationRow::class.java) val row : ExpandableNotificationRow= mock() underTest = factory.create(entry) as NotificationEntryAdapter Loading @@ -530,6 +533,25 @@ class NotificationEntryAdapterTest : SysuiTestCase() { } @Test fun registerFutureDismissal() { val notification: Notification = Notification.Builder(mContext, "") .setSmallIcon(R.drawable.ic_person) .addAction(mock()) .build() val entry = NotificationEntryBuilder().setNotification(notification).build() val callback: OnUserInteractionCallback = mock() whenever(callback.registerFutureDismissal(any(), any())).thenReturn(mock()) underTest = factory.create(entry) as NotificationEntryAdapter underTest.registerFutureDismissal( callback, REASON_CANCEL, ) verify(callback).registerFutureDismissal(entry, REASON_CANCEL) } fun getRemoteInputEntryAdapter() { val notification: Notification = Notification.Builder(mContext, "").setSmallIcon(R.drawable.ic_person).build() Loading
packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/notification/stack/NotificationStackScrollLayoutControllerTest.java +31 −11 Original line number Diff line number Diff line Loading @@ -87,6 +87,7 @@ import com.android.systemui.statusbar.notification.row.ExpandableNotificationRow import com.android.systemui.statusbar.notification.row.NotificationGutsManager; import com.android.systemui.statusbar.notification.row.NotificationTestHelper; import com.android.systemui.statusbar.notification.shared.GroupHunAnimationFix; import com.android.systemui.statusbar.notification.shared.NotificationBundleUi; import com.android.systemui.statusbar.notification.stack.NotificationStackScrollLayoutController.NotificationPanelEvent; import com.android.systemui.statusbar.notification.stack.NotificationSwipeHelper.NotificationCallback; import com.android.systemui.statusbar.notification.stack.ui.viewbinder.NotificationListViewBinder; Loading Loading @@ -124,7 +125,6 @@ public class NotificationStackScrollLayoutControllerTest extends SysuiTestCase { @Mock private NotificationsController mNotificationsController; @Mock private NotificationVisibilityProvider mVisibilityProvider; @Mock private NotificationWakeUpCoordinator mNotificationWakeUpCoordinator; @Mock private HeadsUpManager mHeadsUpManager; @Mock private HeadsUpTouchHelper.Callback mHeadsUpCallback; @Mock private Provider<IStatusBarService> mStatusBarService; @Mock private NotificationRoundnessManager mNotificationRoundnessManager; Loading Loading @@ -227,7 +227,7 @@ public class NotificationStackScrollLayoutControllerTest extends SysuiTestCase { row.setHeadsUpAnimatingAway(true); // Then: mHeadsUpManager.onEntryAnimatingAwayEnded is not called verify(mHeadsUpManager, never()).onEntryAnimatingAwayEnded(row.getEntry()); verify(mKosmos.getMockHeadsUpManager(), never()).onEntryAnimatingAwayEnded(row.getEntry()); } @Test Loading @@ -238,7 +238,7 @@ public class NotificationStackScrollLayoutControllerTest extends SysuiTestCase { initController(/* viewIsAttached= */ true); mController.setHeadsUpAppearanceController(mock(HeadsUpAppearanceController.class)); NotificationListContainer listContainer = mController.getNotificationListContainer(); ExpandableNotificationRow row = mNotificationTestHelper.createRow(); ExpandableNotificationRow row = mKosmos.createRow(); listContainer.bindRow(row); row.setHeadsUpAnimatingAway(true); Loading @@ -246,7 +246,7 @@ public class NotificationStackScrollLayoutControllerTest extends SysuiTestCase { row.setHeadsUpAnimatingAway(false); // Then: mHeadsUpManager.onEntryAnimatingAwayEnded is called verify(mHeadsUpManager).onEntryAnimatingAwayEnded(row.getEntry()); verify(mKosmos.getMockHeadsUpManager()).onEntryAnimatingAwayEnded(any()); } @Test public void testOnDensityOrFontScaleChanged_reInflatesFooterViews() { Loading Loading @@ -570,8 +570,13 @@ public class NotificationStackScrollLayoutControllerTest extends SysuiTestCase { @Test public void testOnMenuShownLogging() { ExpandableNotificationRow row = mock(ExpandableNotificationRow.class, RETURNS_DEEP_STUBS); when(row.getEntry().getSbn().getLogMaker()).thenReturn(new LogMaker( if (NotificationBundleUi.isEnabled()) { when(row.getEntryAdapter().getSbn().getLogMaker()).thenReturn(new LogMaker( MetricsProto.MetricsEvent.VIEW_UNKNOWN)); } else { when(row.getEntryLegacy().getSbn().getLogMaker()).thenReturn(new LogMaker( MetricsProto.MetricsEvent.VIEW_UNKNOWN)); } ArgumentCaptor<OnMenuEventListener> onMenuEventListenerArgumentCaptor = ArgumentCaptor.forClass(OnMenuEventListener.class); Loading @@ -583,7 +588,12 @@ public class NotificationStackScrollLayoutControllerTest extends SysuiTestCase { OnMenuEventListener onMenuEventListener = onMenuEventListenerArgumentCaptor.getValue(); onMenuEventListener.onMenuShown(row); verify(row.getEntry().getSbn()).getLogMaker(); // This writes most of the log data // This writes most of the log data if (NotificationBundleUi.isEnabled()) { verify(row.getEntryAdapter().getSbn()).getLogMaker(); } else { verify(row.getEntryLegacy().getSbn()).getLogMaker(); } verify(mMetricsLogger).write(logMatcher(MetricsProto.MetricsEvent.ACTION_REVEAL_GEAR, MetricsProto.MetricsEvent.TYPE_ACTION)); } Loading Loading @@ -621,8 +631,13 @@ public class NotificationStackScrollLayoutControllerTest extends SysuiTestCase { @Test public void testOnMenuClickedLogging() { ExpandableNotificationRow row = mock(ExpandableNotificationRow.class, RETURNS_DEEP_STUBS); when(row.getEntry().getSbn().getLogMaker()).thenReturn(new LogMaker( if (NotificationBundleUi.isEnabled()) { when(row.getEntryAdapter().getSbn().getLogMaker()).thenReturn(new LogMaker( MetricsProto.MetricsEvent.VIEW_UNKNOWN)); } else { when(row.getEntryLegacy().getSbn().getLogMaker()).thenReturn(new LogMaker( MetricsProto.MetricsEvent.VIEW_UNKNOWN)); } ArgumentCaptor<OnMenuEventListener> onMenuEventListenerArgumentCaptor = ArgumentCaptor.forClass(OnMenuEventListener.class); Loading @@ -635,7 +650,12 @@ public class NotificationStackScrollLayoutControllerTest extends SysuiTestCase { onMenuEventListener.onMenuClicked(row, 0, 0, mock( NotificationMenuRowPlugin.MenuItem.class)); verify(row.getEntry().getSbn()).getLogMaker(); // This writes most of the log data // This writes most of the log data if (NotificationBundleUi.isEnabled()) { verify(row.getEntryAdapter().getSbn()).getLogMaker(); } else { verify(row.getEntryLegacy().getSbn()).getLogMaker(); } verify(mMetricsLogger).write(logMatcher(MetricsProto.MetricsEvent.ACTION_TOUCH_GEAR, MetricsProto.MetricsEvent.TYPE_ACTION)); } Loading Loading @@ -764,7 +784,7 @@ public class NotificationStackScrollLayoutControllerTest extends SysuiTestCase { mNotificationsController, mVisibilityProvider, mNotificationWakeUpCoordinator, mHeadsUpManager, mKosmos.getMockHeadsUpManager(), mStatusBarService, mNotificationRoundnessManager, mTunerService, Loading
packages/SystemUI/src/com/android/systemui/statusbar/HeadsUpStatusBarView.java +3 −2 Original line number Diff line number Diff line Loading @@ -29,7 +29,7 @@ import com.android.keyguard.AlphaOptimizedLinearLayout; import com.android.systemui.plugins.DarkIconDispatcher; import com.android.systemui.res.R; import com.android.systemui.statusbar.notification.collection.NotificationEntry; import com.android.systemui.statusbar.notification.collection.NotificationEntry.OnSensitivityChangedListener; import com.android.systemui.statusbar.notification.collection.PipelineEntry; import java.util.ArrayList; Loading Loading @@ -125,7 +125,8 @@ public class HeadsUpStatusBarView extends AlphaOptimizedLinearLayout { } } private final OnSensitivityChangedListener mOnSensitivityChangedListener = entry -> { private final PipelineEntry.OnSensitivityChangedListener mOnSensitivityChangedListener = entry -> { if (entry != mShowingEntry) { throw new IllegalStateException("Got a sensitivity change for " + entry + " but mShowingEntry is " + mShowingEntry); Loading
packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/BundleEntryAdapter.kt +51 −1 Original line number Diff line number Diff line Loading @@ -27,6 +27,9 @@ import com.android.systemui.statusbar.notification.collection.provider.HighPrior import com.android.systemui.statusbar.notification.icon.IconPack import com.android.systemui.statusbar.notification.people.PeopleNotificationIdentifier.Companion.TYPE_NON_PERSON import com.android.systemui.statusbar.notification.row.ExpandableNotificationRow import com.android.systemui.statusbar.notification.row.NotifBindPipeline import com.android.systemui.statusbar.notification.row.OnUserInteractionCallback import com.android.systemui.statusbar.notification.row.RowContentBindStage import kotlinx.coroutines.flow.StateFlow class BundleEntryAdapter( Loading Loading @@ -120,7 +123,7 @@ class BundleEntryAdapter( Log.wtf(TAG, "onImportanceChanged() called") } override fun markForUserTriggeredMovement() { override fun markForUserTriggeredMovement(marked: Boolean) { Log.wtf(TAG, "markForUserTriggeredMovement() called") } Loading Loading @@ -200,6 +203,53 @@ class BundleEntryAdapter( override fun getRemoteInputEntryAdapter(): RemoteInputEntryAdapter? { return null } override fun addOnSensitivityChangedListener( listener: PipelineEntry.OnSensitivityChangedListener? ) { entry.addOnSensitivityChangedListener(listener) } override fun removeOnSensitivityChangedListener( listener: PipelineEntry.OnSensitivityChangedListener? ) { entry.removeOnSensitivityChangedListener(listener) } override fun setSeenInShade(seen: Boolean) { entry.isSeenInShade = seen } override fun isSeenInShade(): Boolean { return entry.isSeenInShade } override fun onEntryAnimatingAwayEnded() { Log.wtf(TAG, "onEntryAnimatingAwayEnded() called") } override fun registerFutureDismissal( callback: OnUserInteractionCallback, reason: Int, ): Runnable? { // TODO(b/389839319): what should the pipeline do when a bundle is dismissed? return null } override fun markForReinflation(stage: RowContentBindStage) { Log.wtf(TAG, "markForReinflation() called") } override fun isViewBacked(): Boolean { return false } override fun requestRebind( stage: RowContentBindStage, callback: NotifBindPipeline.BindCallback, ) { Log.wtf(TAG, "requestRebind() called") } } private const val TAG = "BundleEntryAdapter"
packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/EntryAdapter.java +27 −1 Original line number Diff line number Diff line Loading @@ -27,6 +27,9 @@ import com.android.systemui.statusbar.notification.collection.notifcollection.No import com.android.systemui.statusbar.notification.icon.IconPack; import com.android.systemui.statusbar.notification.people.PeopleNotificationIdentifier; import com.android.systemui.statusbar.notification.row.ExpandableNotificationRow; import com.android.systemui.statusbar.notification.row.NotifBindPipeline; import com.android.systemui.statusbar.notification.row.OnUserInteractionCallback; import com.android.systemui.statusbar.notification.row.RowContentBindStage; import kotlinx.coroutines.flow.StateFlow; Loading Loading @@ -148,7 +151,7 @@ public interface EntryAdapter { * in the shade and change something about its appearance to delay the appearance change until * the ranking reordering is likely to have settled. */ void markForUserTriggeredMovement(); void markForUserTriggeredMovement(boolean marked); /** * Determines whether a row is considered 'high priority'. Loading Loading @@ -202,5 +205,28 @@ public interface EntryAdapter { void onEntryClicked(ExpandableNotificationRow row); @Nullable RemoteInputEntryAdapter getRemoteInputEntryAdapter(); /** Add a listener to be notified when the entry's sensitivity changes. */ void addOnSensitivityChangedListener( PipelineEntry.OnSensitivityChangedListener listener); /** Remove a listener that was registered above. */ void removeOnSensitivityChangedListener( PipelineEntry.OnSensitivityChangedListener listener); void setSeenInShade(boolean seen); boolean isSeenInShade(); void onEntryAnimatingAwayEnded(); Runnable registerFutureDismissal(@NonNull OnUserInteractionCallback callback, int reason); void markForReinflation(@NonNull RowContentBindStage stage); boolean isViewBacked(); void requestRebind(@NonNull RowContentBindStage stage, @NonNull NotifBindPipeline.BindCallback callback); }