From 76f31297ea8732bb20e7c0ed68190797fcb2efdd Mon Sep 17 00:00:00 2001 From: Garvita Jain Date: Sun, 22 Dec 2024 14:41:44 +0000 Subject: [PATCH] Fix talkback speech for storage size unit 'byte' Formatter#formatBytes returns file size in units B/KB/MB/GB. Talkback cannot handle unit size B. Use TtsSpan to return a CharSequence for Talkback to announce this correctly in the Storage Settings page. BUG: 317747133 Test: manual - open Storage settings page with Talkback feature on Flag: EXEMPT bugfix Change-Id: I65d0abb5a9ea358c116f84a85f0e42187998fd17 --- .../deviceinfo/storage/StorageUtils.java | 18 ++++++++++++++++-- 1 file changed, 16 insertions(+), 2 deletions(-) diff --git a/src/com/android/settings/deviceinfo/storage/StorageUtils.java b/src/com/android/settings/deviceinfo/storage/StorageUtils.java index 5c4a4b40f2a..5bf66a69a4a 100644 --- a/src/com/android/settings/deviceinfo/storage/StorageUtils.java +++ b/src/com/android/settings/deviceinfo/storage/StorageUtils.java @@ -28,12 +28,15 @@ import android.os.storage.DiskInfo; import android.os.storage.StorageManager; import android.os.storage.VolumeInfo; import android.os.storage.VolumeRecord; +import android.text.SpannableString; import android.text.TextUtils; import android.text.format.Formatter; +import android.text.style.TtsSpan; import android.util.Log; import android.widget.Toast; import androidx.annotation.NonNull; +import androidx.annotation.Nullable; import androidx.appcompat.app.AlertDialog; import androidx.fragment.app.Fragment; @@ -122,11 +125,22 @@ public class StorageUtils { } /** Returns size label of changing units. (e.g., 1kB, 2MB, 3GB) */ - public static String getStorageSizeLabel(Context context, long bytes) { + public static @Nullable CharSequence getStorageSizeLabel(@NonNull Context context, long bytes) { final Formatter.BytesResult result = Formatter.formatBytes(context.getResources(), bytes, Formatter.FLAG_SHORTER); - return TextUtils.expandTemplate(context.getText(R.string.storage_size_large), + String storageSize = TextUtils.expandTemplate(context.getText(R.string.storage_size_large), result.value, result.units).toString(); + + // If storage size is less than 1KB, use TtsSpan to add additional metadata for + // text-to-speech engines. + if (bytes < 1024) { + TtsSpan ttsSpan = new TtsSpan.MeasureBuilder().setNumber(bytes).setUnit("byte").build(); + SpannableString phraseSpannable = new SpannableString(storageSize); + phraseSpannable.setSpan(ttsSpan, 0, phraseSpannable.length(), 0); + return phraseSpannable; + } + + return storageSize; } /** An AsyncTask to unmount a specified volume. */