blob: 5ac7bfbfd296ae4ff9af1ea171821f0ea4c9834a [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;
Heemin Seog98df6972019-12-05 13:01:38 -080042import com.android.systemui.statusbar.KeyguardIndicationController;
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;
Ned Burnsf81c4c42019-01-07 14:10:43 -050055import com.android.systemui.statusbar.notification.collection.NotificationEntry;
Beverly79c89ec2019-12-13 10:33:01 -050056import com.android.systemui.statusbar.notification.collection.NotificationEntryBuilder;
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
Heemin Seogbd9bcbf2019-12-04 17:07:32 -080075 private StatusBarNotificationPresenter mStatusBarNotificationPresenter;
Jason Monk297c04e2018-08-23 17:16:59 -040076 private CommandQueue mCommandQueue;
77 private FakeMetricsLogger mMetricsLogger;
78 private ShadeController mShadeController = mock(ShadeController.class);
Heemin Seogbd9bcbf2019-12-04 17:07:32 -080079 private StatusBar mStatusBar = mock(StatusBar.class);
Dave Mankoff71fca1a2019-12-19 14:16:32 -050080 private InitController mInitController = new InitController();
Jason Monk297c04e2018-08-23 17:16:59 -040081
82 @Before
83 public void setup() {
Lucas Dupind236ee32019-10-08 15:33:59 -070084 NotificationRemoteInputManager notificationRemoteInputManager =
85 mock(NotificationRemoteInputManager.class);
86 when(notificationRemoteInputManager.getController())
87 .thenReturn(mock(RemoteInputController.class));
Jason Monk297c04e2018-08-23 17:16:59 -040088 mMetricsLogger = new FakeMetricsLogger();
89 mDependency.injectTestDependency(MetricsLogger.class, mMetricsLogger);
Charles Chenf3d295c2018-11-30 18:15:21 +080090 mCommandQueue = new CommandQueue(mContext);
Lucas Dupind236ee32019-10-08 15:33:59 -070091 mDependency.injectTestDependency(StatusBarStateController.class,
92 mock(SysuiStatusBarStateController.class));
Jason Monk297c04e2018-08-23 17:16:59 -040093 mDependency.injectTestDependency(ShadeController.class, mShadeController);
Lucas Dupind236ee32019-10-08 15:33:59 -070094 mDependency.injectTestDependency(NotificationRemoteInputManager.class,
95 notificationRemoteInputManager);
96 mDependency.injectMockDependency(NotificationViewHierarchyManager.class);
97 mDependency.injectMockDependency(NotificationRemoteInputManager.Callback.class);
98 mDependency.injectMockDependency(NotificationLockscreenUserManager.class);
99 mDependency.injectMockDependency(NotificationInterruptionStateProvider.class);
100 mDependency.injectMockDependency(NotificationMediaManager.class);
101 mDependency.injectMockDependency(VisualStabilityManager.class);
102 mDependency.injectMockDependency(NotificationGutsManager.class);
103 mDependency.injectMockDependency(StatusBarWindowController.class);
Lucas Dupind236ee32019-10-08 15:33:59 -0700104 NotificationEntryManager entryManager =
105 mDependency.injectMockDependency(NotificationEntryManager.class);
Evan Laird181de622019-10-24 09:53:02 -0400106 when(entryManager.getActiveNotificationsForCurrentUser()).thenReturn(new ArrayList<>());
Jason Monk297c04e2018-08-23 17:16:59 -0400107
Lucas Dupin086c6fc2018-10-16 18:06:43 -0700108 StatusBarWindowView statusBarWindowView = mock(StatusBarWindowView.class);
109 when(statusBarWindowView.getResources()).thenReturn(mContext.getResources());
Heemin Seogbd9bcbf2019-12-04 17:07:32 -0800110 mStatusBarNotificationPresenter = new StatusBarNotificationPresenter(mContext,
Dave Mankoff59b94962019-12-16 16:42:15 -0500111 mock(NotificationPanelViewController.class), mock(HeadsUpManagerPhone.class),
Lucas Dupin086c6fc2018-10-16 18:06:43 -0700112 statusBarWindowView, mock(NotificationListContainerViewGroup.class),
Jason Monk297c04e2018-08-23 17:16:59 -0400113 mock(DozeScrimController.class), mock(ScrimController.class),
Selim Cinek5454a0d2019-07-30 17:14:50 -0700114 mock(ActivityLaunchAnimator.class), mock(DynamicPrivacyController.class),
Ned Burnsc5864672019-02-20 12:57:29 -0500115 mock(NotificationAlertingManager.class),
Dave Mankoffbcaca8a2019-10-31 18:04:08 -0400116 mock(NotificationRowBinderImpl.class), mock(KeyguardStateController.class),
Heemin Seog98df6972019-12-05 13:01:38 -0800117 mock(KeyguardIndicationController.class),
Dave Mankoff71fca1a2019-12-19 14:16:32 -0500118 mStatusBar, mock(ShadeControllerImpl.class), mCommandQueue, mInitController);
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",
Heemin Seogbd9bcbf2019-12-04 17:07:32 -0800135 mStatusBarNotificationPresenter.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",
Heemin Seogbd9bcbf2019-12-04 17:07:32 -0800152 mStatusBarNotificationPresenter.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);
Heemin Seogbd9bcbf2019-12-04 17:07:32 -0800158 mStatusBarNotificationPresenter.onActivated(view);
Jason Monk297c04e2018-08-23 17:16:59 -0400159
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