1 package com.android.launcher3.taskbar;
2 
3 import static com.android.launcher3.taskbar.TaskbarNavButtonController.BUTTON_A11Y;
4 import static com.android.launcher3.taskbar.TaskbarNavButtonController.BUTTON_BACK;
5 import static com.android.launcher3.taskbar.TaskbarNavButtonController.BUTTON_HOME;
6 import static com.android.launcher3.taskbar.TaskbarNavButtonController.BUTTON_IME_SWITCH;
7 import static com.android.launcher3.taskbar.TaskbarNavButtonController.BUTTON_RECENTS;
8 import static com.android.launcher3.taskbar.TaskbarNavButtonController.SCREEN_PIN_LONG_PRESS_THRESHOLD;
9 import static com.android.quickstep.OverviewCommandHelper.TYPE_HOME;
10 import static com.android.quickstep.OverviewCommandHelper.TYPE_TOGGLE;
11 import static com.android.systemui.shared.system.QuickStepContract.SYSUI_STATE_SCREEN_PINNING;
12 
13 import static org.mockito.ArgumentMatchers.any;
14 import static org.mockito.Mockito.times;
15 import static org.mockito.Mockito.verify;
16 import static org.mockito.Mockito.when;
17 
18 import android.os.Handler;
19 
20 import androidx.test.runner.AndroidJUnit4;
21 
22 import com.android.quickstep.OverviewCommandHelper;
23 import com.android.quickstep.SystemUiProxy;
24 import com.android.quickstep.TouchInteractionService;
25 
26 import org.junit.Before;
27 import org.junit.Test;
28 import org.junit.runner.RunWith;
29 import org.mockito.Mock;
30 import org.mockito.MockitoAnnotations;
31 
32 @RunWith(AndroidJUnit4.class)
33 public class TaskbarNavButtonControllerTest {
34 
35     private final static int DISPLAY_ID = 2;
36 
37     @Mock
38     SystemUiProxy mockSystemUiProxy;
39     @Mock
40     TouchInteractionService mockService;
41     @Mock
42     OverviewCommandHelper mockCommandHelper;
43     @Mock
44     Handler mockHandler;
45 
46     private TaskbarNavButtonController mNavButtonController;
47 
48     @Before
setup()49     public void setup() {
50         MockitoAnnotations.initMocks(this);
51         when(mockService.getDisplayId()).thenReturn(DISPLAY_ID);
52         when(mockService.getOverviewCommandHelper()).thenReturn(mockCommandHelper);
53         mNavButtonController = new TaskbarNavButtonController(mockService,
54                 mockSystemUiProxy, mockHandler);
55     }
56 
57     @Test
testPressBack()58     public void testPressBack() {
59         mNavButtonController.onButtonClick(BUTTON_BACK);
60         verify(mockSystemUiProxy, times(1)).onBackPressed();
61     }
62 
63     @Test
testPressImeSwitcher()64     public void testPressImeSwitcher() {
65         mNavButtonController.onButtonClick(BUTTON_IME_SWITCH);
66         verify(mockSystemUiProxy, times(1)).onImeSwitcherPressed();
67     }
68 
69     @Test
testPressA11yShortClick()70     public void testPressA11yShortClick() {
71         mNavButtonController.onButtonClick(BUTTON_A11Y);
72         verify(mockSystemUiProxy, times(1))
73                 .notifyAccessibilityButtonClicked(DISPLAY_ID);
74     }
75 
76     @Test
testPressA11yLongClick()77     public void testPressA11yLongClick() {
78         mNavButtonController.onButtonLongClick(BUTTON_A11Y);
79         verify(mockSystemUiProxy, times(1)).notifyAccessibilityButtonLongClicked();
80     }
81 
82     @Test
testLongPressHome()83     public void testLongPressHome() {
84         mNavButtonController.onButtonLongClick(BUTTON_HOME);
85         verify(mockSystemUiProxy, times(1)).startAssistant(any());
86     }
87 
88     @Test
testPressHome()89     public void testPressHome() {
90         mNavButtonController.onButtonClick(BUTTON_HOME);
91         verify(mockCommandHelper, times(1)).addCommand(TYPE_HOME);
92     }
93 
94     @Test
testPressRecents()95     public void testPressRecents() {
96         mNavButtonController.onButtonClick(BUTTON_RECENTS);
97         verify(mockCommandHelper, times(1)).addCommand(TYPE_TOGGLE);
98     }
99 
100     @Test
testPressRecentsWithScreenPinned()101     public void testPressRecentsWithScreenPinned() {
102         mNavButtonController.updateSysuiFlags(SYSUI_STATE_SCREEN_PINNING);
103         mNavButtonController.onButtonClick(BUTTON_RECENTS);
104         verify(mockCommandHelper, times(0)).addCommand(TYPE_TOGGLE);
105     }
106 
107     @Test
testLongPressBackRecentsNotPinned()108     public void testLongPressBackRecentsNotPinned() {
109         mNavButtonController.onButtonLongClick(BUTTON_RECENTS);
110         mNavButtonController.onButtonLongClick(BUTTON_BACK);
111         verify(mockSystemUiProxy, times(0)).stopScreenPinning();
112     }
113 
114     @Test
testLongPressBackRecentsPinned()115     public void testLongPressBackRecentsPinned() {
116         mNavButtonController.updateSysuiFlags(SYSUI_STATE_SCREEN_PINNING);
117         mNavButtonController.onButtonLongClick(BUTTON_RECENTS);
118         mNavButtonController.onButtonLongClick(BUTTON_BACK);
119         verify(mockSystemUiProxy, times(1)).stopScreenPinning();
120     }
121 
122     @Test
testLongPressBackRecentsTooLongPinned()123     public void testLongPressBackRecentsTooLongPinned() {
124         mNavButtonController.updateSysuiFlags(SYSUI_STATE_SCREEN_PINNING);
125         mNavButtonController.onButtonLongClick(BUTTON_RECENTS);
126         try {
127             Thread.sleep(SCREEN_PIN_LONG_PRESS_THRESHOLD + 5);
128         } catch (InterruptedException e) {
129             e.printStackTrace();
130         }
131         mNavButtonController.onButtonLongClick(BUTTON_BACK);
132         verify(mockSystemUiProxy, times(0)).stopScreenPinning();
133     }
134 
135     @Test
testLongPressBackRecentsMultipleAttemptPinned()136     public void testLongPressBackRecentsMultipleAttemptPinned() {
137         mNavButtonController.updateSysuiFlags(SYSUI_STATE_SCREEN_PINNING);
138         mNavButtonController.onButtonLongClick(BUTTON_RECENTS);
139         try {
140             Thread.sleep(SCREEN_PIN_LONG_PRESS_THRESHOLD + 5);
141         } catch (InterruptedException e) {
142             e.printStackTrace();
143         }
144         mNavButtonController.onButtonLongClick(BUTTON_BACK);
145         verify(mockSystemUiProxy, times(0)).stopScreenPinning();
146 
147         // Try again w/in threshold
148         mNavButtonController.onButtonLongClick(BUTTON_RECENTS);
149         mNavButtonController.onButtonLongClick(BUTTON_BACK);
150         verify(mockSystemUiProxy, times(1)).stopScreenPinning();
151     }
152 
153     @Test
testLongPressHomeScreenPinned()154     public void testLongPressHomeScreenPinned() {
155         mNavButtonController.updateSysuiFlags(SYSUI_STATE_SCREEN_PINNING);
156         mNavButtonController.onButtonLongClick(BUTTON_HOME);
157         verify(mockSystemUiProxy, times(0)).startAssistant(any());
158     }
159 }
160