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

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

Merge changes from topics "caitlinshk-wifi-screenshot-coloring",...

Merge changes from topics "caitlinshk-wifi-screenshot-coloring", "caitlinshk-wifi-screenshot-shared", "caitlinshk-wifi-screenshot-wifi" into tm-qpr-dev am: 2e6bfea1

Original change: https://googleplex-android-review.googlesource.com/c/platform/frameworks/base/+/20814419



Change-Id: I21ffa7e7e87619df369bc7a6f5be994c6ecd3b6a
Signed-off-by: default avatarAutomerger Merge Worker <android-build-automerger-merge-worker@system.gserviceaccount.com>
parents ead0f1a1 2e6bfea1
Loading
Loading
Loading
Loading
+2 −2
Original line number Diff line number Diff line
@@ -49,9 +49,9 @@ class StatusBarPipelineFlags @Inject constructor(private val featureFlags: Featu
        featureFlags.isEnabled(Flags.NEW_STATUS_BAR_WIFI_ICON_BACKEND) || useNewWifiIcon()

    /**
     * Returns true if we should apply some coloring to the wifi icon that was rendered with the new
     * Returns true if we should apply some coloring to the icons that were rendered with the new
     * pipeline to help with debugging.
     */
    fun useWifiDebugColoring(): Boolean =
    fun useDebugColoring(): Boolean =
        featureFlags.isEnabled(Flags.NEW_STATUS_BAR_ICONS_DEBUG_COLORING)
}
+65 −2
Original line number Diff line number Diff line
@@ -19,6 +19,7 @@ package com.android.systemui.statusbar.pipeline.mobile.ui.binder
import android.content.res.ColorStateList
import android.view.View
import android.view.View.GONE
import android.view.View.INVISIBLE
import android.view.View.VISIBLE
import android.view.ViewGroup
import android.widget.ImageView
@@ -30,7 +31,13 @@ import com.android.settingslib.graph.SignalDrawable
import com.android.systemui.R
import com.android.systemui.common.ui.binder.IconViewBinder
import com.android.systemui.lifecycle.repeatWhenAttached
import com.android.systemui.statusbar.StatusBarIconView
import com.android.systemui.statusbar.StatusBarIconView.STATE_DOT
import com.android.systemui.statusbar.StatusBarIconView.STATE_HIDDEN
import com.android.systemui.statusbar.StatusBarIconView.STATE_ICON
import com.android.systemui.statusbar.pipeline.mobile.ui.viewmodel.LocationBasedMobileViewModel
import com.android.systemui.statusbar.pipeline.shared.ui.binder.ModernStatusBarViewBinding
import kotlinx.coroutines.flow.MutableStateFlow
import kotlinx.coroutines.flow.distinctUntilChanged
import kotlinx.coroutines.launch

