diff --git a/packages/SystemUI/res/layout/font_scaling_dialog.xml b/packages/SystemUI/res/layout/font_scaling_dialog.xml new file mode 100644 index 0000000000000..27c1e9d03df91 --- /dev/null +++ b/packages/SystemUI/res/layout/font_scaling_dialog.xml @@ -0,0 +1,27 @@ + + + \ No newline at end of file diff --git a/packages/SystemUI/res/values/strings.xml b/packages/SystemUI/res/values/strings.xml index 61a46f7bdfbdc..e020a0092015f 100644 --- a/packages/SystemUI/res/values/strings.xml +++ b/packages/SystemUI/res/values/strings.xml @@ -2183,6 +2183,14 @@ Standby + + + Font Size + + Make smaller + + Make larger + Magnification Window diff --git a/packages/SystemUI/src/com/android/systemui/accessibility/fontscaling/FontScalingDialog.kt b/packages/SystemUI/src/com/android/systemui/accessibility/fontscaling/FontScalingDialog.kt new file mode 100644 index 0000000000000..f521839be50b0 --- /dev/null +++ b/packages/SystemUI/src/com/android/systemui/accessibility/fontscaling/FontScalingDialog.kt @@ -0,0 +1,36 @@ +/* + * 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.content.Context +import android.os.Bundle +import android.view.LayoutInflater +import com.android.systemui.R +import com.android.systemui.statusbar.phone.SystemUIDialog + +/** The Dialog that contains a seekbar for changing the font size. */ +class FontScalingDialog(context: Context) : SystemUIDialog(context) { + override fun onCreate(savedInstanceState: Bundle?) { + setTitle(R.string.font_scaling_dialog_title) + setView(LayoutInflater.from(context).inflate(R.layout.font_scaling_dialog, null)) + setPositiveButton( + R.string.quick_settings_done, + /* onClick = */ null, + /* dismissOnClick = */ true + ) + super.onCreate(savedInstanceState) + } +} diff --git a/packages/SystemUI/src/com/android/systemui/qs/tiles/FontScalingTile.kt b/packages/SystemUI/src/com/android/systemui/qs/tiles/FontScalingTile.kt index 4d8f89edd969e..ce5e4055e840e 100644 --- a/packages/SystemUI/src/com/android/systemui/qs/tiles/FontScalingTile.kt +++ b/packages/SystemUI/src/com/android/systemui/qs/tiles/FontScalingTile.kt @@ -19,8 +19,12 @@ import android.content.Intent import android.os.Handler import android.os.Looper import android.view.View +import com.android.internal.jank.InteractionJankMonitor import com.android.internal.logging.MetricsLogger import com.android.systemui.R +import com.android.systemui.accessibility.fontscaling.FontScalingDialog +import com.android.systemui.animation.DialogCuj +import com.android.systemui.animation.DialogLaunchAnimator import com.android.systemui.dagger.qualifiers.Background import com.android.systemui.dagger.qualifiers.Main import com.android.systemui.plugins.ActivityStarter @@ -30,6 +34,7 @@ import com.android.systemui.plugins.statusbar.StatusBarStateController import com.android.systemui.qs.QSHost import com.android.systemui.qs.logging.QSLogger import com.android.systemui.qs.tileimpl.QSTileImpl +import com.android.systemui.statusbar.phone.SystemUIDialog import javax.inject.Inject class FontScalingTile @@ -42,7 +47,8 @@ constructor( metricsLogger: MetricsLogger, statusBarStateController: StatusBarStateController, activityStarter: ActivityStarter, - qsLogger: QSLogger + qsLogger: QSLogger, + private val dialogLaunchAnimator: DialogLaunchAnimator ) : QSTileImpl( host, @@ -54,7 +60,7 @@ constructor( activityStarter, qsLogger ) { - private val mIcon = ResourceIcon.get(R.drawable.ic_qs_font_scaling) + private val icon = ResourceIcon.get(R.drawable.ic_qs_font_scaling) override fun isAvailable(): Boolean { return false @@ -66,11 +72,24 @@ constructor( return state } - override fun handleClick(view: View?) {} + override fun handleClick(view: View?) { + mUiHandler.post { + val dialog: SystemUIDialog = FontScalingDialog(mContext) + if (view != null) { + dialogLaunchAnimator.showFromView( + dialog, + view, + DialogCuj(InteractionJankMonitor.CUJ_SHADE_DIALOG_OPEN, INTERACTION_JANK_TAG) + ) + } else { + dialog.show() + } + } + } override fun handleUpdateState(state: QSTile.State?, arg: Any?) { state?.label = mContext.getString(R.string.quick_settings_font_scaling_label) - state?.icon = mIcon + state?.icon = icon } override fun getLongClickIntent(): Intent? { @@ -80,4 +99,8 @@ constructor( override fun getTileLabel(): CharSequence { return mContext.getString(R.string.quick_settings_font_scaling_label) } + + companion object { + private const val INTERACTION_JANK_TAG = "font_scaling" + } } diff --git a/packages/SystemUI/tests/src/com/android/systemui/qs/tiles/dialog/FontScalingTileTest.kt b/packages/SystemUI/tests/src/com/android/systemui/qs/tiles/dialog/FontScalingTileTest.kt new file mode 100644 index 0000000000000..f97ccab5fc1fe --- /dev/null +++ b/packages/SystemUI/tests/src/com/android/systemui/qs/tiles/dialog/FontScalingTileTest.kt @@ -0,0 +1,79 @@ +/* + * 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.qs.tiles.dialog + +import android.os.Handler +import android.testing.AndroidTestingRunner +import android.testing.TestableLooper +import androidx.test.filters.SmallTest +import com.android.internal.logging.MetricsLogger +import com.android.systemui.SysuiTestCase +import com.android.systemui.animation.DialogLaunchAnimator +import com.android.systemui.classifier.FalsingManagerFake +import com.android.systemui.plugins.ActivityStarter +import com.android.systemui.plugins.statusbar.StatusBarStateController +import com.android.systemui.qs.QSTileHost +import com.android.systemui.qs.logging.QSLogger +import com.android.systemui.qs.tiles.FontScalingTile +import com.google.common.truth.Truth.assertThat +import org.junit.Before +import org.junit.Test +import org.junit.runner.RunWith +import org.mockito.Mock +import org.mockito.Mockito.`when` +import org.mockito.MockitoAnnotations + +@RunWith(AndroidTestingRunner::class) +@TestableLooper.RunWithLooper(setAsMainLooper = true) +@SmallTest +class FontScalingTileTest : SysuiTestCase() { + @Mock private lateinit var qsHost: QSTileHost + @Mock private lateinit var metricsLogger: MetricsLogger + @Mock private lateinit var statusBarStateController: StatusBarStateController + @Mock private lateinit var activityStarter: ActivityStarter + @Mock private lateinit var qsLogger: QSLogger + @Mock private lateinit var dialogLaunchAnimator: DialogLaunchAnimator + + private lateinit var testableLooper: TestableLooper + private lateinit var fontScalingTile: FontScalingTile + + @Before + fun setUp() { + MockitoAnnotations.initMocks(this) + testableLooper = TestableLooper.get(this) + `when`(qsHost.getContext()).thenReturn(mContext) + fontScalingTile = + FontScalingTile( + qsHost, + testableLooper.looper, + Handler(testableLooper.looper), + FalsingManagerFake(), + metricsLogger, + statusBarStateController, + activityStarter, + qsLogger, + dialogLaunchAnimator + ) + fontScalingTile.initialize() + } + + @Test + fun isNotAvailable_whenNotSupportedDevice_returnsFalse() { + val isAvailable = fontScalingTile.isAvailable() + + assertThat(isAvailable).isFalse() + } +}