Merge "Removing EGLCleanupTest#TestNoReleaseCurrent from test."
diff --git a/apps/CtsVerifier/AndroidManifest.xml b/apps/CtsVerifier/AndroidManifest.xml
index f026eb1..603f03f 100644
--- a/apps/CtsVerifier/AndroidManifest.xml
+++ b/apps/CtsVerifier/AndroidManifest.xml
@@ -20,8 +20,8 @@
android:versionCode="1"
android:versionName="1337">
- <!-- Using 10 for more complete NFC support... -->
- <uses-sdk android:minSdkVersion="11"></uses-sdk>
+ <!-- Using 10+ for more complete NFC support... -->
+ <uses-sdk android:minSdkVersion="12"></uses-sdk>
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
@@ -41,6 +41,8 @@
<uses-permission android:name="android.permission.RECORD_AUDIO" />
<uses-permission android:name="android.permission.WAKE_LOCK" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
+ <uses-permission android:name="com.android.alarm.permission.SET_ALARM" />
+
<uses-feature android:name="android.hardware.usb.accessory" />
<!-- Needed by the Audio Quality Verifier to store the sound samples that will be mailed. -->
@@ -52,7 +54,6 @@
android:debuggable="true"
android:largeHeap="true">
- <uses-library android:name="com.android.future.usb.accessory" />
<meta-data android:name="com.google.android.backup.api_key"
android:value="AEdPqrEAAAAIbK6ldcOzoeRtQ1u1dFVJ1A7KetRhit-a1Xa82Q" />
@@ -470,7 +471,7 @@
</intent-filter>
<meta-data android:name="test_category" android:value="@string/test_category_camera" />
<meta-data android:name="test_required_features" android:value="android.hardware.sensor.gyroscope" />
- <meta-data android:name="test_required_features" android:value="android.hardware.camera.any"/>
+ <meta-data android:name="test_required_features" android:value="android.hardware.camera"/>
</activity>
<activity
android:name=".camera.fov.DetermineFovActivity"
@@ -578,6 +579,18 @@
<meta-data android:name="test_category" android:value="@string/test_category_other" />
</activity>
+ <activity android:name=".deskclock.DeskClockTestsActivity"
+ android:label="@string/deskclock_tests">
+ <intent-filter>
+ <action android:name="android.intent.action.MAIN" />
+ <category android:name="android.cts.intent.category.MANUAL_TEST" />
+ </intent-filter>
+ <meta-data android:name="test_category" android:value="@string/test_category_deskclock" />
+ </activity>
+
+ <activity android:name=".deskclock.ShowAlarmsTestActivity"
+ android:label="@string/dc_show_alarms_test"/>
+
<receiver android:name=".widget.WidgetCtsProvider">
<intent-filter>
<action android:name="android.appwidget.action.APPWIDGET_UPDATE" />
diff --git a/apps/CtsVerifier/res/layout/dc_show_alarms.xml b/apps/CtsVerifier/res/layout/dc_show_alarms.xml
new file mode 100644
index 0000000..06a2bb1
--- /dev/null
+++ b/apps/CtsVerifier/res/layout/dc_show_alarms.xml
@@ -0,0 +1,35 @@
+<?xml version="1.0" encoding="utf-8"?>
+
+<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent"
+ >
+
+ <LinearLayout android:orientation="vertical"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:layout_alignParentTop="true"
+ android:padding="5dp"
+ >
+
+ <TextView android:layout_width="wrap_content"
+ android:textSize="18sp"
+ android:layout_height="wrap_content"
+ android:text="@string/dc_show_alarms_test_info"
+ />
+
+ <Button android:id="@+id/dc_show_alarms"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:text="@string/dc_show_alarms_button"
+ />
+ </LinearLayout>
+
+ <LinearLayout
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:layout_alignParentBottom="true"
+ >
+ <include layout="@layout/pass_fail_buttons" />
+ </LinearLayout>
+</RelativeLayout>
diff --git a/apps/CtsVerifier/res/values/strings.xml b/apps/CtsVerifier/res/values/strings.xml
index f787fda..ff5e78a 100644
--- a/apps/CtsVerifier/res/values/strings.xml
+++ b/apps/CtsVerifier/res/values/strings.xml
@@ -32,6 +32,7 @@
<string name="test_category_security">Security</string>
<string name="test_category_streaming">Streaming</string>
<string name="test_category_features">Features</string>
+ <string name="test_category_deskclock">Desk Clock</string>
<string name="test_category_other">Other</string>
<string name="clear">Clear</string>
<string name="test_results_cleared">Test results cleared.</string>
@@ -662,4 +663,22 @@
<string name="widget_name">Widget Framework Test</string>
<string name="widget_pass">Pass</string>
<string name="widget_fail">Fail</string>
+
+ <!-- Strings for DeskClock -->
+ <string name="deskclock_tests">Desk Clock Tests</string>
+ <string name="deskclock_tests_info">
+ The Desk Clock tests verify that the Desk Clock app implements the Clock API\'s properly.
+ </string>
+ <string name="deskclock_group_alarms">Alarms</string>
+ <string name="deskclock_group_timers">Timers</string>
+
+ <string name="dc_show_alarms_test">Show Alarms Test</string>
+ <string name="dc_show_alarms_test_info">
+ This test verifies that the SHOW_ALARMS API works.\n
+ 1. Press the "Show Alarms" button.\n
+ 2. Verify that the Desk Clock app is launched and displays the Alarms section\n
+ </string>
+ <string name="dc_show_alarms_button">Show Alarms</string>
+
+
</resources>
diff --git a/apps/CtsVerifier/src/com/android/cts/verifier/deskclock/DeskClockTestsActivity.java b/apps/CtsVerifier/src/com/android/cts/verifier/deskclock/DeskClockTestsActivity.java
new file mode 100644
index 0000000..91b9b98
--- /dev/null
+++ b/apps/CtsVerifier/src/com/android/cts/verifier/deskclock/DeskClockTestsActivity.java
@@ -0,0 +1,52 @@
+// Copyright 2013 Google Inc. All Rights Reserved.
+
+package com.android.cts.verifier.deskclock;
+
+import android.content.Intent;
+import android.database.DataSetObserver;
+import android.os.Bundle;
+
+import com.android.cts.verifier.ArrayTestListAdapter;
+import com.android.cts.verifier.PassFailButtons;
+import com.android.cts.verifier.R;
+import com.android.cts.verifier.TestListAdapter.TestListItem;
+
+/**
+ * Activity that lists all the DeskClock tests.
+ */
+public class DeskClockTestsActivity extends PassFailButtons.TestListActivity {
+
+ @Override
+ protected void onCreate(Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+ setContentView(R.layout.pass_fail_list);
+ setInfoResources(R.string.deskclock_tests, R.string.deskclock_tests_info, 0);
+ setPassFailButtonClickListeners();
+
+ getPassButton().setEnabled(false);
+
+ final ArrayTestListAdapter adapter = new ArrayTestListAdapter(this);
+
+ adapter.add(TestListItem.newCategory(this, R.string.deskclock_group_alarms));
+ adapter.add(TestListItem.newTest(this,
+ R.string.dc_show_alarms_test,
+ ShowAlarmsTestActivity.class.getName(),
+ new Intent(this, ShowAlarmsTestActivity.class), null));
+
+ adapter.registerDataSetObserver(new DataSetObserver() {
+ @Override
+ public void onChanged() {
+ updatePassButton();
+ }
+ });
+
+ setTestListAdapter(adapter);
+ }
+
+ /**
+ * Enable Pass Button when the all tests passed.
+ */
+ private void updatePassButton() {
+ getPassButton().setEnabled(mAdapter.allTestsPassed());
+ }
+}
diff --git a/apps/CtsVerifier/src/com/android/cts/verifier/deskclock/ShowAlarmsTestActivity.java b/apps/CtsVerifier/src/com/android/cts/verifier/deskclock/ShowAlarmsTestActivity.java
new file mode 100644
index 0000000..0ce8f51
--- /dev/null
+++ b/apps/CtsVerifier/src/com/android/cts/verifier/deskclock/ShowAlarmsTestActivity.java
@@ -0,0 +1,37 @@
+// Copyright 2013 Google Inc. All Rights Reserved.
+
+package com.android.cts.verifier.deskclock;
+
+import android.content.Intent;
+import android.os.Bundle;
+import android.provider.AlarmClock;
+import android.view.View;
+import android.view.View.OnClickListener;
+
+import com.android.cts.verifier.PassFailButtons;
+import com.android.cts.verifier.R;
+
+public class ShowAlarmsTestActivity extends PassFailButtons.Activity implements OnClickListener {
+
+
+ @Override
+ protected void onCreate(Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+ setContentView(R.layout.dc_show_alarms);
+ setPassFailButtonClickListeners();
+
+ final View button = findViewById(R.id.dc_show_alarms);
+ button.setOnClickListener(this);
+ }
+
+ @Override
+ protected void onResume() {
+ super.onResume();
+ setResult(RESULT_CANCELED);
+ }
+
+ @Override
+ public void onClick(View v) {
+ startActivity(new Intent(AlarmClock.ACTION_SHOW_ALARMS));
+ }
+}
diff --git a/apps/CtsVerifier/src/com/android/cts/verifier/features/FeatureSummaryActivity.java b/apps/CtsVerifier/src/com/android/cts/verifier/features/FeatureSummaryActivity.java
index 46963a0..1a68b48 100644
--- a/apps/CtsVerifier/src/com/android/cts/verifier/features/FeatureSummaryActivity.java
+++ b/apps/CtsVerifier/src/com/android/cts/verifier/features/FeatureSummaryActivity.java
@@ -154,7 +154,7 @@
public static final Feature[] ALL_HONEYCOMB_MR1_FEATURES = {
new Feature("android.hardware.usb.host", false),
- new Feature("android.hardware.usb.accessory", true),
+ new Feature("android.hardware.usb.accessory", false),
};
public static final Feature[] ALL_HONEYCOMB_MR2_FEATURES = {
diff --git a/tests/plans/CTS-flaky.xml b/tests/plans/CTS-flaky.xml
new file mode 100644
index 0000000..1c2c30d
--- /dev/null
+++ b/tests/plans/CTS-flaky.xml
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<TestPlan version="1.0">
+ <Entry uri="android.app" exclude="android.app.backup.cts.BackupAgentHelperTest#testAndroidtestCaseSetupProperly;android.app.backup.cts.BackupAgentHelperTest#testBackupAGentHelper;android.app.backup.cts.BackupAgentTest#testAndroidTestCaseSetupProperly;android.app.backup.cts.BackupAgentTest#testBackupAgent;android.app.backup.cts.BackupManagerTest#testAndroidTestCaseSetupProperly;android.app.backup.cts.BackupManagerTest#testBackupManager;android.app.backup"/>
+ <Entry uri="android.hardware"/>
+ <Entry uri="android.media"/>
+ <Entry uri="android.net"/>
+ <Entry uri="android.provider"/>
+</TestPlan>
diff --git a/tests/plans/CTS-stable.xml b/tests/plans/CTS-stable.xml
new file mode 100644
index 0000000..984d709
--- /dev/null
+++ b/tests/plans/CTS-stable.xml
@@ -0,0 +1,68 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<TestPlan version="1.0">
+ <Entry uri="android.aadb"/>
+ <Entry uri="android.acceleration"/>
+ <Entry uri="android.accessibility"/>
+ <Entry uri="android.accessibilityservice"/>
+ <Entry uri="android.accounts"/>
+ <Entry uri="android.admin"/>
+ <Entry uri="android.animation"/>
+ <Entry uri="android.app" exclude="android.app.cts.AlertDialogTest#testAlertDialogCancelable;android.app.cts.AlertDialogTest#testCallback"/>
+ <Entry uri="android.bluetooth"/>
+ <Entry uri="android.calendarcommon"/>
+ <Entry uri="android.content"/>
+ <Entry uri="android.core.tests.libcore.package.com"/>
+ <Entry uri="android.core.tests.libcore.package.dalvik"/>
+ <Entry uri="android.core.tests.libcore.package.libcore"/>
+ <Entry uri="android.core.tests.libcore.package.org"/>
+ <Entry uri="android.core.tests.libcore.package.sun"/>
+ <Entry uri="android.core.tests.libcore.package.tests"/>
+ <Entry uri="android.core.vm-tests-tf"/>
+ <Entry uri="android.database"/>
+ <Entry uri="android.display"/>
+ <Entry uri="android.dpi"/>
+ <Entry uri="android.dpi2"/>
+ <Entry uri="android.dreams"/>
+ <Entry uri="android.drm"/>
+ <Entry uri="android.effect"/>
+ <Entry uri="android.example"/>
+ <Entry uri="android.gesture"/>
+ <Entry uri="android.graphics"/>
+ <Entry uri="android.graphics2"/>
+ <Entry uri="android.hardware" exclude="android.hardware.cts.CameraTest#testCancelAutofocus"/>
+ <Entry uri="android.holo"/>
+ <Entry uri="android.jni"/>
+ <Entry uri="android.keystore"/>
+ <Entry uri="android.location"/>
+ <Entry uri="android.media" exclude="android.media.cts.DecodeEditEncodeTest#testVideoEditQCIF"/>
+ <Entry uri="android.mediastress"/>
+ <Entry uri="android.nativemedia.sl"/>
+ <Entry uri="android.nativemedia.xa"/>
+ <Entry uri="android.nativeopengl"/>
+ <Entry uri="android.ndef"/>
+ <Entry uri="android.net" exclude="android.net.cts.SSLCertificateSocketFactoryTest#testCreateSocket;android.net.cts.trafficStatsTest#testTrafficStatsForLocalhost;android.net.wifi.cts.ScanResultTest#testScanResultTimeStamp"/>
+ <Entry uri="android.opengl"/>
+ <Entry uri="android.openglperf"/>
+ <Entry uri="android.os"/>
+ <Entry uri="android.permission"/>
+ <Entry uri="android.permission2"/>
+ <Entry uri="android.preference"/>
+ <Entry uri="android.preference2"/>
+ <Entry uri="android.provider" exclude="android.provider.cts.MediaStore_Images_MediaTest#testInsertImageWithBitmap;android.provider.cts.MediaStore_Images_MediaTes#testInsertImageWithImagePath;android.provider.cts.MediaStore_Images_ThumbnailsTest#testQueryExternalMiniThumbnails"/>
+ <Entry uri="android.renderscript"/>
+ <Entry uri="android.sax"/>
+ <Entry uri="android.security"/>
+ <Entry uri="android.speech"/>
+ <Entry uri="android.telephony"/>
+ <Entry uri="android.tests.appsecurity"/>
+ <Entry uri="android.tests.sigtest"/>
+ <Entry uri="android.text"/>
+ <Entry uri="android.textureview"/>
+ <Entry uri="android.theme"/>
+ <Entry uri="android.uiautomator"/>
+ <Entry uri="android.util"/>
+ <Entry uri="android.view"/>
+ <Entry uri="android.webkit"/>
+ <Entry uri="android.widget"/>
+ <Entry uri="zzz.android.monkey"/>
+</TestPlan>
diff --git a/tests/tests/content/src/android/content/cts/AvailableIntentsTest.java b/tests/tests/content/src/android/content/cts/AvailableIntentsTest.java
index a06b603..87d9039 100644
--- a/tests/tests/content/src/android/content/cts/AvailableIntentsTest.java
+++ b/tests/tests/content/src/android/content/cts/AvailableIntentsTest.java
@@ -16,11 +16,13 @@
package android.content.cts;
+import android.app.DownloadManager;
import android.app.SearchManager;
import android.content.ContentUris;
import android.content.Intent;
import android.content.pm.PackageManager;
import android.content.pm.ResolveInfo;
+import android.media.RingtoneManager;
import android.net.Uri;
import android.provider.AlarmClock;
import android.provider.MediaStore;
@@ -197,4 +199,33 @@
intent.putExtra(AlarmClock.EXTRA_MINUTES, 0);
assertCanBeHandled(intent);
}
+
+ public void testOpenDocumentAny() {
+ Intent intent = new Intent(Intent.ACTION_OPEN_DOCUMENT);
+ intent.addCategory(Intent.CATEGORY_OPENABLE);
+ intent.setType("*/*");
+ assertCanBeHandled(intent);
+ }
+
+ public void testOpenDocumentImage() {
+ Intent intent = new Intent(Intent.ACTION_OPEN_DOCUMENT);
+ intent.addCategory(Intent.CATEGORY_OPENABLE);
+ intent.setType("image/*");
+ assertCanBeHandled(intent);
+ }
+
+ public void testCreateDocument() {
+ Intent intent = new Intent(Intent.ACTION_CREATE_DOCUMENT);
+ intent.addCategory(Intent.CATEGORY_OPENABLE);
+ intent.setType("text/plain");
+ assertCanBeHandled(intent);
+ }
+
+ public void testRingtonePicker() {
+ assertCanBeHandled(new Intent(RingtoneManager.ACTION_RINGTONE_PICKER));
+ }
+
+ public void testViewDownloads() {
+ assertCanBeHandled(new Intent(DownloadManager.ACTION_VIEW_DOWNLOADS));
+ }
}
diff --git a/tests/tests/hardware/src/android/hardware/camera2/cts/CameraCharacteristicsTest.java b/tests/tests/hardware/src/android/hardware/camera2/cts/CameraCharacteristicsTest.java
index 4745100..1a07a39 100644
--- a/tests/tests/hardware/src/android/hardware/camera2/cts/CameraCharacteristicsTest.java
+++ b/tests/tests/hardware/src/android/hardware/camera2/cts/CameraCharacteristicsTest.java
@@ -27,13 +27,18 @@
import android.content.Context;
import android.hardware.camera2.CameraCharacteristics;
import android.hardware.camera2.CameraManager;
+import android.hardware.camera2.CameraMetadata.Key;
import android.test.AndroidTestCase;
+import android.util.Log;
+
+import java.util.List;
/**
* Auto-generated CTS test for CameraCharacteristics fields.
*/
public class CameraCharacteristicsTest extends AndroidTestCase {
private CameraManager mCameraManager;
+ private static final String TAG = "CameraCharacteristicsTest";
@Override
public void setContext(Context context) {
@@ -60,6 +65,12 @@
props);
assertNotNull("Invalid property: android.control.aeAvailableAntibandingModes",
props.get(CameraCharacteristics.CONTROL_AE_AVAILABLE_ANTIBANDING_MODES));
+
+ List<Key<?>> allKeys = props.getKeys();
+ assertNotNull(String.format("Can't get camera characteristics keys from: ID %s", ids[i],
+ props));
+ assertTrue("Key not in keys list: android.control.aeAvailableAntibandingModes",
+ allKeys.contains(CameraCharacteristics.CONTROL_AE_AVAILABLE_ANTIBANDING_MODES));
}
}
@@ -71,6 +82,12 @@
props);
assertNotNull("Invalid property: android.control.aeAvailableTargetFpsRanges",
props.get(CameraCharacteristics.CONTROL_AE_AVAILABLE_TARGET_FPS_RANGES));
+
+ List<Key<?>> allKeys = props.getKeys();
+ assertNotNull(String.format("Can't get camera characteristics keys from: ID %s", ids[i],
+ props));
+ assertTrue("Key not in keys list: android.control.aeAvailableTargetFpsRanges",
+ allKeys.contains(CameraCharacteristics.CONTROL_AE_AVAILABLE_TARGET_FPS_RANGES));
}
}
@@ -82,6 +99,12 @@
props);
assertNotNull("Invalid property: android.control.aeCompensationRange",
props.get(CameraCharacteristics.CONTROL_AE_COMPENSATION_RANGE));
+
+ List<Key<?>> allKeys = props.getKeys();
+ assertNotNull(String.format("Can't get camera characteristics keys from: ID %s", ids[i],
+ props));
+ assertTrue("Key not in keys list: android.control.aeCompensationRange",
+ allKeys.contains(CameraCharacteristics.CONTROL_AE_COMPENSATION_RANGE));
}
}
@@ -93,6 +116,12 @@
props);
assertNotNull("Invalid property: android.control.aeCompensationStep",
props.get(CameraCharacteristics.CONTROL_AE_COMPENSATION_STEP));
+
+ List<Key<?>> allKeys = props.getKeys();
+ assertNotNull(String.format("Can't get camera characteristics keys from: ID %s", ids[i],
+ props));
+ assertTrue("Key not in keys list: android.control.aeCompensationStep",
+ allKeys.contains(CameraCharacteristics.CONTROL_AE_COMPENSATION_STEP));
}
}
@@ -104,6 +133,12 @@
props);
assertNotNull("Invalid property: android.control.afAvailableModes",
props.get(CameraCharacteristics.CONTROL_AF_AVAILABLE_MODES));
+
+ List<Key<?>> allKeys = props.getKeys();
+ assertNotNull(String.format("Can't get camera characteristics keys from: ID %s", ids[i],
+ props));
+ assertTrue("Key not in keys list: android.control.afAvailableModes",
+ allKeys.contains(CameraCharacteristics.CONTROL_AF_AVAILABLE_MODES));
}
}
@@ -115,6 +150,12 @@
props);
assertNotNull("Invalid property: android.control.availableEffects",
props.get(CameraCharacteristics.CONTROL_AVAILABLE_EFFECTS));
+
+ List<Key<?>> allKeys = props.getKeys();
+ assertNotNull(String.format("Can't get camera characteristics keys from: ID %s", ids[i],
+ props));
+ assertTrue("Key not in keys list: android.control.availableEffects",
+ allKeys.contains(CameraCharacteristics.CONTROL_AVAILABLE_EFFECTS));
}
}
@@ -126,6 +167,12 @@
props);
assertNotNull("Invalid property: android.control.availableSceneModes",
props.get(CameraCharacteristics.CONTROL_AVAILABLE_SCENE_MODES));
+
+ List<Key<?>> allKeys = props.getKeys();
+ assertNotNull(String.format("Can't get camera characteristics keys from: ID %s", ids[i],
+ props));
+ assertTrue("Key not in keys list: android.control.availableSceneModes",
+ allKeys.contains(CameraCharacteristics.CONTROL_AVAILABLE_SCENE_MODES));
}
}
@@ -137,6 +184,12 @@
props);
assertNotNull("Invalid property: android.control.availableVideoStabilizationModes",
props.get(CameraCharacteristics.CONTROL_AVAILABLE_VIDEO_STABILIZATION_MODES));
+
+ List<Key<?>> allKeys = props.getKeys();
+ assertNotNull(String.format("Can't get camera characteristics keys from: ID %s", ids[i],
+ props));
+ assertTrue("Key not in keys list: android.control.availableVideoStabilizationModes",
+ allKeys.contains(CameraCharacteristics.CONTROL_AVAILABLE_VIDEO_STABILIZATION_MODES));
}
}
@@ -148,6 +201,12 @@
props);
assertNotNull("Invalid property: android.control.awbAvailableModes",
props.get(CameraCharacteristics.CONTROL_AWB_AVAILABLE_MODES));
+
+ List<Key<?>> allKeys = props.getKeys();
+ assertNotNull(String.format("Can't get camera characteristics keys from: ID %s", ids[i],
+ props));
+ assertTrue("Key not in keys list: android.control.awbAvailableModes",
+ allKeys.contains(CameraCharacteristics.CONTROL_AWB_AVAILABLE_MODES));
}
}
@@ -159,6 +218,12 @@
props);
assertNotNull("Invalid property: android.control.maxRegions",
props.get(CameraCharacteristics.CONTROL_MAX_REGIONS));
+
+ List<Key<?>> allKeys = props.getKeys();
+ assertNotNull(String.format("Can't get camera characteristics keys from: ID %s", ids[i],
+ props));
+ assertTrue("Key not in keys list: android.control.maxRegions",
+ allKeys.contains(CameraCharacteristics.CONTROL_MAX_REGIONS));
}
}
@@ -170,6 +235,12 @@
props);
assertNotNull("Invalid property: android.flash.info.available",
props.get(CameraCharacteristics.FLASH_INFO_AVAILABLE));
+
+ List<Key<?>> allKeys = props.getKeys();
+ assertNotNull(String.format("Can't get camera characteristics keys from: ID %s", ids[i],
+ props));
+ assertTrue("Key not in keys list: android.flash.info.available",
+ allKeys.contains(CameraCharacteristics.FLASH_INFO_AVAILABLE));
}
}
@@ -181,6 +252,12 @@
props);
assertNotNull("Invalid property: android.jpeg.availableThumbnailSizes",
props.get(CameraCharacteristics.JPEG_AVAILABLE_THUMBNAIL_SIZES));
+
+ List<Key<?>> allKeys = props.getKeys();
+ assertNotNull(String.format("Can't get camera characteristics keys from: ID %s", ids[i],
+ props));
+ assertTrue("Key not in keys list: android.jpeg.availableThumbnailSizes",
+ allKeys.contains(CameraCharacteristics.JPEG_AVAILABLE_THUMBNAIL_SIZES));
}
}
@@ -192,6 +269,12 @@
props);
assertNotNull("Invalid property: android.lens.facing",
props.get(CameraCharacteristics.LENS_FACING));
+
+ List<Key<?>> allKeys = props.getKeys();
+ assertNotNull(String.format("Can't get camera characteristics keys from: ID %s", ids[i],
+ props));
+ assertTrue("Key not in keys list: android.lens.facing",
+ allKeys.contains(CameraCharacteristics.LENS_FACING));
}
}
@@ -203,6 +286,12 @@
props);
assertNotNull("Invalid property: android.lens.info.availableApertures",
props.get(CameraCharacteristics.LENS_INFO_AVAILABLE_APERTURES));
+
+ List<Key<?>> allKeys = props.getKeys();
+ assertNotNull(String.format("Can't get camera characteristics keys from: ID %s", ids[i],
+ props));
+ assertTrue("Key not in keys list: android.lens.info.availableApertures",
+ allKeys.contains(CameraCharacteristics.LENS_INFO_AVAILABLE_APERTURES));
}
}
@@ -214,6 +303,12 @@
props);
assertNotNull("Invalid property: android.lens.info.availableFilterDensities",
props.get(CameraCharacteristics.LENS_INFO_AVAILABLE_FILTER_DENSITIES));
+
+ List<Key<?>> allKeys = props.getKeys();
+ assertNotNull(String.format("Can't get camera characteristics keys from: ID %s", ids[i],
+ props));
+ assertTrue("Key not in keys list: android.lens.info.availableFilterDensities",
+ allKeys.contains(CameraCharacteristics.LENS_INFO_AVAILABLE_FILTER_DENSITIES));
}
}
@@ -225,6 +320,12 @@
props);
assertNotNull("Invalid property: android.lens.info.availableFocalLengths",
props.get(CameraCharacteristics.LENS_INFO_AVAILABLE_FOCAL_LENGTHS));
+
+ List<Key<?>> allKeys = props.getKeys();
+ assertNotNull(String.format("Can't get camera characteristics keys from: ID %s", ids[i],
+ props));
+ assertTrue("Key not in keys list: android.lens.info.availableFocalLengths",
+ allKeys.contains(CameraCharacteristics.LENS_INFO_AVAILABLE_FOCAL_LENGTHS));
}
}
@@ -236,6 +337,12 @@
props);
assertNotNull("Invalid property: android.lens.info.availableOpticalStabilization",
props.get(CameraCharacteristics.LENS_INFO_AVAILABLE_OPTICAL_STABILIZATION));
+
+ List<Key<?>> allKeys = props.getKeys();
+ assertNotNull(String.format("Can't get camera characteristics keys from: ID %s", ids[i],
+ props));
+ assertTrue("Key not in keys list: android.lens.info.availableOpticalStabilization",
+ allKeys.contains(CameraCharacteristics.LENS_INFO_AVAILABLE_OPTICAL_STABILIZATION));
}
}
@@ -247,6 +354,12 @@
props);
assertNotNull("Invalid property: android.lens.info.hyperfocalDistance",
props.get(CameraCharacteristics.LENS_INFO_HYPERFOCAL_DISTANCE));
+
+ List<Key<?>> allKeys = props.getKeys();
+ assertNotNull(String.format("Can't get camera characteristics keys from: ID %s", ids[i],
+ props));
+ assertTrue("Key not in keys list: android.lens.info.hyperfocalDistance",
+ allKeys.contains(CameraCharacteristics.LENS_INFO_HYPERFOCAL_DISTANCE));
}
}
@@ -258,6 +371,12 @@
props);
assertNotNull("Invalid property: android.lens.info.minimumFocusDistance",
props.get(CameraCharacteristics.LENS_INFO_MINIMUM_FOCUS_DISTANCE));
+
+ List<Key<?>> allKeys = props.getKeys();
+ assertNotNull(String.format("Can't get camera characteristics keys from: ID %s", ids[i],
+ props));
+ assertTrue("Key not in keys list: android.lens.info.minimumFocusDistance",
+ allKeys.contains(CameraCharacteristics.LENS_INFO_MINIMUM_FOCUS_DISTANCE));
}
}
@@ -269,6 +388,12 @@
props);
assertNotNull("Invalid property: android.lens.info.shadingMapSize",
props.get(CameraCharacteristics.LENS_INFO_SHADING_MAP_SIZE));
+
+ List<Key<?>> allKeys = props.getKeys();
+ assertNotNull(String.format("Can't get camera characteristics keys from: ID %s", ids[i],
+ props));
+ assertTrue("Key not in keys list: android.lens.info.shadingMapSize",
+ allKeys.contains(CameraCharacteristics.LENS_INFO_SHADING_MAP_SIZE));
}
}
@@ -280,6 +405,12 @@
props);
assertNotNull("Invalid property: android.request.maxNumOutputStreams",
props.get(CameraCharacteristics.REQUEST_MAX_NUM_OUTPUT_STREAMS));
+
+ List<Key<?>> allKeys = props.getKeys();
+ assertNotNull(String.format("Can't get camera characteristics keys from: ID %s", ids[i],
+ props));
+ assertTrue("Key not in keys list: android.request.maxNumOutputStreams",
+ allKeys.contains(CameraCharacteristics.REQUEST_MAX_NUM_OUTPUT_STREAMS));
}
}
@@ -291,6 +422,12 @@
props);
assertNotNull("Invalid property: android.scaler.availableFormats",
props.get(CameraCharacteristics.SCALER_AVAILABLE_FORMATS));
+
+ List<Key<?>> allKeys = props.getKeys();
+ assertNotNull(String.format("Can't get camera characteristics keys from: ID %s", ids[i],
+ props));
+ assertTrue("Key not in keys list: android.scaler.availableFormats",
+ allKeys.contains(CameraCharacteristics.SCALER_AVAILABLE_FORMATS));
}
}
@@ -302,6 +439,12 @@
props);
assertNotNull("Invalid property: android.scaler.availableJpegMinDurations",
props.get(CameraCharacteristics.SCALER_AVAILABLE_JPEG_MIN_DURATIONS));
+
+ List<Key<?>> allKeys = props.getKeys();
+ assertNotNull(String.format("Can't get camera characteristics keys from: ID %s", ids[i],
+ props));
+ assertTrue("Key not in keys list: android.scaler.availableJpegMinDurations",
+ allKeys.contains(CameraCharacteristics.SCALER_AVAILABLE_JPEG_MIN_DURATIONS));
}
}
@@ -313,6 +456,12 @@
props);
assertNotNull("Invalid property: android.scaler.availableJpegSizes",
props.get(CameraCharacteristics.SCALER_AVAILABLE_JPEG_SIZES));
+
+ List<Key<?>> allKeys = props.getKeys();
+ assertNotNull(String.format("Can't get camera characteristics keys from: ID %s", ids[i],
+ props));
+ assertTrue("Key not in keys list: android.scaler.availableJpegSizes",
+ allKeys.contains(CameraCharacteristics.SCALER_AVAILABLE_JPEG_SIZES));
}
}
@@ -324,6 +473,12 @@
props);
assertNotNull("Invalid property: android.scaler.availableMaxDigitalZoom",
props.get(CameraCharacteristics.SCALER_AVAILABLE_MAX_DIGITAL_ZOOM));
+
+ List<Key<?>> allKeys = props.getKeys();
+ assertNotNull(String.format("Can't get camera characteristics keys from: ID %s", ids[i],
+ props));
+ assertTrue("Key not in keys list: android.scaler.availableMaxDigitalZoom",
+ allKeys.contains(CameraCharacteristics.SCALER_AVAILABLE_MAX_DIGITAL_ZOOM));
}
}
@@ -335,6 +490,12 @@
props);
assertNotNull("Invalid property: android.scaler.availableProcessedMinDurations",
props.get(CameraCharacteristics.SCALER_AVAILABLE_PROCESSED_MIN_DURATIONS));
+
+ List<Key<?>> allKeys = props.getKeys();
+ assertNotNull(String.format("Can't get camera characteristics keys from: ID %s", ids[i],
+ props));
+ assertTrue("Key not in keys list: android.scaler.availableProcessedMinDurations",
+ allKeys.contains(CameraCharacteristics.SCALER_AVAILABLE_PROCESSED_MIN_DURATIONS));
}
}
@@ -346,6 +507,12 @@
props);
assertNotNull("Invalid property: android.scaler.availableProcessedSizes",
props.get(CameraCharacteristics.SCALER_AVAILABLE_PROCESSED_SIZES));
+
+ List<Key<?>> allKeys = props.getKeys();
+ assertNotNull(String.format("Can't get camera characteristics keys from: ID %s", ids[i],
+ props));
+ assertTrue("Key not in keys list: android.scaler.availableProcessedSizes",
+ allKeys.contains(CameraCharacteristics.SCALER_AVAILABLE_PROCESSED_SIZES));
}
}
@@ -357,6 +524,12 @@
props);
assertNotNull("Invalid property: android.sensor.baseGainFactor",
props.get(CameraCharacteristics.SENSOR_BASE_GAIN_FACTOR));
+
+ List<Key<?>> allKeys = props.getKeys();
+ assertNotNull(String.format("Can't get camera characteristics keys from: ID %s", ids[i],
+ props));
+ assertTrue("Key not in keys list: android.sensor.baseGainFactor",
+ allKeys.contains(CameraCharacteristics.SENSOR_BASE_GAIN_FACTOR));
}
}
@@ -368,6 +541,12 @@
props);
assertNotNull("Invalid property: android.sensor.maxAnalogSensitivity",
props.get(CameraCharacteristics.SENSOR_MAX_ANALOG_SENSITIVITY));
+
+ List<Key<?>> allKeys = props.getKeys();
+ assertNotNull(String.format("Can't get camera characteristics keys from: ID %s", ids[i],
+ props));
+ assertTrue("Key not in keys list: android.sensor.maxAnalogSensitivity",
+ allKeys.contains(CameraCharacteristics.SENSOR_MAX_ANALOG_SENSITIVITY));
}
}
@@ -379,6 +558,12 @@
props);
assertNotNull("Invalid property: android.sensor.orientation",
props.get(CameraCharacteristics.SENSOR_ORIENTATION));
+
+ List<Key<?>> allKeys = props.getKeys();
+ assertNotNull(String.format("Can't get camera characteristics keys from: ID %s", ids[i],
+ props));
+ assertTrue("Key not in keys list: android.sensor.orientation",
+ allKeys.contains(CameraCharacteristics.SENSOR_ORIENTATION));
}
}
@@ -390,6 +575,12 @@
props);
assertNotNull("Invalid property: android.sensor.info.activeArraySize",
props.get(CameraCharacteristics.SENSOR_INFO_ACTIVE_ARRAY_SIZE));
+
+ List<Key<?>> allKeys = props.getKeys();
+ assertNotNull(String.format("Can't get camera characteristics keys from: ID %s", ids[i],
+ props));
+ assertTrue("Key not in keys list: android.sensor.info.activeArraySize",
+ allKeys.contains(CameraCharacteristics.SENSOR_INFO_ACTIVE_ARRAY_SIZE));
}
}
@@ -401,6 +592,12 @@
props);
assertNotNull("Invalid property: android.sensor.info.sensitivityRange",
props.get(CameraCharacteristics.SENSOR_INFO_SENSITIVITY_RANGE));
+
+ List<Key<?>> allKeys = props.getKeys();
+ assertNotNull(String.format("Can't get camera characteristics keys from: ID %s", ids[i],
+ props));
+ assertTrue("Key not in keys list: android.sensor.info.sensitivityRange",
+ allKeys.contains(CameraCharacteristics.SENSOR_INFO_SENSITIVITY_RANGE));
}
}
@@ -412,6 +609,12 @@
props);
assertNotNull("Invalid property: android.sensor.info.exposureTimeRange",
props.get(CameraCharacteristics.SENSOR_INFO_EXPOSURE_TIME_RANGE));
+
+ List<Key<?>> allKeys = props.getKeys();
+ assertNotNull(String.format("Can't get camera characteristics keys from: ID %s", ids[i],
+ props));
+ assertTrue("Key not in keys list: android.sensor.info.exposureTimeRange",
+ allKeys.contains(CameraCharacteristics.SENSOR_INFO_EXPOSURE_TIME_RANGE));
}
}
@@ -423,6 +626,12 @@
props);
assertNotNull("Invalid property: android.sensor.info.maxFrameDuration",
props.get(CameraCharacteristics.SENSOR_INFO_MAX_FRAME_DURATION));
+
+ List<Key<?>> allKeys = props.getKeys();
+ assertNotNull(String.format("Can't get camera characteristics keys from: ID %s", ids[i],
+ props));
+ assertTrue("Key not in keys list: android.sensor.info.maxFrameDuration",
+ allKeys.contains(CameraCharacteristics.SENSOR_INFO_MAX_FRAME_DURATION));
}
}
@@ -434,6 +643,12 @@
props);
assertNotNull("Invalid property: android.sensor.info.physicalSize",
props.get(CameraCharacteristics.SENSOR_INFO_PHYSICAL_SIZE));
+
+ List<Key<?>> allKeys = props.getKeys();
+ assertNotNull(String.format("Can't get camera characteristics keys from: ID %s", ids[i],
+ props));
+ assertTrue("Key not in keys list: android.sensor.info.physicalSize",
+ allKeys.contains(CameraCharacteristics.SENSOR_INFO_PHYSICAL_SIZE));
}
}
@@ -445,6 +660,12 @@
props);
assertNotNull("Invalid property: android.statistics.info.availableFaceDetectModes",
props.get(CameraCharacteristics.STATISTICS_INFO_AVAILABLE_FACE_DETECT_MODES));
+
+ List<Key<?>> allKeys = props.getKeys();
+ assertNotNull(String.format("Can't get camera characteristics keys from: ID %s", ids[i],
+ props));
+ assertTrue("Key not in keys list: android.statistics.info.availableFaceDetectModes",
+ allKeys.contains(CameraCharacteristics.STATISTICS_INFO_AVAILABLE_FACE_DETECT_MODES));
}
}
@@ -456,6 +677,12 @@
props);
assertNotNull("Invalid property: android.statistics.info.maxFaceCount",
props.get(CameraCharacteristics.STATISTICS_INFO_MAX_FACE_COUNT));
+
+ List<Key<?>> allKeys = props.getKeys();
+ assertNotNull(String.format("Can't get camera characteristics keys from: ID %s", ids[i],
+ props));
+ assertTrue("Key not in keys list: android.statistics.info.maxFaceCount",
+ allKeys.contains(CameraCharacteristics.STATISTICS_INFO_MAX_FACE_COUNT));
}
}
@@ -467,6 +694,12 @@
props);
assertNotNull("Invalid property: android.tonemap.maxCurvePoints",
props.get(CameraCharacteristics.TONEMAP_MAX_CURVE_POINTS));
+
+ List<Key<?>> allKeys = props.getKeys();
+ assertNotNull(String.format("Can't get camera characteristics keys from: ID %s", ids[i],
+ props));
+ assertTrue("Key not in keys list: android.tonemap.maxCurvePoints",
+ allKeys.contains(CameraCharacteristics.TONEMAP_MAX_CURVE_POINTS));
}
}
@@ -478,6 +711,12 @@
props);
assertNotNull("Invalid property: android.info.supportedHardwareLevel",
props.get(CameraCharacteristics.INFO_SUPPORTED_HARDWARE_LEVEL));
+
+ List<Key<?>> allKeys = props.getKeys();
+ assertNotNull(String.format("Can't get camera characteristics keys from: ID %s", ids[i],
+ props));
+ assertTrue("Key not in keys list: android.info.supportedHardwareLevel",
+ allKeys.contains(CameraCharacteristics.INFO_SUPPORTED_HARDWARE_LEVEL));
}
}
}
diff --git a/tests/tests/hardware/src/android/hardware/camera2/cts/CameraManagerTest.java b/tests/tests/hardware/src/android/hardware/camera2/cts/CameraManagerTest.java
index 2968a47f..7091cac 100644
--- a/tests/tests/hardware/src/android/hardware/camera2/cts/CameraManagerTest.java
+++ b/tests/tests/hardware/src/android/hardware/camera2/cts/CameraManagerTest.java
@@ -75,19 +75,33 @@
String[] ids = mCameraManager.getCameraIdList();
if (VERBOSE) Log.v(TAG, "CameraManager ids: " + Arrays.toString(ids));
- // Test: that if the device has a camera, there must be at least one reported id.
- assertTrue("At least one camera must be detected",
- ! mPackageManager.hasSystemFeature(PackageManager.FEATURE_CAMERA_ANY)
- || ids.length >= 1);
+ /**
+ * Test: that if there is at least one reported id, then the system must have
+ * the FEATURE_CAMERA_ANY feature.
+ */
+ assertTrue("System camera feature and camera id list don't match",
+ ids.length == 0 ||
+ mPackageManager.hasSystemFeature(PackageManager.FEATURE_CAMERA_ANY));
/**
- * Test: that if the device has both front and rear facing cameras, then there
- * must be at lest two reported ids.
+ * Test: that if the device has front or rear facing cameras, then there
+ * must be matched system features.
*/
- assertTrue("At least two cameras must be detected",
- ! mPackageManager.hasSystemFeature(PackageManager.FEATURE_CAMERA)
- || ! mPackageManager.hasSystemFeature(PackageManager.FEATURE_CAMERA_FRONT)
- || ids.length >= 2);
+ for (int i = 0; i < ids.length; i++) {
+ CameraCharacteristics props = mCameraManager.getCameraCharacteristics(ids[i]);
+ assertNotNull("Can't get camera characteristics for camera " + ids[i], props);
+ Integer lensFacing = props.get(CameraCharacteristics.LENS_FACING);
+ assertNotNull("Can't get lens facing info", lensFacing);
+ if (lensFacing == CameraCharacteristics.LENS_FACING_FRONT) {
+ assertTrue("System doesn't have front camera feature",
+ mPackageManager.hasSystemFeature(PackageManager.FEATURE_CAMERA_FRONT));
+ } else if (lensFacing == CameraCharacteristics.LENS_FACING_BACK) {
+ assertTrue("System doesn't have back camera feature",
+ mPackageManager.hasSystemFeature(PackageManager.FEATURE_CAMERA));
+ } else {
+ fail("Unknown camera lens facing " + lensFacing.toString());
+ }
+ }
/**
* Test: that if there is one camera device, then the system must have some
diff --git a/tests/tests/media/src/android/media/cts/PresentationSyncTest.java b/tests/tests/media/src/android/media/cts/PresentationSyncTest.java
index dad5c1b..0f48ac0 100644
--- a/tests/tests/media/src/android/media/cts/PresentationSyncTest.java
+++ b/tests/tests/media/src/android/media/cts/PresentationSyncTest.java
@@ -189,8 +189,7 @@
* <p>
* @throws Exception
*/
- @Suppress
- public void testChoreographed() throws Throwable {
+ public void suppressed_testChoreographed() throws Throwable {
// Get the Surface from the SurfaceView.
// TODO: is it safe to assume that it's ready?
SurfaceHolder holder = getActivity().getSurfaceHolder();
diff --git a/tests/tests/media/src/android/media/cts/Vp8EncoderTest.java b/tests/tests/media/src/android/media/cts/Vp8EncoderTest.java
index c2f0c32..326c959 100644
--- a/tests/tests/media/src/android/media/cts/Vp8EncoderTest.java
+++ b/tests/tests/media/src/android/media/cts/Vp8EncoderTest.java
@@ -21,6 +21,7 @@
import android.media.MediaCodec;
import android.media.MediaCodecInfo.CodecCapabilities;
import android.media.MediaFormat;
+import android.os.Bundle;
import android.test.AndroidTestCase;
import android.util.Log;
@@ -71,6 +72,18 @@
decode(BASIC_IVF);
}
+ /**
+ * Check if MediaCodec.PARAMETER_KEY_REQUEST_SYNC_FRAME is honored.
+ *
+ * At frame 15, request a sync frame. If one does not occur by EOF the
+ * encoder fails. The test does not verify the output stream.
+ */
+ public void testSyncFrame() throws Exception {
+ encodeSyncFrame(R.raw.video_176x144_yv12,
+ 176, // width
+ 144, // height
+ 30); // framerate
+ }
/**
* A basic check if an encoded stream is decodable.
@@ -221,7 +234,8 @@
ivf = new IvfWriter(outputFilename, frameWidth, frameHeight);
// encode loop
long presentationTimeUs = 0;
- int frameIndex = 0;
+ int inputFrameIndex = 0;
+ int outputFrameIndex = 0;
boolean sawInputEOS = false;
boolean sawOutputEOS = false;
@@ -241,8 +255,8 @@
mInputBuffers[inputBufIndex].put(frame);
mInputBuffers[inputBufIndex].rewind();
- presentationTimeUs = (frameIndex * 1000000) / frameRate;
- Log.d(TAG, "Encoding frame at index " + frameIndex);
+ presentationTimeUs = (inputFrameIndex * 1000000) / frameRate;
+ Log.d(TAG, "Encoding frame at index " + inputFrameIndex);
encoder.queueInputBuffer(
inputBufIndex,
0, // offset
@@ -250,7 +264,7 @@
presentationTimeUs,
sawInputEOS ? MediaCodec.BUFFER_FLAG_END_OF_STREAM : 0);
- frameIndex++;
+ inputFrameIndex++;
}
}
@@ -261,6 +275,12 @@
mOutputBuffers[outputBufIndex].rewind();
mOutputBuffers[outputBufIndex].get(buffer, 0, mBufferInfo.size);
+ if ((outputFrameIndex == 0)
+ && ((mBufferInfo.flags & MediaCodec.BUFFER_FLAG_SYNC_FRAME) == 0)) {
+ throw new RuntimeException("First frame is not a sync frame.");
+
+ }
+
if ((mBufferInfo.flags & MediaCodec.BUFFER_FLAG_END_OF_STREAM) != 0) {
sawOutputEOS = true;
} else {
@@ -268,6 +288,8 @@
}
encoder.releaseOutputBuffer(outputBufIndex,
false); // render
+
+ outputFrameIndex++;
} else if (result == MediaCodec.INFO_OUTPUT_BUFFERS_CHANGED) {
mOutputBuffers = encoder.getOutputBuffers();
}
@@ -285,4 +307,128 @@
}
}
}
+
+
+ /**
+ * Request Sync Frames
+ *
+ * MediaCodec will raise an IllegalStateException
+ * whenever vp8 encoder fails to encode a frame.
+ *
+ * This presumes a file with 28 frames. Under normal circumstances there
+ * would only be one sync frame: the first one. This test will request an
+ * additional sync frame at 15 and ensure that it occurs by EOF.
+ *
+ * Color format of input file should be YUV420, and frameWidth,
+ * frameHeight should be supplied correctly as raw input file doesn't
+ * include any header data.
+ *
+ * @param rawInputFd File descriptor for the raw input file (YUV420)
+ * @param frameWidth Frame width of input file
+ * @param frameHeight Frame height of input file
+ * @param frameRate Frame rate of input file in frames per second
+ */
+ private void encodeSyncFrame(int rawInputFd, int frameWidth,
+ int frameHeight, int frameRate) throws Exception {
+ int frameSize = frameWidth * frameHeight * 3 / 2;
+
+
+ // Create a media format signifying desired output
+ MediaFormat format = MediaFormat.createVideoFormat(VP8_MIME, frameWidth, frameHeight);
+ format.setInteger(MediaFormat.KEY_BIT_RATE, 100000);
+ format.setInteger(MediaFormat.KEY_COLOR_FORMAT,
+ CodecCapabilities.COLOR_FormatYUV420Planar);
+ format.setInteger(MediaFormat.KEY_FRAME_RATE, 30);
+
+ Log.d(TAG, "Creating encoder");
+ MediaCodec encoder;
+ encoder = MediaCodec.createByCodecName(VPX_ENCODER_NAME);
+ encoder.configure(format,
+ null, // surface
+ null, // crypto
+ MediaCodec.CONFIGURE_FLAG_ENCODE);
+ encoder.start();
+
+ mInputBuffers = encoder.getInputBuffers();
+ mOutputBuffers = encoder.getOutputBuffers();
+
+ InputStream rawStream = null;
+
+ try {
+ rawStream = mResources.openRawResource(rawInputFd);
+ // encode loop
+ long presentationTimeUs = 0;
+ int inputFrameIndex = 0;
+ boolean sawInputEOS = false;
+ boolean sawOutputEOS = false;
+ boolean syncFrameRequested = false;
+ boolean matchedSyncFrame = false;
+
+ while (!sawOutputEOS) {
+ if (!sawInputEOS) {
+ int inputBufIndex = encoder.dequeueInputBuffer(DEFAULT_TIMEOUT_US);
+ if (inputBufIndex >= 0) {
+ byte[] frame = new byte[frameSize];
+ int bytesRead = rawStream.read(frame);
+
+ if (bytesRead == -1) {
+ sawInputEOS = true;
+ bytesRead = 0;
+ }
+
+ mInputBuffers[inputBufIndex].clear();
+ mInputBuffers[inputBufIndex].put(frame);
+ mInputBuffers[inputBufIndex].rewind();
+
+ if (inputFrameIndex == 15) {
+ Log.d(TAG, "Requesting sync frame at index " + inputFrameIndex);
+ Bundle syncFrame = new Bundle();
+ syncFrame.putInt(MediaCodec.PARAMETER_KEY_REQUEST_SYNC_FRAME, 0);
+ encoder.setParameters(syncFrame);
+ syncFrameRequested = true;
+ }
+
+ presentationTimeUs = (inputFrameIndex * 1000000) / frameRate;
+ encoder.queueInputBuffer(
+ inputBufIndex,
+ 0, // offset
+ bytesRead, // size
+ presentationTimeUs,
+ sawInputEOS ? MediaCodec.BUFFER_FLAG_END_OF_STREAM : 0);
+
+ inputFrameIndex++;
+ }
+ }
+
+ int result = encoder.dequeueOutputBuffer(mBufferInfo, DEFAULT_TIMEOUT_US);
+ if (result >= 0) {
+ if (syncFrameRequested && ((mBufferInfo.flags & MediaCodec.BUFFER_FLAG_SYNC_FRAME) != 0)) {
+ Log.d(TAG, "Found sync frame");
+ matchedSyncFrame = true;
+ }
+
+ if ((mBufferInfo.flags & MediaCodec.BUFFER_FLAG_END_OF_STREAM) != 0) {
+ sawOutputEOS = true;
+ }
+
+ encoder.releaseOutputBuffer(result,
+ false); // render
+
+ } else if (result == MediaCodec.INFO_OUTPUT_BUFFERS_CHANGED) {
+ mOutputBuffers = encoder.getOutputBuffers();
+ }
+ }
+
+ if (!matchedSyncFrame) {
+ throw new RuntimeException("Requested sync frame did not occur");
+ }
+
+ encoder.stop();
+ encoder.release();
+ } finally {
+ if (rawStream != null) {
+ rawStream.close();
+ }
+ }
+ }
}
diff --git a/tests/tests/permission/src/android/permission/cts/ContactsProviderTest.java b/tests/tests/permission/src/android/permission/cts/ContactsProviderTest.java
index cd14094..51e54df 100644
--- a/tests/tests/permission/src/android/permission/cts/ContactsProviderTest.java
+++ b/tests/tests/permission/src/android/permission/cts/ContactsProviderTest.java
@@ -30,17 +30,6 @@
* Verify permissions are enforced.
*/
public class ContactsProviderTest extends AndroidTestCase {
- @SmallTest
- public void testAcquireContentProviderClient() throws Exception {
- try {
- final ContentProviderClient provider = getContext().getContentResolver().
- acquireContentProviderClient(Contacts.AUTHORITY);
- fail("acquireContentProviderClient(Contacts.AUTHORITY) did not throw"
- + " SecurityException as expected");
- } catch (SecurityException se) {
- // Expected Exception
- }
- }
/**
* Verifies that query(ContactsContract.Contacts.CONTENT_URI) requires
diff --git a/tests/tests/provider/src/android/provider/cts/MediaStoreIntentsTest.java b/tests/tests/provider/src/android/provider/cts/MediaStoreIntentsTest.java
new file mode 100644
index 0000000..4cad6e4
--- /dev/null
+++ b/tests/tests/provider/src/android/provider/cts/MediaStoreIntentsTest.java
@@ -0,0 +1,117 @@
+/*
+ * Copyright (C) 2013 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.provider.cts;
+
+import android.content.Intent;
+import android.content.pm.ResolveInfo;
+import android.net.Uri;
+import android.provider.MediaStore;
+import android.test.AndroidTestCase;
+
+import java.util.List;
+
+/**
+ * Tests to verify that common actions on {@link MediaStore} content are
+ * available.
+ */
+public class MediaStoreIntentsTest extends AndroidTestCase {
+ public void assertCanBeHandled(Intent intent) {
+ List<ResolveInfo> resolveInfoList = getContext()
+ .getPackageManager().queryIntentActivities(intent, 0);
+ assertNotNull("Missing ResolveInfo", resolveInfoList);
+ assertTrue("No ResolveInfo found for " + intent.toInsecureString(),
+ resolveInfoList.size() > 0);
+ }
+
+ public void testPickImage() {
+ Intent intent = new Intent(Intent.ACTION_PICK);
+ intent.setData(MediaStore.Images.Media.EXTERNAL_CONTENT_URI);
+ assertCanBeHandled(intent);
+ }
+
+ public void testPickVideo() {
+ Intent intent = new Intent(Intent.ACTION_PICK);
+ intent.setData(MediaStore.Video.Media.EXTERNAL_CONTENT_URI);
+ assertCanBeHandled(intent);
+ }
+
+ public void testPickAudio() {
+ Intent intent = new Intent(Intent.ACTION_PICK);
+ intent.setData(MediaStore.Audio.Media.EXTERNAL_CONTENT_URI);
+ assertCanBeHandled(intent);
+ }
+
+ public void testViewImage() {
+ final String[] schemes = new String[] {
+ "file", "http", "https", "content" };
+ final String[] mimes = new String[] {
+ "image/bmp", "image/jpeg", "image/png", "image/gif", "image/webp" };
+
+ for (String scheme : schemes) {
+ for (String mime : mimes) {
+ Intent intent = new Intent(Intent.ACTION_VIEW);
+ final Uri uri = new Uri.Builder().scheme(scheme)
+ .authority("example.com").path("image").build();
+ intent.setDataAndType(uri, mime);
+ assertCanBeHandled(intent);
+ }
+ }
+ }
+
+ public void testViewVideo() {
+ final String[] schemes = new String[] {
+ "file", "http", "https", "content" };
+ final String[] mimes = new String[] {
+ "video/mpeg4", "video/mp4", "video/3gp", "video/3gpp", "video/3gpp2",
+ "video/webm" };
+
+ for (String scheme : schemes) {
+ for (String mime : mimes) {
+ Intent intent = new Intent(Intent.ACTION_VIEW);
+ final Uri uri = new Uri.Builder().scheme(scheme)
+ .authority("example.com").path("video").build();
+ intent.setDataAndType(uri, mime);
+ assertCanBeHandled(intent);
+ }
+ }
+ }
+
+ public void testViewAudio() {
+ final String[] schemes = new String[] {
+ "file", "http", "content" };
+ final String[] mimes = new String[] {
+ "audio/mpeg", "audio/mp4", "audio/ogg", "audio/webm", "application/ogg",
+ "application/x-ogg" };
+
+ for (String scheme : schemes) {
+ for (String mime : mimes) {
+ Intent intent = new Intent(Intent.ACTION_VIEW);
+ final Uri uri = new Uri.Builder().scheme(scheme)
+ .authority("example.com").path("audio").build();
+ intent.setDataAndType(uri, mime);
+ assertCanBeHandled(intent);
+ }
+ }
+ }
+
+ public void testSearchActions() {
+ assertCanBeHandled(new Intent(MediaStore.INTENT_ACTION_MEDIA_SEARCH));
+ assertCanBeHandled(new Intent(MediaStore.INTENT_ACTION_MEDIA_PLAY_FROM_SEARCH));
+ assertCanBeHandled(new Intent(MediaStore.INTENT_ACTION_TEXT_OPEN_FROM_SEARCH));
+ assertCanBeHandled(new Intent(MediaStore.INTENT_ACTION_VIDEO_PLAY_FROM_SEARCH));
+ }
+}
diff --git a/tests/tests/security/src/android/security/cts/ServicePermissionsTest.java b/tests/tests/security/src/android/security/cts/ServicePermissionsTest.java
index 45f3d51..8c02d6b 100644
--- a/tests/tests/security/src/android/security/cts/ServicePermissionsTest.java
+++ b/tests/tests/security/src/android/security/cts/ServicePermissionsTest.java
@@ -131,7 +131,9 @@
}
if (lines.size() == 1) {
- if (!lines.get(0).contains("Permission Denial")) {
+ String message = lines.get(0);
+ if (!message.contains("Permission Denial") &&
+ !message.contains("android.permission.DUMP")) {
fail("dump() for " + service + " produced a single line which didn't "
+ "reference a permission; it may be leaking sensitive data.");
}
diff --git a/tests/tests/text/src/android/text/cts/EmojiTest.java b/tests/tests/text/src/android/text/cts/EmojiTest.java
index a8d8d2d..f5f191f 100644
--- a/tests/tests/text/src/android/text/cts/EmojiTest.java
+++ b/tests/tests/text/src/android/text/cts/EmojiTest.java
@@ -222,6 +222,14 @@
webViewOnUiThread.loadDataAndWaitForCompletion("<html><body>" + String.valueOf(c) + "</body></html>",
"text/html; charset=utf-8", "utf-8");
+ // The Chromium-powered WebView renders asynchronously and there's nothing reliable
+ // we can easily wait for to be sure that capturePicture will return a fresh frame.
+ // So, just sleep for a sufficient time.
+ try {
+ Thread.sleep(250);
+ } catch (InterruptedException e) {
+ return null;
+ }
Picture picture = webViewOnUiThread.capturePicture();
if (picture == null || picture.getHeight() <= 0 || picture.getWidth() <= 0) {
diff --git a/tools/utils/buildCts.py b/tools/utils/buildCts.py
index 5d846df..4721234 100755
--- a/tools/utils/buildCts.py
+++ b/tools/utils/buildCts.py
@@ -19,6 +19,7 @@
import glob
import os
import re
+import shutil
import subprocess
import sys
import xml.dom.minidom as dom
@@ -71,6 +72,9 @@
self.test_repository = os.path.join(self.out_dir, 'repository/testcases')
self.plan_repository = os.path.join(self.out_dir, 'repository/plans')
+
+ #dirty hack to copy over prepopulated CTS test plans, stable vs flaky, for autoCTS
+ self.definedplans_repository = os.path.join(self.android_root, 'cts/tests/plans')
def GenerateTestDescriptions(self):
"""Generate test descriptions for all packages."""
@@ -160,6 +164,12 @@
plan.Exclude('com\.android\.pts\.bootup')
self.__WritePlan(plan, 'PDK')
+ #dirty hack to copy over pre-populated CTS plans - flaky vs stable - to streamline autoCTS
+ shutil.copyfile(os.path.join(self.definedplans_repository, 'CTS-flaky.xml'),
+ os.path.join(self.plan_repository, 'CTS-flaky.xml'))
+ shutil.copyfile(os.path.join(self.definedplans_repository, 'CTS-stable.xml'),
+ os.path.join(self.plan_repository, 'CTS-stable.xml'))
+
def LogGenerateDescription(name):
print 'Generating test description for package %s' % name