@@ -40,7 +47,8 @@ object MobileIconBinder {
    fun bind(
        view: ViewGroup,
        viewModel: LocationBasedMobileViewModel,
    ) {
    ): ModernStatusBarViewBinding {
        val mobileGroupView = view.requireViewById<ViewGroup>(R.id.mobile_group)
        val activityContainer = view.requireViewById<View>(R.id.inout_container)
        val activityIn = view.requireViewById<ImageView>(R.id.mobile_in)
        val activityOut = view.requireViewById<ImageView>(R.id.mobile_out)
@@ -49,12 +57,39 @@ object MobileIconBinder {
        val mobileDrawable = SignalDrawable(view.context).also { iconView.setImageDrawable(it) }
        val roamingView = view.requireViewById<ImageView>(R.id.mobile_roaming)
        val roamingSpace = view.requireViewById<Space>(R.id.mobile_roaming_space)
        val dotView = view.requireViewById<StatusBarIconView>(R.id.status_bar_dot)

        view.isVisible = true
        iconView.isVisible = true

        // TODO(b/238425913): We should log this visibility state.
        @StatusBarIconView.VisibleState
        val visibilityState: MutableStateFlow<Int> = MutableStateFlow(STATE_HIDDEN)

        val iconTint: MutableStateFlow<Int> = MutableStateFlow(viewModel.defaultColor)
        val decorTint: MutableStateFlow<Int> = MutableStateFlow(viewModel.defaultColor)

        view.repeatWhenAttached {
            repeatOnLifecycle(Lifecycle.State.STARTED) {
                launch {
                    visibilityState.collect { state ->
                        when (state) {
                            STATE_ICON -> {
                                mobileGroupView.visibility = VISIBLE
                                dotView.visibility = GONE
                            }
                            STATE_DOT -> {
                                mobileGroupView.visibility = INVISIBLE
                                dotView.visibility = VISIBLE
                            }
                            STATE_HIDDEN -> {
                                mobileGroupView.visibility = INVISIBLE
                                dotView.visibility = INVISIBLE
                            }
                        }
                    }
                }

                // Set the icon for the triangle
                launch {
                    viewModel.iconId.distinctUntilChanged().collect { iconId ->
@@ -89,15 +124,43 @@ object MobileIconBinder {

                // Set the tint
                launch {
                    viewModel.tint.collect { tint ->
                    iconTint.collect { tint ->
                        val tintList = ColorStateList.valueOf(tint)
                        iconView.imageTintList = tintList
                        networkTypeView.imageTintList = tintList
                        roamingView.imageTintList = tintList
                        activityIn.imageTintList = tintList
                        activityOut.imageTintList = tintList
                        dotView.setDecorColor(tint)
                    }
                }

                launch { decorTint.collect { tint -> dotView.setDecorColor(tint) } }
            }
        }

        return object : ModernStatusBarViewBinding {
            override fun getShouldIconBeVisible(): Boolean {
                // If this view model exists, then the icon should be visible.
                return true
            }

            override fun onVisibilityStateChanged(@StatusBarIconView.VisibleState state: Int) {
                visibilityState.value = state
            }

            override fun onIconTintChanged(newTint: Int) {
                if (viewModel.useDebugColoring) {
                    return
                }
                iconTint.value = newTint
            }

            override fun onDecorTintChanged(newTint: Int) {
                if (viewModel.useDebugColoring) {
                    return
                }
                decorTint.value = newTint
            }
        }
    }
+3 −34
Original line number Diff line number Diff line
@@ -17,50 +17,20 @@
package com.android.systemui.statusbar.pipeline.mobile.ui.view

import android.content.Context
import android.graphics.Rect
import android.util.AttributeSet
import android.view.LayoutInflater
import com.android.systemui.R
import com.android.systemui.statusbar.BaseStatusBarFrameLayout
import com.android.systemui.statusbar.StatusBarIconView.STATE_ICON
import com.android.systemui.statusbar.pipeline.mobile.ui.binder.MobileIconBinder
import com.android.systemui.statusbar.pipeline.mobile.ui.viewmodel.LocationBasedMobileViewModel
import java.util.ArrayList
import com.android.systemui.statusbar.pipeline.shared.ui.view.ModernStatusBarView

class ModernStatusBarMobileView(
    context: Context,
    attrs: AttributeSet?,
) : BaseStatusBarFrameLayout(context, attrs) {
) : ModernStatusBarView(context, attrs) {

    var subId: Int = -1

    private lateinit var slot: String
    override fun getSlot() = slot

    override fun onDarkChanged(areas: ArrayList<Rect>?, darkIntensity: Float, tint: Int) {
        // TODO
    }

    override fun setStaticDrawableColor(color: Int) {
        // TODO
    }

    override fun setDecorColor(color: Int) {
        // TODO
    }

    override fun setVisibleState(state: Int, animate: Boolean) {
        // TODO
    }

    override fun getVisibleState(): Int {
        return STATE_ICON
    }

    override fun isIconVisible(): Boolean {
        return true
    }

    companion object {

        /**
@@ -77,9 +47,8 @@ class ModernStatusBarMobileView(
                    .inflate(R.layout.status_bar_mobile_signal_group_new, null)
                    as ModernStatusBarMobileView)
                .also {
                    it.slot = slot
                    it.subId = viewModel.subscriptionId
                    MobileIconBinder.bind(it, viewModel)
                    it.initView(slot) { MobileIconBinder.bind(it, viewModel) }
                }
        }
    }
+29 −32
Original line number Diff line number Diff line
@@ -18,11 +18,7 @@ package com.android.systemui.statusbar.pipeline.mobile.ui.viewmodel

import android.graphics.Color
import com.android.systemui.statusbar.phone.StatusBarLocation
import com.android.systemui.statusbar.pipeline.shared.ConnectivityPipelineLogger
import com.android.systemui.statusbar.pipeline.shared.ConnectivityPipelineLogger.Companion.logOutputChange
import kotlinx.coroutines.flow.Flow
import kotlinx.coroutines.flow.distinctUntilChanged
import kotlinx.coroutines.flow.flowOf
import com.android.systemui.statusbar.pipeline.StatusBarPipelineFlags

/**
 * A view model for an individual mobile icon that embeds the notion of a [StatusBarLocation]. This
@@ -33,50 +29,51 @@ import kotlinx.coroutines.flow.flowOf
 */
abstract class LocationBasedMobileViewModel(
    val commonImpl: MobileIconViewModelCommon,
    val logger: ConnectivityPipelineLogger,
    statusBarPipelineFlags: StatusBarPipelineFlags,
    debugTint: Int,
) : MobileIconViewModelCommon by commonImpl {
    abstract val tint: Flow<Int>
    val useDebugColoring: Boolean = statusBarPipelineFlags.useDebugColoring()

    val defaultColor: Int =
        if (useDebugColoring) {
            debugTint
        } else {
            Color.WHITE
        }

    companion object {
        fun viewModelForLocation(
            commonImpl: MobileIconViewModelCommon,
            logger: ConnectivityPipelineLogger,
            statusBarPipelineFlags: StatusBarPipelineFlags,
            loc: StatusBarLocation,
        ): LocationBasedMobileViewModel =
            when (loc) {
                StatusBarLocation.HOME -> HomeMobileIconViewModel(commonImpl, logger)
                StatusBarLocation.KEYGUARD -> KeyguardMobileIconViewModel(commonImpl, logger)
                StatusBarLocation.QS -> QsMobileIconViewModel(commonImpl, logger)
                StatusBarLocation.HOME ->
                    HomeMobileIconViewModel(commonImpl, statusBarPipelineFlags)
                StatusBarLocation.KEYGUARD ->
                    KeyguardMobileIconViewModel(commonImpl, statusBarPipelineFlags)
                StatusBarLocation.QS -> QsMobileIconViewModel(commonImpl, statusBarPipelineFlags)
            }
    }
}

class HomeMobileIconViewModel(
    commonImpl: MobileIconViewModelCommon,
    logger: ConnectivityPipelineLogger,
) : MobileIconViewModelCommon, LocationBasedMobileViewModel(commonImpl, logger) {
    override val tint: Flow<Int> =
        flowOf(Color.CYAN)
            .distinctUntilChanged()
            .logOutputChange(logger, "HOME tint(${commonImpl.subscriptionId})")
}
    statusBarPipelineFlags: StatusBarPipelineFlags,
) :
    MobileIconViewModelCommon,
    LocationBasedMobileViewModel(commonImpl, statusBarPipelineFlags, debugTint = Color.CYAN)

class QsMobileIconViewModel(
    commonImpl: MobileIconViewModelCommon,
    logger: ConnectivityPipelineLogger,
) : MobileIconViewModelCommon, LocationBasedMobileViewModel(commonImpl, logger) {
    override val tint: Flow<Int> =
        flowOf(Color.GREEN)
            .distinctUntilChanged()
            .logOutputChange(logger, "QS tint(${commonImpl.subscriptionId})")
}
    statusBarPipelineFlags: StatusBarPipelineFlags,
) :
    MobileIconViewModelCommon,
    LocationBasedMobileViewModel(commonImpl, statusBarPipelineFlags, debugTint = Color.GREEN)

class KeyguardMobileIconViewModel(
    commonImpl: MobileIconViewModelCommon,
    logger: ConnectivityPipelineLogger,
) : MobileIconViewModelCommon, LocationBasedMobileViewModel(commonImpl, logger) {
    override val tint: Flow<Int> =
        flowOf(Color.MAGENTA)
            .distinctUntilChanged()
            .logOutputChange(logger, "KEYGUARD tint(${commonImpl.subscriptionId})")
}
    statusBarPipelineFlags: StatusBarPipelineFlags,
) :
    MobileIconViewModelCommon,
    LocationBasedMobileViewModel(commonImpl, statusBarPipelineFlags, debugTint = Color.MAGENTA)
+9 −1
Original line number Diff line number Diff line
@@ -19,6 +19,7 @@ package com.android.systemui.statusbar.pipeline.mobile.ui.viewmodel
import androidx.annotation.VisibleForTesting
import com.android.systemui.dagger.qualifiers.Application
import com.android.systemui.statusbar.phone.StatusBarLocation
import com.android.systemui.statusbar.pipeline.StatusBarPipelineFlags
import com.android.systemui.statusbar.pipeline.mobile.domain.interactor.MobileIconsInteractor
import com.android.systemui.statusbar.pipeline.mobile.ui.view.ModernStatusBarMobileView
import com.android.systemui.statusbar.pipeline.shared.ConnectivityConstants
@@ -41,6 +42,7 @@ constructor(
    private val logger: ConnectivityPipelineLogger,
    private val constants: ConnectivityConstants,
    @Application private val scope: CoroutineScope,
    private val statusBarPipelineFlags: StatusBarPipelineFlags,
) {
    @VisibleForTesting val mobileIconSubIdCache = mutableMapOf<Int, MobileIconViewModel>()

@@ -60,7 +62,11 @@ constructor(
                    )
                    .also { mobileIconSubIdCache[subId] = it }

        return LocationBasedMobileViewModel.viewModelForLocation(common, logger, location)
        return LocationBasedMobileViewModel.viewModelForLocation(
            common,
            statusBarPipelineFlags,
            location,
        )
    }

    private fun removeInvalidModelsFromCache(subIds: List<Int>) {
@@ -75,6 +81,7 @@ constructor(
        private val logger: ConnectivityPipelineLogger,
        private val constants: ConnectivityConstants,
        @Application private val scope: CoroutineScope,
        private val statusBarPipelineFlags: StatusBarPipelineFlags,
    ) {
        fun create(subscriptionIdsFlow: StateFlow<List<Int>>): MobileIconsViewModel {
            return MobileIconsViewModel(
@@ -83,6 +90,7 @@ constructor(
                logger,
                constants,
                scope,
                statusBarPipelineFlags,
            )
        }
    }
Loading