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

Commit fbc06111 authored by Candice Lo's avatar Candice Lo Committed by Automerger Merge Worker
Browse files

Merge "Implement Font Scaling Quick Settings Tile (4/n)" into tm-qpr-dev am:...

Merge "Implement Font Scaling Quick Settings Tile (4/n)" into tm-qpr-dev am: c0e6f4e8 am: bbef2bcc

Original change: https://googleplex-android-review.googlesource.com/c/platform/frameworks/base/+/21336878



Change-Id: I752b490ba00a4081f3d988e01d49fe1c0e929dd3
Signed-off-by: default avatarAutomerger Merge Worker <android-build-automerger-merge-worker@system.gserviceaccount.com>
parents d16e49db bbef2bcc
Loading
Loading
Loading
Loading
+72 −1
Original line number Original line Diff line number Diff line
@@ -16,13 +16,32 @@
package com.android.systemui.accessibility.fontscaling
package com.android.systemui.accessibility.fontscaling


import android.content.Context
import android.content.Context
import android.content.pm.ActivityInfo
import android.content.res.Configuration
import android.os.Bundle
import android.os.Bundle
import android.provider.Settings
import android.view.LayoutInflater
import android.view.LayoutInflater
import android.widget.Button
import android.widget.SeekBar
import android.widget.SeekBar.OnSeekBarChangeListener
import android.widget.TextView
import com.android.systemui.R
import com.android.systemui.R
import com.android.systemui.common.ui.view.SeekBarWithIconButtonsView
import com.android.systemui.statusbar.phone.SystemUIDialog
import com.android.systemui.statusbar.phone.SystemUIDialog
import com.android.systemui.util.settings.SystemSettings


/** The Dialog that contains a seekbar for changing the font size. */
/** The Dialog that contains a seekbar for changing the font size. */
class FontScalingDialog(context: Context) : SystemUIDialog(context) {
class FontScalingDialog(context: Context, private val systemSettings: SystemSettings) :
    SystemUIDialog(context) {
    private val strEntryValues: Array<String> =
        context.resources.getStringArray(com.android.settingslib.R.array.entryvalues_font_size)
    private lateinit var title: TextView
    private lateinit var doneButton: Button
    private lateinit var seekBarWithIconButtonsView: SeekBarWithIconButtonsView

    private val configuration: Configuration =
        Configuration(context.getResources().getConfiguration())

    override fun onCreate(savedInstanceState: Bundle?) {
    override fun onCreate(savedInstanceState: Bundle?) {
        setTitle(R.string.font_scaling_dialog_title)
        setTitle(R.string.font_scaling_dialog_title)
        setView(LayoutInflater.from(context).inflate(R.layout.font_scaling_dialog, null))
        setView(LayoutInflater.from(context).inflate(R.layout.font_scaling_dialog, null))
@@ -32,5 +51,57 @@ class FontScalingDialog(context: Context) : SystemUIDialog(context) {
            /* dismissOnClick = */ true
            /* dismissOnClick = */ true
        )
        )
        super.onCreate(savedInstanceState)
        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)

        seekBarWithIconButtonsView.setMax((strEntryValues).size - 1)

        val currentScale = systemSettings.getFloat(Settings.System.FONT_SCALE, 1.0f)
        seekBarWithIconButtonsView.setProgress(fontSizeValueToIndex(currentScale))

        seekBarWithIconButtonsView.setOnSeekBarChangeListener(
            object : OnSeekBarChangeListener {
                override fun onProgressChanged(seekBar: SeekBar, progress: Int, fromUser: Boolean) {
                    systemSettings.putString(Settings.System.FONT_SCALE, strEntryValues[progress])
                }

                override fun onStartTrackingTouch(seekBar: SeekBar) {
                    // Do nothing
                }

                override fun onStopTrackingTouch(seekBar: SeekBar) {
                    // Do nothing
                }
            }
        )
        doneButton.setOnClickListener { dismiss() }
    }

