adding accessibilty strings to ui items

Change-Id: I3f2356c765bd2799dfa1009ff6707fc3af87383e
diff --git a/res/layout/bottom_bar_contents.xml b/res/layout/bottom_bar_contents.xml
index 4e8a56f..d237833 100644
--- a/res/layout/bottom_bar_contents.xml
+++ b/res/layout/bottom_bar_contents.xml
@@ -49,28 +49,32 @@
         android:layout_height="match_parent"
         android:layout_weight="1"
         android:background="@null"
-        camera:imageIds="@array/refocus_icons" />
+        camera:imageIds="@array/refocus_icons"
+        camera:contentDescriptionIds="@array/refocus_descriptions" />
     <com.android.camera.MultiToggleImageButton
         android:id="@+id/hdr_plus_toggle_button"
         android:layout_width="0dp"
         android:layout_height="match_parent"
         android:background="@null"
         android:layout_weight="1"
-        camera:imageIds="@array/pref_camera_hdr_plus_icons" />
+        camera:imageIds="@array/pref_camera_hdr_plus_icons"
+        camera:contentDescriptionIds="@array/hdr_plus_descriptions" />
     <com.android.camera.MultiToggleImageButton
         android:id="@+id/flash_toggle_button"
         android:layout_width="0dp"
         android:layout_height="match_parent"
         android:layout_weight="1"
         android:background="@null"
-        camera:imageIds="@array/camera_flashmode_icons" />
+        camera:imageIds="@array/camera_flashmode_icons"
+        camera:contentDescriptionIds="@array/camera_flash_descriptions" />
     <com.android.camera.MultiToggleImageButton
         android:id="@+id/camera_toggle_button"
         android:layout_width="0dp"
         android:layout_height="match_parent"
         android:layout_weight="1"
         android:background="@null"
-        camera:imageIds="@array/camera_id_icons" />
+        camera:imageIds="@array/camera_id_icons"
+        camera:contentDescriptionIds="@array/camera_id_descriptions" />
     <ImageButton
         android:id="@+id/reference_toggle"
         android:layout_width="0dp"
@@ -92,7 +96,8 @@
           android:layout_height="wrap_content"
           android:scaleType="center"
           android:background="@null"
-          camera:imageIds="@array/settings_toggle_icons"/>
+          camera:imageIds="@array/settings_toggle_icons"
+          camera:contentDescriptionIds="@array/settings_toggle_descriptions" />
   </com.android.camera.ui.TopRightMostOverlay>
 
   <com.android.camera.ui.TopRightWeightedLayout
@@ -109,20 +114,23 @@
         android:layout_height="wrap_content"
         android:src="@drawable/ic_cancel"
         android:layout_weight="1"
-        android:background="@null" />
+        android:background="@null"
+        android:contentDescription="@string/cancel_button_description" />
     <ImageButton
         android:id="@+id/done_button"
         android:layout_width="wrap_content"
         android:layout_height="wrap_content"
         android:src="@drawable/ic_confirm"
         android:layout_weight="1"
-        android:background="@null" />
+        android:background="@null"
+        android:contentDescription="@string/done_button_description" />
     <ImageButton
         android:id="@+id/retake_button"
         android:layout_width="wrap_content"
         android:layout_height="wrap_content"
         android:src="@drawable/ic_back"
         android:layout_weight="1"
-        android:background="@null" />
+        android:background="@null"
+        android:contentDescription="@string/retake_button_description" />
   </com.android.camera.ui.TopRightWeightedLayout>
 </merge>
diff --git a/res/values/arrays.xml b/res/values/arrays.xml
index 486e616..ae59967 100644
--- a/res/values/arrays.xml
+++ b/res/values/arrays.xml
@@ -246,6 +246,12 @@
         <item>@drawable/ic_flash_on</item>
     </array>
 
+    <array name="camera_flash_descriptions" translatable="false">
+      <item>@string/flash_off_desc</item>
+      <item>@string/flash_auto_desc</item>
+      <item>@string/flash_on_desc</item>
+    </array>
+
     <array name="camera_flashmode_largeicons" translatable="false">
         <item>@drawable/ic_flash_off</item>
         <item>@drawable/ic_flash_auto</item>
@@ -284,6 +290,11 @@
         <item>@drawable/ic_flash_off</item>
     </array>
 
+    <array name="video_flash_descriptions" translatable="false">
+      <item>@string/torch_on_desc</item>
+      <item>@string/torch_off_desc</item>
+    </array>
+
     <array name="video_flashmode_indicator_icons" translatable="false">
         <item>@drawable/ic_flash_on_indicator</item>
         <item>@drawable/ic_flash_off_indicator</item>
