1 /* 2 * Copyright (C) 2024 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.launcher3.util 18 19 import android.view.View 20 import android.view.View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN 21 import android.view.Window 22 import androidx.test.ext.junit.runners.AndroidJUnit4 23 import androidx.test.filters.SmallTest 24 import com.android.launcher3.util.SystemUiController.FLAG_DARK_NAV 25 import com.android.launcher3.util.SystemUiController.FLAG_DARK_STATUS 26 import com.android.launcher3.util.SystemUiController.FLAG_LIGHT_NAV 27 import com.android.launcher3.util.SystemUiController.FLAG_LIGHT_STATUS 28 import com.android.launcher3.util.SystemUiController.UI_STATE_BASE_WINDOW 29 import com.android.launcher3.util.SystemUiController.UI_STATE_SCRIM_VIEW 30 import com.google.common.truth.Truth.assertThat 31 import org.junit.Before 32 import org.junit.Test 33 import org.junit.runner.RunWith 34 import org.mockito.ArgumentMatchers.anyInt 35 import org.mockito.ArgumentMatchers.eq 36 import org.mockito.Mock 37 import org.mockito.Mockito.never 38 import org.mockito.Mockito.verify 39 import org.mockito.Mockito.`when` 40 import org.mockito.MockitoAnnotations 41 42 @SmallTest 43 @RunWith(AndroidJUnit4::class) 44 class SystemUiControllerTest { 45 46 @Mock private lateinit var window: Window 47 @Mock private lateinit var decorView: View 48 49 private lateinit var underTest: SystemUiController 50 51 @Before setupnull52 fun setup() { 53 MockitoAnnotations.initMocks(this) 54 `when`(window.decorView).thenReturn(decorView) 55 underTest = SystemUiController(window.decorView) 56 } 57 58 @Test test_default_statenull59 fun test_default_state() { 60 assertThat(underTest.toString()).isEqualTo("mStates=[0, 0, 0, 0, 0]") 61 } 62 63 @Test update_state_base_window_lightnull64 fun update_state_base_window_light() { 65 underTest.updateUiState(UI_STATE_BASE_WINDOW, /* isLight= */ true) 66 67 val visibility = 68 View.SYSTEM_UI_FLAG_LIGHT_NAVIGATION_BAR or View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR 69 verify(decorView).systemUiVisibility = eq(visibility) 70 assertThat(underTest.baseSysuiVisibility).isEqualTo(visibility) 71 val flag = FLAG_LIGHT_NAV or FLAG_LIGHT_STATUS 72 assertThat(underTest.toString()).isEqualTo("mStates=[$flag, 0, 0, 0, 0]") 73 } 74 75 @Test update_state_scrim_view_lightnull76 fun update_state_scrim_view_light() { 77 underTest.updateUiState(UI_STATE_SCRIM_VIEW, /* isLight= */ true) 78 79 verify(decorView).systemUiVisibility = 80 eq(View.SYSTEM_UI_FLAG_LIGHT_NAVIGATION_BAR or View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR) 81 assertThat(underTest.baseSysuiVisibility).isEqualTo(0) 82 val flag = FLAG_LIGHT_NAV or FLAG_LIGHT_STATUS 83 assertThat(underTest.toString()).isEqualTo("mStates=[0, $flag, 0, 0, 0]") 84 } 85 86 @Test update_state_base_window_darknull87 fun update_state_base_window_dark() { 88 underTest.updateUiState(UI_STATE_BASE_WINDOW, /* isLight= */ false) 89 90 verify(decorView, never()).systemUiVisibility = anyInt() 91 assertThat(underTest.baseSysuiVisibility).isEqualTo(0) 92 val flag = FLAG_DARK_NAV or FLAG_DARK_STATUS 93 assertThat(underTest.toString()).isEqualTo("mStates=[$flag, 0, 0, 0, 0]") 94 } 95 96 @Test update_state_scrim_view_darknull97 fun update_state_scrim_view_dark() { 98 underTest.updateUiState(UI_STATE_SCRIM_VIEW, /* isLight= */ false) 99 100 verify(decorView, never()).systemUiVisibility = anyInt() 101 assertThat(underTest.baseSysuiVisibility).isEqualTo(0) 102 val flag = FLAG_DARK_NAV or FLAG_DARK_STATUS 103 assertThat(underTest.toString()).isEqualTo("mStates=[0, $flag, 0, 0, 0]") 104 } 105 106 @Test get_base_sysui_visibilitynull107 fun get_base_sysui_visibility() { 108 `when`(decorView.systemUiVisibility).thenReturn(SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN) 109 110 assertThat(underTest.baseSysuiVisibility).isEqualTo(SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN) 111 } 112 113 @Test update_state_base_window_light_with_existing_visibilitynull114 fun update_state_base_window_light_with_existing_visibility() { 115 `when`(decorView.systemUiVisibility).thenReturn(SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN) 116 117 underTest.updateUiState(UI_STATE_BASE_WINDOW, /* isLight= */ true) 118 119 val visibility = 120 View.SYSTEM_UI_FLAG_LIGHT_NAVIGATION_BAR or 121 View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR or 122 SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN 123 assertThat(underTest.baseSysuiVisibility).isEqualTo(visibility) 124 verify(decorView).systemUiVisibility = eq(visibility) 125 } 126 } 127