    private fun fontSizeValueToIndex(value: Float): Int {
        var lastValue = strEntryValues[0].toFloat()
        for (i in 1 until strEntryValues.size) {
            val thisValue = strEntryValues[i].toFloat()
            if (value < lastValue + (thisValue - lastValue) * .5f) {
                return i - 1
            }
            lastValue = thisValue
        }
        return strEntryValues.size - 1
    }

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

        val configDiff = configuration.diff(this.configuration)
        this.configuration.setTo(configuration)

        if (configDiff and ActivityInfo.CONFIG_FONT_SCALE != 0) {
            title.post {
                title.setTextAppearance(R.style.TextAppearance_Dialog_Title)
                doneButton.setTextAppearance(R.style.Widget_Dialog_Button)
            }
        }
    }
    }
}
}
+7 −0
Original line number Original line Diff line number Diff line
@@ -150,6 +150,13 @@ public class SeekBarWithIconButtonsView extends LinearLayout {
        setIconViewAndFrameEnabled(mIconEnd, progress < mSeekbar.getMax());
        setIconViewAndFrameEnabled(mIconEnd, progress < mSeekbar.getMax());
    }
    }


    /**
     * Sets max to the seekbar in the layout.
     */
    public void setMax(int max) {
        mSeekbar.setMax(max);
    }

    /**
    /**
     * Sets progress to the seekbar in the layout.
     * Sets progress to the seekbar in the layout.
     * If the progress is smaller than or equals to 0, the IconStart will be disabled. If the
     * If the progress is smaller than or equals to 0, the IconStart will be disabled. If the
+4 −2
Original line number Original line Diff line number Diff line
@@ -35,6 +35,7 @@ import com.android.systemui.qs.QSHost
import com.android.systemui.qs.logging.QSLogger
import com.android.systemui.qs.logging.QSLogger
import com.android.systemui.qs.tileimpl.QSTileImpl
import com.android.systemui.qs.tileimpl.QSTileImpl
import com.android.systemui.statusbar.phone.SystemUIDialog
import com.android.systemui.statusbar.phone.SystemUIDialog
import com.android.systemui.util.settings.SystemSettings
import javax.inject.Inject
import javax.inject.Inject


class FontScalingTile
class FontScalingTile
@@ -48,7 +49,8 @@ constructor(
    statusBarStateController: StatusBarStateController,
    statusBarStateController: StatusBarStateController,
    activityStarter: ActivityStarter,
    activityStarter: ActivityStarter,
    qsLogger: QSLogger,
    qsLogger: QSLogger,
    private val dialogLaunchAnimator: DialogLaunchAnimator
    private val dialogLaunchAnimator: DialogLaunchAnimator,
    private val systemSettings: SystemSettings
) :
) :
    QSTileImpl<QSTile.State?>(
    QSTileImpl<QSTile.State?>(
        host,
        host,
@@ -74,7 +76,7 @@ constructor(


    override fun handleClick(view: View?) {
    override fun handleClick(view: View?) {
        mUiHandler.post {
        mUiHandler.post {
            val dialog: SystemUIDialog = FontScalingDialog(mContext)
            val dialog: SystemUIDialog = FontScalingDialog(mContext, systemSettings)
            if (view != null) {
            if (view != null) {
                dialogLaunchAnimator.showFromView(
                dialogLaunchAnimator.showFromView(
                    dialog,
                    dialog,
+107 −0
Original line number Original line Diff line number Diff line
/*
 * Copyright (C) 2023 The Android Open Source Project
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
package com.android.systemui.accessibility.fontscaling

import android.os.Handler
import android.provider.Settings
import android.testing.AndroidTestingRunner
import android.testing.TestableLooper
import android.widget.ImageView
import android.widget.SeekBar
import androidx.test.filters.SmallTest
import com.android.systemui.R
import com.android.systemui.SysuiTestCase
import com.android.systemui.common.ui.view.SeekBarWithIconButtonsView
import com.android.systemui.util.settings.FakeSettings
import com.android.systemui.util.settings.SystemSettings
import com.google.common.truth.Truth.assertThat
import org.junit.Before
import org.junit.Test
import org.junit.runner.RunWith

/** Tests for [FontScalingDialog]. */
@SmallTest
@RunWith(AndroidTestingRunner::class)
@TestableLooper.RunWithLooper(setAsMainLooper = true)
class FontScalingDialogTest : SysuiTestCase() {
    private lateinit var fontScalingDialog: FontScalingDialog
    private lateinit var systemSettings: SystemSettings
    private val fontSizeValueArray: Array<String> =
        mContext
            .getResources()
            .getStringArray(com.android.settingslib.R.array.entryvalues_font_size)

