Loading packages/SystemUI/src/com/android/systemui/FontSizeUtils.java +20 −2 Original line number Diff line number Diff line Loading @@ -16,6 +16,8 @@ package com.android.systemui; import android.annotation.StyleRes; import android.content.res.TypedArray; import android.util.TypedValue; import android.view.View; import android.widget.TextView; Loading @@ -23,9 +25,9 @@ import android.widget.TextView; /** * Utility class to update the font size when the configuration has changed. */ public class FontSizeUtils { public final class FontSizeUtils { public static final float LARGE_TEXT_SCALE = 1.3f; private FontSizeUtils() {} public static void updateFontSize(View parent, int viewId, int dimensId) { updateFontSize((TextView) parent.findViewById(viewId), dimensId); Loading @@ -37,4 +39,20 @@ public class FontSizeUtils { v.getResources().getDimensionPixelSize(dimensId)); } } /** * Updates the font size according to the style given. * * @param v Text to update. * @param resId Style applying to the text. */ public static void updateFontSizeFromStyle(TextView v, @StyleRes int resId) { int[] attrs = {android.R.attr.textSize}; int indexOfAttrTextSize = 0; TypedArray ta = v.getContext().obtainStyledAttributes(resId, attrs); int updatedTextPixelSize = ta.getDimensionPixelSize(indexOfAttrTextSize, (int) v.getTextSize()); v.setTextSize(TypedValue.COMPLEX_UNIT_PX, updatedTextPixelSize); ta.recycle(); } } packages/SystemUI/src/com/android/systemui/qs/carrier/QSCarrier.java +6 −0 Original line number Diff line number Diff line Loading @@ -16,6 +16,7 @@ package com.android.systemui.qs.carrier; import android.annotation.StyleRes; import android.content.Context; import android.content.res.ColorStateList; import android.text.TextUtils; Loading @@ -30,6 +31,7 @@ import androidx.annotation.VisibleForTesting; import com.android.settingslib.Utils; import com.android.settingslib.graph.SignalDrawable; import com.android.systemui.FontSizeUtils; import com.android.systemui.R; import java.util.Objects; Loading Loading @@ -146,4 +148,8 @@ public class QSCarrier extends LinearLayout { public void setCarrierText(CharSequence text) { mCarrierText.setText(text); } public void updateTextAppearance(@StyleRes int resId) { FontSizeUtils.updateFontSizeFromStyle(mCarrierText, resId); } } packages/SystemUI/src/com/android/systemui/qs/carrier/QSCarrierGroup.java +9 −0 Original line number Diff line number Diff line Loading @@ -16,12 +16,14 @@ package com.android.systemui.qs.carrier; import android.annotation.StyleRes; import android.content.Context; import android.util.AttributeSet; import android.view.View; import android.widget.LinearLayout; import android.widget.TextView; import com.android.systemui.FontSizeUtils; import com.android.systemui.R; /** Loading Loading @@ -55,4 +57,11 @@ public class QSCarrierGroup extends LinearLayout { View getCarrierDivider2() { return findViewById(R.id.qs_carrier_divider2); } public void updateTextAppearance(@StyleRes int resId) { FontSizeUtils.updateFontSizeFromStyle(getNoSimTextView(), resId); getCarrier1View().updateTextAppearance(resId); getCarrier2View().updateTextAppearance(resId); getCarrier3View().updateTextAppearance(resId); } } packages/SystemUI/src/com/android/systemui/statusbar/phone/LargeScreenShadeHeaderController.kt +22 −2 Original line number Diff line number Diff line Loading @@ -18,9 +18,11 @@ package com.android.systemui.statusbar.phone import android.app.StatusBarManager import android.view.View import android.widget.TextView import androidx.constraintlayout.motion.widget.MotionLayout import com.android.settingslib.Utils import com.android.systemui.Dumpable import com.android.systemui.FontSizeUtils import com.android.systemui.R import com.android.systemui.animation.ShadeInterpolation import com.android.systemui.battery.BatteryMeterView Loading @@ -30,10 +32,12 @@ import com.android.systemui.flags.FeatureFlags import com.android.systemui.flags.Flags import com.android.systemui.qs.ChipVisibilityListener import com.android.systemui.qs.HeaderPrivacyIconsController import com.android.systemui.qs.carrier.QSCarrierGroup import com.android.systemui.qs.carrier.QSCarrierGroupController import com.android.systemui.statusbar.phone.dagger.CentralSurfacesComponent.CentralSurfacesScope import com.android.systemui.statusbar.phone.dagger.StatusBarViewModule.LARGE_SCREEN_BATTERY_CONTROLLER import com.android.systemui.statusbar.phone.dagger.StatusBarViewModule.LARGE_SCREEN_SHADE_HEADER import com.android.systemui.statusbar.policy.ConfigurationController import java.io.PrintWriter import javax.inject.Inject import javax.inject.Named Loading @@ -43,6 +47,7 @@ class LargeScreenShadeHeaderController @Inject constructor( @Named(LARGE_SCREEN_SHADE_HEADER) private val header: View, private val statusBarIconController: StatusBarIconController, private val privacyIconsController: HeaderPrivacyIconsController, private val configurationController: ConfigurationController, qsCarrierGroupControllerBuilder: QSCarrierGroupController.Builder, featureFlags: FeatureFlags, @Named(LARGE_SCREEN_BATTERY_CONTROLLER) batteryMeterViewController: BatteryMeterViewController, Loading @@ -69,6 +74,9 @@ class LargeScreenShadeHeaderController @Inject constructor( private val iconContainer: StatusIconContainer private val carrierIconSlots: List<String> private val qsCarrierGroupController: QSCarrierGroupController private val clock: TextView = header.findViewById(R.id.clock) private val date: TextView = header.findViewById(R.id.date) private val qsCarrierGroup: QSCarrierGroup = header.findViewById(R.id.carrier_group) private var qsDisabled = false Loading Loading @@ -148,9 +156,9 @@ class LargeScreenShadeHeaderController @Inject constructor( .load(context, resources.getXml(R.xml.large_screen_shade_header)) privacyIconsController.chipVisibilityListener = chipVisibilityListener } } init { bindConfigurationListener() batteryMeterViewController.init() val batteryIcon: BatteryMeterView = header.findViewById(R.id.batteryRemainingIcon) Loading Loading @@ -194,6 +202,18 @@ class LargeScreenShadeHeaderController @Inject constructor( } } private fun bindConfigurationListener() { val listener = object : ConfigurationController.ConfigurationListener { override fun onDensityOrFontScaleChanged() { val qsStatusStyle = R.style.TextAppearance_QS_Status FontSizeUtils.updateFontSizeFromStyle(clock, qsStatusStyle) FontSizeUtils.updateFontSizeFromStyle(date, qsStatusStyle) qsCarrierGroup.updateTextAppearance(qsStatusStyle) } } configurationController.addCallback(listener) } private fun onShadeExpandedChanged() { if (shadeExpanded) { privacyIconsController.startListening() Loading packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/LargeScreenShadeHeaderControllerTest.kt +55 −0 Original line number Diff line number Diff line package com.android.systemui.statusbar.phone import android.app.StatusBarManager import android.content.Context import android.content.res.TypedArray import android.testing.AndroidTestingRunner import android.util.TypedValue.COMPLEX_UNIT_PX import android.view.View import android.widget.TextView import androidx.test.filters.SmallTest import com.android.systemui.R import com.android.systemui.SysuiTestCase Loading @@ -13,7 +17,9 @@ import com.android.systemui.dump.DumpManager import com.android.systemui.flags.FeatureFlags import com.android.systemui.flags.Flags import com.android.systemui.qs.HeaderPrivacyIconsController import com.android.systemui.qs.carrier.QSCarrierGroup import com.android.systemui.qs.carrier.QSCarrierGroupController import com.android.systemui.statusbar.policy.FakeConfigurationController import com.google.common.truth.Truth.assertThat import org.junit.Before import org.junit.Rule Loading @@ -22,6 +28,7 @@ import org.junit.runner.RunWith import org.mockito.ArgumentMatchers.any import org.mockito.ArgumentMatchers.anyInt import org.mockito.Mock import org.mockito.Mockito.clearInvocations import org.mockito.Mockito.verify import org.mockito.junit.MockitoJUnit import org.mockito.Mockito.`when` as whenever Loading @@ -36,19 +43,32 @@ class LargeScreenShadeHeaderControllerTest : SysuiTestCase() { @Mock private lateinit var qsCarrierGroupController: QSCarrierGroupController @Mock private lateinit var qsCarrierGroupControllerBuilder: QSCarrierGroupController.Builder @Mock private lateinit var featureFlags: FeatureFlags @Mock private lateinit var clock: TextView @Mock private lateinit var date: TextView @Mock private lateinit var carrierGroup: QSCarrierGroup @Mock private lateinit var batteryMeterView: BatteryMeterView @Mock private lateinit var batteryMeterViewController: BatteryMeterViewController @Mock private lateinit var privacyIconsController: HeaderPrivacyIconsController @Mock private lateinit var dumpManager: DumpManager @Mock private lateinit var mockedContext: Context @Mock private lateinit var typedArray: TypedArray @JvmField @Rule val mockitoRule = MockitoJUnit.rule() var viewVisibility = View.GONE private lateinit var mLargeScreenShadeHeaderController: LargeScreenShadeHeaderController private lateinit var carrierIconSlots: List<String> private val configurationController = FakeConfigurationController() @Before fun setup() { whenever<TextView>(view.findViewById(R.id.clock)).thenReturn(clock) whenever(clock.context).thenReturn(mockedContext) whenever(mockedContext.obtainStyledAttributes(anyInt(), any())).thenReturn(typedArray) whenever<TextView>(view.findViewById(R.id.date)).thenReturn(date) whenever(date.context).thenReturn(mockedContext) whenever<QSCarrierGroup>(view.findViewById(R.id.carrier_group)).thenReturn(carrierGroup) whenever<BatteryMeterView>(view.findViewById(R.id.batteryRemainingIcon)) .thenReturn(batteryMeterView) whenever<StatusIconContainer>(view.findViewById(R.id.statusIcons)).thenReturn(statusIcons) Loading @@ -67,6 +87,7 @@ class LargeScreenShadeHeaderControllerTest : SysuiTestCase() { view, statusBarIconController, privacyIconsController, configurationController, qsCarrierGroupControllerBuilder, featureFlags, batteryMeterViewController, Loading Loading @@ -138,4 +159,38 @@ class LargeScreenShadeHeaderControllerTest : SysuiTestCase() { mLargeScreenShadeHeaderController.active = true mLargeScreenShadeHeaderController.shadeExpanded = true } @Test fun updateConfig_changesFontSize() { val updatedTextPixelSize = 32 setReturnTextSize(updatedTextPixelSize) configurationController.notifyDensityOrFontScaleChanged() verify(clock).setTextSize(COMPLEX_UNIT_PX, updatedTextPixelSize.toFloat()) verify(date).setTextSize(COMPLEX_UNIT_PX, updatedTextPixelSize.toFloat()) verify(carrierGroup).updateTextAppearance(R.style.TextAppearance_QS_Status) } @Test fun updateConfig_changesFontSizeMultipleTimes() { val updatedTextPixelSize1 = 32 setReturnTextSize(updatedTextPixelSize1) configurationController.notifyDensityOrFontScaleChanged() verify(clock).setTextSize(COMPLEX_UNIT_PX, updatedTextPixelSize1.toFloat()) verify(date).setTextSize(COMPLEX_UNIT_PX, updatedTextPixelSize1.toFloat()) verify(carrierGroup).updateTextAppearance(R.style.TextAppearance_QS_Status) clearInvocations(carrierGroup) val updatedTextPixelSize2 = 42 setReturnTextSize(updatedTextPixelSize2) configurationController.notifyDensityOrFontScaleChanged() verify(clock).setTextSize(COMPLEX_UNIT_PX, updatedTextPixelSize2.toFloat()) verify(date).setTextSize(COMPLEX_UNIT_PX, updatedTextPixelSize2.toFloat()) verify(carrierGroup).updateTextAppearance(R.style.TextAppearance_QS_Status) } private fun setReturnTextSize(resultTextSize: Int) { whenever(typedArray.getDimensionPixelSize(anyInt(), anyInt())).thenReturn(resultTextSize) } } Loading
packages/SystemUI/src/com/android/systemui/FontSizeUtils.java +20 −2 Original line number Diff line number Diff line Loading @@ -16,6 +16,8 @@ package com.android.systemui; import android.annotation.StyleRes; import android.content.res.TypedArray; import android.util.TypedValue; import android.view.View; import android.widget.TextView; Loading @@ -23,9 +25,9 @@ import android.widget.TextView; /** * Utility class to update the font size when the configuration has changed. */ public class FontSizeUtils { public final class FontSizeUtils { public static final float LARGE_TEXT_SCALE = 1.3f; private FontSizeUtils() {} public static void updateFontSize(View parent, int viewId, int dimensId) { updateFontSize((TextView) parent.findViewById(viewId), dimensId); Loading @@ -37,4 +39,20 @@ public class FontSizeUtils { v.getResources().getDimensionPixelSize(dimensId)); } } /** * Updates the font size according to the style given. * * @param v Text to update. * @param resId Style applying to the text. */ public static void updateFontSizeFromStyle(TextView v, @StyleRes int resId) { int[] attrs = {android.R.attr.textSize}; int indexOfAttrTextSize = 0; TypedArray ta = v.getContext().obtainStyledAttributes(resId, attrs); int updatedTextPixelSize = ta.getDimensionPixelSize(indexOfAttrTextSize, (int) v.getTextSize()); v.setTextSize(TypedValue.COMPLEX_UNIT_PX, updatedTextPixelSize); ta.recycle(); } }
packages/SystemUI/src/com/android/systemui/qs/carrier/QSCarrier.java +6 −0 Original line number Diff line number Diff line Loading @@ -16,6 +16,7 @@ package com.android.systemui.qs.carrier; import android.annotation.StyleRes; import android.content.Context; import android.content.res.ColorStateList; import android.text.TextUtils; Loading @@ -30,6 +31,7 @@ import androidx.annotation.VisibleForTesting; import com.android.settingslib.Utils; import com.android.settingslib.graph.SignalDrawable; import com.android.systemui.FontSizeUtils; import com.android.systemui.R; import java.util.Objects; Loading Loading @@ -146,4 +148,8 @@ public class QSCarrier extends LinearLayout { public void setCarrierText(CharSequence text) { mCarrierText.setText(text); } public void updateTextAppearance(@StyleRes int resId) { FontSizeUtils.updateFontSizeFromStyle(mCarrierText, resId); } }
packages/SystemUI/src/com/android/systemui/qs/carrier/QSCarrierGroup.java +9 −0 Original line number Diff line number Diff line Loading @@ -16,12 +16,14 @@ package com.android.systemui.qs.carrier; import android.annotation.StyleRes; import android.content.Context; import android.util.AttributeSet; import android.view.View; import android.widget.LinearLayout; import android.widget.TextView; import com.android.systemui.FontSizeUtils; import com.android.systemui.R; /** Loading Loading @@ -55,4 +57,11 @@ public class QSCarrierGroup extends LinearLayout { View getCarrierDivider2() { return findViewById(R.id.qs_carrier_divider2); } public void updateTextAppearance(@StyleRes int resId) { FontSizeUtils.updateFontSizeFromStyle(getNoSimTextView(), resId); getCarrier1View().updateTextAppearance(resId); getCarrier2View().updateTextAppearance(resId); getCarrier3View().updateTextAppearance(resId); } }
packages/SystemUI/src/com/android/systemui/statusbar/phone/LargeScreenShadeHeaderController.kt +22 −2 Original line number Diff line number Diff line Loading @@ -18,9 +18,11 @@ package com.android.systemui.statusbar.phone import android.app.StatusBarManager import android.view.View import android.widget.TextView import androidx.constraintlayout.motion.widget.MotionLayout import com.android.settingslib.Utils import com.android.systemui.Dumpable import com.android.systemui.FontSizeUtils import com.android.systemui.R import com.android.systemui.animation.ShadeInterpolation import com.android.systemui.battery.BatteryMeterView Loading @@ -30,10 +32,12 @@ import com.android.systemui.flags.FeatureFlags import com.android.systemui.flags.Flags import com.android.systemui.qs.ChipVisibilityListener import com.android.systemui.qs.HeaderPrivacyIconsController import com.android.systemui.qs.carrier.QSCarrierGroup import com.android.systemui.qs.carrier.QSCarrierGroupController import com.android.systemui.statusbar.phone.dagger.CentralSurfacesComponent.CentralSurfacesScope import com.android.systemui.statusbar.phone.dagger.StatusBarViewModule.LARGE_SCREEN_BATTERY_CONTROLLER import com.android.systemui.statusbar.phone.dagger.StatusBarViewModule.LARGE_SCREEN_SHADE_HEADER import com.android.systemui.statusbar.policy.ConfigurationController import java.io.PrintWriter import javax.inject.Inject import javax.inject.Named Loading @@ -43,6 +47,7 @@ class LargeScreenShadeHeaderController @Inject constructor( @Named(LARGE_SCREEN_SHADE_HEADER) private val header: View, private val statusBarIconController: StatusBarIconController, private val privacyIconsController: HeaderPrivacyIconsController, private val configurationController: ConfigurationController, qsCarrierGroupControllerBuilder: QSCarrierGroupController.Builder, featureFlags: FeatureFlags, @Named(LARGE_SCREEN_BATTERY_CONTROLLER) batteryMeterViewController: BatteryMeterViewController, Loading @@ -69,6 +74,9 @@ class LargeScreenShadeHeaderController @Inject constructor( private val iconContainer: StatusIconContainer private val carrierIconSlots: List<String> private val qsCarrierGroupController: QSCarrierGroupController private val clock: TextView = header.findViewById(R.id.clock) private val date: TextView = header.findViewById(R.id.date) private val qsCarrierGroup: QSCarrierGroup = header.findViewById(R.id.carrier_group) private var qsDisabled = false Loading Loading @@ -148,9 +156,9 @@ class LargeScreenShadeHeaderController @Inject constructor( .load(context, resources.getXml(R.xml.large_screen_shade_header)) privacyIconsController.chipVisibilityListener = chipVisibilityListener } } init { bindConfigurationListener() batteryMeterViewController.init() val batteryIcon: BatteryMeterView = header.findViewById(R.id.batteryRemainingIcon) Loading Loading @@ -194,6 +202,18 @@ class LargeScreenShadeHeaderController @Inject constructor( } } private fun bindConfigurationListener() { val listener = object : ConfigurationController.ConfigurationListener { override fun onDensityOrFontScaleChanged() { val qsStatusStyle = R.style.TextAppearance_QS_Status FontSizeUtils.updateFontSizeFromStyle(clock, qsStatusStyle) FontSizeUtils.updateFontSizeFromStyle(date, qsStatusStyle) qsCarrierGroup.updateTextAppearance(qsStatusStyle) } } configurationController.addCallback(listener) } private fun onShadeExpandedChanged() { if (shadeExpanded) { privacyIconsController.startListening() Loading
packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/LargeScreenShadeHeaderControllerTest.kt +55 −0 Original line number Diff line number Diff line package com.android.systemui.statusbar.phone import android.app.StatusBarManager import android.content.Context import android.content.res.TypedArray import android.testing.AndroidTestingRunner import android.util.TypedValue.COMPLEX_UNIT_PX import android.view.View import android.widget.TextView import androidx.test.filters.SmallTest import com.android.systemui.R import com.android.systemui.SysuiTestCase Loading @@ -13,7 +17,9 @@ import com.android.systemui.dump.DumpManager import com.android.systemui.flags.FeatureFlags import com.android.systemui.flags.Flags import com.android.systemui.qs.HeaderPrivacyIconsController import com.android.systemui.qs.carrier.QSCarrierGroup import com.android.systemui.qs.carrier.QSCarrierGroupController import com.android.systemui.statusbar.policy.FakeConfigurationController import com.google.common.truth.Truth.assertThat import org.junit.Before import org.junit.Rule Loading @@ -22,6 +28,7 @@ import org.junit.runner.RunWith import org.mockito.ArgumentMatchers.any import org.mockito.ArgumentMatchers.anyInt import org.mockito.Mock import org.mockito.Mockito.clearInvocations import org.mockito.Mockito.verify import org.mockito.junit.MockitoJUnit import org.mockito.Mockito.`when` as whenever Loading @@ -36,19 +43,32 @@ class LargeScreenShadeHeaderControllerTest : SysuiTestCase() { @Mock private lateinit var qsCarrierGroupController: QSCarrierGroupController @Mock private lateinit var qsCarrierGroupControllerBuilder: QSCarrierGroupController.Builder @Mock private lateinit var featureFlags: FeatureFlags @Mock private lateinit var clock: TextView @Mock private lateinit var date: TextView @Mock private lateinit var carrierGroup: QSCarrierGroup @Mock private lateinit var batteryMeterView: BatteryMeterView @Mock private lateinit var batteryMeterViewController: BatteryMeterViewController @Mock private lateinit var privacyIconsController: HeaderPrivacyIconsController @Mock private lateinit var dumpManager: DumpManager @Mock private lateinit var mockedContext: Context @Mock private lateinit var typedArray: TypedArray @JvmField @Rule val mockitoRule = MockitoJUnit.rule() var viewVisibility = View.GONE private lateinit var mLargeScreenShadeHeaderController: LargeScreenShadeHeaderController private lateinit var carrierIconSlots: List<String> private val configurationController = FakeConfigurationController() @Before fun setup() { whenever<TextView>(view.findViewById(R.id.clock)).thenReturn(clock) whenever(clock.context).thenReturn(mockedContext) whenever(mockedContext.obtainStyledAttributes(anyInt(), any())).thenReturn(typedArray) whenever<TextView>(view.findViewById(R.id.date)).thenReturn(date) whenever(date.context).thenReturn(mockedContext) whenever<QSCarrierGroup>(view.findViewById(R.id.carrier_group)).thenReturn(carrierGroup) whenever<BatteryMeterView>(view.findViewById(R.id.batteryRemainingIcon)) .thenReturn(batteryMeterView) whenever<StatusIconContainer>(view.findViewById(R.id.statusIcons)).thenReturn(statusIcons) Loading @@ -67,6 +87,7 @@ class LargeScreenShadeHeaderControllerTest : SysuiTestCase() { view, statusBarIconController, privacyIconsController, configurationController, qsCarrierGroupControllerBuilder, featureFlags, batteryMeterViewController, Loading Loading @@ -138,4 +159,38 @@ class LargeScreenShadeHeaderControllerTest : SysuiTestCase() { mLargeScreenShadeHeaderController.active = true mLargeScreenShadeHeaderController.shadeExpanded = true } @Test fun updateConfig_changesFontSize() { val updatedTextPixelSize = 32 setReturnTextSize(updatedTextPixelSize) configurationController.notifyDensityOrFontScaleChanged() verify(clock).setTextSize(COMPLEX_UNIT_PX, updatedTextPixelSize.toFloat()) verify(date).setTextSize(COMPLEX_UNIT_PX, updatedTextPixelSize.toFloat()) verify(carrierGroup).updateTextAppearance(R.style.TextAppearance_QS_Status) } @Test fun updateConfig_changesFontSizeMultipleTimes() { val updatedTextPixelSize1 = 32 setReturnTextSize(updatedTextPixelSize1) configurationController.notifyDensityOrFontScaleChanged() verify(clock).setTextSize(COMPLEX_UNIT_PX, updatedTextPixelSize1.toFloat()) verify(date).setTextSize(COMPLEX_UNIT_PX, updatedTextPixelSize1.toFloat()) verify(carrierGroup).updateTextAppearance(R.style.TextAppearance_QS_Status) clearInvocations(carrierGroup) val updatedTextPixelSize2 = 42 setReturnTextSize(updatedTextPixelSize2) configurationController.notifyDensityOrFontScaleChanged() verify(clock).setTextSize(COMPLEX_UNIT_PX, updatedTextPixelSize2.toFloat()) verify(date).setTextSize(COMPLEX_UNIT_PX, updatedTextPixelSize2.toFloat()) verify(carrierGroup).updateTextAppearance(R.style.TextAppearance_QS_Status) } private fun setReturnTextSize(resultTextSize: Int) { whenever(typedArray.getDimensionPixelSize(anyInt(), anyInt())).thenReturn(resultTextSize) } }