Merge tag android-5.1.0_r1 into AOSP_5.1_MERGE

Change-Id: If83121d50c15c11988a2a135356290e82fb9e96e
diff --git a/apps/TestingCamera2/res/layout/main.xml b/apps/TestingCamera2/res/layout/main.xml
index ad12d43..52ec046 100644
--- a/apps/TestingCamera2/res/layout/main.xml
+++ b/apps/TestingCamera2/res/layout/main.xml
@@ -104,6 +104,14 @@
             android:prompt="@string/focus_mode_spinner_prompt"
             />
 
+        <Spinner
+            android:id="@+id/cac_mode_spinner"
+            android:layout_width="fill_parent"
+            android:layout_height="wrap_content"
+            android:spinnerMode="dropdown"
+            android:prompt="@string/cac_mode_spinner_prompt"
+            />
+
         <CheckBox
             android:id="@+id/use_media_codec"
             android:layout_width="fill_parent"
diff --git a/apps/TestingCamera2/res/values/strings.xml b/apps/TestingCamera2/res/values/strings.xml
index dcca6bb..cde53ea 100644
--- a/apps/TestingCamera2/res/values/strings.xml
+++ b/apps/TestingCamera2/res/values/strings.xml
@@ -90,6 +90,7 @@
     <string name="focus_lock_button_label">Focus Lock</string>
     <string name="focus_unlock_button_label">Focus Unlock</string>
     <string name="focus_mode_spinner_prompt">AF Mode</string>
+    <string name="cac_mode_spinner_prompt">CAC Mode</string>
     <string name="recording_on_label">Recording On</string>
     <string name="recording_off_label">Recording Off</string>
     <string name="use_media_codec_label">Use MediaCodec</string>
@@ -112,4 +113,10 @@
         <item>CONTINUOUS_PICTURE</item>
         <item>EDOF</item>
     </string-array>
+    <string-array name="cac_mode_spinner_arrays">
+      <!-- must be in same order as COLOR_CORRECTION_AVAILABLE_ABERRATION_MODES* enums -->
+        <item>OFF</item>
+        <item>FAST</item>
+        <item>HIGH</item>
+    </string-array>
 </resources>
diff --git a/apps/TestingCamera2/src/com/android/testingcamera2/v1/CameraControls.java b/apps/TestingCamera2/src/com/android/testingcamera2/v1/CameraControls.java
index 6a0763e..63d42c2 100644
--- a/apps/TestingCamera2/src/com/android/testingcamera2/v1/CameraControls.java
+++ b/apps/TestingCamera2/src/com/android/testingcamera2/v1/CameraControls.java
@@ -23,7 +23,18 @@
     private final CameraManualControls manualControls = new CameraManualControls();
     private final CameraAutoFocusControls afControls = new CameraAutoFocusControls();
 
+    private int cacMode;
+
     public CameraControls() {
+        cacMode = 0;
+    }
+
+    public int getCacMode() {
+        return cacMode;
+    }
+
+    public void setCacMode(int cacMode) {
+        this.cacMode = cacMode;
     }
 
     public CameraManualControls getManualControls() {
diff --git a/apps/TestingCamera2/src/com/android/testingcamera2/v1/CameraOps.java b/apps/TestingCamera2/src/com/android/testingcamera2/v1/CameraOps.java
index aae07e9..2f259a1 100644
--- a/apps/TestingCamera2/src/com/android/testingcamera2/v1/CameraOps.java
+++ b/apps/TestingCamera2/src/com/android/testingcamera2/v1/CameraOps.java
@@ -549,6 +549,9 @@
             updateCaptureRequest(builder, cameraControl.getManualControls());
             // Update the AF control metadata for capture request (if manual is not used)
             updateCaptureRequest(builder, cameraControl.getAfControls());
+            // Update cac mode
+            builder.set(CaptureRequest.COLOR_CORRECTION_ABERRATION_MODE,
+                    cameraControl.getCacMode());
         }
     }
 
diff --git a/apps/TestingCamera2/src/com/android/testingcamera2/v1/TestingCamera2.java b/apps/TestingCamera2/src/com/android/testingcamera2/v1/TestingCamera2.java
index 64fa8a4..cac7b01 100644
--- a/apps/TestingCamera2/src/com/android/testingcamera2/v1/TestingCamera2.java
+++ b/apps/TestingCamera2/src/com/android/testingcamera2/v1/TestingCamera2.java
@@ -91,6 +91,7 @@
     private Button mFlushButton;
     private ToggleButton mFocusLockToggle;
     private Spinner mFocusModeSpinner;
+    private Spinner mCacModeSpinner;
     private CheckBox mUseMediaCodecCheckBox;
 
     private SeekBar mSensitivityBar;
@@ -136,6 +137,7 @@
         mFocusLockToggle.setOnClickListener(mFocusLockToggleListener);
         mFocusModeSpinner = (Spinner) findViewById(R.id.focus_mode_spinner);
         mAutoControls.add(mFocusLockToggle);
+        mCacModeSpinner = (Spinner) findViewById(R.id.cac_mode_spinner);
 
         mRecordingToggle = (ToggleButton) findViewById(R.id.start_recording);
         mRecordingToggle.setOnClickListener(mRecordingToggleListener);
@@ -671,6 +673,48 @@
              * Populate dynamic per-camera settings
              */
 
+            // Map available CAC Modes -> CAC mode spinner dropdown list of strings
+            int[] availableCacModes =
+                    characteristics.get(
+                            CameraCharacteristics.COLOR_CORRECTION_AVAILABLE_ABERRATION_MODES);
+            String[] allCacModes = getResources().getStringArray(R.array.cac_mode_spinner_arrays);
+
+            final List<String> cacModeList = new ArrayList<>();
+            final int[] cacModePositions = new int[availableCacModes.length];
+
+            int i = 0;
+            for (int mode : availableCacModes) {
+                cacModeList.add(allCacModes[mode]);
+                cacModePositions[i++] = mode;
+            }
+
+            /*
+             * Change the CAC mode when CAC spinner's selected item changes
+             */
+            mCacModeSpinner.setOnItemSelectedListener(new OnItemSelectedListener() {
+
+                @Override
+                public void onItemSelected(AdapterView<?> parent, View view, int position,
+                        long id) {
+                    int cacMode = cacModePositions[position];
+
+                    Log.i(TAG, "Change CAC mode to " + cacModeList.get(position)
+                            + " " + cacMode);
+
+                    mCameraControl.setCacMode(cacMode);
+                }
+
+                @Override
+                public void onNothingSelected(AdapterView<?> parent) {
+                    // Do nothing
+                }
+            });
+
+            ArrayAdapter<String> cacDataAdapter = new ArrayAdapter<>(TestingCamera2.this,
+                    android.R.layout.simple_spinner_item, cacModeList);
+            cacDataAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
+            mCacModeSpinner.setAdapter(cacDataAdapter);
+
             // Map available AF Modes -> AF mode spinner dropdown list of strings
             int[] availableAfModes =
                     characteristics.get(CameraCharacteristics.CONTROL_AF_AVAILABLE_MODES);
@@ -680,7 +724,7 @@
             final List<String> afModeList = new ArrayList<>();
             final int[] afModePositions = new int[availableAfModes.length];
 
-            int i = 0;
+            i = 0;
             for (int mode : availableAfModes) {
                 afModeList.add(allAfModes[mode]);
                 afModePositions[i++] = mode;