@@ -411,6 +422,12 @@
         <item>@drawable/ic_switch_camera_front</item>
     </array>
 
+    <array name="camera_id_descriptions" translatable="false">
+      <item>@string/camera_id_back_desc</item>
+      <item>@string/camera_id_front_desc</item>
+    </array>
+
+
     <array name="camera_id_largeicons" translatable="false">
         <item>@drawable/ic_switch_camera_back</item>
         <item>@drawable/ic_switch_camera_front</item>
@@ -470,11 +487,21 @@
         <item>@drawable/ic_hdr_plus_on</item>
     </array>
 
+    <array name="hdr_plus_descriptions" translatable="false">
+      <item>@string/hdr_plus_off_desc</item>
+      <item>@string/hdr_plus_on_desc</item>
+    </array>
+
     <array name="pref_camera_hdr_icons" translatable="false">
         <item>@drawable/ic_hdr_off</item>
         <item>@drawable/ic_hdr_on</item>
     </array>
 
+    <array name="hdr_descriptions" translatable="false">
+      <item>@string/hdr_off_desc</item>
+      <item>@string/hdr_on_desc</item>
+    </array>
+
     <array name="pref_camera_hdr_plus_indicator_icons" translatable="false">
         <item>@drawable/ic_hdr_plus_off_indicator</item>
         <item>@drawable/ic_hdr_plus_on_indicator</item>
@@ -557,6 +584,11 @@
       <item>@drawable/ic_refocus</item>
     </array>
 
+    <array name="refocus_descriptions" translatable="false">
+      <item>@string/refocus_off_desc</item>
+      <item>@string/refocus_on_desc</item>
+    </array>
+
     <array name="refocus_indicator_icons" translatable="false">
       <item>@drawable/ic_refocus_off_indicator</item>
       <item>@drawable/ic_refocus_on_indicator</item>
@@ -572,6 +604,12 @@
       <item>@drawable/ic_options_active</item>
     </array>
 
+    <array name="settings_toggle_descriptions" translatable="false">
+      <item>@string/settings_open_desc</item>
+      <item>@string/settings_close_desc</item>
+    </array>
+
+
     <!--Index of camera modes. -->
     <integer name="camera_mode_photo">0</integer>
     <integer name="camera_mode_video">1</integer>
@@ -637,6 +675,18 @@
         <item>""</item>
     </string-array>
 
+    <string-array name="camera_mode_content_description">
+        <item>@string/mode_camera_desc</item>
+        <item>@string/mode_video_desc</item>
+        <item>@string/mode_advanced_camera_desc</item>
+        <item>@string/mode_photosphere_desc</item>
+        <item>@string/mode_panorama_desc</item>
+        <item>@string/mode_timelapse_desc</item>
+        <item>@string/mode_settings_desc</item>
+        <item>""</item>
+        <item>""</item>
+    </string-array>
+
     <array name="camera_mode_icon">
         <item>@drawable/ic_camera_normal</item>
         <item>@drawable/ic_video_normal</item>
diff --git a/res/values/attrs.xml b/res/values/attrs.xml
index 452acb5..a92d6ab 100644
--- a/res/values/attrs.xml
+++ b/res/values/attrs.xml
@@ -44,5 +44,6 @@
     </declare-styleable>
     <declare-styleable name="MultiToggleImageButton">
         <attr name="imageIds" format="reference" />
+        <attr name="contentDescriptionIds" format="reference" />
     </declare-styleable>
 </resources>
diff --git a/res/values/strings.xml b/res/values/strings.xml
index e380bab..cad63a5 100644
--- a/res/values/strings.xml
+++ b/res/values/strings.xml
@@ -701,6 +701,63 @@
     <!-- Text shown in the camera mode options list for putting camera in panorama mode [CHAR LIMIT=25] -->
     <string name="mode_panorama">Panorama</string>
 
