1 /*
2  * Copyright (C) 2021 The Android Open Source Project
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  *      http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16 
17 package com.android.keyguard;
18 
19 import static android.view.DisplayAdjustments.DEFAULT_DISPLAY_ADJUSTMENTS;
20 
21 import static org.mockito.ArgumentMatchers.any;
22 import static org.mockito.ArgumentMatchers.eq;
23 import static org.mockito.Mockito.doReturn;
24 import static org.mockito.Mockito.never;
25 import static org.mockito.Mockito.spy;
26 import static org.mockito.Mockito.times;
27 import static org.mockito.Mockito.verify;
28 import static org.mockito.Mockito.when;
29 
30 import android.hardware.display.DisplayManager;
31 import android.hardware.display.DisplayManagerGlobal;
32 import android.testing.AndroidTestingRunner;
33 import android.testing.TestableLooper;
34 import android.view.Display;
35 import android.view.DisplayInfo;
36 
37 import androidx.test.filters.SmallTest;
38 
39 import com.android.keyguard.dagger.KeyguardStatusViewComponent;
40 import com.android.systemui.SysuiTestCase;
41 import com.android.systemui.navigationbar.NavigationBarController;
42 
43 import org.junit.Before;
44 import org.junit.Test;
45 import org.junit.runner.RunWith;
46 import org.mockito.Mock;
47 import org.mockito.MockitoAnnotations;
48 
49 import java.util.concurrent.Executor;
50 
51 @SmallTest
52 @RunWith(AndroidTestingRunner.class)
53 @TestableLooper.RunWithLooper
54 public class KeyguardDisplayManagerTest extends SysuiTestCase {
55 
56     @Mock
57     private NavigationBarController mNavigationBarController;
58     @Mock
59     private KeyguardStatusViewComponent.Factory mKeyguardStatusViewComponentFactory;
60     @Mock
61     private DisplayManager mDisplayManager;
62     @Mock
63     private KeyguardDisplayManager.KeyguardPresentation mKeyguardPresentation;
64 
65     private Executor mBackgroundExecutor = Runnable::run;
66     private KeyguardDisplayManager mManager;
67 
68     // The default and secondary displays are both in the default group
69     private Display mDefaultDisplay;
70     private Display mSecondaryDisplay;
71 
72     // This display is in a different group from the default and secondary displays.
73     private Display mDifferentGroupDisplay;
74 
75     @Before
setUp()76     public void setUp() {
77         MockitoAnnotations.initMocks(this);
78         mContext.addMockSystemService(DisplayManager.class, mDisplayManager);
79         mManager = spy(new KeyguardDisplayManager(mContext, () -> mNavigationBarController,
80                 mKeyguardStatusViewComponentFactory, mBackgroundExecutor));
81         doReturn(mKeyguardPresentation).when(mManager).createPresentation(any());
82 
83         mDefaultDisplay = new Display(DisplayManagerGlobal.getInstance(), Display.DEFAULT_DISPLAY,
84                 new DisplayInfo(), DEFAULT_DISPLAY_ADJUSTMENTS);
85         mSecondaryDisplay = new Display(DisplayManagerGlobal.getInstance(),
86                 Display.DEFAULT_DISPLAY + 1,
87                 new DisplayInfo(), DEFAULT_DISPLAY_ADJUSTMENTS);
88 
89         DisplayInfo differentGroupInfo = new DisplayInfo();
90         differentGroupInfo.displayId = Display.DEFAULT_DISPLAY + 2;
91         differentGroupInfo.displayGroupId = Display.DEFAULT_DISPLAY_GROUP + 1;
92         mDifferentGroupDisplay = new Display(DisplayManagerGlobal.getInstance(),
93                 Display.DEFAULT_DISPLAY,
94                 differentGroupInfo, DEFAULT_DISPLAY_ADJUSTMENTS);
95     }
96 
97     @Test
testShow_defaultDisplayOnly()98     public void testShow_defaultDisplayOnly() {
99         when(mDisplayManager.getDisplays()).thenReturn(new Display[]{mDefaultDisplay});
100         mManager.show();
101         verify(mManager, never()).createPresentation(any());
102     }
103 
104     @Test
testShow_includeSecondaryDisplay()105     public void testShow_includeSecondaryDisplay() {
106         when(mDisplayManager.getDisplays()).thenReturn(
107                 new Display[]{mDefaultDisplay, mSecondaryDisplay});
108         mManager.show();
109         verify(mManager, times(1)).createPresentation(eq(mSecondaryDisplay));
110     }
111 
112     @Test
testShow_includeNonDefaultGroupDisplay()113     public void testShow_includeNonDefaultGroupDisplay() {
114         when(mDisplayManager.getDisplays()).thenReturn(
115                 new Display[]{mDefaultDisplay, mDifferentGroupDisplay});
116 
117         mManager.show();
118         verify(mManager, never()).createPresentation(any());
119     }
120 
121     @Test
testShow_includeSecondaryAndNonDefaultGroupDisplays()122     public void testShow_includeSecondaryAndNonDefaultGroupDisplays() {
123         when(mDisplayManager.getDisplays()).thenReturn(
124                 new Display[]{mDefaultDisplay, mSecondaryDisplay, mDifferentGroupDisplay});
125 
126         mManager.show();
127         verify(mManager, times(1)).createPresentation(eq(mSecondaryDisplay));
128     }
129 }
130