Loading res/values/strings.xml +12 −0 Original line number Diff line number Diff line Loading @@ -653,4 +653,16 @@ [CHAR LIMIT=128]. --> <string name="custom_clocks_label">Custom Clocks</string> <!-- Accessibility label for the Clock face width label. --> <string name="clock_face_width">Clock face width</string> <!-- Accessibility announcement template for a numerical range. %1$d is the minimum value, %2$d is the maximum value. Example: "range from 1 to 7". [CHAR LIMIT=none] --> <string name="range_announcement_template">range from %1$d to %2$d</string> </resources> src/com/android/wallpaper/customization/ui/binder/ClockFloatingSheetBinder.kt +57 −1 Original line number Diff line number Diff line Loading @@ -23,10 +23,12 @@ import android.content.Context import android.view.View import android.view.ViewGroup import android.view.ViewTreeObserver.OnGlobalLayoutListener import android.view.accessibility.AccessibilityNodeInfo import android.widget.ImageView import android.widget.TextView import androidx.core.content.ContextCompat import androidx.core.graphics.drawable.DrawableCompat import androidx.core.view.accessibility.AccessibilityNodeInfoCompat import androidx.core.view.get import androidx.core.view.isEmpty import androidx.core.view.isVisible Loading Loading @@ -137,7 +139,61 @@ object ClockFloatingSheetBinder { val axisPresetSlider: Slider = clockStyleContent.requireViewById(R.id.clock_axis_preset_slider) // Clock color // Setting content description for the clock face width slider val sliderLabel = appContext.getString(R.string.clock_face_width) axisPresetSlider.contentDescription = sliderLabel axisPresetSlider.setAccessibilityDelegate( object : View.AccessibilityDelegate() { override fun onInitializeAccessibilityNodeInfo( host: View, info: AccessibilityNodeInfo, ) { super.onInitializeAccessibilityNodeInfo(host, info) val infoCompat = AccessibilityNodeInfoCompat.wrap(info) if (host !is Slider) return // increased these values by 1.0 in order to announce for content description val actualMin = host.valueFrom + 1.0f val actualMax = host.valueTo + 1.0f val currentValueActual = host.value + 1.0f val normalizedPosition = if (actualMax - actualMin == 0f) { 0f } else { ((currentValueActual - actualMin) / (actualMax - actualMin)).coerceIn( 0f, 1f, ) } val mappedValueFloat = actualMin + normalizedPosition * (actualMax - actualMin) val mappedValueInt = Math.round(mappedValueFloat) val conceptualMinInt = actualMin.toInt() val conceptualMaxInt = actualMax.toInt() // this is a workaround that is needed because talkback isn't announcing the // range using RangeInfo on the material slider. val hardcodedRangeText = appContext.getString( R.string.range_announcement_template, conceptualMinInt, conceptualMaxInt, ) val customRangeInfo = AccessibilityNodeInfoCompat.RangeInfoCompat.obtain( AccessibilityNodeInfoCompat.RangeInfoCompat.RANGE_TYPE_INT, actualMin, actualMax, mappedValueInt.toFloat(), ) infoCompat.rangeInfo = customRangeInfo infoCompat.text = null infoCompat.stateDescription = "$mappedValueInt, $hardcodedRangeText" } } ) val clockColorContent: View = view.requireViewById(R.id.clock_floating_sheet_color_content) val clockColorAdapter = Loading Loading
res/values/strings.xml +12 −0 Original line number Diff line number Diff line Loading @@ -653,4 +653,16 @@ [CHAR LIMIT=128]. --> <string name="custom_clocks_label">Custom Clocks</string> <!-- Accessibility label for the Clock face width label. --> <string name="clock_face_width">Clock face width</string> <!-- Accessibility announcement template for a numerical range. %1$d is the minimum value, %2$d is the maximum value. Example: "range from 1 to 7". [CHAR LIMIT=none] --> <string name="range_announcement_template">range from %1$d to %2$d</string> </resources>
src/com/android/wallpaper/customization/ui/binder/ClockFloatingSheetBinder.kt +57 −1 Original line number Diff line number Diff line Loading @@ -23,10 +23,12 @@ import android.content.Context import android.view.View import android.view.ViewGroup import android.view.ViewTreeObserver.OnGlobalLayoutListener import android.view.accessibility.AccessibilityNodeInfo import android.widget.ImageView import android.widget.TextView import androidx.core.content.ContextCompat import androidx.core.graphics.drawable.DrawableCompat import androidx.core.view.accessibility.AccessibilityNodeInfoCompat import androidx.core.view.get import androidx.core.view.isEmpty import androidx.core.view.isVisible Loading Loading @@ -137,7 +139,61 @@ object ClockFloatingSheetBinder { val axisPresetSlider: Slider = clockStyleContent.requireViewById(R.id.clock_axis_preset_slider) // Clock color // Setting content description for the clock face width slider val sliderLabel = appContext.getString(R.string.clock_face_width) axisPresetSlider.contentDescription = sliderLabel axisPresetSlider.setAccessibilityDelegate( object : View.AccessibilityDelegate() { override fun onInitializeAccessibilityNodeInfo( host: View, info: AccessibilityNodeInfo, ) { super.onInitializeAccessibilityNodeInfo(host, info) val infoCompat = AccessibilityNodeInfoCompat.wrap(info) if (host !is Slider) return // increased these values by 1.0 in order to announce for content description val actualMin = host.valueFrom + 1.0f val actualMax = host.valueTo + 1.0f val currentValueActual = host.value + 1.0f val normalizedPosition = if (actualMax - actualMin == 0f) { 0f } else { ((currentValueActual - actualMin) / (actualMax - actualMin)).coerceIn( 0f, 1f, ) } val mappedValueFloat = actualMin + normalizedPosition * (actualMax - actualMin) val mappedValueInt = Math.round(mappedValueFloat) val conceptualMinInt = actualMin.toInt() val conceptualMaxInt = actualMax.toInt() // this is a workaround that is needed because talkback isn't announcing the // range using RangeInfo on the material slider. val hardcodedRangeText = appContext.getString( R.string.range_announcement_template, conceptualMinInt, conceptualMaxInt, ) val customRangeInfo = AccessibilityNodeInfoCompat.RangeInfoCompat.obtain( AccessibilityNodeInfoCompat.RangeInfoCompat.RANGE_TYPE_INT, actualMin, actualMax, mappedValueInt.toFloat(), ) infoCompat.rangeInfo = customRangeInfo infoCompat.text = null infoCompat.stateDescription = "$mappedValueInt, $hardcodedRangeText" } } ) val clockColorContent: View = view.requireViewById(R.id.clock_floating_sheet_color_content) val clockColorAdapter = Loading