Run CTS verifier sensor tests only when there is a sensor
Add a new meta data attribute tests_applicable_features to
conditionally include tests when at least one of a list of
features are available.
Update sensor test to only show up when at least one of the
sensors being tested exists on the device
Bug: 18285373
Change-Id: I409d8605c6abc66d70d17afb36400e9d1ba2a813
diff --git a/apps/CtsVerifier/AndroidManifest.xml b/apps/CtsVerifier/AndroidManifest.xml
index f466cdc..2208a8e 100644
--- a/apps/CtsVerifier/AndroidManifest.xml
+++ b/apps/CtsVerifier/AndroidManifest.xml
@@ -786,8 +786,14 @@
<category android:name="android.cts.intent.category.MANUAL_TEST" />
</intent-filter>
<meta-data android:name="test_category" android:value="@string/test_category_sensors" />
- <meta-data android:name="test_required_features"
- android:value="android.hardware.sensor.accelerometer" />
+ <meta-data android:name="test_applicable_features"
+ android:value="android.hardware.sensor.stepcounter" />
+ <meta-data android:name="test_applicable_features"
+ android:value="android.hardware.sensor.stepdetector" />
+ <meta-data android:name="test_applicable_features"
+ android:value="android.hardware.sensor.proximity" />
+ <meta-data android:name="test_applicable_features"
+ android:value="android.hardware.sensor.light" />
</activity>
<!-- TODO: enable when a more reliable way to identify time synchronization is available -->
@@ -811,6 +817,14 @@
<category android:name="android.cts.intent.category.MANUAL_TEST"/>
</intent-filter>
<meta-data android:name="test_category" android:value="@string/test_category_sensors"/>
+ <meta-data android:name="test_applicable_features"
+ android:value="android.hardware.sensor.accelerometer" />
+ <meta-data android:name="test_applicable_features"
+ android:value="android.hardware.sensor.compass" />
+ <meta-data android:name="test_applicable_features"
+ android:value="android.hardware.sensor.gyroscope" />
+ <meta-data android:name="test_applicable_features"
+ android:value="android.hardware.sensor.barometer" />
</activity>
<activity android:name=".sensors.SensorBatchingTestsActivity"
@@ -821,8 +835,14 @@
<category android:name="android.cts.intent.category.MANUAL_TEST"/>
</intent-filter>
<meta-data android:name="test_category" android:value="@string/test_category_sensors"/>
- <meta-data android:name="test_excluded_features"
- android:value="android.hardware.type.television:android.software.leanback" />
+ <meta-data android:name="test_applicable_features"
+ android:value="android.hardware.sensor.accelerometer" />
+ <meta-data android:name="test_applicable_features"
+ android:value="android.hardware.sensor.compass" />
+ <meta-data android:name="test_applicable_features"
+ android:value="android.hardware.sensor.gyroscope" />
+ <meta-data android:name="test_applicable_features"
+ android:value="android.hardware.sensor.barometer" />
</activity>
<activity android:name=".sensors.SensorIntegrationTestsActivity"
@@ -833,6 +853,12 @@
<category android:name="android.cts.intent.category.MANUAL_TEST"/>
</intent-filter>
<meta-data android:name="test_category" android:value="@string/test_category_sensors"/>
+ <meta-data android:name="test_applicable_features"
+ android:value="android.hardware.sensor.accelerometer" />
+ <meta-data android:name="test_applicable_features"
+ android:value="android.hardware.sensor.compass" />
+ <meta-data android:name="test_applicable_features"
+ android:value="android.hardware.sensor.gyroscope" />
</activity>
<activity android:name=".sensors.SensorTestActivity"
@@ -843,6 +869,18 @@
<category android:name="android.cts.intent.category.MANUAL_TEST"/>
</intent-filter>
<meta-data android:name="test_category" android:value="@string/test_category_sensors"/>
+ <meta-data android:name="test_applicable_features"
+ android:value="android.hardware.sensor.accelerometer" />
+ <meta-data android:name="test_applicable_features"
+ android:value="android.hardware.sensor.stepcounter" />
+ <meta-data android:name="test_applicable_features"
+ android:value="android.hardware.sensor.stepdetector" />
+ <meta-data android:name="test_applicable_features"
+ android:value="android.hardware.sensor.heartrate" />
+ <meta-data android:name="test_applicable_features"
+ android:value="android.hardware.sensor.compass" />
+ <meta-data android:name="test_applicable_features"
+ android:value="android.hardware.sensor.ambient_temperature" />
</activity>
<!-- End sensor tests definitions -->
@@ -1162,8 +1200,8 @@
<meta-data
android:name="test_category"
android:value="@string/test_category_sensors" />
- <meta-data android:name="test_excluded_features"
- android:value="android.hardware.type.television:android.software.leanback" />
+ <meta-data android:name="test_required_features"
+ android:value="android.hardware.sensor.accelerometer" />
</activity>
<receiver android:name=".widget.WidgetCtsProvider">
diff --git a/apps/CtsVerifier/src/com/android/cts/verifier/ManifestTestListAdapter.java b/apps/CtsVerifier/src/com/android/cts/verifier/ManifestTestListAdapter.java
index 2d7d6ba..0b73642 100644
--- a/apps/CtsVerifier/src/com/android/cts/verifier/ManifestTestListAdapter.java
+++ b/apps/CtsVerifier/src/com/android/cts/verifier/ManifestTestListAdapter.java
@@ -77,6 +77,13 @@
* <meta-data android:name="test_excluded_features" android:value="android.hardware.type.television" />
* </pre>
* </li>
+ * <li>OPTIONAL: Add a meta data attribute to indicate features such that, if any present,
+ * the test is applicable to run. If the device has any of the applicable features then
+ * the test will appear in the test list. Use a colon (:) to specify multiple features
+ * <pre>
+ * <meta-data android:name="test_applicable_features" android:value="android.hardware.sensor.compass" />
+ * </pre>
+ * </li>
*
* </ol>
*/
@@ -90,6 +97,8 @@
private static final String TEST_EXCLUDED_FEATURES_META_DATA = "test_excluded_features";
+ private static final String TEST_APPLICABLE_FEATURES_META_DATA = "test_applicable_features";
+
private final HashSet<String> mDisabledTests;
private Context mContext;
@@ -177,8 +186,9 @@
Intent intent = getActivityIntent(info.activityInfo);
String[] requiredFeatures = getRequiredFeatures(info.activityInfo.metaData);
String[] excludedFeatures = getExcludedFeatures(info.activityInfo.metaData);
- TestListItem item = TestListItem.newTest(title, testName, intent,
- requiredFeatures, excludedFeatures);
+ String[] applicableFeatures = getApplicableFeatures(info.activityInfo.metaData);
+ TestListItem item = TestListItem.newTest(title, testName, intent, requiredFeatures,
+ excludedFeatures, applicableFeatures);
String testCategory = getTestCategory(mContext, info.activityInfo.metaData);
addTestToCategory(testsByCategory, testCategory, item);
@@ -229,6 +239,19 @@
}
}
+ static String[] getApplicableFeatures(Bundle metaData) {
+ if (metaData == null) {
+ return null;
+ } else {
+ String value = metaData.getString(TEST_APPLICABLE_FEATURES_META_DATA);
+ if (value == null) {
+ return null;
+ } else {
+ return value.split(":");
+ }
+ }
+ }
+
static String getTitle(Context context, ActivityInfo activityInfo) {
if (activityInfo.labelRes != 0) {
return context.getString(activityInfo.labelRes);
@@ -284,8 +307,11 @@
for (TestListItem test : tests) {
String[] excludedFeatures = test.excludedFeatures;
String[] requiredFeatures = test.requiredFeatures;
+ String[] applicableFeatures = test.applicableFeatures;
if (!hasAnyFeature(excludedFeatures) && hasAllFeatures(requiredFeatures)) {
- filteredTests.add(test);
+ if (hasAnyFeature(applicableFeatures) || hasAllFeatures(applicableFeatures)) {
+ filteredTests.add(test);
+ }
}
}
return filteredTests;
diff --git a/apps/CtsVerifier/src/com/android/cts/verifier/TestListAdapter.java b/apps/CtsVerifier/src/com/android/cts/verifier/TestListAdapter.java
index 0d9985c..afe3a73 100644
--- a/apps/CtsVerifier/src/com/android/cts/verifier/TestListAdapter.java
+++ b/apps/CtsVerifier/src/com/android/cts/verifier/TestListAdapter.java
@@ -86,26 +86,43 @@
/** Features such that, if any present, the test gets excluded from being shown. */
final String[] excludedFeatures;
+ /** If any of of the features are present the test is meaningful to run. */
+ final String[] applicableFeatures;
+
+ public static TestListItem newTest(Context context, int titleResId, String testName,
+ Intent intent, String[] requiredFeatures, String[] excludedFeatures,
+ String[] applicableFeatures) {
+ return newTest(context.getString(titleResId), testName, intent, requiredFeatures,
+ excludedFeatures, applicableFeatures);
+ }
+
public static TestListItem newTest(Context context, int titleResId, String testName,
Intent intent, String[] requiredFeatures, String[] excludedFeatures) {
- return newTest(context.getString(titleResId), testName, intent,
- requiredFeatures, excludedFeatures);
+ return newTest(context.getString(titleResId), testName, intent, requiredFeatures,
+ excludedFeatures, null);
}
public static TestListItem newTest(Context context, int titleResId, String testName,
Intent intent, String[] requiredFeatures) {
- return newTest(context.getString(titleResId), testName, intent,
- requiredFeatures, null);
+ return newTest(context.getString(titleResId), testName, intent, requiredFeatures, null,
+ null);
+ }
+
+ public static TestListItem newTest(String title, String testName, Intent intent,
+ String[] requiredFeatures, String[] excludedFeatures, String[] applicableFeatures) {
+ return new TestListItem(title, testName, intent, requiredFeatures, excludedFeatures,
+ applicableFeatures);
}
public static TestListItem newTest(String title, String testName, Intent intent,
String[] requiredFeatures, String[] excludedFeatures) {
- return new TestListItem(title, testName, intent, requiredFeatures, excludedFeatures);
+ return new TestListItem(title, testName, intent, requiredFeatures, excludedFeatures,
+ null);
}
public static TestListItem newTest(String title, String testName, Intent intent,
String[] requiredFeatures) {
- return new TestListItem(title, testName, intent, requiredFeatures, null);
+ return new TestListItem(title, testName, intent, requiredFeatures, null, null);
}
public static TestListItem newCategory(Context context, int titleResId) {
@@ -113,16 +130,17 @@
}
public static TestListItem newCategory(String title) {
- return new TestListItem(title, null, null, null, null);
+ return new TestListItem(title, null, null, null, null, null);
}
private TestListItem(String title, String testName, Intent intent,
- String[] requiredFeatures, String[] excludedFeatures) {
+ String[] requiredFeatures, String[] excludedFeatures, String[] applicableFeatures) {
this.title = title;
this.testName = testName;
this.intent = intent;
this.requiredFeatures = requiredFeatures;
this.excludedFeatures = excludedFeatures;
+ this.applicableFeatures = applicableFeatures;
}
boolean isTest() {