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

Commit dc28da2e authored by Evan Laird's avatar Evan Laird Committed by Android (Google) Code Review
Browse files

Merge changes Ifc971566,I5b82100f into main

* changes:
  UI improvement of network activity indicator on status bar
  [Status bar] Define status_bar_static_inout_indicators
parents 72d3772c ffa9706b
Loading
Loading
Loading
Loading
+9 −0
Original line number Diff line number Diff line
@@ -239,3 +239,12 @@ flag {
   description: "Enable special visual and haptic effects for quick settings tiles with long-press actions"
   bug: "229856884"
}

flag {
    name: "status_bar_static_inout_indicators"
    namespace: "systemui"
    description: "(Upstream request) Always show the network activity inout indicators and "
        "prefer using alpha to distinguish network activity."
    bug: "310715220"
}
+61 −2
Original line number Diff line number Diff line
@@ -16,9 +16,11 @@

package com.android.systemui.statusbar.pipeline.wifi.ui.viewmodel

import android.platform.test.flag.junit.SetFlagsRule
import androidx.test.ext.junit.runners.AndroidJUnit4
import androidx.test.filters.SmallTest
import com.android.settingslib.AccessibilityContentDescriptions.WIFI_OTHER_DEVICE_CONNECTION
import com.android.systemui.Flags.FLAG_STATUS_BAR_STATIC_INOUT_INDICATORS
import com.android.systemui.SysuiTestCase
import com.android.systemui.common.shared.model.ContentDescription.Companion.loadContentDescription
import com.android.systemui.coroutines.collectLastValue
@@ -58,6 +60,8 @@ class WifiViewModelTest : SysuiTestCase() {

    private lateinit var underTest: WifiViewModel

    private val setFlagsRule = SetFlagsRule()

    @Mock private lateinit var tableLogBuffer: TableLogBuffer
    @Mock private lateinit var connectivityConstants: ConnectivityConstants
    @Mock private lateinit var wifiConstants: WifiConstants
@@ -183,8 +187,11 @@ class WifiViewModelTest : SysuiTestCase() {
        }

    @Test
    fun activity_nullSsid_outputsFalse() =
    fun activity_nullSsid_outputsFalse_staticFlagOff() =
        testScope.runTest {
            // GIVEN flag is disabled
            setFlagsRule.disableFlags(FLAG_STATUS_BAR_STATIC_INOUT_INDICATORS)

            whenever(connectivityConstants.shouldShowActivityConfig).thenReturn(true)
            createAndSetViewModel()

@@ -206,6 +213,35 @@ class WifiViewModelTest : SysuiTestCase() {
            assertThat(activityContainer).isFalse()
        }

    @Test
    fun activity_nullSsid_outputsFalse_staticFlagOn() =
        testScope.runTest {
            // GIVEN flag is enabled
            setFlagsRule.enableFlags(FLAG_STATUS_BAR_STATIC_INOUT_INDICATORS)

            whenever(connectivityConstants.shouldShowActivityConfig).thenReturn(true)
            createAndSetViewModel()

            wifiRepository.setWifiNetwork(
                WifiNetworkModel.Active(NETWORK_ID, ssid = null, level = 1)
            )

            val activityIn by collectLastValue(underTest.isActivityInViewVisible)
            val activityOut by collectLastValue(underTest.isActivityOutViewVisible)
            val activityContainer by collectLastValue(underTest.isActivityContainerVisible)

            // WHEN we update the repo to have activity
            val activity = DataActivityModel(hasActivityIn = true, hasActivityOut = true)
            wifiRepository.setWifiActivity(activity)

            // THEN we still output false because our network's SSID is null
            assertThat(activityIn).isFalse()
            assertThat(activityOut).isFalse()

            // THEN the inout indicators are sill showing due to the config being true
            assertThat(activityContainer).isTrue()
        }

    @Test
    fun activity_allLocationViewModelsReceiveSameData() =
        testScope.runTest {
@@ -335,8 +371,11 @@ class WifiViewModelTest : SysuiTestCase() {
        }

    @Test
    fun activityContainer_inAndOutFalse_outputsFalse() =
    fun activityContainer_inAndOutFalse_outputsTrue_staticFlagOff() =
        testScope.runTest {
            // GIVEN the flag is off
            setFlagsRule.disableFlags(FLAG_STATUS_BAR_STATIC_INOUT_INDICATORS)

            whenever(connectivityConstants.shouldShowActivityConfig).thenReturn(true)
            createAndSetViewModel()
            wifiRepository.setWifiNetwork(ACTIVE_VALID_WIFI_NETWORK)
@@ -349,6 +388,26 @@ class WifiViewModelTest : SysuiTestCase() {
            assertThat(latest).isFalse()
        }

    @Test
    fun activityContainer_inAndOutFalse_outputsTrue_staticFlagOn() =
        testScope.runTest {
            // GIVEN the flag is on
            setFlagsRule.enableFlags(FLAG_STATUS_BAR_STATIC_INOUT_INDICATORS)

            whenever(connectivityConstants.shouldShowActivityConfig).thenReturn(true)
            createAndSetViewModel()
            wifiRepository.setWifiNetwork(ACTIVE_VALID_WIFI_NETWORK)

            val latest by collectLastValue(underTest.isActivityContainerVisible)

            val activity = DataActivityModel(hasActivityIn = false, hasActivityOut = false)
            wifiRepository.setWifiActivity(activity)

            // The activity container should always be visible, since activity is
            // shown in UI by changing opacity of the indicators.
            assertThat(latest).isTrue()
        }

    @Test
    fun airplaneSpacer_notAirplaneMode_outputsFalse() =
        testScope.runTest {
+0 −2
Original line number Diff line number Diff line
@@ -39,7 +39,6 @@
                android:adjustViewBounds="true"
                android:layout_width="wrap_content"
                android:src="@drawable/ic_activity_down"
                android:visibility="gone"
                android:paddingEnd="2dp"
                />
            <ImageView
@@ -49,7 +48,6 @@
                android:layout_width="wrap_content"
                android:src="@drawable/ic_activity_up"
                android:paddingEnd="2dp"
                android:visibility="gone"
                />
        </FrameLayout>
        <FrameLayout
+0 −2
Original line number Diff line number Diff line
@@ -37,7 +37,6 @@
                android:adjustViewBounds="true"
                android:layout_width="wrap_content"
                android:src="@drawable/ic_activity_down"
                android:visibility="gone"
                android:paddingEnd="2dp"
            />
            <ImageView
@@ -47,7 +46,6 @@
                android:layout_width="wrap_content"
                android:src="@drawable/ic_activity_up"
                android:paddingEnd="2dp"
                android:visibility="gone"
            />
        </FrameLayout>
        <FrameLayout
+25 −3
Original line number Diff line number Diff line
@@ -30,6 +30,7 @@ import androidx.lifecycle.Lifecycle
import androidx.lifecycle.lifecycleScope
import androidx.lifecycle.repeatOnLifecycle
import com.android.settingslib.graph.SignalDrawable
import com.android.systemui.Flags.statusBarStaticInoutIndicators
import com.android.systemui.common.ui.binder.ContentDescriptionViewBinder
import com.android.systemui.common.ui.binder.IconViewBinder
import com.android.systemui.lifecycle.repeatWhenAttached
@@ -41,6 +42,8 @@ import com.android.systemui.statusbar.pipeline.mobile.ui.MobileViewLogger
import com.android.systemui.statusbar.pipeline.mobile.ui.viewmodel.LocationBasedMobileViewModel
import com.android.systemui.statusbar.pipeline.shared.ui.binder.ModernStatusBarViewBinding
import com.android.systemui.statusbar.pipeline.shared.ui.binder.ModernStatusBarViewVisibilityHelper
import com.android.systemui.statusbar.pipeline.shared.ui.binder.StatusBarViewBinderConstants.ALPHA_ACTIVE
import com.android.systemui.statusbar.pipeline.shared.ui.binder.StatusBarViewBinderConstants.ALPHA_INACTIVE
import kotlinx.coroutines.awaitCancellation
import kotlinx.coroutines.flow.MutableStateFlow
import kotlinx.coroutines.flow.distinctUntilChanged
@@ -190,10 +193,29 @@ object MobileIconBinder {
                        }
                    }

                    if (statusBarStaticInoutIndicators()) {
                        // Set the opacity of the activity indicators
                        launch {
                            viewModel.activityInVisible.collect { visible ->
                                activityIn.imageAlpha =
                                    (if (visible) ALPHA_ACTIVE else ALPHA_INACTIVE)
                            }
                        }

                        launch {
                            viewModel.activityOutVisible.collect { visible ->
                                activityOut.imageAlpha =
                                    (if (visible) ALPHA_ACTIVE else ALPHA_INACTIVE)
                            }
                        }
                    } else {
                        // Set the activity indicators
                        launch { viewModel.activityInVisible.collect { activityIn.isVisible = it } }

                    launch { viewModel.activityOutVisible.collect { activityOut.isVisible = it } }
                        launch {
                            viewModel.activityOutVisible.collect { activityOut.isVisible = it }
                        }
                    }

                    launch {
                        viewModel.activityContainerVisible.collect {
Loading