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";
/**