From 508567edd8fb10f15e7720e0d2a029feca3412b7 Mon Sep 17 00:00:00 2001 From: danielwbhuang Date: Fri, 21 Feb 2025 15:01:28 +0800 Subject: [PATCH] Talkback shouldn't announce in list numbers. These pages shouldn't announce in list numbers when use Talkback. 1. TemperatureUnitFragment 2. MeasurementSystemItemFragment 3. FirstDayOfWeekItemFragment Bug: 385671217 Flag: EXEMPT bug fix Test: test on real devices Change-Id: Ib691947c3b34cd59e29ed2fd173a77633c5115b5 --- .../FirstDayOfWeekItemFragment.java | 42 +++++++++++++++++++ .../MeasurementSystemItemFragment.java | 42 +++++++++++++++++++ .../TemperatureUnitFragment.java | 42 +++++++++++++++++++ 3 files changed, 126 insertions(+) diff --git a/src/com/android/settings/regionalpreferences/FirstDayOfWeekItemFragment.java b/src/com/android/settings/regionalpreferences/FirstDayOfWeekItemFragment.java index a90edf4a8fb..41c627be7df 100644 --- a/src/com/android/settings/regionalpreferences/FirstDayOfWeekItemFragment.java +++ b/src/com/android/settings/regionalpreferences/FirstDayOfWeekItemFragment.java @@ -18,9 +18,18 @@ package com.android.settings.regionalpreferences; import android.app.settings.SettingsEnums; import android.content.Context; +import android.os.Bundle; import android.provider.Settings; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; import androidx.annotation.NonNull; +import androidx.annotation.Nullable; +import androidx.core.view.accessibility.AccessibilityNodeInfoCompat; +import androidx.core.view.accessibility.AccessibilityNodeInfoCompat.CollectionInfoCompat; +import androidx.preference.PreferenceRecyclerViewAccessibilityDelegate; +import androidx.recyclerview.widget.RecyclerView; import com.android.settings.R; import com.android.settings.dashboard.DashboardFragment; @@ -31,6 +40,7 @@ import com.android.settingslib.core.instrumentation.MetricsFeatureProvider; import com.android.settingslib.search.SearchIndexable; import java.util.ArrayList; +import java.util.Collection; import java.util.List; /** Main fragment to display first day of week. */ @@ -54,6 +64,38 @@ public class FirstDayOfWeekItemFragment extends DashboardFragment { } } + @NonNull + @Override + public RecyclerView onCreateRecyclerView( + @NonNull LayoutInflater inflater, @NonNull ViewGroup parent, + @Nullable Bundle savedInstanceState) { + + // Talkback shouldn't announce in list numbers + final RecyclerView recyclerView = + super.onCreateRecyclerView(inflater, parent, savedInstanceState); + recyclerView.setAccessibilityDelegateCompat( + new PreferenceRecyclerViewAccessibilityDelegate(recyclerView) { + @Override + public void onInitializeAccessibilityNodeInfo(@NonNull View host, + @NonNull AccessibilityNodeInfoCompat info) { + super.onInitializeAccessibilityNodeInfo(host, info); + int availableCount = (int) getPreferenceControllers() + .stream() + .flatMap(Collection::stream) + .filter(AbstractPreferenceController::isAvailable) + .count(); + info.setCollectionInfo( + CollectionInfoCompat.obtain( + /*rowCount=*/availableCount, + /*columnCount=*/1, + /*hierarchical=*/false, + CollectionInfoCompat.SELECTION_MODE_SINGLE) + ); + } + }); + return recyclerView; + } + @Override protected int getPreferenceScreenResId() { return R.xml.regional_preferences_first_day_of_week; diff --git a/src/com/android/settings/regionalpreferences/MeasurementSystemItemFragment.java b/src/com/android/settings/regionalpreferences/MeasurementSystemItemFragment.java index 1d4a1d43e90..1ade0e3d692 100644 --- a/src/com/android/settings/regionalpreferences/MeasurementSystemItemFragment.java +++ b/src/com/android/settings/regionalpreferences/MeasurementSystemItemFragment.java @@ -18,9 +18,18 @@ package com.android.settings.regionalpreferences; import android.app.settings.SettingsEnums; import android.content.Context; +import android.os.Bundle; import android.provider.Settings; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; import androidx.annotation.NonNull; +import androidx.annotation.Nullable; +import androidx.core.view.accessibility.AccessibilityNodeInfoCompat; +import androidx.core.view.accessibility.AccessibilityNodeInfoCompat.CollectionInfoCompat; +import androidx.preference.PreferenceRecyclerViewAccessibilityDelegate; +import androidx.recyclerview.widget.RecyclerView; import com.android.settings.R; import com.android.settings.dashboard.DashboardFragment; @@ -32,6 +41,7 @@ import com.android.settingslib.core.instrumentation.MetricsFeatureProvider; import com.android.settingslib.search.SearchIndexable; import java.util.ArrayList; +import java.util.Collection; import java.util.List; /** Main fragment to display measurement system. */ @@ -55,6 +65,38 @@ public class MeasurementSystemItemFragment extends DashboardFragment { } } + @NonNull + @Override + public RecyclerView onCreateRecyclerView( + @NonNull LayoutInflater inflater, @NonNull ViewGroup parent, + @Nullable Bundle savedInstanceState) { + + // Talkback shouldn't announce in list numbers + final RecyclerView recyclerView = + super.onCreateRecyclerView(inflater, parent, savedInstanceState); + recyclerView.setAccessibilityDelegateCompat( + new PreferenceRecyclerViewAccessibilityDelegate(recyclerView) { + @Override + public void onInitializeAccessibilityNodeInfo(@NonNull View host, + @NonNull AccessibilityNodeInfoCompat info) { + super.onInitializeAccessibilityNodeInfo(host, info); + int availableCount = (int) getPreferenceControllers() + .stream() + .flatMap(Collection::stream) + .filter(AbstractPreferenceController::isAvailable) + .count(); + info.setCollectionInfo( + CollectionInfoCompat.obtain( + /*rowCount=*/availableCount, + /*columnCount=*/1, + /*hierarchical=*/false, + CollectionInfoCompat.SELECTION_MODE_SINGLE) + ); + } + }); + return recyclerView; + } + @Override protected int getPreferenceScreenResId() { return R.xml.regional_preferences_measurement_system; diff --git a/src/com/android/settings/regionalpreferences/TemperatureUnitFragment.java b/src/com/android/settings/regionalpreferences/TemperatureUnitFragment.java index c10323fbd30..83c1530ae63 100644 --- a/src/com/android/settings/regionalpreferences/TemperatureUnitFragment.java +++ b/src/com/android/settings/regionalpreferences/TemperatureUnitFragment.java @@ -18,9 +18,18 @@ package com.android.settings.regionalpreferences; import android.app.settings.SettingsEnums; import android.content.Context; +import android.os.Bundle; import android.provider.Settings; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; import androidx.annotation.NonNull; +import androidx.annotation.Nullable; +import androidx.core.view.accessibility.AccessibilityNodeInfoCompat; +import androidx.core.view.accessibility.AccessibilityNodeInfoCompat.CollectionInfoCompat; +import androidx.preference.PreferenceRecyclerViewAccessibilityDelegate; +import androidx.recyclerview.widget.RecyclerView; import com.android.settings.R; import com.android.settings.dashboard.DashboardFragment; @@ -31,6 +40,7 @@ import com.android.settingslib.core.instrumentation.MetricsFeatureProvider; import com.android.settingslib.search.SearchIndexable; import java.util.ArrayList; +import java.util.Collection; import java.util.List; /** Main fragment to display temperature preferences. */ @@ -54,6 +64,38 @@ public class TemperatureUnitFragment extends DashboardFragment { } } + @NonNull + @Override + public RecyclerView onCreateRecyclerView( + @NonNull LayoutInflater inflater, @NonNull ViewGroup parent, + @Nullable Bundle savedInstanceState) { + + // Talkback shouldn't announce in list numbers + final RecyclerView recyclerView = + super.onCreateRecyclerView(inflater, parent, savedInstanceState); + recyclerView.setAccessibilityDelegateCompat( + new PreferenceRecyclerViewAccessibilityDelegate(recyclerView) { + @Override + public void onInitializeAccessibilityNodeInfo(@NonNull View host, + @NonNull AccessibilityNodeInfoCompat info) { + super.onInitializeAccessibilityNodeInfo(host, info); + int availableCount = (int) getPreferenceControllers() + .stream() + .flatMap(Collection::stream) + .filter(AbstractPreferenceController::isAvailable) + .count(); + info.setCollectionInfo( + CollectionInfoCompat.obtain( + /*rowCount=*/availableCount, + /*columnCount=*/1, + /*hierarchical=*/false, + CollectionInfoCompat.SELECTION_MODE_SINGLE) + ); + } + }); + return recyclerView; + } + @Override protected int getPreferenceScreenResId() { return R.xml.regional_preferences_temperature;