1 package com.android.systemui.qs.tiles 2 3 import android.app.AlarmManager 4 import android.app.PendingIntent 5 import android.os.Handler 6 import android.provider.AlarmClock 7 import android.service.quicksettings.Tile 8 import android.testing.TestableLooper 9 import androidx.test.ext.junit.runners.AndroidJUnit4 10 import androidx.test.filters.SmallTest 11 import com.android.internal.logging.MetricsLogger 12 import com.android.systemui.SysuiTestCase 13 import com.android.systemui.classifier.FalsingManagerFake 14 import com.android.systemui.plugins.ActivityStarter 15 import com.android.systemui.plugins.statusbar.StatusBarStateController 16 import com.android.systemui.qs.QSHost 17 import com.android.systemui.qs.QsEventLogger 18 import com.android.systemui.qs.logging.QSLogger 19 import com.android.systemui.settings.UserTracker 20 import com.android.systemui.statusbar.policy.NextAlarmController 21 import com.android.systemui.util.mockito.capture 22 import com.android.systemui.util.mockito.eq 23 import com.google.common.truth.Truth.assertThat 24 import org.junit.After 25 import org.junit.Before 26 import org.junit.Test 27 import org.junit.runner.RunWith 28 import org.mockito.ArgumentCaptor 29 import org.mockito.Captor 30 import org.mockito.Mock 31 import org.mockito.Mockito.verify 32 import org.mockito.Mockito.`when` 33 import org.mockito.MockitoAnnotations 34 35 @SmallTest 36 @RunWith(AndroidJUnit4::class) 37 @TestableLooper.RunWithLooper(setAsMainLooper = true) 38 class AlarmTileTest : SysuiTestCase() { 39 40 @Mock 41 private lateinit var qsHost: QSHost 42 @Mock 43 private lateinit var metricsLogger: MetricsLogger 44 @Mock 45 private lateinit var statusBarStateController: StatusBarStateController 46 @Mock 47 private lateinit var activityStarter: ActivityStarter 48 @Mock 49 private lateinit var qsLogger: QSLogger 50 @Mock 51 private lateinit var userTracker: UserTracker 52 @Mock 53 private lateinit var nextAlarmController: NextAlarmController 54 @Mock 55 private lateinit var uiEventLogger: QsEventLogger 56 @Mock 57 private lateinit var pendingIntent: PendingIntent 58 @Captor 59 private lateinit var callbackCaptor: ArgumentCaptor<NextAlarmController.NextAlarmChangeCallback> 60 61 private lateinit var testableLooper: TestableLooper 62 private lateinit var tile: AlarmTile 63 64 @Before setUpnull65 fun setUp() { 66 MockitoAnnotations.initMocks(this) 67 testableLooper = TestableLooper.get(this) 68 69 `when`(qsHost.context).thenReturn(mContext) 70 71 tile = AlarmTile( 72 qsHost, 73 uiEventLogger, 74 testableLooper.looper, 75 Handler(testableLooper.looper), 76 FalsingManagerFake(), 77 metricsLogger, 78 statusBarStateController, 79 activityStarter, 80 qsLogger, 81 userTracker, 82 nextAlarmController 83 ) 84 85 tile.initialize() 86 87 verify(nextAlarmController).observe(eq(tile), capture(callbackCaptor)) 88 tile.refreshState() 89 testableLooper.processAllMessages() 90 } 91 92 @After tearDownnull93 fun tearDown() { 94 tile.destroy() 95 testableLooper.processAllMessages() 96 } 97 98 @Test testAvailablenull99 fun testAvailable() { 100 assertThat(tile.isAvailable).isTrue() 101 } 102 103 @Test testDoesntHandleLongClicknull104 fun testDoesntHandleLongClick() { 105 assertThat(tile.state.handlesLongClick).isFalse() 106 } 107 108 @Test testDefaultIntentShowAlarmsnull109 fun testDefaultIntentShowAlarms() { 110 assertThat(tile.defaultIntent.action).isEqualTo(AlarmClock.ACTION_SHOW_ALARMS) 111 } 112 113 @Test testInactiveByDefaultnull114 fun testInactiveByDefault() { 115 assertThat(tile.state.state).isEqualTo(Tile.STATE_INACTIVE) 116 } 117 118 @Test testInactiveAfterNullNextAlarmnull119 fun testInactiveAfterNullNextAlarm() { 120 callbackCaptor.value.onNextAlarmChanged(null) 121 122 testableLooper.processAllMessages() 123 assertThat(tile.state.state).isEqualTo(Tile.STATE_INACTIVE) 124 } 125 126 @Test testActivityStartedWhenNullNextAlarmnull127 fun testActivityStartedWhenNullNextAlarm() { 128 callbackCaptor.value.onNextAlarmChanged(null) 129 tile.click(null /* view */) 130 131 testableLooper.processAllMessages() 132 verify(activityStarter).postStartActivityDismissingKeyguard(tile.defaultIntent, 0, 133 null /* animationController */) 134 } 135 136 @Test testActiveAfterNextAlarmnull137 fun testActiveAfterNextAlarm() { 138 val alarmInfo = AlarmManager.AlarmClockInfo(1L, pendingIntent) 139 callbackCaptor.value.onNextAlarmChanged(alarmInfo) 140 141 testableLooper.processAllMessages() 142 assertThat(tile.state.state).isEqualTo(Tile.STATE_ACTIVE) 143 } 144 145 @Test testActivityStartedWhenNextAlarmnull146 fun testActivityStartedWhenNextAlarm() { 147 val alarmInfo = AlarmManager.AlarmClockInfo(1L, pendingIntent) 148 callbackCaptor.value.onNextAlarmChanged(alarmInfo) 149 tile.click(null /* view */) 150 151 testableLooper.processAllMessages() 152 verify(activityStarter).postStartActivityDismissingKeyguard(pendingIntent, 153 null /* animationController */) 154 } 155 } 156