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

Commit ffa9706b authored by Henrik Baard's avatar Henrik Baard Committed by Evan Laird
Browse files

UI improvement of network activity indicator on status bar

The activity indicators which can be turned on by a configuration,
shouldShowActivityConfig will jup around in current implementation.

This change will instead use opacity to indicate activity, using
grey when no activity and white when active. This will lead to
the icons keeping the same position all the time.

Bug: 266797961
Test: adb shell settings put global sysui_demo_allowed 1
      adb shell am broadcast -a com.android.systemui.demo
        -e command enter
      adb shell am broadcast -a com.android.systemui.demo
        -e command network -e fully true -e wifi show
        -e ssid demoSsid -e level 3 -e activity in
      adb shell am broadcast -a com.android.systemui.demo
        -e command network -e fully true -e mobile show
        -e level 3 -e activity in
Flag: ACONFIG com.android.systemui.status_bar_static_inout_indicators DEVELOPMENT

Co-Author: Leif Martensson <leif.martensson@sony.com>
Change-Id: Ifc971566799ba22c0f98f86b4fbf3ff47360a3b1
parent 3f199376
Loading
Loading
Loading
Loading
+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 {
+6 −2
Original line number Diff line number Diff line
@@ -17,6 +17,7 @@
package com.android.systemui.statusbar.pipeline.mobile.ui.viewmodel

import com.android.settingslib.AccessibilityContentDescriptions.PHONE_SIGNAL_STRENGTH
import com.android.systemui.Flags.statusBarStaticInoutIndicators
import com.android.systemui.common.shared.model.ContentDescription
import com.android.systemui.common.shared.model.Icon
import com.android.systemui.flags.FeatureFlagsClassic
@@ -199,7 +200,10 @@ class MobileIconViewModel(
            .stateIn(scope, SharingStarted.WhileSubscribed(), false)

    override val activityContainerVisible: Flow<Boolean> =
        activity
            .map { it != null && (it.hasActivityIn || it.hasActivityOut) }
        if (statusBarStaticInoutIndicators()) {
                flowOf(constants.shouldShowActivityConfig)
            } else {
                activity.map { it != null && (it.hasActivityIn || it.hasActivityOut) }
            }
            .stateIn(scope, SharingStarted.WhileSubscribed(), false)
}
Loading