From 56ddf1ffa5b7bd3b8d4b8b7d5c68d7e0e99e5e15 Mon Sep 17 00:00:00 2001 From: Svetoslav Ganov Date: Sat, 5 Oct 2013 19:55:49 -0700 Subject: [PATCH] Polish print dialog accessibility. bug:10983508 Change-Id: I7391e06b661caac18d04ae279639ff447701f151 --- .../res/menu/select_printer_activity.xml | 4 +- packages/PrintSpooler/res/values/strings.xml | 18 +++++++ .../printspooler/PrintJobConfigActivity.java | 2 + .../printspooler/SelectPrinterFragment.java | 53 +++++++++++++++++++ 4 files changed, 75 insertions(+), 2 deletions(-) diff --git a/packages/PrintSpooler/res/menu/select_printer_activity.xml b/packages/PrintSpooler/res/menu/select_printer_activity.xml index d4ce1cf17cb58..ee62f9f5e2752 100644 --- a/packages/PrintSpooler/res/menu/select_printer_activity.xml +++ b/packages/PrintSpooler/res/menu/select_printer_activity.xml @@ -21,14 +21,14 @@ android:title="@string/search" android:icon="@*android:drawable/ic_menu_search_holo_light" android:actionViewClass="android.widget.SearchView" - android:showAsAction="ifRoom" + android:showAsAction="ifRoom|collapseActionView" android:alphabeticShortcut="f" android:imeOptions="actionSearch"> diff --git a/packages/PrintSpooler/res/values/strings.xml b/packages/PrintSpooler/res/values/strings.xml index 7e1708ed90193..c82a20ee3497b 100644 --- a/packages/PrintSpooler/res/values/strings.xml +++ b/packages/PrintSpooler/res/values/strings.xml @@ -67,6 +67,9 @@ All printers… + + Print dialog + @@ -78,6 +81,21 @@ Add service + + Search box shown + + + Search box hidden + + + Add printer + + + + %1$s printer found + %1$s printers found + + diff --git a/packages/PrintSpooler/src/com/android/printspooler/PrintJobConfigActivity.java b/packages/PrintSpooler/src/com/android/printspooler/PrintJobConfigActivity.java index f50cdfdb57864..7f9be6ce702a5 100644 --- a/packages/PrintSpooler/src/com/android/printspooler/PrintJobConfigActivity.java +++ b/packages/PrintSpooler/src/com/android/printspooler/PrintJobConfigActivity.java @@ -178,6 +178,8 @@ public class PrintJobConfigActivity extends Activity { protected void onCreate(Bundle bundle) { super.onCreate(bundle); + setTitle(R.string.print_dialog); + Bundle extras = getIntent().getExtras(); PrintJobInfo printJob = extras.getParcelable(EXTRA_PRINT_JOB); diff --git a/packages/PrintSpooler/src/com/android/printspooler/SelectPrinterFragment.java b/packages/PrintSpooler/src/com/android/printspooler/SelectPrinterFragment.java index 62673b246046b..b8a9417a2faa7 100644 --- a/packages/PrintSpooler/src/com/android/printspooler/SelectPrinterFragment.java +++ b/packages/PrintSpooler/src/com/android/printspooler/SelectPrinterFragment.java @@ -82,6 +82,8 @@ public final class SelectPrinterFragment extends ListFragment { private final ArrayList mAddPrinterServices = new ArrayList(); + private AnnounceFilterResult mAnnounceFilterResult; + public static interface OnPrinterSelectedListener { public void onPrinterSelected(PrinterId printerId); } @@ -133,6 +135,18 @@ public final class SelectPrinterFragment extends ListFragment { return true; } }); + searchView.addOnAttachStateChangeListener(new View.OnAttachStateChangeListener() { + @Override + public void onViewAttachedToWindow(View view) { + view.announceForAccessibility(getString( + R.string.print_search_box_shown_utterance)); + } + @Override + public void onViewDetachedFromWindow(View view) { + view.announceForAccessibility(getString( + R.string.print_search_box_hidden_utterance)); + } + }); if (mAddPrinterServices.isEmpty()) { menu.removeItem(R.id.action_add_printer); @@ -245,6 +259,13 @@ public final class SelectPrinterFragment extends ListFragment { } } + private void announceSearchResult() { + if (mAnnounceFilterResult == null) { + mAnnounceFilterResult = new AnnounceFilterResult(); + } + mAnnounceFilterResult.post(); + } + public static class AddPrinterAlertDialogFragment extends DialogFragment { private String mAddPrintServiceItem; @@ -355,7 +376,9 @@ public final class SelectPrinterFragment extends ListFragment { @Override @SuppressWarnings("unchecked") protected void publishResults(CharSequence constraint, FilterResults results) { + final boolean resultCountChanged; synchronized (mLock) { + final int oldPrinterCount = mFilteredPrinters.size(); mLastSearchString = constraint; mFilteredPrinters.clear(); if (results == null) { @@ -364,6 +387,10 @@ public final class SelectPrinterFragment extends ListFragment { List printers = (List) results.values; mFilteredPrinters.addAll(printers); } + resultCountChanged = (oldPrinterCount != mFilteredPrinters.size()); + } + if (resultCountChanged) { + announceSearchResult(); } notifyDataSetChanged(); } @@ -480,4 +507,30 @@ public final class SelectPrinterFragment extends ListFragment { notifyDataSetInvalidated(); } } + + private final class AnnounceFilterResult implements Runnable { + private static final int SEARCH_RESULT_ANNOUNCEMENT_DELAY = 1000; // 1 sec + + public void post() { + remove(); + getListView().postDelayed(this, SEARCH_RESULT_ANNOUNCEMENT_DELAY); + } + + public void remove() { + getListView().removeCallbacks(this); + } + + @Override + public void run() { + final int count = getListView().getAdapter().getCount(); + final String text; + if (count <= 0) { + text = getString(R.string.print_no_printers); + } else { + text = getActivity().getResources().getQuantityString( + R.plurals.print_search_result_count_utterance, count, count); + } + getListView().announceForAccessibility(text); + } + } }