• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (C) 2018 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.systemui.statusbar.phone;
18 
19 import static org.junit.Assert.assertEquals;
20 import static org.junit.Assert.assertFalse;
21 import static org.junit.Assert.assertNotEquals;
22 import static org.junit.Assert.assertNull;
23 import static org.junit.Assert.assertTrue;
24 import static org.junit.Assert.fail;
25 import static org.mockito.Mockito.doReturn;
26 import static org.mockito.Mockito.mock;
27 import static org.mockito.Mockito.spy;
28 
29 import android.graphics.drawable.Drawable;
30 import android.view.View;
31 
32 import androidx.test.filters.SmallTest;
33 import androidx.test.runner.AndroidJUnit4;
34 
35 import com.android.systemui.SysuiTestCase;
36 import com.android.systemui.assist.AssistManager;
37 import com.android.systemui.statusbar.policy.KeyButtonDrawable;
38 
39 import org.junit.Before;
40 import org.junit.Ignore;
41 import org.junit.Test;
42 import org.junit.runner.RunWith;
43 
44 /** atest NavigationBarContextTest */
45 @SmallTest
46 @RunWith(AndroidJUnit4.class)
47 public class NavigationBarContextTest extends SysuiTestCase {
48     private static final int GROUP_ID = 1;
49     private static final int BUTTON_0_ID = GROUP_ID + 1;
50     private static final int BUTTON_1_ID = GROUP_ID + 2;
51     private static final int BUTTON_2_ID = GROUP_ID + 3;
52 
53     private static final float TEST_DARK_INTENSITY = 0.6f;
54     private static final float DARK_INTENSITY_ERR = 0.0002f;
55     private static final int ICON_RES_ID = 1;
56 
57     private ContextualButtonGroup mGroup;
58     private ContextualButton mBtn0;
59     private ContextualButton mBtn1;
60     private ContextualButton mBtn2;
61 
62     @Before
setup()63     public void setup() {
64         mDependency.injectMockDependency(AssistManager.class);
65 
66         mGroup = new ContextualButtonGroup(GROUP_ID);
67         mBtn0 = new ContextualButton(BUTTON_0_ID, ICON_RES_ID);
68         mBtn1 = new ContextualButton(BUTTON_1_ID, ICON_RES_ID);
69         mBtn2 = new ContextualButton(BUTTON_2_ID, ICON_RES_ID);
70 
71         // Order of adding buttons to group determines the priority, ascending priority order
72         mGroup.addButton(mBtn0);
73         mGroup.addButton(mBtn1);
74         mGroup.addButton(mBtn2);
75     }
76 
77     @Test
testAddGetContextButtons()78     public void testAddGetContextButtons() throws Exception {
79         assertEquals(mBtn0, mGroup.getContextButton(BUTTON_0_ID));
80         assertEquals(mBtn1, mGroup.getContextButton(BUTTON_1_ID));
81         assertEquals(mBtn2, mGroup.getContextButton(BUTTON_2_ID));
82     }
83 
84     @Test
testSetButtonVisibility()85     public void testSetButtonVisibility() throws Exception {
86         assertTrue("By default the group should be visible.", mGroup.isVisible());
87 
88         // Set button 1 to be visible, make sure it is the only visible button
89         showButton(mBtn1);
90         assertFalse(mBtn0.isVisible());
91         assertTrue(mBtn1.isVisible());
92         assertFalse(mBtn2.isVisible());
93 
94         // Hide button 1 and make sure the group is also invisible
95         assertNotEquals(mGroup.setButtonVisibility(BUTTON_1_ID, false /* visible */), View.VISIBLE);
96         assertFalse("No buttons are visible, group should also be hidden", mGroup.isVisible());
97         assertNull("No buttons should be visible", mGroup.getVisibleContextButton());
98     }
99 
100     @Test(expected = RuntimeException.class)
testSetButtonVisibilityUnaddedButton()101     public void testSetButtonVisibilityUnaddedButton() throws Exception {
102         int id = mBtn2.getId() + 1;
103         mGroup.setButtonVisibility(id, true /* visible */);
104         fail("Did not throw when setting a button with an invalid id");
105     }
106 
107     @Test
testSetHigherPriorityButton()108     public void testSetHigherPriorityButton() throws Exception {
109         // Show button 0
110         showButton(mBtn0);
111 
112         // Show button 1
113         showButton(mBtn1);
114         assertTrue("Button 0 should be visible behind",
115                 mGroup.isButtonVisibleWithinGroup(mBtn0.getId()));
116 
117         // Show button 2
118         showButton(mBtn2);
119         assertTrue("Button 1 should be visible behind",
120                 mGroup.isButtonVisibleWithinGroup(mBtn1.getId()));
121         assertTrue(mGroup.isButtonVisibleWithinGroup(mBtn0.getId()));
122         assertTrue(mGroup.isButtonVisibleWithinGroup(mBtn1.getId()));
123         assertTrue(mGroup.isButtonVisibleWithinGroup(mBtn2.getId()));
124 
125         // Hide button 2
126         assertNotEquals(mGroup.setButtonVisibility(BUTTON_2_ID, false /* visible */), View.VISIBLE);
127         assertEquals("Hiding button 2 should show button 1", mBtn1,
128                 mGroup.getVisibleContextButton());
129 
130         // Hide button 1
131         assertNotEquals(mGroup.setButtonVisibility(BUTTON_1_ID, false /* visible */), View.VISIBLE);
132         assertEquals("Hiding button 1 should show button 0", mBtn0,
133                 mGroup.getVisibleContextButton());
134 
135         // Hide button 0, all buttons are now invisible
136         assertNotEquals(mGroup.setButtonVisibility(BUTTON_0_ID, false /* visible */), View.VISIBLE);
137         assertFalse("No buttons are visible, group should also be invisible", mGroup.isVisible());
138         assertNull(mGroup.getVisibleContextButton());
139         assertFalse(mGroup.isButtonVisibleWithinGroup(mBtn0.getId()));
140         assertFalse(mGroup.isButtonVisibleWithinGroup(mBtn1.getId()));
141         assertFalse(mGroup.isButtonVisibleWithinGroup(mBtn2.getId()));
142     }
143 
144     @Test
testSetLowerPriorityButton()145     public void testSetLowerPriorityButton() throws Exception {
146         // Show button 2
147         showButton(mBtn2);
148 
149         // Show button 1
150         assertNotEquals(mGroup.setButtonVisibility(BUTTON_1_ID, true /* visible */), View.VISIBLE);
151         assertTrue("Showing button 1 lower priority should be hidden but visible underneath",
152                 mGroup.isButtonVisibleWithinGroup(BUTTON_1_ID));
153         assertFalse(mBtn0.isVisible());
154         assertFalse(mBtn1.isVisible());
155         assertTrue(mBtn2.isVisible());
156 
157         // Hide button 1
158         assertNotEquals(mGroup.setButtonVisibility(BUTTON_1_ID, false /* visible */), View.VISIBLE);
159         assertFalse("Hiding button 1 with lower priority hides itself underneath",
160                 mGroup.isButtonVisibleWithinGroup(BUTTON_1_ID));
161         assertTrue("A button still visible, group should also be visible", mGroup.isVisible());
162         assertEquals(mBtn2, mGroup.getVisibleContextButton());
163     }
164 
165     @Test
testSetSamePriorityButton()166     public void testSetSamePriorityButton() throws Exception {
167         // Show button 1
168         showButton(mBtn1);
169 
170         // Show button 1 again
171         showButton(mBtn1);
172 
173         // The original button should still be visible
174         assertEquals(mBtn1, mGroup.getVisibleContextButton());
175         assertFalse(mGroup.isButtonVisibleWithinGroup(mBtn0.getId()));
176         assertFalse(mGroup.isButtonVisibleWithinGroup(mBtn2.getId()));
177     }
178 
179     @Test
180     @Ignore("b/112934365")
testUpdateIconsDarkIntensity()181     public void testUpdateIconsDarkIntensity() throws Exception {
182         final int unusedColor = 0;
183         final Drawable d = mock(Drawable.class);
184         final ContextualButton button = spy(mBtn0);
185         final KeyButtonDrawable kbd1 = spy(new KeyButtonDrawable(d, unusedColor, unusedColor,
186                 false /* horizontalFlip */, null /* ovalBackgroundColor */));
187         final KeyButtonDrawable kbd2 = spy(new KeyButtonDrawable(d, unusedColor, unusedColor,
188                 false /* horizontalFlip */, null /* ovalBackgroundColor */));
189         kbd1.setDarkIntensity(TEST_DARK_INTENSITY);
190         kbd2.setDarkIntensity(0f);
191 
192         // Update icon returns the drawable intensity to half
193         doReturn(kbd1).when(button).getNewDrawable();
194         button.updateIcon();
195         assertEquals(TEST_DARK_INTENSITY, kbd1.getDarkIntensity(), DARK_INTENSITY_ERR);
196 
197         // Return old dark intensity on new drawable after update icon
198         doReturn(kbd2).when(button).getNewDrawable();
199         button.updateIcon();
200         assertEquals(TEST_DARK_INTENSITY, kbd2.getDarkIntensity(), DARK_INTENSITY_ERR);
201     }
202 
showButton(ContextualButton button)203     private void showButton(ContextualButton button) {
204         assertEquals(View.VISIBLE, mGroup.setButtonVisibility(button.getId(), true /* visible */));
205         assertTrue("After set a button visible, group should also be visible", mGroup.isVisible());
206         assertEquals(button, mGroup.getVisibleContextButton());
207     }
208 }
209