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