+    <!-- Accessibility text for switching to camera settings [CHAR_LIMIT=NONE] -->
+    <string name="mode_settings_desc">Open Settings</string>
+    <!-- Accessibility text for switching to normal camera mode [CHAR_LIMIT=NONE] -->
+    <string name="mode_camera_desc">Switch to Camera Mode</string>
+    <!-- Accessibility text for switching to video mode [CHAR_LIMIT=NONE] -->
+    <string name="mode_video_desc">Switch to Video Camera</string>
+    <!-- Accessibility text for switching to photo sphere mode. 'Photo sphere' is a product name. [CHAR_LIMIT=NONE] -->
+    <string name="mode_photosphere_desc">Switch to Photo Sphere Mode</string>
+    <!-- Accessibility text for switching to craft mode. Craft mode contains more advanced features such as capability to refocus and recognize barcode/QR code. [CHAR_LIMIT=NONE] -->
+    <string name="mode_craft_desc">Switch to Advanced Camera Mode</string>
+    <!-- Accessibility text for switching to advanced camera mode. It contains more advanced features such as capability to refocus and recognize barcode/QR code. [CHAR_LIMIT=NONE] -->
+    <string name="mode_advanced_camera_desc">Switch to Advanced Camera Mode</string>
+    <!-- Accessibility text for switching to timelapse mode [CHAR_LIMIT=NONE] -->
+    <string name="mode_timelapse_desc">Switch to Timelapse Mode</string>
+    <!-- Accessibility text for switching to wideangle mode [CHAR_LIMIT=NONE] -->
+    <string name="mode_wideangle_desc">Switch to Wideangle Mode</string>
+    <!-- Accessibility text for switching to panorama mode [CHAR_LIMIT=NONE] -->
+    <string name="mode_panorama_desc">Switch to Panorama Mode</string>
+
+
+    <!-- Accessibility text for refocus toggle button states [CHAR_LIMIT=NONE] -->
+    <string name="refocus_off_desc">Foreground Focus off</string>
+    <string name="refocus_on_desc">Foreground Focus on</string>
+
+    <!-- Accessibility text for settings toggle button states [CHAR_LIMIT=NONE] -->
+    <string name="settings_open_desc">Open settings</string>
+    <string name="settings_close_desc">Close settings</string>
+
+    <!-- Accessibility text for HDR+ toggle button states [CHAR_LIMIT=NONE] -->
+    <string name="hdr_plus_off_desc">HDR Plus off</string>
+    <string name="hdr_plus_on_desc">HDR Plus on</string>
+
+    <!-- Accessibility text for HDR toggle button states [CHAR_LIMIT=NONE] -->
+    <string name="hdr_off_desc">HDR off</string>
+    <string name="hdr_on_desc">HDR on</string>
+
+    <!-- Accessibility text for camera flash toggle button states [CHAR_LIMIT=NONE] -->
+    <string name="flash_off_desc">Flash off</string>
+    <string name="flash_auto_desc">Flash auto</string>
+    <string name="flash_on_desc">Flash on</string>
+
+    <!-- Accessibility text for vide torch (flash) toggle button states [CHAR_LIMIT=NONE] -->
+    <string name="torch_on_desc">Torch on</string>
+    <string name="torch_off_desc">Torch off</string>
+
+    <!-- Accessibility text for camera switch toggle button states [CHAR_LIMIT=NONE] -->
+    <string name="camera_id_back_desc">Back camera</string>
+    <string name="camera_id_front_desc">Front camera</string>
+
+    <!-- Accessibility text for cancel button [CHAR_LIMIT=NONE] -->
+    <string name="cancel_button_description">Cancel</string>
+    <!-- Accessibility text for done button [CHAR_LIMIT=NONE] -->
+    <string name="done_button_description">Done</string>
+    <!-- Accessibility text for retake button [CHAR_LIMIT=NONE] -->
+    <string name="retake_button_description">Retake</string>
+
+
     <!-- Text shown in camera settings list for toggling photo location on or off [CHAR LIMIT=25] -->
     <string name="setting_location">Location</string>
     <!-- Text shown in camera settings list for selecting the size of photos that will be captured [CHAR LIMIT=25] -->
diff --git a/src/com/android/camera/ButtonManager.java b/src/com/android/camera/ButtonManager.java
index 7cf909c..8e8ba7d 100644
--- a/src/com/android/camera/ButtonManager.java
+++ b/src/com/android/camera/ButtonManager.java
@@ -454,6 +454,8 @@
         if (resIdImages > 0) {
             button.overrideImageIds(resIdImages);
         }
+        button.overrideContentDescriptions(R.array.camera_flash_descriptions);
+
         int index = mSettingsManager.getStringValueIndex(SettingsManager.SETTING_FLASH_MODE);
         button.setState(index >= 0 ? index : 0, false);
 
@@ -477,6 +479,8 @@
         if (resIdImages > 0) {
             button.overrideImageIds(resIdImages);
         }
+        button.overrideContentDescriptions(R.array.video_flash_descriptions);
+
         int index = mSettingsManager.getStringValueIndex(
                 SettingsManager.SETTING_VIDEOCAMERA_FLASH_MODE);
         button.setState(index >= 0 ? index : 0, false);
@@ -529,6 +533,7 @@
         if (resIdImages > 0) {
             button.overrideImageIds(resIdImages);
         }
