1 /** 2 * Copyright (C) 2017 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.volume; 18 19 import static junit.framework.Assert.assertEquals; 20 import static junit.framework.Assert.assertFalse; 21 import static junit.framework.Assert.assertTrue; 22 23 import static org.mockito.Mockito.mock; 24 import static org.mockito.Mockito.when; 25 26 import android.net.Uri; 27 import android.provider.Settings; 28 import android.service.notification.Condition; 29 import android.service.notification.ZenModeConfig; 30 import android.support.test.annotation.UiThreadTest; 31 import android.support.test.filters.SmallTest; 32 import android.support.test.runner.AndroidJUnit4; 33 import android.view.LayoutInflater; 34 35 import com.android.systemui.SysuiTestCase; 36 import com.android.systemui.statusbar.policy.ZenModeController; 37 38 import org.junit.Before; 39 import org.junit.Test; 40 import org.junit.runner.RunWith; 41 42 @SmallTest 43 @RunWith(AndroidJUnit4.class) 44 public class ZenModePanelTest extends SysuiTestCase { 45 46 ZenModePanel mPanel; 47 ZenModeController mController; 48 Uri mForeverId; 49 50 @Before 51 public void setup() throws Exception { 52 final LayoutInflater layoutInflater = LayoutInflater.from(mContext); 53 mPanel = (ZenModePanel) layoutInflater.inflate(com.android.systemui.R.layout.zen_mode_panel, 54 null); 55 mController = mock(ZenModeController.class); 56 mForeverId = Condition.newId(mContext).appendPath("forever").build(); 57 58 mPanel.init(mController); 59 } 60 61 private void assertProperConditionTagTypes(boolean hasAlarm) { 62 final int N = mPanel.getVisibleConditions(); 63 assertEquals(hasAlarm ? 3 : 2, N); 64 65 assertEquals(mForeverId, mPanel.getConditionTagAt(0).condition.id); 66 assertTrue(ZenModeConfig.isValidCountdownConditionId( 67 mPanel.getConditionTagAt(1).condition.id)); 68 assertFalse(ZenModeConfig.isValidCountdownToAlarmConditionId( 69 mPanel.getConditionTagAt(1).condition.id)); 70 if (hasAlarm) { 71 assertTrue(ZenModeConfig.isValidCountdownToAlarmConditionId( 72 mPanel.getConditionTagAt(2).condition.id)); 73 } 74 } 75 76 @Test 77 public void testHandleUpdateConditions_foreverSelected_alarmExists() { 78 Condition forever = new Condition(mForeverId, "", Condition.STATE_TRUE); 79 80 when(mController.getNextAlarm()).thenReturn(System.currentTimeMillis() + 1000); 81 82 mPanel.handleUpdateConditions(forever); 83 assertProperConditionTagTypes(true); 84 assertTrue(mPanel.getConditionTagAt(0).rb.isChecked()); 85 } 86 87 @Test 88 public void testHandleUpdateConditions_foreverSelected_noAlarm() { 89 Uri foreverId = Condition.newId(mContext).appendPath("forever").build(); 90 Condition forever = new Condition(foreverId, "", Condition.STATE_TRUE); 91 92 when(mController.getNextAlarm()).thenReturn((long) 0); 93 94 mPanel.handleUpdateConditions(forever); 95 assertProperConditionTagTypes(false); 96 assertEquals(foreverId, mPanel.getConditionTagAt(0).condition.id); 97 } 98 99 @Test 100 public void testHandleUpdateConditions_countdownSelected_alarmExists() { 101 Uri foreverId = Condition.newId(mContext).appendPath("forever").build(); 102 103 Condition countdown = new Condition(ZenModeConfig.toCountdownConditionId( 104 System.currentTimeMillis() + (3 * 60 * 60 * 1000) + 4000, false), 105 "", Condition.STATE_TRUE); 106 107 when(mController.getNextAlarm()).thenReturn(System.currentTimeMillis() + 1000); 108 109 mPanel.handleUpdateConditions(countdown); 110 assertProperConditionTagTypes(true); 111 assertTrue(mPanel.getConditionTagAt(1).rb.isChecked()); 112 } 113 114 @Test 115 public void testHandleUpdateConditions_countdownSelected_noAlarm() { 116 Uri foreverId = Condition.newId(mContext).appendPath("forever").build(); 117 118 Condition countdown = new Condition(ZenModeConfig.toCountdownConditionId( 119 System.currentTimeMillis() + (3 * 60 * 60 * 1000) + 4000, false), 120 "", Condition.STATE_TRUE); 121 122 when(mController.getNextAlarm()).thenReturn((long) 0); 123 124 mPanel.handleUpdateConditions(countdown); 125 assertProperConditionTagTypes(false); 126 assertTrue(mPanel.getConditionTagAt(1).rb.isChecked()); 127 } 128 129 @Test 130 public void testHandleUpdateConditions_nextAlarmSelected() { 131 Uri foreverId = Condition.newId(mContext).appendPath("forever").build(); 132 133 Condition alarm = new Condition(ZenModeConfig.toCountdownConditionId( 134 System.currentTimeMillis() + 1000, true), 135 "", Condition.STATE_TRUE); 136 when(mController.getNextAlarm()).thenReturn(System.currentTimeMillis() + 9000); 137 138 mPanel.handleUpdateConditions(alarm); 139 140 assertProperConditionTagTypes(true); 141 assertEquals(alarm, mPanel.getConditionTagAt(2).condition); 142 assertTrue(mPanel.getConditionTagAt(2).rb.isChecked()); 143 } 144 145 @Test 146 public void testHandleUpdateConditions_foreverSelected_alarmConditionDoesNotChangeIfAttached() { 147 Uri foreverId = Condition.newId(mContext).appendPath("forever").build(); 148 Condition forever = new Condition(foreverId, "", Condition.STATE_TRUE); 149 150 Condition alarm = new Condition(ZenModeConfig.toCountdownConditionId( 151 System.currentTimeMillis() + 9000, true), 152 "", Condition.STATE_TRUE); 153 when(mController.getNextAlarm()).thenReturn(System.currentTimeMillis() + 1000); 154 155 mPanel.handleUpdateConditions(alarm); 156 mPanel.setAttached(true); 157 mPanel.handleUpdateConditions(forever); 158 159 assertProperConditionTagTypes(true); 160 assertEquals(alarm, mPanel.getConditionTagAt(2).condition); 161 assertTrue(mPanel.getConditionTagAt(0).rb.isChecked()); 162 } 163 164 @Test 165 public void testHandleUpdateConditions_foreverSelected_timeConditionDoesNotChangeIfAttached() { 166 Uri foreverId = Condition.newId(mContext).appendPath("forever").build(); 167 Condition forever = new Condition(foreverId, "", Condition.STATE_TRUE); 168 169 Condition countdown = new Condition(ZenModeConfig.toCountdownConditionId( 170 System.currentTimeMillis() + (3 * 60 * 60 * 1000) + 4000, false), 171 "", Condition.STATE_TRUE); 172 when(mController.getNextAlarm()).thenReturn((long) 0); 173 174 mPanel.handleUpdateConditions(countdown); 175 mPanel.setAttached(true); 176 mPanel.handleUpdateConditions(forever); 177 178 assertProperConditionTagTypes(false); 179 assertEquals(countdown, mPanel.getConditionTagAt(1).condition); 180 assertTrue(mPanel.getConditionTagAt(0).rb.isChecked()); 181 } 182 183 @Test 184 @UiThreadTest 185 public void testHandleUpdateManualRule_stillSelectedAfterModeChange() { 186 ZenModeConfig.ZenRule rule = new ZenModeConfig.ZenRule(); 187 188 Condition alarm = new Condition(ZenModeConfig.toCountdownConditionId( 189 System.currentTimeMillis() + 1000, true), 190 "", Condition.STATE_TRUE); 191 192 rule.condition = alarm; 193 rule.conditionId = alarm.id; 194 rule.enabled = true; 195 rule.zenMode = Settings.Global.ZEN_MODE_IMPORTANT_INTERRUPTIONS; 196 197 mPanel.handleUpdateManualRule(rule); 198 199 assertProperConditionTagTypes(true); 200 assertEquals(alarm, mPanel.getConditionTagAt(2).condition); 201 assertTrue(mPanel.getConditionTagAt(2).rb.isChecked()); 202 203 assertEquals(Settings.Global.ZEN_MODE_IMPORTANT_INTERRUPTIONS, 204 mPanel.getSelectedZen(Settings.Global.ZEN_MODE_OFF)); 205 206 rule.zenMode = Settings.Global.ZEN_MODE_NO_INTERRUPTIONS; 207 208 mPanel.handleUpdateManualRule(rule); 209 210 assertProperConditionTagTypes(true); 211 assertEquals(alarm, mPanel.getConditionTagAt(2).condition); 212 assertTrue(mPanel.getConditionTagAt(2).rb.isChecked()); 213 214 assertEquals(Settings.Global.ZEN_MODE_NO_INTERRUPTIONS, 215 mPanel.getSelectedZen(Settings.Global.ZEN_MODE_OFF)); 216 } 217 } 218