    @Before
    fun setUp() {
        val mainHandler = Handler(TestableLooper.get(this).getLooper())
        systemSettings = FakeSettings()
        fontScalingDialog = FontScalingDialog(mContext, systemSettings as FakeSettings)
    }

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

        val seekBar: SeekBar = fontScalingDialog.findViewById<SeekBar>(R.id.seekbar)!!
        val progress: Int = seekBar.getProgress()
        val currentScale = systemSettings.getFloat(Settings.System.FONT_SCALE, /* def = */ 1.0f)

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

        fontScalingDialog.dismiss()
    }

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

        val iconEnd: ImageView = fontScalingDialog.findViewById(R.id.icon_end)!!
        val seekBarWithIconButtonsView: SeekBarWithIconButtonsView =
            fontScalingDialog.findViewById(R.id.font_scaling_slider)!!
        val seekBar: SeekBar = fontScalingDialog.findViewById(R.id.seekbar)!!

        seekBarWithIconButtonsView.setProgress(0)

        iconEnd.performClick()

        val currentScale = systemSettings.getFloat(Settings.System.FONT_SCALE, /* def = */ 1.0f)
        assertThat(seekBar.getProgress()).isEqualTo(1)
        assertThat(currentScale).isEqualTo(fontSizeValueArray[1].toFloat())

        fontScalingDialog.dismiss()
    }

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

        val iconStart: ImageView = fontScalingDialog.findViewById(R.id.icon_start)!!
        val seekBarWithIconButtonsView: SeekBarWithIconButtonsView =
            fontScalingDialog.findViewById(R.id.font_scaling_slider)!!
        val seekBar: SeekBar = fontScalingDialog.findViewById(R.id.seekbar)!!

        seekBarWithIconButtonsView.setProgress(fontSizeValueArray.size - 1)

        iconStart.performClick()

        val currentScale = systemSettings.getFloat(Settings.System.FONT_SCALE, /* def = */ 1.0f)
        assertThat(seekBar.getProgress()).isEqualTo(fontSizeValueArray.size - 2)
        assertThat(currentScale)
            .isEqualTo(fontSizeValueArray[fontSizeValueArray.size - 2].toFloat())

        fontScalingDialog.dismiss()
    }
}
+3 −1
Original line number Original line Diff line number Diff line
@@ -28,6 +28,7 @@ import com.android.systemui.plugins.statusbar.StatusBarStateController
import com.android.systemui.qs.QSTileHost
import com.android.systemui.qs.QSTileHost
import com.android.systemui.qs.logging.QSLogger
import com.android.systemui.qs.logging.QSLogger
import com.android.systemui.qs.tiles.FontScalingTile
import com.android.systemui.qs.tiles.FontScalingTile
import com.android.systemui.util.settings.FakeSettings
import com.google.common.truth.Truth.assertThat
import com.google.common.truth.Truth.assertThat
import org.junit.Before
import org.junit.Before
import org.junit.Test
import org.junit.Test
@@ -65,7 +66,8 @@ class FontScalingTileTest : SysuiTestCase() {
                statusBarStateController,
                statusBarStateController,
                activityStarter,
                activityStarter,
                qsLogger,
                qsLogger,
                dialogLaunchAnimator
                dialogLaunchAnimator,
                FakeSettings()
            )
            )
        fontScalingTile.initialize()
        fontScalingTile.initialize()
    }
    }