Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 0fc48a2a authored by Darrell Shi's avatar Darrell Shi Committed by William Xiao
Browse files

Remove dependency on CommunalInteractor

This change removes dependency on the CommunalInteractor from the
CommunalTutorialInteractor to avoid circular dependency. The latter
should report to the former.

Test: atest CommunalTutorialInteractor
Bug: 308148193
Flag: ACONFIG com.android.systemui.communal_hub DEVELOPMENT
Change-Id: I383b4d1595e7148d27f47089eb57135d6921ec98
parent 07dbee8a
Loading
Loading
Loading
Loading
+119 −0
Original line number Diff line number Diff line
/*
 * Copyright (C) 2023 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.communal.data.repository

import androidx.test.ext.junit.runners.AndroidJUnit4
import androidx.test.filters.SmallTest
import com.android.systemui.SysuiTestCase
import com.android.systemui.communal.shared.model.CommunalSceneKey
import com.android.systemui.coroutines.collectLastValue
import com.android.systemui.flags.FakeFeatureFlagsClassic
import com.android.systemui.flags.Flags
import com.android.systemui.scene.SceneTestUtils
import com.android.systemui.scene.data.repository.SceneContainerRepository
import com.android.systemui.scene.shared.flag.FakeSceneContainerFlags
import com.android.systemui.scene.shared.model.SceneKey
import com.android.systemui.scene.shared.model.SceneModel
import com.google.common.truth.Truth.assertThat
import kotlinx.coroutines.test.TestScope
import kotlinx.coroutines.test.runTest
import org.junit.Before
import org.junit.Test
import org.junit.runner.RunWith

@SmallTest
@RunWith(AndroidJUnit4::class)
class CommunalRepositoryImplTest : SysuiTestCase() {
    private lateinit var underTest: CommunalRepositoryImpl

    private lateinit var testScope: TestScope

    private lateinit var featureFlagsClassic: FakeFeatureFlagsClassic
    private lateinit var sceneContainerFlags: FakeSceneContainerFlags
    private lateinit var sceneContainerRepository: SceneContainerRepository

    @Before
    fun setUp() {
        testScope = TestScope()

        val sceneTestUtils = SceneTestUtils(this)
        sceneContainerFlags = FakeSceneContainerFlags(enabled = false)
        sceneContainerRepository = sceneTestUtils.fakeSceneContainerRepository()
        featureFlagsClassic = FakeFeatureFlagsClassic()

        featureFlagsClassic.set(Flags.COMMUNAL_SERVICE_ENABLED, true)

        underTest =
            CommunalRepositoryImpl(
                featureFlagsClassic,
                sceneContainerFlags,
                sceneContainerRepository,
            )
    }

    @Test
    fun isCommunalShowing_sceneContainerDisabled_onCommunalScene_true() =
        testScope.runTest {
            underTest.setDesiredScene(CommunalSceneKey.Communal)

            val isCommunalHubShowing by collectLastValue(underTest.isCommunalHubShowing)
            assertThat(isCommunalHubShowing).isTrue()
        }

    @Test
    fun isCommunalShowing_sceneContainerDisabled_onBlankScene_false() =
        testScope.runTest {
            underTest.setDesiredScene(CommunalSceneKey.Blank)

            val isCommunalHubShowing by collectLastValue(underTest.isCommunalHubShowing)
            assertThat(isCommunalHubShowing).isFalse()
        }

    @Test
    fun isCommunalShowing_sceneContainerEnabled_onCommunalScene_true() =
        testScope.runTest {
            sceneContainerFlags = FakeSceneContainerFlags(enabled = true)
            underTest =
                CommunalRepositoryImpl(
                    featureFlagsClassic,
                    sceneContainerFlags,
                    sceneContainerRepository,
                )

            sceneContainerRepository.setDesiredScene(SceneModel(key = SceneKey.Communal))

            val isCommunalHubShowing by collectLastValue(underTest.isCommunalHubShowing)
            assertThat(isCommunalHubShowing).isTrue()
        }

    @Test
    fun isCommunalShowing_sceneContainerEnabled_onLockscreenScene_false() =
        testScope.runTest {
            sceneContainerFlags = FakeSceneContainerFlags(enabled = true)
            underTest =
                CommunalRepositoryImpl(
                    featureFlagsClassic,
                    sceneContainerFlags,
                    sceneContainerRepository,
                )

            sceneContainerRepository.setDesiredScene(SceneModel(key = SceneKey.Lockscreen))

            val isCommunalHubShowing by collectLastValue(underTest.isCommunalHubShowing)
            assertThat(isCommunalHubShowing).isFalse()
        }
}
+19 −152
Original line number Diff line number Diff line
@@ -24,17 +24,8 @@ import androidx.test.filters.SmallTest
import com.android.systemui.SysuiTestCase
import com.android.systemui.communal.data.repository.FakeCommunalRepository
import com.android.systemui.communal.data.repository.FakeCommunalTutorialRepository
import com.android.systemui.communal.data.repository.FakeCommunalWidgetRepository
import com.android.systemui.communal.shared.model.CommunalSceneKey
import com.android.systemui.coroutines.collectLastValue
import com.android.systemui.keyguard.data.repository.FakeKeyguardRepository
import com.android.systemui.keyguard.domain.interactor.KeyguardInteractor
import com.android.systemui.keyguard.domain.interactor.KeyguardInteractorFactory
import com.android.systemui.scene.SceneTestUtils
import com.android.systemui.scene.domain.interactor.SceneInteractor
import com.android.systemui.scene.shared.flag.FakeSceneContainerFlags
import com.android.systemui.scene.shared.model.SceneKey
import com.android.systemui.scene.shared.model.SceneModel
import com.android.systemui.settings.UserTracker
import com.android.systemui.util.mockito.mock
import com.android.systemui.util.mockito.whenever
@@ -56,39 +47,21 @@ class CommunalTutorialInteractorTest : SysuiTestCase() {
    private lateinit var testScope: TestScope
    private lateinit var underTest: CommunalTutorialInteractor
    private lateinit var keyguardRepository: FakeKeyguardRepository
    private lateinit var keyguardInteractor: KeyguardInteractor
    private lateinit var communalTutorialRepository: FakeCommunalTutorialRepository
    private lateinit var sceneContainerFlags: FakeSceneContainerFlags
    private lateinit var communalInteractor: CommunalInteractor
    private lateinit var communalRepository: FakeCommunalRepository

    private val utils = SceneTestUtils(this)
    private lateinit var sceneInteractor: SceneInteractor

    @Before
    fun setUp() {
        MockitoAnnotations.initMocks(this)

        sceneInteractor = utils.sceneInteractor()
        testScope = utils.testScope
        sceneContainerFlags = utils.sceneContainerFlags.apply { enabled = false }
        communalRepository = FakeCommunalRepository(isCommunalEnabled = true)
        communalInteractor = CommunalInteractor(communalRepository, FakeCommunalWidgetRepository())

        val withDeps = KeyguardInteractorFactory.create()
        keyguardInteractor = withDeps.keyguardInteractor
        keyguardRepository = withDeps.repository
        communalTutorialRepository = FakeCommunalTutorialRepository()

        underTest =
            CommunalTutorialInteractor(
                scope = testScope.backgroundScope,
                communalTutorialRepository = communalTutorialRepository,
                keyguardInteractor = keyguardInteractor,
                communalInteractor = communalInteractor,
                sceneContainerFlags = sceneContainerFlags,
                sceneInteractor = sceneInteractor,
            )
        testScope = TestScope()

        val withDeps = CommunalTutorialInteractorFactory.create(testScope)
        keyguardRepository = withDeps.keyguardRepository
        communalTutorialRepository = withDeps.communalTutorialRepository
        communalRepository = withDeps.communalRepository

        underTest = withDeps.communalTutorialInteractor

        whenever(userTracker.userHandle).thenReturn(mock())
    }
@@ -108,7 +81,7 @@ class CommunalTutorialInteractorTest : SysuiTestCase() {
            val isTutorialAvailable by collectLastValue(underTest.isTutorialAvailable)
            keyguardRepository.setKeyguardShowing(true)
            keyguardRepository.setKeyguardOccluded(false)
            communalInteractor.onSceneChanged(CommunalSceneKey.Blank)
            communalRepository.setIsCommunalHubShowing(false)
            communalTutorialRepository.setTutorialSettingState(HUB_MODE_TUTORIAL_COMPLETED)
            assertThat(isTutorialAvailable).isFalse()
        }
@@ -119,7 +92,7 @@ class CommunalTutorialInteractorTest : SysuiTestCase() {
            val isTutorialAvailable by collectLastValue(underTest.isTutorialAvailable)
            keyguardRepository.setKeyguardShowing(true)
            keyguardRepository.setKeyguardOccluded(false)
            communalInteractor.onSceneChanged(CommunalSceneKey.Blank)
            communalRepository.setIsCommunalHubShowing(false)
            communalTutorialRepository.setTutorialSettingState(HUB_MODE_TUTORIAL_NOT_STARTED)
            assertThat(isTutorialAvailable).isTrue()
        }
@@ -130,23 +103,20 @@ class CommunalTutorialInteractorTest : SysuiTestCase() {
            val isTutorialAvailable by collectLastValue(underTest.isTutorialAvailable)
            keyguardRepository.setKeyguardShowing(true)
            keyguardRepository.setKeyguardOccluded(false)
            communalInteractor.onSceneChanged(CommunalSceneKey.Communal)
            communalRepository.setIsCommunalHubShowing(true)
            communalTutorialRepository.setTutorialSettingState(HUB_MODE_TUTORIAL_STARTED)
            assertThat(isTutorialAvailable).isTrue()
        }

    /* Testing tutorial states with transitions when flexiglass off */
    @Test
    fun tutorialState_notStartedAndCommunalSceneShowing_tutorialStarted() =
        testScope.runTest {
            val tutorialSettingState by
                collectLastValue(communalTutorialRepository.tutorialSettingState)
            val currentScene by collectLastValue(communalInteractor.desiredScene)
            communalTutorialRepository.setTutorialSettingState(HUB_MODE_TUTORIAL_NOT_STARTED)

            communalInteractor.onSceneChanged(CommunalSceneKey.Communal)
            communalRepository.setIsCommunalHubShowing(true)

            assertThat(currentScene).isEqualTo(CommunalSceneKey.Communal)
            assertThat(tutorialSettingState).isEqualTo(HUB_MODE_TUTORIAL_STARTED)
        }

