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

Commit 6928396a authored by Chris Göllner's avatar Chris Göllner Committed by Chris Göllner
Browse files

Fix mobile icon in shade header being too large on connected displays

There are two parts to this fix:
1. The shade moves between displays, and when it happens, a
   configuration shade is triggered.
   ModernStatusBarMobileView was not updating its dimensions after this
   configuration change.
2. ModernStatusBarMobileView was using a custom Context, with a mcc and
   mnc override. The way it was done, was with a ThemeContextWrapper and
   a Configuration override. The Configuration used for the override was
   based on the base Configuration + MMC and MNC.
   This was not working together with our display aware Context, which
   gets updated whenever the shade moves between displays. With this
   approach, it would always have the display metrics of the
   initial display, and not get updated.
   The solution here is to create an empty Configuration object for the
   override, and only set the MCC and MNC. This way only MCC and MNC are
   used for the override.

Bug: 412409667
Test: ModernStatusBarMobileViewTest
Test: MobileContextProviderTest
Test: Demo mode - Mobile data and MCC and MNC values set
Flag: com.android.systemui.fix_shade_header_wrong_icon_size
Change-Id: I4e92cc8fea62403bb1b0a8e469f1b2d634aa2c15
parent ba418f68
Loading
Loading
Loading
Loading
+11 −2
Original line number Diff line number Diff line
@@ -22,6 +22,7 @@ import android.os.Bundle
import android.telephony.SubscriptionInfo
import android.view.ContextThemeWrapper
import com.android.systemui.Dumpable
import com.android.systemui.Flags
import com.android.systemui.dagger.SysUISingleton
import com.android.systemui.demomode.DemoMode
import com.android.systemui.demomode.DemoMode.COMMAND_NETWORK
@@ -131,8 +132,16 @@ constructor(
         * system to properly load different carrier's iconography
         */
        private fun createCarrierConfigContext(context: Context, mcc: Int, mnc: Int): Context {
            val c =
                if (Flags.fixShadeHeaderWrongIconSize()) {
                    // Create an empty Configuration, and only set the fields that need to be
                    // overridden. This way all the other fields will have the values of the base
                    // context, even after other Configuration changes.
                    Configuration()
                } else {
                    // Copy the existing configuration
            val c = Configuration(context.resources.configuration)
                    Configuration(context.resources.configuration)
                }
            c.mcc = mcc
            c.mnc = mnc

+8 −0
Original line number Diff line number Diff line
@@ -17,11 +17,13 @@
package com.android.systemui.statusbar.pipeline.mobile.ui.view

import android.content.Context
import android.content.res.Configuration
import android.util.AttributeSet
import android.view.LayoutInflater
import android.widget.FrameLayout
import android.widget.ImageView
import com.android.keyguard.AlphaOptimizedLinearLayout
import com.android.systemui.Flags
import com.android.systemui.kairos.ExperimentalKairosApi
import com.android.systemui.kairos.KairosNetwork
import com.android.systemui.kairos.buildSpec
@@ -52,6 +54,12 @@ class ModernStatusBarMobileView(context: Context, attrs: AttributeSet?) :
            "viewString=${super.toString()}"
    }

    public override fun onConfigurationChanged(newConfig: Configuration?) {
        if (Flags.fixShadeHeaderWrongIconSize()) {
            configureLayoutForNewStatusBarIcons()
        }
    }

    /**
     * When [NewStatusBarIcons] is enabled, we have to tweak the layout. This can be moved directly
     * into the layout xml when the flag is rolled out fully
+133 −0
Original line number Diff line number Diff line
@@ -17,6 +17,9 @@
package com.android.systemui.statusbar.pipeline.mobile.ui.view

import android.content.res.ColorStateList
import android.content.res.Configuration
import android.platform.test.annotations.DisableFlags
import android.platform.test.annotations.EnableFlags
import android.testing.AndroidTestingRunner
import android.testing.TestableLooper
import android.testing.TestableLooper.RunWithLooper
@@ -24,11 +27,15 @@ import android.testing.ViewUtils
import android.view.View
import android.widget.FrameLayout
import android.widget.ImageView
import androidx.core.view.marginEnd
import androidx.core.view.marginStart
import androidx.test.filters.SmallTest
import com.android.systemui.Flags
import com.android.systemui.SysuiTestCase
import com.android.systemui.log.table.logcatTableLogBuffer
import com.android.systemui.res.R
import com.android.systemui.statusbar.StatusBarIconView
import com.android.systemui.statusbar.core.NewStatusBarIcons
import com.android.systemui.statusbar.pipeline.airplane.data.repository.FakeAirplaneModeRepository
import com.android.systemui.statusbar.pipeline.airplane.domain.interactor.AirplaneModeInteractor
import com.android.systemui.statusbar.pipeline.mobile.data.repository.fakeMobileConnectionsRepository
@@ -234,6 +241,132 @@ class ModernStatusBarMobileViewTest : SysuiTestCase() {
        ViewUtils.detachView(view)
    }

    @Test
    @EnableFlags(Flags.FLAG_FIX_SHADE_HEADER_WRONG_ICON_SIZE, NewStatusBarIcons.FLAG_NAME)
    fun onConfigurationChanged_flagOn_updatesTypeContainerHeight() {
        val view =
            ModernStatusBarMobileView.constructAndBind(context, viewLogger, SLOT_NAME, viewModel)
        val typeContainer = view.getNetTypeContainer()
        val initialHeight = typeContainer.layoutParams.height

        overrideResource(R.dimen.status_bar_mobile_container_height_updated, initialHeight + 10)
        view.onConfigurationChanged(Configuration())

        assertThat(typeContainer.layoutParams.height).isEqualTo(initialHeight + 10)
    }

    @Test
    @EnableFlags(NewStatusBarIcons.FLAG_NAME)
    @DisableFlags(Flags.FLAG_FIX_SHADE_HEADER_WRONG_ICON_SIZE)
    fun onConfigurationChanged_flagOff_doesNotUpdateTypeContainerHeight() {
        val view =
            ModernStatusBarMobileView.constructAndBind(context, viewLogger, SLOT_NAME, viewModel)
        val typeContainer = view.getNetTypeContainer()
        val initialHeight = typeContainer.layoutParams.height

        overrideResource(R.dimen.status_bar_mobile_container_height_updated, initialHeight + 10)
        view.onConfigurationChanged(Configuration())

        assertThat(typeContainer.layoutParams.height).isEqualTo(initialHeight)
    }

    @Test
    @EnableFlags(Flags.FLAG_FIX_SHADE_HEADER_WRONG_ICON_SIZE, NewStatusBarIcons.FLAG_NAME)
    fun onConfigurationChanged_flagOn_updatesTypeHeight() {
        val view =
            ModernStatusBarMobileView.constructAndBind(context, viewLogger, SLOT_NAME, viewModel)
        val type = view.getNetTypeView()
        val initialHeight = type.layoutParams.height

        overrideResource(R.dimen.status_bar_mobile_type_size_updated, initialHeight + 10)
        view.onConfigurationChanged(Configuration())

        assertThat(type.layoutParams.height).isEqualTo(initialHeight + 10)
    }

    @Test
    @EnableFlags(NewStatusBarIcons.FLAG_NAME)
    @DisableFlags(Flags.FLAG_FIX_SHADE_HEADER_WRONG_ICON_SIZE)
    fun onConfigurationChanged_flagOff_doesNotUpdateTypeHeight() {
        val view =
            ModernStatusBarMobileView.constructAndBind(context, viewLogger, SLOT_NAME, viewModel)
        val type = view.getNetTypeView()
        val initialHeight = type.layoutParams.height

        overrideResource(R.dimen.status_bar_mobile_type_size_updated, initialHeight + 10)
        view.onConfigurationChanged(Configuration())

        assertThat(type.layoutParams.height).isEqualTo(initialHeight)
    }

    @Test
    @EnableFlags(Flags.FLAG_FIX_SHADE_HEADER_WRONG_ICON_SIZE, NewStatusBarIcons.FLAG_NAME)
    fun onConfigurationChanged_flagOn_updatesGroupMargins() {
        val view =
            ModernStatusBarMobileView.constructAndBind(context, viewLogger, SLOT_NAME, viewModel)
        val group = view.getGroupView()
        val initialMarginStart = group.marginStart
        val initialMarginEnd = group.marginEnd

        overrideResource(R.dimen.status_bar_mobile_container_margin_start, initialMarginStart + 10)
        overrideResource(R.dimen.status_bar_mobile_container_margin_end, initialMarginEnd + 10)
        view.onConfigurationChanged(Configuration())

        assertThat(group.marginStart).isEqualTo(initialMarginStart + 10)
        assertThat(group.marginEnd).isEqualTo(initialMarginEnd + 10)
    }

    @Test
    @EnableFlags(NewStatusBarIcons.FLAG_NAME)
    @DisableFlags(Flags.FLAG_FIX_SHADE_HEADER_WRONG_ICON_SIZE)
    fun onConfigurationChanged_flagOff_doesNotUpdateGroupMargins() {
        val view =
            ModernStatusBarMobileView.constructAndBind(context, viewLogger, SLOT_NAME, viewModel)
        val group = view.getGroupView()
        val initialMarginStart = group.marginStart
        val initialMarginEnd = group.marginEnd

        overrideResource(R.dimen.status_bar_mobile_container_margin_start, initialMarginStart + 10)
        overrideResource(R.dimen.status_bar_mobile_container_margin_end, initialMarginEnd + 10)
        view.onConfigurationChanged(Configuration())

        assertThat(group.marginStart).isEqualTo(initialMarginStart)
        assertThat(group.marginEnd).isEqualTo(initialMarginEnd)
    }

    @Test
    @EnableFlags(Flags.FLAG_FIX_SHADE_HEADER_WRONG_ICON_SIZE, NewStatusBarIcons.FLAG_NAME)
    fun onConfigurationChanged_flagOn_updatesSignalHeight() {
        val view =
            ModernStatusBarMobileView.constructAndBind(context, viewLogger, SLOT_NAME, viewModel)
        val signal = view.requireViewById<View>(R.id.mobile_signal)
        val initialHeight = signal.marginStart

        overrideResource(R.dimen.status_bar_mobile_signal_size_updated, initialHeight + 10)

        view.onConfigurationChanged(Configuration())

        assertThat(signal.layoutParams.height).isEqualTo(initialHeight + 10)
    }

    @Test
    @EnableFlags(NewStatusBarIcons.FLAG_NAME)
    @DisableFlags(Flags.FLAG_FIX_SHADE_HEADER_WRONG_ICON_SIZE)
    fun onConfigurationChanged_flagOff_updatesSignalHeight() {
        val view =
            ModernStatusBarMobileView.constructAndBind(context, viewLogger, SLOT_NAME, viewModel)
        val group = view.getGroupView()
        val initialMarginStart = group.marginStart
        val initialMarginEnd = group.marginEnd

        overrideResource(R.dimen.status_bar_mobile_container_margin_start, initialMarginStart + 10)
        overrideResource(R.dimen.status_bar_mobile_container_margin_end, initialMarginEnd + 10)
        view.onConfigurationChanged(Configuration())

        assertThat(group.marginStart).isEqualTo(initialMarginStart)
        assertThat(group.marginEnd).isEqualTo(initialMarginEnd)
    }

    @Test
    fun colorChange_layersUpdateWithContrast() {
        // Allow the slice, and set it to visible. This cause us to use special color logic