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

Commit 0ab7ed58 authored by Dave Mankoff's avatar Dave Mankoff Committed by Android (Google) Code Review
Browse files

Merge "Remove SystemUIDialog subclass from FontScalingDialog" into main

parents f2aae389 0238d377
Loading
Loading
Loading
Loading
+24 −20
Original line number Diff line number Diff line
@@ -42,18 +42,21 @@ import com.android.systemui.util.settings.SecureSettings
import com.android.systemui.util.settings.SystemSettings
import com.android.systemui.util.time.SystemClock
import java.util.concurrent.atomic.AtomicInteger
import javax.inject.Inject
import kotlin.math.roundToInt

/** The Dialog that contains a seekbar for changing the font size. */
class FontScalingDialog(
    context: Context,
class FontScalingDialogDelegate @Inject constructor(
    private val context: Context,
    private val systemUIDialogFactory: SystemUIDialog.Factory,
    private val layoutInflater: LayoutInflater,
    private val systemSettings: SystemSettings,
    private val secureSettings: SecureSettings,
    private val systemClock: SystemClock,
    private val userTracker: UserTracker,
    @Main mainHandler: Handler,
    @Background private val backgroundDelayableExecutor: DelayableExecutor
) : SystemUIDialog(context) {
    @Background private val backgroundDelayableExecutor: DelayableExecutor,
) : SystemUIDialog.Delegate {
    private val MIN_UPDATE_INTERVAL_MS: Long = 800
    private val CHANGE_BY_SEEKBAR_DELAY_MS: Long = 100
    private val CHANGE_BY_BUTTON_DELAY_MS: Long = 300
@@ -75,19 +78,22 @@ class FontScalingDialog(
            }
        }

    override fun onCreate(savedInstanceState: Bundle?) {
        setTitle(R.string.font_scaling_dialog_title)
        setView(LayoutInflater.from(context).inflate(R.layout.font_scaling_dialog, null))
        setPositiveButton(
    override fun createDialog(): SystemUIDialog = systemUIDialogFactory.create(this)

    override fun beforeCreate(dialog: SystemUIDialog, savedInstanceState: Bundle?) {
        dialog.setTitle(R.string.font_scaling_dialog_title)
        dialog.setView(layoutInflater.inflate(R.layout.font_scaling_dialog, null))
        dialog.setPositiveButton(
                R.string.quick_settings_done,
                /* onClick = */ null,
                /* dismissOnClick = */ true
        )
        super.onCreate(savedInstanceState)
    }

        title = requireViewById(com.android.internal.R.id.alertTitle)
        doneButton = requireViewById(com.android.internal.R.id.button1)
        seekBarWithIconButtonsView = requireViewById(R.id.font_scaling_slider)
    override fun onCreate(dialog: SystemUIDialog, savedInstanceState: Bundle?) {
        title = dialog.requireViewById(com.android.internal.R.id.alertTitle)
        doneButton = dialog.requireViewById(com.android.internal.R.id.button1)
        seekBarWithIconButtonsView = dialog.requireViewById(R.id.font_scaling_slider)

        val labelArray = arrayOfNulls<String>(strEntryValues.size)
        for (i in strEntryValues.indices) {
@@ -135,7 +141,7 @@ class FontScalingDialog(
                }
            }
        )
        doneButton.setOnClickListener { dismiss() }
        doneButton.setOnClickListener { dialog.dismiss() }
        systemSettings.registerContentObserver(Settings.System.FONT_SCALE, fontSizeObserver)
    }

@@ -156,7 +162,7 @@ class FontScalingDialog(
            backgroundDelayableExecutor.executeDelayed({ updateFontScale() }, delayMs)
    }

    override fun stop() {
    override fun onStop(dialog: SystemUIDialog) {
        cancelUpdateFontScaleRunnable?.run()
        cancelUpdateFontScaleRunnable = null
        systemSettings.unregisterContentObserver(fontSizeObserver)
@@ -189,9 +195,7 @@ class FontScalingDialog(
        return strEntryValues.size - 1
    }

    override fun onConfigurationChanged(configuration: Configuration) {
        super.onConfigurationChanged(configuration)

    override fun onConfigurationChanged(dialog: SystemUIDialog, configuration: Configuration) {
        val configDiff = configuration.diff(this.configuration)
        this.configuration.setTo(configuration)

+4 −21
Original line number Diff line number Diff line
@@ -23,7 +23,7 @@ import android.view.View
import com.android.internal.jank.InteractionJankMonitor
import com.android.internal.logging.MetricsLogger
import com.android.systemui.res.R
import com.android.systemui.accessibility.fontscaling.FontScalingDialog
import com.android.systemui.accessibility.fontscaling.FontScalingDialogDelegate
import com.android.systemui.animation.DialogCuj
import com.android.systemui.animation.DialogLaunchAnimator
import com.android.systemui.dagger.qualifiers.Background
@@ -36,14 +36,10 @@ import com.android.systemui.qs.QSHost
import com.android.systemui.qs.QsEventLogger
import com.android.systemui.qs.logging.QSLogger
import com.android.systemui.qs.tileimpl.QSTileImpl
import com.android.systemui.settings.UserTracker
import com.android.systemui.statusbar.phone.SystemUIDialog
import com.android.systemui.statusbar.policy.KeyguardStateController
import com.android.systemui.util.concurrency.DelayableExecutor
import com.android.systemui.util.settings.SecureSettings
import com.android.systemui.util.settings.SystemSettings
import com.android.systemui.util.time.SystemClock
import javax.inject.Inject
import javax.inject.Provider

class FontScalingTile
@Inject
@@ -59,11 +55,7 @@ constructor(
    qsLogger: QSLogger,
    private val keyguardStateController: KeyguardStateController,
    private val dialogLaunchAnimator: DialogLaunchAnimator,
    private val systemSettings: SystemSettings,
    private val secureSettings: SecureSettings,
    private val systemClock: SystemClock,
    private val userTracker: UserTracker,
    @Background private val backgroundDelayableExecutor: DelayableExecutor
    private val fontScalingDialogDelegateProvider: Provider<FontScalingDialogDelegate>
) :
    QSTileImpl<QSTile.State?>(
        host,
@@ -87,16 +79,7 @@ constructor(
        val animateFromView: Boolean = view != null && !keyguardStateController.isShowing

        val runnable = Runnable {
            val dialog: SystemUIDialog =
                FontScalingDialog(
                    mContext,
                    systemSettings,
                    secureSettings,
                    systemClock,
                    userTracker,
                    mainHandler,
                    backgroundDelayableExecutor
                )
            val dialog: SystemUIDialog = fontScalingDialogDelegateProvider.get().createDialog()
            if (animateFromView) {
                dialogLaunchAnimator.showFromView(
                    dialog,
+22 −0
Original line number Diff line number Diff line
@@ -194,6 +194,28 @@ public class SystemUIDialog extends AlertDialog implements ViewRootImpl.ConfigCh
                new DialogDelegate<>(){});
    }

    public SystemUIDialog(
            Context context,
            int theme,
            boolean dismissOnDeviceLock,
            FeatureFlags featureFlags,
            SystemUIDialogManager dialogManager,
            SysUiState sysUiState,
            BroadcastDispatcher broadcastDispatcher,
            DialogLaunchAnimator dialogLaunchAnimator,
            Delegate delegate) {
        this(
                context,
                theme,
                dismissOnDeviceLock,
                featureFlags,
                dialogManager,
                sysUiState,
                broadcastDispatcher,
                dialogLaunchAnimator,
                (DialogDelegate<SystemUIDialog>) delegate);
    }

    public SystemUIDialog(
            Context context,
            int theme,
+79 −59
Original line number Diff line number Diff line
@@ -20,18 +20,24 @@ import android.os.Handler
import android.provider.Settings
import android.testing.AndroidTestingRunner
import android.testing.TestableLooper
import android.view.LayoutInflater
import android.view.ViewGroup
import android.widget.Button
import android.widget.SeekBar
import androidx.test.filters.SmallTest
import com.android.systemui.res.R
import com.android.systemui.SysuiTestCase
import com.android.systemui.animation.DialogLaunchAnimator
import com.android.systemui.common.ui.view.SeekBarWithIconButtonsView
import com.android.systemui.common.ui.view.SeekBarWithIconButtonsView.OnSeekBarWithIconButtonsChangeListener
import com.android.systemui.flags.FakeFeatureFlags
import com.android.systemui.flags.Flags
import com.android.systemui.model.SysUiState
import com.android.systemui.settings.UserTracker
import com.android.systemui.statusbar.phone.SystemUIDialog
import com.android.systemui.statusbar.phone.SystemUIDialog.DEFAULT_DISMISS_ON_DEVICE_LOCK
import com.android.systemui.statusbar.phone.SystemUIDialogManager
import com.android.systemui.util.concurrency.FakeExecutor
import com.android.systemui.util.mockito.capture
import com.android.systemui.util.mockito.whenever
import com.android.systemui.util.settings.FakeSettings
import com.android.systemui.util.settings.SecureSettings
import com.android.systemui.util.settings.SystemSettings
@@ -40,25 +46,25 @@ import com.google.common.truth.Truth.assertThat
import org.junit.Before
import org.junit.Test
import org.junit.runner.RunWith
import org.mockito.ArgumentCaptor
import org.mockito.Captor
import org.mockito.ArgumentMatchers.any
import org.mockito.ArgumentMatchers.anyBoolean
import org.mockito.ArgumentMatchers.anyInt
import org.mockito.Mock
import org.mockito.Mockito.spy
import org.mockito.Mockito.verify
import org.mockito.Mockito.`when` as whenever
import org.mockito.MockitoAnnotations

private const val ON: Int = 1
private const val OFF: Int = 0

/** Tests for [FontScalingDialog]. */
/** Tests for [FontScalingDialogDelegate]. */
@SmallTest
@RunWith(AndroidTestingRunner::class)
@TestableLooper.RunWithLooper(setAsMainLooper = true)
class FontScalingDialogTest : SysuiTestCase() {
    private val MIN_UPDATE_INTERVAL_MS: Long = 800
    private val CHANGE_BY_SEEKBAR_DELAY_MS: Long = 100
    private val CHANGE_BY_BUTTON_DELAY_MS: Long = 300
    private lateinit var fontScalingDialog: FontScalingDialog
class FontScalingDialogDelegateTest : SysuiTestCase() {
    private lateinit var fontScalingDialogDelegate: FontScalingDialogDelegate
    private lateinit var dialog: SystemUIDialog
    private lateinit var systemSettings: SystemSettings
    private lateinit var secureSettings: SecureSettings
    private lateinit var systemClock: FakeSystemClock
@@ -69,9 +75,12 @@ class FontScalingDialogTest : SysuiTestCase() {
            .getResources()
            .getStringArray(com.android.settingslib.R.array.entryvalues_font_size)

    @Mock private lateinit var dialogManager: SystemUIDialogManager
    @Mock private lateinit var dialogFactory: SystemUIDialog.Factory
    @Mock private lateinit var userTracker: UserTracker
    @Captor
    private lateinit var seekBarChangeCaptor: ArgumentCaptor<OnSeekBarWithIconButtonsChangeListener>
    private val featureFlags = FakeFeatureFlags()
    @Mock private lateinit var sysuiState: SysUiState
    @Mock private lateinit var dialogLaunchAnimator: DialogLaunchAnimator

    @Before
    fun setUp() {
@@ -79,28 +88,46 @@ class FontScalingDialogTest : SysuiTestCase() {
        testableLooper = TestableLooper.get(this)
        val mainHandler = Handler(testableLooper.looper)
        systemSettings = FakeSettings()
        featureFlags.set(Flags.WM_ENABLE_PREDICTIVE_BACK_QS_DIALOG_ANIM, true)
        // Guarantee that the systemSettings always starts with the default font scale.
        systemSettings.putFloatForUser(Settings.System.FONT_SCALE, 1.0f, userTracker.userId)
        secureSettings = FakeSettings()
        systemClock = FakeSystemClock()
        backgroundDelayableExecutor = FakeExecutor(systemClock)
        fontScalingDialog =
            FontScalingDialog(
        whenever(sysuiState.setFlag(anyInt(), anyBoolean())).thenReturn(sysuiState)

        fontScalingDialogDelegate = spy(FontScalingDialogDelegate(
                mContext,
                dialogFactory,
                LayoutInflater.from(mContext),
                systemSettings,
                secureSettings,
                systemClock,
                userTracker,
                mainHandler,
                backgroundDelayableExecutor
            ))

        dialog = SystemUIDialog(
            mContext,
            0,
            DEFAULT_DISMISS_ON_DEVICE_LOCK,
            featureFlags,
            dialogManager,
            sysuiState,
            fakeBroadcastDispatcher,
            dialogLaunchAnimator,
            fontScalingDialogDelegate
        )

        whenever(dialogFactory.create(any())).thenReturn(dialog)
    }

    @Test
    fun showTheDialog_seekbarIsShowingCorrectProgress() {
        fontScalingDialog.show()
        dialog.show()

        val seekBar: SeekBar = fontScalingDialog.findViewById<SeekBar>(R.id.seekbar)!!
        val seekBar: SeekBar = dialog.findViewById<SeekBar>(R.id.seekbar)!!
        val progress: Int = seekBar.getProgress()
        val currentScale =
            systemSettings.getFloatForUser(
@@ -111,17 +138,17 @@ class FontScalingDialogTest : SysuiTestCase() {

        assertThat(currentScale).isEqualTo(fontSizeValueArray[progress].toFloat())

        fontScalingDialog.dismiss()
        dialog.dismiss()
    }

    @Test
    fun progressIsZero_clickIconEnd_seekBarProgressIncreaseOne_fontSizeScaled() {
        fontScalingDialog.show()
        dialog.show()

        val iconEndFrame: ViewGroup = fontScalingDialog.findViewById(R.id.icon_end_frame)!!
        val iconEndFrame: ViewGroup = dialog.findViewById(R.id.icon_end_frame)!!
        val seekBarWithIconButtonsView: SeekBarWithIconButtonsView =
            fontScalingDialog.findViewById(R.id.font_scaling_slider)!!
        val seekBar: SeekBar = fontScalingDialog.findViewById(R.id.seekbar)!!
            dialog.findViewById(R.id.font_scaling_slider)!!
        val seekBar: SeekBar = dialog.findViewById(R.id.seekbar)!!

        seekBarWithIconButtonsView.setProgress(0)
        backgroundDelayableExecutor.runAllReady()
@@ -142,17 +169,17 @@ class FontScalingDialogTest : SysuiTestCase() {
        assertThat(seekBar.getProgress()).isEqualTo(1)
        assertThat(currentScale).isEqualTo(fontSizeValueArray[1].toFloat())

        fontScalingDialog.dismiss()
        dialog.dismiss()
    }

    @Test
    fun progressIsMax_clickIconStart_seekBarProgressDecreaseOne_fontSizeScaled() {
        fontScalingDialog.show()
        dialog.show()

        val iconStartFrame: ViewGroup = fontScalingDialog.findViewById(R.id.icon_start_frame)!!
        val iconStartFrame: ViewGroup = dialog.findViewById(R.id.icon_start_frame)!!
        val seekBarWithIconButtonsView: SeekBarWithIconButtonsView =
            fontScalingDialog.findViewById(R.id.font_scaling_slider)!!
        val seekBar: SeekBar = fontScalingDialog.findViewById(R.id.seekbar)!!
            dialog.findViewById(R.id.font_scaling_slider)!!
        val seekBar: SeekBar = dialog.findViewById(R.id.seekbar)!!

        seekBarWithIconButtonsView.setProgress(fontSizeValueArray.size - 1)
        backgroundDelayableExecutor.runAllReady()
@@ -174,14 +201,14 @@ class FontScalingDialogTest : SysuiTestCase() {
        assertThat(currentScale)
            .isEqualTo(fontSizeValueArray[fontSizeValueArray.size - 2].toFloat())

        fontScalingDialog.dismiss()
        dialog.dismiss()
    }

    @Test
    fun progressChanged_keyWasNotSetBefore_fontScalingHasBeenChangedIsOn() {
        fontScalingDialog.show()
        dialog.show()

        val iconStartFrame: ViewGroup = fontScalingDialog.findViewById(R.id.icon_start_frame)!!
        val iconStartFrame: ViewGroup = dialog.findViewById(R.id.icon_start_frame)!!
        secureSettings.putIntForUser(
            Settings.Secure.ACCESSIBILITY_FONT_SCALING_HAS_BEEN_CHANGED,
            OFF,
@@ -202,24 +229,21 @@ class FontScalingDialogTest : SysuiTestCase() {
            )
        assertThat(currentSettings).isEqualTo(ON)

        fontScalingDialog.dismiss()
        dialog.dismiss()
    }

    @Test
    fun dragSeekbar_systemFontSizeSettingsDoesNotChange() {
        fontScalingDialog = spy(fontScalingDialog)
        val slider: SeekBarWithIconButtonsView = spy(SeekBarWithIconButtonsView(mContext))
        whenever(
                fontScalingDialog.findViewById<SeekBarWithIconButtonsView>(R.id.font_scaling_slider)
            )
            .thenReturn(slider)
        fontScalingDialog.show()
        verify(slider).setOnSeekBarWithIconButtonsChangeListener(capture(seekBarChangeCaptor))
        dialog.show()

        val slider = dialog.findViewById<SeekBarWithIconButtonsView>(R.id.font_scaling_slider)!!
        val changeListener = slider.onSeekBarWithIconButtonsChangeListener

        val seekBar: SeekBar = slider.findViewById(R.id.seekbar)!!

        // Default seekbar progress for font size is 1, simulate dragging to 0 without
        // releasing the finger.
        seekBarChangeCaptor.value.onStartTrackingTouch(seekBar)
        changeListener.onStartTrackingTouch(seekBar)
        // Update seekbar progress. This will trigger onProgressChanged in the
        // OnSeekBarChangeListener and the seekbar could get updated progress value
        // in onStopTrackingTouch.
@@ -238,13 +262,13 @@ class FontScalingDialogTest : SysuiTestCase() {
        assertThat(systemScale).isEqualTo(1.0f)

        // Simulate releasing the finger from the seekbar.
        seekBarChangeCaptor.value.onStopTrackingTouch(seekBar)
        changeListener.onStopTrackingTouch(seekBar)
        backgroundDelayableExecutor.runAllReady()
        backgroundDelayableExecutor.advanceClockToNext()
        backgroundDelayableExecutor.runAllReady()

        // SeekBar interaction is finalized.
        seekBarChangeCaptor.value.onUserInteractionFinalized(
        changeListener.onUserInteractionFinalized(
            seekBar,
            OnSeekBarWithIconButtonsChangeListener.ControlUnitType.SLIDER
        )
@@ -261,25 +285,21 @@ class FontScalingDialogTest : SysuiTestCase() {
            )
        assertThat(systemScale).isEqualTo(fontSizeValueArray[0].toFloat())

        fontScalingDialog.dismiss()
        dialog.dismiss()
    }

    @Test
    fun dragSeekBar_createTextPreview() {
        fontScalingDialog = spy(fontScalingDialog)
        val slider: SeekBarWithIconButtonsView = spy(SeekBarWithIconButtonsView(mContext))
        whenever(
                fontScalingDialog.findViewById<SeekBarWithIconButtonsView>(R.id.font_scaling_slider)
            )
            .thenReturn(slider)
        fontScalingDialog.show()
        verify(slider).setOnSeekBarWithIconButtonsChangeListener(capture(seekBarChangeCaptor))
        dialog.show()
        val slider = dialog.findViewById<SeekBarWithIconButtonsView>(R.id.font_scaling_slider)!!
        val changeListener = slider.onSeekBarWithIconButtonsChangeListener

        val seekBar: SeekBar = slider.findViewById(R.id.seekbar)!!

        // Default seekbar progress for font size is 1, simulate dragging to 0 without
        // releasing the finger
        seekBarChangeCaptor.value.onStartTrackingTouch(seekBar)
        seekBarChangeCaptor.value.onProgressChanged(
        changeListener.onStartTrackingTouch(seekBar)
        changeListener.onProgressChanged(
            seekBar,
            /* progress= */ 0,
            /* fromUser= */ false
@@ -287,16 +307,16 @@ class FontScalingDialogTest : SysuiTestCase() {
        backgroundDelayableExecutor.advanceClockToNext()
        backgroundDelayableExecutor.runAllReady()

        verify(fontScalingDialog).createTextPreview(/* index= */ 0)
        fontScalingDialog.dismiss()
        verify(fontScalingDialogDelegate).createTextPreview(/* index= */ 0)
        dialog.dismiss()
    }

    @Test
    fun changeFontSize_buttonIsDisabledBeforeFontSizeChangeFinishes() {
        fontScalingDialog.show()
        dialog.show()

        val iconEndFrame: ViewGroup = fontScalingDialog.findViewById(R.id.icon_end_frame)!!
        val doneButton: Button = fontScalingDialog.findViewById(com.android.internal.R.id.button1)!!
        val iconEndFrame: ViewGroup = dialog.findViewById(R.id.icon_end_frame)!!
        val doneButton: Button = dialog.findViewById(com.android.internal.R.id.button1)!!

        iconEndFrame.performClick()
        backgroundDelayableExecutor.runAllReady()
@@ -308,7 +328,7 @@ class FontScalingDialogTest : SysuiTestCase() {

        val config = Configuration()
        config.fontScale = 1.15f
        fontScalingDialog.onConfigurationChanged(config)
        dialog.onConfigurationChanged(config)
        testableLooper.processAllMessages()
        assertThat(doneButton.isEnabled).isTrue()
    }
+7 −9
Original line number Diff line number Diff line
@@ -24,6 +24,7 @@ import android.view.View
import androidx.test.filters.SmallTest
import com.android.internal.logging.MetricsLogger
import com.android.systemui.SysuiTestCase
import com.android.systemui.accessibility.fontscaling.FontScalingDialogDelegate
import com.android.systemui.animation.DialogLaunchAnimator
import com.android.systemui.classifier.FalsingManagerFake
import com.android.systemui.plugins.ActivityStarter
@@ -31,13 +32,12 @@ import com.android.systemui.plugins.statusbar.StatusBarStateController
import com.android.systemui.qs.QSHost
import com.android.systemui.qs.QsEventLogger
import com.android.systemui.qs.logging.QSLogger
import com.android.systemui.settings.UserTracker
import com.android.systemui.statusbar.phone.SystemUIDialog
import com.android.systemui.statusbar.policy.KeyguardStateController
import com.android.systemui.util.concurrency.FakeExecutor
import com.android.systemui.util.mockito.any
import com.android.systemui.util.mockito.eq
import com.android.systemui.util.mockito.nullable
import com.android.systemui.util.settings.FakeSettings
import com.android.systemui.util.time.FakeSystemClock
import com.google.common.truth.Truth.assertThat
import org.junit.After
@@ -45,9 +45,9 @@ import org.junit.Before
import org.junit.Test
import org.junit.runner.RunWith
import org.mockito.ArgumentCaptor
import org.mockito.ArgumentMatchers.anyBoolean
import org.mockito.Captor
import org.mockito.Mock
import org.mockito.Mockito.anyBoolean
import org.mockito.Mockito.never
import org.mockito.Mockito.verify
import org.mockito.Mockito.`when`
@@ -64,8 +64,9 @@ class FontScalingTileTest : SysuiTestCase() {
    @Mock private lateinit var qsLogger: QSLogger
    @Mock private lateinit var dialogLaunchAnimator: DialogLaunchAnimator
    @Mock private lateinit var uiEventLogger: QsEventLogger
    @Mock private lateinit var userTracker: UserTracker
    @Mock private lateinit var keyguardStateController: KeyguardStateController
    @Mock private lateinit var fontScalingDialogDelegate: FontScalingDialogDelegate
    @Mock private lateinit var dialog: SystemUIDialog

    private lateinit var testableLooper: TestableLooper
    private lateinit var systemClock: FakeSystemClock
@@ -79,6 +80,7 @@ class FontScalingTileTest : SysuiTestCase() {
        MockitoAnnotations.initMocks(this)
        testableLooper = TestableLooper.get(this)
        `when`(qsHost.getContext()).thenReturn(mContext)
        `when`(fontScalingDialogDelegate.createDialog()).thenReturn(dialog)
        systemClock = FakeSystemClock()
        backgroundDelayableExecutor = FakeExecutor(systemClock)

@@ -95,11 +97,7 @@ class FontScalingTileTest : SysuiTestCase() {
                qsLogger,
                keyguardStateController,
                dialogLaunchAnimator,
                FakeSettings(),
                FakeSettings(),
                FakeSystemClock(),
                userTracker,
                backgroundDelayableExecutor,
                { fontScalingDialogDelegate },
            )
        fontScalingTile.initialize()
        testableLooper.processAllMessages()