+        button.overrideContentDescriptions(R.array.hdr_plus_descriptions);
 
         int index = mSettingsManager.getStringValueIndex(SettingsManager.SETTING_CAMERA_HDR);
         button.setState(index >= 0 ? index : 0, false);
diff --git a/src/com/android/camera/MultiToggleImageButton.java b/src/com/android/camera/MultiToggleImageButton.java
index 49b073f..6b43cd6 100644
--- a/src/com/android/camera/MultiToggleImageButton.java
+++ b/src/com/android/camera/MultiToggleImageButton.java
@@ -22,6 +22,7 @@
 import android.util.AttributeSet;
 import android.widget.ImageButton;
 import android.view.View;
+import android.view.accessibility.AccessibilityEvent;
 
 import com.android.camera2.R;
 
@@ -50,6 +51,7 @@
     private OnStateChangeListener mOnStateChangeListener;
     private int mState;
     private int[] mImageIds;
+    private int[] mDescIds;
     private int mLevel;
 
     public MultiToggleImageButton(Context context) {
@@ -107,6 +109,9 @@
     public void setState(int state, boolean callListener) {
         mState = state;
         setImageResource(mImageIds[mState]);
+        setContentDescription(getResources().getString(mDescIds[mState]));
+        // TODO get talkback to announce the current button state
+        //sendAccessibilityEvent(AccessibilityEvent.CONTENT_CHANGE_TYPE_CONTENT_DESCRIPTION);
         super.setImageLevel(mLevel);
         if (callListener && mOnStateChangeListener != null) {
             mOnStateChangeListener.stateChanged(this, getState());
@@ -135,8 +140,12 @@
             attrs,
             R.styleable.MultiToggleImageButton,
             0, 0);
-        int resId = a.getResourceId(R.styleable.MultiToggleImageButton_imageIds, 0);
-        overrideImageIds(resId);
+        int imageIds = a.getResourceId(R.styleable.MultiToggleImageButton_imageIds, 0);
+        overrideImageIds(imageIds);
+
+        int descIds = a.getResourceId(R.styleable.MultiToggleImageButton_contentDescriptionIds, 0);
+        overrideContentDescriptions(descIds);
+
         a.recycle();
     }
 
@@ -158,6 +167,24 @@
         }
     }
 
+    /**
+     * Override the content descriptions of this button.
+     */
+    public void overrideContentDescriptions(int resId) {
+        TypedArray ids = null;
+        try {
+            ids = getResources().obtainTypedArray(resId);
+            mDescIds = new int[ids.length()];
+            for (int i = 0; i < ids.length(); i++) {
+                mDescIds[i] = ids.getResourceId(i, 0);
+            }
+        } finally {
+            if (ids != null) {
+                ids.recycle();
+            }
+        }
+    }
+
     @Override
     public void setImageLevel(int level) {
         super.setImageLevel(level);
diff --git a/src/com/android/camera/ui/ModeListView.java b/src/com/android/camera/ui/ModeListView.java
index d7386b9..939c643 100644
--- a/src/com/android/camera/ui/ModeListView.java
+++ b/src/com/android/camera/ui/ModeListView.java
@@ -368,6 +368,11 @@
 
             // Set text
             selectorItem.setText(CameraUtil.getCameraModeText(modeId, getContext()));
+
+            // Set content description (for a11y)
+            selectorItem.setContentDescription(CameraUtil
+                    .getCameraModeContentDescription(modeId, getContext()));
+
             mModeSelectorItems[i] = selectorItem;
         }
 
diff --git a/src/com/android/camera/util/CameraUtil.java b/src/com/android/camera/util/CameraUtil.java
index 7af8670..fbce28e 100644
--- a/src/com/android/camera/util/CameraUtil.java
+++ b/src/com/android/camera/util/CameraUtil.java
@@ -1053,6 +1053,23 @@
     }
 
     /**
+     * Gets the mode content description of a specific mode.
+     *
+     * @param modeIndex index of the mode
+     * @param context current context
+     * @return mode content description if the index is valid, otherwise a new empty string
+     */
+    public static String getCameraModeContentDescription(int modeIndex, Context context) {
+        String[] cameraModesDesc = context.getResources()
+                .getStringArray(R.array.camera_mode_content_description);
+        if (modeIndex < 0 || modeIndex >= cameraModesDesc.length) {
+            Log.e(TAG, "Invalid mode index: " + modeIndex);
+            return new String();
+        }
+        return cameraModesDesc[modeIndex];
+    }
+
+    /**
      * Gets the shutter icon res id for a specific mode.
      *
      * @param modeIndex index of the mode