diff options
7 files changed, 308 insertions, 0 deletions
diff --git a/packages/SystemUI/multivalentTests/src/com/android/systemui/navigation/data/repository/NavigationRepositoryTest.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/navigation/data/repository/NavigationRepositoryTest.kt new file mode 100644 index 000000000000..e45aa05408e7 --- /dev/null +++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/navigation/data/repository/NavigationRepositoryTest.kt @@ -0,0 +1,76 @@ +/* + * Copyright (C) 2024 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.systemui.navigation.data.repository + +import android.view.WindowManagerPolicyConstants +import androidx.test.ext.junit.runners.AndroidJUnit4 +import androidx.test.filters.SmallTest +import com.android.systemui.SysuiTestCase +import com.android.systemui.coroutines.collectLastValue +import com.android.systemui.kosmos.testScope +import com.android.systemui.navigationbar.NavigationModeController.ModeChangedListener +import com.android.systemui.navigationbar.navigationModeController +import com.android.systemui.testKosmos +import com.google.common.truth.Truth.assertThat +import kotlinx.coroutines.test.runTest +import org.junit.Before +import org.junit.Test +import org.junit.runner.RunWith +import org.mockito.kotlin.any +import org.mockito.kotlin.whenever + +@SmallTest +@RunWith(AndroidJUnit4::class) +class NavigationRepositoryTest : SysuiTestCase() { + + private val kosmos = testKosmos() + private val testScope = kosmos.testScope + private val navigationModeControllerMock = kosmos.navigationModeController + + private val underTest = kosmos.navigationRepository + + private var currentMode = WindowManagerPolicyConstants.NAV_BAR_MODE_3BUTTON + private val modeChangedListeners = mutableListOf<ModeChangedListener>() + + @Before + fun setUp() { + whenever(navigationModeControllerMock.addListener(any())).thenAnswer { invocation -> + val listener = invocation.arguments[0] as ModeChangedListener + modeChangedListeners.add(listener) + currentMode + } + } + + @Test + fun isGesturalMode() = + testScope.runTest { + val isGesturalMode by collectLastValue(underTest.isGesturalMode) + assertThat(isGesturalMode).isFalse() + + currentMode = WindowManagerPolicyConstants.NAV_BAR_MODE_GESTURAL + notifyModeChangedListeners() + assertThat(isGesturalMode).isTrue() + + currentMode = WindowManagerPolicyConstants.NAV_BAR_MODE_3BUTTON + notifyModeChangedListeners() + assertThat(isGesturalMode).isFalse() + } + + private fun notifyModeChangedListeners() { + modeChangedListeners.forEach { listener -> listener.onNavigationModeChanged(currentMode) } + } +} diff --git a/packages/SystemUI/multivalentTests/src/com/android/systemui/navigation/domain/interactor/NavigationInteractorTest.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/navigation/domain/interactor/NavigationInteractorTest.kt new file mode 100644 index 000000000000..88beeb2b0d8a --- /dev/null +++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/navigation/domain/interactor/NavigationInteractorTest.kt @@ -0,0 +1,76 @@ +/* + * Copyright (C) 2024 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.systemui.navigation.domain.interactor + +import android.view.WindowManagerPolicyConstants +import androidx.test.ext.junit.runners.AndroidJUnit4 +import androidx.test.filters.SmallTest +import com.android.systemui.SysuiTestCase +import com.android.systemui.coroutines.collectLastValue +import com.android.systemui.kosmos.testScope +import com.android.systemui.navigationbar.NavigationModeController.ModeChangedListener +import com.android.systemui.navigationbar.navigationModeController +import com.android.systemui.testKosmos +import com.google.common.truth.Truth.assertThat +import kotlinx.coroutines.test.runTest +import org.junit.Before +import org.junit.Test +import org.junit.runner.RunWith +import org.mockito.kotlin.any +import org.mockito.kotlin.whenever + +@SmallTest +@RunWith(AndroidJUnit4::class) +class NavigationInteractorTest : SysuiTestCase() { + + private val kosmos = testKosmos() + private val testScope = kosmos.testScope + private val navigationModeControllerMock = kosmos.navigationModeController + + private val underTest = kosmos.navigationInteractor + + private var currentMode = WindowManagerPolicyConstants.NAV_BAR_MODE_3BUTTON + private val modeChangedListeners = mutableListOf<ModeChangedListener>() + + @Before + fun setUp() { + whenever(navigationModeControllerMock.addListener(any())).thenAnswer { invocation -> + val listener = invocation.arguments[0] as ModeChangedListener + modeChangedListeners.add(listener) + currentMode + } + } + + @Test + fun isGesturalMode() = + testScope.runTest { + val isGesturalMode by collectLastValue(underTest.isGesturalMode) + assertThat(isGesturalMode).isFalse() + + currentMode = WindowManagerPolicyConstants.NAV_BAR_MODE_GESTURAL + notifyModeChangedListeners() + assertThat(isGesturalMode).isTrue() + + currentMode = WindowManagerPolicyConstants.NAV_BAR_MODE_3BUTTON + notifyModeChangedListeners() + assertThat(isGesturalMode).isFalse() + } + + private fun notifyModeChangedListeners() { + modeChangedListeners.forEach { listener -> listener.onNavigationModeChanged(currentMode) } + } +} diff --git a/packages/SystemUI/src/com/android/systemui/navigation/data/repository/NavigationRepository.kt b/packages/SystemUI/src/com/android/systemui/navigation/data/repository/NavigationRepository.kt new file mode 100644 index 000000000000..4409e2c6ae59 --- /dev/null +++ b/packages/SystemUI/src/com/android/systemui/navigation/data/repository/NavigationRepository.kt @@ -0,0 +1,46 @@ +/* + * Copyright (C) 2024 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.systemui.navigation.data.repository + +import com.android.systemui.dagger.SysUISingleton +import com.android.systemui.navigationbar.NavigationModeController +import com.android.systemui.shared.system.QuickStepContract +import com.android.systemui.utils.coroutines.flow.conflatedCallbackFlow +import javax.inject.Inject +import kotlinx.coroutines.channels.awaitClose +import kotlinx.coroutines.flow.Flow + +@SysUISingleton +class NavigationRepository +@Inject +constructor( + private val controller: NavigationModeController, +) { + + /** Whether the current navigation bar mode is edge-to-edge. */ + val isGesturalMode: Flow<Boolean> = conflatedCallbackFlow { + val listener = + NavigationModeController.ModeChangedListener { mode -> + trySend(QuickStepContract.isGesturalMode(mode)) + } + + val currentMode = controller.addListener(listener) + trySend(QuickStepContract.isGesturalMode(currentMode)) + + awaitClose { controller.removeListener(listener) } + } +} diff --git a/packages/SystemUI/src/com/android/systemui/navigation/domain/interactor/NavigationInteractor.kt b/packages/SystemUI/src/com/android/systemui/navigation/domain/interactor/NavigationInteractor.kt new file mode 100644 index 000000000000..0f9c883b70c7 --- /dev/null +++ b/packages/SystemUI/src/com/android/systemui/navigation/domain/interactor/NavigationInteractor.kt @@ -0,0 +1,33 @@ +/* + * Copyright (C) 2024 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.systemui.navigation.domain.interactor + +import com.android.systemui.dagger.SysUISingleton +import com.android.systemui.navigation.data.repository.NavigationRepository +import javax.inject.Inject +import kotlinx.coroutines.flow.Flow + +@SysUISingleton +class NavigationInteractor +@Inject +constructor( + repository: NavigationRepository, +) { + + /** Whether the current navigation bar mode is edge-to-edge. */ + val isGesturalMode: Flow<Boolean> = repository.isGesturalMode +} diff --git a/packages/SystemUI/tests/utils/src/com/android/systemui/navigation/data/repository/NavigationRepositoryKosmos.kt b/packages/SystemUI/tests/utils/src/com/android/systemui/navigation/data/repository/NavigationRepositoryKosmos.kt new file mode 100644 index 000000000000..717a30047c95 --- /dev/null +++ b/packages/SystemUI/tests/utils/src/com/android/systemui/navigation/data/repository/NavigationRepositoryKosmos.kt @@ -0,0 +1,27 @@ +/* + * Copyright (C) 2024 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.systemui.navigation.data.repository + +import com.android.systemui.kosmos.Kosmos +import com.android.systemui.kosmos.Kosmos.Fixture +import com.android.systemui.navigationbar.navigationModeController + +val Kosmos.navigationRepository by Fixture { + NavigationRepository( + controller = navigationModeController, + ) +} diff --git a/packages/SystemUI/tests/utils/src/com/android/systemui/navigation/domain/interactor/NavigationInteractorKosmos.kt b/packages/SystemUI/tests/utils/src/com/android/systemui/navigation/domain/interactor/NavigationInteractorKosmos.kt new file mode 100644 index 000000000000..80fe3b98edff --- /dev/null +++ b/packages/SystemUI/tests/utils/src/com/android/systemui/navigation/domain/interactor/NavigationInteractorKosmos.kt @@ -0,0 +1,27 @@ +/* + * Copyright (C) 2024 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.systemui.navigation.domain.interactor + +import com.android.systemui.kosmos.Kosmos +import com.android.systemui.kosmos.Kosmos.Fixture +import com.android.systemui.navigation.data.repository.navigationRepository + +val Kosmos.navigationInteractor by Fixture { + NavigationInteractor( + repository = navigationRepository, + ) +} diff --git a/packages/SystemUI/tests/utils/src/com/android/systemui/navigationbar/NavigationModeControllerKosmos.kt b/packages/SystemUI/tests/utils/src/com/android/systemui/navigationbar/NavigationModeControllerKosmos.kt new file mode 100644 index 000000000000..f2fb1a89d7aa --- /dev/null +++ b/packages/SystemUI/tests/utils/src/com/android/systemui/navigationbar/NavigationModeControllerKosmos.kt @@ -0,0 +1,23 @@ +/* + * Copyright (C) 2024 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.systemui.navigationbar + +import com.android.systemui.kosmos.Kosmos +import com.android.systemui.kosmos.Kosmos.Fixture +import com.android.systemui.util.mockito.mock + +val Kosmos.navigationModeController by Fixture { mock<NavigationModeController>() } |