Merge "Fix camera2.cts.CameraManagerTest.testManagerGetDeviceIdList for TV." into marshmallow-cts-dev
diff --git a/apps/CtsVerifier/AndroidManifest.xml b/apps/CtsVerifier/AndroidManifest.xml
index 954f093..4778ae2 100644
--- a/apps/CtsVerifier/AndroidManifest.xml
+++ b/apps/CtsVerifier/AndroidManifest.xml
@@ -18,7 +18,7 @@
 <manifest xmlns:android="http://schemas.android.com/apk/res/android"
       package="com.android.cts.verifier"
       android:versionCode="5"
-      android:versionName="6.0_r6">
+      android:versionName="6.0_r7">
 
     <uses-sdk android:minSdkVersion="19" android:targetSdkVersion="23"/>
 
diff --git a/apps/CtsVerifier/res/raw/half_way.mp3 b/apps/CtsVerifier/res/raw/half_way.mp3
new file mode 100644
index 0000000..03e07ce
--- /dev/null
+++ b/apps/CtsVerifier/res/raw/half_way.mp3
Binary files differ
diff --git a/apps/CtsVerifier/res/raw/start_axis.mp3 b/apps/CtsVerifier/res/raw/start_axis.mp3
new file mode 100644
index 0000000..b674a7a
--- /dev/null
+++ b/apps/CtsVerifier/res/raw/start_axis.mp3
Binary files differ
diff --git a/apps/CtsVerifier/res/values/strings.xml b/apps/CtsVerifier/res/values/strings.xml
index ee98c12..a154135 100644
--- a/apps/CtsVerifier/res/values/strings.xml
+++ b/apps/CtsVerifier/res/values/strings.xml
@@ -1690,19 +1690,6 @@
         Then use the Back button to return to this test and mark accordingly.
     </string>
 
-    <string name="provisioning_byod_battery_settings">Profile-aware battery settings</string>
-    <string name="provisioning_byod_battery_settings_instruction">
-        Please press the Go button to open Battery page in settings.\n
-        \n
-        Verify that Battery page shows both badged and unbadged apps in the usage list.\n
-        \n
-        Note that the usage list only displays usage since last charge,
-        so you may need to unplug your device and use a badged and unbadged app
-        for a little while before they will appear in the list.\n
-        \n
-        Then use the Back button to return to this test and mark accordingly.
-    </string>
-
     <string name="provisioning_byod_data_usage_settings">Profile-aware data usage settings</string>
     <string name="provisioning_byod_data_usage_settings_instruction">
         Please press the Go button to open the Settings page.\n
@@ -2053,6 +2040,10 @@
     Verify that the overlay appears and displays the text \"Overlay View Dummy Text\" when you tune
     to the \"Dummy\" channel.
     </string>
+    <string name="tv_input_discover_test_verify_size_changed">
+    Verify that video layout changes correctly according to the provided video track information,
+    including pixel aspect ratio.
+    </string>
     <string name="tv_input_discover_test_verify_global_search">
     Verify the TV app provides query results for 3rd-party input\'s channels and programs in
     global search results.
diff --git a/apps/CtsVerifier/src/com/android/cts/verifier/camera/its/ItsService.java b/apps/CtsVerifier/src/com/android/cts/verifier/camera/its/ItsService.java
index 641ee19..d528604 100644
--- a/apps/CtsVerifier/src/com/android/cts/verifier/camera/its/ItsService.java
+++ b/apps/CtsVerifier/src/com/android/cts/verifier/camera/its/ItsService.java
@@ -86,6 +86,7 @@
 import java.util.concurrent.CountDownLatch;
 import java.util.concurrent.LinkedBlockingDeque;
 import java.util.concurrent.LinkedBlockingQueue;
+import java.util.concurrent.Semaphore;
 import java.util.concurrent.TimeUnit;
 import java.util.concurrent.atomic.AtomicInteger;
 
@@ -93,7 +94,7 @@
     public static final String TAG = ItsService.class.getSimpleName();
 
     // Timeouts, in seconds.
-    private static final int TIMEOUT_CALLBACK = 3;
+    private static final int TIMEOUT_CALLBACK = 10;
     private static final int TIMEOUT_3A = 10;
 
     // Time given for background requests to warm up pipeline
@@ -148,6 +149,8 @@
 
     private volatile ServerSocket mSocket = null;
     private volatile SocketRunnable mSocketRunnableObj = null;
+    private Semaphore mSocketQueueQuota = null;
+    private LinkedList<Integer> mInflightImageSizes = new LinkedList<>();
     private volatile BlockingQueue<ByteBuffer> mSocketWriteQueue =
             new LinkedBlockingDeque<ByteBuffer>();
     private final Object mSocketWriteEnqueueLock = new Object();
@@ -316,6 +319,10 @@
                     mCameraListener, mCameraHandler);
             mCameraCharacteristics = mCameraManager.getCameraCharacteristics(
                     devices[cameraId]);
+            Size maxYuvSize = ItsUtils.getYuvOutputSizes(mCameraCharacteristics)[0];
+            // 2 bytes per pixel for RGBA Bitmap and at least 3 Bitmaps per CDD
+            int quota = maxYuvSize.getWidth() * maxYuvSize.getHeight() * 2 * 3;
+            mSocketQueueQuota = new Semaphore(quota, true);
         } catch (CameraAccessException e) {
             throw new ItsException("Failed to open camera", e);
         } catch (BlockingOpenException e) {
@@ -425,6 +432,13 @@
                         }
                         mOpenSocket.getOutputStream().flush();
                         Logt.i(TAG, String.format("Wrote to socket: %d bytes", b.capacity()));
+                        Integer imgBufSize = mInflightImageSizes.peek();
+                        if (imgBufSize != null && imgBufSize == b.capacity()) {
+                            mInflightImageSizes.removeFirst();
+                            if (mSocketQueueQuota != null) {
+                                mSocketQueueQuota.release(imgBufSize);
+                            }
+                        }
                     }
                 } catch (IOException e) {
                     Logt.e(TAG, "Error writing to socket", e);
@@ -473,6 +487,7 @@
                         break;
                     }
                     mSocketWriteQueue.clear();