@@ -155,12 +125,10 @@ class CommunalTutorialInteractorTest : SysuiTestCase() {
        testScope.runTest {
            val tutorialSettingState by
                collectLastValue(communalTutorialRepository.tutorialSettingState)
            val currentScene by collectLastValue(communalInteractor.desiredScene)
            communalTutorialRepository.setTutorialSettingState(HUB_MODE_TUTORIAL_STARTED)

            communalInteractor.onSceneChanged(CommunalSceneKey.Communal)
            communalRepository.setIsCommunalHubShowing(true)

            assertThat(currentScene).isEqualTo(CommunalSceneKey.Communal)
            assertThat(tutorialSettingState).isEqualTo(HUB_MODE_TUTORIAL_STARTED)
        }

@@ -169,12 +137,10 @@ class CommunalTutorialInteractorTest : SysuiTestCase() {
        testScope.runTest {
            val tutorialSettingState by
                collectLastValue(communalTutorialRepository.tutorialSettingState)
            val currentScene by collectLastValue(communalInteractor.desiredScene)
            communalTutorialRepository.setTutorialSettingState(HUB_MODE_TUTORIAL_COMPLETED)

            communalInteractor.onSceneChanged(CommunalSceneKey.Communal)
            communalRepository.setIsCommunalHubShowing(true)

            assertThat(currentScene).isEqualTo(CommunalSceneKey.Communal)
            assertThat(tutorialSettingState).isEqualTo(HUB_MODE_TUTORIAL_COMPLETED)
        }

@@ -183,12 +149,10 @@ class CommunalTutorialInteractorTest : SysuiTestCase() {
        testScope.runTest {
            val tutorialSettingState by
                collectLastValue(communalTutorialRepository.tutorialSettingState)
            val currentScene by collectLastValue(communalInteractor.desiredScene)
            communalTutorialRepository.setTutorialSettingState(HUB_MODE_TUTORIAL_NOT_STARTED)

            communalInteractor.onSceneChanged(CommunalSceneKey.Blank)
            communalRepository.setIsCommunalHubShowing(false)

            assertThat(currentScene).isEqualTo(CommunalSceneKey.Blank)
            assertThat(tutorialSettingState).isEqualTo(HUB_MODE_TUTORIAL_NOT_STARTED)
        }

@@ -197,13 +161,11 @@ class CommunalTutorialInteractorTest : SysuiTestCase() {
        testScope.runTest {
            val tutorialSettingState by
                collectLastValue(communalTutorialRepository.tutorialSettingState)
            val currentScene by collectLastValue(communalInteractor.desiredScene)
            communalInteractor.onSceneChanged(CommunalSceneKey.Communal)
            communalRepository.setIsCommunalHubShowing(true)
            communalTutorialRepository.setTutorialSettingState(HUB_MODE_TUTORIAL_STARTED)

            communalInteractor.onSceneChanged(CommunalSceneKey.Blank)
            communalRepository.setIsCommunalHubShowing(false)

            assertThat(currentScene).isEqualTo(CommunalSceneKey.Blank)
            assertThat(tutorialSettingState).isEqualTo(HUB_MODE_TUTORIAL_COMPLETED)
        }

@@ -212,106 +174,11 @@ class CommunalTutorialInteractorTest : SysuiTestCase() {
        testScope.runTest {
            val tutorialSettingState by
                collectLastValue(communalTutorialRepository.tutorialSettingState)
            val currentScene by collectLastValue(communalInteractor.desiredScene)
            communalInteractor.onSceneChanged(CommunalSceneKey.Communal)
            communalTutorialRepository.setTutorialSettingState(HUB_MODE_TUTORIAL_COMPLETED)

            communalInteractor.onSceneChanged(CommunalSceneKey.Blank)

            assertThat(currentScene).isEqualTo(CommunalSceneKey.Blank)
            assertThat(tutorialSettingState).isEqualTo(HUB_MODE_TUTORIAL_COMPLETED)
        }

    /* Testing tutorial states with transitions when flexiglass on */
    @Test
    fun tutorialState_notStartedCommunalSceneShowingAndFlexiglassOn_tutorialStarted() =
        testScope.runTest {
            sceneContainerFlags.enabled = true
            val tutorialSettingState by
                collectLastValue(communalTutorialRepository.tutorialSettingState)
            val currentScene by collectLastValue(sceneInteractor.desiredScene)
            communalTutorialRepository.setTutorialSettingState(HUB_MODE_TUTORIAL_NOT_STARTED)

            sceneInteractor.onSceneChanged(SceneModel(SceneKey.Communal), "reason")

            assertThat(currentScene).isEqualTo(SceneModel(SceneKey.Communal))
            assertThat(tutorialSettingState).isEqualTo(HUB_MODE_TUTORIAL_STARTED)
        }

    @Test
    fun tutorialState_startedCommunalSceneShowingAndFlexiglassOn_stateWillNotUpdate() =
        testScope.runTest {
            sceneContainerFlags.enabled = true
            val tutorialSettingState by
                collectLastValue(communalTutorialRepository.tutorialSettingState)
            val currentScene by collectLastValue(sceneInteractor.desiredScene)
            communalTutorialRepository.setTutorialSettingState(HUB_MODE_TUTORIAL_STARTED)

            sceneInteractor.onSceneChanged(SceneModel(SceneKey.Communal), "reason")

            assertThat(currentScene).isEqualTo(SceneModel(SceneKey.Communal))
            assertThat(tutorialSettingState).isEqualTo(HUB_MODE_TUTORIAL_STARTED)
        }

    @Test
    fun tutorialState_completedCommunalSceneShowingAndFlexiglassOn_stateWillNotUpdate() =
        testScope.runTest {
            sceneContainerFlags.enabled = true
            val tutorialSettingState by
                collectLastValue(communalTutorialRepository.tutorialSettingState)
            val currentScene by collectLastValue(sceneInteractor.desiredScene)
            communalTutorialRepository.setTutorialSettingState(HUB_MODE_TUTORIAL_COMPLETED)

            sceneInteractor.onSceneChanged(SceneModel(SceneKey.Communal), "reason")

            assertThat(currentScene).isEqualTo(SceneModel(SceneKey.Communal))
            assertThat(tutorialSettingState).isEqualTo(HUB_MODE_TUTORIAL_COMPLETED)
        }

    @Test
    fun tutorialState_notStartedCommunalSceneNotShowingAndFlexiglassOn_stateWillNotUpdate() =
        testScope.runTest {
            sceneContainerFlags.enabled = true
            val tutorialSettingState by
                collectLastValue(communalTutorialRepository.tutorialSettingState)
            val currentScene by collectLastValue(sceneInteractor.desiredScene)
            communalTutorialRepository.setTutorialSettingState(HUB_MODE_TUTORIAL_NOT_STARTED)

            sceneInteractor.onSceneChanged(SceneModel(SceneKey.Lockscreen), "reason")

            assertThat(currentScene).isEqualTo(SceneModel(SceneKey.Lockscreen))
            assertThat(tutorialSettingState).isEqualTo(HUB_MODE_TUTORIAL_NOT_STARTED)
        }

    @Test
    fun tutorialState_startedCommunalSceneNotShowingAndFlexiglassOn_tutorialCompleted() =
        testScope.runTest {
            sceneContainerFlags.enabled = true
            val tutorialSettingState by
                collectLastValue(communalTutorialRepository.tutorialSettingState)
            val currentScene by collectLastValue(sceneInteractor.desiredScene)
            sceneInteractor.onSceneChanged(SceneModel(SceneKey.Communal), "reason")
            communalTutorialRepository.setTutorialSettingState(HUB_MODE_TUTORIAL_STARTED)

            sceneInteractor.onSceneChanged(SceneModel(SceneKey.Lockscreen), "reason")

            assertThat(currentScene).isEqualTo(SceneModel(SceneKey.Lockscreen))
            assertThat(tutorialSettingState).isEqualTo(HUB_MODE_TUTORIAL_COMPLETED)
        }

    @Test
    fun tutorialState_completedCommunalSceneNotShowingAndFlexiglassOn_stateWillNotUpdate() =
        testScope.runTest {
            sceneContainerFlags.enabled = true
            val tutorialSettingState by
                collectLastValue(communalTutorialRepository.tutorialSettingState)
            val currentScene by collectLastValue(sceneInteractor.desiredScene)
            sceneInteractor.onSceneChanged(SceneModel(SceneKey.Communal), "reason")
            communalRepository.setIsCommunalHubShowing(true)
            communalTutorialRepository.setTutorialSettingState(HUB_MODE_TUTORIAL_COMPLETED)

            sceneInteractor.onSceneChanged(SceneModel(SceneKey.Lockscreen), "reason")
            communalRepository.setIsCommunalHubShowing(false)

            assertThat(currentScene).isEqualTo(SceneModel(SceneKey.Lockscreen))
            assertThat(tutorialSettingState).isEqualTo(HUB_MODE_TUTORIAL_COMPLETED)
        }
}
+17 −0
Original line number Diff line number Diff line
@@ -21,16 +21,24 @@ import com.android.systemui.communal.shared.model.CommunalSceneKey
import com.android.systemui.dagger.SysUISingleton
import com.android.systemui.flags.FeatureFlagsClassic
import com.android.systemui.flags.Flags
import com.android.systemui.scene.data.repository.SceneContainerRepository
import com.android.systemui.scene.shared.flag.SceneContainerFlags
import com.android.systemui.scene.shared.model.SceneKey
import javax.inject.Inject
import kotlinx.coroutines.flow.Flow
import kotlinx.coroutines.flow.MutableStateFlow
import kotlinx.coroutines.flow.StateFlow
import kotlinx.coroutines.flow.asStateFlow
import kotlinx.coroutines.flow.map

/** Encapsulates the state of communal mode. */
interface CommunalRepository {
    /** Whether communal features are enabled. */
    val isCommunalEnabled: Boolean

    /** Whether the communal hub is showing. */
    val isCommunalHubShowing: Flow<Boolean>

    /**
     * Target scene as requested by the underlying [SceneTransitionLayout] or through
     * [setDesiredScene].
@@ -46,6 +54,8 @@ class CommunalRepositoryImpl
@Inject
constructor(
    private val featureFlagsClassic: FeatureFlagsClassic,
    sceneContainerFlags: SceneContainerFlags,
    sceneContainerRepository: SceneContainerRepository,
) : CommunalRepository {
    override val isCommunalEnabled: Boolean
        get() = featureFlagsClassic.isEnabled(Flags.COMMUNAL_SERVICE_ENABLED) && communalHub()
@@ -57,4 +67,11 @@ constructor(
    override fun setDesiredScene(desiredScene: CommunalSceneKey) {
        _desiredScene.value = desiredScene
    }

    override val isCommunalHubShowing: Flow<Boolean> =
        if (sceneContainerFlags.isEnabled()) {
            sceneContainerRepository.desiredScene.map { scene -> scene.key == SceneKey.Communal }
        } else {
            desiredScene.map { sceneKey -> sceneKey == CommunalSceneKey.Communal }
        }
}
+8 −18
Original line number Diff line number Diff line
@@ -17,13 +17,11 @@
package com.android.systemui.communal.domain.interactor

import android.provider.Settings
import com.android.systemui.communal.data.repository.CommunalRepository
import com.android.systemui.communal.data.repository.CommunalTutorialRepository
import com.android.systemui.dagger.SysUISingleton
import com.android.systemui.dagger.qualifiers.Application
import com.android.systemui.keyguard.domain.interactor.KeyguardInteractor
import com.android.systemui.scene.domain.interactor.SceneInteractor
import com.android.systemui.scene.shared.flag.SceneContainerFlags
import com.android.systemui.scene.shared.model.SceneKey
import javax.inject.Inject
import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.ExperimentalCoroutinesApi
@@ -46,9 +44,7 @@ constructor(
    @Application private val scope: CoroutineScope,
    private val communalTutorialRepository: CommunalTutorialRepository,
    keyguardInteractor: KeyguardInteractor,
    private val communalInteractor: CommunalInteractor,
    private val sceneContainerFlags: SceneContainerFlags,
    private val sceneInteractor: SceneInteractor,
    private val communalRepository: CommunalRepository,
) {
    /** An observable for whether the tutorial is available. */
    val isTutorialAvailable: Flow<Boolean> =
@@ -74,18 +70,12 @@ constructor(
                if (tutorialSettingState == Settings.Secure.HUB_MODE_TUTORIAL_COMPLETED) {
                    return@flatMapLatest flowOf(null)
                }
                if (sceneContainerFlags.isEnabled()) {
                    sceneInteractor.desiredScene.map { sceneModel ->
                communalRepository.isCommunalHubShowing.map { isCommunalShowing ->
                    nextStateAfterTransition(
                        tutorialSettingState,
                            sceneModel.key == SceneKey.Communal
                        isCommunalShowing,
                    )
                }
                } else {
                    communalInteractor.isCommunalShowing.map {
                        nextStateAfterTransition(tutorialSettingState, it)
                    }
                }
            }
            .filterNotNull()
            .distinctUntilChanged()
@@ -102,7 +92,7 @@ constructor(

    private var job: Job? = null
    private fun listenForTransitionToUpdateTutorialState() {
        if (!communalInteractor.isCommunalEnabled) {
        if (!communalRepository.isCommunalEnabled) {
            return
        }
        job =
+8 −0
Original line number Diff line number Diff line
package com.android.systemui.communal.data.repository

import com.android.systemui.communal.shared.model.CommunalSceneKey
import kotlinx.coroutines.flow.Flow
import kotlinx.coroutines.flow.MutableStateFlow

/** Fake implementation of [CommunalRepository]. */
@@ -16,4 +17,11 @@ class FakeCommunalRepository(
    fun setIsCommunalEnabled(value: Boolean) {
        isCommunalEnabled = value
    }

    private val _isCommunalHubShowing: MutableStateFlow<Boolean> = MutableStateFlow(false)
    override val isCommunalHubShowing: Flow<Boolean> = _isCommunalHubShowing

    fun setIsCommunalHubShowing(isCommunalHubShowing: Boolean) {
        _isCommunalHubShowing.value = isCommunalHubShowing
    }
}
Loading