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;