OSDN Git Service

Fix 2241848 - 3D apps folder does not send accessibility events
authorJoe Onorato <joeo@android.com>
Wed, 11 Nov 2009 22:52:11 +0000 (14:52 -0800)
committerJoe Onorato <joeo@android.com>
Wed, 11 Nov 2009 22:52:11 +0000 (14:52 -0800)
It's now sending them.  The beeping and vibrating accessibility things
work, but we only have prebuilts for the speech one and it's not saying
anything and I can't debug it, so this will have to do.

res/values/strings.xml
src/com/android/launcher2/AllAppsView.java
src/com/android/launcher2/HandleView.java

index c91e533..b642ead 100644 (file)
     <!-- Title of dialog when user is selecting live folder to add to homescreen -->
     <string name="title_select_live_folder">Select folder</string>
 
+    <!-- All applications label for accessibilty (spoken when the button gets focus). -->
+    <string name="all_apps_button_label">All applications</string>
+    <!-- Label for button in all applications label to go back home (to the workspace / desktop)
+         for accessibilty (spoken when the button gets focus). -->
+    <string name="all_apps_home_button_label">Home</string>
+
     <!-- Menus items: -->
     <skip />
     <!-- Verb, menu item used to add an item on the desktop -->
index 76fee5b..a4891da 100644 (file)
@@ -46,6 +46,7 @@ import android.view.SurfaceHolder;
 import android.view.VelocityTracker;
 import android.view.View;
 import android.view.ViewConfiguration;
+import android.view.accessibility.AccessibilityEvent;
 
 import java.util.ArrayList;
 import java.util.Collections;
@@ -565,6 +566,44 @@ public class AllAppsView extends RSSurfaceView
         return true;
     }
 
+    @Override
+    public boolean dispatchPopulateAccessibilityEvent(AccessibilityEvent event) {
+        if (event.getEventType() == AccessibilityEvent.TYPE_VIEW_SELECTED) {
+            if (!isVisible()) {
+                return false;
+            }
+            String text = null;
+            int index;
+            int count = mAllAppsList.size() + 1; // +1 is home
+            int pos = -1;
+            switch (mLastSelection) {
+            case SELECTION_ICONS:
+                index = mRollo.mState.selectedIconIndex;
+                if (index >= 0) {
+                    ApplicationInfo info = mAllAppsList.get(index);
+                    if (info.title != null) {
+                        text = info.title.toString();
+                        pos = index;
+                    }
+                }
+                break;
+            case SELECTION_HOME:
+                text = getContext().getString(R.string.all_apps_home_button_label);
+                pos = count;
+                break;
+            }
+            if (text != null) {
+                Log.d(TAG, "dispatchPopulateAccessibilityEvent setting text=" + text);
+                event.setEnabled(true);
+                event.getText().add(text);
+                //event.setContentDescription(text);
+                event.setItemCount(count);
+                event.setCurrentItemIndex(pos);
+            }
+        }
+        return false;
+    }
+
     public void setDragController(DragController dragger) {
         mDragController = dragger;
     }
@@ -1286,19 +1325,28 @@ public class AllAppsView extends RSSurfaceView
                     mLastSelection = SELECTION_ICONS;
                 }
 
+                int prev = mState.selectedIconIndex;
                 mState.selectedIconIndex = index;
 
+                ApplicationInfo info = mAllAppsList.get(index);
                 Bitmap selectionBitmap = mSelectionBitmap;
 
                 Utilities.drawSelectedAllAppsBitmap(mSelectionCanvas,
                         selectionBitmap.getWidth(), selectionBitmap.getHeight(),
-                        pressed == SELECTED_PRESSED,
-                        mAllAppsList.get(index).iconBitmap);
+                        pressed == SELECTED_PRESSED, info.iconBitmap);
 
                 mSelectedIcon = Allocation.createFromBitmap(mRS, selectionBitmap,
                         Element.RGBA_8888(mRS), false);
                 mSelectedIcon.uploadToTexture(0);
                 mState.selectedIconTexture = mSelectedIcon.getID();
+
+                if (prev != index) {
+                    if (info.title != null && info.title.length() > 0) {
+                        Log.d(TAG, "sendAccessibilityEvent SELECTION_ICONS " + info.title);
+                        //setContentDescription(info.title);
+                        sendAccessibilityEvent(AccessibilityEvent.TYPE_VIEW_SELECTED);
+                    }
+                }
             }
         }
 
@@ -1310,6 +1358,7 @@ public class AllAppsView extends RSSurfaceView
         }
 
         void setHomeSelected(int mode) {
+            final int prev = mLastSelection;
             switch (mode) {
             case SELECTED_NONE:
                 mState.homeButtonId = mHomeButtonNormal.getID();
@@ -1317,6 +1366,10 @@ public class AllAppsView extends RSSurfaceView
             case SELECTED_FOCUSED:
                 mLastSelection = SELECTION_HOME;
                 mState.homeButtonId = mHomeButtonFocused.getID();
+                if (prev != SELECTION_HOME) {
+                    Log.d(TAG, "sendAccessibilityEvent SELECTION_HOME");
+                    sendAccessibilityEvent(AccessibilityEvent.TYPE_VIEW_SELECTED);
+                }
                 break;
             case SELECTED_PRESSED:
                 mState.homeButtonId = mHomeButtonPressed.getID();
index 2bffe4b..e07334e 100644 (file)
@@ -45,6 +45,8 @@ public class HandleView extends ImageView {
         TypedArray a = context.obtainStyledAttributes(attrs, R.styleable.HandleView, defStyle, 0);
         mOrientation = a.getInt(R.styleable.HandleView_direction, ORIENTATION_HORIZONTAL);
         a.recycle();
+
+        setContentDescription(context.getString(R.string.all_apps_button_label));
     }
 
     @Override