blob: de87d3197ef670f16876b5d81096a8efb06916e2 [file] [log] [blame]
Jason Monk297c04e2018-08-23 17:16:59 -04001/*
2 * Copyright (C) 2018 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file
5 * except in compliance with the License. You may obtain a copy of the License at
6 *
7 * http://www.apache.org/licenses/LICENSE-2.0
8 *
9 * Unless required by applicable law or agreed to in writing, software distributed under the
10 * License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
11 * KIND, either express or implied. See the License for the specific language governing
12 * permissions and limitations under the License.
13 */
14
15package com.android.systemui.statusbar.phone;
16
Charles Chenf3d295c2018-11-30 18:15:21 +080017import static android.view.Display.DEFAULT_DISPLAY;
18
Jason Monk297c04e2018-08-23 17:16:59 -040019import static org.junit.Assert.assertFalse;
20import static org.mockito.Mockito.mock;
Lucas Dupin086c6fc2018-10-16 18:06:43 -070021import static org.mockito.Mockito.when;
Jason Monk297c04e2018-08-23 17:16:59 -040022
23import android.app.Notification;
24import android.app.StatusBarManager;
25import android.content.Context;
26import android.metrics.LogMaker;
Jason Monk297c04e2018-08-23 17:16:59 -040027import android.support.test.metricshelper.MetricsAsserts;
28import android.testing.AndroidTestingRunner;
29import android.testing.TestableLooper;
30import android.testing.TestableLooper.RunWithLooper;
31import android.view.ViewGroup;
32
Brett Chabot84151d92019-02-27 15:37:59 -080033import androidx.test.filters.SmallTest;
34
Jason Monk297c04e2018-08-23 17:16:59 -040035import com.android.internal.logging.MetricsLogger;
36import com.android.internal.logging.nano.MetricsProto.MetricsEvent;
37import com.android.internal.logging.testing.FakeMetricsLogger;
Lucas Dupind236ee32019-10-08 15:33:59 -070038import com.android.systemui.InitController;
Jason Monk297c04e2018-08-23 17:16:59 -040039import com.android.systemui.SysuiTestCase;
Lucas Dupind236ee32019-10-08 15:33:59 -070040import com.android.systemui.plugins.statusbar.StatusBarStateController;
Jason Monk297c04e2018-08-23 17:16:59 -040041import com.android.systemui.statusbar.CommandQueue;
Ned Burns636c3792019-09-11 16:59:07 -040042import com.android.systemui.statusbar.NotificationEntryBuilder;
Lucas Dupind236ee32019-10-08 15:33:59 -070043import com.android.systemui.statusbar.NotificationLockscreenUserManager;
44import com.android.systemui.statusbar.NotificationMediaManager;
45import com.android.systemui.statusbar.NotificationRemoteInputManager;
46import com.android.systemui.statusbar.NotificationViewHierarchyManager;
47import com.android.systemui.statusbar.RemoteInputController;
48import com.android.systemui.statusbar.SysuiStatusBarStateController;
Jason Monk297c04e2018-08-23 17:16:59 -040049import com.android.systemui.statusbar.notification.ActivityLaunchAnimator;
Selim Cinek5454a0d2019-07-30 17:14:50 -070050import com.android.systemui.statusbar.notification.DynamicPrivacyController;
Gus Prevasb43dc652018-12-20 13:11:45 -050051import com.android.systemui.statusbar.notification.NotificationAlertingManager;
Lucas Dupind236ee32019-10-08 15:33:59 -070052import com.android.systemui.statusbar.notification.NotificationEntryManager;
53import com.android.systemui.statusbar.notification.NotificationInterruptionStateProvider;
54import com.android.systemui.statusbar.notification.VisualStabilityManager;
55import com.android.systemui.statusbar.notification.collection.NotificationData;
Ned Burnsf81c4c42019-01-07 14:10:43 -050056import com.android.systemui.statusbar.notification.collection.NotificationEntry;
Ned Burnsc5864672019-02-20 12:57:29 -050057import com.android.systemui.statusbar.notification.collection.NotificationRowBinderImpl;
Jason Monk297c04e2018-08-23 17:16:59 -040058import com.android.systemui.statusbar.notification.row.ActivatableNotificationView;
Lucas Dupind236ee32019-10-08 15:33:59 -070059import com.android.systemui.statusbar.notification.row.NotificationGutsManager;
Jason Monk297c04e2018-08-23 17:16:59 -040060import com.android.systemui.statusbar.notification.stack.NotificationListContainer;
Lucas Dupind236ee32019-10-08 15:33:59 -070061import com.android.systemui.statusbar.policy.KeyguardStateController;
Jason Monk297c04e2018-08-23 17:16:59 -040062
63import org.junit.Before;
64import org.junit.Test;
65import org.junit.runner.RunWith;
66
Lucas Dupind236ee32019-10-08 15:33:59 -070067import java.util.ArrayList;
68
Jason Monk297c04e2018-08-23 17:16:59 -040069@SmallTest
70@RunWith(AndroidTestingRunner.class)
Aaron Heuckroth96cd93f2018-11-20 11:14:40 -050071@RunWithLooper()
Jason Monk297c04e2018-08-23 17:16:59 -040072public class StatusBarNotificationPresenterTest extends SysuiTestCase {
73
74
75 private StatusBarNotificationPresenter mStatusBar;
76 private CommandQueue mCommandQueue;
77 private FakeMetricsLogger mMetricsLogger;
78 private ShadeController mShadeController = mock(ShadeController.class);
79
80 @Before
81 public void setup() {
Lucas Dupind236ee32019-10-08 15:33:59 -070082 NotificationRemoteInputManager notificationRemoteInputManager =
83 mock(NotificationRemoteInputManager.class);
84 when(notificationRemoteInputManager.getController())
85 .thenReturn(mock(RemoteInputController.class));
Jason Monk297c04e2018-08-23 17:16:59 -040086 mMetricsLogger = new FakeMetricsLogger();
87 mDependency.injectTestDependency(MetricsLogger.class, mMetricsLogger);
Charles Chenf3d295c2018-11-30 18:15:21 +080088 mCommandQueue = new CommandQueue(mContext);
Lucas Dupind236ee32019-10-08 15:33:59 -070089 mDependency.injectTestDependency(StatusBarStateController.class,
90 mock(SysuiStatusBarStateController.class));
Jason Monk297c04e2018-08-23 17:16:59 -040091 mDependency.injectTestDependency(ShadeController.class, mShadeController);
Lucas Dupind236ee32019-10-08 15:33:59 -070092 mDependency.injectTestDependency(NotificationRemoteInputManager.class,
93 notificationRemoteInputManager);
94 mDependency.injectMockDependency(NotificationViewHierarchyManager.class);
95 mDependency.injectMockDependency(NotificationRemoteInputManager.Callback.class);
96 mDependency.injectMockDependency(NotificationLockscreenUserManager.class);
97 mDependency.injectMockDependency(NotificationInterruptionStateProvider.class);
98 mDependency.injectMockDependency(NotificationMediaManager.class);
99 mDependency.injectMockDependency(VisualStabilityManager.class);
100 mDependency.injectMockDependency(NotificationGutsManager.class);
101 mDependency.injectMockDependency(StatusBarWindowController.class);
102 mDependency.injectMockDependency(InitController.class);
103 NotificationData notificationData = mock(NotificationData.class);
104 when(notificationData.getNotificationsForCurrentUser()).thenReturn(new ArrayList<>());
105 NotificationEntryManager entryManager =
106 mDependency.injectMockDependency(NotificationEntryManager.class);
107 when(entryManager.getNotificationData()).thenReturn(notificationData);
Jason Monk297c04e2018-08-23 17:16:59 -0400108
Lucas Dupin086c6fc2018-10-16 18:06:43 -0700109 StatusBarWindowView statusBarWindowView = mock(StatusBarWindowView.class);
110 when(statusBarWindowView.getResources()).thenReturn(mContext.getResources());
Jason Monk297c04e2018-08-23 17:16:59 -0400111 mStatusBar = new StatusBarNotificationPresenter(mContext,
112 mock(NotificationPanelView.class), mock(HeadsUpManagerPhone.class),
Lucas Dupin086c6fc2018-10-16 18:06:43 -0700113 statusBarWindowView, mock(NotificationListContainerViewGroup.class),
Jason Monk297c04e2018-08-23 17:16:59 -0400114 mock(DozeScrimController.class), mock(ScrimController.class),
Selim Cinek5454a0d2019-07-30 17:14:50 -0700115 mock(ActivityLaunchAnimator.class), mock(DynamicPrivacyController.class),
Ned Burnsc5864672019-02-20 12:57:29 -0500116 mock(NotificationAlertingManager.class),
Dave Mankoffbcaca8a2019-10-31 18:04:08 -0400117 mock(NotificationRowBinderImpl.class), mock(KeyguardStateController.class),
118 mCommandQueue);
Jason Monk297c04e2018-08-23 17:16:59 -0400119 }
120
121 @Test
122 public void testHeadsUp_disabledStatusBar() {
123 Notification n = new Notification.Builder(getContext(), "a").build();
Ned Burns636c3792019-09-11 16:59:07 -0400124 NotificationEntry entry = new NotificationEntryBuilder()
125 .setPkg("a")
126 .setOpPkg("a")
127 .setTag("a")
128 .setNotification(n)
129 .build();
Charles Chenf3d295c2018-11-30 18:15:21 +0800130 mCommandQueue.disable(DEFAULT_DISPLAY, StatusBarManager.DISABLE_EXPAND, 0,
131 false /* animate */);
Jason Monk297c04e2018-08-23 17:16:59 -0400132 TestableLooper.get(this).processAllMessages();
133
134 assertFalse("The panel shouldn't allow heads up while disabled",
Evan Laird9afe7662019-10-16 17:16:39 -0400135 mStatusBar.canHeadsUp(entry, entry.getSbn()));
Jason Monk297c04e2018-08-23 17:16:59 -0400136 }
137
138 @Test
139 public void testHeadsUp_disabledNotificationShade() {
140 Notification n = new Notification.Builder(getContext(), "a").build();
Ned Burns636c3792019-09-11 16:59:07 -0400141 NotificationEntry entry = new NotificationEntryBuilder()
142 .setPkg("a")
143 .setOpPkg("a")
144 .setTag("a")
145 .setNotification(n)
146 .build();
Charles Chenf3d295c2018-11-30 18:15:21 +0800147 mCommandQueue.disable(DEFAULT_DISPLAY, 0, StatusBarManager.DISABLE2_NOTIFICATION_SHADE,
148 false /* animate */);
Jason Monk297c04e2018-08-23 17:16:59 -0400149 TestableLooper.get(this).processAllMessages();
150
151 assertFalse("The panel shouldn't allow heads up while notitifcation shade disabled",
Evan Laird9afe7662019-10-16 17:16:39 -0400152 mStatusBar.canHeadsUp(entry, entry.getSbn()));
Jason Monk297c04e2018-08-23 17:16:59 -0400153 }
154
155 @Test
156 public void onActivatedMetrics() {
157 ActivatableNotificationView view = mock(ActivatableNotificationView.class);
158 mStatusBar.onActivated(view);
159
160 MetricsAsserts.assertHasLog("missing lockscreen note tap log",
161 mMetricsLogger.getLogs(),
162 new LogMaker(MetricsEvent.ACTION_LS_NOTE)
163 .setType(MetricsEvent.TYPE_ACTION));
164 }
165
166 // We need this because mockito doesn't know how to construct a mock that extends ViewGroup
167 // and implements NotificationListContainer without it because of classloader issues.
168 private abstract static class NotificationListContainerViewGroup extends ViewGroup
169 implements NotificationListContainer {
170
171 public NotificationListContainerViewGroup(Context context) {
172 super(context);
173 }
174 }
175}
176