Loading packages/SystemUI/multivalentTests/src/com/android/systemui/qs/tiles/impl/internet/domain/interactor/InternetTileUserActionInteractorTest.kt +10 −0 Original line number Diff line number Diff line Loading @@ -33,6 +33,7 @@ import com.android.systemui.statusbar.connectivity.AccessPointController import com.android.systemui.util.mockito.mock import com.android.systemui.util.mockito.nullable import com.google.common.truth.Truth import com.google.common.truth.Truth.assertThat import kotlinx.coroutines.test.runTest import org.junit.Before import org.junit.Test Loading Loading @@ -136,4 +137,13 @@ class InternetTileUserActionInteractorTest : SysuiTestCase() { verify(wifiStateWorker, times(1)).isWifiEnabled = eq(true) } @Test fun detailsViewModel() = kosmos.testScope.runTest { assertThat(underTest.detailsViewModel.getTitle()) .isEqualTo("Internet") assertThat(underTest.detailsViewModel.getSubTitle()) .isEqualTo("Tab a network to connect") } } packages/SystemUI/multivalentTests/src/com/android/systemui/qs/tiles/viewmodel/QSTileViewModelTest.kt +15 −0 Original line number Diff line number Diff line Loading @@ -173,6 +173,21 @@ class QSTileViewModelTest : SysuiTestCase() { .isEqualTo(FakeQSTileDataInteractor.AvailabilityRequest(USER)) } @Test fun tileDetails() = testScope.runTest { assertThat(tileUserActionInteractor.detailsViewModel).isNotNull() assertThat(tileUserActionInteractor.detailsViewModel?.getTitle()) .isEqualTo("FakeQSTileUserActionInteractor") assertThat(underTest.detailsViewModel).isNotNull() assertThat(underTest.detailsViewModel?.getTitle()) .isEqualTo("FakeQSTileUserActionInteractor") tileUserActionInteractor.detailsViewModel = null assertThat(tileUserActionInteractor.detailsViewModel).isNull() assertThat(underTest.detailsViewModel).isNull() } private fun createViewModel( scope: TestScope, config: QSTileConfig = tileConfig, Loading packages/SystemUI/src/com/android/systemui/qs/tiles/base/interactor/QSTileUserActionInteractor.kt +14 −0 Original line number Diff line number Diff line Loading @@ -17,6 +17,7 @@ package com.android.systemui.qs.tiles.base.interactor import android.annotation.WorkerThread import com.android.systemui.plugins.qs.TileDetailsViewModel interface QSTileUserActionInteractor<DATA_TYPE> { /** Loading @@ -27,4 +28,17 @@ interface QSTileUserActionInteractor<DATA_TYPE> { * It's safe to run long running computations inside this function. */ @WorkerThread suspend fun handleInput(input: QSTileInput<DATA_TYPE>) /** * Provides the [TileDetailsViewModel] for constructing the corresponding details view. * * This property is defined here to reuse the business logic. For example, reusing the user * long-click as the go-to-settings callback in the details view. * Subclasses can override this property to provide a specific [TileDetailsViewModel] * implementation. * * @return The [TileDetailsViewModel] instance, or null if not implemented. */ val detailsViewModel: TileDetailsViewModel? get() = null } packages/SystemUI/src/com/android/systemui/qs/tiles/base/viewmodel/QSTileViewModelImpl.kt +4 −0 Original line number Diff line number Diff line Loading @@ -20,6 +20,7 @@ import android.os.UserHandle import com.android.app.tracing.coroutines.launchTraced as launch import com.android.systemui.Dumpable import com.android.systemui.plugins.FalsingManager import com.android.systemui.plugins.qs.TileDetailsViewModel import com.android.systemui.qs.tiles.base.analytics.QSTileAnalytics import com.android.systemui.qs.tiles.base.interactor.DataUpdateTrigger import com.android.systemui.qs.tiles.base.interactor.DisabledByPolicyInteractor Loading Loading @@ -115,6 +116,9 @@ class QSTileViewModelImpl<DATA_TYPE>( .flowOn(backgroundDispatcher) .stateIn(tileScope, SharingStarted.WhileSubscribed(), true) override val detailsViewModel: TileDetailsViewModel? get() = userActionInteractor().detailsViewModel override fun forceUpdate() { tileScope.launch(context = backgroundDispatcher) { forceUpdates.emit(Unit) } } Loading packages/SystemUI/src/com/android/systemui/qs/tiles/impl/internet/domain/interactor/InternetTileUserActionInteractor.kt +19 −4 Original line number Diff line number Diff line Loading @@ -18,15 +18,23 @@ package com.android.systemui.qs.tiles.impl.internet.domain.interactor import android.content.Intent import android.provider.Settings import com.android.systemui.animation.Expandable import com.android.systemui.dagger.qualifiers.Main import com.android.systemui.plugins.qs.TileDetailsViewModel import com.android.systemui.qs.tiles.base.actions.QSTileIntentUserInputHandler import com.android.systemui.qs.tiles.base.interactor.QSTileInput import com.android.systemui.qs.tiles.base.interactor.QSTileUserActionInteractor import com.android.systemui.qs.tiles.dialog.InternetDetailsViewModel import com.android.systemui.qs.tiles.dialog.InternetDialogManager import com.android.systemui.qs.tiles.dialog.WifiStateWorker import com.android.systemui.qs.tiles.impl.internet.domain.model.InternetTileModel import com.android.systemui.qs.tiles.viewmodel.QSTileUserAction import com.android.systemui.statusbar.connectivity.AccessPointController import kotlinx.coroutines.flow.SharingStarted import kotlinx.coroutines.flow.StateFlow import kotlinx.coroutines.flow.flatMapLatest import kotlinx.coroutines.flow.flowOn import kotlinx.coroutines.flow.stateIn import javax.inject.Inject import kotlin.coroutines.CoroutineContext import kotlinx.coroutines.withContext Loading Loading @@ -61,11 +69,18 @@ constructor( wifiStateWorker.isWifiEnabled = !wifiStateWorker.isWifiEnabled } is QSTileUserAction.LongClick -> { handleLongClick(action.expandable) } } } override val detailsViewModel: TileDetailsViewModel = InternetDetailsViewModel { handleLongClick(null) } private fun handleLongClick(expandable:Expandable?){ qsTileIntentUserActionHandler.handle( action.expandable, expandable, Intent(Settings.ACTION_WIFI_SETTINGS) ) } } } } Loading
packages/SystemUI/multivalentTests/src/com/android/systemui/qs/tiles/impl/internet/domain/interactor/InternetTileUserActionInteractorTest.kt +10 −0 Original line number Diff line number Diff line Loading @@ -33,6 +33,7 @@ import com.android.systemui.statusbar.connectivity.AccessPointController import com.android.systemui.util.mockito.mock import com.android.systemui.util.mockito.nullable import com.google.common.truth.Truth import com.google.common.truth.Truth.assertThat import kotlinx.coroutines.test.runTest import org.junit.Before import org.junit.Test Loading Loading @@ -136,4 +137,13 @@ class InternetTileUserActionInteractorTest : SysuiTestCase() { verify(wifiStateWorker, times(1)).isWifiEnabled = eq(true) } @Test fun detailsViewModel() = kosmos.testScope.runTest { assertThat(underTest.detailsViewModel.getTitle()) .isEqualTo("Internet") assertThat(underTest.detailsViewModel.getSubTitle()) .isEqualTo("Tab a network to connect") } }
packages/SystemUI/multivalentTests/src/com/android/systemui/qs/tiles/viewmodel/QSTileViewModelTest.kt +15 −0 Original line number Diff line number Diff line Loading @@ -173,6 +173,21 @@ class QSTileViewModelTest : SysuiTestCase() { .isEqualTo(FakeQSTileDataInteractor.AvailabilityRequest(USER)) } @Test fun tileDetails() = testScope.runTest { assertThat(tileUserActionInteractor.detailsViewModel).isNotNull() assertThat(tileUserActionInteractor.detailsViewModel?.getTitle()) .isEqualTo("FakeQSTileUserActionInteractor") assertThat(underTest.detailsViewModel).isNotNull() assertThat(underTest.detailsViewModel?.getTitle()) .isEqualTo("FakeQSTileUserActionInteractor") tileUserActionInteractor.detailsViewModel = null assertThat(tileUserActionInteractor.detailsViewModel).isNull() assertThat(underTest.detailsViewModel).isNull() } private fun createViewModel( scope: TestScope, config: QSTileConfig = tileConfig, Loading
packages/SystemUI/src/com/android/systemui/qs/tiles/base/interactor/QSTileUserActionInteractor.kt +14 −0 Original line number Diff line number Diff line Loading @@ -17,6 +17,7 @@ package com.android.systemui.qs.tiles.base.interactor import android.annotation.WorkerThread import com.android.systemui.plugins.qs.TileDetailsViewModel interface QSTileUserActionInteractor<DATA_TYPE> { /** Loading @@ -27,4 +28,17 @@ interface QSTileUserActionInteractor<DATA_TYPE> { * It's safe to run long running computations inside this function. */ @WorkerThread suspend fun handleInput(input: QSTileInput<DATA_TYPE>) /** * Provides the [TileDetailsViewModel] for constructing the corresponding details view. * * This property is defined here to reuse the business logic. For example, reusing the user * long-click as the go-to-settings callback in the details view. * Subclasses can override this property to provide a specific [TileDetailsViewModel] * implementation. * * @return The [TileDetailsViewModel] instance, or null if not implemented. */ val detailsViewModel: TileDetailsViewModel? get() = null }
packages/SystemUI/src/com/android/systemui/qs/tiles/base/viewmodel/QSTileViewModelImpl.kt +4 −0 Original line number Diff line number Diff line Loading @@ -20,6 +20,7 @@ import android.os.UserHandle import com.android.app.tracing.coroutines.launchTraced as launch import com.android.systemui.Dumpable import com.android.systemui.plugins.FalsingManager import com.android.systemui.plugins.qs.TileDetailsViewModel import com.android.systemui.qs.tiles.base.analytics.QSTileAnalytics import com.android.systemui.qs.tiles.base.interactor.DataUpdateTrigger import com.android.systemui.qs.tiles.base.interactor.DisabledByPolicyInteractor Loading Loading @@ -115,6 +116,9 @@ class QSTileViewModelImpl<DATA_TYPE>( .flowOn(backgroundDispatcher) .stateIn(tileScope, SharingStarted.WhileSubscribed(), true) override val detailsViewModel: TileDetailsViewModel? get() = userActionInteractor().detailsViewModel override fun forceUpdate() { tileScope.launch(context = backgroundDispatcher) { forceUpdates.emit(Unit) } } Loading
packages/SystemUI/src/com/android/systemui/qs/tiles/impl/internet/domain/interactor/InternetTileUserActionInteractor.kt +19 −4 Original line number Diff line number Diff line Loading @@ -18,15 +18,23 @@ package com.android.systemui.qs.tiles.impl.internet.domain.interactor import android.content.Intent import android.provider.Settings import com.android.systemui.animation.Expandable import com.android.systemui.dagger.qualifiers.Main import com.android.systemui.plugins.qs.TileDetailsViewModel import com.android.systemui.qs.tiles.base.actions.QSTileIntentUserInputHandler import com.android.systemui.qs.tiles.base.interactor.QSTileInput import com.android.systemui.qs.tiles.base.interactor.QSTileUserActionInteractor import com.android.systemui.qs.tiles.dialog.InternetDetailsViewModel import com.android.systemui.qs.tiles.dialog.InternetDialogManager import com.android.systemui.qs.tiles.dialog.WifiStateWorker import com.android.systemui.qs.tiles.impl.internet.domain.model.InternetTileModel import com.android.systemui.qs.tiles.viewmodel.QSTileUserAction import com.android.systemui.statusbar.connectivity.AccessPointController import kotlinx.coroutines.flow.SharingStarted import kotlinx.coroutines.flow.StateFlow import kotlinx.coroutines.flow.flatMapLatest import kotlinx.coroutines.flow.flowOn import kotlinx.coroutines.flow.stateIn import javax.inject.Inject import kotlin.coroutines.CoroutineContext import kotlinx.coroutines.withContext Loading Loading @@ -61,11 +69,18 @@ constructor( wifiStateWorker.isWifiEnabled = !wifiStateWorker.isWifiEnabled } is QSTileUserAction.LongClick -> { handleLongClick(action.expandable) } } } override val detailsViewModel: TileDetailsViewModel = InternetDetailsViewModel { handleLongClick(null) } private fun handleLongClick(expandable:Expandable?){ qsTileIntentUserActionHandler.handle( action.expandable, expandable, Intent(Settings.ACTION_WIFI_SETTINGS) ) } } } }