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

Commit a0fbaa5c authored by Caitlin Shkuratov's avatar Caitlin Shkuratov Committed by Automerger Merge Worker
Browse files

Merge "[SB Refactor] Migrate the wifi location-based VMs to use `by`." into udc-dev am: f4253161

parents 1834b187 f4253161
Loading
Loading
Loading
Loading
+2 −5
Original line number Diff line number Diff line
@@ -26,6 +26,7 @@ import com.android.systemui.statusbar.phone.StatusBarLocation
import com.android.systemui.statusbar.pipeline.StatusBarPipelineFlags
import com.android.systemui.statusbar.pipeline.wifi.ui.model.WifiIcon
import com.android.systemui.statusbar.pipeline.wifi.ui.viewmodel.LocationBasedWifiViewModel
import com.android.systemui.statusbar.pipeline.wifi.ui.viewmodel.LocationBasedWifiViewModel.Companion.viewModelForLocation
import com.android.systemui.statusbar.pipeline.wifi.ui.viewmodel.WifiViewModel
import javax.inject.Inject
import kotlinx.coroutines.flow.collect
@@ -60,11 +61,7 @@ constructor(
        location: StatusBarLocation,
    ): LocationBasedWifiViewModel {
        val locationViewModel =
            when (location) {
                StatusBarLocation.HOME -> wifiViewModel.home
                StatusBarLocation.KEYGUARD -> wifiViewModel.keyguard
                StatusBarLocation.QS -> wifiViewModel.qs
            }
            viewModelForLocation(wifiViewModel, statusBarPipelineFlags, location)

        statusBarIconGroup.repeatWhenAttached {
            repeatOnLifecycle(Lifecycle.State.STARTED) {
+0 −45
Original line number Diff line number Diff line
/*
 * Copyright (C) 2022 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.statusbar.pipeline.wifi.ui.viewmodel

import android.graphics.Color
import com.android.systemui.statusbar.pipeline.StatusBarPipelineFlags
import com.android.systemui.statusbar.pipeline.wifi.ui.model.WifiIcon
import kotlinx.coroutines.flow.Flow
import kotlinx.coroutines.flow.StateFlow

/**
 * A view model for the wifi icon shown on the "home" page (aka, when the device is unlocked and not
 * showing the shade, so the user is on the home-screen, or in an app).
 */
class HomeWifiViewModel(
    statusBarPipelineFlags: StatusBarPipelineFlags,
    wifiIcon: StateFlow<WifiIcon>,
    isActivityInViewVisible: Flow<Boolean>,
    isActivityOutViewVisible: Flow<Boolean>,
    isActivityContainerVisible: Flow<Boolean>,
    isAirplaneSpacerVisible: Flow<Boolean>,
) :
    LocationBasedWifiViewModel(
        statusBarPipelineFlags,
        debugTint = Color.CYAN,
        wifiIcon,
        isActivityInViewVisible,
        isActivityOutViewVisible,
        isActivityContainerVisible,
        isAirplaneSpacerVisible,
    )
+47 −19
Original line number Diff line number Diff line
@@ -17,10 +17,8 @@
package com.android.systemui.statusbar.pipeline.wifi.ui.viewmodel

import android.graphics.Color
import com.android.systemui.statusbar.phone.StatusBarLocation
import com.android.systemui.statusbar.pipeline.StatusBarPipelineFlags
import com.android.systemui.statusbar.pipeline.wifi.ui.model.WifiIcon
import kotlinx.coroutines.flow.Flow
import kotlinx.coroutines.flow.StateFlow

/**
 * A view model for a wifi icon in a specific location. This allows us to control parameters that
@@ -29,24 +27,10 @@ import kotlinx.coroutines.flow.StateFlow
 * Must be subclassed for each distinct location.
 */
abstract class LocationBasedWifiViewModel(
    val commonImpl: WifiViewModelCommon,
    statusBarPipelineFlags: StatusBarPipelineFlags,
    debugTint: Int,

    /** The wifi icon that should be displayed. */
    val wifiIcon: StateFlow<WifiIcon>,

    /** True if the activity in view should be visible. */
    val isActivityInViewVisible: Flow<Boolean>,

    /** True if the activity out view should be visible. */
    val isActivityOutViewVisible: Flow<Boolean>,

    /** True if the activity container view should be visible. */
    val isActivityContainerVisible: Flow<Boolean>,

    /** True if the airplane spacer view should be visible. */
    val isAirplaneSpacerVisible: Flow<Boolean>,
) {
) : WifiViewModelCommon by commonImpl {
    val useDebugColoring: Boolean = statusBarPipelineFlags.useDebugColoring()

    val defaultColor: Int =
@@ -55,4 +39,48 @@ abstract class LocationBasedWifiViewModel(
        } else {
            Color.WHITE
        }

    companion object {
        /**
         * Returns a new instance of [LocationBasedWifiViewModel] that's specific to the given
         * [location].
         */
        fun viewModelForLocation(
            commonImpl: WifiViewModelCommon,
            flags: StatusBarPipelineFlags,
            location: StatusBarLocation,
        ): LocationBasedWifiViewModel =
            when (location) {
                StatusBarLocation.HOME -> HomeWifiViewModel(commonImpl, flags)
                StatusBarLocation.KEYGUARD -> KeyguardWifiViewModel(commonImpl, flags)
                StatusBarLocation.QS -> QsWifiViewModel(commonImpl, flags)
            }
    }
}

/**
 * A view model for the wifi icon shown on the "home" page (aka, when the device is unlocked and not
 * showing the shade, so the user is on the home-screen, or in an app).
 */
class HomeWifiViewModel(
    commonImpl: WifiViewModelCommon,
    statusBarPipelineFlags: StatusBarPipelineFlags,
) :
    WifiViewModelCommon,
    LocationBasedWifiViewModel(commonImpl, statusBarPipelineFlags, debugTint = Color.CYAN)

/** A view model for the wifi icon shown on keyguard (lockscreen). */
class KeyguardWifiViewModel(
    commonImpl: WifiViewModelCommon,
    statusBarPipelineFlags: StatusBarPipelineFlags,
) :
    WifiViewModelCommon,
    LocationBasedWifiViewModel(commonImpl, statusBarPipelineFlags, debugTint = Color.MAGENTA)

/** A view model for the wifi icon shown in quick settings (when the shade is pulled down). */
class QsWifiViewModel(
    commonImpl: WifiViewModelCommon,
    statusBarPipelineFlags: StatusBarPipelineFlags,
) :
    WifiViewModelCommon,
    LocationBasedWifiViewModel(commonImpl, statusBarPipelineFlags, debugTint = Color.GREEN)
+0 −42
Original line number Diff line number Diff line
/*
 * Copyright (C) 2022 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.statusbar.pipeline.wifi.ui.viewmodel

import android.graphics.Color
import com.android.systemui.statusbar.pipeline.StatusBarPipelineFlags
import com.android.systemui.statusbar.pipeline.wifi.ui.model.WifiIcon
import kotlinx.coroutines.flow.Flow
import kotlinx.coroutines.flow.StateFlow

/** A view model for the wifi icon shown in quick settings (when the shade is pulled down). */
class QsWifiViewModel(
    statusBarPipelineFlags: StatusBarPipelineFlags,
    wifiIcon: StateFlow<WifiIcon>,
    isActivityInViewVisible: Flow<Boolean>,
    isActivityOutViewVisible: Flow<Boolean>,
    isActivityContainerVisible: Flow<Boolean>,
    isAirplaneSpacerVisible: Flow<Boolean>,
) :
    LocationBasedWifiViewModel(
        statusBarPipelineFlags,
        debugTint = Color.GREEN,
        wifiIcon,
        isActivityInViewVisible,
        isActivityOutViewVisible,
        isActivityContainerVisible,
        isAirplaneSpacerVisible,
    )
+6 −40
Original line number Diff line number Diff line
@@ -72,7 +72,7 @@ constructor(
    @Application private val scope: CoroutineScope,
    statusBarPipelineFlags: StatusBarPipelineFlags,
    wifiConstants: WifiConstants,
) {
) : WifiViewModelCommon {
    /** Returns the icon to use based on the given network. */
    private fun WifiNetworkModel.icon(): WifiIcon {
        return when (this) {
@@ -106,8 +106,7 @@ constructor(
        }
    }

    /** The wifi icon that should be displayed. */
    private val wifiIcon: StateFlow<WifiIcon> =
    override val wifiIcon: StateFlow<WifiIcon> =
        combine(
                interactor.isEnabled,
                interactor.isDefault,
@@ -162,17 +161,17 @@ constructor(
            .stateIn(scope, started = SharingStarted.WhileSubscribed(), initialValue = default)
    }

    private val isActivityInViewVisible: Flow<Boolean> =
    override val isActivityInViewVisible: Flow<Boolean> =
        activity
            .map { it.hasActivityIn }
            .stateIn(scope, started = SharingStarted.WhileSubscribed(), initialValue = false)

    private val isActivityOutViewVisible: Flow<Boolean> =
    override val isActivityOutViewVisible: Flow<Boolean> =
        activity
            .map { it.hasActivityOut }
            .stateIn(scope, started = SharingStarted.WhileSubscribed(), initialValue = false)

    private val isActivityContainerVisible: Flow<Boolean> =
    override val isActivityContainerVisible: Flow<Boolean> =
        combine(isActivityInViewVisible, isActivityOutViewVisible) { activityIn, activityOut ->
                activityIn || activityOut
            }
@@ -181,42 +180,9 @@ constructor(
    // TODO(b/238425913): It isn't ideal for the wifi icon to need to know about whether the
    //  airplane icon is visible. Instead, we should have a parent StatusBarSystemIconsViewModel
    //  that appropriately knows about both icons and sets the padding appropriately.
    private val isAirplaneSpacerVisible: Flow<Boolean> =
    override val isAirplaneSpacerVisible: Flow<Boolean> =
        airplaneModeViewModel.isAirplaneModeIconVisible

    /** A view model for the status bar on the home screen. */
    val home: HomeWifiViewModel =
        HomeWifiViewModel(
            statusBarPipelineFlags,
            wifiIcon,
            isActivityInViewVisible,
            isActivityOutViewVisible,
            isActivityContainerVisible,
            isAirplaneSpacerVisible,
        )

    /** A view model for the status bar on keyguard. */
    val keyguard: KeyguardWifiViewModel =
        KeyguardWifiViewModel(
            statusBarPipelineFlags,
            wifiIcon,
            isActivityInViewVisible,
            isActivityOutViewVisible,
            isActivityContainerVisible,
            isAirplaneSpacerVisible,
        )

    /** A view model for the status bar in quick settings. */
    val qs: QsWifiViewModel =
        QsWifiViewModel(
            statusBarPipelineFlags,
            wifiIcon,
            isActivityInViewVisible,
            isActivityOutViewVisible,
            isActivityContainerVisible,
            isAirplaneSpacerVisible,
        )

    companion object {
        @StringRes
        @VisibleForTesting
Loading