+                    mInflightImageSizes.clear();
                     mSocketWriteRunnable.setOpenSocket(mOpenSocket);
                     Logt.i(TAG, "Socket connected");
                 } catch (IOException e) {
@@ -508,6 +523,7 @@
                 try {
                     synchronized(mSocketWriteDrainLock) {
                         mSocketWriteQueue.clear();
+                        mInflightImageSizes.clear();
                         mOpenSocket.close();
                         mOpenSocket = null;
                         mSocketWriteRunnable.setOpenSocket(null);
@@ -598,6 +614,7 @@
                         mSocketWriteQueue.put(bstr);
                     }
                     if (bbuf != null) {
+                        mInflightImageSizes.add(bbuf.capacity());
                         mSocketWriteQueue.put(bbuf);
                     }
                 }
@@ -1484,25 +1501,25 @@
                 int format = capture.getFormat();
                 if (format == ImageFormat.JPEG) {
                     Logt.i(TAG, "Received JPEG capture");
-                    byte[] img = ItsUtils.getDataFromImage(capture);
+                    byte[] img = ItsUtils.getDataFromImage(capture, mSocketQueueQuota);
                     ByteBuffer buf = ByteBuffer.wrap(img);
                     int count = mCountJpg.getAndIncrement();
                     mSocketRunnableObj.sendResponseCaptureBuffer("jpegImage", buf);
                 } else if (format == ImageFormat.YUV_420_888) {
                     Logt.i(TAG, "Received YUV capture");
-                    byte[] img = ItsUtils.getDataFromImage(capture);
+                    byte[] img = ItsUtils.getDataFromImage(capture, mSocketQueueQuota);
                     ByteBuffer buf = ByteBuffer.wrap(img);
                     int count = mCountYuv.getAndIncrement();
                     mSocketRunnableObj.sendResponseCaptureBuffer("yuvImage", buf);
                 } else if (format == ImageFormat.RAW10) {
                     Logt.i(TAG, "Received RAW10 capture");
-                    byte[] img = ItsUtils.getDataFromImage(capture);
+                    byte[] img = ItsUtils.getDataFromImage(capture, mSocketQueueQuota);
                     ByteBuffer buf = ByteBuffer.wrap(img);
                     int count = mCountRaw10.getAndIncrement();
                     mSocketRunnableObj.sendResponseCaptureBuffer("raw10Image", buf);
                 } else if (format == ImageFormat.RAW12) {
                     Logt.i(TAG, "Received RAW12 capture");
-                    byte[] img = ItsUtils.getDataFromImage(capture);
+                    byte[] img = ItsUtils.getDataFromImage(capture, mSocketQueueQuota);
                     ByteBuffer buf = ByteBuffer.wrap(img);
                     int count = mCountRaw12.getAndIncrement();
                     mSocketRunnableObj.sendResponseCaptureBuffer("raw12Image", buf);
@@ -1510,7 +1527,7 @@
                     Logt.i(TAG, "Received RAW16 capture");
                     int count = mCountRawOrDng.getAndIncrement();
                     if (! mCaptureRawIsDng) {
-                        byte[] img = ItsUtils.getDataFromImage(capture);
+                        byte[] img = ItsUtils.getDataFromImage(capture, mSocketQueueQuota);
                         if (! mCaptureRawIsStats) {
                             ByteBuffer buf = ByteBuffer.wrap(img);
                             mSocketRunnableObj.sendResponseCaptureBuffer("rawImage", buf);
@@ -1525,8 +1542,12 @@
                             float[] stats = StatsImage.computeStatsImage(img, w, h, gw, gh);
                             long endTimeMs = SystemClock.elapsedRealtime();
                             Log.e(TAG, "Raw stats computation takes " + (endTimeMs - startTimeMs) + " ms");
-
-                            ByteBuffer bBuf = ByteBuffer.allocateDirect(stats.length * 4);
+                            int statsImgSize = stats.length * 4;
+                            if (mSocketQueueQuota != null) {
+                                mSocketQueueQuota.release(img.length);
+                                mSocketQueueQuota.acquire(statsImgSize);
+                            }
+                            ByteBuffer bBuf = ByteBuffer.allocateDirect(statsImgSize);
                             bBuf.order(ByteOrder.nativeOrder());
                             FloatBuffer fBuf = bBuf.asFloatBuffer();
                             fBuf.put(stats);
@@ -1545,6 +1566,15 @@
                                 ByteArrayOutputStream dngStream = new ByteArrayOutputStream();
                                 dngCreator.writeImage(dngStream, capture);
                                 byte[] dngArray = dngStream.toByteArray();
+                                if (mSocketQueueQuota != null) {
+                                    // Ideally we should acquire before allocating memory, but
+                                    // here the DNG size is unknown before toByteArray call, so
+                                    // we have to register the size afterward. This should still
+                                    // works most of the time since all DNG images are handled by
+                                    // the same handler thread, so we are at most one buffer over
+                                    // the quota.
+                                    mSocketQueueQuota.acquire(dngArray.length);
+                                }
                                 ByteBuffer dngBuf = ByteBuffer.wrap(dngArray);
                                 mSocketRunnableObj.sendResponseCaptureBuffer("dngImage", dngBuf);
                                 break;
diff --git a/apps/CtsVerifier/src/com/android/cts/verifier/camera/its/ItsTestActivity.java b/apps/CtsVerifier/src/com/android/cts/verifier/camera/its/ItsTestActivity.java
index 1fdd044..339e210 100644
--- a/apps/CtsVerifier/src/com/android/cts/verifier/camera/its/ItsTestActivity.java
+++ b/apps/CtsVerifier/src/com/android/cts/verifier/camera/its/ItsTestActivity.java
@@ -26,6 +26,7 @@
 import android.hardware.camera2.CameraManager;
 import android.os.Bundle;
 import android.util.Log;
+import android.view.WindowManager;
 import android.widget.Toast;
 
 import java.util.ArrayList;
@@ -139,6 +140,8 @@
         setInfoResources(R.string.camera_its_test, R.string.camera_its_test_info, -1);
         setPassFailButtonClickListeners();
 
+        getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);
+
         // Hide the test if all camera devices are legacy
         CameraManager manager = (CameraManager) this.getSystemService(Context.CAMERA_SERVICE);
         try {
diff --git a/apps/CtsVerifier/src/com/android/cts/verifier/camera/its/ItsUtils.java b/apps/CtsVerifier/src/com/android/cts/verifier/camera/its/ItsUtils.java
index 6fd050b..8763223 100644
--- a/apps/CtsVerifier/src/com/android/cts/verifier/camera/its/ItsUtils.java
+++ b/apps/CtsVerifier/src/com/android/cts/verifier/camera/its/ItsUtils.java
@@ -37,8 +37,10 @@
 import java.nio.ByteBuffer;
 import java.nio.charset.Charset;
 import java.util.ArrayList;
+import java.util.concurrent.Semaphore;
 import java.util.List;
 
+
 public class ItsUtils {
     public static final String TAG = ItsUtils.class.getSimpleName();
 
@@ -161,7 +163,7 @@
         return maxSize;
     }
 
-    public static byte[] getDataFromImage(Image image)
+    public static byte[] getDataFromImage(Image image, Semaphore quota)
             throws ItsException {
         int format = image.getFormat();
         int width = image.getWidth();
@@ -180,13 +182,28 @@
         if (format == ImageFormat.JPEG) {
             // JPEG doesn't have pixelstride and rowstride, treat it as 1D buffer.
             ByteBuffer buffer = planes[0].getBuffer();
+            if (quota != null) {
+                try {
+                    quota.acquire(buffer.capacity());
+                } catch (java.lang.InterruptedException e) {
+                    Logt.e(TAG, "getDataFromImage error acquiring memory quota. Interrupted", e);
+                }
+            }
             data = new byte[buffer.capacity()];
             buffer.get(data);
             return data;
         } else if (format == ImageFormat.YUV_420_888 || format == ImageFormat.RAW_SENSOR
                 || format == ImageFormat.RAW10 || format == ImageFormat.RAW12) {
             int offset = 0;
-            data = new byte[width * height * ImageFormat.getBitsPerPixel(format) / 8];
+            int dataSize = width * height * ImageFormat.getBitsPerPixel(format) / 8;
+            if (quota != null) {
+                try {
+                    quota.acquire(dataSize);
+                } catch (java.lang.InterruptedException e) {
+                    Logt.e(TAG, "getDataFromImage error acquiring memory quota. Interrupted", e);
+                }
+            }
+            data = new byte[dataSize];
             int maxRowSize = planes[0].getRowStride();
             for (int i = 0; i < planes.length; i++) {
                 if (maxRowSize < planes[i].getRowStride()) {
diff --git a/apps/CtsVerifier/src/com/android/cts/verifier/managedprovisioning/ByodFlowTestActivity.java b/apps/CtsVerifier/src/com/android/cts/verifier/managedprovisioning/ByodFlowTestActivity.java
index 7a51cb9..fe6de97 100644
--- a/apps/CtsVerifier/src/com/android/cts/verifier/managedprovisioning/ByodFlowTestActivity.java
+++ b/apps/CtsVerifier/src/com/android/cts/verifier/managedprovisioning/ByodFlowTestActivity.java
@@ -70,7 +70,6 @@
     private DialogTestListItem mWorkStatusBarToastTest;
     private DialogTestListItem mAppSettingsVisibleTest;
     private DialogTestListItem mLocationSettingsVisibleTest;
-    private DialogTestListItem mBatterySettingsVisibleTest;
     private DialogTestListItem mDataUsageSettingsVisibleTest;
     private DialogTestListItem mCredSettingsVisibleTest;
     private DialogTestListItem mPrintSettingsVisibleTest;
@@ -256,12 +255,6 @@
                 R.string.provisioning_byod_location_settings_instruction,
                 new Intent(Settings.ACTION_LOCATION_SOURCE_SETTINGS));
 
-        mBatterySettingsVisibleTest = new DialogTestListItem(this,
-                R.string.provisioning_byod_battery_settings,
-                "BYOD_BatterySettingsVisibleTest",
-                R.string.provisioning_byod_battery_settings_instruction,
-                new Intent(Intent.ACTION_POWER_USAGE_SUMMARY));
-
         mDataUsageSettingsVisibleTest = new DialogTestListItem(this,
                 R.string.provisioning_byod_data_usage_settings,
                 "BYOD_DataUsageSettingsVisibleTest",
@@ -350,7 +343,6 @@
         adapter.add(mCredSettingsVisibleTest);
         adapter.add(mAppSettingsVisibleTest);
         adapter.add(mLocationSettingsVisibleTest);
-        adapter.add(mBatterySettingsVisibleTest);
         adapter.add(mDataUsageSettingsVisibleTest);
         adapter.add(mPrintSettingsVisibleTest);
 
diff --git a/apps/CtsVerifier/src/com/android/cts/verifier/managedprovisioning/IntentFiltersTestHelper.java b/apps/CtsVerifier/src/com/android/cts/verifier/managedprovisioning/IntentFiltersTestHelper.java
index 21c7331..24a6c79 100644
--- a/apps/CtsVerifier/src/com/android/cts/verifier/managedprovisioning/IntentFiltersTestHelper.java
+++ b/apps/CtsVerifier/src/com/android/cts/verifier/managedprovisioning/IntentFiltersTestHelper.java
@@ -179,13 +179,13 @@
         if (pm.hasSystemFeature(PackageManager.FEATURE_NFC)) {
             forwardedIntentsFromManaged.addAll(Arrays.asList(
                     new Intent(Settings.ACTION_NFC_SETTINGS),
-                    new Intent(Settings.ACTION_NFCSHARING_SETTINGS),
-                    new Intent(Settings.ACTION_NFC_PAYMENT_SETTINGS)));
+                    new Intent(Settings.ACTION_NFCSHARING_SETTINGS)));
         }
 
         if (pm.hasSystemFeature(PackageManager.FEATURE_NFC_HOST_CARD_EMULATION)) {
-            forwardedIntentsFromManaged.add(
-                    new Intent(CardEmulation.ACTION_CHANGE_DEFAULT));
+            forwardedIntentsFromManaged.addAll(Arrays.asList(
+                    new Intent(CardEmulation.ACTION_CHANGE_DEFAULT),
+                    new Intent(Settings.ACTION_NFC_PAYMENT_SETTINGS)));
         }
 
         if (pm.hasSystemFeature(PackageManager.FEATURE_CAMERA)) {
diff --git a/apps/CtsVerifier/src/com/android/cts/verifier/sensors/MotionIndicatorView.java b/apps/CtsVerifier/src/com/android/cts/verifier/sensors/MotionIndicatorView.java
index 12d4582..14784dd 100644
--- a/apps/CtsVerifier/src/com/android/cts/verifier/sensors/MotionIndicatorView.java
+++ b/apps/CtsVerifier/src/com/android/cts/verifier/sensors/MotionIndicatorView.java
@@ -335,12 +335,39 @@
     }
 
     /**
+     * Test if the range specified by (low, high) is covered.
+     *
+     * If it is LINEAR mode, the range will be quantized to nearest step boundary. If it is the
+     * ROTATE2D mode, it is the same as isFullyCovered().
+     *
+     * @param low The low end of the range.
+     * @param high The high end of the range.
+     * @return if the specified range is covered, return true; otherwise false.
+     */
+    public boolean isRangeCovered(int low, int high) {
+        if (mMode == MODE.LINEAR) {
+            int iLow = Math.max(Math.round((low - mLow) / mStep), 0);
+            int iHigh = Math.min(Math.round((high - mLow) / mStep), mCovered.length-1);
+
+            for (int i = iLow; i <= iHigh; ++i) {
+                if (!mCovered[i]) {
+                    return false;
+                }
+            }
+            return true;
+
+        } else {
+            return isFullyCovered();
+        }
+    }
+
+    /**
      * Test if the range defined is fully covered.
      *
      * @return if the range is fully covered, return true; otherwise false.
      */
     public boolean isFullyCovered() {
-        for (boolean i:mCovered) {
+        for (boolean i : mCovered) {
             if (!i) return false;
         }
         return true;
diff --git a/apps/CtsVerifier/src/com/android/cts/verifier/sensors/RVCVRecordActivity.java b/apps/CtsVerifier/src/com/android/cts/verifier/sensors/RVCVRecordActivity.java
index be5ec52..1ef87bd 100644
--- a/apps/CtsVerifier/src/com/android/cts/verifier/sensors/RVCVRecordActivity.java
+++ b/apps/CtsVerifier/src/com/android/cts/verifier/sensors/RVCVRecordActivity.java
@@ -46,8 +46,9 @@
 import java.io.OutputStreamWriter;
 import java.text.SimpleDateFormat;
 import java.util.Date;
+import java.util.HashMap;
 import java.util.List;
-
+import java.util.Map;
 
 // ----------------------------------------------------------------------
 
@@ -61,7 +62,7 @@
     private MotionIndicatorView mIndicatorView;
 
     private SoundPool mSoundPool;
-    private int [] mSoundPoolLookup;
+    private Map<String, Integer> mSoundMap;
 
     private File mRecordDir;
     private RecordProcedureController mController;
@@ -225,16 +226,13 @@
      * Initialize sound pool for user notification
      */
     private void initSoundPool() {
-        final int MAX_STREAM = 10;
-        int i=0;
-        mSoundPool = new SoundPool(MAX_STREAM, AudioManager.STREAM_MUSIC, 0);
-        mSoundPoolLookup = new int[MAX_STREAM];
+        mSoundPool = new SoundPool(1 /*maxStreams*/, AudioManager.STREAM_MUSIC, 0);
+        mSoundMap = new HashMap<>();
 
         // TODO: add different sound into this
-        mSoundPoolLookup[i++] = mSoundPool.load(this, R.raw.next_axis, 1);
-        mSoundPoolLookup[i++] = mSoundPool.load(this, R.raw.next_axis, 1);
-        mSoundPoolLookup[i++] = mSoundPool.load(this, R.raw.next_axis, 1);
-
+        mSoundMap.put("start", mSoundPool.load(this, R.raw.start_axis, 1));
+        mSoundMap.put("end", mSoundPool.load(this, R.raw.next_axis, 1));
+        mSoundMap.put("half-way", mSoundPool.load(this, R.raw.half_way, 1));
     }
     private void endSoundPool() {
         mSoundPool.release();
@@ -242,10 +240,14 @@
 
     /**
      * Play notify sound to user
-     * @param id ID of the sound to be played
+     * @param name name of the sound to be played
      */
-    public void playNotifySound(int id) {
-        mSoundPool.play(mSoundPoolLookup[id], 1, 1, 0, 0, 1);
+    public void playNotifySound(String name) {
+        Integer id = mSoundMap.get(name);
+        if (id != null) {
+            mSoundPool.play(id.intValue(), 0.75f/*left vol*/, 0.75f/*right vol*/, 0 /*priority*/,
+                    0/*loop play*/, 1/*rate*/);
+        }
     }
 
     /**
@@ -298,6 +300,13 @@
         mCoverManager.waitUntilCovered(axis);
     }
 
+    /**
+     * Wait until a sensor recording for a certain axis is halfway covered
+     * @param axis
+     */
+    public void waitUntilHalfCovered(int axis) {
+        mCoverManager.waitUntilHalfCovered(axis);
+    }
 
     /**
      *
@@ -516,7 +525,7 @@
      */
     class CoverageManager {
         // settings
-        private final int MAX_TILT_ANGLE = 60; // +/- 60
+        private final int MAX_TILT_ANGLE = 50; // +/- 50
         //private final int REQUIRED_TILT_ANGLE = 50; // +/- 50
         private final int TILT_ANGLE_STEP = 5; // 5 degree(s) per step
         private final int YAW_ANGLE_STEP = 10; // 10 degree(s) per step
@@ -526,9 +535,11 @@
         CoverageManager() {
             mAxisCovered = new RangeCoveredRegister[3];
             // X AXIS
-            mAxisCovered[0] = new RangeCoveredRegister(-MAX_TILT_ANGLE, +MAX_TILT_ANGLE, TILT_ANGLE_STEP);
+            mAxisCovered[0] = new RangeCoveredRegister(
+                    -MAX_TILT_ANGLE, +MAX_TILT_ANGLE, TILT_ANGLE_STEP);
             // Y AXIS
-            mAxisCovered[1] = new RangeCoveredRegister(-MAX_TILT_ANGLE, +MAX_TILT_ANGLE, TILT_ANGLE_STEP);
+            mAxisCovered[1] = new RangeCoveredRegister(
+                    -MAX_TILT_ANGLE, +MAX_TILT_ANGLE, TILT_ANGLE_STEP);
             // Z AXIS
             mAxisCovered[2] = new RangeCoveredRegister(YAW_ANGLE_STEP);
         }
@@ -538,6 +549,25 @@
             return mAxisCovered[axis-1];
         }
 
+        public void waitUntilHalfCovered(int axis) {
+            if (axis == SensorManager.AXIS_Z) {
+                waitUntilCovered(axis);
+            }
+
+            // SensorManager.AXIS_X = 1, need offset -1 for mAxisCovered array
+            while(!(mAxisCovered[axis-1].isRangeCovered(-MAX_TILT_ANGLE, -MAX_TILT_ANGLE/2) ||
+                        mAxisCovered[axis-1].isRangeCovered(MAX_TILT_ANGLE/2, MAX_TILT_ANGLE) ) ) {
+                try {
+                    Thread.sleep(500);
+                } catch (InterruptedException e) {
+                    if (LOCAL_LOGV) {
+                        Log.v(TAG, "waitUntilHalfCovered axis = "+ axis + " is interrupted");
+                    }
+                    Thread.currentThread().interrupt();
+                }
+            }
+        }
+
         public void waitUntilCovered(int axis) {
             // SensorManager.AXIS_X = 1, need offset -1 for mAxisCovered array
             while(!mAxisCovered[axis-1].isFullyCovered()) {
@@ -547,6 +577,7 @@
                     if (LOCAL_LOGV) {
                         Log.v(TAG, "waitUntilCovered axis = "+ axis + " is interrupted");
                     }
+                    Thread.currentThread().interrupt();
                 }
             }
         }
@@ -960,13 +991,21 @@
             mActivity.switchAxisAsync(axis);
 
             // play start sound
-            mActivity.playNotifySound(0);
+            mActivity.playNotifySound("start");
+
+            if (axis != SensorManager.AXIS_Z) {
+                // wait until axis half covered
+                mActivity.waitUntilHalfCovered(axis);
+
+                // play half way sound
+                mActivity.playNotifySound("half-way");
+            }
 
             // wait until axis covered
             mActivity.waitUntilCovered(axis);
 
             // play stop sound
-            mActivity.playNotifySound(1);
+            mActivity.playNotifySound("end");
         }
 
         /**
diff --git a/apps/CtsVerifier/src/com/android/cts/verifier/sensors/RVCVXCheckAnalyzer.java b/apps/CtsVerifier/src/com/android/cts/verifier/sensors/RVCVXCheckAnalyzer.java
index 7bc87ad..260ffbf 100644
--- a/apps/CtsVerifier/src/com/android/cts/verifier/sensors/RVCVXCheckAnalyzer.java
+++ b/apps/CtsVerifier/src/com/android/cts/verifier/sensors/RVCVXCheckAnalyzer.java
@@ -65,7 +65,7 @@
 
     private static final boolean OUTPUT_DEBUG_IMAGE = false;
     private static final double VALID_FRAME_THRESHOLD = 0.8;
-    private static final double REPROJECTION_THREASHOLD = 4.0;
+    private static final double REPROJECTION_THREASHOLD_RATIO = 0.008;
     private static final boolean FORCE_CV_ANALYSIS  = false;
     private static final boolean TRACE_VIDEO_ANALYSIS = false;
     private static final double DECIMATION_FPS_TARGET = 15.0;
@@ -884,8 +884,9 @@
                 Log.v(TAG, "Found attitude, re-projection error = " + error);
             }
 
-            // if error is reasonable, add it into the results
-            if (error < REPROJECTION_THREASHOLD) {
+            // if error is reasonable, add it into the results. use ratio to frame height to avoid
+            // discriminating higher definition videos
+            if (error < REPROJECTION_THREASHOLD_RATIO * frameSize.height) {
                 double [] rv = new double[3];
                 double timestamp;
 
diff --git a/apps/CtsVerifier/src/com/android/cts/verifier/sensors/RVCVXCheckTestActivity.java b/apps/CtsVerifier/src/com/android/cts/verifier/sensors/RVCVXCheckTestActivity.java
index e936cf3..789de68 100644
--- a/apps/CtsVerifier/src/com/android/cts/verifier/sensors/RVCVXCheckTestActivity.java
+++ b/apps/CtsVerifier/src/com/android/cts/verifier/sensors/RVCVXCheckTestActivity.java
@@ -93,25 +93,20 @@
 
         mRecPath = "";
 
-        // By default it is a fail, until it is successful.
+        // Test result is fail by default.
         getReportLog().setSummary(
                 "Initialize failed", 0, ResultType.NEUTRAL, ResultUnit.NONE);
 
+        showDetailedTutorialLink();
+
         showUserMessage("Loading OpenCV Library...");
 
-        int retry = 10;
-        while(retry-->0) {
-            try {
-                Thread.sleep(250);
-            } catch (InterruptedException e) {
-                //
-            }
-            if (OpenCVLibrary.isLoaded()) {
-                break;
-            }
-        }
-        if (!OpenCVLibrary.isLoaded()) {
-            // failed requirement test
+        if (!OpenCVLibrary.load(this,
+                false /*allowLocal*/, true/*allowPackage*/, false/*allowInstall*/)) {
+            // cannot load opencv library
+            showUserMessage("Cannot load OpenCV library! Please follow instruction and install " +
+                    "OpenCV Manager 3.0.0 and start this test again.");
+            waitForUserToContinue();
             clearText();
             return;
         }
@@ -131,13 +126,11 @@
                    "horizontal surface.\n" +
                 "2. Start the test and align the yellow square on the screen "+
                    "roughly to the yellow sqaure.\n" +
-                "3. Follow the prompt to orbit the phone around the test " +
+                "3. Follow the prompt to orbit the device around the test " +
                    "pattern while aiming the field of view at the test pattern" +
                    "at the same time.\n" +
                 "4. Wait patiently for the analysis to finish.");
 
-            showDetailedTutorialLink();
-
             waitForUserToContinue();
 
             // prepare sync signal
@@ -372,7 +365,7 @@
     private void showDetailedTutorialLink() {
         TextView textView = new TextView(this);
         textView.setText(Html.fromHtml(
-                    "Detailed instructions can be found at " +
+                    "Detailed test instructions can be found at " +
                     "<A href=\"http://goo.gl/xTwB4d\">http://goo.gl/xTwB4d</a><br>"));
         textView.setMovementMethod(LinkMovementMethod.getInstance());
         textView.setPadding(10, 0, 0, 0);
@@ -428,8 +421,6 @@
 
         // GlSurfaceView is not necessary for this test
         closeGlSurfaceView();
-
-        OpenCVLibrary.loadAsync(this);
     }
 
     @Override
diff --git a/apps/CtsVerifier/src/com/android/cts/verifier/sensors/helpers/OpenCVLibrary.java b/apps/CtsVerifier/src/com/android/cts/verifier/sensors/helpers/OpenCVLibrary.java
index bb8db34..7816e37 100644
--- a/apps/CtsVerifier/src/com/android/cts/verifier/sensors/helpers/OpenCVLibrary.java
+++ b/apps/CtsVerifier/src/com/android/cts/verifier/sensors/helpers/OpenCVLibrary.java
@@ -15,8 +15,11 @@
  */
 package com.android.cts.verifier.sensors.helpers;
 
+import android.content.ComponentName;
 import android.content.Context;
-import android.os.Looper;
+import android.content.Intent;
+import android.content.ServiceConnection;
+import android.os.IBinder;
 import android.util.Log;
 
 import org.opencv.android.BaseLoaderCallback;
@@ -24,41 +27,66 @@
 import org.opencv.android.OpenCVLoader;
 
 import java.util.concurrent.CountDownLatch;
+import java.util.concurrent.TimeUnit;
 
 /**
  * OpenCV library loader class
  */
 public class OpenCVLibrary {
 
-    private static String TAG = "OpenCVLibraryProbe";
-    private static boolean mLoaded = false;
+    private final static String TAG = "OpenCVLibraryProbe";
+    private final static int ASYNC_LOAD_TIMEOUT_SEC = 30;
+    private static boolean sLoaded = false;
 
     /**
      * Load OpenCV Library in async mode
-     * @param context Activity context
+     *
+     * @param context Activity context.
+     * @param allowStatic Allow trying load from local package.
+     * @param allowInstall Allow installing package from play store.
+     *
+     * @return if load succeed return true. Return false otherwise.
      */
-    public static void loadAsync(Context context) {
+    public static boolean load(Context context,
+            boolean allowLocal, boolean allowPackage, boolean allowInstall) {
         // only need to load once
-        if (isLoaded())  return;
-
-        // Load the library through loader
-        OpenCVLoader.initAsync(OpenCVLoader.OPENCV_VERSION_3_0_0, context,
-                new BaseLoaderCallback(context) {
-                    @Override
-                    public void onManagerConnected(int status) {
-                        Log.v(TAG, "New Loading status: "+status);
-                        switch (status) {
-                            case LoaderCallbackInterface.SUCCESS: {
-                                mLoaded = true;
-                            }
-                            break;
-                            default: {
-                                super.onManagerConnected(status);
-                            }
-                            break;
+        if (!sLoaded) {
+            // Try static load first
+            if (allowLocal && OpenCVLoader.initDebug()) {
+                sLoaded = true;
+            } else if (allowPackage) {
+                if (allowInstall || probePackage(context)) {
+                    final CountDownLatch done = new CountDownLatch(1);
+                    // Load the library through async loader
+                    OpenCVLoader.initAsync(OpenCVLoader.OPENCV_VERSION_3_0_0, context,
+                            new BaseLoaderCallback(context) {
+                                @Override
+                                public void onManagerConnected(int status) {
+                                    Log.v(TAG, "New Loading status: " + status);
+                                    switch (status) {
+                                        case LoaderCallbackInterface.SUCCESS: {
+                                            sLoaded = true;
+                                        }
+                                        break;
+                                        default: {
+                                            Log.e(TAG, "Connecting OpenCV Manager failed");
+                                        }
+                                        break;
+                                    }
+                                    done.countDown();
+                                }
+                            });
+                    try {
+                        if (!done.await(ASYNC_LOAD_TIMEOUT_SEC, TimeUnit.SECONDS)) {
+                            Log.e(TAG, "Time out when attempt async load");
                         }
+                    } catch (InterruptedException e) {
+                        Thread.currentThread().interrupt();
                     }
-                });
+                }
+            }
+        }
+        return sLoaded;
     }
 
     /**
@@ -66,6 +94,38 @@
      * @return a boolean indicates whether the OpenCV library is loaded.
      */
     public static boolean isLoaded() {
-        return mLoaded;
+        return sLoaded;
+    }
+
+    /**
+     * Probe if the OpenCV Manager package is installed
+     *
+     * @return a boolean indicate wheather OpenCV Manager is installed
+     */
+    private static boolean probePackage(Context context) {
+        Intent intent = new Intent("org.opencv.engine.BIND");
+        intent.setPackage("org.opencv.engine");
+
+        ServiceConnection conn = new ServiceConnection() {
+            @Override
+            public void onServiceConnected(ComponentName className, IBinder service) {
+                // Do nothing
+            }
+            @Override
+            public void onServiceDisconnected(ComponentName className) {
+                // Do nothing
+            }
+        };
+
+        boolean ret = false;
+        try {
+            if (context.bindService(intent, conn, Context.BIND_AUTO_CREATE)) {
+                ret = true;
+            }
+        } finally {
+            context.unbindService(conn);
+        }
+
+        return ret;
     }
 }
diff --git a/apps/CtsVerifier/src/com/android/cts/verifier/tv/MockTvInputService.java b/apps/CtsVerifier/src/com/android/cts/verifier/tv/MockTvInputService.java
index f875684..3bfac3a 100644
--- a/apps/CtsVerifier/src/com/android/cts/verifier/tv/MockTvInputService.java
+++ b/apps/CtsVerifier/src/com/android/cts/verifier/tv/MockTvInputService.java
@@ -58,8 +58,9 @@
     private static final String SELECT_TRACK_ID = "id";
     private static final String CAPTION_ENABLED = "enabled";
     private static final String PAUSE_CALLED = "pause_called";
+    private static final float DISPLAY_RATIO_EPSILON = 0.01f;
 
-    private static Object sLock = new Object();
+    private static final Object sLock = new Object();
     private static Callback sTuneCallback = null;
     private static Callback sOverlayViewCallback = null;
     private static Callback sBroadcastCallback = null;
@@ -73,6 +74,7 @@
     private static Callback sFastForwardCallback = null;
     private static Callback sSeekToPreviousCallback = null;
     private static Callback sSeekToNextCallback = null;
+    private static Callback sOverlayViewSizeChangedCallback = null;
 
     private static TvContentRating sRating = null;
 
@@ -96,6 +98,15 @@
             new TvTrackInfo.Builder(TvTrackInfo.TYPE_SUBTITLE, "subtitle_kor")
             .setLanguage("kor")
             .build();
+    // These parameters make the display aspect ratio of sDummyVideoTrack be 4:3,
+    // which is one of common standards.
+    static final TvTrackInfo sDummyVideoTrack =
+            new TvTrackInfo.Builder(TvTrackInfo.TYPE_VIDEO, "video_dummy")
+            .setVideoWidth(704)
+            .setVideoHeight(480)
+            .setVideoPixelAspectRatio(0.909f)
+            .setVideoFrameRate(60)
+            .build();
 
     private final BroadcastReceiver mBroadcastReceiver = new BroadcastReceiver() {
         @Override
@@ -196,6 +207,12 @@
         }
     }
 
+    static void expectedVideoAspectRatio(View postTarget, Runnable successCallback) {
+        synchronized (sLock) {
+            sOverlayViewSizeChangedCallback = new Callback(postTarget, successCallback);
+        }
+    }
+
     static String getInputId(Context context) {
         return TvContract.buildInputId(new ComponentName(context,
                         MockTvInputService.class.getName()));
@@ -270,6 +287,7 @@
             mTracks.add(sSpaAudioTrack);
             mTracks.add(sEngSubtitleTrack);
             mTracks.add(sKorSubtitleTrack);
+            mTracks.add(sDummyVideoTrack);
         }
 
         @Override
@@ -324,7 +342,9 @@
         @Override
         public boolean onSetSurface(Surface surface) {
             mSurface = surface;
-            draw();
+            if (surface != null) {
+                draw();
+            }
             return true;
         }
 
@@ -350,6 +370,8 @@
             notifyTracksChanged(mTracks);
             notifyTrackSelected(TvTrackInfo.TYPE_AUDIO, sEngAudioTrack.getId());
             notifyTrackSelected(TvTrackInfo.TYPE_SUBTITLE, null);
+            notifyTrackSelected(TvTrackInfo.TYPE_VIDEO, sDummyVideoTrack.getId());
+
             notifyTimeShiftStatusChanged(TvInputManager.TIME_SHIFT_STATUS_AVAILABLE);
             mRecordStartTimeMs = mCurrentPositionMs = mLastCurrentPositionUpdateTimeMs
                     = System.currentTimeMillis();
@@ -480,6 +502,30 @@
             }
             mSpeed = params.getSpeed();
         }
+
+        @Override
+        public void onOverlayViewSizeChanged(int width, int height) {
+            synchronized(sLock) {
+                draw();
+                if (sOverlayViewSizeChangedCallback != null) {
+                    if (sDummyVideoTrack.getVideoHeight() <= 0
+                            || sDummyVideoTrack.getVideoWidth() <= 0) {
+                        Log.w(TAG,
+                                "The width or height of the selected video track is invalid.");
+                    } else if (height <= 0 || width <= 0) {
+                        Log.w(TAG, "The width or height of the OverlayView is incorrect.");
+                    } else if (Math.abs((float)width / height
+                            - (float)sDummyVideoTrack.getVideoWidth()
+                            * sDummyVideoTrack.getVideoPixelAspectRatio()
+                            / sDummyVideoTrack.getVideoHeight()) < DISPLAY_RATIO_EPSILON) {
+                        // Verify the video display aspect ratio is correct
+                        // and setVideoPixelAspectRatio() works for the view size.
+                        sOverlayViewSizeChangedCallback.post();
+                        sOverlayViewSizeChangedCallback = null;
+                    }
+                }
+            }
+        }
     }
 
     private static class Callback {
diff --git a/apps/CtsVerifier/src/com/android/cts/verifier/tv/TvInputDiscoveryTestActivity.java b/apps/CtsVerifier/src/com/android/cts/verifier/tv/TvInputDiscoveryTestActivity.java
index e8e2cee..d088e2d 100644
--- a/apps/CtsVerifier/src/com/android/cts/verifier/tv/TvInputDiscoveryTestActivity.java
+++ b/apps/CtsVerifier/src/com/android/cts/verifier/tv/TvInputDiscoveryTestActivity.java
@@ -45,11 +45,13 @@
     private View mVerifyTuneItem;
     private View mVerifyOverlayViewItem;
     private View mVerifyGlobalSearchItem;
+    private View mVerifyOverlayViewSizeChanged;
     private View mGoToEpgItem;
     private View mVerifyEpgItem;
     private boolean mTuneVerified;
     private boolean mOverlayViewVerified;
     private boolean mGlobalSearchVerified;
+    private boolean mOverlayViewSizeChangedVerified;
 
     @Override
     public void onClick(View v) {
@@ -91,6 +93,16 @@
                     goToNextState(postTarget, failCallback);
                 }
             });
+            MockTvInputService.expectedVideoAspectRatio(postTarget, new Runnable() {
+                @Override
+                public void run() {
+                    postTarget.removeCallbacks(failCallback);
+                    setPassState(mVerifyOverlayViewSizeChanged, true);
+
+                    mOverlayViewSizeChangedVerified = true;
+                    goToNextState(postTarget, failCallback);
+                }
+            });
             MockTvInputService.expectOverlayView(postTarget, new Runnable() {
                 @Override
                 public void run() {
@@ -124,6 +136,8 @@
         mVerifyTuneItem = createAutoItem(R.string.tv_input_discover_test_verify_tune);
         mVerifyOverlayViewItem = createAutoItem(
                 R.string.tv_input_discover_test_verify_overlay_view);
+        mVerifyOverlayViewSizeChanged = createAutoItem(
+                R.string.tv_input_discover_test_verify_size_changed);
         mVerifyGlobalSearchItem = createAutoItem(
                 R.string.tv_input_discover_test_verify_global_search);
         mGoToEpgItem = createUserItem(R.string.tv_input_discover_test_go_to_epg,
@@ -139,7 +153,8 @@
     }
 
     private void goToNextState(View postTarget, Runnable failCallback) {
-        if (mTuneVerified && mOverlayViewVerified && mGlobalSearchVerified) {
+        if (mTuneVerified && mOverlayViewVerified
+                && mGlobalSearchVerified && mOverlayViewSizeChangedVerified) {
             postTarget.removeCallbacks(failCallback);
             setButtonEnabled(mGoToEpgItem, true);
         }
diff --git a/tests/camera/src/android/hardware/camera2/cts/CaptureRequestTest.java b/tests/camera/src/android/hardware/camera2/cts/CaptureRequestTest.java
index ffbe432..c3ac01d 100644
--- a/tests/camera/src/android/hardware/camera2/cts/CaptureRequestTest.java
+++ b/tests/camera/src/android/hardware/camera2/cts/CaptureRequestTest.java
@@ -2230,7 +2230,7 @@
             // If unable to find a preview size, then log the failure, and skip this run.
             if (previewSz == null) {
                 if (mStaticInfo.isCapabilitySupported(
-                    CameraCharacteristics.REQUEST_AVAILABLE_CAPABILITIES_MANUAL_SENSOR)) {
+                        CameraCharacteristics.REQUEST_AVAILABLE_CAPABILITIES_MANUAL_SENSOR)) {
                     mCollector.addMessage(String.format(
                             "Unable to find a preview size supporting given fps range %s",
                             fpsRange));
diff --git a/tests/camera/src/android/hardware/camera2/cts/testcases/Camera2SurfaceViewTestCase.java b/tests/camera/src/android/hardware/camera2/cts/testcases/Camera2SurfaceViewTestCase.java
index b7287ae..ee2d5ea 100644
--- a/tests/camera/src/android/hardware/camera2/cts/testcases/Camera2SurfaceViewTestCase.java
+++ b/tests/camera/src/android/hardware/camera2/cts/testcases/Camera2SurfaceViewTestCase.java
@@ -100,6 +100,7 @@
     protected Surface mPreviewSurface;
     protected Size mPreviewSize;
     protected List<Size> mOrderedPreviewSizes; // In descending order.
+    protected List<Size> m1080pBoundedOrderedPreviewSizes; // In descending order.
     protected List<Size> mOrderedVideoSizes; // In descending order.
     protected List<Size> mOrderedStillSizes; // In descending order.
     protected HashMap<Size, Long> mMinPreviewFrameDurationMap;
@@ -567,6 +568,8 @@
         if (mStaticInfo.isColorOutputSupported()) {
             mOrderedPreviewSizes = getSupportedPreviewSizes(cameraId, mCameraManager,
                     getPreviewSizeBound(mWindowManager, PREVIEW_SIZE_BOUND));
+            m1080pBoundedOrderedPreviewSizes = getSupportedPreviewSizes(cameraId, mCameraManager,
+                    PREVIEW_SIZE_BOUND);
             mOrderedVideoSizes = getSupportedVideoSizes(cameraId, mCameraManager, PREVIEW_SIZE_BOUND);
             mOrderedStillSizes = getSupportedStillSizes(cameraId, mCameraManager, null);
             // Use ImageFormat.YUV_420_888 for now. TODO: need figure out what's format for preview
@@ -700,6 +703,22 @@
             }
         }
 
+        // Search again for sizes not bounded by display size
+        for (Size size : m1080pBoundedOrderedPreviewSizes) {
+            Long minDuration = mMinPreviewFrameDurationMap.get(size);
+            if (minDuration == null ||
+                    minDuration == 0) {
+                if (mStaticInfo.isCapabilitySupported(
+                        CameraCharacteristics.REQUEST_AVAILABLE_CAPABILITIES_MANUAL_SENSOR)) {
+                    throw new IllegalArgumentException(
+                            "No min frame duration available for the size " + size);
+                }
+                continue;
+            }
+            if (minDuration <= (frameDurationRange[0] + MIN_FRAME_DURATION_ERROR_MARGIN)) {
+                return size;
+            }
+        }
         return null;
     }
 
diff --git a/tests/leanbackjank/app/res/values/strings.xml b/tests/leanbackjank/app/res/values/strings.xml
index 17edf95..c90bbbc 100644
--- a/tests/leanbackjank/app/res/values/strings.xml
+++ b/tests/leanbackjank/app/res/values/strings.xml
@@ -20,8 +20,6 @@
     <string name="browse_title"><![CDATA[Leanback launcher jank test application]]></string>
     <string name="error">Error</string>
     <string name="ok">OK</string>
-    <string name="grid_item_template">Item %1$d</string>
-    <string name="settings">Settings</string>
 
     <!-- Error messages -->
     <string name="error_fragment_message">An error occurred</string>
diff --git a/tests/leanbackjank/app/src/android/cts/jank/leanback/presenter/CardPresenter.java b/tests/leanbackjank/app/src/android/cts/jank/leanback/presenter/CardPresenter.java
index 9f425ca..7b3b6e9 100644
--- a/tests/leanbackjank/app/src/android/cts/jank/leanback/presenter/CardPresenter.java
+++ b/tests/leanbackjank/app/src/android/cts/jank/leanback/presenter/CardPresenter.java
@@ -30,8 +30,8 @@
  * It contains an Image CardView
  */
 public class CardPresenter extends Presenter {
-    private static int CARD_WIDTH = 313;
-    private static int CARD_HEIGHT = 176;
+    private static int CARD_WIDTH = 560;
+    private static int CARD_HEIGHT = 320;
     private static int sSelectedBackgroundColor;
     private static int sDefaultBackgroundColor;
     private Drawable mDefaultCardImage;
diff --git a/tests/leanbackjank/app/src/android/cts/jank/leanback/presenter/GridItemPresenter.java b/tests/leanbackjank/app/src/android/cts/jank/leanback/presenter/GridItemPresenter.java
deleted file mode 100644
index 4084383..0000000
--- a/tests/leanbackjank/app/src/android/cts/jank/leanback/presenter/GridItemPresenter.java
+++ /dev/null
@@ -1,59 +0,0 @@
-/*
- * Copyright (C) 2015 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package android.cts.jank.leanback.presenter;
-
-import android.graphics.Color;
-import android.support.v17.leanback.widget.Presenter;
-import android.view.Gravity;
-import android.view.ViewGroup;
-import android.widget.TextView;
-
-import android.cts.jank.leanback.R;
-import android.cts.jank.leanback.ui.MainFragment;
-
-public class GridItemPresenter extends Presenter {
-    private static int GRID_ITEM_WIDTH = 200;
-    private static int GRID_ITEM_HEIGHT = 200;
-
-    private MainFragment mainFragment;
-
-    public GridItemPresenter(MainFragment mainFragment) {
-        this.mainFragment = mainFragment;
-    }
-
-    @Override
-    public ViewHolder onCreateViewHolder(ViewGroup parent) {
-        TextView view = new TextView(parent.getContext());
-        view.setLayoutParams(new ViewGroup.LayoutParams(GRID_ITEM_WIDTH, GRID_ITEM_HEIGHT));
-        view.setFocusable(true);
-        view.setFocusableInTouchMode(true);
-        view.setBackgroundColor(
-            mainFragment.getResources().getColor(R.color.default_background, null));
-        view.setTextColor(Color.WHITE);
-        view.setGravity(Gravity.CENTER);
-        return new ViewHolder(view);
-    }
-
-    @Override
-    public void onBindViewHolder(ViewHolder viewHolder, Object item) {
-        ((TextView) viewHolder.view).setText((String) item);
-    }
-
-    @Override
-    public void onUnbindViewHolder(ViewHolder viewHolder) {
-    }
-}
diff --git a/tests/leanbackjank/app/src/android/cts/jank/leanback/ui/MainFragment.java b/tests/leanbackjank/app/src/android/cts/jank/leanback/ui/MainFragment.java
index 037ec13..5b2571d 100644
--- a/tests/leanbackjank/app/src/android/cts/jank/leanback/ui/MainFragment.java
+++ b/tests/leanbackjank/app/src/android/cts/jank/leanback/ui/MainFragment.java
@@ -21,7 +21,6 @@
 import android.cts.jank.leanback.data.VideoProvider;
 import android.cts.jank.leanback.model.Movie;
 import android.cts.jank.leanback.presenter.CardPresenter;
-import android.cts.jank.leanback.presenter.GridItemPresenter;
 import android.cts.jank.leanback.presenter.IconHeaderItemPresenter;
 import android.os.Bundle;
 import android.os.Handler;
@@ -184,15 +183,6 @@
             mRowsAdapter.add(new ListRow(header, listRowAdapter));
         }
 
-        HeaderItem gridHeader = new HeaderItem(i, getString(R.string.settings));
-
-        GridItemPresenter gridPresenter = new GridItemPresenter(this);
-        ArrayObjectAdapter gridRowAdapter = new ArrayObjectAdapter(gridPresenter);
-        for (int j = 0; j < 10; j++) {
-            gridRowAdapter.add(getString(R.string.grid_item_template, j));
-        }
-        mRowsAdapter.add(new ListRow(gridHeader, gridRowAdapter));
-
         setAdapter(mRowsAdapter);
     }
 
diff --git a/tests/tests/permission2/src/android/permission2/cts/NoReceiveSmsPermissionTest.java b/tests/tests/permission2/src/android/permission2/cts/NoReceiveSmsPermissionTest.java
index 6258667..d0cafe9 100644
--- a/tests/tests/permission2/src/android/permission2/cts/NoReceiveSmsPermissionTest.java
+++ b/tests/tests/permission2/src/android/permission2/cts/NoReceiveSmsPermissionTest.java
@@ -26,6 +26,7 @@
 import android.telephony.SmsManager;
 import android.telephony.TelephonyManager;
 import android.test.AndroidTestCase;
+import android.text.TextUtils;
 import android.util.Log;
 
 /**
@@ -78,7 +79,7 @@
             }
         }
 
-        assertTrue("Sms not sent successfully, test environment problem?",
+        assertTrue("[RERUN] Sms not sent successfully. Check signal.",
                 receiver.isMessageSent());
         assertFalse("Sms received without proper permissions", receiver.isSmsReceived());
     }
@@ -93,6 +94,9 @@
                  getContext().getSystemService(Context.TELEPHONY_SERVICE);
         // get current phone number
         String currentNumber = telephony.getLine1Number();
+        assertFalse("[RERUN] SIM card does not provide phone number. Use a suitable SIM Card.",
+                TextUtils.isEmpty(currentNumber));
+
         Log.i(LOG_TAG, String.format("Sending SMS to self: %s", currentNumber));
         sendSms(currentNumber, "test message", sentIntent, deliveryIntent);
     }
diff --git a/tests/tests/security/res/raw/bug_17262540.ico b/tests/tests/security/res/raw/bug_17262540.ico
new file mode 100644
index 0000000..49730df
--- /dev/null
+++ b/tests/tests/security/res/raw/bug_17262540.ico
Binary files differ
diff --git a/tests/tests/security/res/raw/bug_17265466.ico b/tests/tests/security/res/raw/bug_17265466.ico
new file mode 100644
index 0000000..527d657
--- /dev/null
+++ b/tests/tests/security/res/raw/bug_17265466.ico
Binary files differ
diff --git a/tests/tests/security/res/raw/cve_2015_1531_b_19270126.jpg b/tests/tests/security/res/raw/cve_2015_1531_b_19270126.jpg
new file mode 100644
index 0000000..09f8a7e
--- /dev/null
+++ b/tests/tests/security/res/raw/cve_2015_1531_b_19270126.jpg
Binary files differ
diff --git a/tests/tests/security/res/raw/cve_2015_1532.png b/tests/tests/security/res/raw/cve_2015_1532.png
new file mode 100644
index 0000000..57924ae
--- /dev/null
+++ b/tests/tests/security/res/raw/cve_2015_1532.png
Binary files differ
diff --git a/tests/tests/security/res/raw/skia_sigsegv_in_skicoimagedecoder.ico b/tests/tests/security/res/raw/skia_sigsegv_in_skicoimagedecoder.ico
new file mode 100644
index 0000000..f488a24
--- /dev/null
+++ b/tests/tests/security/res/raw/skia_sigsegv_in_skicoimagedecoder.ico
Binary files differ
diff --git a/tests/tests/security/src/android/security/cts/AllocatePixelRefIntOverflowTest.java b/tests/tests/security/src/android/security/cts/AllocatePixelRefIntOverflowTest.java
new file mode 100644
index 0000000..2afa0a5
--- /dev/null
+++ b/tests/tests/security/src/android/security/cts/AllocatePixelRefIntOverflowTest.java
@@ -0,0 +1,42 @@
+/*
+ * Copyright (C) 2016 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.security.cts;
+
+import android.graphics.Bitmap;
+import android.graphics.BitmapFactory;
+import android.test.AndroidTestCase;
+
+import java.io.InputStream;
+
+import com.android.cts.security.R;
+
+public class AllocatePixelRefIntOverflowTest extends AndroidTestCase {
+
+    /**
+     * Verifies that the device is not vulnerable to ANDROID-19270126: Android
+     * BitmapFactory.decodeStream JPG allocPixelRef integer overflow
+     */
+    public void testAllocateJavaPixelRefIntOverflow() {
+        InputStream exploitImage = mContext.getResources().openRawResource(
+                R.raw.cve_2015_1531_b_19270126);
+        /**
+         * The decodeStream method results in SIGSEGV (Segmentation fault) on unpatched devices
+         * while decoding the exploit image which will lead to process crash
+         */
+        BitmapFactory.decodeStream(exploitImage);
+    }
+}
\ No newline at end of file
diff --git a/tests/tests/security/src/android/security/cts/BitmapFactoryDecodeStreamTest.java b/tests/tests/security/src/android/security/cts/BitmapFactoryDecodeStreamTest.java
new file mode 100644
index 0000000..0ee5a3d
--- /dev/null
+++ b/tests/tests/security/src/android/security/cts/BitmapFactoryDecodeStreamTest.java
@@ -0,0 +1,40 @@
+/*
+ * Copyright (C) 2016 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.security.cts;
+
+import android.graphics.BitmapFactory;
+import android.test.AndroidTestCase;
+
+import com.android.cts.security.R;
+
+import java.io.BufferedInputStream;
+import java.io.InputStream;
+
+public class BitmapFactoryDecodeStreamTest extends AndroidTestCase {
+    /*
+     * This test case reproduces the bug in CVE-2015-1532.
+     * It verifies that the BitmapFactory:decodeStream method is not vulnerable
+     * to heap corruption by trying to open a crafted PNG image with incorrect
+     * npTc chunk.
+     */
+    public void testNinePatchHeapOverflow() throws Exception {
+        InputStream inStream = new BufferedInputStream(mContext.getResources().openRawResource(
+                R.raw.cve_2015_1532));
+        BitmapFactory.decodeStream(inStream);
+
+    }
+}
diff --git a/tests/tests/security/src/android/security/cts/SkICOImageDecoderTest.java b/tests/tests/security/src/android/security/cts/SkICOImageDecoderTest.java
new file mode 100644
index 0000000..717772a
--- /dev/null
+++ b/tests/tests/security/src/android/security/cts/SkICOImageDecoderTest.java
@@ -0,0 +1,41 @@
+/*
+ * Copyright (C) 2016 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.security.cts;
+
+import android.graphics.Bitmap;
+import android.graphics.BitmapFactory;
+import android.test.AndroidTestCase;
+
+import java.io.InputStream;
+
+import com.android.cts.security.R;
+
+public class SkICOImageDecoderTest extends AndroidTestCase {
+
+    /**
+     * Verifies that the device is not vulnerable to ANDROID-17265206: Buffer overflow in libskia
+     */
+    public void testAllocateJavaPixelRefOverflow() {
+        InputStream exploitImage = mContext.getResources().openRawResource(
+                R.raw.skia_sigsegv_in_skicoimagedecoder);
+        /**
+         * Pass/Fail not required as the target method for the exploit
+         * results in SIGSEGV (Segmentation fault) which will lead to process crash
+         */
+        BitmapFactory.decodeStream(exploitImage);
+    }
+}
\ No newline at end of file
diff --git a/tests/tests/security/src/android/security/cts/SkiaICORecursiveDecodingTest.java b/tests/tests/security/src/android/security/cts/SkiaICORecursiveDecodingTest.java
new file mode 100644
index 0000000..8fc1a24
--- /dev/null
+++ b/tests/tests/security/src/android/security/cts/SkiaICORecursiveDecodingTest.java
@@ -0,0 +1,48 @@
+/*
+ * Copyright (C) 2016 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.security.cts;
+
+import android.graphics.Bitmap;
+import android.graphics.BitmapFactory;
+import android.test.AndroidTestCase;
+
+import java.io.InputStream;
+
+import com.android.cts.security.R;
+
+public class SkiaICORecursiveDecodingTest extends AndroidTestCase {
+
+    public void test_android_bug_17262540() {
+        doSkiaIcoRecursiveDecodingTest(R.raw.bug_17262540);
+    }
+
+    public void test_android_bug_17265466() {
+        doSkiaIcoRecursiveDecodingTest(R.raw.bug_17265466);
+    }
+
+    /**
+     * Verifies that the device prevents recursive decoding of malformed ICO files
+     */
+    public void doSkiaIcoRecursiveDecodingTest(int resId) {
+        InputStream exploitImage = mContext.getResources().openRawResource(resId);
+        /**
+         * The decodeStream method results in SIGSEGV (Segmentation fault) on unpatched devices
+         * while decoding the exploit image which will lead to process crash
+         */
+        Bitmap bitmap = BitmapFactory.decodeStream(exploitImage);
+    }
+}
\ No newline at end of file
diff --git a/tools/tradefed-host/src/com/android/cts/tradefed/build/CtsBuildProvider.java b/tools/tradefed-host/src/com/android/cts/tradefed/build/CtsBuildProvider.java
index a578088..8a3d98c 100644
--- a/tools/tradefed-host/src/com/android/cts/tradefed/build/CtsBuildProvider.java
+++ b/tools/tradefed-host/src/com/android/cts/tradefed/build/CtsBuildProvider.java
@@ -31,7 +31,7 @@
     @Option(name="cts-install-path", description="the path to the cts installation to use")
     private String mCtsRootDirPath = System.getProperty("CTS_ROOT");
 
-    public static final String CTS_BUILD_VERSION = "6.0_r6";
+    public static final String CTS_BUILD_VERSION = "6.0_r7";
     public static final String CTS_PACKAGE = "com.android.cts.tradefed.testtype";
 
     /**