Merge "Clean up setTestResultAndFinish" into lmp-dev
diff --git a/apps/CtsVerifier/Android.mk b/apps/CtsVerifier/Android.mk
index c69d16a..bcfaf44 100644
--- a/apps/CtsVerifier/Android.mk
+++ b/apps/CtsVerifier/Android.mk
@@ -23,7 +23,7 @@
LOCAL_SRC_FILES := $(call all-java-files-under, src) $(call all-Iaidl-files-under, src)
-LOCAL_STATIC_JAVA_LIBRARIES := cts-sensors-tests
+LOCAL_STATIC_JAVA_LIBRARIES := cts-sensors-tests ctstestrunner
LOCAL_PACKAGE_NAME := CtsVerifier
@@ -36,6 +36,8 @@
LOCAL_DEX_PREOPT := false
+LOCAL_INSTRUMENTATION_FOR := CtsTestStubs
+
include $(BUILD_PACKAGE)
# Builds and launches CTS Verifier on a device.
diff --git a/apps/CtsVerifier/AndroidManifest.xml b/apps/CtsVerifier/AndroidManifest.xml
index b17946a..5f6dd0d 100644
--- a/apps/CtsVerifier/AndroidManifest.xml
+++ b/apps/CtsVerifier/AndroidManifest.xml
@@ -61,6 +61,8 @@
<meta-data android:name="com.google.android.backup.api_key"
android:value="AEdPqrEAAAAIbK6ldcOzoeRtQ1u1dFVJ1A7KetRhit-a1Xa82Q" />
+ <uses-library android:name="android.test.runner"/>
+
<activity android:name=".TestListActivity" android:label="@string/app_name">
<!--
TestListActivity will have the USB accessory Test in its test list, but it
@@ -748,6 +750,34 @@
android:value="android.hardware.sensor.gyroscope" />
</activity-->
+ <activity android:name=".sensors.SingleSensorTestsActivity"
+ android:label="@string/snsr_single_sensor_tests"
+ android:screenOrientation="nosensor">
+ <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_sensors"/>
+ </activity>
+
+ <activity android:name=".sensors.SensorIntegrationTestsActivity"
+ android:label="@string/snsr_sensor_integration_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_sensors"/>
+ </activity>
+
+ <activity android:name=".sensors.SensorTestActivity"
+ android:label="@string/snsr_sensor_test">
+ <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_sensors"/>
+ </activity>
+
<activity android:name=".location.LocationModeOffTestActivity"
android:label="@string/location_mode_off_test">
<intent-filter>
diff --git a/apps/CtsVerifier/assets/scripts/execute_power_tests.py b/apps/CtsVerifier/assets/scripts/execute_power_tests.py
index 92b79ca..68e13db 100755
--- a/apps/CtsVerifier/assets/scripts/execute_power_tests.py
+++ b/apps/CtsVerifier/assets/scripts/execute_power_tests.py
@@ -228,6 +228,7 @@
print("This current high: %.2f mAmps. Device is probably not in suspend mode. Waiting..."%\
(1000.0*(sum(measurements)/len(measurements))))
if tries >= TIMEOUT_SCREEN_OFF:
+ # TODO: dump the state of sensor service to identify if there are features using sensors
self.reportErrorIf(tries>=TIMEOUT_SCREEN_OFF, msg="Unable to determine application processor suspend mode status.")
break
if DELAY_SCREEN_OFF:
@@ -369,6 +370,7 @@
self.setUSBEnabled(True)
max_power = max(measurements) - avg
if current_diff <= max_power_allowed:
+ # TODO: fail the test of background > current
message = ("Draw is within limits. Current:%f Background:%f Measured: %f Stddev: %f Peak: %f")%\
( current_diff*1000.0, backgnd*1000.0, avg*1000.0, stddev*1000.0, max_power*1000.0)
else:
diff --git a/apps/CtsVerifier/proguard.flags b/apps/CtsVerifier/proguard.flags
index 2dfa185..7605f3d 100644
--- a/apps/CtsVerifier/proguard.flags
+++ b/apps/CtsVerifier/proguard.flags
@@ -7,7 +7,7 @@
}
# ensure we keep public sensor test methods, these are needed at runtime
--keepclassmembers class * extends com.android.cts.verifier.sensors.BaseSensorTestActivity {
+-keepclassmembers class * extends com.android.cts.verifier.sensors.base.BaseSensorTestActivity {
public <methods>;
}
diff --git a/apps/CtsVerifier/res/layout/snsr_error.xml b/apps/CtsVerifier/res/layout/snsr_error.xml
index 4b3869a..d78a8fb 100644
--- a/apps/CtsVerifier/res/layout/snsr_error.xml
+++ b/apps/CtsVerifier/res/layout/snsr_error.xml
@@ -14,7 +14,7 @@
limitations under the License.
-->
<TextView xmlns:android="http://schemas.android.com/apk/res/android"
- android:layout_width="wrap_content"
+ android:layout_width="match_parent"
android:layout_height="wrap_content"
android:paddingBottom="@dimen/snsr_boxed_padding_bottom"
android:paddingTop="@dimen/snsr_boxed_padding_top"
diff --git a/apps/CtsVerifier/res/layout/snsr_information.xml b/apps/CtsVerifier/res/layout/snsr_information.xml
index 4b4a4cb..e3d9542 100644
--- a/apps/CtsVerifier/res/layout/snsr_information.xml
+++ b/apps/CtsVerifier/res/layout/snsr_information.xml
@@ -14,7 +14,7 @@
limitations under the License.
-->
<TextView xmlns:android="http://schemas.android.com/apk/res/android"
- android:layout_width="wrap_content"
+ android:layout_width="match_parent"
android:layout_height="wrap_content"
android:paddingBottom="@dimen/snsr_boxed_padding_bottom"
android:paddingTop="@dimen/snsr_boxed_padding_top"
diff --git a/apps/CtsVerifier/res/layout/snsr_instruction.xml b/apps/CtsVerifier/res/layout/snsr_instruction.xml
index 9a48cf6..66c7386 100644
--- a/apps/CtsVerifier/res/layout/snsr_instruction.xml
+++ b/apps/CtsVerifier/res/layout/snsr_instruction.xml
@@ -14,7 +14,7 @@
limitations under the License.
-->
<TextView xmlns:android="http://schemas.android.com/apk/res/android"
- android:layout_width="wrap_content"
+ android:layout_width="match_parent"
android:layout_height="wrap_content"
android:paddingBottom="@dimen/snsr_log_padding_bottom"
android:paddingTop="@dimen/snsr_log_padding_top"
diff --git a/apps/CtsVerifier/res/layout/snsr_success.xml b/apps/CtsVerifier/res/layout/snsr_success.xml
index 7aaad57..9d600dc 100644
--- a/apps/CtsVerifier/res/layout/snsr_success.xml
+++ b/apps/CtsVerifier/res/layout/snsr_success.xml
@@ -14,7 +14,7 @@
limitations under the License.
-->
<TextView xmlns:android="http://schemas.android.com/apk/res/android"
- android:layout_width="wrap_content"
+ android:layout_width="match_parent"
android:layout_height="wrap_content"
android:paddingBottom="@dimen/snsr_boxed_padding_bottom"
android:paddingTop="@dimen/snsr_boxed_padding_top"
diff --git a/apps/CtsVerifier/res/layout/snsr_test_title.xml b/apps/CtsVerifier/res/layout/snsr_test_title.xml
index 69e9fad..2a458e7 100644
--- a/apps/CtsVerifier/res/layout/snsr_test_title.xml
+++ b/apps/CtsVerifier/res/layout/snsr_test_title.xml
@@ -14,7 +14,7 @@
limitations under the License.
-->
<TextView xmlns:android="http://schemas.android.com/apk/res/android"
- android:layout_width="wrap_content"
+ android:layout_width="match_parent"
android:layout_height="wrap_content"
android:paddingBottom="@dimen/snsr_boxed_padding_bottom"
android:paddingTop="@dimen/snsr_boxed_padding_top"
diff --git a/apps/CtsVerifier/res/layout/snsr_warning.xml b/apps/CtsVerifier/res/layout/snsr_warning.xml
index 6f102bb..5d63fc1 100644
--- a/apps/CtsVerifier/res/layout/snsr_warning.xml
+++ b/apps/CtsVerifier/res/layout/snsr_warning.xml
@@ -14,7 +14,7 @@
limitations under the License.
-->
<TextView xmlns:android="http://schemas.android.com/apk/res/android"
- android:layout_width="wrap_content"
+ android:layout_width="match_parent"
android:layout_height="wrap_content"
android:paddingBottom="@dimen/snsr_boxed_padding_bottom"
android:paddingTop="@dimen/snsr_boxed_padding_top"
diff --git a/apps/CtsVerifier/res/values/strings.xml b/apps/CtsVerifier/res/values/strings.xml
index 6b8e582..4882946 100644
--- a/apps/CtsVerifier/res/values/strings.xml
+++ b/apps/CtsVerifier/res/values/strings.xml
@@ -441,6 +441,8 @@
<string name="snsr_device_steady">Keep the device steady.</string>
<string name="snsr_keep_device_rotating_clockwise">Once the test begins, you will have to keep rotating the device clockwise.</string>
<string name="snsr_wait_for_user">Press \'Next\' to continue.</string>
+ <string name="snsr_wait_to_begin">Press \'Next\' to begin.</string>
+ <string name="snsr_wait_to_complete">Press \'Next\' to complete.</string>
<string name="snsr_on_complete_return">After completing the task, go back to this test.</string>
<string name="snsr_movement_expected">Movement was expected during the test. Found=%1$b.</string>
<string name="snsr_sensor_feature_deactivation">Additionally, turn off any other features installed in the device, that register for sensors. Once you are done, you can continue the test.</string>
@@ -549,6 +551,11 @@
<string name="snsr_significant_motion_registration">Expected to be able to register for TriggerSensor. Found=%b.</string>
<string name="snsr_significant_motion_cancelation">Expected to be able to cancel TriggerSensor. Found=%b.</string>
+ <!-- Strings for Sensor CTS tests inside CtsVerifier -->
+ <string name="snsr_single_sensor_tests">CTS Single Sensor Tests</string>
+ <string name="snsr_sensor_integration_tests">CTS Sensor Integration Tests</string>
+ <string name="snsr_sensor_test">CTS Sensor Test</string>
+
<!-- Strings for Sample Test Activities -->
<string name="share_button_text">Share</string>
<string name="sample_framework_test">Sample Framework Test</string>
diff --git a/apps/CtsVerifier/src/com/android/cts/verifier/sensors/AccelerometerMeasurementTestActivity.java b/apps/CtsVerifier/src/com/android/cts/verifier/sensors/AccelerometerMeasurementTestActivity.java
index f40bc75..265f086 100644
--- a/apps/CtsVerifier/src/com/android/cts/verifier/sensors/AccelerometerMeasurementTestActivity.java
+++ b/apps/CtsVerifier/src/com/android/cts/verifier/sensors/AccelerometerMeasurementTestActivity.java
@@ -17,6 +17,7 @@
package com.android.cts.verifier.sensors;
import com.android.cts.verifier.R;
+import com.android.cts.verifier.sensors.base.SensorCtsVerifierTestActivity;
import android.hardware.Sensor;
import android.hardware.SensorManager;
@@ -28,7 +29,7 @@
/**
* Semi-automated test that focuses on characteristics associated with Accelerometer measurements.
*/
-public class AccelerometerMeasurementTestActivity extends BaseSensorTestActivity {
+public class AccelerometerMeasurementTestActivity extends SensorCtsVerifierTestActivity {
public AccelerometerMeasurementTestActivity() {
super(AccelerometerMeasurementTestActivity.class);
}
diff --git a/apps/CtsVerifier/src/com/android/cts/verifier/sensors/BaseSensorTestActivity.java b/apps/CtsVerifier/src/com/android/cts/verifier/sensors/BaseSensorTestActivity.java
deleted file mode 100644
index 03b87d5..0000000
--- a/apps/CtsVerifier/src/com/android/cts/verifier/sensors/BaseSensorTestActivity.java
+++ /dev/null
@@ -1,488 +0,0 @@
-/*
-
- * Copyright (C) 2014 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 com.android.cts.verifier.sensors;
-
-import com.android.cts.verifier.R;
-import com.android.cts.verifier.TestResult;
-import com.android.cts.verifier.sensors.helpers.SensorFeaturesDeactivator;
-
-import junit.framework.Assert;
-
-import android.app.Activity;
-import android.content.ContentResolver;
-import android.content.Context;
-import android.content.Intent;
-import android.graphics.Color;
-import android.hardware.cts.helpers.SensorNotSupportedException;
-import android.media.MediaPlayer;
-import android.os.Bundle;
-import android.os.Vibrator;
-import android.provider.Settings;
-import android.text.TextUtils;
-import android.util.Log;
-import android.view.View;
-import android.widget.LinearLayout;
-import android.widget.ScrollView;
-import android.widget.TextView;
-
-import java.lang.reflect.InvocationTargetException;
-import java.lang.reflect.Method;
-import java.lang.reflect.Modifier;
-import java.security.InvalidParameterException;
-import java.util.ArrayList;
-import java.util.List;
-import java.util.concurrent.CountDownLatch;
-import java.util.concurrent.Semaphore;
-
-/**
- * Base class to author Sensor test cases. It provides access to the following flow:
- * Activity set up
- * for test unit : all test units
- * execute test unit
- * Activity clean up
- *
- * Each test unit can wait for operators to notify at some intervals, but the test needs to be
- * autonomous to verify the data collected.
- */
-public abstract class BaseSensorTestActivity
- extends Activity
- implements View.OnClickListener, Runnable {
- protected final String LOG_TAG = "TestRunner";
-
- protected final Class mTestClass;
- private final int mLayoutId;
-
- private final DeactivatorActivityHandler mDeactivatorActivityHandler;
- protected final SensorFeaturesDeactivator mSensorFeaturesDeactivator;
- private final Semaphore mSemaphore = new Semaphore(0);
-
- private ScrollView mLogScrollView;
- private LinearLayout mLogLayout;
- private View mNextView;
- private Thread mWorkerThread;
-
- private volatile int mTestPassedCounter;
- private volatile int mTestSkippedCounter;
- private volatile int mTestFailedCounter;
-
- protected BaseSensorTestActivity(Class testClass) {
- this(testClass, R.layout.snsr_semi_auto_test);
- }
-
- protected BaseSensorTestActivity(Class testClass, int layoutId) {
- mTestClass = testClass;
- mLayoutId = layoutId;
- mDeactivatorActivityHandler = new DeactivatorActivityHandler();
- mSensorFeaturesDeactivator = new SensorFeaturesDeactivator(mDeactivatorActivityHandler);
- }
-
- @Override
- protected void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- setContentView(mLayoutId);
-
- mLogScrollView = (ScrollView) findViewById(R.id.log_scroll_view);
- mLogLayout = (LinearLayout) findViewById(R.id.log_layout);
- mNextView = findViewById(R.id.next_button);
- mNextView.setOnClickListener(this);
-
- updateButton(false /*enabled*/);
- mWorkerThread = new Thread(this);
- mWorkerThread.start();
- }
-
- @Override
- public void onClick(View target) {
- mSemaphore.release();
- }
-
- @Override
- public void run() {
- try {
- activitySetUp();
- } catch (Throwable e) {
- SensorTestResult testSkipped = SensorTestResult.SKIPPED;
- String testSummary = e.getMessage();
- setTestResult(getTestClassName(), testSkipped, testSummary);
- logTestDetails(testSkipped, testSummary);
- return;
- }
-
- // TODO: it might be necessary to implement fall through so passed tests do not need to
- // be re-executed
- StringBuilder overallTestResults = new StringBuilder();
- for (Method testMethod : findTestMethods()) {
- SensorTestDetails testDetails = executeTest(testMethod);
- setTestResult(testDetails.name, testDetails.result, testDetails.summary);
- logTestDetails(testDetails.result, testDetails.summary);
- overallTestResults.append(testDetails.toString() + "\n");
- }
- appendText(R.string.snsr_test_complete);
-
- // log to screen and save the overall test summary (activity level)
- SensorTestDetails testDetails = getOverallTestDetails();
- logTestDetails(testDetails.result, testDetails.summary);
- overallTestResults.append(testDetails.summary);
- setTestResult(testDetails.name, testDetails.result, overallTestResults.toString());
-
- try {
- activityCleanUp();
- } catch (Throwable e) {
- appendText(e.getMessage(), Color.RED);
- Log.e(LOG_TAG, "An error occurred on Activity CleanUp.", e);
- }
-
- waitForUser();
- finish();
- }
-
- @Override
- protected void onActivityResult(int requestCode, int resultCode, Intent data) {
- mDeactivatorActivityHandler.onActivityResult();
- }
-
- private static class SensorTestDetails {
- public SensorTestResult result;
- public String name;
- public String summary;
-
- @Override
- public String toString() {
- return String.format("%s|%s|%s", name, result.name(), summary);
- }
- }
-
- // TODO: this should be protected currently it is used by power tests, but the result should
- // only be available in this class
- public enum SensorTestResult {
- SKIPPED,
- PASS,
- FAIL
- }
-
- /**
- * For use only by {@link BaseSensorSemiAutomatedTestActivity} and other base classes.
- */
- protected void setTestResult(String testId, SensorTestResult testResult, String testDetails) {
- switch(testResult) {
- case SKIPPED:
- TestResult.setPassedResult(this, testId, testDetails);
- break;
- case PASS:
- TestResult.setPassedResult(this, testId, testDetails);
- break;
- case FAIL:
- TestResult.setFailedResult(this, testId, testDetails);
- break;
- default:
- throw new InvalidParameterException("Unrecognized testResult.");
- }
- }
-
- private void logTestDetails(SensorTestResult testResult, String testSummary) {
- int textViewResId;
- int testResultResId;
- int logPriority;
- switch(testResult) {
- case SKIPPED:
- textViewResId = R.layout.snsr_warning;
- testResultResId = R.string.snsr_test_skipped;
- logPriority = Log.INFO;
- break;
- case PASS:
- textViewResId = R.layout.snsr_success;
- testResultResId = R.string.snsr_test_pass;
- logPriority = Log.DEBUG;
- break;
- case FAIL:
- textViewResId = R.layout.snsr_error;
- testResultResId = R.string.snsr_test_fail;
- logPriority = Log.ERROR;
- break;
- default:
- throw new InvalidParameterException("Unrecognized testResult.");
- }
- if (TextUtils.isEmpty(testSummary)) {
- testSummary = getString(testResultResId);
- }
- Log.println(logPriority, LOG_TAG, testSummary);
-
- TextAppender textAppender = new TextAppender(textViewResId);
- textAppender.setText(testSummary);
- textAppender.append();
- }
-
- /**
- * A general set up routine. It executes only once before the first test case.
- *
- * @throws Throwable An exception that denotes the failure of set up. No tests will be executed.
- */
- protected void activitySetUp() throws Throwable {}
-
- /**
- * A general clean up routine. It executes upon successful execution of {@link #activitySetUp()}
- * and after all the test cases.
- *
- * @throws Throwable An exception that will be logged and ignored, for ease of implementation
- * by subclasses.
- */
- protected void activityCleanUp() throws Throwable {}
-
- @Deprecated
- protected void appendText(int resId, int textColor) {
- appendText(resId);
- }
-
- @Deprecated
- protected void appendText(String text, int textColor) {
- appendText(text);
- }
-
- @Deprecated
- protected void appendText(int resId) {
- TextAppender textAppender = new TextAppender(R.layout.snsr_instruction);
- textAppender.setText(resId);
- textAppender.append();
- }
-
- @Deprecated
- protected void appendText(String text) {
- TextAppender textAppender = new TextAppender(R.layout.snsr_instruction);
- textAppender.setText(text);
- textAppender.append();
- }
-
- @Deprecated
- protected void clearText() {
- this.runOnUiThread(new Runnable() {
- @Override
- public void run() {
- mLogLayout.removeAllViews();
- }
- });
- }
-
- protected void updateButton(boolean enabled) {
- this.runOnUiThread(new ButtonEnabler(this.mNextView, enabled));
- }
-
- protected void waitForUser() {
- appendText(R.string.snsr_wait_for_user);
- updateButton(true);
- try {
- mSemaphore.acquire();
- } catch(InterruptedException e) {}
- updateButton(false);
- }
-
- protected void playSound() {
- MediaPlayer player = MediaPlayer.create(this, Settings.System.DEFAULT_NOTIFICATION_URI);
- player.start();
- try {
- Thread.sleep(500);
- } catch(InterruptedException e) {
- } finally {
- player.stop();
- }
- }
-
- protected void vibrate(int timeInMs) {
- Vibrator vibrator = (Vibrator) getSystemService(Context.VIBRATOR_SERVICE);
- vibrator.vibrate(timeInMs);
- }
-
- protected void vibrate(long[] pattern) {
- Vibrator vibrator = (Vibrator) getSystemService(Context.VIBRATOR_SERVICE);
- vibrator.vibrate(pattern, -1);
- }
-
- // TODO: move to sensor assertions
- protected String assertTimestampSynchronization(
- long eventTimestamp,
- long receivedTimestamp,
- long deltaThreshold,
- String sensorName) {
- long timestampDelta = Math.abs(eventTimestamp - receivedTimestamp);
- String timestampMessage = getString(
- R.string.snsr_event_time,
- receivedTimestamp,
- eventTimestamp,
- timestampDelta,
- deltaThreshold,
- sensorName);
- Assert.assertTrue(timestampMessage, timestampDelta < deltaThreshold);
- return timestampMessage;
- }
-
- private List<Method> findTestMethods() {
- ArrayList<Method> testMethods = new ArrayList<Method>();
- for (Method method : mTestClass.getDeclaredMethods()) {
- if (Modifier.isPublic(method.getModifiers())
- && method.getParameterTypes().length == 0
- && method.getName().startsWith("test")
- && method.getReturnType().equals(String.class)) {
- testMethods.add(method);
- }
- }
- return testMethods;
- }
-
- private SensorTestDetails executeTest(Method testMethod) {
- SensorTestDetails testDetails = new SensorTestDetails();
- String testMethodName = testMethod.getName();
- testDetails.name = String.format("%s#%s", getTestClassName(), testMethodName);
-
- try {
- TextAppender textAppender = new TextAppender(R.layout.snsr_test_title);
- textAppender.setText(testMethodName);
- textAppender.append();
-
- testDetails.summary = (String) testMethod.invoke(this);
- testDetails.result = SensorTestResult.PASS;
- ++mTestPassedCounter;
- } catch (InvocationTargetException e) {
- // get the inner exception, because we use reflection APIs to execute the test
- Throwable cause = e.getCause();
- testDetails.summary = cause.getMessage();
- if (cause instanceof SensorNotSupportedException) {
- testDetails.result = SensorTestResult.SKIPPED;
- ++mTestSkippedCounter;
- } else {
- testDetails.result = SensorTestResult.FAIL;
- ++mTestFailedCounter;
- }
- } catch (Throwable e) {
- testDetails.summary = e.getMessage();
- testDetails.result = SensorTestResult.FAIL;
- ++mTestFailedCounter;
- }
-
- return testDetails;
- }
-
- private SensorTestDetails getOverallTestDetails() {
- SensorTestDetails testDetails = new SensorTestDetails();
- testDetails.name = getTestClassName();
-
- testDetails.result = SensorTestResult.PASS;
- if (mTestFailedCounter > 0) {
- testDetails.result = SensorTestResult.FAIL;
- } else if (mTestSkippedCounter > 0 || mTestPassedCounter == 0) {
- testDetails.result = SensorTestResult.SKIPPED;
- }
-
- testDetails.summary = getString(
- R.string.snsr_test_summary,
- mTestPassedCounter,
- mTestSkippedCounter,
- mTestFailedCounter);
-
- return testDetails;
- }
-
- private String getTestClassName() {
- if (mTestClass == null) {
- return "<unknown>";
- }
- return mTestClass.getName();
- }
-
- private class TextAppender {
- private final TextView mTextView;
-
- public TextAppender(int textViewResId) {
- mTextView = (TextView) getLayoutInflater().inflate(textViewResId, null /* viewGroup */);
- }
-
- public void setText(String text) {
- mTextView.setText(text);
- }
-
- public void setText(int textResId) {
- mTextView.setText(textResId);
- }
-
- public void append() {
- runOnUiThread(new Runnable() {
- @Override
- public void run() {
- mLogLayout.addView(mTextView);
- mLogScrollView.post(new Runnable() {
- @Override
- public void run() {
- mLogScrollView.fullScroll(View.FOCUS_DOWN);
- }
- });
- }
- });
- }
- }
-
- private class ButtonEnabler implements Runnable {
- private final View mButtonView;
- private final boolean mButtonEnabled;
-
- public ButtonEnabler(View buttonView, boolean buttonEnabled) {
- mButtonView = buttonView;
- mButtonEnabled = buttonEnabled;
- }
-
- @Override
- public void run() {
- mButtonView.setEnabled(mButtonEnabled);
- }
- }
-
- private class DeactivatorActivityHandler implements SensorFeaturesDeactivator.ActivityHandler {
- private static final int SENSOR_FEATURES_DEACTIVATOR_RESULT = 0;
-
- private CountDownLatch mCountDownLatch;
-
- @Override
- public ContentResolver getContentResolver() {
- return BaseSensorTestActivity.this.getContentResolver();
- }
-
- @Override
- public void logInstructions(int instructionsResId, Object ... params) {
- appendText(BaseSensorTestActivity.this.getString(instructionsResId, params));
- }
-
- @Override
- public void waitForUser() {
- BaseSensorTestActivity.this.waitForUser();
- }
-
- @Override
- public void launchAndWaitForSubactivity(String action) throws InterruptedException {
- mCountDownLatch = new CountDownLatch(1);
- Intent intent = new Intent(action);
- startActivityForResult(intent, SENSOR_FEATURES_DEACTIVATOR_RESULT);
- mCountDownLatch.await();
- }
-
- public void onActivityResult() {
- mCountDownLatch.countDown();
- }
-
- @Override
- public String getString(int resId, Object ... params) {
- return BaseSensorTestActivity.this.getString(resId, params);
- }
- }
-}
diff --git a/apps/CtsVerifier/src/com/android/cts/verifier/sensors/BatchingTestActivity.java b/apps/CtsVerifier/src/com/android/cts/verifier/sensors/BatchingTestActivity.java
index 89a20d2..009e644 100644
--- a/apps/CtsVerifier/src/com/android/cts/verifier/sensors/BatchingTestActivity.java
+++ b/apps/CtsVerifier/src/com/android/cts/verifier/sensors/BatchingTestActivity.java
@@ -17,6 +17,7 @@
package com.android.cts.verifier.sensors;
import com.android.cts.verifier.R;
+import com.android.cts.verifier.sensors.base.SensorCtsVerifierTestActivity;
import junit.framework.Assert;
@@ -43,7 +44,9 @@
* If a sensor supports the batching mode, FifoReservedEventCount for that sensor should be greater
* than one.
*/
-public class BatchingTestActivity extends BaseSensorTestActivity implements SensorEventListener2 {
+public class BatchingTestActivity
+ extends SensorCtsVerifierTestActivity
+ implements SensorEventListener2 {
public BatchingTestActivity() {
super(BatchingTestActivity.class);
}
@@ -75,14 +78,14 @@
PowerManager powerManager = (PowerManager) getSystemService(Context.POWER_SERVICE);
mWakeLock = powerManager.newWakeLock(PowerManager.SCREEN_DIM_WAKE_LOCK, "BatchingTests");
- mSensorFeaturesDeactivator.requestDeactivationOfFeatures();
+ deactivateSensorFeatures();
mWakeLock.acquire();
}
@Override
protected void activityCleanUp() throws InterruptedException {
mWakeLock.release();
- mSensorFeaturesDeactivator.requestToRestoreFeatures();
+ restoreSensorFeatures();
}
// TODO: refactor to discover all available sensors of each type and dinamically generate test
diff --git a/apps/CtsVerifier/src/com/android/cts/verifier/sensors/GyroscopeMeasurementTestActivity.java b/apps/CtsVerifier/src/com/android/cts/verifier/sensors/GyroscopeMeasurementTestActivity.java
index 0c6b931..c4927e9 100644
--- a/apps/CtsVerifier/src/com/android/cts/verifier/sensors/GyroscopeMeasurementTestActivity.java
+++ b/apps/CtsVerifier/src/com/android/cts/verifier/sensors/GyroscopeMeasurementTestActivity.java
@@ -17,6 +17,7 @@
package com.android.cts.verifier.sensors;
import com.android.cts.verifier.R;
+import com.android.cts.verifier.sensors.base.SensorCtsVerifierTestActivity;
import android.hardware.Sensor;
import android.hardware.SensorManager;
@@ -26,7 +27,7 @@
/**
* Semi-automated test that focuses on characteristics associated with Accelerometer measurements.
*/
-public class GyroscopeMeasurementTestActivity extends BaseSensorTestActivity {
+public class GyroscopeMeasurementTestActivity extends SensorCtsVerifierTestActivity {
public GyroscopeMeasurementTestActivity() {
super(GyroscopeMeasurementTestActivity.class);
}
diff --git a/apps/CtsVerifier/src/com/android/cts/verifier/sensors/MagneticFieldMeasurementTestActivity.java b/apps/CtsVerifier/src/com/android/cts/verifier/sensors/MagneticFieldMeasurementTestActivity.java
index 0177a85..0e83a3e 100644
--- a/apps/CtsVerifier/src/com/android/cts/verifier/sensors/MagneticFieldMeasurementTestActivity.java
+++ b/apps/CtsVerifier/src/com/android/cts/verifier/sensors/MagneticFieldMeasurementTestActivity.java
@@ -17,6 +17,7 @@
package com.android.cts.verifier.sensors;
import com.android.cts.verifier.R;
+import com.android.cts.verifier.sensors.base.SensorCtsVerifierTestActivity;
import android.graphics.Color;
import android.hardware.Sensor;
@@ -35,7 +36,7 @@
* Also, it is recommended to execute these tests outdoors, or at least far from magnetic
* disturbances.
*/
-public class MagneticFieldMeasurementTestActivity extends BaseSensorTestActivity {
+public class MagneticFieldMeasurementTestActivity extends SensorCtsVerifierTestActivity {
public MagneticFieldMeasurementTestActivity() {
super(MagneticFieldMeasurementTestActivity.class);
}
diff --git a/apps/CtsVerifier/src/com/android/cts/verifier/sensors/RotationVectorTestActivity.java b/apps/CtsVerifier/src/com/android/cts/verifier/sensors/RotationVectorTestActivity.java
index 9ffce01..6526ed1 100644
--- a/apps/CtsVerifier/src/com/android/cts/verifier/sensors/RotationVectorTestActivity.java
+++ b/apps/CtsVerifier/src/com/android/cts/verifier/sensors/RotationVectorTestActivity.java
@@ -17,6 +17,7 @@
package com.android.cts.verifier.sensors;
import com.android.cts.verifier.R;
+import com.android.cts.verifier.sensors.base.SensorCtsVerifierTestActivity;
import junit.framework.Assert;
@@ -42,7 +43,7 @@
* - GAME_ROTATION_VECTOR.
*/
public class RotationVectorTestActivity
- extends BaseSensorTestActivity
+ extends SensorCtsVerifierTestActivity
implements SensorEventListener {
public RotationVectorTestActivity() {
super(RotationVectorTestActivity.class, R.layout.snsr_rotvec);
diff --git a/apps/CtsVerifier/src/com/android/cts/verifier/sensors/SensorIntegrationTestsActivity.java b/apps/CtsVerifier/src/com/android/cts/verifier/sensors/SensorIntegrationTestsActivity.java
new file mode 100644
index 0000000..bda7f2b
--- /dev/null
+++ b/apps/CtsVerifier/src/com/android/cts/verifier/sensors/SensorIntegrationTestsActivity.java
@@ -0,0 +1,31 @@
+/*
+ * Copyright (C) 2014 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 com.android.cts.verifier.sensors;
+
+import com.android.cts.verifier.sensors.base.SensorCtsTestActivity;
+
+import android.hardware.cts.SensorIntegrationTests;
+
+/**
+ * Activity to execute CTS sensor integration tests.
+ * It is a wrapper for {@link SensorIntegrationTests} running with AndroidJUnitRunner.
+ */
+public class SensorIntegrationTestsActivity extends SensorCtsTestActivity {
+ public SensorIntegrationTestsActivity() {
+ super(SensorIntegrationTests.class);
+ }
+}
diff --git a/apps/CtsVerifier/src/com/android/cts/verifier/sensors/SensorPowerTestActivity.java b/apps/CtsVerifier/src/com/android/cts/verifier/sensors/SensorPowerTestActivity.java
index f992107..85ab6c5 100644
--- a/apps/CtsVerifier/src/com/android/cts/verifier/sensors/SensorPowerTestActivity.java
+++ b/apps/CtsVerifier/src/com/android/cts/verifier/sensors/SensorPowerTestActivity.java
@@ -16,14 +16,17 @@
package com.android.cts.verifier.sensors;
+import com.android.cts.verifier.sensors.base.SensorCtsVerifierTestActivity;
import com.android.cts.verifier.sensors.helpers.PowerTestHostLink;
+import com.android.cts.verifier.sensors.reporting.SensorTestDetails;
import junit.framework.Assert;
import java.util.concurrent.TimeUnit;
-public class SensorPowerTestActivity extends BaseSensorTestActivity implements
- PowerTestHostLink.HostToDeviceInterface {
+public class SensorPowerTestActivity
+ extends SensorCtsVerifierTestActivity
+ implements PowerTestHostLink.HostToDeviceInterface {
public class TestExecutionException extends Exception {
public TestExecutionException(final String message) {
super(message);
@@ -43,9 +46,8 @@
}
/* channel for host to raise an exception on the device if needed */
- public void raiseError(final String testname,
- final String message) throws Exception {
- setTestResult(testname, SensorTestResult.SKIPPED, message);
+ public void raiseError(String testName, String message) throws Exception {
+ getTestLogger().logTestFail(testName, message);
throw new TestExecutionException(message);
}
@@ -53,14 +55,14 @@
appendText(text);
}
- public void logTestResult(String testId, SensorTestResult testResult, String testDetails) {
- setTestResult(testId, testResult, testDetails);
+ public void logTestResult(SensorTestDetails testDetails) {
+ getTestLogger().logTestDetails(testDetails);
}
@Override
protected void activitySetUp() throws InterruptedException {
- mSensorFeaturesDeactivator.requestToSetScreenOffTimeout(15, TimeUnit.SECONDS);
- mSensorFeaturesDeactivator.requestDeactivationOfFeatures();
+ setScreenOffTimeout(15, TimeUnit.SECONDS);
+ deactivateSensorFeatures();
}
@Override
@@ -69,12 +71,11 @@
mHostLink.close();
}
- mSensorFeaturesDeactivator.requestToRestoreFeatures();
- mSensorFeaturesDeactivator.requestToResetScreenOffTimeout();
+ restoreSensorFeatures();
+ resetScreenOffTimeout();
}
public String testSensorsPower() throws Throwable {
- String testDetails = "";
if (mHostLink == null) {
// prepare Activity screen to show instructions to the operator
clearText();
@@ -94,17 +95,22 @@
// until it issues an "EXIT" command to break out
// of the run loop. The host will run all associated tests
// sequentially here:
- final PowerTestHostLink.PowerTestResult testResult = mHostLink.run();
- testDetails = testResult.testDetails;
- Assert.assertEquals(testDetails, 0, testResult.failedCount);
+ PowerTestHostLink.PowerTestResult testResult = mHostLink.run();
+
+ SensorTestDetails testDetails = new SensorTestDetails(
+ getApplicationContext(),
+ "SensorPowerTest",
+ testResult.passedCount,
+ testResult.skippedCount,
+ testResult.failedCount);
+ Assert.assertEquals(testDetails.getSummary(), 0, testResult.failedCount);
+ return testDetails.getSummary();
} finally {
mHostLink.close();
mHostLink = null;
}
-
} else {
throw new IllegalStateException("Attempt to run test twice");
}
- return testDetails;
}
}
diff --git a/apps/CtsVerifier/src/com/android/cts/verifier/sensors/SensorSynchronizationTestActivity.java b/apps/CtsVerifier/src/com/android/cts/verifier/sensors/SensorSynchronizationTestActivity.java
index fe66dc9..eeb4bf0 100644
--- a/apps/CtsVerifier/src/com/android/cts/verifier/sensors/SensorSynchronizationTestActivity.java
+++ b/apps/CtsVerifier/src/com/android/cts/verifier/sensors/SensorSynchronizationTestActivity.java
@@ -1,10 +1,10 @@
package com.android.cts.verifier.sensors;
-import java.util.ArrayList;
-import java.util.List;
+import com.android.cts.verifier.sensors.base.BaseSensorSemiAutomatedTestActivity;
import junit.framework.Assert;
+
import android.annotation.TargetApi;
import android.content.Context;
import android.graphics.Color;
@@ -16,13 +16,17 @@
import android.os.Build;
import android.os.SystemClock;
+import java.util.ArrayList;
+import java.util.List;
+
/**
* Test cross-sensor timestamp alignment by detecting major change in each
* sensor and comparing timestamps of that change.
*/
@TargetApi(Build.VERSION_CODES.JELLY_BEAN_MR1)
-public class SensorSynchronizationTestActivity extends
- BaseSensorSemiAutomatedTestActivity implements SensorEventListener {
+public class SensorSynchronizationTestActivity
+ extends BaseSensorSemiAutomatedTestActivity
+ implements SensorEventListener {
private final double NANOS_PER_MILLI = 1e6;
private final int DATA_COLLECTION_TIME_IN_MS = 5000;
diff --git a/apps/CtsVerifier/src/com/android/cts/verifier/sensors/SensorTestActivity.java b/apps/CtsVerifier/src/com/android/cts/verifier/sensors/SensorTestActivity.java
new file mode 100644
index 0000000..fd3d380
--- /dev/null
+++ b/apps/CtsVerifier/src/com/android/cts/verifier/sensors/SensorTestActivity.java
@@ -0,0 +1,31 @@
+/*
+ * Copyright (C) 2014 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 com.android.cts.verifier.sensors;
+
+import com.android.cts.verifier.sensors.base.SensorCtsTestActivity;
+
+import android.hardware.cts.SensorTest;
+
+/**
+ * Activity to execute CTS sensor tests.
+ * It is a wrapper for {@link SensorTest} running with AndroidJUnitRunner.
+ */
+public class SensorTestActivity extends SensorCtsTestActivity {
+ public SensorTestActivity() {
+ super(SensorTest.class);
+ }
+}
diff --git a/apps/CtsVerifier/src/com/android/cts/verifier/sensors/SensorValueAccuracyActivity.java b/apps/CtsVerifier/src/com/android/cts/verifier/sensors/SensorValueAccuracyActivity.java
index 601060f..d8075f0 100644
--- a/apps/CtsVerifier/src/com/android/cts/verifier/sensors/SensorValueAccuracyActivity.java
+++ b/apps/CtsVerifier/src/com/android/cts/verifier/sensors/SensorValueAccuracyActivity.java
@@ -17,6 +17,7 @@
package com.android.cts.verifier.sensors;
import com.android.cts.verifier.R;
+import com.android.cts.verifier.sensors.base.SensorCtsVerifierTestActivity;
import junit.framework.Assert;
@@ -41,7 +42,7 @@
* data rates. Also sensor events will be verified while other sensors are also active.
*/
public class SensorValueAccuracyActivity
- extends BaseSensorTestActivity
+ extends SensorCtsVerifierTestActivity
implements SensorEventListener {
public SensorValueAccuracyActivity() {
super(SensorValueAccuracyActivity.class);
diff --git a/apps/CtsVerifier/src/com/android/cts/verifier/sensors/SignificantMotionTestActivity.java b/apps/CtsVerifier/src/com/android/cts/verifier/sensors/SignificantMotionTestActivity.java
index cd0cfcb..73608f1 100644
--- a/apps/CtsVerifier/src/com/android/cts/verifier/sensors/SignificantMotionTestActivity.java
+++ b/apps/CtsVerifier/src/com/android/cts/verifier/sensors/SignificantMotionTestActivity.java
@@ -17,6 +17,7 @@
package com.android.cts.verifier.sensors;
import com.android.cts.verifier.R;
+import com.android.cts.verifier.sensors.base.SensorCtsVerifierTestActivity;
import junit.framework.Assert;
@@ -35,7 +36,7 @@
* Test cases for Significant Motion sensor.
* They use walking motion to change the location and trigger Significant Motion.
*/
-public class SignificantMotionTestActivity extends BaseSensorTestActivity {
+public class SignificantMotionTestActivity extends SensorCtsVerifierTestActivity {
public SignificantMotionTestActivity() {
super(SignificantMotionTestActivity.class);
}
diff --git a/apps/CtsVerifier/src/com/android/cts/verifier/sensors/SingleSensorTestsActivity.java b/apps/CtsVerifier/src/com/android/cts/verifier/sensors/SingleSensorTestsActivity.java
new file mode 100644
index 0000000..23b5707
--- /dev/null
+++ b/apps/CtsVerifier/src/com/android/cts/verifier/sensors/SingleSensorTestsActivity.java
@@ -0,0 +1,31 @@
+/*
+ * Copyright (C) 2014 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 com.android.cts.verifier.sensors;
+
+import com.android.cts.verifier.sensors.base.SensorCtsTestActivity;
+
+import android.hardware.cts.SingleSensorTests;
+
+/**
+ * Activity to execute CTS single sensor tests.
+ * It is a wrapper for {@link SingleSensorTests} running with AndroidJUnitRunner.
+ */
+public class SingleSensorTestsActivity extends SensorCtsTestActivity {
+ public SingleSensorTestsActivity() {
+ super(SingleSensorTests.class);
+ }
+}
diff --git a/apps/CtsVerifier/src/com/android/cts/verifier/sensors/StepCounterTestActivity.java b/apps/CtsVerifier/src/com/android/cts/verifier/sensors/StepCounterTestActivity.java
index cc75a11..78430e3 100644
--- a/apps/CtsVerifier/src/com/android/cts/verifier/sensors/StepCounterTestActivity.java
+++ b/apps/CtsVerifier/src/com/android/cts/verifier/sensors/StepCounterTestActivity.java
@@ -17,6 +17,7 @@
package com.android.cts.verifier.sensors;
import com.android.cts.verifier.R;
+import com.android.cts.verifier.sensors.base.SensorCtsVerifierTestActivity;
import junit.framework.Assert;
@@ -35,7 +36,9 @@
import java.util.List;
import java.util.concurrent.TimeUnit;
-public class StepCounterTestActivity extends BaseSensorTestActivity implements SensorEventListener {
+public class StepCounterTestActivity
+ extends SensorCtsVerifierTestActivity
+ implements SensorEventListener {
public StepCounterTestActivity() {
super(StepCounterTestActivity.class);
}
diff --git a/apps/CtsVerifier/src/com/android/cts/verifier/sensors/BaseSensorSemiAutomatedTestActivity.java b/apps/CtsVerifier/src/com/android/cts/verifier/sensors/base/BaseSensorSemiAutomatedTestActivity.java
similarity index 62%
rename from apps/CtsVerifier/src/com/android/cts/verifier/sensors/BaseSensorSemiAutomatedTestActivity.java
rename to apps/CtsVerifier/src/com/android/cts/verifier/sensors/base/BaseSensorSemiAutomatedTestActivity.java
index 8685d43..7f32a07 100644
--- a/apps/CtsVerifier/src/com/android/cts/verifier/sensors/BaseSensorSemiAutomatedTestActivity.java
+++ b/apps/CtsVerifier/src/com/android/cts/verifier/sensors/base/BaseSensorSemiAutomatedTestActivity.java
@@ -14,17 +14,14 @@
* limitations under the License.
*/
-package com.android.cts.verifier.sensors;
+package com.android.cts.verifier.sensors.base;
-import com.android.cts.verifier.R;
+import com.android.cts.verifier.sensors.reporting.SensorTestDetails;
-import android.graphics.Color;
import android.hardware.cts.helpers.SensorNotSupportedException;
/**
- * Base class to author Sensor semi-automated test cases.
- * These tests can only wait for operators to notify at some intervals, but the test needs to be
- * autonomous to verify the data collected.
+ * Base class to author a single Sensor semi-automated test case.
*
* @deprecated use {@link BaseSensorTestActivity} instead.
*/
@@ -35,23 +32,20 @@
}
@Override
- public void run() {
- String message = "";
- SensorTestResult testResult = SensorTestResult.PASS;
+ public SensorTestDetails executeTests() {
+ String summary = "";
+ SensorTestDetails.ResultCode resultCode = SensorTestDetails.ResultCode.PASS;
try {
onRun();
} catch(SensorNotSupportedException e) {
// the sensor is not supported/available in the device, log a warning and skip the test
- testResult = SensorTestResult.SKIPPED;
- message = e.getMessage();
+ resultCode = SensorTestDetails.ResultCode.SKIPPED;
+ summary = e.getMessage();
} catch(Throwable e) {
- testResult = SensorTestResult.FAIL;
- message = e.getMessage();
+ resultCode = SensorTestDetails.ResultCode.FAIL;
+ summary = e.getMessage();
}
- setTestResult(getTestId(), testResult, message);
- appendText(R.string.snsr_test_complete);
- waitForUser();
- finish();
+ return new SensorTestDetails(getTestClassName(), resultCode, summary);
}
/**
@@ -62,13 +56,6 @@
*
* throws Throwable
*/
+ @Deprecated
protected abstract void onRun() throws Throwable;
-
- protected void logSuccess() {
- appendText(R.string.snsr_test_pass, Color.GREEN);
- }
-
- private String getTestId() {
- return this.getClass().getName();
- }
}
diff --git a/apps/CtsVerifier/src/com/android/cts/verifier/sensors/base/BaseSensorTestActivity.java b/apps/CtsVerifier/src/com/android/cts/verifier/sensors/base/BaseSensorTestActivity.java
new file mode 100644
index 0000000..2938dff
--- /dev/null
+++ b/apps/CtsVerifier/src/com/android/cts/verifier/sensors/base/BaseSensorTestActivity.java
@@ -0,0 +1,558 @@
+/*
+
+ * Copyright (C) 2014 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 com.android.cts.verifier.sensors.base;
+
+import com.android.cts.verifier.R;
+import com.android.cts.verifier.TestResult;
+import com.android.cts.verifier.sensors.helpers.SensorFeaturesDeactivator;
+import com.android.cts.verifier.sensors.reporting.SensorTestDetails;
+
+import junit.framework.Assert;
+
+import android.app.Activity;
+import android.content.ContentResolver;
+import android.content.Context;
+import android.content.Intent;
+import android.media.MediaPlayer;
+import android.os.Bundle;
+import android.os.Vibrator;
+import android.provider.Settings;
+import android.text.TextUtils;
+import android.util.Log;
+import android.view.View;
+import android.widget.LinearLayout;
+import android.widget.ScrollView;
+import android.widget.TextView;
+
+import java.security.InvalidParameterException;
+import java.util.concurrent.CountDownLatch;
+import java.util.concurrent.Semaphore;
+import java.util.concurrent.TimeUnit;
+
+/**
+ * A base Activity that is used to build different methods to execute tests inside CtsVerifier.
+ * i.e. CTS tests, and semi-automated CtsVerifier tests.
+ *
+ * This class provides access to the following flow:
+ * Activity set up
+ * Execute tests (implemented by sub-classes)
+ * Activity clean up
+ *
+ * Currently the following class structure is available:
+ * - BaseSensorTestActivity : provides the platform to execute Sensor tests inside
+ * | CtsVerifier, and logging support
+ * |
+ * -- SensorCtsTestActivity : an activity that can be inherited from to wrap a CTS
+ * | sensor test, and execute it inside CtsVerifier
+ * | these tests do not require any operator interaction
+ * |
+ * -- SensorCtsVerifierTestActivity : an activity that can be inherited to write sensor
+ * tests that require operator interaction
+ */
+public abstract class BaseSensorTestActivity
+ extends Activity
+ implements View.OnClickListener, Runnable {
+ @Deprecated
+ protected static final String LOG_TAG = "SensorTest";
+
+ protected final Class mTestClass;
+
+ private final int mLayoutId;
+ private final DeactivatorActivityHandler mDeactivatorActivityHandler;
+ private final SensorFeaturesDeactivator mSensorFeaturesDeactivator;
+
+ private final Semaphore mSemaphore = new Semaphore(0);
+ private final SensorTestLogger mTestLogger = new SensorTestLogger();
+
+ private ScrollView mLogScrollView;
+ private LinearLayout mLogLayout;
+ private View mNextView;
+
+ /**
+ * Constructor to be used by subclasses.
+ *
+ * @param testClass The class that contains the tests. It is dependant on test executor
+ * implemented by subclasses.
+ */
+ protected BaseSensorTestActivity(Class testClass) {
+ this(testClass, R.layout.snsr_semi_auto_test);
+ }
+
+ /**
+ * Constructor to be used by subclasses. It allows to provide a custom layout for the test UI.
+ *
+ * @param testClass The class that contains the tests. It is dependant on test executor
+ * implemented by subclasses.
+ * @param layoutId The Id of the layout to use for the test UI. The layout must contain all the
+ * elements in the base layout {@code R.layout.snsr_semi_auto_test}.
+ */
+ protected BaseSensorTestActivity(Class testClass, int layoutId) {
+ mTestClass = testClass;
+ mLayoutId = layoutId;
+ mDeactivatorActivityHandler = new DeactivatorActivityHandler();
+ mSensorFeaturesDeactivator = new SensorFeaturesDeactivator(mDeactivatorActivityHandler);
+ }
+
+ @Override
+ protected void onCreate(Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+ setContentView(mLayoutId);
+
+ mLogScrollView = (ScrollView) findViewById(R.id.log_scroll_view);
+ mLogLayout = (LinearLayout) findViewById(R.id.log_layout);
+ mNextView = findViewById(R.id.next_button);
+ mNextView.setOnClickListener(this);
+
+ updateButton(false /*enabled*/);
+ new Thread(this).start();
+ }
+
+ @Override
+ public void onClick(View target) {
+ mSemaphore.release();
+ }
+
+ @Override
+ protected void onActivityResult(int requestCode, int resultCode, Intent data) {
+ mDeactivatorActivityHandler.onActivityResult();
+ }
+
+ /**
+ * The main execution {@link Thread}.
+ *
+ * This function executes in a background thread, allowing the test run freely behind the
+ * scenes. It provides the following execution hooks:
+ * - Activity SetUp/CleanUp (not available in JUnit)
+ * - executeTests: to implement several execution engines
+ */
+ @Override
+ public void run() {
+ SensorTestDetails testDetails = null;
+ try {
+ activitySetUp();
+ } catch (Throwable e) {
+ testDetails = new SensorTestDetails(
+ getTestClassName(),
+ SensorTestDetails.ResultCode.SKIPPED,
+ "[ActivitySetUp] " + e.getMessage());
+ }
+
+ // TODO: implement execution filters:
+ // - execute all tests and report results officially
+ // - execute single tests or failed tests only
+ if (testDetails == null) {
+ testDetails = executeTests();
+ }
+
+ try {
+ activityCleanUp();
+ } catch (Throwable e) {
+ testDetails = new SensorTestDetails(
+ getTestClassName(),
+ SensorTestDetails.ResultCode.FAIL,
+ "[ActivityCleanUp] " + e.getMessage());
+ }
+ mTestLogger.logInstructions(R.string.snsr_test_complete);
+
+ // log to screen and save the overall test summary (activity level)
+ setTestResult(testDetails);
+ waitForUser(R.string.snsr_wait_to_complete);
+ finish();
+ }
+
+ /**
+ * A general set up routine. It executes only once before the first test case.
+ *
+ * @throws Throwable An exception that denotes the failure of set up. No tests will be executed.
+ */
+ protected void activitySetUp() throws Throwable {}
+
+ /**
+ * A general clean up routine. It executes upon successful execution of {@link #activitySetUp()}
+ * and after all the test cases.
+ *
+ * @throws Throwable An exception that will be logged and ignored, for ease of implementation
+ * by subclasses.
+ */
+ protected void activityCleanUp() throws Throwable {}
+
+ /**
+ * Performs the work of executing the tests.
+ * Sub-classes implementing different execution methods implement this method.
+ *
+ * @return A {@link SensorTestDetails} object containing information about the executed tests.
+ */
+ protected abstract SensorTestDetails executeTests();
+
+ /**
+ * Guides the operator throughout the process of deactivating features that are known to use
+ * Sensor data.
+ *
+ * @throws InterruptedException
+ */
+ protected void deactivateSensorFeatures() throws InterruptedException {
+ mSensorFeaturesDeactivator.requestDeactivationOfFeatures();
+ }
+
+ /**
+ * Guides the operator throughout the process of restoring the state of features that are known
+ * to use Sensor data, to their original state.
+ *
+ * @throws InterruptedException
+ */
+ protected void restoreSensorFeatures() throws InterruptedException {
+ mSensorFeaturesDeactivator.requestToRestoreFeatures();
+ }
+
+ /**
+ * Guides the operator throughout the process of setting the Screen Off timeout to a required
+ * value.
+ *
+ * @param timeout The expected timeout.
+ * @param timeUnit The unit of the provided timeout.
+ *
+ * @throws InterruptedException
+ */
+ protected void setScreenOffTimeout(long timeout, TimeUnit timeUnit)
+ throws InterruptedException {
+ mSensorFeaturesDeactivator.requestToSetScreenOffTimeout(timeout, timeUnit);
+ }
+
+ /**
+ * Guides the operator throughout the process of restoring the state of the Screen Off timeout
+ * to its original state.
+ *
+ * @throws InterruptedException
+ */
+ protected void resetScreenOffTimeout() throws InterruptedException {
+ mSensorFeaturesDeactivator.requestToResetScreenOffTimeout();
+ }
+
+ protected SensorTestLogger getTestLogger() {
+ return mTestLogger;
+ }
+
+ @Deprecated
+ protected void appendText(int resId, int textColor) {
+ mTestLogger.logInstructions(resId);
+ }
+
+ @Deprecated
+ protected void appendText(String text, int textColor) {
+ appendText(text);
+ }
+
+ @Deprecated
+ protected void appendText(int resId) {
+ mTestLogger.logInstructions(resId);
+ }
+
+ @Deprecated
+ protected void appendText(String text) {
+ TextAppender textAppender = new TextAppender(R.layout.snsr_instruction);
+ textAppender.setText(text);
+ textAppender.append();
+ }
+
+ @Deprecated
+ protected void clearText() {
+ this.runOnUiThread(new Runnable() {
+ @Override
+ public void run() {
+ mLogLayout.removeAllViews();
+ }
+ });
+ }
+
+ /**
+ * Waits for the operator to acknowledge a requested action.
+ *
+ * @param waitMessageResId The action requested to the operator.
+ */
+ protected void waitForUser(int waitMessageResId) {
+ mTestLogger.logInstructions(waitMessageResId);
+ updateButton(true);
+ try {
+ mSemaphore.acquire();
+ } catch (InterruptedException e) {
+ Log.e(LOG_TAG, "Error on waitForUser", e);
+ }
+ updateButton(false);
+ }
+
+ /**
+ * Waits for the operator to acknowledge to begin execution.
+ */
+ protected void waitForUserToBegin() {
+ waitForUser(R.string.snsr_wait_to_begin);
+ }
+
+ @Deprecated
+ protected void waitForUser() {
+ waitForUser(R.string.snsr_wait_for_user);
+ }
+
+ protected void playSound() {
+ MediaPlayer player = MediaPlayer.create(this, Settings.System.DEFAULT_NOTIFICATION_URI);
+ if (player == null) {
+ Log.e(LOG_TAG, "MediaPlayer unavailable.");
+ return;
+ }
+
+ player.start();
+ try {
+ Thread.sleep(500);
+ } catch(InterruptedException e) {
+ Log.d(LOG_TAG, "Error on playSound", e);
+ } finally {
+ player.stop();
+ }
+ }
+
+ protected void vibrate(int timeInMs) {
+ Vibrator vibrator = (Vibrator) getSystemService(Context.VIBRATOR_SERVICE);
+ vibrator.vibrate(timeInMs);
+ }
+
+ protected void vibrate(long[] pattern) {
+ Vibrator vibrator = (Vibrator) getSystemService(Context.VIBRATOR_SERVICE);
+ vibrator.vibrate(pattern, -1);
+ }
+
+ // TODO: move to sensor assertions
+ protected String assertTimestampSynchronization(
+ long eventTimestamp,
+ long receivedTimestamp,
+ long deltaThreshold,
+ String sensorName) {
+ long timestampDelta = Math.abs(eventTimestamp - receivedTimestamp);
+ String timestampMessage = getString(
+ R.string.snsr_event_time,
+ receivedTimestamp,
+ eventTimestamp,
+ timestampDelta,
+ deltaThreshold,
+ sensorName);
+ Assert.assertTrue(timestampMessage, timestampDelta < deltaThreshold);
+ return timestampMessage;
+ }
+
+ protected String getTestClassName() {
+ if (mTestClass == null) {
+ return "<unknown>";
+ }
+ return mTestClass.getName();
+ }
+
+ private void setTestResult(SensorTestDetails testDetails) {
+ mTestLogger.logTestDetails(testDetails);
+
+ String summary = mTestLogger.getOverallSummary();
+ String name = testDetails.getName();
+ switch(testDetails.getResultCode()) {
+ case SKIPPED:
+ TestResult.setPassedResult(this, name, summary);
+ break;
+ case PASS:
+ TestResult.setPassedResult(this, name, summary);
+ break;
+ case FAIL:
+ TestResult.setFailedResult(this, name, summary);
+ break;
+ }
+ }
+
+ private void updateButton(boolean enabled) {
+ runOnUiThread(new ButtonEnabler(this.mNextView, enabled));
+ }
+
+ // a logger available until sensor reporting is in place
+ protected class SensorTestLogger {
+ private static final String SUMMARY_SEPARATOR = " | ";
+
+ private final StringBuilder mOverallSummaryBuilder = new StringBuilder();
+
+ public void logTestStart(String testName) {
+ // TODO: log the sensor information and expected execution time of each test
+ TextAppender textAppender = new TextAppender(R.layout.snsr_test_title);
+ textAppender.setText(testName);
+ textAppender.append();
+ }
+
+ // TODO: add methods to log failures in activity setup/cleanup
+
+ public void logInstructions(int instructionsResId, Object ... params) {
+ TextAppender textAppender = new TextAppender(R.layout.snsr_instruction);
+ textAppender.setText(getString(instructionsResId, params));
+ textAppender.append();
+ }
+
+ public void logTestDetails(SensorTestDetails testDetails) {
+ String name = testDetails.getName();
+ String summary = testDetails.getSummary();
+ switch (testDetails.getResultCode()) {
+ case SKIPPED:
+ logTestSkip(name, summary);
+ break;
+ case PASS:
+ logTestPass(name, summary);
+ break;
+ case FAIL:
+ logTestFail(name, summary);
+ break;
+ default:
+ throw new InvalidParameterException(
+ "Invalid SensorTestDetails.ResultCode: " + testDetails.getResultCode());
+ }
+ }
+
+ public void logTestPass(String testName, String testSummary) {
+ testSummary = getValidTestSummary(testSummary, R.string.snsr_test_pass);
+ logTestEnd(R.layout.snsr_success, testSummary);
+ Log.d(LOG_TAG, testSummary);
+ saveResult(testName, SensorTestDetails.ResultCode.PASS, testSummary);
+ }
+
+ public void logTestFail(String testName, String testSummary) {
+ testSummary = getValidTestSummary(testSummary, R.string.snsr_test_fail);
+ logTestEnd(R.layout.snsr_error, testSummary);
+ Log.e(LOG_TAG, testSummary);
+ saveResult(testName, SensorTestDetails.ResultCode.FAIL, testSummary);
+ }
+
+ public void logTestSkip(String testName, String testSummary) {
+ testSummary = getValidTestSummary(testSummary, R.string.snsr_test_skipped);
+ logTestEnd(R.layout.snsr_warning, testSummary);
+ Log.i(LOG_TAG, testSummary);
+ saveResult(testName, SensorTestDetails.ResultCode.SKIPPED, testSummary);
+ }
+
+ public String getOverallSummary() {
+ return mOverallSummaryBuilder.toString();
+ }
+
+ private void logTestEnd(int textViewResId, String testSummary) {
+ TextAppender textAppender = new TextAppender(textViewResId);
+ textAppender.setText(testSummary);
+ textAppender.append();
+ }
+
+ private String getValidTestSummary(String testSummary, int defaultSummaryResId) {
+ if (TextUtils.isEmpty(testSummary)) {
+ return getString(defaultSummaryResId);
+ }
+ return testSummary;
+ }
+
+ private void saveResult(
+ String testName,
+ SensorTestDetails.ResultCode resultCode,
+ String summary) {
+ mOverallSummaryBuilder.append(testName);
+ mOverallSummaryBuilder.append(SUMMARY_SEPARATOR);
+ mOverallSummaryBuilder.append(resultCode.name());
+ mOverallSummaryBuilder.append(SUMMARY_SEPARATOR);
+ mOverallSummaryBuilder.append(summary);
+ mOverallSummaryBuilder.append("\n");
+ }
+ }
+
+ private class TextAppender {
+ private final TextView mTextView;
+
+ public TextAppender(int textViewResId) {
+ mTextView = (TextView) getLayoutInflater().inflate(textViewResId, null /* viewGroup */);
+ }
+
+ public void setText(String text) {
+ mTextView.setText(text);
+ }
+
+ public void setText(int textResId) {
+ mTextView.setText(textResId);
+ }
+
+ public void append() {
+ runOnUiThread(new Runnable() {
+ @Override
+ public void run() {
+ mLogLayout.addView(mTextView);
+ mLogScrollView.post(new Runnable() {
+ @Override
+ public void run() {
+ mLogScrollView.fullScroll(View.FOCUS_DOWN);
+ }
+ });
+ }
+ });
+ }
+ }
+
+ private class ButtonEnabler implements Runnable {
+ private final View mButtonView;
+ private final boolean mButtonEnabled;
+
+ public ButtonEnabler(View buttonView, boolean buttonEnabled) {
+ mButtonView = buttonView;
+ mButtonEnabled = buttonEnabled;
+ }
+
+ @Override
+ public void run() {
+ mButtonView.setEnabled(mButtonEnabled);
+ }
+ }
+
+ private class DeactivatorActivityHandler implements SensorFeaturesDeactivator.ActivityHandler {
+ private static final int SENSOR_FEATURES_DEACTIVATOR_RESULT = 0;
+
+ private CountDownLatch mCountDownLatch;
+
+ @Override
+ public ContentResolver getContentResolver() {
+ return BaseSensorTestActivity.this.getContentResolver();
+ }
+
+ @Override
+ public void logInstructions(int instructionsResId, Object ... params) {
+ mTestLogger.logInstructions(instructionsResId, params);
+ }
+
+ @Override
+ public void waitForUser() {
+ BaseSensorTestActivity.this.waitForUser(R.string.snsr_wait_for_user);
+ }
+
+ @Override
+ public void launchAndWaitForSubactivity(String action) throws InterruptedException {
+ mCountDownLatch = new CountDownLatch(1);
+ Intent intent = new Intent(action);
+ startActivityForResult(intent, SENSOR_FEATURES_DEACTIVATOR_RESULT);
+ mCountDownLatch.await();
+ }
+
+ public void onActivityResult() {
+ mCountDownLatch.countDown();
+ }
+
+ @Override
+ public String getString(int resId, Object ... params) {
+ return BaseSensorTestActivity.this.getString(resId, params);
+ }
+ }
+}
diff --git a/apps/CtsVerifier/src/com/android/cts/verifier/sensors/base/SensorCtsTestActivity.java b/apps/CtsVerifier/src/com/android/cts/verifier/sensors/base/SensorCtsTestActivity.java
new file mode 100644
index 0000000..1479248
--- /dev/null
+++ b/apps/CtsVerifier/src/com/android/cts/verifier/sensors/base/SensorCtsTestActivity.java
@@ -0,0 +1,166 @@
+/*
+
+ * Copyright (C) 2014 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 com.android.cts.verifier.sensors.base;
+
+import com.android.cts.verifier.R;
+import com.android.cts.verifier.sensors.reporting.SensorTestDetails;
+
+import junit.framework.TestResult;
+import junit.framework.TestSuite;
+
+import org.junit.internal.runners.JUnit38ClassRunner;
+import org.junit.runner.Computer;
+import org.junit.runner.Description;
+import org.junit.runner.JUnitCore;
+import org.junit.runner.Request;
+import org.junit.runner.Result;
+import org.junit.runner.Runner;
+import org.junit.runner.notification.Failure;
+import org.junit.runner.notification.RunListener;
+import org.junit.runners.model.InitializationError;
+import org.junit.runners.model.RunnerBuilder;
+
+import android.hardware.cts.SensorTestCase;
+
+import java.util.concurrent.TimeUnit;
+
+/**
+ * An Activity that allows Sensor CTS tests to be executed inside CtsVerifier.
+ *
+ * Sub-classes pass the test class as part of construction.
+ * One JUnit test class is executed per Activity, the test class can still be executed outside
+ * CtsVerifier.
+ */
+public abstract class SensorCtsTestActivity extends BaseSensorTestActivity {
+
+ /**
+ * Constructor for a CTS test executor. It will execute a standalone CTS test class.
+ *
+ * @param testClass The test class to execute, it must be a subclass of {@link SensorTestCase}.
+ */
+ protected SensorCtsTestActivity(Class<? extends SensorTestCase> testClass) {
+ super(testClass);
+ }
+
+ @Override
+ protected void activitySetUp() {
+ getTestLogger().logInstructions(R.string.snsr_no_interaction);
+ waitForUserToBegin();
+
+ // TODO: deactivate Sensor features?
+ }
+
+ /**
+ * For reference on the implementation of this test executor see:
+ * android.support.test.runner.AndroidJUnitRunner
+ */
+ @Override
+ protected SensorTestDetails executeTests() {
+ JUnitCore testRunner = new JUnitCore();
+ testRunner.addListener(new SensorRunListener());
+
+ Computer computer = new Computer();
+ RunnerBuilder runnerBuilder = new SensorRunnerBuilder();
+
+ Runner runner;
+ try {
+ runner = computer.getSuite(runnerBuilder, new Class[]{ mTestClass });
+ } catch (InitializationError e) {
+ return new SensorTestDetails(
+ getTestClassName(),
+ SensorTestDetails.ResultCode.FAIL,
+ "[JUnit Initialization]" + e.getMessage());
+ }
+
+ Request request = Request.runner(runner);
+ Result result = testRunner.run(request);
+ return new SensorTestDetails(getApplicationContext(), getClass().getName(), result);
+ }
+
+ /**
+ * A {@link RunnerBuilder} that is used to inject during execution a {@link SensorTestSuite}.
+ */
+ private class SensorRunnerBuilder extends RunnerBuilder {
+ @Override
+ public Runner runnerForClass(Class<?> testClass) throws Throwable {
+ TestSuite testSuite = new SensorTestSuite(testClass);
+ return new JUnit38ClassRunner(testSuite);
+ }
+ }
+
+ /**
+ * A {@link TestSuite} that is used to inject during execution a {@link SensorCtsTestResult}.
+ */
+ private class SensorTestSuite extends TestSuite {
+ public SensorTestSuite(Class<?> testClass) {
+ super(testClass);
+ }
+
+ @Override
+ public void run(TestResult testResult) {
+ super.run(new SensorCtsTestResult(getApplicationContext(), testResult));
+ }
+ }
+
+ /**
+ * Dummy {@link RunListener}.
+ * It is only used to handle logging into the UI.
+ */
+ private class SensorRunListener extends RunListener {
+ private volatile boolean mCurrentTestReported;
+
+ public void testRunStarted(Description description) throws Exception {
+ // nothing to log
+ }
+
+ public void testRunFinished(Result result) throws Exception {
+ // nothing to log
+ vibrate((int)TimeUnit.SECONDS.toMillis(2));
+ playSound();
+ }
+
+ public void testStarted(Description description) throws Exception {
+ mCurrentTestReported = false;
+ getTestLogger().logTestStart(description.getMethodName());
+ }
+
+ public void testFinished(Description description) throws Exception {
+ if (!mCurrentTestReported) {
+ getTestLogger().logTestPass(description.getMethodName(), null /* testSummary */);
+ }
+ playSound();
+ }
+
+ public void testFailure(Failure failure) throws Exception {
+ mCurrentTestReported = true;
+ getTestLogger()
+ .logTestFail(failure.getDescription().getMethodName(), failure.toString());
+ }
+
+ public void testAssumptionFailure(Failure failure) {
+ mCurrentTestReported = true;
+ getTestLogger()
+ .logTestFail(failure.getDescription().getMethodName(), failure.toString());
+ }
+
+ public void testIgnored(Description description) throws Exception {
+ mCurrentTestReported = true;
+ getTestLogger().logTestSkip(description.getMethodName(), description.toString());
+ }
+ }
+}
diff --git a/apps/CtsVerifier/src/com/android/cts/verifier/sensors/base/SensorCtsTestResult.java b/apps/CtsVerifier/src/com/android/cts/verifier/sensors/base/SensorCtsTestResult.java
new file mode 100644
index 0000000..d07b4c4
--- /dev/null
+++ b/apps/CtsVerifier/src/com/android/cts/verifier/sensors/base/SensorCtsTestResult.java
@@ -0,0 +1,133 @@
+/*
+ * Copyright (C) 2014 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 com.android.cts.verifier.sensors.base;
+
+import junit.framework.AssertionFailedError;
+import junit.framework.Protectable;
+import junit.framework.Test;
+import junit.framework.TestCase;
+import junit.framework.TestFailure;
+import junit.framework.TestListener;
+import junit.framework.TestResult;
+
+import android.content.Context;
+import android.hardware.cts.SensorTestCase;
+
+import java.util.Enumeration;
+
+/**
+ * A wrapper class for a {@link TestResult}.
+ *
+ * It provides a way to inject augmented data and helper objects during the execution of tests.
+ * i.e. inject a Context object for use by tests.
+ */
+class SensorCtsTestResult extends TestResult {
+ private final Context mContext;
+ private final TestResult mWrappedTestResult;
+
+ public SensorCtsTestResult(Context context, TestResult testResult) {
+ mContext = context;
+ mWrappedTestResult = testResult;
+ }
+
+ @Override
+ public void addError(Test test, Throwable throwable) {
+ mWrappedTestResult.addError(test, throwable);
+ }
+
+ @Override
+ public void addFailure(Test test, AssertionFailedError assertionFailedError) {
+ mWrappedTestResult.addFailure(test, assertionFailedError);
+ }
+
+ @Override
+ public void addListener(TestListener testListener) {
+ mWrappedTestResult.addListener(testListener);
+ }
+
+ @Override
+ public void removeListener(TestListener testListener) {
+ mWrappedTestResult.removeListener(testListener);
+ }
+
+ @Override
+ public void endTest(Test test) {
+ mWrappedTestResult.endTest(test);
+ }
+
+ @Override
+ public int errorCount() {
+ return mWrappedTestResult.errorCount();
+ }
+
+ @Override
+ public Enumeration<TestFailure> errors() {
+ return mWrappedTestResult.errors();
+ }
+
+ @Override
+ public int failureCount() {
+ return mWrappedTestResult.failureCount();
+ }
+
+ @Override
+ public Enumeration<TestFailure> failures() {
+ return mWrappedTestResult.failures();
+ }
+
+ @Override
+ public int runCount() {
+ return mWrappedTestResult.runCount();
+ }
+
+ @Override
+ public void runProtected(Test test, Protectable protectable) {
+ mWrappedTestResult.runProtected(test, protectable);
+ }
+
+ @Override
+ public boolean shouldStop() {
+ return mWrappedTestResult.shouldStop();
+ }
+
+ @Override
+ public void startTest(Test test) {
+ mWrappedTestResult.startTest(test);
+ }
+
+ @Override
+ public void stop() {
+ mWrappedTestResult.stop();
+ }
+
+ @Override
+ public boolean wasSuccessful() {
+ return mWrappedTestResult.wasSuccessful();
+ }
+
+ @Override
+ protected void run(TestCase testCase) {
+ if (testCase instanceof SensorTestCase) {
+ SensorTestCase sensorTestCase = (SensorTestCase) testCase;
+ sensorTestCase.setContext(mContext);
+ // TODO: set delayed assertion provider
+ } else {
+ throw new IllegalStateException("TestCase must be an instance of SensorTestCase.");
+ }
+ super.run(testCase);
+ }
+}
diff --git a/apps/CtsVerifier/src/com/android/cts/verifier/sensors/base/SensorCtsVerifierTestActivity.java b/apps/CtsVerifier/src/com/android/cts/verifier/sensors/base/SensorCtsVerifierTestActivity.java
new file mode 100644
index 0000000..5987036
--- /dev/null
+++ b/apps/CtsVerifier/src/com/android/cts/verifier/sensors/base/SensorCtsVerifierTestActivity.java
@@ -0,0 +1,132 @@
+/*
+
+ * Copyright (C) 2014 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 com.android.cts.verifier.sensors.base;
+
+import com.android.cts.verifier.sensors.reporting.SensorTestDetails;
+
+import android.hardware.cts.helpers.SensorNotSupportedException;
+
+import java.lang.reflect.InvocationTargetException;
+import java.lang.reflect.Method;
+import java.lang.reflect.Modifier;
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * An Activity that provides a test execution engine for Sensor CtsVerifier tests. The tests are
+ * able to interact with an operator.
+ *
+ * Sub-classes reuse its own class definition to 'load' tests at runtime through reflection.
+ */
+public abstract class SensorCtsVerifierTestActivity extends BaseSensorTestActivity {
+ private volatile int mTestPassedCounter;
+ private volatile int mTestSkippedCounter;
+ private volatile int mTestFailedCounter;
+
+ /**
+ * Constructor for a CtsVerifier test executor. It executes tests defined in the same class.
+ *
+ * @param testClass The test class to execute, this is the same subclass implementing the
+ * executor. It must be a subclass of {@link SensorCtsVerifierTestActivity}
+ */
+ protected SensorCtsVerifierTestActivity(
+ Class<? extends SensorCtsVerifierTestActivity> testClass) {
+ super(testClass);
+ }
+
+ /**
+ * Constructor for a CtsVerifier test executor. It executes tests defined in the same class.
+ *
+ * @param testClass The test class to execute, this is the same subclass implementing the
+ * executor. It must be a subclass of {@link SensorCtsVerifierTestActivity}
+ * @param layoutId The Id of the layout to use for the test UI. The layout must contain all the
+ * elements in the base layout {@code R.layout.snsr_semi_auto_test}.
+ */
+ protected SensorCtsVerifierTestActivity(
+ Class<? extends SensorCtsVerifierTestActivity> testClass,
+ int layoutId) {
+ super(testClass, layoutId);
+ }
+
+ /**
+ * Executes Semi-automated Sensor tests.
+ * Execution is driven by this class, and allows discovery of tests using reflection.
+ */
+ @Override
+ protected SensorTestDetails executeTests() {
+ // TODO: use reporting to log individual test results
+ StringBuilder overallTestResults = new StringBuilder();
+ for (Method testMethod : findTestMethods()) {
+ SensorTestDetails testDetails = executeTest(testMethod);
+ getTestLogger().logTestDetails(testDetails);
+ overallTestResults.append(testDetails.toString());
+ overallTestResults.append("\n");
+ }
+
+ return new SensorTestDetails(
+ getApplicationContext(),
+ getTestClassName(),
+ mTestPassedCounter,
+ mTestSkippedCounter,
+ mTestFailedCounter);
+ }
+
+ private List<Method> findTestMethods() {
+ ArrayList<Method> testMethods = new ArrayList<Method>();
+ for (Method method : mTestClass.getDeclaredMethods()) {
+ if (Modifier.isPublic(method.getModifiers())
+ && method.getParameterTypes().length == 0
+ && method.getName().startsWith("test")
+ && method.getReturnType().equals(String.class)) {
+ testMethods.add(method);
+ }
+ }
+ return testMethods;
+ }
+
+ private SensorTestDetails executeTest(Method testMethod) {
+ String testMethodName = testMethod.getName();
+ String testName = String.format("%s#%s", getTestClassName(), testMethodName);
+ String testSummary;
+ SensorTestDetails.ResultCode testResultCode;
+
+ try {
+ getTestLogger().logTestStart(testMethod.getName());
+ testSummary = (String) testMethod.invoke(this);
+ testResultCode = SensorTestDetails.ResultCode.PASS;
+ ++mTestPassedCounter;
+ } catch (InvocationTargetException e) {
+ // get the inner exception, because we use reflection APIs to execute the test
+ Throwable cause = e.getCause();
+ testSummary = cause.getMessage();
+ if (cause instanceof SensorNotSupportedException) {
+ testResultCode = SensorTestDetails.ResultCode.SKIPPED;
+ ++mTestSkippedCounter;
+ } else {
+ testResultCode = SensorTestDetails.ResultCode.FAIL;
+ ++mTestFailedCounter;
+ }
+ } catch (Throwable e) {
+ testSummary = e.getMessage();
+ testResultCode = SensorTestDetails.ResultCode.FAIL;
+ ++mTestFailedCounter;
+ }
+
+ return new SensorTestDetails(testName, testResultCode, testSummary);
+ }
+}
diff --git a/apps/CtsVerifier/src/com/android/cts/verifier/sensors/helpers/PowerTestHostLink.java b/apps/CtsVerifier/src/com/android/cts/verifier/sensors/helpers/PowerTestHostLink.java
index 828baaa..645bdb2 100644
--- a/apps/CtsVerifier/src/com/android/cts/verifier/sensors/helpers/PowerTestHostLink.java
+++ b/apps/CtsVerifier/src/com/android/cts/verifier/sensors/helpers/PowerTestHostLink.java
@@ -16,7 +16,7 @@
package com.android.cts.verifier.sensors.helpers;
-import com.android.cts.verifier.sensors.BaseSensorTestActivity.SensorTestResult;
+import com.android.cts.verifier.sensors.reporting.SensorTestDetails;
import android.content.Context;
import android.hardware.Sensor;
@@ -35,7 +35,7 @@
import java.util.List;
import java.util.StringTokenizer;
-/*
+/**
* This class handles communication with the host to respond to commands.
* The command/response link is through a TCP socket on the host side, forwarded via adb to a local
* socket on the device. The system uses a standard "accept-read_command-send_response-close" to
@@ -46,12 +46,12 @@
*/
public class PowerTestHostLink {
- /*
+ /**
* Host-to-device bridge will use a Listener instance to drive the test via the CtsVerifier
* running on the device.
*/
public interface HostToDeviceInterface {
- void logTestResult(String testName, SensorTestResult result, String message);
+ void logTestResult(SensorTestDetails testDetails);
void raiseError(String testName, String message) throws Exception;
void waitForUserAcknowledgement(String message);
void logText(String text);
@@ -62,7 +62,6 @@
public int passedCount = 0;
public int skippedCount = 0;
public int failedCount = 0;
- public String testDetails = "";
};
@@ -87,7 +86,6 @@
private final Context mContext;
private final HostToDeviceInterface mHostToDeviceExecutor;
private PowerTestResult mTestResult;
- private StringBuilder mStringBuilder;
public PowerTestHostLink(Context context, final HostToDeviceInterface listener) {
Log.d(TAG, " +++ Begin of localSocketServer() +++ ");
@@ -127,7 +125,6 @@
*/
public PowerTestResult run() throws Exception {
mTestResult = new PowerTestResult();
- mStringBuilder = new StringBuilder();
// define buffer to receive data from host
final int BUFFER_SIZE = 4096;
byte[] buffer = new byte[BUFFER_SIZE];
@@ -213,11 +210,8 @@
}
}
mHostToDeviceExecutor.logText("Device disconnected.");
- if (mStringBuilder != null){
- mTestResult.testDetails = mStringBuilder.toString();
- }
Log.d(TAG, "Returning " + mTestResult.passedCount + "passed " + mTestResult.skippedCount + "skipped " +
- mTestResult.failedCount + "failed :" + mTestResult.testDetails);
+ mTestResult.failedCount + "failed.");
return mTestResult;
}
@@ -292,7 +286,7 @@
String response;
StringTokenizer tokenizer = new StringTokenizer(request, " ");
String testName = "";
- SensorTestResult result = SensorTestResult.FAIL;
+ SensorTestDetails.ResultCode resultCode = SensorTestDetails.ResultCode.FAIL;
String message = "";
try {
@@ -303,17 +297,17 @@
final String resultToken = tokenizer.nextToken();
if (resultToken.equals("PASS")) {
- result = SensorTestResult.PASS;
+ resultCode = SensorTestDetails.ResultCode.PASS;
++mTestResult.passedCount;
message = "PASSED: ";
response = RESPONSE_OK;
} else if (resultToken.equals("FAIL")) {
- result = SensorTestResult.FAIL;
+ resultCode = SensorTestDetails.ResultCode.FAIL;
++mTestResult.failedCount;
message = "FAILED: ";
response = RESPONSE_OK;
} else if (resultToken.equals("SKIPPED")) {
- result = SensorTestResult.SKIPPED;
+ resultCode = SensorTestDetails.ResultCode.SKIPPED;
++mTestResult.skippedCount;
message = "SKIPPED: ";
response = RESPONSE_OK;
@@ -329,8 +323,8 @@
response = RESPONSE_ERR;
}
String fullMessage = testName + " " + message;
- mStringBuilder.append(fullMessage + "\n");
- mHostToDeviceExecutor.logTestResult(testName, result, fullMessage );
+ mHostToDeviceExecutor.logTestResult(
+ new SensorTestDetails(testName, resultCode, fullMessage));
return response;
}
diff --git a/apps/CtsVerifier/src/com/android/cts/verifier/sensors/reporting/SensorTestDetails.java b/apps/CtsVerifier/src/com/android/cts/verifier/sensors/reporting/SensorTestDetails.java
new file mode 100644
index 0000000..9a9b1cb
--- /dev/null
+++ b/apps/CtsVerifier/src/com/android/cts/verifier/sensors/reporting/SensorTestDetails.java
@@ -0,0 +1,88 @@
+/*
+
+ * Copyright (C) 2014 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 com.android.cts.verifier.sensors.reporting;
+
+import com.android.cts.verifier.R;
+
+import org.junit.runner.Result;
+
+import android.content.Context;
+
+/**
+ * A class that holds the result of a Sensor test execution.
+ */
+public class SensorTestDetails {
+ private final String mName;
+ private final ResultCode mResultCode;
+ private final String mSummary;
+
+ public enum ResultCode {
+ SKIPPED,
+ PASS,
+ FAIL
+ }
+
+ public SensorTestDetails(String name, ResultCode resultCode, String summary) {
+ mName = name;
+ mResultCode = resultCode;
+ mSummary = summary;
+ }
+
+ public SensorTestDetails(
+ Context context,
+ String name,
+ int passCount,
+ int skipCount,
+ int failCount) {
+ ResultCode resultCode = ResultCode.PASS;
+ if (failCount > 0) {
+ resultCode = ResultCode.FAIL;
+ } else if (skipCount > 0) {
+ resultCode = ResultCode.SKIPPED;
+ }
+
+ mName = name;
+ mResultCode = resultCode;
+ mSummary = context.getString(R.string.snsr_test_summary, passCount, skipCount, failCount);
+ }
+
+ public SensorTestDetails(Context context, String name, Result result) {
+ this(context,
+ name,
+ result.getRunCount(),
+ result.getIgnoreCount(),
+ result.getFailureCount());
+ }
+
+ public String getName() {
+ return mName;
+ }
+
+ public ResultCode getResultCode() {
+ return mResultCode;
+ }
+
+ public String getSummary() {
+ return mSummary;
+ }
+
+ @Override
+ public String toString() {
+ return String.format("%s|%s|%s", mName, mResultCode.name(), mSummary);
+ }
+}
diff --git a/hostsidetests/theme/assets/21/hdpi.zip b/hostsidetests/theme/assets/21/hdpi.zip
index 2035d17..9cc179c 100644
--- a/hostsidetests/theme/assets/21/hdpi.zip
+++ b/hostsidetests/theme/assets/21/hdpi.zip
Binary files differ
diff --git a/hostsidetests/theme/assets/21/tvdpi.zip b/hostsidetests/theme/assets/21/tvdpi.zip
index eb6fd8c..fbe1781 100644
--- a/hostsidetests/theme/assets/21/tvdpi.zip
+++ b/hostsidetests/theme/assets/21/tvdpi.zip
Binary files differ
diff --git a/hostsidetests/theme/assets/21/xhdpi.zip b/hostsidetests/theme/assets/21/xhdpi.zip
index c4b4d0e..de6e2e1 100644
--- a/hostsidetests/theme/assets/21/xhdpi.zip
+++ b/hostsidetests/theme/assets/21/xhdpi.zip
Binary files differ
diff --git a/hostsidetests/theme/assets/21/xxhdpi.zip b/hostsidetests/theme/assets/21/xxhdpi.zip
index 62983df..9f0d778 100644
--- a/hostsidetests/theme/assets/21/xxhdpi.zip
+++ b/hostsidetests/theme/assets/21/xxhdpi.zip
Binary files differ
diff --git a/suite/cts/hostTests/uihost/src/com/android/cts/uihost/TaskSwitchingTest.java b/suite/cts/hostTests/uihost/src/com/android/cts/uihost/TaskSwitchingTest.java
index 0bfecdc..50a2047 100644
--- a/suite/cts/hostTests/uihost/src/com/android/cts/uihost/TaskSwitchingTest.java
+++ b/suite/cts/hostTests/uihost/src/com/android/cts/uihost/TaskSwitchingTest.java
@@ -47,7 +47,7 @@
*/
public class TaskSwitchingTest extends DeviceTestCase implements IBuildReceiver {
private static final String TAG = "TaskSwitchingTest";
- private final static String CTS_RUNNER = "android.test.InstrumentationCtsTestRunner";
+ private final static String RUNNER = "android.support.test.runner.AndroidJUnitRunner";
private CtsBuildHelper mBuild;
private ITestDevice mDevice;
private String mCtsReport = null;
@@ -92,7 +92,7 @@
public void testTaskswitching() throws Exception {
HostReportLog report =
new HostReportLog(mDevice.getSerialNumber(), ReportLog.getClassMethodNames());
- RemoteAndroidTestRunner testRunner = new RemoteAndroidTestRunner(PACKAGES[0], CTS_RUNNER,
+ RemoteAndroidTestRunner testRunner = new RemoteAndroidTestRunner(PACKAGES[0], RUNNER,
mDevice.getIDevice());
LocalListener listener = new LocalListener();
mDevice.runInstrumentationTests(testRunner, listener);
diff --git a/tests/Android.mk b/tests/Android.mk
index 3f5b753..f66946a 100644
--- a/tests/Android.mk
+++ b/tests/Android.mk
@@ -21,7 +21,6 @@
$(call all-renderscript-files-under, src)\
src/android/app/cts/ISecondary.aidl\
src/android/os/cts/IEmptyService.aidl\
- src/android/security/cts/activity/ISecureRandomService.aidl
LOCAL_JAVA_LIBRARIES := android.test.runner
diff --git a/tests/jni/Android.mk b/tests/jni/Android.mk
index 139118d..d9bc51b 100644
--- a/tests/jni/Android.mk
+++ b/tests/jni/Android.mk
@@ -26,7 +26,6 @@
android_os_cts_TaggedPointer.cpp \
android_os_cts_OSFeatures.cpp \
android_os_cts_FileUtils.cpp \
- android_net_cts_NetlinkSocket.cpp
LOCAL_C_INCLUDES := $(JNI_H_INCLUDE)
diff --git a/tests/jni/CtsJniOnLoad.cpp b/tests/jni/CtsJniOnLoad.cpp
index e0bb813..06be7c7 100644
--- a/tests/jni/CtsJniOnLoad.cpp
+++ b/tests/jni/CtsJniOnLoad.cpp
@@ -16,7 +16,6 @@
#include <jni.h>
#include <stdio.h>
-#include "android_net_cts_NetlinkSocket.h"
extern int register_android_os_cts_CpuFeatures(JNIEnv*);
@@ -49,9 +48,5 @@
return JNI_ERR;
}
- if (register_android_net_cts_NetlinkSocket(env)) {
- return JNI_ERR;
- }
-
return JNI_VERSION_1_4;
}
diff --git a/tests/jni/android_os_cts_FileUtils.cpp b/tests/jni/android_os_cts_FileUtils.cpp
index d78d26c..2b7e282 100644
--- a/tests/jni/android_os_cts_FileUtils.cpp
+++ b/tests/jni/android_os_cts_FileUtils.cpp
@@ -22,6 +22,7 @@
#include <sys/errno.h>
#include <sys/types.h>
#include <sys/stat.h>
+#include <assert.h>
static jclass gFileStatusClass;
static jfieldID gFileStatusDevFieldID;
@@ -122,8 +123,10 @@
int register_android_os_cts_FileUtils(JNIEnv* env)
{
jclass clazz = env->FindClass("android/os/cts/FileUtils");
+ assert(clazz != null);
gFileStatusClass = env->FindClass("android/os/cts/FileUtils$FileStatus");
+ assert(gFileStatusClass != null);
gFileStatusDevFieldID = env->GetFieldID(gFileStatusClass, "dev", "I");
gFileStatusInoFieldID = env->GetFieldID(gFileStatusClass, "ino", "I");
gFileStatusModeFieldID = env->GetFieldID(gFileStatusClass, "mode", "I");
diff --git a/tests/tests/accessibilityservice/AndroidManifest.xml b/tests/tests/accessibilityservice/AndroidManifest.xml
index 4039193..0d452ae 100644
--- a/tests/tests/accessibilityservice/AndroidManifest.xml
+++ b/tests/tests/accessibilityservice/AndroidManifest.xml
@@ -19,10 +19,12 @@
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.android.cts.accessibilityservice">
- <uses-sdk android:minSdkVersion="18"
- android:targetSdkVersion="18" />
+ <uses-sdk android:minSdkVersion="18"
+ android:targetSdkVersion="18" />
- <application android:theme="@android:style/Theme.Holo.NoActionBar" >
+ <uses-permission android:name="android.permission.DISABLE_KEYGUARD" />
+
+ <application android:theme="@android:style/Theme.Holo.NoActionBar" >
<uses-library android:name="android.test.runner"/>
diff --git a/tests/tests/hardware/Android.mk b/tests/tests/hardware/Android.mk
index 7a1b271..e77ac7b 100644
--- a/tests/tests/hardware/Android.mk
+++ b/tests/tests/hardware/Android.mk
@@ -23,7 +23,15 @@
LOCAL_SDK_VERSION := current
+# TODO: sensors need to be refactored out into their own namespace: android.hardware.sensors.cts
LOCAL_SRC_FILES := $(call all-java-files-under, src/android/hardware/cts/helpers)
+LOCAL_SRC_FILES += \
+ src/android/hardware/cts/SensorTestCase.java \
+ src/android/hardware/cts/SingleSensorTests.java \
+ src/android/hardware/cts/SensorIntegrationTests.java \
+ src/android/hardware/cts/SensorTest.java \
+
+LOCAL_STATIC_JAVA_LIBRARIES := ctsdeviceutil
include $(BUILD_STATIC_JAVA_LIBRARY)
diff --git a/tests/tests/hardware/src/android/hardware/camera2/cts/AllocationTest.java b/tests/tests/hardware/src/android/hardware/camera2/cts/AllocationTest.java
index fb23a5f..92a5e58 100644
--- a/tests/tests/hardware/src/android/hardware/camera2/cts/AllocationTest.java
+++ b/tests/tests/hardware/src/android/hardware/camera2/cts/AllocationTest.java
@@ -20,7 +20,7 @@
import static android.hardware.camera2.cts.helpers.Preconditions.*;
import static android.hardware.camera2.cts.helpers.AssertHelpers.*;
import static android.hardware.camera2.cts.CameraTestUtils.*;
-import static com.android.ex.camera2.blocking.BlockingStateListener.*;
+import static com.android.ex.camera2.blocking.BlockingStateCallback.*;
import android.content.Context;
import android.graphics.ImageFormat;
@@ -56,8 +56,8 @@
import android.view.Surface;
import com.android.ex.camera2.blocking.BlockingCameraManager.BlockingOpenException;
-import com.android.ex.camera2.blocking.BlockingStateListener;
-import com.android.ex.camera2.blocking.BlockingSessionListener;
+import com.android.ex.camera2.blocking.BlockingStateCallback;
+import com.android.ex.camera2.blocking.BlockingSessionCallback;
import java.util.ArrayList;
import java.util.Arrays;
@@ -78,8 +78,8 @@
private CameraManager mCameraManager;
private CameraDevice mCamera;
private CameraCaptureSession mSession;
- private BlockingStateListener mCameraListener;
- private BlockingSessionListener mSessionListener;
+ private BlockingStateCallback mCameraListener;
+ private BlockingSessionCallback mSessionListener;
private String[] mCameraIds;
@@ -107,7 +107,7 @@
mHandlerThread = new HandlerThread("AllocationTest");
mHandlerThread.start();
mHandler = new Handler(mHandlerThread.getLooper());
- mCameraListener = new BlockingStateListener();
+ mCameraListener = new BlockingStateCallback();
mCameraIterable = new CameraIterable();
mSizeIterable = new SizeIterable();
@@ -360,7 +360,7 @@
assertNotNull("Failed to get Surface", cameraTarget);
outputSurfaces.add(cameraTarget);
- mSessionListener = new BlockingSessionListener();
+ mSessionListener = new BlockingSessionCallback();
mCamera.createCaptureSession(outputSurfaces, mSessionListener, mHandler);
mSession = mSessionListener.waitAndGetSession(SESSION_CONFIGURE_TIMEOUT_MS);
CaptureRequest.Builder captureBuilder =
@@ -384,7 +384,7 @@
checkNotNull("request", request);
checkNotNull("graph", graph);
- mSession.capture(request, new CameraCaptureSession.CaptureListener() {
+ mSession.capture(request, new CameraCaptureSession.CaptureCallback() {
@Override
public void onCaptureCompleted(CameraCaptureSession session, CaptureRequest request,
TotalCaptureResult result) {
@@ -402,7 +402,7 @@
if (VERBOSE) Log.v(TAG, "Stopping capture and waiting for idle");
// Stop repeat, wait for captures to complete, and disconnect from surfaces
mSession.close();
- mSessionListener.getStateWaiter().waitForState(BlockingSessionListener.SESSION_CLOSED,
+ mSessionListener.getStateWaiter().waitForState(BlockingSessionCallback.SESSION_CLOSED,
SESSION_CLOSE_TIMEOUT_MS);
mSession = null;
mSessionListener = null;
@@ -824,7 +824,7 @@
// TODO: start capture, i.e. configureOutputs
- SimpleCaptureListener listener = new SimpleCaptureListener();
+ SimpleCaptureCallback listener = new SimpleCaptureCallback();
if (!repeating) {
for (int i = 0; i < count; ++i) {
@@ -835,7 +835,7 @@
}
// Assume that the device is already IDLE.
- mSessionListener.getStateWaiter().waitForState(BlockingSessionListener.SESSION_ACTIVE,
+ mSessionListener.getStateWaiter().waitForState(BlockingSessionCallback.SESSION_ACTIVE,
CAMERA_ACTIVE_TIMEOUT_MS);
for (int i = 0; i < count; ++i) {
@@ -851,7 +851,7 @@
if (repeating) {
mSession.stopRepeating();
mSessionListener.getStateWaiter().waitForState(
- BlockingSessionListener.SESSION_READY, CAMERA_IDLE_TIMEOUT_MS);
+ BlockingSessionCallback.SESSION_READY, CAMERA_IDLE_TIMEOUT_MS);
}
// TODO: Make a Configure decorator or some such for configureOutputs
diff --git a/tests/tests/hardware/src/android/hardware/camera2/cts/CameraDeviceTest.java b/tests/tests/hardware/src/android/hardware/camera2/cts/CameraDeviceTest.java
index 7ddae65..7f3c652 100644
--- a/tests/tests/hardware/src/android/hardware/camera2/cts/CameraDeviceTest.java
+++ b/tests/tests/hardware/src/android/hardware/camera2/cts/CameraDeviceTest.java
@@ -17,8 +17,8 @@
package android.hardware.camera2.cts;
import static android.hardware.camera2.cts.CameraTestUtils.*;
-import static com.android.ex.camera2.blocking.BlockingStateListener.*;
-import static com.android.ex.camera2.blocking.BlockingSessionListener.*;
+import static com.android.ex.camera2.blocking.BlockingStateCallback.*;
+import static com.android.ex.camera2.blocking.BlockingSessionCallback.*;
import static org.mockito.Mockito.*;
import static android.hardware.camera2.CaptureRequest.*;
@@ -40,8 +40,8 @@
import android.util.Range;
import android.view.Surface;
-import com.android.ex.camera2.blocking.BlockingSessionListener;
-import com.android.ex.camera2.blocking.BlockingStateListener;
+import com.android.ex.camera2.blocking.BlockingSessionCallback;
+import com.android.ex.camera2.blocking.BlockingStateCallback;
import com.android.ex.camera2.utils.StateWaiter;
import org.mockito.ArgumentMatcher;
@@ -65,9 +65,9 @@
private CameraCaptureSession mSession;
- private BlockingStateListener mCameraMockListener;
+ private BlockingStateCallback mCameraMockListener;
private int mLatestDeviceState = STATE_UNINITIALIZED;
- private BlockingSessionListener mSessionMockListener;
+ private BlockingSessionCallback mSessionMockListener;
private StateWaiter mSessionWaiter;
private int mLatestSessionState = -1; // uninitialized
@@ -95,7 +95,7 @@
* Use spy object here since we want to use the SimpleDeviceListener callback
* implementation (spy doesn't stub the functions unless we ask it to do so).
*/
- mCameraMockListener = spy(new BlockingStateListener());
+ mCameraMockListener = spy(new BlockingStateCallback());
}
@Override
@@ -405,7 +405,7 @@
// A cascade of Device->Session->Capture listeners, each of which invokes at least one
// method on the camera device or session.
- class ChainedCaptureListener extends CameraCaptureSession.CaptureListener {
+ class ChainedCaptureCallback extends CameraCaptureSession.CaptureCallback {
public void onCaptureCompleted(CameraCaptureSession session, CaptureRequest request,
TotalCaptureResult result) {
try {
@@ -444,8 +444,8 @@
}
}
- class ChainedSessionListener extends CameraCaptureSession.StateListener {
- private final ChainedCaptureListener mCaptureListener = new ChainedCaptureListener();
+ class ChainedSessionListener extends CameraCaptureSession.StateCallback {
+ private final ChainedCaptureCallback mCaptureCallback = new ChainedCaptureCallback();
public void onConfigured(CameraCaptureSession session) {
try {
@@ -456,7 +456,7 @@
session.getDevice();
session.abortCaptures();
// The important call for the next level of chaining
- session.capture(request.build(), mCaptureListener, mHandler);
+ session.capture(request.build(), mCaptureCallback, mHandler);
// Some more calls
session.setRepeatingRequest(request.build(),
/*listener*/ null, /*handler*/ null);
@@ -479,7 +479,7 @@
}
}
- class ChainedCameraListener extends CameraDevice.StateListener {
+ class ChainedCameraListener extends CameraDevice.StateCallback {
private final ChainedSessionListener mSessionListener = new ChainedSessionListener();
public CameraDevice cameraDevice;
@@ -760,19 +760,19 @@
CaptureRequest.Builder requestBuilder = mCamera.createCaptureRequest(template);
assertNotNull("Failed to create capture request", requestBuilder);
requestBuilder.addTarget(mReaderSurface);
- CameraCaptureSession.CaptureListener mockCaptureListener =
- mock(CameraCaptureSession.CaptureListener.class);
+ CameraCaptureSession.CaptureCallback mockCaptureCallback =
+ mock(CameraCaptureSession.CaptureCallback.class);
if (VERBOSE) {
Log.v(TAG, String.format("Capturing shot for device %s, template %d",
id, template));
}
- startCapture(requestBuilder.build(), repeating, mockCaptureListener, mHandler);
+ startCapture(requestBuilder.build(), repeating, mockCaptureCallback, mHandler);
waitForSessionState(SESSION_ACTIVE, SESSION_ACTIVE_TIMEOUT_MS);
int expectedCaptureResultCount = repeating ? REPEATING_CAPTURE_EXPECTED_RESULT_COUNT : 1;
- verifyCaptureResults(mockCaptureListener, expectedCaptureResultCount);
+ verifyCaptureResults(mockCaptureCallback, expectedCaptureResultCount);
if (repeating) {
if (abort) {
@@ -802,18 +802,18 @@
requestBuilder.addTarget(mReaderSurface);
requests.add(requestBuilder.build());
}
- CameraCaptureSession.CaptureListener mockCaptureListener =
- mock(CameraCaptureSession.CaptureListener.class);
+ CameraCaptureSession.CaptureCallback mockCaptureCallback =
+ mock(CameraCaptureSession.CaptureCallback.class);
if (VERBOSE) {
Log.v(TAG, String.format("Capturing burst shot for device %s", id));
}
if (!repeating) {
- mSession.captureBurst(requests, mockCaptureListener, mHandler);
+ mSession.captureBurst(requests, mockCaptureCallback, mHandler);
}
else {
- mSession.setRepeatingBurst(requests, mockCaptureListener, mHandler);
+ mSession.setRepeatingBurst(requests, mockCaptureCallback, mHandler);
}
waitForSessionState(SESSION_ACTIVE, SESSION_READY_TIMEOUT_MS);
@@ -822,7 +822,7 @@
expectedResultCount *= REPEATING_CAPTURE_EXPECTED_RESULT_COUNT;
}
- verifyCaptureResults(mockCaptureListener, expectedResultCount);
+ verifyCaptureResults(mockCaptureCallback, expectedResultCount);
if (repeating) {
if (abort) {
@@ -854,7 +854,7 @@
}
// Create a new session listener each time, it's not reusable across cameras
- mSessionMockListener = spy(new BlockingSessionListener());
+ mSessionMockListener = spy(new BlockingSessionCallback());
mSessionWaiter = mSessionMockListener.getStateWaiter();
List<Surface> outputSurfaces = new ArrayList<>(Arrays.asList(mReaderSurface));
@@ -876,7 +876,7 @@
}
private void verifyCaptureResults(
- CameraCaptureSession.CaptureListener mockListener,
+ CameraCaptureSession.CaptureCallback mockListener,
int expectResultCount) {
final int TIMEOUT_PER_RESULT_MS = 2000;
// Should receive expected number of capture results.
@@ -1304,11 +1304,11 @@
*
* @param request The {@link #CaptureRequest} to be captured.
* @param repeating If the capture is single capture or repeating.
- * @param listener The {@link #CaptureListener} camera device used to notify callbacks.
+ * @param listener The {@link #CaptureCallback} camera device used to notify callbacks.
* @param handler The handler camera device used to post callbacks.
*/
protected void startCapture(CaptureRequest request, boolean repeating,
- CameraCaptureSession.CaptureListener listener, Handler handler)
+ CameraCaptureSession.CaptureCallback listener, Handler handler)
throws CameraAccessException {
if (VERBOSE) Log.v(TAG, "Starting capture from session");
@@ -1321,7 +1321,7 @@
/**
* Close a {@link #CameraCaptureSession capture session}; blocking until
- * the close finishes with a transition to {@link CameraCaptureSession.StateListener#onClosed}.
+ * the close finishes with a transition to {@link CameraCaptureSession.StateCallback#onClosed}.
*/
protected void closeSession() {
if (mSession == null) {
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 a8c9896..192fb85 100644
--- a/tests/tests/hardware/src/android/hardware/camera2/cts/CameraManagerTest.java
+++ b/tests/tests/hardware/src/android/hardware/camera2/cts/CameraManagerTest.java
@@ -25,16 +25,16 @@
import android.hardware.camera2.CameraAccessException;
import android.hardware.camera2.CameraCharacteristics;
import android.hardware.camera2.CameraDevice;
-import android.hardware.camera2.CameraDevice.StateListener;
+import android.hardware.camera2.CameraDevice.StateCallback;
import android.hardware.camera2.CameraManager;
-import android.hardware.camera2.cts.CameraTestUtils.MockStateListener;
+import android.hardware.camera2.cts.CameraTestUtils.MockStateCallback;
import android.hardware.camera2.cts.helpers.CameraErrorCollector;
import android.os.Handler;
import android.os.HandlerThread;
import android.test.AndroidTestCase;
import android.util.Log;
-import com.android.ex.camera2.blocking.BlockingStateListener;
+import com.android.ex.camera2.blocking.BlockingStateCallback;
import org.mockito.ArgumentCaptor;
import org.mockito.InOrder;
@@ -56,7 +56,7 @@
private NoopCameraListener mListener;
private HandlerThread mHandlerThread;
private Handler mHandler;
- private BlockingStateListener mCameraListener;
+ private BlockingStateCallback mCameraListener;
private CameraErrorCollector mCollector;
@Override
@@ -81,7 +81,7 @@
*/
System.setProperty("dexmaker.dexcache", getContext().getCacheDir().toString());
- mCameraListener = spy(new BlockingStateListener());
+ mCameraListener = spy(new BlockingStateCallback());
mHandlerThread = new HandlerThread(TAG);
mHandlerThread.start();
@@ -205,13 +205,13 @@
for (int j = 0; j < NUM_CAMERA_REOPENS; j++) {
CameraDevice camera = null;
try {
- MockStateListener mockListener = MockStateListener.mock();
- mCameraListener = new BlockingStateListener(mockListener);
+ MockStateCallback mockListener = MockStateCallback.mock();
+ mCameraListener = new BlockingStateCallback(mockListener);
mCameraManager.openCamera(ids[i], mCameraListener, mHandler);
// Block until unConfigured
- mCameraListener.waitForState(BlockingStateListener.STATE_OPENED,
+ mCameraListener.waitForState(BlockingStateCallback.STATE_OPENED,
CameraTestUtils.CAMERA_IDLE_TIMEOUT_MS);
// Ensure state transitions are in right order:
@@ -241,19 +241,19 @@
}
List<CameraDevice> cameraList = new ArrayList<CameraDevice>();
- List<MockStateListener> listenerList = new ArrayList<MockStateListener>();
- List<BlockingStateListener> blockingListenerList = new ArrayList<BlockingStateListener>();
+ List<MockStateCallback> listenerList = new ArrayList<MockStateCallback>();
+ List<BlockingStateCallback> blockingListenerList = new ArrayList<BlockingStateCallback>();
try {
for (int i = 0; i < ids.length; i++) {
// Ignore state changes from other cameras
- MockStateListener mockListener = MockStateListener.mock();
- mCameraListener = new BlockingStateListener(mockListener);
+ MockStateCallback mockListener = MockStateCallback.mock();
+ mCameraListener = new BlockingStateCallback(mockListener);
/**
* Track whether or not we got a synchronous error from openCamera.
*
* A synchronous error must also be accompanied by an asynchronous
- * StateListener#onError callback.
+ * StateCallback#onError callback.
*/
boolean expectingError = false;
@@ -271,16 +271,16 @@
}
List<Integer> expectedStates = new ArrayList<Integer>();
- expectedStates.add(BlockingStateListener.STATE_OPENED);
- expectedStates.add(BlockingStateListener.STATE_ERROR);
+ expectedStates.add(BlockingStateCallback.STATE_OPENED);
+ expectedStates.add(BlockingStateCallback.STATE_ERROR);
int state = mCameraListener.waitForAnyOfStates(
expectedStates, CameraTestUtils.CAMERA_IDLE_TIMEOUT_MS);
// It's possible that we got an asynchronous error transition only. This is ok.
if (expectingError) {
assertEquals("Throwing a CAMERA_ERROR exception must be accompanied with a " +
- "StateListener#onError callback",
- BlockingStateListener.STATE_ERROR, state);
+ "StateCallback#onError callback",
+ BlockingStateCallback.STATE_ERROR, state);
}
/**
@@ -297,7 +297,7 @@
*/
CameraDevice camera;
- if (state == BlockingStateListener.STATE_ERROR) {
+ if (state == BlockingStateCallback.STATE_ERROR) {
// Camera did not open because too many other cameras were opened
// => onError called exactly once with a non-null camera
assertTrue("At least one camera must be opened successfully",
@@ -309,13 +309,13 @@
verify(mockListener)
.onError(
argument.capture(),
- eq(CameraDevice.StateListener.ERROR_MAX_CAMERAS_IN_USE));
+ eq(CameraDevice.StateCallback.ERROR_MAX_CAMERAS_IN_USE));
verifyNoMoreInteractions(mockListener);
camera = argument.getValue();
assertNotNull("Expected a non-null camera for the error transition for ID: "
+ ids[i], camera);
- } else if (state == BlockingStateListener.STATE_OPENED) {
+ } else if (state == BlockingStateCallback.STATE_OPENED) {
// Camera opened successfully.
// => onOpened called exactly once
camera = verifyCameraStateOpened(cameraId,
@@ -334,9 +334,9 @@
for (CameraDevice camera : cameraList) {
camera.close();
}
- for (BlockingStateListener blockingListener : blockingListenerList) {
+ for (BlockingStateCallback blockingListener : blockingListenerList) {
blockingListener.waitForState(
- BlockingStateListener.STATE_CLOSED,
+ BlockingStateCallback.STATE_CLOSED,
CameraTestUtils.CAMERA_IDLE_TIMEOUT_MS);
}
}
@@ -346,7 +346,7 @@
* after closing the cameras.
*/
int i = 0;
- for (MockStateListener listener : listenerList) {
+ for (MockStateCallback listener : listenerList) {
CameraDevice camera = cameraList.get(i);
verify(listener).onClosed(eq(camera));
@@ -373,7 +373,7 @@
* @return The camera device (non-{@code null}).
*/
private static CameraDevice verifyCameraStateOpened(String cameraId,
- MockStateListener listener) {
+ MockStateCallback listener) {
ArgumentCaptor<CameraDevice> argument =
ArgumentCaptor.forClass(CameraDevice.class);
InOrder inOrder = inOrder(listener);
@@ -411,13 +411,13 @@
mCollector.setCameraId(ids[i]);
try {
- MockStateListener mockSuccessListener = MockStateListener.mock();
- MockStateListener mockFailListener = MockStateListener.mock();
+ MockStateCallback mockSuccessListener = MockStateCallback.mock();
+ MockStateCallback mockFailListener = MockStateCallback.mock();
- BlockingStateListener successListener =
- new BlockingStateListener(mockSuccessListener);
- BlockingStateListener failListener =
- new BlockingStateListener(mockFailListener);
+ BlockingStateCallback successListener =
+ new BlockingStateCallback(mockSuccessListener);
+ BlockingStateCallback failListener =
+ new BlockingStateCallback(mockFailListener);
mCameraManager.openCamera(ids[i], successListener, mHandler);
@@ -434,7 +434,7 @@
CameraAccessException.CAMERA_ERROR, e.getReason());
}
- successListener.waitForState(BlockingStateListener.STATE_OPENED,
+ successListener.waitForState(BlockingStateCallback.STATE_OPENED,
CameraTestUtils.CAMERA_IDLE_TIMEOUT_MS);
// Have to get the successCamera here, otherwise, it won't be
// closed if STATE_ERROR timeout exception occurs.
@@ -442,7 +442,7 @@
ArgumentCaptor.forClass(CameraDevice.class);
verify(mockSuccessListener, atLeastOnce()).onOpened(argument.capture());
- failListener.waitForState(BlockingStateListener.STATE_ERROR,
+ failListener.waitForState(BlockingStateCallback.STATE_ERROR,
CameraTestUtils.CAMERA_IDLE_TIMEOUT_MS);
successCamera = verifyCameraStateOpened(
@@ -451,7 +451,7 @@
verify(mockFailListener)
.onError(
and(notNull(CameraDevice.class), not(eq(successCamera))),
- eq(StateListener.ERROR_CAMERA_IN_USE));
+ eq(StateCallback.ERROR_CAMERA_IN_USE));
verifyNoMoreInteractions(mockFailListener);
} finally {
if (successCamera != null) {
@@ -461,7 +461,7 @@
}
}
- private class NoopCameraListener extends CameraManager.AvailabilityListener {
+ private class NoopCameraListener extends CameraManager.AvailabilityCallback {
@Override
public void onCameraAvailable(String cameraId) {
// No-op
@@ -480,11 +480,11 @@
* a listener that isn't registered should have no effect.
*/
public void testCameraManagerListener() throws Exception {
- mCameraManager.removeAvailabilityListener(mListener);
- mCameraManager.addAvailabilityListener(mListener, mHandler);
- mCameraManager.addAvailabilityListener(mListener, mHandler);
- mCameraManager.removeAvailabilityListener(mListener);
- mCameraManager.removeAvailabilityListener(mListener);
+ mCameraManager.unregisterAvailabilityCallback(mListener);
+ mCameraManager.registerAvailabilityCallback(mListener, mHandler);
+ mCameraManager.registerAvailabilityCallback(mListener, mHandler);
+ mCameraManager.unregisterAvailabilityCallback(mListener);
+ mCameraManager.unregisterAvailabilityCallback(mListener);
// TODO: test the listener callbacks
}
diff --git a/tests/tests/hardware/src/android/hardware/camera2/cts/CameraTestUtils.java b/tests/tests/hardware/src/android/hardware/camera2/cts/CameraTestUtils.java
index 1f4fc49..f6fc86f 100644
--- a/tests/tests/hardware/src/android/hardware/camera2/cts/CameraTestUtils.java
+++ b/tests/tests/hardware/src/android/hardware/camera2/cts/CameraTestUtils.java
@@ -16,7 +16,7 @@
package android.hardware.camera2.cts;
-import static com.android.ex.camera2.blocking.BlockingStateListener.*;
+import static com.android.ex.camera2.blocking.BlockingStateCallback.*;
import android.graphics.BitmapFactory;
import android.graphics.ImageFormat;
@@ -31,6 +31,7 @@
import android.hardware.camera2.CaptureRequest;
import android.hardware.camera2.CaptureResult;
import android.hardware.camera2.TotalCaptureResult;
+import android.hardware.cts.helpers.CameraUtils;
import android.util.Size;
import android.hardware.camera2.params.MeteringRectangle;
import android.hardware.camera2.params.StreamConfigurationMap;
@@ -43,8 +44,8 @@
import com.android.ex.camera2.blocking.BlockingCameraManager;
import com.android.ex.camera2.blocking.BlockingCameraManager.BlockingOpenException;
-import com.android.ex.camera2.blocking.BlockingSessionListener;
-import com.android.ex.camera2.blocking.BlockingStateListener;
+import com.android.ex.camera2.blocking.BlockingSessionCallback;
+import com.android.ex.camera2.blocking.BlockingStateCallback;
import com.android.ex.camera2.exceptions.TimeoutRuntimeException;
import junit.framework.Assert;
@@ -195,7 +196,7 @@
}
}
- public static class SimpleCaptureListener extends CameraCaptureSession.CaptureListener {
+ public static class SimpleCaptureCallback extends CameraCaptureSession.CaptureCallback {
private final LinkedBlockingQueue<CaptureResult> mQueue =
new LinkedBlockingQueue<CaptureResult>();
@@ -292,7 +293,7 @@
* If opening times out. Typically unrecoverable.
*/
public static CameraDevice openCamera(CameraManager manager, String cameraId,
- CameraDevice.StateListener listener, Handler handler) throws CameraAccessException,
+ CameraDevice.StateCallback listener, Handler handler) throws CameraAccessException,
BlockingOpenException {
/**
@@ -338,9 +339,9 @@
*/
public static CameraCaptureSession configureCameraSession(CameraDevice camera,
List<Surface> outputSurfaces,
- CameraCaptureSession.StateListener listener, Handler handler)
+ CameraCaptureSession.StateCallback listener, Handler handler)
throws CameraAccessException {
- BlockingSessionListener sessionListener = new BlockingSessionListener(listener);
+ BlockingSessionCallback sessionListener = new BlockingSessionCallback(listener);
camera.createCaptureSession(outputSurfaces, sessionListener, handler);
return sessionListener.waitAndGetSession(SESSION_CONFIGURE_TIMEOUT_MS);
@@ -522,13 +523,8 @@
public static class SizeComparator implements Comparator<Size> {
@Override
public int compare(Size lhs, Size rhs) {
- long left = lhs.getWidth() * lhs.getHeight();
- long right = rhs.getWidth() * rhs.getHeight();
- if (left == right) {
- left = lhs.getWidth();
- right = rhs.getWidth();
- }
- return (left < right) ? -1 : (left > right ? 1 : 0);
+ return CameraUtils
+ .compareSizes(lhs.getWidth(), lhs.getHeight(), rhs.getWidth(), rhs.getHeight());
}
}
@@ -781,19 +777,19 @@
}
/**
- * Provide a mock for {@link CameraDevice.StateListener}.
+ * Provide a mock for {@link CameraDevice.StateCallback}.
*
- * <p>Only useful because mockito can't mock {@link CameraDevice.StateListener} which is an
+ * <p>Only useful because mockito can't mock {@link CameraDevice.StateCallback} which is an
* abstract class.</p>
*
* <p>
* Use this instead of other classes when needing to verify interactions, since
- * trying to spy on {@link BlockingStateListener} (or others) will cause unnecessary extra
+ * trying to spy on {@link BlockingStateCallback} (or others) will cause unnecessary extra
* interactions which will cause false test failures.
* </p>
*
*/
- public static class MockStateListener extends CameraDevice.StateListener {
+ public static class MockStateCallback extends CameraDevice.StateCallback {
@Override
public void onOpened(CameraDevice camera) {
@@ -807,13 +803,13 @@
public void onError(CameraDevice camera, int error) {
}
- private MockStateListener() {}
+ private MockStateCallback() {}
/**
- * Create a Mockito-ready mocked StateListener.
+ * Create a Mockito-ready mocked StateCallback.
*/
- public static MockStateListener mock() {
- return Mockito.spy(new MockStateListener());
+ public static MockStateCallback mock() {
+ return Mockito.spy(new MockStateCallback());
}
}
diff --git a/tests/tests/hardware/src/android/hardware/camera2/cts/CaptureRequestTest.java b/tests/tests/hardware/src/android/hardware/camera2/cts/CaptureRequestTest.java
index fd4f338..3d55c85 100644
--- a/tests/tests/hardware/src/android/hardware/camera2/cts/CaptureRequestTest.java
+++ b/tests/tests/hardware/src/android/hardware/camera2/cts/CaptureRequestTest.java
@@ -27,7 +27,7 @@
import android.hardware.camera2.CameraMetadata;
import android.hardware.camera2.CaptureRequest;
import android.hardware.camera2.CaptureResult;
-import android.hardware.camera2.cts.CameraTestUtils.SimpleCaptureListener;
+import android.hardware.camera2.cts.CameraTestUtils.SimpleCaptureCallback;
import android.hardware.camera2.cts.testcases.Camera2SurfaceViewTestCase;
import android.hardware.camera2.params.ColorSpaceTransform;
import android.hardware.camera2.params.Face;
@@ -138,7 +138,7 @@
continue;
}
- SimpleCaptureListener listener = new SimpleCaptureListener();
+ SimpleCaptureCallback listener = new SimpleCaptureCallback();
CaptureRequest.Builder requestBuilder =
mCamera.createCaptureRequest(CameraDevice.TEMPLATE_PREVIEW);
@@ -156,7 +156,7 @@
// Double the exposure time and gain, with black level still being locked.
changeExposure(requestBuilder, DEFAULT_EXP_TIME_NS * 2, DEFAULT_SENSITIVITY * 2);
- listener = new SimpleCaptureListener();
+ listener = new SimpleCaptureCallback();
startPreview(requestBuilder, previewSz, listener);
waitForSettingsApplied(listener, NUM_FRAMES_WAITED_FOR_UNKNOWN_LATENCY);
// Allow at most one lock OFF state as the exposure is changed once.
@@ -191,7 +191,7 @@
continue;
}
- SimpleCaptureListener listener = new SimpleCaptureListener();
+ SimpleCaptureCallback listener = new SimpleCaptureCallback();
CaptureRequest.Builder requestBuilder =
mCamera.createCaptureRequest(CameraDevice.TEMPLATE_PREVIEW);
@@ -204,7 +204,7 @@
Size previewSz =
getMaxPreviewSize(mCamera.getId(), mCameraManager, PREVIEW_SIZE_BOUND);
- listener = new SimpleCaptureListener();
+ listener = new SimpleCaptureCallback();
startPreview(requestBuilder, previewSz, listener);
waitForSettingsApplied(listener, NUM_FRAMES_WAITED_FOR_UNKNOWN_LATENCY);
verifyShadingMap(listener, NUM_FRAMES_VERIFIED, SHADING_MODE_OFF);
@@ -213,7 +213,7 @@
// should output valid maps.
requestBuilder.set(CaptureRequest.SHADING_MODE, SHADING_MODE_FAST);
- listener = new SimpleCaptureListener();
+ listener = new SimpleCaptureCallback();
startPreview(requestBuilder, previewSz, listener);
waitForSettingsApplied(listener, NUM_FRAMES_WAITED_FOR_UNKNOWN_LATENCY);
// Allow at most one lock OFF state as the exposure is changed once.
@@ -223,7 +223,7 @@
// should output valid maps.
requestBuilder.set(CaptureRequest.SHADING_MODE, SHADING_MODE_HIGH_QUALITY);
- listener = new SimpleCaptureListener();
+ listener = new SimpleCaptureCallback();
startPreview(requestBuilder, previewSz, listener);
waitForSettingsApplied(listener, NUM_FRAMES_WAITED_FOR_UNKNOWN_LATENCY);
verifyShadingMap(listener, NUM_FRAMES_VERIFIED, SHADING_MODE_HIGH_QUALITY);
@@ -309,7 +309,7 @@
try {
openDevice(mCameraIds[i]);
- SimpleCaptureListener listener = new SimpleCaptureListener();
+ SimpleCaptureCallback listener = new SimpleCaptureCallback();
CaptureRequest.Builder requestBuilder =
mCamera.createCaptureRequest(CameraDevice.TEMPLATE_PREVIEW);
@@ -555,12 +555,12 @@
CaptureRequest.Builder requestBuilder =
mCamera.createCaptureRequest(CameraDevice.TEMPLATE_PREVIEW);
int[] availableModes = mStaticInfo.getAvailableNoiseReductionModesChecked();
- SimpleCaptureListener resultListener = new SimpleCaptureListener();
+ SimpleCaptureCallback resultListener = new SimpleCaptureCallback();
startPreview(requestBuilder, maxPrevSize, resultListener);
for (int mode : availableModes) {
requestBuilder.set(CaptureRequest.NOISE_REDUCTION_MODE, mode);
- resultListener = new SimpleCaptureListener();
+ resultListener = new SimpleCaptureCallback();
mSession.setRepeatingRequest(requestBuilder.build(), resultListener, mHandler);
waitForSettingsApplied(resultListener, NUM_FRAMES_WAITED_FOR_UNKNOWN_LATENCY);
@@ -583,7 +583,7 @@
CaptureRequest.Builder requestBuilder =
mCamera.createCaptureRequest(CameraDevice.TEMPLATE_PREVIEW);
requestBuilder.set(CaptureRequest.CONTROL_AF_MODE, CaptureRequest.CONTROL_AF_MODE_OFF);
- SimpleCaptureListener resultListener = new SimpleCaptureListener();
+ SimpleCaptureCallback resultListener = new SimpleCaptureCallback();
startPreview(requestBuilder, maxPrevSize, resultListener);
CaptureRequest request;
@@ -591,7 +591,7 @@
for (int i = 0; i < testDistances.length; i++) {
requestBuilder.set(CaptureRequest.LENS_FOCUS_DISTANCE, testDistances[i]);
request = requestBuilder.build();
- resultListener = new SimpleCaptureListener();
+ resultListener = new SimpleCaptureCallback();
mSession.setRepeatingRequest(request, resultListener, mHandler);
waitForSettingsApplied(resultListener, NUM_FRAMES_WAITED_FOR_UNKNOWN_LATENCY);
resultDistances[i] = verifyFocusDistanceControl(testDistances[i], request,
@@ -614,7 +614,7 @@
if (hyperFocalDistance > 0) {
requestBuilder.set(CaptureRequest.LENS_FOCUS_DISTANCE, hyperFocalDistance);
request = requestBuilder.build();
- resultListener = new SimpleCaptureListener();
+ resultListener = new SimpleCaptureCallback();
mSession.setRepeatingRequest(request, resultListener, mHandler);
waitForSettingsApplied(resultListener, NUM_FRAMES_WAITED_FOR_UNKNOWN_LATENCY);
@@ -651,7 +651,7 @@
* @return the result focus distance
*/
private float verifyFocusDistanceControl(float distance, CaptureRequest request,
- SimpleCaptureListener resultListener) {
+ SimpleCaptureCallback resultListener) {
// Need make sure the result corresponding to the request is back, then check.
CaptureResult result =
resultListener.getCaptureResultForRequest(request, NUM_RESULTS_WAIT_TIMEOUT);
@@ -682,12 +682,12 @@
int[] edgeModes = mStaticInfo.getAvailableEdgeModesChecked();
CaptureRequest.Builder requestBuilder =
mCamera.createCaptureRequest(CameraDevice.TEMPLATE_PREVIEW);
- SimpleCaptureListener resultListener = new SimpleCaptureListener();
+ SimpleCaptureCallback resultListener = new SimpleCaptureCallback();
startPreview(requestBuilder, maxPrevSize, resultListener);
for (int mode : edgeModes) {
requestBuilder.set(CaptureRequest.EDGE_MODE, mode);
- resultListener = new SimpleCaptureListener();
+ resultListener = new SimpleCaptureCallback();
mSession.setRepeatingRequest(requestBuilder.build(), resultListener, mHandler);
waitForSettingsApplied(resultListener, NUM_FRAMES_WAITED_FOR_UNKNOWN_LATENCY);
@@ -717,7 +717,7 @@
updatePreviewSurface(maxPreviewSz);
CaptureRequest.Builder manualRequestBuilder = createRequestForPreview();
CaptureRequest.Builder previewRequestBuilder = createRequestForPreview();
- SimpleCaptureListener listener = new SimpleCaptureListener();
+ SimpleCaptureCallback listener = new SimpleCaptureCallback();
startPreview(previewRequestBuilder, maxPreviewSz, listener);
@@ -814,7 +814,7 @@
* @param listener The Capture listener that is used to wait for capture result
* @param aeMode The AE mode for flash to test with
*/
- private void flashTestByAeMode(SimpleCaptureListener listener, int aeMode) throws Exception {
+ private void flashTestByAeMode(SimpleCaptureCallback listener, int aeMode) throws Exception {
CaptureResult result;
final int NUM_FLASH_REQUESTS_TESTED = 10;
CaptureRequest.Builder requestBuilder = createRequestForPreview();
@@ -892,7 +892,7 @@
result.get(CaptureResult.FLASH_MODE));
}
- private void verifyAntiBandingMode(SimpleCaptureListener listener, int numFramesVerified,
+ private void verifyAntiBandingMode(SimpleCaptureCallback listener, int numFramesVerified,
int mode, boolean isAeManual, long requestExpTime) throws Exception {
// Skip the first a couple of frames as antibanding may not be fully up yet.
final int NUM_FRAMES_SKIPPED = 5;
@@ -959,7 +959,7 @@
requestBuilder.set(CaptureRequest.CONTROL_AE_ANTIBANDING_MODE, mode);
// Test auto AE mode anti-banding behavior
- SimpleCaptureListener resultListener = new SimpleCaptureListener();
+ SimpleCaptureCallback resultListener = new SimpleCaptureCallback();
startPreview(requestBuilder, size, resultListener);
waitForSettingsApplied(resultListener, NUM_FRAMES_WAITED_FOR_UNKNOWN_LATENCY);
verifyAntiBandingMode(resultListener, NUM_FRAMES_VERIFIED, mode, /*isAeManual*/false,
@@ -970,7 +970,7 @@
final long TEST_MANUAL_EXP_TIME_NS = 65000000L;
long manualExpTime = mStaticInfo.getExposureClampToRange(TEST_MANUAL_EXP_TIME_NS);
changeExposure(requestBuilder, manualExpTime);
- resultListener = new SimpleCaptureListener();
+ resultListener = new SimpleCaptureCallback();
startPreview(requestBuilder, size, resultListener);
waitForSettingsApplied(resultListener, NUM_FRAMES_WAITED_FOR_UNKNOWN_LATENCY);
verifyAntiBandingMode(resultListener, NUM_FRAMES_VERIFIED, mode, /*isAeManual*/true,
@@ -1053,7 +1053,7 @@
}
final int NUM_CAPTURES_BEFORE_LOCK = 2;
- SimpleCaptureListener listener = new SimpleCaptureListener();
+ SimpleCaptureCallback listener = new SimpleCaptureCallback();
CaptureResult[] resultsDuringLock = new CaptureResult[numCapturesDuringLock];
@@ -1119,7 +1119,7 @@
requestBuilder.set(CaptureRequest.CONTROL_AE_MODE, CONTROL_AE_MODE_OFF);
configurePreviewOutput(requestBuilder);
- SimpleCaptureListener listener = new SimpleCaptureListener();
+ SimpleCaptureCallback listener = new SimpleCaptureCallback();
long[] expTimes = getExposureTimeTestValues();
int[] sensitivities = getSensitivityTestValues();
@@ -1151,7 +1151,7 @@
/**
* Verify black level lock control.
*/
- private void verifyBlackLevelLockResults(SimpleCaptureListener listener, int numFramesVerified,
+ private void verifyBlackLevelLockResults(SimpleCaptureCallback listener, int numFramesVerified,
int maxLockOffCnt) throws Exception {
int noLockCnt = 0;
for (int i = 0; i < numFramesVerified; i++) {
@@ -1175,7 +1175,7 @@
/**
* Verify shading map for different shading modes.
*/
- private void verifyShadingMap(SimpleCaptureListener listener, int numFramesVerified,
+ private void verifyShadingMap(SimpleCaptureCallback listener, int numFramesVerified,
int shadingMode) throws Exception {
for (int i = 0; i < numFramesVerified; i++) {
@@ -1225,7 +1225,7 @@
private void faceDetectionTestByCamera() throws Exception {
int[] faceDetectModes = mStaticInfo.getAvailableFaceDetectModesChecked();
- SimpleCaptureListener listener;
+ SimpleCaptureCallback listener;
CaptureRequest.Builder requestBuilder =
mCamera.createCaptureRequest(CameraDevice.TEMPLATE_PREVIEW);
@@ -1238,7 +1238,7 @@
// Create a new listener for each run to avoid the results from one run spill
// into another run.
- listener = new SimpleCaptureListener();
+ listener = new SimpleCaptureCallback();
startPreview(requestBuilder, maxPreviewSz, listener);
waitForSettingsApplied(listener, NUM_FRAMES_WAITED_FOR_UNKNOWN_LATENCY);
verifyFaceDetectionResults(listener, NUM_FACE_DETECTION_FRAMES_VERIFIED, mode);
@@ -1254,7 +1254,7 @@
* @param numFramesVerified Number of results to be verified
* @param faceDetectionMode Face detection mode to be verified against
*/
- private void verifyFaceDetectionResults(SimpleCaptureListener listener, int numFramesVerified,
+ private void verifyFaceDetectionResults(SimpleCaptureCallback listener, int numFramesVerified,
int faceDetectionMode) {
for (int i = 0; i < numFramesVerified; i++) {
CaptureResult result = listener.getCaptureResult(WAIT_FOR_RESULT_TIMEOUT_MS);
@@ -1337,7 +1337,7 @@
return;
}
- SimpleCaptureListener listener;
+ SimpleCaptureCallback listener;
CaptureRequest.Builder requestBuilder =
mCamera.createCaptureRequest(CameraDevice.TEMPLATE_PREVIEW);
@@ -1356,7 +1356,7 @@
requestBuilder.set(CaptureRequest.TONEMAP_CURVE, tcLinear);
// Create a new listener for each run to avoid the results from one run spill
// into another run.
- listener = new SimpleCaptureListener();
+ listener = new SimpleCaptureCallback();
startPreview(requestBuilder, maxPreviewSz, listener);
waitForSettingsApplied(listener, NUM_FRAMES_WAITED_FOR_UNKNOWN_LATENCY);
verifyToneMapModeResults(listener, NUM_FRAMES_VERIFIED, mode,
@@ -1367,7 +1367,7 @@
requestBuilder.set(CaptureRequest.TONEMAP_CURVE, tcSrgb);
// Create a new listener for each run to avoid the results from one run spill
// into another run.
- listener = new SimpleCaptureListener();
+ listener = new SimpleCaptureCallback();
startPreview(requestBuilder, maxPreviewSz, listener);
waitForSettingsApplied(listener, NUM_FRAMES_WAITED_FOR_UNKNOWN_LATENCY);
verifyToneMapModeResults(listener, NUM_FRAMES_VERIFIED, mode,
@@ -1375,7 +1375,7 @@
} else {
// Create a new listener for each run to avoid the results from one run spill
// into another run.
- listener = new SimpleCaptureListener();
+ listener = new SimpleCaptureCallback();
startPreview(requestBuilder, maxPreviewSz, listener);
waitForSettingsApplied(listener, NUM_FRAMES_WAITED_FOR_UNKNOWN_LATENCY);
verifyToneMapModeResults(listener, NUM_FRAMES_VERIFIED, mode,
@@ -1398,7 +1398,7 @@
* @param inputToneCurve Tonemap curve used by all 3 channels, ignored when
* map mode is not CONTRAST_CURVE.
*/
- private void verifyToneMapModeResults(SimpleCaptureListener listener, int numFramesVerified,
+ private void verifyToneMapModeResults(SimpleCaptureCallback listener, int numFramesVerified,
int tonemapMode, float[] inputToneCurve) {
final int MIN_TONEMAP_CURVE_POINTS = 2;
final Float ZERO = new Float(0);
@@ -1459,9 +1459,9 @@
startPreview(requestBuilder, maxPreviewSize, /*listener*/null);
for (int mode : awbModes) {
- SimpleCaptureListener listener;
+ SimpleCaptureCallback listener;
requestBuilder.set(CaptureRequest.CONTROL_AWB_MODE, mode);
- listener = new SimpleCaptureListener();
+ listener = new SimpleCaptureCallback();
mSession.setRepeatingRequest(requestBuilder.build(), listener, mHandler);
waitForSettingsApplied(listener, NUM_FRAMES_WAITED_FOR_UNKNOWN_LATENCY);
@@ -1471,7 +1471,7 @@
// Verify color correction transform and gains stay unchanged after a lock.
requestBuilder.set(CaptureRequest.CONTROL_AWB_LOCK, true);
- listener = new SimpleCaptureListener();
+ listener = new SimpleCaptureCallback();
mSession.setRepeatingRequest(requestBuilder.build(), listener, mHandler);
waitForSettingsApplied(listener, NUM_FRAMES_WAITED_FOR_UNKNOWN_LATENCY);
@@ -1484,7 +1484,7 @@
}
}
- private void verifyAwbCaptureResultUnchanged(SimpleCaptureListener listener,
+ private void verifyAwbCaptureResultUnchanged(SimpleCaptureCallback listener,
int numFramesVerified) {
// Skip check if cc gains/transform/mode are not available
if (!mStaticInfo.areKeysAvailable(
@@ -1532,9 +1532,9 @@
startPreview(requestBuilder, maxPreviewSize, /*listener*/null);
for (int mode : afModes) {
- SimpleCaptureListener listener;
+ SimpleCaptureCallback listener;
requestBuilder.set(CaptureRequest.CONTROL_AF_MODE, mode);
- listener = new SimpleCaptureListener();
+ listener = new SimpleCaptureCallback();
mSession.setRepeatingRequest(requestBuilder.build(), listener, mHandler);
waitForSettingsApplied(listener, NUM_FRAMES_WAITED_FOR_UNKNOWN_LATENCY);
@@ -1571,11 +1571,11 @@
Size maxPreviewSize = mOrderedPreviewSizes.get(0);
CaptureRequest.Builder requestBuilder =
mCamera.createCaptureRequest(CameraDevice.TEMPLATE_PREVIEW);
- SimpleCaptureListener listener = new SimpleCaptureListener();
+ SimpleCaptureCallback listener = new SimpleCaptureCallback();
startPreview(requestBuilder, maxPreviewSize, listener);
for (int mode : videoStabModes) {
- listener = new SimpleCaptureListener();
+ listener = new SimpleCaptureCallback();
requestBuilder.set(CaptureRequest.CONTROL_VIDEO_STABILIZATION_MODE, mode);
mSession.setRepeatingRequest(requestBuilder.build(), listener, mHandler);
waitForSettingsApplied(listener, NUM_FRAMES_WAITED_FOR_UNKNOWN_LATENCY);
@@ -1584,7 +1584,7 @@
}
for (int mode : opticalStabModes) {
- listener = new SimpleCaptureListener();
+ listener = new SimpleCaptureCallback();
requestBuilder.set(CaptureRequest.LENS_OPTICAL_STABILIZATION_MODE, mode);
mSession.setRepeatingRequest(requestBuilder.build(), listener, mHandler);
waitForSettingsApplied(listener, NUM_FRAMES_WAITED_FOR_UNKNOWN_LATENCY);
@@ -1630,7 +1630,7 @@
MeteringRectangle[][] expectRegions = new MeteringRectangle[ZOOM_STEPS][];
CaptureRequest.Builder requestBuilder =
mCamera.createCaptureRequest(CameraDevice.TEMPLATE_PREVIEW);
- SimpleCaptureListener listener = new SimpleCaptureListener();
+ SimpleCaptureCallback listener = new SimpleCaptureCallback();
updatePreviewSurface(previewSize);
configurePreviewOutput(requestBuilder);
@@ -1793,13 +1793,13 @@
Size maxPreviewSize = mOrderedPreviewSizes.get(0);
CaptureRequest.Builder requestBuilder =
mCamera.createCaptureRequest(CameraDevice.TEMPLATE_PREVIEW);
- SimpleCaptureListener listener = new SimpleCaptureListener();
+ SimpleCaptureCallback listener = new SimpleCaptureCallback();
requestBuilder.set(CaptureRequest.CONTROL_MODE, CaptureRequest.CONTROL_MODE_USE_SCENE_MODE);
startPreview(requestBuilder, maxPreviewSize, listener);
for(int mode : sceneModes) {
requestBuilder.set(CaptureRequest.CONTROL_SCENE_MODE, mode);
- listener = new SimpleCaptureListener();
+ listener = new SimpleCaptureCallback();
mSession.setRepeatingRequest(requestBuilder.build(), listener, mHandler);
waitForSettingsApplied(listener, NUM_FRAMES_WAITED_FOR_UNKNOWN_LATENCY);
@@ -1817,12 +1817,12 @@
CaptureRequest.Builder requestBuilder =
mCamera.createCaptureRequest(CameraDevice.TEMPLATE_PREVIEW);
requestBuilder.set(CaptureRequest.CONTROL_MODE, CaptureRequest.CONTROL_MODE_AUTO);
- SimpleCaptureListener listener = new SimpleCaptureListener();
+ SimpleCaptureCallback listener = new SimpleCaptureCallback();
startPreview(requestBuilder, maxPreviewSize, listener);
for(int mode : effectModes) {
requestBuilder.set(CaptureRequest.CONTROL_EFFECT_MODE, mode);
- listener = new SimpleCaptureListener();
+ listener = new SimpleCaptureCallback();
mSession.setRepeatingRequest(requestBuilder.build(), listener, mHandler);
waitForSettingsApplied(listener, NUM_FRAMES_WAITED_FOR_UNKNOWN_LATENCY);
@@ -1999,7 +1999,7 @@
* @param numFramesVerified The number of capture results to be verified
*/
private <T> void verifyCaptureResultForKey(CaptureResult.Key<T> key, T requestMode,
- SimpleCaptureListener listener, int numFramesVerified) {
+ SimpleCaptureCallback listener, int numFramesVerified) {
for (int i = 0; i < numFramesVerified; i++) {
CaptureResult result = listener.getCaptureResult(WAIT_FOR_RESULT_TIMEOUT_MS);
validatePipelineDepth(result);
@@ -2035,7 +2035,7 @@
Range<Integer>[] fpsRanges = mStaticInfo.getAeAvailableTargetFpsRangesChecked();
boolean antiBandingOffIsSupported = mStaticInfo.isAntiBandingOffModeSupported();
Range<Integer> fpsRange;
- SimpleCaptureListener resultListener;
+ SimpleCaptureCallback resultListener;
for (int i = 0; i < fpsRanges.length; i += 1) {
fpsRange = fpsRanges[i];
@@ -2065,7 +2065,7 @@
" mode");
}
- resultListener = new SimpleCaptureListener();
+ resultListener = new SimpleCaptureCallback();
startPreview(requestBuilder, previewSz, resultListener);
long[] frameDurationRange =
new long[]{(long) (1e9 / fpsRange.getUpper()), (long) (1e9 / fpsRange.getLower())};
diff --git a/tests/tests/hardware/src/android/hardware/camera2/cts/CaptureResultTest.java b/tests/tests/hardware/src/android/hardware/camera2/cts/CaptureResultTest.java
index 4b01081..79507d1 100644
--- a/tests/tests/hardware/src/android/hardware/camera2/cts/CaptureResultTest.java
+++ b/tests/tests/hardware/src/android/hardware/camera2/cts/CaptureResultTest.java
@@ -113,7 +113,7 @@
requestBuilder.addTarget(mReaderSurface);
// Start capture
- SimpleCaptureListener captureListener = new SimpleCaptureListener();
+ SimpleCaptureCallback captureListener = new SimpleCaptureCallback();
startCapture(requestBuilder.build(), /*repeating*/true, captureListener, mHandler);
// Get the waived keys for current camera device
@@ -293,10 +293,10 @@
multiBuilder.addTarget(previewReader.getSurface());
multiBuilder.addTarget(jpegReader.getSurface());
- CaptureListener mockCaptureListener = getMockCaptureListener();
+ CaptureCallback mockCaptureCallback = getMockCaptureListener();
// Capture targeting only preview
- Pair<TotalCaptureResult, Long> result = captureAndVerifyResult(mockCaptureListener,
+ Pair<TotalCaptureResult, Long> result = captureAndVerifyResult(mockCaptureCallback,
session, previewBuilder.build(), mHandler);
// Check if all timestamps are the same
@@ -304,7 +304,7 @@
prevListener.getImage(CAPTURE_IMAGE_TIMEOUT_MS), result.second);
// Capture targeting both jpeg and preview
- Pair<TotalCaptureResult, Long> result2 = captureAndVerifyResult(mockCaptureListener,
+ Pair<TotalCaptureResult, Long> result2 = captureAndVerifyResult(mockCaptureCallback,
session, multiBuilder.build(), mHandler);
// Check if all timestamps are the same
@@ -319,9 +319,9 @@
// Capture two preview frames
long startTime = SystemClock.elapsedRealtimeNanos();
- Pair<TotalCaptureResult, Long> result3 = captureAndVerifyResult(mockCaptureListener,
+ Pair<TotalCaptureResult, Long> result3 = captureAndVerifyResult(mockCaptureCallback,
session, previewBuilder.build(), mHandler);
- Pair<TotalCaptureResult, Long> result4 = captureAndVerifyResult(mockCaptureListener,
+ Pair<TotalCaptureResult, Long> result4 = captureAndVerifyResult(mockCaptureCallback,
session, previewBuilder.build(), mHandler);
long clockDiff = SystemClock.elapsedRealtimeNanos() - startTime;
long resultDiff = result4.second - result3.second;
@@ -352,7 +352,7 @@
resultImage.getTimestamp(), captureTime);
}
- private void validateCaptureResult(SimpleCaptureListener captureListener,
+ private void validateCaptureResult(SimpleCaptureCallback captureListener,
List<CaptureResult.Key<?>> skippedKeys, CaptureRequest.Builder requestBuilder,
int numFramesVerified) throws Exception {
CaptureResult result = null;
@@ -533,7 +533,7 @@
* with multiple handlers.</p>
* */
private static class TotalAndPartialResultListener
- extends CameraCaptureSession.CaptureListener {
+ extends CameraCaptureSession.CaptureCallback {
static final int ERROR_DUPLICATED_REQUEST = 1 << 0;
static final int ERROR_WRONG_CALLBACK_ORDER = 1 << 1;
diff --git a/tests/tests/hardware/src/android/hardware/camera2/cts/DngCreatorTest.java b/tests/tests/hardware/src/android/hardware/camera2/cts/DngCreatorTest.java
index 1173eab..9ec649e 100644
--- a/tests/tests/hardware/src/android/hardware/camera2/cts/DngCreatorTest.java
+++ b/tests/tests/hardware/src/android/hardware/camera2/cts/DngCreatorTest.java
@@ -17,6 +17,7 @@
package android.hardware.camera2.cts;
import android.graphics.ImageFormat;
+import android.graphics.Rect;
import android.hardware.camera2.CameraCaptureSession;
import android.hardware.camera2.CameraCharacteristics;
import android.hardware.camera2.CameraDevice;
@@ -40,6 +41,7 @@
import java.util.List;
import static android.hardware.camera2.cts.CameraTestUtils.configureCameraSession;
+import static android.hardware.camera2.cts.helpers.AssertHelpers.*;
/**
* Tests for the DngCreator API.
@@ -82,25 +84,34 @@
try {
openDevice(deviceId);
- Size[] targetCaptureSizes =
- mStaticInfo.getAvailableSizesForFormatChecked(ImageFormat.RAW_SENSOR,
- StaticMetadata.StreamDirection.Output);
- if (targetCaptureSizes.length == 0) {
- if (VERBOSE) {
- Log.i(TAG, "Skipping testSingleImageBasic - " +
- "no raw output streams for camera " + deviceId);
- }
+ if (!mStaticInfo.isCapabilitySupported(
+ CameraCharacteristics.REQUEST_AVAILABLE_CAPABILITIES_RAW)) {
+ Log.i(TAG, "RAW capability is not supported in camera " + mCameraIds[i] +
+ ". Skip the test.");
continue;
}
- Size s = targetCaptureSizes[0];
+ Size[] targetCaptureSizes =
+ mStaticInfo.getAvailableSizesForFormatChecked(ImageFormat.RAW_SENSOR,
+ StaticMetadata.StreamDirection.Output);
+
+ assertTrue("No capture sizes available for RAW format!",
+ targetCaptureSizes.length != 0);
+ Rect activeArray = mStaticInfo.getActiveArraySizeChecked();
+ Size activeArraySize = new Size(activeArray.width(), activeArray.height());
+ assertTrue("Missing ActiveArraySize", activeArray.width() > 0 &&
+ activeArray.height() > 0);
+ // TODO: Allow PixelArraySize also.
+ assertArrayContains("Available sizes for RAW format must include ActiveArraySize",
+ targetCaptureSizes, activeArraySize);
// Create capture image reader
CameraTestUtils.SimpleImageReaderListener captureListener
= new CameraTestUtils.SimpleImageReaderListener();
- captureReader = createImageReader(s, ImageFormat.RAW_SENSOR, 2,
+ captureReader = createImageReader(activeArraySize, ImageFormat.RAW_SENSOR, 2,
captureListener);
- Pair<Image, CaptureResult> resultPair = captureSingleRawShot(s, captureReader, captureListener);
+ Pair<Image, CaptureResult> resultPair = captureSingleRawShot(activeArraySize,
+ captureReader, captureListener);
CameraCharacteristics characteristics = mStaticInfo.getCharacteristics();
// Test simple writeImage, no header checks
@@ -159,16 +170,26 @@
try {
openDevice(deviceId);
+ if (!mStaticInfo.isCapabilitySupported(
+ CameraCharacteristics.REQUEST_AVAILABLE_CAPABILITIES_RAW)) {
+ Log.i(TAG, "RAW capability is not supported in camera " + mCameraIds[i] +
+ ". Skip the test.");
+ continue;
+ }
+
Size[] targetCaptureSizes =
mStaticInfo.getAvailableSizesForFormatChecked(ImageFormat.RAW_SENSOR,
StaticMetadata.StreamDirection.Output);
- if (targetCaptureSizes.length == 0) {
- if (VERBOSE) {
- Log.i(TAG, "Skipping testSingleImageThumbnail - " +
- "no raw output streams for camera " + deviceId);
- }
- continue;
- }
+
+ assertTrue("No capture sizes available for RAW format!",
+ targetCaptureSizes.length != 0);
+ Rect activeArray = mStaticInfo.getActiveArraySizeChecked();
+ Size activeArraySize = new Size(activeArray.width(), activeArray.height());
+ assertTrue("Missing ActiveArraySize", activeArray.width() > 0 &&
+ activeArray.height() > 0);
+ // TODO: Allow PixelArraySize also.
+ assertArrayContains("Available sizes for RAW format must include ActiveArraySize",
+ targetCaptureSizes, activeArraySize);
Size[] targetPreviewSizes =
mStaticInfo.getAvailableSizesForFormatChecked(ImageFormat.YUV_420_888,
@@ -176,12 +197,10 @@
// Get smallest preview size
Size previewSize = mOrderedPreviewSizes.get(mOrderedPreviewSizes.size() - 1);
- Size s = targetCaptureSizes[0];
-
// Create capture image reader
CameraTestUtils.SimpleImageReaderListener captureListener
= new CameraTestUtils.SimpleImageReaderListener();
- captureReaders.add(createImageReader(s, ImageFormat.RAW_SENSOR, 2,
+ captureReaders.add(createImageReader(activeArraySize, ImageFormat.RAW_SENSOR, 2,
captureListener));
captureListeners.add(captureListener);
@@ -192,8 +211,8 @@
previewListener));
captureListeners.add(previewListener);
- Pair<List<Image>, CaptureResult> resultPair = captureSingleRawShot(s, captureReaders,
- captureListeners);
+ Pair<List<Image>, CaptureResult> resultPair = captureSingleRawShot(activeArraySize,
+ captureReaders, captureListeners);
CameraCharacteristics characteristics = mStaticInfo.getCharacteristics();
// Test simple writeImage, no header checks
@@ -290,8 +309,8 @@
CaptureRequest.Builder request = prepareCaptureRequestForSurfaces(outputSurfaces);
request.set(CaptureRequest.STATISTICS_LENS_SHADING_MAP_MODE,
CaptureRequest.STATISTICS_LENS_SHADING_MAP_MODE_ON);
- CameraTestUtils.SimpleCaptureListener resultListener =
- new CameraTestUtils.SimpleCaptureListener();
+ CameraTestUtils.SimpleCaptureCallback resultListener =
+ new CameraTestUtils.SimpleCaptureCallback();
startCapture(request.build(), /*repeating*/false, resultListener, mHandler);
diff --git a/tests/tests/hardware/src/android/hardware/camera2/cts/ImageReaderTest.java b/tests/tests/hardware/src/android/hardware/camera2/cts/ImageReaderTest.java
index a44b255..7d2341a 100644
--- a/tests/tests/hardware/src/android/hardware/camera2/cts/ImageReaderTest.java
+++ b/tests/tests/hardware/src/android/hardware/camera2/cts/ImageReaderTest.java
@@ -218,7 +218,7 @@
outputSurfaces.add(yuvSurface);
outputSurfaces.add(captureSurface);
CaptureRequest.Builder request = prepareCaptureRequestForSurfaces(outputSurfaces);
- SimpleCaptureListener resultListener = new SimpleCaptureListener();
+ SimpleCaptureCallback resultListener = new SimpleCaptureCallback();
for (int i = 0; i < NUM_SINGLE_CAPTURE_TESTED; i++) {
startCapture(request.build(), /*repeating*/false, resultListener, mHandler);
@@ -278,7 +278,7 @@
// Start capture.
CaptureRequest request = prepareCaptureRequest();
- SimpleCaptureListener listener = new SimpleCaptureListener();
+ SimpleCaptureCallback listener = new SimpleCaptureCallback();
startCapture(request, repeating, listener, mHandler);
int numFrameVerified = repeating ? NUM_FRAME_VERIFIED : 1;
@@ -305,7 +305,7 @@
* @param size The capture size.
* @param listener The capture listener to get capture result callbacks.
*/
- private void validateCaptureResult(int format, Size size, SimpleCaptureListener listener,
+ private void validateCaptureResult(int format, Size size, SimpleCaptureCallback listener,
int numFrameVerified) {
for (int i = 0; i < numFrameVerified; i++) {
CaptureResult result = listener.getCaptureResult(CAPTURE_RESULT_TIMEOUT_MS);
diff --git a/tests/tests/hardware/src/android/hardware/camera2/cts/MultiViewTest.java b/tests/tests/hardware/src/android/hardware/camera2/cts/MultiViewTest.java
index 72e18bb..1033ecd 100644
--- a/tests/tests/hardware/src/android/hardware/camera2/cts/MultiViewTest.java
+++ b/tests/tests/hardware/src/android/hardware/camera2/cts/MultiViewTest.java
@@ -126,7 +126,7 @@
// The only error accepted is ERROR_MAX_CAMERAS_IN_USE, which means HAL doesn't support
// concurrent camera streaming
assertEquals("Camera device open failed",
- CameraDevice.StateListener.ERROR_MAX_CAMERAS_IN_USE, e.getCode());
+ CameraDevice.StateCallback.ERROR_MAX_CAMERAS_IN_USE, e.getCode());
Log.i(TAG, "Camera HAL does not support dual camera preview. Skip the test");
} finally {
for (int i = 0; i < NUM_CAMERAS_TESTED; i++) {
diff --git a/tests/tests/hardware/src/android/hardware/camera2/cts/PerformanceTest.java b/tests/tests/hardware/src/android/hardware/camera2/cts/PerformanceTest.java
index 761a5a3..aeab4cf 100644
--- a/tests/tests/hardware/src/android/hardware/camera2/cts/PerformanceTest.java
+++ b/tests/tests/hardware/src/android/hardware/camera2/cts/PerformanceTest.java
@@ -16,11 +16,11 @@
package android.hardware.camera2.cts;
-import static com.android.ex.camera2.blocking.BlockingSessionListener.*;
+import static com.android.ex.camera2.blocking.BlockingSessionCallback.*;
import android.graphics.ImageFormat;
import android.hardware.camera2.CameraCaptureSession;
-import android.hardware.camera2.CameraCaptureSession.CaptureListener;
+import android.hardware.camera2.CameraCaptureSession.CaptureCallback;
import android.hardware.camera2.CameraDevice;
import android.hardware.camera2.CaptureRequest;
import android.hardware.camera2.CaptureResult;
@@ -43,7 +43,7 @@
import com.android.cts.util.ResultType;
import com.android.cts.util.ResultUnit;
import com.android.cts.util.Stat;
-import com.android.ex.camera2.blocking.BlockingSessionListener;
+import com.android.ex.camera2.blocking.BlockingSessionCallback;
import com.android.ex.camera2.exceptions.TimeoutRuntimeException;
import java.util.ArrayList;
@@ -121,8 +121,8 @@
configureStreamTimes[i] = configureTimeMs - openTimeMs;
// Blocking start preview (start preview to first image arrives)
- CameraTestUtils.SimpleCaptureListener resultListener =
- new CameraTestUtils.SimpleCaptureListener();
+ CameraTestUtils.SimpleCaptureCallback resultListener =
+ new CameraTestUtils.SimpleCaptureCallback();
blockingStartPreview(resultListener, imageListener);
previewStartedTimeMs = SystemClock.elapsedRealtime();
startPreviewTimes[i] = previewStartedTimeMs - configureTimeMs;
@@ -203,8 +203,8 @@
mCamera.createCaptureRequest(CameraDevice.TEMPLATE_PREVIEW);
CaptureRequest.Builder captureBuilder =
mCamera.createCaptureRequest(CameraDevice.TEMPLATE_STILL_CAPTURE);
- CameraTestUtils.SimpleCaptureListener previewResultListener =
- new CameraTestUtils.SimpleCaptureListener();
+ CameraTestUtils.SimpleCaptureCallback previewResultListener =
+ new CameraTestUtils.SimpleCaptureCallback();
SimpleTimingResultListener captureResultListener =
new SimpleTimingResultListener();
SimpleImageListener imageListener = new SimpleImageListener();
@@ -267,7 +267,7 @@
CameraTestUtils.SESSION_CLOSE_TIMEOUT_MS);
}
- private void blockingStartPreview(CaptureListener listener, SimpleImageListener imageListener)
+ private void blockingStartPreview(CaptureCallback listener, SimpleImageListener imageListener)
throws Exception {
if (mPreviewSurface == null || mReaderSurface == null) {
throw new IllegalStateException("preview and reader surface must be initilized first");
@@ -281,7 +281,7 @@
imageListener.waitForImageAvailable(CameraTestUtils.CAPTURE_IMAGE_TIMEOUT_MS);
}
- private void blockingCaptureImage(CaptureListener listener,
+ private void blockingCaptureImage(CaptureCallback listener,
SimpleImageListener imageListener) throws Exception {
if (mReaderSurface == null) {
throw new IllegalStateException("reader surface must be initialized first");
@@ -301,7 +301,7 @@
if (mPreviewSurface == null || mReaderSurface == null) {
throw new IllegalStateException("preview and reader surface must be initilized first");
}
- mSessionListener = new BlockingSessionListener();
+ mSessionListener = new BlockingSessionCallback();
List<Surface> outputSurfaces = new ArrayList<>();
outputSurfaces.add(mPreviewSurface);
outputSurfaces.add(mReaderSurface);
@@ -383,7 +383,7 @@
}
private static class SimpleTimingResultListener
- extends CameraCaptureSession.CaptureListener {
+ extends CameraCaptureSession.CaptureCallback {
private final LinkedBlockingQueue<Pair<CaptureResult, Long> > mPartialResultQueue =
new LinkedBlockingQueue<Pair<CaptureResult, Long> >();
private final LinkedBlockingQueue<Pair<CaptureResult, Long> > mResultQueue =
diff --git a/tests/tests/hardware/src/android/hardware/camera2/cts/RecordingTest.java b/tests/tests/hardware/src/android/hardware/camera2/cts/RecordingTest.java
index f402da5..83c3afb 100644
--- a/tests/tests/hardware/src/android/hardware/camera2/cts/RecordingTest.java
+++ b/tests/tests/hardware/src/android/hardware/camera2/cts/RecordingTest.java
@@ -12,7 +12,7 @@
package android.hardware.camera2.cts;
import static android.hardware.camera2.cts.CameraTestUtils.*;
-import static com.android.ex.camera2.blocking.BlockingSessionListener.*;
+import static com.android.ex.camera2.blocking.BlockingSessionCallback.*;
import android.graphics.ImageFormat;
import android.hardware.camera2.CameraCharacteristics;
@@ -39,7 +39,7 @@
import android.util.Range;
import android.view.Surface;
-import com.android.ex.camera2.blocking.BlockingSessionListener;
+import com.android.ex.camera2.blocking.BlockingSessionCallback;
import junit.framework.AssertionFailedError;
@@ -337,7 +337,7 @@
if (mReaderSurface != null) {
outputSurfaces.add(mReaderSurface);
}
- mSessionListener = new BlockingSessionListener();
+ mSessionListener = new BlockingSessionCallback();
mSession = configureCameraSession(mCamera, outputSurfaces, mSessionListener, mHandler);
CaptureRequest.Builder recordingRequestBuilder =
@@ -581,7 +581,7 @@
prepareRecordingWithProfile(profile);
// prepare video snapshot
- SimpleCaptureListener resultListener = new SimpleCaptureListener();
+ SimpleCaptureCallback resultListener = new SimpleCaptureCallback();
SimpleImageReaderListener imageListener = new SimpleImageReaderListener();
CaptureRequest.Builder videoSnapshotRequestBuilder =
mCamera.createCaptureRequest(CameraDevice.TEMPLATE_VIDEO_SNAPSHOT);
@@ -726,7 +726,7 @@
}
private void startRecording(boolean useMediaRecorder,
- CameraCaptureSession.CaptureListener listener) throws Exception {
+ CameraCaptureSession.CaptureCallback listener) throws Exception {
List<Surface> outputSurfaces = new ArrayList<Surface>(2);
assertTrue("Both preview and recording surfaces should be valid",
mPreviewSurface.isValid() && mRecordingSurface.isValid());
@@ -736,7 +736,7 @@
if (mReaderSurface != null) {
outputSurfaces.add(mReaderSurface);
}
- mSessionListener = new BlockingSessionListener();
+ mSessionListener = new BlockingSessionCallback();
mSession = configureCameraSession(mCamera, outputSurfaces, mSessionListener, mHandler);
CaptureRequest.Builder recordingRequestBuilder =
@@ -841,7 +841,7 @@
* Here frame drop is defined as frame duration >= 2 * expected frame duration.
*/
private void validateFrameDropAroundVideoSnapshot(
- SimpleCaptureListener resultListener, long imageTimeStamp) {
+ SimpleCaptureCallback resultListener, long imageTimeStamp) {
int expectedDurationMs = 1000 / mVideoFrameRate;
CaptureResult prevResult = resultListener.getCaptureResult(WAIT_FOR_RESULT_TIMEOUT_MS);
long prevTS = getValueNotNull(prevResult, CaptureResult.SENSOR_TIMESTAMP);
@@ -890,7 +890,7 @@
/**
* Validate frame jittering from the input simple listener's buffered results
*/
- private void validateJittering(SimpleCaptureListener resultListener) {
+ private void validateJittering(SimpleCaptureCallback resultListener) {
int expectedDurationMs = 1000 / mVideoFrameRate;
CaptureResult prevResult = resultListener.getCaptureResult(WAIT_FOR_RESULT_TIMEOUT_MS);
long prevTS = getValueNotNull(prevResult, CaptureResult.SENSOR_TIMESTAMP);
diff --git a/tests/tests/hardware/src/android/hardware/camera2/cts/RobustnessTest.java b/tests/tests/hardware/src/android/hardware/camera2/cts/RobustnessTest.java
index bdbe44f..5b0f0fd 100644
--- a/tests/tests/hardware/src/android/hardware/camera2/cts/RobustnessTest.java
+++ b/tests/tests/hardware/src/android/hardware/camera2/cts/RobustnessTest.java
@@ -25,7 +25,7 @@
import android.util.Log;
import android.view.Surface;
-import com.android.ex.camera2.blocking.BlockingSessionListener;
+import com.android.ex.camera2.blocking.BlockingSessionCallback;
import java.util.ArrayList;
import java.util.List;
@@ -60,12 +60,12 @@
CaptureRequest.Builder request =
mCamera.createCaptureRequest(CameraDevice.TEMPLATE_PREVIEW);
request.addTarget(surface);
- CameraCaptureSession.CaptureListener mockCaptureListener =
- mock(CameraCaptureSession.CaptureListener.class);
+ CameraCaptureSession.CaptureCallback mockCaptureListener =
+ mock(CameraCaptureSession.CaptureCallback.class);
// Check that correct session callback is hit.
- CameraCaptureSession.StateListener sessionListener =
- mock(CameraCaptureSession.StateListener.class);
+ CameraCaptureSession.StateCallback sessionListener =
+ mock(CameraCaptureSession.StateCallback.class);
mCamera.createCaptureSession(surfaces, sessionListener, mHandler);
verify(sessionListener, timeout(FAILED_CONFIGURE_TIMEOUT).atLeastOnce()).
onConfigureFailed(any(CameraCaptureSession.class));
diff --git a/tests/tests/hardware/src/android/hardware/camera2/cts/StillCaptureTest.java b/tests/tests/hardware/src/android/hardware/camera2/cts/StillCaptureTest.java
index 5c6328d..048b1cf 100644
--- a/tests/tests/hardware/src/android/hardware/camera2/cts/StillCaptureTest.java
+++ b/tests/tests/hardware/src/android/hardware/camera2/cts/StillCaptureTest.java
@@ -17,6 +17,7 @@
package android.hardware.camera2.cts;
import static android.hardware.camera2.cts.CameraTestUtils.*;
+import static android.hardware.camera2.cts.helpers.AssertHelpers.assertArrayContains;
import static junit.framework.Assert.assertNotNull;
import android.graphics.ImageFormat;
@@ -32,7 +33,7 @@
import android.media.ImageReader;
import android.util.Pair;
import android.util.Size;
-import android.hardware.camera2.cts.CameraTestUtils.SimpleCaptureListener;
+import android.hardware.camera2.cts.CameraTestUtils.SimpleCaptureCallback;
import android.hardware.camera2.cts.CameraTestUtils.SimpleImageReaderListener;
import android.hardware.camera2.cts.helpers.Camera2Focuser;
import android.hardware.camera2.cts.testcases.Camera2SurfaceViewTestCase;
@@ -46,7 +47,7 @@
import android.util.Rational;
import android.view.Surface;
-import com.android.ex.camera2.blocking.BlockingSessionListener;
+import com.android.ex.camera2.blocking.BlockingSessionCallback;
import com.android.ex.camera2.exceptions.TimeoutRuntimeException;
import java.io.ByteArrayOutputStream;
@@ -391,8 +392,8 @@
Size maxStillSz = mOrderedStillSizes.get(0);
Size maxPreviewSz = mOrderedPreviewSizes.get(0);
- SimpleCaptureListener resultListener = new SimpleCaptureListener();
- SimpleCaptureListener stillResultListener = new SimpleCaptureListener();
+ SimpleCaptureCallback resultListener = new SimpleCaptureCallback();
+ SimpleCaptureCallback stillResultListener = new SimpleCaptureCallback();
SimpleImageReaderListener imageListener = new SimpleImageReaderListener();
CaptureRequest.Builder previewRequest =
mCamera.createCaptureRequest(CameraDevice.TEMPLATE_PREVIEW);
@@ -443,7 +444,7 @@
Size maxStillSz = mOrderedStillSizes.get(0);
Size maxPreviewSz = mOrderedPreviewSizes.get(0);
CaptureResult result;
- SimpleCaptureListener resultListener = new SimpleCaptureListener();
+ SimpleCaptureCallback resultListener = new SimpleCaptureCallback();
SimpleImageReaderListener imageListener = new SimpleImageReaderListener();
CaptureRequest.Builder previewRequest =
mCamera.createCaptureRequest(CameraDevice.TEMPLATE_PREVIEW);
@@ -496,7 +497,7 @@
/**
* Step 2: AF is already locked, wait for AWB converged, then lock it.
*/
- resultListener = new SimpleCaptureListener();
+ resultListener = new SimpleCaptureCallback();
boolean canSetAwbRegion =
(awbRegions != null) && isRegionsSupportedFor3A(MAX_REGIONS_AWB_INDEX);
if (canSetAwbRegion) {
@@ -528,7 +529,7 @@
/**
* Step 3: trigger an AE precapture metering sequence and wait for AE converged.
*/
- resultListener = new SimpleCaptureListener();
+ resultListener = new SimpleCaptureCallback();
boolean canSetAeRegion =
(aeRegions != null) && isRegionsSupportedFor3A(MAX_REGIONS_AE_INDEX);
if (canSetAeRegion) {
@@ -560,7 +561,7 @@
/**
* Step 4: take a picture when all 3A are in good state.
*/
- resultListener = new SimpleCaptureListener();
+ resultListener = new SimpleCaptureCallback();
CaptureRequest request = stillRequest.build();
mSession.capture(request, resultListener, mHandler);
// Validate the next result immediately for region and mode.
@@ -591,7 +592,7 @@
* Test touch region for focus by camera.
*/
private void touchForFocusTestByCamera() throws Exception {
- SimpleCaptureListener listener = new SimpleCaptureListener();
+ SimpleCaptureCallback listener = new SimpleCaptureCallback();
CaptureRequest.Builder requestBuilder =
mCamera.createCaptureRequest(CameraDevice.TEMPLATE_PREVIEW);
Size maxPreviewSz = mOrderedPreviewSizes.get(0);
@@ -610,7 +611,7 @@
}
private void previewStillCombinationTestByCamera() throws Exception {
- SimpleCaptureListener resultListener = new SimpleCaptureListener();
+ SimpleCaptureCallback resultListener = new SimpleCaptureCallback();
SimpleImageReaderListener imageListener = new SimpleImageReaderListener();
for (Size stillSz : mOrderedStillSizes)
@@ -641,140 +642,151 @@
private void rawCaptureTestByCamera() throws Exception {
Size maxPreviewSz = mOrderedPreviewSizes.get(0);
Size[] rawSizes = mStaticInfo.getRawOutputSizesChecked();
- for (Size size : rawSizes) {
- if (VERBOSE) {
- Log.v(TAG, "Testing Raw capture with size " + size.toString()
- + ", preview size " + maxPreviewSz);
- }
- // Prepare raw capture and start preview.
- CaptureRequest.Builder previewBuilder =
- mCamera.createCaptureRequest(CameraDevice.TEMPLATE_PREVIEW);
- CaptureRequest.Builder rawBuilder =
- mCamera.createCaptureRequest(CameraDevice.TEMPLATE_STILL_CAPTURE);
- SimpleCaptureListener resultListener = new SimpleCaptureListener();
- SimpleImageReaderListener imageListener = new SimpleImageReaderListener();
- prepareRawCaptureAndStartPreview(previewBuilder, rawBuilder, maxPreviewSz, size,
- resultListener, imageListener);
+ assertTrue("No capture sizes available for RAW format!",
+ rawSizes.length != 0);
+ Rect activeArray = mStaticInfo.getActiveArraySizeChecked();
+ Size size = new Size(activeArray.width(), activeArray.height());
+ assertTrue("Missing ActiveArraySize", activeArray.width() > 0 &&
+ activeArray.height() > 0);
+ assertArrayContains("Available sizes for RAW format must include ActiveArraySize",
+ rawSizes, size);
- CaptureRequest rawRequest = rawBuilder.build();
- mSession.capture(rawRequest, resultListener, mHandler);
+ // Prepare raw capture and start preview.
+ CaptureRequest.Builder previewBuilder =
+ mCamera.createCaptureRequest(CameraDevice.TEMPLATE_PREVIEW);
+ CaptureRequest.Builder rawBuilder =
+ mCamera.createCaptureRequest(CameraDevice.TEMPLATE_STILL_CAPTURE);
+ SimpleCaptureCallback resultListener = new SimpleCaptureCallback();
+ SimpleImageReaderListener imageListener = new SimpleImageReaderListener();
+ prepareRawCaptureAndStartPreview(previewBuilder, rawBuilder, maxPreviewSz, size,
+ resultListener, imageListener);
- Image image = imageListener.getImage(CAPTURE_IMAGE_TIMEOUT_MS);
- validateRaw16Image(image, size);
- if (DEBUG) {
- byte[] rawBuffer = getDataFromImage(image);
- String rawFileName =
- DEBUG_FILE_NAME_BASE + "/test" + "_" + size.toString() +
- "_cam" + mCamera.getId() + ".raw16";
- Log.d(TAG, "Dump raw file into " + rawFileName);
- dumpFile(rawFileName, rawBuffer);
- }
-
- verifyRawCaptureResult(rawRequest, resultListener.getCaptureResultForRequest(rawRequest,
- NUM_RESULTS_WAIT_TIMEOUT));
- stopPreview();
+ if (VERBOSE) {
+ Log.v(TAG, "Testing Raw capture with size " + size.toString()
+ + ", preview size " + maxPreviewSz);
}
+
+ CaptureRequest rawRequest = rawBuilder.build();
+ mSession.capture(rawRequest, resultListener, mHandler);
+
+ Image image = imageListener.getImage(CAPTURE_IMAGE_TIMEOUT_MS);
+ validateRaw16Image(image, size);
+ if (DEBUG) {
+ byte[] rawBuffer = getDataFromImage(image);
+ String rawFileName = DEBUG_FILE_NAME_BASE + "/test" + "_" + size.toString() + "_cam" +
+ mCamera.getId() + ".raw16";
+ Log.d(TAG, "Dump raw file into " + rawFileName);
+ dumpFile(rawFileName, rawBuffer);
+ }
+
+ verifyRawCaptureResult(rawRequest, resultListener.getCaptureResultForRequest(rawRequest,
+ NUM_RESULTS_WAIT_TIMEOUT));
+ stopPreview();
}
private void fullRawCaptureTestByCamera() throws Exception {
Size maxPreviewSz = mOrderedPreviewSizes.get(0);
Size maxStillSz = mOrderedStillSizes.get(0);
Size[] rawSizes = mStaticInfo.getRawOutputSizesChecked();
- for (Size size : rawSizes) {
- if (VERBOSE) {
- Log.v(TAG, "Testing multi capture with size " + size.toString()
- + ", preview size " + maxPreviewSz);
- }
- // Prepare raw capture and start preview.
- CaptureRequest.Builder previewBuilder =
- mCamera.createCaptureRequest(CameraDevice.TEMPLATE_PREVIEW);
- CaptureRequest.Builder multiBuilder =
- mCamera.createCaptureRequest(CameraDevice.TEMPLATE_STILL_CAPTURE);
+ SimpleCaptureCallback resultListener = new SimpleCaptureCallback();
+ SimpleImageReaderListener jpegListener = new SimpleImageReaderListener();
+ SimpleImageReaderListener rawListener = new SimpleImageReaderListener();
- SimpleCaptureListener resultListener = new SimpleCaptureListener();
- SimpleImageReaderListener jpegListener = new SimpleImageReaderListener();
- SimpleImageReaderListener rawListener = new SimpleImageReaderListener();
+ assertTrue("No capture sizes available for RAW format!",
+ rawSizes.length != 0);
+ Rect activeArray = mStaticInfo.getActiveArraySizeChecked();
+ Size size = new Size(activeArray.width(), activeArray.height());
+ assertTrue("Missing ActiveArraySize", activeArray.width() > 0 &&
+ activeArray.height() > 0);
+ assertArrayContains("Available sizes for RAW format must include ActiveArraySize",
+ rawSizes, size);
+ if (VERBOSE) {
+ Log.v(TAG, "Testing multi capture with size " + size.toString()
+ + ", preview size " + maxPreviewSz);
+ }
+
+ // Prepare raw capture and start preview.
+ CaptureRequest.Builder previewBuilder =
+ mCamera.createCaptureRequest(CameraDevice.TEMPLATE_PREVIEW);
+ CaptureRequest.Builder multiBuilder =
+ mCamera.createCaptureRequest(CameraDevice.TEMPLATE_STILL_CAPTURE);
+
+ ImageReader rawReader = null;
+ ImageReader jpegReader = null;
+
+ try {
+ // Create ImageReaders.
+ rawReader = makeImageReader(size,
+ ImageFormat.RAW_SENSOR, MAX_READER_IMAGES, rawListener, mHandler);
+ jpegReader = makeImageReader(maxStillSz,
+ ImageFormat.JPEG, MAX_READER_IMAGES, jpegListener, mHandler);
updatePreviewSurface(maxPreviewSz);
- ImageReader rawReader = null;
- ImageReader jpegReader = null;
- try {
+ // Configure output streams with preview and jpeg streams.
+ List<Surface> outputSurfaces = new ArrayList<Surface>();
+ outputSurfaces.add(rawReader.getSurface());
+ outputSurfaces.add(jpegReader.getSurface());
+ outputSurfaces.add(mPreviewSurface);
+ mSessionListener = new BlockingSessionCallback();
+ mSession = configureCameraSession(mCamera, outputSurfaces,
+ mSessionListener, mHandler);
- // Create ImageReaders.
- rawReader = makeImageReader(size,
- ImageFormat.RAW_SENSOR, MAX_READER_IMAGES, rawListener, mHandler);
- jpegReader = makeImageReader(maxStillSz,
- ImageFormat.JPEG, MAX_READER_IMAGES, jpegListener, mHandler);
+ // Configure the requests.
+ previewBuilder.addTarget(mPreviewSurface);
+ multiBuilder.addTarget(mPreviewSurface);
+ multiBuilder.addTarget(rawReader.getSurface());
+ multiBuilder.addTarget(jpegReader.getSurface());
- // Configure output streams with preview and jpeg streams.
- List<Surface> outputSurfaces = new ArrayList<Surface>();
- outputSurfaces.add(rawReader.getSurface());
- outputSurfaces.add(jpegReader.getSurface());
- outputSurfaces.add(mPreviewSurface);
- mSessionListener = new BlockingSessionListener();
- mSession = configureCameraSession(mCamera, outputSurfaces,
- mSessionListener, mHandler);
+ // Start preview.
+ mSession.setRepeatingRequest(previewBuilder.build(), null, mHandler);
- // Configure the requests.
- previewBuilder.addTarget(mPreviewSurface);
- multiBuilder.addTarget(mPreviewSurface);
- multiBuilder.addTarget(rawReader.getSurface());
- multiBuilder.addTarget(jpegReader.getSurface());
+ // Poor man's 3A, wait 2 seconds for AE/AF (if any) to settle.
+ // TODO: Do proper 3A trigger and lock (see testTakePictureTest).
+ Thread.sleep(3000);
- // Start preview.
- mSession.setRepeatingRequest(previewBuilder.build(), null, mHandler);
+ multiBuilder.set(CaptureRequest.STATISTICS_LENS_SHADING_MAP_MODE,
+ CaptureRequest.STATISTICS_LENS_SHADING_MAP_MODE_ON);
+ CaptureRequest multiRequest = multiBuilder.build();
- // Poor man's 3A, wait 2 seconds for AE/AF (if any) to settle.
- // TODO: Do proper 3A trigger and lock (see testTakePictureTest).
- Thread.sleep(3000);
+ mSession.capture(multiRequest, resultListener, mHandler);
- multiBuilder.set(CaptureRequest.STATISTICS_LENS_SHADING_MAP_MODE,
- CaptureRequest.STATISTICS_LENS_SHADING_MAP_MODE_ON);
- CaptureRequest multiRequest = multiBuilder.build();
-
- mSession.capture(multiRequest, resultListener, mHandler);
-
- CaptureResult result = resultListener.getCaptureResultForRequest(multiRequest,
- NUM_RESULTS_WAIT_TIMEOUT);
- Image jpegImage = jpegListener.getImage(CAPTURE_IMAGE_TIMEOUT_MS);
- basicValidateJpegImage(jpegImage, maxStillSz);
- Image rawImage = rawListener.getImage(CAPTURE_IMAGE_TIMEOUT_MS);
- validateRaw16Image(rawImage, size);
- verifyRawCaptureResult(multiRequest, result);
+ CaptureResult result = resultListener.getCaptureResultForRequest(multiRequest,
+ NUM_RESULTS_WAIT_TIMEOUT);
+ Image jpegImage = jpegListener.getImage(CAPTURE_IMAGE_TIMEOUT_MS);
+ basicValidateJpegImage(jpegImage, maxStillSz);
+ Image rawImage = rawListener.getImage(CAPTURE_IMAGE_TIMEOUT_MS);
+ validateRaw16Image(rawImage, size);
+ verifyRawCaptureResult(multiRequest, result);
- ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
- try (DngCreator dngCreator =
- new DngCreator(mStaticInfo.getCharacteristics(), result)) {
- dngCreator.writeImage(outputStream, rawImage);
- }
-
- if (DEBUG) {
- byte[] rawBuffer = outputStream.toByteArray();
- String rawFileName =
- DEBUG_FILE_NAME_BASE + "/raw16_" + TAG + size.toString() +
- "_cam_" + mCamera.getId() + ".dng";
- Log.d(TAG, "Dump raw file into " + rawFileName);
- dumpFile(rawFileName, rawBuffer);
-
- byte[] jpegBuffer = getDataFromImage(jpegImage);
- String jpegFileName =
- DEBUG_FILE_NAME_BASE + "/jpeg_" + TAG + size.toString() +
- "_cam_" + mCamera.getId() + ".jpg";
- Log.d(TAG, "Dump jpeg file into " + rawFileName);
- dumpFile(jpegFileName, jpegBuffer);
- }
-
- stopPreview();
- } finally {
- CameraTestUtils.closeImageReader(rawReader);
- CameraTestUtils.closeImageReader(jpegReader);
- rawReader = null;
- jpegReader = null;
+ ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
+ try (DngCreator dngCreator = new DngCreator(mStaticInfo.getCharacteristics(), result)) {
+ dngCreator.writeImage(outputStream, rawImage);
}
+
+ if (DEBUG) {
+ byte[] rawBuffer = outputStream.toByteArray();
+ String rawFileName = DEBUG_FILE_NAME_BASE + "/raw16_" + TAG + size.toString() +
+ "_cam_" + mCamera.getId() + ".dng";
+ Log.d(TAG, "Dump raw file into " + rawFileName);
+ dumpFile(rawFileName, rawBuffer);
+
+ byte[] jpegBuffer = getDataFromImage(jpegImage);
+ String jpegFileName = DEBUG_FILE_NAME_BASE + "/jpeg_" + TAG + size.toString() +
+ "_cam_" + mCamera.getId() + ".jpg";
+ Log.d(TAG, "Dump jpeg file into " + rawFileName);
+ dumpFile(jpegFileName, jpegBuffer);
+ }
+
+ stopPreview();
+ } finally {
+ CameraTestUtils.closeImageReader(rawReader);
+ CameraTestUtils.closeImageReader(jpegReader);
+ rawReader = null;
+ jpegReader = null;
}
}
@@ -892,7 +904,7 @@
mCamera.createCaptureRequest(CameraDevice.TEMPLATE_PREVIEW);
CaptureRequest.Builder stillBuilder =
mCamera.createCaptureRequest(CameraDevice.TEMPLATE_STILL_CAPTURE);
- SimpleCaptureListener resultListener = new SimpleCaptureListener();
+ SimpleCaptureCallback resultListener = new SimpleCaptureCallback();
SimpleImageReaderListener imageListener = new SimpleImageReaderListener();
prepareStillCaptureAndStartPreview(previewBuilder, stillBuilder, maxPreviewSz, maxStillSz,
resultListener, imageListener);
@@ -1214,7 +1226,7 @@
Size maxStillSz = mOrderedStillSizes.get(0);
Size maxPreviewSz = mOrderedPreviewSizes.get(0);
- SimpleCaptureListener resultListener = new SimpleCaptureListener();
+ SimpleCaptureCallback resultListener = new SimpleCaptureCallback();
SimpleImageReaderListener imageListener = new SimpleImageReaderListener();
CaptureRequest.Builder previewRequest =
mCamera.createCaptureRequest(CameraDevice.TEMPLATE_PREVIEW);
diff --git a/tests/tests/hardware/src/android/hardware/camera2/cts/SurfaceViewPreviewTest.java b/tests/tests/hardware/src/android/hardware/camera2/cts/SurfaceViewPreviewTest.java
index 6dd7c1e..aad9c2f 100644
--- a/tests/tests/hardware/src/android/hardware/camera2/cts/SurfaceViewPreviewTest.java
+++ b/tests/tests/hardware/src/android/hardware/camera2/cts/SurfaceViewPreviewTest.java
@@ -19,14 +19,14 @@
import static android.hardware.camera2.cts.CameraTestUtils.*;
import android.hardware.camera2.CameraCaptureSession;
-import android.hardware.camera2.CameraCaptureSession.CaptureListener;
+import android.hardware.camera2.CameraCaptureSession.CaptureCallback;
import android.hardware.camera2.CameraDevice;
import android.hardware.camera2.CaptureFailure;
import android.hardware.camera2.CaptureRequest;
import android.hardware.camera2.CaptureResult;
import android.hardware.camera2.TotalCaptureResult;
import android.util.Size;
-import android.hardware.camera2.cts.CameraTestUtils.SimpleCaptureListener;
+import android.hardware.camera2.cts.CameraTestUtils.SimpleCaptureCallback;
import android.hardware.camera2.cts.testcases.Camera2SurfaceViewTestCase;
import android.util.Log;
import android.util.Range;
@@ -64,7 +64,7 @@
* Test all supported preview sizes for each camera device.
* <p>
* For the first {@link #NUM_FRAMES_VERIFIED} of capture results,
- * the {@link CaptureListener} callback availability and the capture timestamp
+ * the {@link CaptureCallback} callback availability and the capture timestamp
* (monotonically increasing) ordering are verified.
* </p>
*/
@@ -129,7 +129,7 @@
Range<Integer> fpsRange;
CaptureRequest.Builder requestBuilder =
mCamera.createCaptureRequest(CameraDevice.TEMPLATE_PREVIEW);
- SimpleCaptureListener resultListener = new SimpleCaptureListener();
+ SimpleCaptureCallback resultListener = new SimpleCaptureCallback();
startPreview(requestBuilder, maxPreviewSz, resultListener);
for (int i = 0; i < fpsRanges.length; i += 1) {
@@ -149,7 +149,7 @@
" mode");
}
- resultListener = new SimpleCaptureListener();
+ resultListener = new SimpleCaptureCallback();
mSession.setRepeatingRequest(requestBuilder.build(), resultListener, mHandler);
verifyPreviewTargetFpsRange(resultListener, NUM_FRAMES_VERIFIED, fpsRange,
@@ -159,7 +159,7 @@
stopPreview();
}
- private void verifyPreviewTargetFpsRange(SimpleCaptureListener resultListener,
+ private void verifyPreviewTargetFpsRange(SimpleCaptureCallback resultListener,
int numFramesVerified, Range<Integer> fpsRange, Size previewSz) {
CaptureResult result = resultListener.getCaptureResult(WAIT_FOR_RESULT_TIMEOUT_MS);
List<Integer> capabilities = mStaticInfo.getAvailableCapabilitiesChecked();
@@ -206,11 +206,11 @@
// TODO: vary the different settings like crop region to cover more cases.
CaptureRequest.Builder requestBuilder =
mCamera.createCaptureRequest(CameraDevice.TEMPLATE_PREVIEW);
- CaptureListener mockCaptureListener =
- mock(CameraCaptureSession.CaptureListener.class);
+ CaptureCallback mockCaptureCallback =
+ mock(CameraCaptureSession.CaptureCallback.class);
- startPreview(requestBuilder, sz, mockCaptureListener);
- verifyCaptureResults(mSession, mockCaptureListener, NUM_FRAMES_VERIFIED,
+ startPreview(requestBuilder, sz, mockCaptureCallback);
+ verifyCaptureResults(mSession, mockCaptureCallback, NUM_FRAMES_VERIFIED,
NUM_FRAMES_VERIFIED * FRAME_TIMEOUT_MS);
stopPreview();
}
@@ -221,7 +221,7 @@
int[] testPatternModes = mStaticInfo.getAvailableTestPatternModesChecked();
CaptureRequest.Builder requestBuilder =
mCamera.createCaptureRequest(CameraDevice.TEMPLATE_PREVIEW);
- CaptureListener mockCaptureListener;
+ CaptureCallback mockCaptureCallback;
final int[] TEST_PATTERN_DATA = {0, 0xFFFFFFFF, 0xFFFFFFFF, 0}; // G:100%, RB:0.
for (int mode : testPatternModes) {
@@ -233,9 +233,9 @@
// Assign color pattern to SENSOR_TEST_PATTERN_MODE_DATA
requestBuilder.set(CaptureRequest.SENSOR_TEST_PATTERN_DATA, TEST_PATTERN_DATA);
}
- mockCaptureListener = mock(CaptureListener.class);
- startPreview(requestBuilder, maxPreviewSize, mockCaptureListener);
- verifyCaptureResults(mSession, mockCaptureListener, NUM_TEST_PATTERN_FRAMES_VERIFIED,
+ mockCaptureCallback = mock(CaptureCallback.class);
+ startPreview(requestBuilder, maxPreviewSize, mockCaptureCallback);
+ verifyCaptureResults(mSession, mockCaptureCallback, NUM_TEST_PATTERN_FRAMES_VERIFIED,
NUM_TEST_PATTERN_FRAMES_VERIFIED * FRAME_TIMEOUT_MS);
}
@@ -256,7 +256,7 @@
private void verifyCaptureResults(
CameraCaptureSession session,
- CaptureListener mockListener,
+ CaptureCallback mockListener,
int expectResultCount,
int timeOutMs) {
// Should receive expected number of onCaptureStarted callbacks.
diff --git a/tests/tests/hardware/src/android/hardware/camera2/cts/helpers/Camera2Focuser.java b/tests/tests/hardware/src/android/hardware/camera2/cts/helpers/Camera2Focuser.java
index c03caca..1c42629 100644
--- a/tests/tests/hardware/src/android/hardware/camera2/cts/helpers/Camera2Focuser.java
+++ b/tests/tests/hardware/src/android/hardware/camera2/cts/helpers/Camera2Focuser.java
@@ -19,7 +19,7 @@
import android.graphics.Rect;
import android.hardware.camera2.CameraAccessException;
import android.hardware.camera2.CameraCaptureSession;
-import android.hardware.camera2.CameraCaptureSession.CaptureListener;
+import android.hardware.camera2.CameraCaptureSession.CaptureCallback;
import android.hardware.camera2.CameraCharacteristics;
import android.hardware.camera2.CameraDevice;
import android.hardware.camera2.params.MeteringRectangle;
@@ -215,7 +215,7 @@
CaptureRequest.Builder requestBuilder = createRequestBuilder();
mAutoFocus.setPassiveAutoFocus(/*picture*/true, mRepeatingBuilder);
mAutoFocus.unlockAutoFocus(mRepeatingBuilder, requestBuilder);
- CaptureListener listener = createCaptureListener();
+ CaptureCallback listener = createCaptureListener();
mSession.setRepeatingRequest(mRepeatingBuilder.build(), listener, mHandler);
mSession.capture(requestBuilder.build(), listener, mHandler);
}
@@ -252,7 +252,7 @@
return;
} else if (mSuccess) {
mAutoFocus.lockAutoFocus(mRepeatingBuilder, requestBuilder);
- CaptureListener listener = createCaptureListener();
+ CaptureCallback listener = createCaptureListener();
mSession.setRepeatingRequest(mRepeatingBuilder.build(), listener, mHandler);
mSession.capture(requestBuilder.build(), listener, mHandler);
} else {
@@ -276,7 +276,7 @@
}
mAutoFocus.resetState();
- CaptureListener listener = createCaptureListener();
+ CaptureCallback listener = createCaptureListener();
mSession.setRepeatingRequest(mRepeatingBuilder.build(), listener, mHandler);
mSession.capture(requestBuilder.build(), listener, mHandler);
}
@@ -332,7 +332,7 @@
mAfRegions = new MeteringRectangle[] {
new MeteringRectangle(0, 0, 0, 0, MeteringRectangle.METERING_WEIGHT_DONT_CARE)};
}
- private CaptureListener createCaptureListener() {
+ private CaptureCallback createCaptureListener() {
int thisAfRun;
synchronized (this) {
@@ -341,7 +341,7 @@
final int finalAfRun = thisAfRun;
- return new CaptureListener() {
+ return new CaptureCallback() {
private long mLatestFrameCount = -1;
@Override
diff --git a/tests/tests/hardware/src/android/hardware/camera2/cts/helpers/CameraSessionUtils.java b/tests/tests/hardware/src/android/hardware/camera2/cts/helpers/CameraSessionUtils.java
index 134d674..140a645 100644
--- a/tests/tests/hardware/src/android/hardware/camera2/cts/helpers/CameraSessionUtils.java
+++ b/tests/tests/hardware/src/android/hardware/camera2/cts/helpers/CameraSessionUtils.java
@@ -27,8 +27,8 @@
import android.util.Pair;
import android.view.Surface;
-import com.android.ex.camera2.blocking.BlockingCaptureListener;
-import com.android.ex.camera2.blocking.BlockingSessionListener;
+import com.android.ex.camera2.blocking.BlockingCaptureCallback;
+import com.android.ex.camera2.blocking.BlockingSessionCallback;
import com.android.ex.camera2.exceptions.TimeoutRuntimeException;
import junit.framework.Assert;
@@ -51,7 +51,7 @@
/**
* A blocking listener class for synchronously opening and configuring sessions.
*/
- public static class SessionListener extends BlockingSessionListener {
+ public static class SessionListener extends BlockingSessionCallback {
private final LinkedBlockingQueue<CameraCaptureSession> mSessionQueue =
new LinkedBlockingQueue<>();
@@ -91,7 +91,7 @@
/**
* A blocking listener class for synchronously capturing and results with a session.
*/
- public static class CaptureListener extends BlockingCaptureListener {
+ public static class CaptureCallback extends BlockingCaptureCallback {
private final LinkedBlockingQueue<TotalCaptureResult> mResultQueue =
new LinkedBlockingQueue<>();
private final LinkedBlockingQueue<Long> mCaptureTimeQueue =
@@ -138,14 +138,14 @@
}
/**
- * Get a mocked {@link CaptureListener}.
+ * Get a mocked {@link CaptureCallback}.
*/
- public static CaptureListener getMockCaptureListener() {
- return spy(new CaptureListener());
+ public static CaptureCallback getMockCaptureListener() {
+ return spy(new CaptureCallback());
}
/**
- * Get a mocked {@link CaptureListener}.
+ * Get a mocked {@link CaptureCallback}.
*/
public static SessionListener getMockSessionListener() {
return spy(new SessionListener());
@@ -200,7 +200,7 @@
* {@link CameraTestUtils#CAPTURE_RESULT_TIMEOUT_MS}.
* </p>
*
- * @param listener a {@link CaptureListener} to use for callbacks.
+ * @param listener a {@link CaptureCallback} to use for callbacks.
* @param session the {@link CameraCaptureSession} to use.
* @param request the {@link CaptureRequest} to capture with.
* @param handler the {@link Handler} to call callbacks on.
@@ -209,7 +209,7 @@
* @throws CameraAccessException if any of the {@link CameraDevice} methods fail.
* @throws TimeoutRuntimeException if no result was received before the timeout.
*/
- public static Pair<TotalCaptureResult, Long> captureAndVerifyResult(CaptureListener listener,
+ public static Pair<TotalCaptureResult, Long> captureAndVerifyResult(CaptureCallback listener,
CameraCaptureSession session, CaptureRequest request, Handler handler)
throws CameraAccessException {
checkNotNull(listener);
diff --git a/tests/tests/hardware/src/android/hardware/camera2/cts/testcases/Camera2AndroidTestCase.java b/tests/tests/hardware/src/android/hardware/camera2/cts/testcases/Camera2AndroidTestCase.java
index ed75d6c..5fc6321 100644
--- a/tests/tests/hardware/src/android/hardware/camera2/cts/testcases/Camera2AndroidTestCase.java
+++ b/tests/tests/hardware/src/android/hardware/camera2/cts/testcases/Camera2AndroidTestCase.java
@@ -17,11 +17,11 @@
package android.hardware.camera2.cts.testcases;
import static android.hardware.camera2.cts.CameraTestUtils.*;
-import static com.android.ex.camera2.blocking.BlockingStateListener.*;
+import static com.android.ex.camera2.blocking.BlockingStateCallback.*;
import android.content.Context;
import android.hardware.camera2.CameraCaptureSession;
-import android.hardware.camera2.CameraCaptureSession.CaptureListener;
+import android.hardware.camera2.CameraCaptureSession.CaptureCallback;
import android.hardware.camera2.CameraDevice;
import android.hardware.camera2.CameraManager;
import android.hardware.camera2.CaptureRequest;
@@ -39,8 +39,8 @@
import android.util.Log;
import android.view.Surface;
-import com.android.ex.camera2.blocking.BlockingSessionListener;
-import com.android.ex.camera2.blocking.BlockingStateListener;
+import com.android.ex.camera2.blocking.BlockingSessionCallback;
+import com.android.ex.camera2.blocking.BlockingStateCallback;
import java.util.List;
@@ -57,8 +57,8 @@
protected CameraManager mCameraManager;
protected CameraDevice mCamera;
protected CameraCaptureSession mCameraSession;
- protected BlockingSessionListener mCameraSessionListener;
- protected BlockingStateListener mCameraListener;
+ protected BlockingSessionCallback mCameraSessionListener;
+ protected BlockingStateCallback mCameraListener;
protected String[] mCameraIds;
protected ImageReader mReader;
protected Surface mReaderSurface;
@@ -79,7 +79,7 @@
/**
* Set up the camera2 test case required environments, including CameraManager,
- * HandlerThread, Camera IDs, and CameraStateListener etc.
+ * HandlerThread, Camera IDs, and CameraStateCallback etc.
*/
@Override
protected void setUp() throws Exception {
@@ -98,7 +98,7 @@
mHandlerThread = new HandlerThread(TAG);
mHandlerThread.start();
mHandler = new Handler(mHandlerThread.getLooper());
- mCameraListener = new BlockingStateListener();
+ mCameraListener = new BlockingStateCallback();
mCollector = new CameraErrorCollector();
}
@@ -123,11 +123,11 @@
*
* @param request The {@link #CaptureRequest} to be captured.
* @param repeating If the capture is single capture or repeating.
- * @param listener The {@link #CaptureListener} camera device used to notify callbacks.
+ * @param listener The {@link #CaptureCallback} camera device used to notify callbacks.
* @param handler The handler camera device used to post callbacks.
*/
protected void startCapture(CaptureRequest request, boolean repeating,
- CaptureListener listener, Handler handler) throws Exception {
+ CaptureCallback listener, Handler handler) throws Exception {
if (VERBOSE) Log.v(TAG, "Starting capture from device");
if (repeating) {
@@ -153,11 +153,11 @@
*/
mCameraSession.abortCaptures();
mCameraSessionListener.getStateWaiter().
- waitForState(BlockingSessionListener.SESSION_READY, CAMERA_IDLE_TIMEOUT_MS);
+ waitForState(BlockingSessionCallback.SESSION_READY, CAMERA_IDLE_TIMEOUT_MS);
} else {
mCameraSession.close();
mCameraSessionListener.getStateWaiter().
- waitForState(BlockingSessionListener.SESSION_CLOSED, CAMERA_IDLE_TIMEOUT_MS);
+ waitForState(BlockingSessionCallback.SESSION_CLOSED, CAMERA_IDLE_TIMEOUT_MS);
}
}
@@ -175,9 +175,9 @@
* Open a {@link #CameraDevice} and get the StaticMetadata for a given camera id and listener.
*
* @param cameraId The id of the camera device to be opened.
- * @param listener The {@link #BlockingStateListener} used to wait for states.
+ * @param listener The {@link #BlockingStateCallback} used to wait for states.
*/
- protected void openDevice(String cameraId, BlockingStateListener listener) throws Exception {
+ protected void openDevice(String cameraId, BlockingStateCallback listener) throws Exception {
mCamera = CameraTestUtils.openCamera(
mCameraManager, cameraId, listener, mHandler);
mCollector.setCameraId(cameraId);
@@ -199,7 +199,7 @@
* @param outputSurfaces The set of output surfaces to configure for this session
*/
protected void createSession(List<Surface> outputSurfaces) throws Exception {
- mCameraSessionListener = new BlockingSessionListener();
+ mCameraSessionListener = new BlockingSessionCallback();
mCameraSession = CameraTestUtils.configureCameraSession(mCamera, outputSurfaces,
mCameraSessionListener, mHandler);
}
@@ -227,9 +227,9 @@
* </p>
*
* @param cameraId The id of the camera device to be closed.
- * @param listener The BlockingStateListener used to wait for states.
+ * @param listener The BlockingStateCallback used to wait for states.
*/
- protected void closeDevice(String cameraId, BlockingStateListener listener) {
+ protected void closeDevice(String cameraId, BlockingStateCallback listener) {
if (mCamera != null) {
if (!cameraId.equals(mCamera.getId())) {
throw new IllegalStateException("Try to close a device that is not opened yet");
diff --git a/tests/tests/hardware/src/android/hardware/camera2/cts/testcases/Camera2MultiViewTestCase.java b/tests/tests/hardware/src/android/hardware/camera2/cts/testcases/Camera2MultiViewTestCase.java
index f7d743e..ce0bd7b 100644
--- a/tests/tests/hardware/src/android/hardware/camera2/cts/testcases/Camera2MultiViewTestCase.java
+++ b/tests/tests/hardware/src/android/hardware/camera2/cts/testcases/Camera2MultiViewTestCase.java
@@ -17,8 +17,8 @@
package android.hardware.camera2.cts.testcases;
import static android.hardware.camera2.cts.CameraTestUtils.*;
-import static com.android.ex.camera2.blocking.BlockingSessionListener.*;
-import static com.android.ex.camera2.blocking.BlockingStateListener.*;
+import static com.android.ex.camera2.blocking.BlockingSessionCallback.*;
+import static com.android.ex.camera2.blocking.BlockingStateCallback.*;
import android.content.Context;
import android.content.res.Configuration;
@@ -26,7 +26,7 @@
import android.graphics.RectF;
import android.graphics.SurfaceTexture;
import android.hardware.camera2.CameraCaptureSession;
-import android.hardware.camera2.CameraCaptureSession.CaptureListener;
+import android.hardware.camera2.CameraCaptureSession.CaptureCallback;
import android.hardware.camera2.CameraDevice;
import android.hardware.camera2.CameraManager;
import android.hardware.camera2.CaptureRequest;
@@ -45,8 +45,8 @@
import android.view.TextureView;
import com.android.ex.camera2.blocking.BlockingCameraManager;
-import com.android.ex.camera2.blocking.BlockingSessionListener;
-import com.android.ex.camera2.blocking.BlockingStateListener;
+import com.android.ex.camera2.blocking.BlockingSessionCallback;
+import com.android.ex.camera2.blocking.BlockingStateCallback;
import junit.framework.Assert;
@@ -71,7 +71,7 @@
protected Handler mHandler;
private CameraManager mCameraManager;
- private BlockingStateListener mCameraListener;
+ private BlockingStateCallback mCameraListener;
private HandlerThread mHandlerThread;
private Context mContext;
@@ -94,7 +94,7 @@
mHandlerThread = new HandlerThread(TAG);
mHandlerThread.start();
mHandler = new Handler(mHandlerThread.getLooper());
- mCameraListener = new BlockingStateListener();
+ mCameraListener = new BlockingStateCallback();
Camera2MultiViewStubActivity activity = (Camera2MultiViewStubActivity) mContext;
mTextureView[0] = activity.getTextureView(0);
mTextureView[1] = activity.getTextureView(1);
@@ -229,7 +229,7 @@
}
protected void startPreview(
- String cameraId, List<Surface> outputSurfaces, CaptureListener listener)
+ String cameraId, List<Surface> outputSurfaces, CaptureCallback listener)
throws Exception {
CameraHolder camera = getCameraHolder(cameraId);
assertTrue("Camera " + cameraId + " is not openned", camera.isOpenned());
@@ -339,7 +339,7 @@
private CameraDevice mCamera;
private StaticMetadata mStaticInfo;
private List<Size> mOrderedPreviewSizes;
- private BlockingSessionListener mSessionListener;
+ private BlockingSessionCallback mSessionListener;
public CameraHolder(String id){
mCameraId = id;
@@ -380,9 +380,9 @@
mOrderedPreviewSizes = null;
}
- public void startPreview(List<Surface> outputSurfaces, CaptureListener listener)
+ public void startPreview(List<Surface> outputSurfaces, CaptureCallback listener)
throws Exception {
- mSessionListener = new BlockingSessionListener();
+ mSessionListener = new BlockingSessionCallback();
mSession = configureCameraSession(mCamera, outputSurfaces, mSessionListener, mHandler);
// TODO: vary the different settings like crop region to cover more cases.
diff --git a/tests/tests/hardware/src/android/hardware/camera2/cts/testcases/Camera2SurfaceViewTestCase.java b/tests/tests/hardware/src/android/hardware/camera2/cts/testcases/Camera2SurfaceViewTestCase.java
index 9232151..bd8b546 100644
--- a/tests/tests/hardware/src/android/hardware/camera2/cts/testcases/Camera2SurfaceViewTestCase.java
+++ b/tests/tests/hardware/src/android/hardware/camera2/cts/testcases/Camera2SurfaceViewTestCase.java
@@ -17,7 +17,7 @@
package android.hardware.camera2.cts.testcases;
import static android.hardware.camera2.cts.CameraTestUtils.*;
-import static com.android.ex.camera2.blocking.BlockingStateListener.STATE_CLOSED;
+import static com.android.ex.camera2.blocking.BlockingStateCallback.STATE_CLOSED;
import android.hardware.camera2.params.StreamConfigurationMap;
import android.media.ImageReader;
@@ -33,7 +33,7 @@
import android.graphics.ImageFormat;
import android.hardware.camera2.CameraAccessException;
import android.hardware.camera2.CameraCaptureSession;
-import android.hardware.camera2.CameraCaptureSession.CaptureListener;
+import android.hardware.camera2.CameraCaptureSession.CaptureCallback;
import android.hardware.camera2.CameraDevice;
import android.hardware.camera2.CameraManager;
import android.hardware.camera2.CameraMetadata;
@@ -43,13 +43,13 @@
import android.util.Range;
import android.hardware.camera2.cts.Camera2SurfaceViewStubActivity;
import android.hardware.camera2.cts.CameraTestUtils;
-import android.hardware.camera2.cts.CameraTestUtils.SimpleCaptureListener;
+import android.hardware.camera2.cts.CameraTestUtils.SimpleCaptureCallback;
import android.hardware.camera2.cts.helpers.CameraErrorCollector;
import android.hardware.camera2.cts.helpers.StaticMetadata;
import android.hardware.camera2.cts.helpers.StaticMetadata.CheckLevel;
-import com.android.ex.camera2.blocking.BlockingSessionListener;
-import com.android.ex.camera2.blocking.BlockingStateListener;
+import com.android.ex.camera2.blocking.BlockingSessionCallback;
+import com.android.ex.camera2.blocking.BlockingStateCallback;
import com.android.ex.camera2.exceptions.TimeoutRuntimeException;
import java.util.ArrayList;
@@ -61,7 +61,7 @@
*
* <p>This class encapsulates the SurfaceView based preview common functionalities.
* The setup and teardown of CameraManager, test HandlerThread, Activity, Camera IDs
- * and CameraStateListener are handled in this class. Some basic preview related utility
+ * and CameraStateCallback are handled in this class. Some basic preview related utility
* functions are provided to facilitate the derived preview-based test classes.
* </p>
*/
@@ -85,8 +85,8 @@
protected String[] mCameraIds;
protected HandlerThread mHandlerThread;
protected Handler mHandler;
- protected BlockingStateListener mCameraListener;
- protected BlockingSessionListener mSessionListener;
+ protected BlockingStateCallback mCameraListener;
+ protected BlockingSessionCallback mSessionListener;
protected CameraErrorCollector mCollector;
// Per device fields:
protected StaticMetadata mStaticInfo;
@@ -110,7 +110,7 @@
protected void setUp() throws Exception {
/**
* Set up the camera preview required environments, including activity,
- * CameraManager, HandlerThread, Camera IDs, and CameraStateListener.
+ * CameraManager, HandlerThread, Camera IDs, and CameraStateCallback.
*/
super.setUp();
mContext = getActivity();
@@ -128,7 +128,7 @@
mHandlerThread = new HandlerThread(TAG);
mHandlerThread.start();
mHandler = new Handler(mHandlerThread.getLooper());
- mCameraListener = new BlockingStateListener();
+ mCameraListener = new BlockingStateCallback();
mCollector = new CameraErrorCollector();
}
@@ -164,7 +164,7 @@
* capture is available.
*/
protected void startPreview(CaptureRequest.Builder request, Size previewSz,
- CaptureListener listener) throws Exception {
+ CaptureCallback listener) throws Exception {
// Update preview size.
updatePreviewSurface(previewSz);
if (VERBOSE) {
@@ -185,7 +185,7 @@
throws CameraAccessException {
List<Surface> outputSurfaces = new ArrayList<Surface>(/*capacity*/1);
outputSurfaces.add(mPreviewSurface);
- mSessionListener = new BlockingSessionListener();
+ mSessionListener = new BlockingSessionCallback();
mSession = configureCameraSession(mCamera, outputSurfaces, mSessionListener, mHandler);
request.addTarget(mPreviewSurface);
@@ -233,7 +233,7 @@
*/
protected void prepareStillCaptureAndStartPreview(CaptureRequest.Builder previewRequest,
CaptureRequest.Builder stillRequest, Size previewSz, Size stillSz,
- CaptureListener resultListener,
+ CaptureCallback resultListener,
ImageReader.OnImageAvailableListener imageListener) throws Exception {
prepareCaptureAndStartPreview(previewRequest, stillRequest, previewSz, stillSz,
ImageFormat.JPEG, resultListener, MAX_READER_IMAGES, imageListener);
@@ -252,7 +252,7 @@
*/
protected void prepareStillCaptureAndStartPreview(CaptureRequest.Builder previewRequest,
CaptureRequest.Builder stillRequest, Size previewSz, Size stillSz,
- CaptureListener resultListener, int maxNumImages,
+ CaptureCallback resultListener, int maxNumImages,
ImageReader.OnImageAvailableListener imageListener) throws Exception {
prepareCaptureAndStartPreview(previewRequest, stillRequest, previewSz, stillSz,
ImageFormat.JPEG, resultListener, maxNumImages, imageListener);
@@ -274,7 +274,7 @@
*/
protected void prepareRawCaptureAndStartPreview(CaptureRequest.Builder previewRequest,
CaptureRequest.Builder rawRequest, Size previewSz, Size rawSz,
- CaptureListener resultListener,
+ CaptureCallback resultListener,
ImageReader.OnImageAvailableListener imageListener) throws Exception {
prepareCaptureAndStartPreview(previewRequest, rawRequest, previewSz, rawSz,
ImageFormat.RAW_SENSOR, resultListener, MAX_READER_IMAGES, imageListener);
@@ -295,7 +295,7 @@
* seen before the result matching myRequest arrives, or each individual wait
* for result times out after {@value #WAIT_FOR_RESULT_TIMEOUT_MS}ms.
*/
- protected static <T> void waitForResultValue(SimpleCaptureListener listener,
+ protected static <T> void waitForResultValue(SimpleCaptureCallback listener,
CaptureResult.Key<T> resultKey,
T expectedValue, int numResultsWait) {
List<T> expectedValues = new ArrayList<T>();
@@ -319,7 +319,7 @@
* seen before the result matching myRequest arrives, or each individual wait
* for result times out after {@value #WAIT_FOR_RESULT_TIMEOUT_MS}ms.
*/
- protected static <T> void waitForAnyResultValue(SimpleCaptureListener listener,
+ protected static <T> void waitForAnyResultValue(SimpleCaptureCallback listener,
CaptureResult.Key<T> resultKey,
List<T> expectedValues, int numResultsWait) {
if (numResultsWait < 0 || listener == null || expectedValues == null) {
@@ -370,7 +370,7 @@
* @throws CameraAccessException if capturing failed
*/
protected int captureRequestsSynchronized(
- CaptureRequest request, CaptureListener listener, Handler handler)
+ CaptureRequest request, CaptureCallback listener, Handler handler)
throws CameraAccessException {
return captureRequestsSynchronized(request, /*count*/1, listener, handler);
}
@@ -398,7 +398,7 @@
* @throws CameraAccessException if capturing failed
*/
protected int captureRequestsSynchronized(
- CaptureRequest request, int count, CaptureListener listener, Handler handler)
+ CaptureRequest request, int count, CaptureCallback listener, Handler handler)
throws CameraAccessException {
if (count < 1) {
throw new IllegalArgumentException("count must be positive");
@@ -428,7 +428,7 @@
*
* @return the last result, or {@code null} if there was none
*/
- protected static CaptureResult waitForNumResults(SimpleCaptureListener resultListener,
+ protected static CaptureResult waitForNumResults(SimpleCaptureCallback resultListener,
int numResultsWait) {
if (numResultsWait < 0 || resultListener == null) {
throw new IllegalArgumentException(
@@ -450,7 +450,7 @@
* @param numResultWaitForUnknownLatency Number of frame to wait if camera device latency is
* unknown.
*/
- protected void waitForSettingsApplied(SimpleCaptureListener resultListener,
+ protected void waitForSettingsApplied(SimpleCaptureCallback resultListener,
int numResultWaitForUnknownLatency) {
int maxLatency = mStaticInfo.getSyncMaxLatency();
if (maxLatency == CameraMetadata.SYNC_MAX_LATENCY_UNKNOWN) {
@@ -475,7 +475,7 @@
* @param numResultWaitForUnknownLatency Number of frame to wait if camera device latency is
* unknown.
*/
- protected void waitForAeStable(SimpleCaptureListener resultListener,
+ protected void waitForAeStable(SimpleCaptureCallback resultListener,
int numResultWaitForUnknownLatency) {
waitForSettingsApplied(resultListener, numResultWaitForUnknownLatency);
@@ -504,7 +504,7 @@
* @param numResultWaitForUnknownLatency Number of frame to wait if camera device latency is
* unknown.
*/
- protected void waitForAeLocked(SimpleCaptureListener resultListener,
+ protected void waitForAeLocked(SimpleCaptureCallback resultListener,
int numResultWaitForUnknownLatency) {
waitForSettingsApplied(resultListener, numResultWaitForUnknownLatency);
@@ -629,7 +629,7 @@
*/
protected void prepareCaptureAndStartPreview(CaptureRequest.Builder previewRequest,
CaptureRequest.Builder stillRequest, Size previewSz, Size captureSz, int format,
- CaptureListener resultListener, int maxNumImages,
+ CaptureCallback resultListener, int maxNumImages,
ImageReader.OnImageAvailableListener imageListener) throws Exception {
if (VERBOSE) {
Log.v(TAG, String.format("Prepare single capture (%s) and preview (%s)",
@@ -646,7 +646,7 @@
List<Surface> outputSurfaces = new ArrayList<Surface>();
outputSurfaces.add(mPreviewSurface);
outputSurfaces.add(mReaderSurface);
- mSessionListener = new BlockingSessionListener();
+ mSessionListener = new BlockingSessionCallback();
mSession = configureCameraSession(mCamera, outputSurfaces, mSessionListener, mHandler);
// Configure the requests.
diff --git a/tests/tests/hardware/src/android/hardware/cts/Camera_SizeTest.java b/tests/tests/hardware/src/android/hardware/cts/Camera_SizeTest.java
index 72d4ba3..827ab76 100644
--- a/tests/tests/hardware/src/android/hardware/cts/Camera_SizeTest.java
+++ b/tests/tests/hardware/src/android/hardware/cts/Camera_SizeTest.java
@@ -17,14 +17,20 @@
package android.hardware.cts;
+import android.cts.util.CtsAndroidTestCase;
import android.hardware.Camera;
import android.hardware.Camera.Parameters;
+import android.hardware.cts.helpers.CameraUtils;
import android.test.suitebuilder.annotation.LargeTest;
-import junit.framework.TestCase;
+import junit.framework.Test;
+import junit.framework.TestSuite;
+
+import java.util.Collections;
+import java.util.List;
@LargeTest
-public class Camera_SizeTest extends TestCase {
+public class Camera_SizeTest extends CtsAndroidTestCase {
private final int HEIGHT1 = 320;
private final int WIDTH1 = 240;
@@ -33,6 +39,8 @@
private final int HEIGHT3 = 640;
private final int WIDTH3 = 480;
+ private static final float ASPECT_RATIO_TOLERANCE = 0.05f;
+
public void testConstructor() {
if (Camera.getNumberOfCameras() < 1) {
return;
@@ -48,10 +56,61 @@
camera.release();
}
+ /**
+ * Check that the largest available preview and jpeg outputs have the same aspect ratio. This
+ * aspect ratio must be the same as the physical camera sensor, and the FOV for these outputs
+ * must not be cropped.
+ *
+ * This is only required for backward compatibility of the Camera2 API when running in LEGACY
+ * mode.
+ *
+ * @see {@link android.hardware.camera2.CameraCharacteristics#INFO_SUPPORTED_HARDWARE_LEVEL}
+ */
+ public void testMaxAspectRatios() throws Exception {
+ for (int id = 0; id < Camera.getNumberOfCameras(); ++id) {
+ if (CameraUtils.isLegacyHAL(getContext(), id)) {
+
+ Camera camera = Camera.open(id);
+ Parameters parameters = camera.getParameters();
+
+ List<Camera.Size> supportedJpegDimens = parameters.getSupportedPictureSizes();
+ List<Camera.Size> supportedPreviewDimens = parameters.getSupportedPreviewSizes();
+
+ Collections.sort(supportedJpegDimens, new CameraUtils.LegacySizeComparator());
+ Collections.sort(supportedPreviewDimens, new CameraUtils.LegacySizeComparator());
+
+ Camera.Size largestJpegDimen =
+ supportedJpegDimens.get(supportedJpegDimens.size() - 1);
+ Camera.Size largestPreviewDimen =
+ supportedPreviewDimens.get(supportedPreviewDimens.size() - 1);
+
+ float jpegAspect = largestJpegDimen.width / (float) largestJpegDimen.height;
+ float previewAspect =
+ largestPreviewDimen.width / (float) largestPreviewDimen.height;
+
+ assertTrue("Largest preview dimension (w=" + largestPreviewDimen.width + ", h=" +
+ largestPreviewDimen.height + ") must have the same aspect ratio " +
+ "as the largest Jpeg dimension (w=" + largestJpegDimen.width +
+ ", h=" + largestJpegDimen.height + ")",
+ Math.abs(jpegAspect - previewAspect) < ASPECT_RATIO_TOLERANCE
+ );
+
+
+ camera.release();
+ }
+ }
+ }
+
private void checkSize(Parameters parameters, int width, int height) {
parameters.setPictureSize(width, height);
assertEquals(width, parameters.getPictureSize().width);
assertEquals(height, parameters.getPictureSize().height);
}
+
+ private static void addTestToSuite(TestSuite testSuite, String testName) {
+ Camera_SizeTest test = new Camera_SizeTest();
+ test.setName(testName);
+ testSuite.addTest(test);
+ }
}
diff --git a/tests/tests/hardware/src/android/hardware/cts/SensorTest.java b/tests/tests/hardware/src/android/hardware/cts/SensorTest.java
index af881b4..5006d55 100644
--- a/tests/tests/hardware/src/android/hardware/cts/SensorTest.java
+++ b/tests/tests/hardware/src/android/hardware/cts/SensorTest.java
@@ -16,12 +16,7 @@
package android.hardware.cts;
-import java.lang.IllegalArgumentException;
-import java.lang.Override;
-import java.util.ArrayList;
-import java.util.List;
-import java.util.concurrent.CountDownLatch;
-import java.util.concurrent.TimeUnit;
+import com.android.cts.util.TimeoutReq;
import android.content.Context;
import android.content.pm.PackageManager;
@@ -36,12 +31,13 @@
import android.os.HandlerThread;
import android.os.PowerManager;
import android.os.SystemClock;
-import android.test.AndroidTestCase;
import android.util.Log;
-import com.android.cts.util.TimeoutReq;
+import java.util.List;
+import java.util.concurrent.CountDownLatch;
+import java.util.concurrent.TimeUnit;
-public class SensorTest extends AndroidTestCase {
+public class SensorTest extends SensorTestCase {
private SensorManager mSensorManager;
private TriggerListener mTriggerListener;
private SensorListener mSensorListener;
diff --git a/tests/tests/hardware/src/android/hardware/cts/SensorTestCase.java b/tests/tests/hardware/src/android/hardware/cts/SensorTestCase.java
index 222da56..aee00ed 100644
--- a/tests/tests/hardware/src/android/hardware/cts/SensorTestCase.java
+++ b/tests/tests/hardware/src/android/hardware/cts/SensorTestCase.java
@@ -16,21 +16,22 @@
package android.hardware.cts;
-import android.app.Instrumentation;
-import android.cts.util.CtsAndroidTestCase;
-import android.cts.util.DeviceReportLog;
-import android.hardware.cts.helpers.SensorNotSupportedException;
-import android.hardware.cts.helpers.SensorStats;
-import android.util.Log;
-
import com.android.cts.util.ReportLog;
import com.android.cts.util.ResultType;
import com.android.cts.util.ResultUnit;
+import android.app.Instrumentation;
+import android.cts.util.DeviceReportLog;
+import android.hardware.cts.helpers.SensorNotSupportedException;
+import android.hardware.cts.helpers.SensorStats;
+import android.test.AndroidTestCase;
+import android.util.Log;
+
/**
* Test Case class that handles gracefully sensors that are not available in the device.
*/
-public abstract class SensorTestCase extends CtsAndroidTestCase {
+public abstract class SensorTestCase extends AndroidTestCase {
+ // TODO: consolidate all log tags
protected final String LOG_TAG = "TestRunner";
protected SensorTestCase() {}
diff --git a/tests/tests/hardware/src/android/hardware/cts/SingleSensorTests.java b/tests/tests/hardware/src/android/hardware/cts/SingleSensorTests.java
index d33a108..cc7f71c 100644
--- a/tests/tests/hardware/src/android/hardware/cts/SingleSensorTests.java
+++ b/tests/tests/hardware/src/android/hardware/cts/SingleSensorTests.java
@@ -648,10 +648,6 @@
op.setLogEvents(true);
try {
op.execute();
-
- // Only report stats if it passes.
- logSelectedStatsToReportLog(getInstrumentation(), 2, STAT_KEYS,
- op.getStats());
} finally {
SensorStats.logStats(TAG, op.getStats());
@@ -667,8 +663,6 @@
String fileName = String.format("single_sensor_%s_%s%s.txt",
sensorName, sensorRate, batching);
SensorStats.logStatsToFile(fileName, op.getStats());
-
-
}
}
}
diff --git a/tests/tests/hardware/src/android/hardware/cts/helpers/CameraUtils.java b/tests/tests/hardware/src/android/hardware/cts/helpers/CameraUtils.java
new file mode 100644
index 0000000..aaf9590
--- /dev/null
+++ b/tests/tests/hardware/src/android/hardware/cts/helpers/CameraUtils.java
@@ -0,0 +1,76 @@
+/*
+ * Copyright 2014 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.hardware.cts.helpers;
+
+import android.content.Context;
+import android.hardware.Camera;
+import android.hardware.camera2.CameraCharacteristics;
+import android.hardware.camera2.CameraManager;
+
+import java.util.Comparator;
+
+/**
+ * Utility class containing helper functions for the Camera CTS tests.
+ */
+public class CameraUtils {
+
+ /**
+ * Returns {@code true} if this device only supports {@code LEGACY} mode operation in the
+ * Camera2 API for the given camera ID.
+ *
+ * @param context {@link Context} to access the {@link CameraManager} in.
+ * @param cameraId the ID of the camera device to check.
+ * @return {@code true} if this device only supports {@code LEGACY} mode.
+ */
+ public static boolean isLegacyHAL(Context context, int cameraId) throws Exception {
+ CameraManager manager = (CameraManager) context.getSystemService(Context.CAMERA_SERVICE);
+ CameraCharacteristics characteristics =
+ manager.getCameraCharacteristics(Integer.toString(cameraId));
+
+ return characteristics.get(CameraCharacteristics.INFO_SUPPORTED_HARDWARE_LEVEL) ==
+ CameraCharacteristics.INFO_SUPPORTED_HARDWARE_LEVEL_LEGACY;
+ }
+
+ /**
+ * Shared size comparison method used by size comparators.
+ *
+ * <p>Compares the number of pixels it covers.If two the areas of two sizes are same, compare
+ * the widths.</p>
+ */
+ public static int compareSizes(int widthA, int heightA, int widthB, int heightB) {
+ long left = widthA * (long) heightA;
+ long right = widthB * (long) heightB;
+ if (left == right) {
+ left = widthA;
+ right = widthB;
+ }
+ return (left < right) ? -1 : (left > right ? 1 : 0);
+ }
+
+ /**
+ * Size comparator that compares the number of pixels it covers.
+ *
+ * <p>If two the areas of two sizes are same, compare the widths.</p>
+ */
+ public static class LegacySizeComparator implements Comparator<Camera.Size> {
+ @Override
+ public int compare(Camera.Size lhs, Camera.Size rhs) {
+ return compareSizes(lhs.width, lhs.height, rhs.width, rhs.height);
+ }
+ }
+
+}
diff --git a/tests/tests/hardware/src/android/hardware/cts/helpers/TestSensorEventListener.java b/tests/tests/hardware/src/android/hardware/cts/helpers/TestSensorEventListener.java
index ddbc8c2..f06b9d7 100644
--- a/tests/tests/hardware/src/android/hardware/cts/helpers/TestSensorEventListener.java
+++ b/tests/tests/hardware/src/android/hardware/cts/helpers/TestSensorEventListener.java
@@ -16,13 +16,13 @@
package android.hardware.cts.helpers;
+import junit.framework.Assert;
+
import android.hardware.Sensor;
import android.hardware.SensorEvent;
import android.hardware.SensorEventListener2;
import android.util.Log;
-import junit.framework.Assert;
-
import java.util.Arrays;
import java.util.concurrent.CountDownLatch;
import java.util.concurrent.TimeUnit;
@@ -59,7 +59,16 @@
* Construct a {@link TestSensorEventListener} that wraps a {@link SensorEventListener2}.
*/
public TestSensorEventListener(SensorEventListener2 listener) {
- mListener = listener;
+ if (listener != null) {
+ mListener = listener;
+ } else {
+ // use a Null Object to simplify handling the listener
+ mListener = new SensorEventListener2() {
+ public void onFlushCompleted(Sensor sensor) {}
+ public void onSensorChanged(SensorEvent sensorEvent) {}
+ public void onAccuracyChanged(Sensor sensor, int i) {}
+ };
+ }
}
/**
@@ -83,12 +92,11 @@
*/
@Override
public void onSensorChanged(SensorEvent event) {
- if(mEventLatch != null) {
- mEventLatch.countDown();
+ CountDownLatch eventLatch = mEventLatch;
+ if(eventLatch != null) {
+ eventLatch.countDown();
}
- if (mListener != null) {
- mListener.onSensorChanged(event);
- }
+ mListener.onSensorChanged(event);
if (mLogEvents) {
StringBuilder valuesSb = new StringBuilder();
if (event.values.length == 1) {
@@ -113,9 +121,7 @@
*/
@Override
public void onAccuracyChanged(Sensor sensor, int accuracy) {
- if (mListener != null) {
- mListener.onAccuracyChanged(sensor, accuracy);
- }
+ mListener.onAccuracyChanged(sensor, accuracy);
}
/**
@@ -128,15 +134,13 @@
if(latch != null) {
latch.countDown();
}
- if (mListener != null) {
- mListener.onFlushCompleted(sensor);
- }
+ mListener.onFlushCompleted(sensor);
}
/**
* Wait for {@link #onFlushCompleted(Sensor)} to be called.
*
- * @throws AssertionError if there was a timeout after {@value #FLUSH_TIMEOUT_US} µs
+ * @throws AssertionError if there was a timeout after {@link #FLUSH_TIMEOUT_US} µs
*/
public void waitForFlushComplete() {
CountDownLatch latch = mFlushLatch;
@@ -154,7 +158,7 @@
/**
* Collect a specific number of {@link TestSensorEvent}s.
*
- * @throws AssertionError if there was a timeout after {@value #FLUSH_TIMEOUT_US} µs
+ * @throws AssertionError if there was a timeout after {@link #FLUSH_TIMEOUT_US} µs
*/
public void waitForEvents(int eventCount) {
mEventLatch = new CountDownLatch(eventCount);
diff --git a/tests/tests/media/src/android/media/cts/EncodeVirtualDisplayWithCompositionTest.java b/tests/tests/media/src/android/media/cts/EncodeVirtualDisplayWithCompositionTest.java
index 6635c12..369ae6e 100644
--- a/tests/tests/media/src/android/media/cts/EncodeVirtualDisplayWithCompositionTest.java
+++ b/tests/tests/media/src/android/media/cts/EncodeVirtualDisplayWithCompositionTest.java
@@ -593,6 +593,9 @@
mEventListener.onBufferReady(encodedData, info);
mEncoder.releaseOutputBuffer(index, false);
}
+ } else if (index == MediaCodec.INFO_OUTPUT_BUFFERS_CHANGED){
+ Log.i(TAG, "output buffer changed");
+ encoderOutputBuffers = mEncoder.getOutputBuffers();
}
}
} catch (Exception e) {
diff --git a/tests/tests/permission/src/android/permission/cts/Camera2PermissionTest.java b/tests/tests/permission/src/android/permission/cts/Camera2PermissionTest.java
index f9e19e0..021a501 100644
--- a/tests/tests/permission/src/android/permission/cts/Camera2PermissionTest.java
+++ b/tests/tests/permission/src/android/permission/cts/Camera2PermissionTest.java
@@ -16,7 +16,7 @@
package android.permission.cts;
-import static com.android.ex.camera2.blocking.BlockingStateListener.*;
+import static com.android.ex.camera2.blocking.BlockingStateCallback.*;
import android.content.Context;
import android.hardware.camera2.CameraDevice;
@@ -27,7 +27,7 @@
import android.util.Log;
import com.android.ex.camera2.blocking.BlockingCameraManager;
-import com.android.ex.camera2.blocking.BlockingStateListener;
+import com.android.ex.camera2.blocking.BlockingStateCallback;
/**
* Tests for Camera2 API related Permissions. Currently, this means
@@ -40,7 +40,7 @@
private CameraManager mCameraManager;
private CameraDevice mCamera;
- private BlockingStateListener mCameraListener;
+ private BlockingStateCallback mCameraListener;
private String[] mCameraIds;
protected Handler mHandler;
protected HandlerThread mHandlerThread;
@@ -54,7 +54,7 @@
/**
* Set up the camera2 test case required environments, including CameraManager,
- * HandlerThread, Camera IDs, and CameraStateListener etc.
+ * HandlerThread, Camera IDs, and CameraStateCallback etc.
*/
@Override
protected void setUp() throws Exception {
@@ -64,7 +64,7 @@
mHandlerThread = new HandlerThread(TAG);
mHandlerThread.start();
mHandler = new Handler(mHandlerThread.getLooper());
- mCameraListener = new BlockingStateListener();
+ mCameraListener = new BlockingStateCallback();
}
@Override
@@ -96,20 +96,20 @@
/**
* Add and remove availability listeners should work without permission.
*/
- public void testAvailabilityListener() throws Exception {
+ public void testAvailabilityCallback() throws Exception {
DummyCameraListener availabilityListener = new DummyCameraListener();
// Remove a not-registered listener is a no-op.
- mCameraManager.removeAvailabilityListener(availabilityListener);
- mCameraManager.addAvailabilityListener(availabilityListener, mHandler);
- mCameraManager.removeAvailabilityListener(availabilityListener);
- mCameraManager.addAvailabilityListener(availabilityListener, mHandler);
- mCameraManager.addAvailabilityListener(availabilityListener, mHandler);
- mCameraManager.removeAvailabilityListener(availabilityListener);
+ mCameraManager.unregisterAvailabilityCallback(availabilityListener);
+ mCameraManager.registerAvailabilityCallback(availabilityListener, mHandler);
+ mCameraManager.unregisterAvailabilityCallback(availabilityListener);
+ mCameraManager.registerAvailabilityCallback(availabilityListener, mHandler);
+ mCameraManager.registerAvailabilityCallback(availabilityListener, mHandler);
+ mCameraManager.unregisterAvailabilityCallback(availabilityListener);
// Remove a previously-added listener second time is a no-op.
- mCameraManager.removeAvailabilityListener(availabilityListener);
+ mCameraManager.unregisterAvailabilityCallback(availabilityListener);
}
- private class DummyCameraListener extends CameraManager.AvailabilityListener {
+ private class DummyCameraListener extends CameraManager.AvailabilityCallback {
@Override
public void onCameraAvailable(String cameraId) {
}
@@ -132,4 +132,3 @@
}
}
}
-
diff --git a/tests/tests/permission/src/android/permission/cts/NoLocationPermissionTest.java b/tests/tests/permission/src/android/permission/cts/NoLocationPermissionTest.java
index b5a4f24..a2cbfb7 100644
--- a/tests/tests/permission/src/android/permission/cts/NoLocationPermissionTest.java
+++ b/tests/tests/permission/src/android/permission/cts/NoLocationPermissionTest.java
@@ -23,6 +23,7 @@
import android.location.Location;
import android.location.LocationListener;
import android.location.LocationManager;
+import android.os.Build;
import android.os.Bundle;
import android.os.Looper;
import android.telephony.PhoneStateListener;
@@ -280,9 +281,13 @@
}
/**
- * Helper method to verify that calling isProviderEnabled with given
- * provider throws SecurityException.
- *
+ * Helper method to verify that calling
+ * {@link LocationManager#isProviderEnabled(String)} with given
+ * provider completes without an exception. (Note that under the conditions
+ * of these tests, that method threw SecurityException on OS levels before
+ * {@link android.os.Build.VERSION_CODES#L}. See the method's javadoc for
+ * details.)
+ *
* @param provider the String provider name.
*/
private void checkIsProviderEnabled(String provider) {
@@ -290,13 +295,7 @@
// skip this test if the provider is unknown
return;
}
-
- try {
- mLocationManager.isProviderEnabled(provider);
- fail("LocationManager.isProviderEnabled did not throw SecurityException as expected");
- } catch (SecurityException e) {
- // expected
- }
+ mLocationManager.isProviderEnabled(provider);
}
/**
diff --git a/tests/tests/print/AndroidManifest.xml b/tests/tests/print/AndroidManifest.xml
index 4c94fd5..b4a2905 100644
--- a/tests/tests/print/AndroidManifest.xml
+++ b/tests/tests/print/AndroidManifest.xml
@@ -19,6 +19,8 @@
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.android.cts.print">
+ <uses-permission android:name="android.permission.DISABLE_KEYGUARD" />
+
<application android:allowBackup="false" >
<uses-library android:name="android.test.runner"/>
diff --git a/tests/tests/renderscript/Android.mk b/tests/tests/renderscript/Android.mk
index f3f5123..81434ee 100644
--- a/tests/tests/renderscript/Android.mk
+++ b/tests/tests/renderscript/Android.mk
@@ -30,8 +30,6 @@
LOCAL_SRC_FILES := $(call all-java-files-under, src) $(call all-renderscript-files-under, src)
-LOCAL_INSTRUMENTATION_FOR := CtsTestStubs
-
LOCAL_SDK_VERSION := current
include $(BUILD_CTS_PACKAGE)
diff --git a/tests/tests/renderscript/AndroidManifest.xml b/tests/tests/renderscript/AndroidManifest.xml
index 2a23090..b9405ca 100644
--- a/tests/tests/renderscript/AndroidManifest.xml
+++ b/tests/tests/renderscript/AndroidManifest.xml
@@ -28,7 +28,7 @@
<!-- This is a self-instrumenting test package. -->
<instrumentation android:name="android.support.test.runner.AndroidJUnitRunner"
- android:targetPackage="com.android.cts.stub"
+ android:targetPackage="com.android.cts.renderscript"
android:label="CTS tests of Renderscript component">
<meta-data android:name="listener"
android:value="com.android.cts.runner.CtsTestRunListener" />
diff --git a/tests/res/raw/leak.bc b/tests/tests/renderscript/res/raw/leak.bc
similarity index 100%
rename from tests/res/raw/leak.bc
rename to tests/tests/renderscript/res/raw/leak.bc
Binary files differ
diff --git a/tests/res/raw/set_target_api_11.bc b/tests/tests/renderscript/res/raw/set_target_api_11.bc
similarity index 100%
rename from tests/res/raw/set_target_api_11.bc
rename to tests/tests/renderscript/res/raw/set_target_api_11.bc
Binary files differ
diff --git a/tests/res/raw/set_target_api_12.bc b/tests/tests/renderscript/res/raw/set_target_api_12.bc
similarity index 100%
rename from tests/res/raw/set_target_api_12.bc
rename to tests/tests/renderscript/res/raw/set_target_api_12.bc
Binary files differ
diff --git a/tests/res/raw/set_target_api_13.bc b/tests/tests/renderscript/res/raw/set_target_api_13.bc
similarity index 100%
rename from tests/res/raw/set_target_api_13.bc
rename to tests/tests/renderscript/res/raw/set_target_api_13.bc
Binary files differ
diff --git a/tests/res/raw/set_target_api_14.bc b/tests/tests/renderscript/res/raw/set_target_api_14.bc
similarity index 100%
rename from tests/res/raw/set_target_api_14.bc
rename to tests/tests/renderscript/res/raw/set_target_api_14.bc
Binary files differ
diff --git a/tests/res/raw/set_target_api_15.bc b/tests/tests/renderscript/res/raw/set_target_api_15.bc
similarity index 100%
rename from tests/res/raw/set_target_api_15.bc
rename to tests/tests/renderscript/res/raw/set_target_api_15.bc
Binary files differ
diff --git a/tests/res/raw/set_target_api_16.bc b/tests/tests/renderscript/res/raw/set_target_api_16.bc
similarity index 100%
rename from tests/res/raw/set_target_api_16.bc
rename to tests/tests/renderscript/res/raw/set_target_api_16.bc
Binary files differ
diff --git a/tests/res/raw/set_target_api_17.bc b/tests/tests/renderscript/res/raw/set_target_api_17.bc
similarity index 100%
rename from tests/res/raw/set_target_api_17.bc
rename to tests/tests/renderscript/res/raw/set_target_api_17.bc
Binary files differ
diff --git a/tests/res/raw/set_target_api_18.bc b/tests/tests/renderscript/res/raw/set_target_api_18.bc
similarity index 100%
rename from tests/res/raw/set_target_api_18.bc
rename to tests/tests/renderscript/res/raw/set_target_api_18.bc
Binary files differ
diff --git a/tests/res/raw/set_target_api_19.bc b/tests/tests/renderscript/res/raw/set_target_api_19.bc
similarity index 100%
rename from tests/res/raw/set_target_api_19.bc
rename to tests/tests/renderscript/res/raw/set_target_api_19.bc
Binary files differ
diff --git a/tests/res/raw/set_target_api_too_high.bc b/tests/tests/renderscript/res/raw/set_target_api_too_high.bc
similarity index 100%
rename from tests/res/raw/set_target_api_too_high.bc
rename to tests/tests/renderscript/res/raw/set_target_api_too_high.bc
Binary files differ
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/AllocationCopy2DRangeTest.java b/tests/tests/renderscript/src/android/renderscript/cts/AllocationCopy2DRangeTest.java
index 3ac9834..a549906 100644
--- a/tests/tests/renderscript/src/android/renderscript/cts/AllocationCopy2DRangeTest.java
+++ b/tests/tests/renderscript/src/android/renderscript/cts/AllocationCopy2DRangeTest.java
@@ -20,7 +20,6 @@
import android.renderscript.Element;
import android.renderscript.Type;
import java.util.Random;
-import com.android.cts.stub.R;
public class AllocationCopy2DRangeTest extends RSBaseCompute {
private Allocation mInAllocation;
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/AllocationResize.java b/tests/tests/renderscript/src/android/renderscript/cts/AllocationResize.java
index 7c711f5..96045af 100644
--- a/tests/tests/renderscript/src/android/renderscript/cts/AllocationResize.java
+++ b/tests/tests/renderscript/src/android/renderscript/cts/AllocationResize.java
@@ -20,7 +20,6 @@
import android.renderscript.Allocation;
import android.renderscript.Element;
import android.renderscript.RSRuntimeException;
-import com.android.cts.stub.R;
import java.util.Random;
public class AllocationResize extends RSBaseCompute {
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/AllocationTest.java b/tests/tests/renderscript/src/android/renderscript/cts/AllocationTest.java
index 10d2673..7e867f7 100644
--- a/tests/tests/renderscript/src/android/renderscript/cts/AllocationTest.java
+++ b/tests/tests/renderscript/src/android/renderscript/cts/AllocationTest.java
@@ -16,8 +16,6 @@
package android.renderscript.cts;
-import com.android.cts.stub.R;
-
import android.graphics.Bitmap;
import android.renderscript.Allocation;
import android.renderscript.AllocationAdapter;
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/ClearObjectTest.java b/tests/tests/renderscript/src/android/renderscript/cts/ClearObjectTest.java
index e8a330a..9b1fbb7 100644
--- a/tests/tests/renderscript/src/android/renderscript/cts/ClearObjectTest.java
+++ b/tests/tests/renderscript/src/android/renderscript/cts/ClearObjectTest.java
@@ -22,7 +22,6 @@
import android.renderscript.Sampler;
import android.renderscript.Script;
import android.renderscript.RSRuntimeException;
-import com.android.cts.stub.R;
public class ClearObjectTest extends RSBaseCompute {
int ObjectNum = 1;
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/CompilerTest.java b/tests/tests/renderscript/src/android/renderscript/cts/CompilerTest.java
index adad6d5..9d119be 100644
--- a/tests/tests/renderscript/src/android/renderscript/cts/CompilerTest.java
+++ b/tests/tests/renderscript/src/android/renderscript/cts/CompilerTest.java
@@ -19,8 +19,6 @@
import android.renderscript.RSRuntimeException;
import android.util.Log;
-import com.android.cts.stub.R;
-
/**
* Test whether the driver properly handles compile-time issues.
*/
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/ComputeTest.java b/tests/tests/renderscript/src/android/renderscript/cts/ComputeTest.java
index e080f42..af176c2 100644
--- a/tests/tests/renderscript/src/android/renderscript/cts/ComputeTest.java
+++ b/tests/tests/renderscript/src/android/renderscript/cts/ComputeTest.java
@@ -48,8 +48,6 @@
import android.renderscript.Type;
-import com.android.cts.stub.R;
-
public class ComputeTest extends RSBaseCompute {
public void testJavaVectorTypes() {
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/ForEachTest.java b/tests/tests/renderscript/src/android/renderscript/cts/ForEachTest.java
index 4100f6e..b90633e 100644
--- a/tests/tests/renderscript/src/android/renderscript/cts/ForEachTest.java
+++ b/tests/tests/renderscript/src/android/renderscript/cts/ForEachTest.java
@@ -48,8 +48,6 @@
import android.renderscript.Type;
-import com.android.cts.stub.R;
-
public class ForEachTest extends RSBaseCompute {
/**
* Test support for reflected forEach() as well as validation of parameters.
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/GetAllocationTest.java b/tests/tests/renderscript/src/android/renderscript/cts/GetAllocationTest.java
index 047ca93..f938569 100644
--- a/tests/tests/renderscript/src/android/renderscript/cts/GetAllocationTest.java
+++ b/tests/tests/renderscript/src/android/renderscript/cts/GetAllocationTest.java
@@ -19,7 +19,6 @@
import android.renderscript.Allocation;
import android.renderscript.Element;
import android.renderscript.RSRuntimeException;
-import com.android.cts.stub.R;
import java.util.Random;
public class GetAllocationTest extends RSBaseCompute {
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/GetElementAt.java b/tests/tests/renderscript/src/android/renderscript/cts/GetElementAt.java
index a37a46e..be56a62 100644
--- a/tests/tests/renderscript/src/android/renderscript/cts/GetElementAt.java
+++ b/tests/tests/renderscript/src/android/renderscript/cts/GetElementAt.java
@@ -20,7 +20,6 @@
import android.renderscript.Element;
import android.renderscript.Type;
import android.renderscript.RSRuntimeException;
-import com.android.cts.stub.R;
import java.util.Random;
public class GetElementAt extends RSBaseCompute {
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/ImageProcessingTest.java b/tests/tests/renderscript/src/android/renderscript/cts/ImageProcessingTest.java
index fae20f4..f38bdb0 100644
--- a/tests/tests/renderscript/src/android/renderscript/cts/ImageProcessingTest.java
+++ b/tests/tests/renderscript/src/android/renderscript/cts/ImageProcessingTest.java
@@ -59,8 +59,6 @@
import android.renderscript.ScriptIntrinsicConvolve5x5;
import android.renderscript.ScriptIntrinsicLUT;
-import com.android.cts.stub.R;
-
public class ImageProcessingTest extends RSBaseCompute {
private Allocation a1, a2;
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/InitTest.java b/tests/tests/renderscript/src/android/renderscript/cts/InitTest.java
index 53fe05b..ec22249 100644
--- a/tests/tests/renderscript/src/android/renderscript/cts/InitTest.java
+++ b/tests/tests/renderscript/src/android/renderscript/cts/InitTest.java
@@ -19,7 +19,6 @@
import android.renderscript.Allocation;
import android.renderscript.Element;
import android.renderscript.RSRuntimeException;
-import com.android.cts.stub.R;
public class InitTest extends RSBaseCompute {
private Allocation mIn;
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/IsObjectTest.java b/tests/tests/renderscript/src/android/renderscript/cts/IsObjectTest.java
index 58ae448..0bb17cb 100644
--- a/tests/tests/renderscript/src/android/renderscript/cts/IsObjectTest.java
+++ b/tests/tests/renderscript/src/android/renderscript/cts/IsObjectTest.java
@@ -21,7 +21,6 @@
import android.renderscript.Element;
import android.util.Log;
import android.view.SurfaceHolder;
-import com.android.cts.stub.R;
import junit.framework.Assert;
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/KernelTest.java b/tests/tests/renderscript/src/android/renderscript/cts/KernelTest.java
index 0a8c8bd..64368b6 100644
--- a/tests/tests/renderscript/src/android/renderscript/cts/KernelTest.java
+++ b/tests/tests/renderscript/src/android/renderscript/cts/KernelTest.java
@@ -48,8 +48,6 @@
import android.renderscript.Type;
-import com.android.cts.stub.R;
-
public class KernelTest extends RSBaseCompute {
/**
* Test support for reflected forEach() as well as validation of parameters.
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/RSUtils.java b/tests/tests/renderscript/src/android/renderscript/cts/RSUtils.java
index a47af15..6038d90 100644
--- a/tests/tests/renderscript/src/android/renderscript/cts/RSUtils.java
+++ b/tests/tests/renderscript/src/android/renderscript/cts/RSUtils.java
@@ -19,7 +19,6 @@
import android.content.res.Resources;
import android.renderscript.Allocation;
import android.renderscript.RSRuntimeException;
-import com.android.cts.stub.R;
import java.util.Random;
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/RenderScriptTest.java b/tests/tests/renderscript/src/android/renderscript/cts/RenderScriptTest.java
index e31f3c6..4007260 100644
--- a/tests/tests/renderscript/src/android/renderscript/cts/RenderScriptTest.java
+++ b/tests/tests/renderscript/src/android/renderscript/cts/RenderScriptTest.java
@@ -16,8 +16,6 @@
package android.renderscript.cts;
-import com.android.cts.stub.R;
-
import android.renderscript.RenderScript;
import android.test.AndroidTestCase;
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/RsPackColorTo8888Test.java b/tests/tests/renderscript/src/android/renderscript/cts/RsPackColorTo8888Test.java
index bb8b275..d6ea521 100644
--- a/tests/tests/renderscript/src/android/renderscript/cts/RsPackColorTo8888Test.java
+++ b/tests/tests/renderscript/src/android/renderscript/cts/RsPackColorTo8888Test.java
@@ -16,7 +16,6 @@
package android.renderscript.cts;
-import com.android.cts.stub.R;
import android.renderscript.Allocation;
import android.renderscript.Element;
import android.renderscript.Float3;
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/RsUnpackColor8888Test.java b/tests/tests/renderscript/src/android/renderscript/cts/RsUnpackColor8888Test.java
index c32cc79..4754a9f 100644
--- a/tests/tests/renderscript/src/android/renderscript/cts/RsUnpackColor8888Test.java
+++ b/tests/tests/renderscript/src/android/renderscript/cts/RsUnpackColor8888Test.java
@@ -16,7 +16,6 @@
package android.renderscript.cts;
-import com.android.cts.stub.R;
import android.renderscript.Allocation;
import android.renderscript.Element;
import android.renderscript.Float4;
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/SampleTest.java b/tests/tests/renderscript/src/android/renderscript/cts/SampleTest.java
index 916fec3..bc69b0e 100644
--- a/tests/tests/renderscript/src/android/renderscript/cts/SampleTest.java
+++ b/tests/tests/renderscript/src/android/renderscript/cts/SampleTest.java
@@ -16,8 +16,6 @@
package android.renderscript.cts;
-import com.android.cts.stub.R;
-
import android.graphics.Bitmap;
import android.renderscript.Allocation;
import android.renderscript.Allocation.MipmapControl;
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/ScriptGroupTest.java b/tests/tests/renderscript/src/android/renderscript/cts/ScriptGroupTest.java
index c9a79c8..d44c305 100644
--- a/tests/tests/renderscript/src/android/renderscript/cts/ScriptGroupTest.java
+++ b/tests/tests/renderscript/src/android/renderscript/cts/ScriptGroupTest.java
@@ -16,8 +16,6 @@
package android.renderscript.cts;
-import com.android.cts.stub.R;
-
import android.graphics.Bitmap;
import android.renderscript.Allocation;
import android.renderscript.AllocationAdapter;
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/ScriptTest.java b/tests/tests/renderscript/src/android/renderscript/cts/ScriptTest.java
index ed73b6a..8c41e14 100644
--- a/tests/tests/renderscript/src/android/renderscript/cts/ScriptTest.java
+++ b/tests/tests/renderscript/src/android/renderscript/cts/ScriptTest.java
@@ -28,8 +28,6 @@
import android.renderscript.cts.ScriptC_negate;
-import com.android.cts.stub.R;
-
public class ScriptTest extends RSBaseCompute {
public void testScript() {
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/SendToClient.java b/tests/tests/renderscript/src/android/renderscript/cts/SendToClient.java
index f944af9..8b48bea 100644
--- a/tests/tests/renderscript/src/android/renderscript/cts/SendToClient.java
+++ b/tests/tests/renderscript/src/android/renderscript/cts/SendToClient.java
@@ -21,7 +21,6 @@
import android.renderscript.Allocation;
import android.renderscript.Element;
import android.renderscript.RenderScript.RSMessageHandler;
-import com.android.cts.stub.R;
public class SendToClient extends RSBaseCompute {
private Allocation mInAllocation;
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/SendToClientBlockingTest.java b/tests/tests/renderscript/src/android/renderscript/cts/SendToClientBlockingTest.java
index 00129e9..58fba9b 100644
--- a/tests/tests/renderscript/src/android/renderscript/cts/SendToClientBlockingTest.java
+++ b/tests/tests/renderscript/src/android/renderscript/cts/SendToClientBlockingTest.java
@@ -21,8 +21,6 @@
import java.util.concurrent.Semaphore;
import java.util.Random;
-import com.android.cts.stub.R;
-
public class SendToClientBlockingTest extends RSBaseCompute {
private static final Semaphore mSync = new Semaphore(0);
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/SetObjectTest.java b/tests/tests/renderscript/src/android/renderscript/cts/SetObjectTest.java
index a6626ee..ef6687f 100644
--- a/tests/tests/renderscript/src/android/renderscript/cts/SetObjectTest.java
+++ b/tests/tests/renderscript/src/android/renderscript/cts/SetObjectTest.java
@@ -20,7 +20,6 @@
import android.renderscript.Allocation;
import android.renderscript.Element;
import android.util.Log;
-import com.android.cts.stub.R;
import junit.framework.Assert;
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/StructArrayTest.java b/tests/tests/renderscript/src/android/renderscript/cts/StructArrayTest.java
index a851501..91e65f8 100644
--- a/tests/tests/renderscript/src/android/renderscript/cts/StructArrayTest.java
+++ b/tests/tests/renderscript/src/android/renderscript/cts/StructArrayTest.java
@@ -15,7 +15,6 @@
*/
package android.renderscript.cts;
-import com.android.cts.stub.R;
public class StructArrayTest extends RSBaseCompute {
/**
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/StructPadTest.java b/tests/tests/renderscript/src/android/renderscript/cts/StructPadTest.java
index 4832202..ee3483a 100644
--- a/tests/tests/renderscript/src/android/renderscript/cts/StructPadTest.java
+++ b/tests/tests/renderscript/src/android/renderscript/cts/StructPadTest.java
@@ -17,7 +17,6 @@
package android.renderscript.cts;
import android.renderscript.Float4;
-import com.android.cts.stub.R;
public class StructPadTest extends RSBaseCompute {
/**
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/VersionTest.java b/tests/tests/renderscript/src/android/renderscript/cts/VersionTest.java
index 70fca9b..f167a86 100644
--- a/tests/tests/renderscript/src/android/renderscript/cts/VersionTest.java
+++ b/tests/tests/renderscript/src/android/renderscript/cts/VersionTest.java
@@ -18,7 +18,6 @@
import android.renderscript.RenderScript.RSMessageHandler;
import android.renderscript.RSRuntimeException;
-import com.android.cts.stub.R;
/**
* Test for appropriate handling of versioned bitcode.
diff --git a/tests/tests/rscpp/Android.mk b/tests/tests/rscpp/Android.mk
index 1f32dd5..f7d586f 100644
--- a/tests/tests/rscpp/Android.mk
+++ b/tests/tests/rscpp/Android.mk
@@ -30,8 +30,6 @@
LOCAL_SRC_FILES := $(call all-java-files-under, src)
-LOCAL_INSTRUMENTATION_FOR := CtsTestStubs
-
LOCAL_SDK_VERSION := current
include $(BUILD_CTS_PACKAGE)
diff --git a/tests/tests/rscpp/AndroidManifest.xml b/tests/tests/rscpp/AndroidManifest.xml
index c014382..b68ebc3 100644
--- a/tests/tests/rscpp/AndroidManifest.xml
+++ b/tests/tests/rscpp/AndroidManifest.xml
@@ -24,7 +24,7 @@
<!-- This is a self-instrumenting test package. -->
<instrumentation android:name="android.support.test.runner.AndroidJUnitRunner"
- android:targetPackage="com.android.cts.stub"
+ android:targetPackage="com.android.cts.rscpp"
android:label="CTS tests of RenderScript C++ component">
<meta-data android:name="listener"
android:value="com.android.cts.runner.CtsTestRunListener" />
diff --git a/tests/res/raw/rs_loopfilter_param.bin b/tests/tests/rscpp/res/raw/rs_loopfilter_param.bin
similarity index 100%
rename from tests/res/raw/rs_loopfilter_param.bin
rename to tests/tests/rscpp/res/raw/rs_loopfilter_param.bin
Binary files differ
diff --git a/tests/tests/rscpp/src/android/cts/rscpp/RS3DLUTTest.java b/tests/tests/rscpp/src/android/cts/rscpp/RS3DLUTTest.java
index 7a85f57..470593c 100644
--- a/tests/tests/rscpp/src/android/cts/rscpp/RS3DLUTTest.java
+++ b/tests/tests/rscpp/src/android/cts/rscpp/RS3DLUTTest.java
@@ -16,8 +16,6 @@
package android.cts.rscpp;
-import com.android.cts.stub.R;
-
import android.content.Context;
import android.content.res.Resources;
import android.test.AndroidTestCase;
diff --git a/tests/tests/rscpp/src/android/cts/rscpp/RSAllocationTest.java b/tests/tests/rscpp/src/android/cts/rscpp/RSAllocationTest.java
index 86662bf..76dbfee 100644
--- a/tests/tests/rscpp/src/android/cts/rscpp/RSAllocationTest.java
+++ b/tests/tests/rscpp/src/android/cts/rscpp/RSAllocationTest.java
@@ -16,8 +16,6 @@
package android.cts.rscpp;
-import com.android.cts.stub.R;
-
import android.content.Context;
import android.content.res.Resources;
import android.test.AndroidTestCase;
diff --git a/tests/tests/rscpp/src/android/cts/rscpp/RSBlendTest.java b/tests/tests/rscpp/src/android/cts/rscpp/RSBlendTest.java
index 7c0ba38..025d470 100644
--- a/tests/tests/rscpp/src/android/cts/rscpp/RSBlendTest.java
+++ b/tests/tests/rscpp/src/android/cts/rscpp/RSBlendTest.java
@@ -16,8 +16,6 @@
package android.cts.rscpp;
-import com.android.cts.stub.R;
-
import android.content.Context;
import android.content.res.Resources;
import android.test.AndroidTestCase;
diff --git a/tests/tests/rscpp/src/android/cts/rscpp/RSBlurTest.java b/tests/tests/rscpp/src/android/cts/rscpp/RSBlurTest.java
index e546516..70f15fc 100644
--- a/tests/tests/rscpp/src/android/cts/rscpp/RSBlurTest.java
+++ b/tests/tests/rscpp/src/android/cts/rscpp/RSBlurTest.java
@@ -16,8 +16,6 @@
package android.cts.rscpp;
-import com.android.cts.stub.R;
-
import android.content.Context;
import android.content.res.Resources;
import android.test.AndroidTestCase;
diff --git a/tests/tests/rscpp/src/android/cts/rscpp/RSColorMatrixTest.java b/tests/tests/rscpp/src/android/cts/rscpp/RSColorMatrixTest.java
index d634c1f..efa28bb 100644
--- a/tests/tests/rscpp/src/android/cts/rscpp/RSColorMatrixTest.java
+++ b/tests/tests/rscpp/src/android/cts/rscpp/RSColorMatrixTest.java
@@ -16,8 +16,6 @@
package android.cts.rscpp;
-import com.android.cts.stub.R;
-
import android.content.Context;
import android.content.res.Resources;
import android.test.AndroidTestCase;
diff --git a/tests/tests/rscpp/src/android/cts/rscpp/RSConvolveTest.java b/tests/tests/rscpp/src/android/cts/rscpp/RSConvolveTest.java
index ded67cc..0cd5c79 100644
--- a/tests/tests/rscpp/src/android/cts/rscpp/RSConvolveTest.java
+++ b/tests/tests/rscpp/src/android/cts/rscpp/RSConvolveTest.java
@@ -16,8 +16,6 @@
package android.cts.rscpp;
-import com.android.cts.stub.R;
-
import android.content.Context;
import android.content.res.Resources;
import android.test.AndroidTestCase;
diff --git a/tests/tests/rscpp/src/android/cts/rscpp/RSCppTest.java b/tests/tests/rscpp/src/android/cts/rscpp/RSCppTest.java
index 9fa8216..b2bf33e 100644
--- a/tests/tests/rscpp/src/android/cts/rscpp/RSCppTest.java
+++ b/tests/tests/rscpp/src/android/cts/rscpp/RSCppTest.java
@@ -16,8 +16,6 @@
package android.cts.rscpp;
-import com.android.cts.stub.R;
-
import android.content.Context;
import android.content.res.Resources;
import android.test.AndroidTestCase;
diff --git a/tests/tests/rscpp/src/android/cts/rscpp/RSInitTest.java b/tests/tests/rscpp/src/android/cts/rscpp/RSInitTest.java
index 7fd5ffa..ca6be9c 100644
--- a/tests/tests/rscpp/src/android/cts/rscpp/RSInitTest.java
+++ b/tests/tests/rscpp/src/android/cts/rscpp/RSInitTest.java
@@ -16,8 +16,6 @@
package android.cts.rscpp;
-import com.android.cts.stub.R;
-
import android.content.Context;
import android.content.res.Resources;
import android.test.AndroidTestCase;
diff --git a/tests/tests/rscpp/src/android/cts/rscpp/RSLUTTest.java b/tests/tests/rscpp/src/android/cts/rscpp/RSLUTTest.java
index 2579666..f1ea040 100644
--- a/tests/tests/rscpp/src/android/cts/rscpp/RSLUTTest.java
+++ b/tests/tests/rscpp/src/android/cts/rscpp/RSLUTTest.java
@@ -16,8 +16,6 @@
package android.cts.rscpp;
-import com.android.cts.stub.R;
-
import android.content.Context;
import android.content.res.Resources;
import android.test.AndroidTestCase;
diff --git a/tests/tests/rscpp/src/android/cts/rscpp/RSLoopFilterTest.java b/tests/tests/rscpp/src/android/cts/rscpp/RSLoopFilterTest.java
index cf72e94..189a7e9 100644
--- a/tests/tests/rscpp/src/android/cts/rscpp/RSLoopFilterTest.java
+++ b/tests/tests/rscpp/src/android/cts/rscpp/RSLoopFilterTest.java
@@ -16,7 +16,7 @@
package android.cts.rscpp;
-import com.android.cts.stub.R;
+import com.android.cts.rscpp.R;
import android.content.Context;
import android.content.res.Resources;
diff --git a/tests/tests/rscpp/src/android/cts/rscpp/RSUtils.java b/tests/tests/rscpp/src/android/cts/rscpp/RSUtils.java
index 58d665f..b40c3bd 100644
--- a/tests/tests/rscpp/src/android/cts/rscpp/RSUtils.java
+++ b/tests/tests/rscpp/src/android/cts/rscpp/RSUtils.java
@@ -20,7 +20,6 @@
import java.util.Random;
import android.renderscript.Allocation;
import android.renderscript.RSRuntimeException;
-import com.android.cts.stub.R;
/**
* This class supplies some utils for renderscript tests
diff --git a/tests/tests/security/Android.mk b/tests/tests/security/Android.mk
index d0fefa1..699f798 100644
--- a/tests/tests/security/Android.mk
+++ b/tests/tests/security/Android.mk
@@ -18,16 +18,17 @@
LOCAL_MODULE_TAGS := tests
-LOCAL_STATIC_JAVA_LIBRARIES := ctstestrunner guava
+LOCAL_STATIC_JAVA_LIBRARIES := ctstestserver ctstestrunner guava
+
+LOCAL_JAVA_LIBRARIES := android.test.runner
LOCAL_JNI_SHARED_LIBRARIES := libctssecurity_jni
-LOCAL_SRC_FILES := $(call all-java-files-under, src)
+LOCAL_SRC_FILES := $(call all-java-files-under, src)\
+ src/android/security/cts/activity/ISecureRandomService.aidl
LOCAL_PACKAGE_NAME := CtsSecurityTestCases
-LOCAL_INSTRUMENTATION_FOR := CtsTestStubs
-
LOCAL_SDK_VERSION := current
include $(BUILD_CTS_PACKAGE)
diff --git a/tests/tests/security/AndroidManifest.xml b/tests/tests/security/AndroidManifest.xml
index da95e5c..8ed74ba 100644
--- a/tests/tests/security/AndroidManifest.xml
+++ b/tests/tests/security/AndroidManifest.xml
@@ -21,6 +21,7 @@
<uses-permission android:name="android.permission.DISABLE_KEYGUARD" />
<uses-permission android:name="android.permission.KILL_BACKGROUND_PROCESSES" />
<uses-permission android:name="android.permission.CHANGE_NETWORK_STATE" />
+ <uses-permission android:name="android.permission.INTERNET" />
<application>
<uses-library android:name="android.test.runner" />
@@ -29,10 +30,13 @@
android:process=":death_test_service"
android:isolatedProcess="true"
android:exported="true"/>
+
+ <service android:name="android.security.cts.activity.SecureRandomService"
+ android:process=":secureRandom"/>
</application>
<instrumentation android:name="android.support.test.runner.AndroidJUnitRunner"
- android:targetPackage="com.android.cts.stub"
+ android:targetPackage="com.android.cts.security"
android:label="CTS tests of com.android.cts.security">
<meta-data android:name="listener"
android:value="com.android.cts.runner.CtsTestRunListener" />
diff --git a/tests/assets/selinux_policy.xml b/tests/tests/security/assets/selinux_policy.xml
similarity index 100%
rename from tests/assets/selinux_policy.xml
rename to tests/tests/security/assets/selinux_policy.xml
diff --git a/tests/tests/security/jni/Android.mk b/tests/tests/security/jni/Android.mk
index fe47e2e..84f62c0 100644
--- a/tests/tests/security/jni/Android.mk
+++ b/tests/tests/security/jni/Android.mk
@@ -30,10 +30,12 @@
android_security_cts_NativeCodeTest.cpp \
android_security_cts_SeccompDeathTestService.cpp \
android_security_cts_SELinuxTest.cpp \
- android_security_cts_MMapExecutableTest.cpp
+ android_security_cts_MMapExecutableTest.cpp \
+ android_security_cts_FileUtils.cpp \
+ android_security_cts_NetlinkSocket.cpp
LOCAL_C_INCLUDES := $(JNI_H_INCLUDE)
-LOCAL_SHARED_LIBRARIES := libnativehelper liblog libbinder libutils libmedia libselinux
+LOCAL_SHARED_LIBRARIES := libnativehelper liblog libbinder libutils libmedia libselinux libdl
include $(BUILD_SHARED_LIBRARY)
diff --git a/tests/tests/security/jni/CtsSecurityJniOnLoad.cpp b/tests/tests/security/jni/CtsSecurityJniOnLoad.cpp
index 41a3df9..d9a5f28 100644
--- a/tests/tests/security/jni/CtsSecurityJniOnLoad.cpp
+++ b/tests/tests/security/jni/CtsSecurityJniOnLoad.cpp
@@ -16,6 +16,7 @@
#include <jni.h>
#include <stdio.h>
+#include "android_security_cts_NetlinkSocket.h"
extern int register_android_security_cts_KernelSettingsTest(JNIEnv*);
extern int register_android_security_cts_CharDeviceTest(JNIEnv*);
@@ -25,6 +26,7 @@
extern int register_android_security_cts_SeccompDeathTestService(JNIEnv*);
extern int register_android_security_cts_SELinuxTest(JNIEnv*);
extern int register_android_security_cts_MMapExecutableTest(JNIEnv* env);
+extern int register_android_security_cts_FileUtils(JNIEnv*);
jint JNI_OnLoad(JavaVM *vm, void *reserved) {
JNIEnv *env = NULL;
@@ -65,5 +67,13 @@
return JNI_ERR;
}
+ if (register_android_security_cts_FileUtils(env)) {
+ return JNI_ERR;
+ }
+
+ if (register_android_security_cts_NetlinkSocket(env)) {
+ return JNI_ERR;
+ }
+
return JNI_VERSION_1_4;
}
diff --git a/tests/tests/security/jni/android_security_cts_FileUtils.cpp b/tests/tests/security/jni/android_security_cts_FileUtils.cpp
new file mode 100644
index 0000000..8009c04
--- /dev/null
+++ b/tests/tests/security/jni/android_security_cts_FileUtils.cpp
@@ -0,0 +1,145 @@
+/*
+ * Copyright (C) 2014 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.
+ */
+
+#include <grp.h>
+#include <jni.h>
+#include <pwd.h>
+#include <stdio.h>
+#include <string.h>
+#include <sys/errno.h>
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <assert.h>
+
+static jclass gFileStatusClass;
+static jfieldID gFileStatusDevFieldID;
+static jfieldID gFileStatusInoFieldID;
+static jfieldID gFileStatusModeFieldID;
+static jfieldID gFileStatusNlinkFieldID;
+static jfieldID gFileStatusUidFieldID;
+static jfieldID gFileStatusGidFieldID;
+static jfieldID gFileStatusSizeFieldID;
+static jfieldID gFileStatusBlksizeFieldID;
+static jfieldID gFileStatusBlocksFieldID;
+static jfieldID gFileStatusAtimeFieldID;
+static jfieldID gFileStatusMtimeFieldID;
+static jfieldID gFileStatusCtimeFieldID;
+
+/*
+ * Native methods used by
+ * cts/tests/src/android/security/cts/FileUtils.java
+ *
+ * Copied from hidden API: frameworks/base/core/jni/android_security_FileUtils.cpp
+ */
+
+jboolean android_security_cts_FileUtils_getFileStatus(JNIEnv* env, jobject thiz,
+ jstring path, jobject fileStatus, jboolean statLinks)
+{
+ const char* pathStr = env->GetStringUTFChars(path, NULL);
+ jboolean ret = false;
+ struct stat s;
+
+ int res = statLinks == true ? lstat(pathStr, &s) : stat(pathStr, &s);
+
+ if (res == 0) {
+ ret = true;
+ if (fileStatus != NULL) {
+ env->SetIntField(fileStatus, gFileStatusDevFieldID, s.st_dev);
+ env->SetIntField(fileStatus, gFileStatusInoFieldID, s.st_ino);
+ env->SetIntField(fileStatus, gFileStatusModeFieldID, s.st_mode);
+ env->SetIntField(fileStatus, gFileStatusNlinkFieldID, s.st_nlink);
+ env->SetIntField(fileStatus, gFileStatusUidFieldID, s.st_uid);
+ env->SetIntField(fileStatus, gFileStatusGidFieldID, s.st_gid);
+ env->SetLongField(fileStatus, gFileStatusSizeFieldID, s.st_size);
+ env->SetIntField(fileStatus, gFileStatusBlksizeFieldID, s.st_blksize);
+ env->SetLongField(fileStatus, gFileStatusBlocksFieldID, s.st_blocks);
+ env->SetLongField(fileStatus, gFileStatusAtimeFieldID, s.st_atime);
+ env->SetLongField(fileStatus, gFileStatusMtimeFieldID, s.st_mtime);
+ env->SetLongField(fileStatus, gFileStatusCtimeFieldID, s.st_ctime);
+ }
+ }
+
+ env->ReleaseStringUTFChars(path, pathStr);
+
+ return ret;
+}
+
+jstring android_security_cts_FileUtils_getUserName(JNIEnv* env, jobject thiz,
+ jint uid)
+{
+ struct passwd *pwd = getpwuid(uid);
+ return env->NewStringUTF(pwd->pw_name);
+}
+
+jstring android_security_cts_FileUtils_getGroupName(JNIEnv* env, jobject thiz,
+ jint gid)
+{
+ struct group *grp = getgrgid(gid);
+ return env->NewStringUTF(grp->gr_name);
+}
+
+jint android_security_cts_FileUtils_setPermissions(JNIEnv* env, jobject clazz,
+ jstring file, jint mode)
+{
+ const char *fileStr = env->GetStringUTFChars(file, NULL);
+ if (fileStr == NULL) {
+ return -1;
+ }
+
+ if (strlen(fileStr) <= 0) {
+ env->ReleaseStringUTFChars(file, fileStr);
+ return ENOENT;
+ }
+
+ jint returnValue = chmod(fileStr, mode) == 0 ? 0 : errno;
+ env->ReleaseStringUTFChars(file, fileStr);
+ return returnValue;
+}
+
+static JNINativeMethod gMethods[] = {
+ { "getFileStatus", "(Ljava/lang/String;Landroid/security/cts/FileUtils$FileStatus;Z)Z",
+ (void *) android_security_cts_FileUtils_getFileStatus },
+ { "getUserName", "(I)Ljava/lang/String;",
+ (void *) android_security_cts_FileUtils_getUserName },
+ { "getGroupName", "(I)Ljava/lang/String;",
+ (void *) android_security_cts_FileUtils_getGroupName },
+ { "setPermissions", "(Ljava/lang/String;I)I",
+ (void *) android_security_cts_FileUtils_setPermissions },
+};
+
+int register_android_security_cts_FileUtils(JNIEnv* env)
+{
+ jclass clazz = env->FindClass("android/security/cts/FileUtils");
+ assert(clazz != null);
+
+ gFileStatusClass = env->FindClass("android/security/cts/FileUtils$FileStatus");
+ assert(gFileStatusClass != null);
+ gFileStatusDevFieldID = env->GetFieldID(gFileStatusClass, "dev", "I");
+ gFileStatusInoFieldID = env->GetFieldID(gFileStatusClass, "ino", "I");
+ gFileStatusModeFieldID = env->GetFieldID(gFileStatusClass, "mode", "I");
+ gFileStatusNlinkFieldID = env->GetFieldID(gFileStatusClass, "nlink", "I");
+ gFileStatusUidFieldID = env->GetFieldID(gFileStatusClass, "uid", "I");
+ gFileStatusGidFieldID = env->GetFieldID(gFileStatusClass, "gid", "I");
+ gFileStatusSizeFieldID = env->GetFieldID(gFileStatusClass, "size", "J");
+ gFileStatusBlksizeFieldID = env->GetFieldID(gFileStatusClass, "blksize", "I");
+ gFileStatusBlocksFieldID = env->GetFieldID(gFileStatusClass, "blocks", "J");
+ gFileStatusAtimeFieldID = env->GetFieldID(gFileStatusClass, "atime", "J");
+ gFileStatusMtimeFieldID = env->GetFieldID(gFileStatusClass, "mtime", "J");
+ gFileStatusCtimeFieldID = env->GetFieldID(gFileStatusClass, "ctime", "J");
+
+ return env->RegisterNatives(clazz, gMethods,
+ sizeof(gMethods) / sizeof(JNINativeMethod));
+}
diff --git a/tests/jni/android_net_cts_NetlinkSocket.cpp b/tests/tests/security/jni/android_security_cts_NetlinkSocket.cpp
similarity index 79%
rename from tests/jni/android_net_cts_NetlinkSocket.cpp
rename to tests/tests/security/jni/android_security_cts_NetlinkSocket.cpp
index f2fc38f..2411f74 100644
--- a/tests/jni/android_net_cts_NetlinkSocket.cpp
+++ b/tests/tests/security/jni/android_security_cts_NetlinkSocket.cpp
@@ -24,22 +24,22 @@
#include <string.h>
#include "JNIHelp.h"
-#include "android_net_cts_NetlinkSocket.h"
+#include "android_security_cts_NetlinkSocket.h"
-static void android_net_cts_NetlinkSocket_create(JNIEnv* env, jclass,
+static void android_security_cts_NetlinkSocket_create(JNIEnv* env, jclass,
jobject fileDescriptor)
{
int sock = socket(PF_NETLINK, SOCK_DGRAM, NETLINK_KOBJECT_UEVENT);
if (sock == -1) {
ALOGE("Can't create socket %s", strerror(errno));
- jclass SocketException = env->FindClass("java/net/SocketException");
+ jclass SocketException = env->FindClass("java/security/SocketException");
env->ThrowNew(SocketException, "Can't create socket");
return;
}
jniSetFileDescriptorOfFD(env, fileDescriptor, sock);
}
-static int android_net_cts_NetlinkSocket_sendmsg(JNIEnv *e, jclass,
+static int android_security_cts_NetlinkSocket_sendmsg(JNIEnv *e, jclass,
jobject fileDescriptor, jint pid, jbyteArray packet)
{
void *bytes = (void *)e->GetByteArrayElements(packet, NULL);
@@ -60,13 +60,13 @@
static JNINativeMethod gMethods[] = {
- { "sendmsg", "(Ljava/io/FileDescriptor;I[B)I", (void *) android_net_cts_NetlinkSocket_sendmsg },
- { "create_native", "(Ljava/io/FileDescriptor;)V", (void *) android_net_cts_NetlinkSocket_create },
+ { "sendmsg", "(Ljava/io/FileDescriptor;I[B)I", (void *) android_security_cts_NetlinkSocket_sendmsg },
+ { "create_native", "(Ljava/io/FileDescriptor;)V", (void *) android_security_cts_NetlinkSocket_create },
};
-int register_android_net_cts_NetlinkSocket(JNIEnv* env)
+int register_android_security_cts_NetlinkSocket(JNIEnv* env)
{
- jclass clazz = env->FindClass("android/net/cts/NetlinkSocket");
+ jclass clazz = env->FindClass("android/security/cts/NetlinkSocket");
return env->RegisterNatives(clazz, gMethods,
sizeof(gMethods) / sizeof(JNINativeMethod));
diff --git a/tests/jni/android_net_cts_NetlinkSocket.h b/tests/tests/security/jni/android_security_cts_NetlinkSocket.h
similarity index 78%
rename from tests/jni/android_net_cts_NetlinkSocket.h
rename to tests/tests/security/jni/android_security_cts_NetlinkSocket.h
index d406892..6e61c75 100644
--- a/tests/jni/android_net_cts_NetlinkSocket.h
+++ b/tests/tests/security/jni/android_security_cts_NetlinkSocket.h
@@ -14,9 +14,9 @@
* limitations under the License.
*/
-#ifndef __ANDROID_NET_CTS_H__
-#define __ANDROID_NET_CTS_H__
+#ifndef __ANDROID_SECURITY_CTS_H__
+#define __ANDROID_SECURITY_CTS_H__
-int register_android_net_cts_NetlinkSocket(JNIEnv*);
+int register_android_security_cts_NetlinkSocket(JNIEnv*);
-#endif /* __ANDROID_NET_CTS_H__ */
+#endif /* __ANDROID_SECURITY_CTS_H__ */
diff --git a/tests/res/raw/sig_devkeys.bin b/tests/tests/security/res/raw/sig_devkeys.bin
similarity index 100%
rename from tests/res/raw/sig_devkeys.bin
rename to tests/tests/security/res/raw/sig_devkeys.bin
Binary files differ
diff --git a/tests/res/raw/sig_devkeys_media.bin b/tests/tests/security/res/raw/sig_devkeys_media.bin
similarity index 100%
rename from tests/res/raw/sig_devkeys_media.bin
rename to tests/tests/security/res/raw/sig_devkeys_media.bin
Binary files differ
diff --git a/tests/res/raw/sig_devkeys_platform.bin b/tests/tests/security/res/raw/sig_devkeys_platform.bin
similarity index 100%
rename from tests/res/raw/sig_devkeys_platform.bin
rename to tests/tests/security/res/raw/sig_devkeys_platform.bin
Binary files differ
diff --git a/tests/res/raw/sig_devkeys_shared.bin b/tests/tests/security/res/raw/sig_devkeys_shared.bin
similarity index 100%
rename from tests/res/raw/sig_devkeys_shared.bin
rename to tests/tests/security/res/raw/sig_devkeys_shared.bin
Binary files differ
diff --git a/tests/res/raw/sig_media.bin b/tests/tests/security/res/raw/sig_media.bin
similarity index 100%
rename from tests/res/raw/sig_media.bin
rename to tests/tests/security/res/raw/sig_media.bin
Binary files differ
diff --git a/tests/res/raw/sig_platform.bin b/tests/tests/security/res/raw/sig_platform.bin
similarity index 100%
rename from tests/res/raw/sig_platform.bin
rename to tests/tests/security/res/raw/sig_platform.bin
Binary files differ
diff --git a/tests/res/raw/sig_shared.bin b/tests/tests/security/res/raw/sig_shared.bin
similarity index 100%
rename from tests/res/raw/sig_shared.bin
rename to tests/tests/security/res/raw/sig_shared.bin
Binary files differ
diff --git a/tests/res/raw/sig_testkey.bin b/tests/tests/security/res/raw/sig_testkey.bin
similarity index 100%
rename from tests/res/raw/sig_testkey.bin
rename to tests/tests/security/res/raw/sig_testkey.bin
Binary files differ
diff --git a/tests/tests/security/src/android/security/cts/AslrTest.java b/tests/tests/security/src/android/security/cts/AslrTest.java
index 1e76d90..f1552f6 100644
--- a/tests/tests/security/src/android/security/cts/AslrTest.java
+++ b/tests/tests/security/src/android/security/cts/AslrTest.java
@@ -24,7 +24,7 @@
import java.io.FileReader;
import java.io.IOException;
-import android.os.cts.ReadElf;
+import android.security.cts.ReadElf;
/**
* Verify that ASLR is properly enabled on Android Compatible devices.
diff --git a/tests/tests/security/src/android/security/cts/BannedFilesTest.java b/tests/tests/security/src/android/security/cts/BannedFilesTest.java
index ce0b48c..a71dcce 100644
--- a/tests/tests/security/src/android/security/cts/BannedFilesTest.java
+++ b/tests/tests/security/src/android/security/cts/BannedFilesTest.java
@@ -16,7 +16,7 @@
package android.security.cts;
-import android.os.cts.FileUtils;
+import android.security.cts.FileUtils;
import junit.framework.TestCase;
diff --git a/tests/tests/security/src/android/security/cts/FileUtils.java b/tests/tests/security/src/android/security/cts/FileUtils.java
new file mode 100644
index 0000000..3708f68
--- /dev/null
+++ b/tests/tests/security/src/android/security/cts/FileUtils.java
@@ -0,0 +1,163 @@
+/*
+ * Copyright (C) 2014 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 java.io.ByteArrayOutputStream;
+import java.io.File;
+import java.io.FileOutputStream;
+import java.io.IOException;
+import java.io.InputStream;
+
+/** Bits and pieces copied from hidden API of android.os.FileUtils. */
+public class FileUtils {
+
+ public static final int S_IFMT = 0170000;
+ public static final int S_IFSOCK = 0140000;
+ public static final int S_IFLNK = 0120000;
+ public static final int S_IFREG = 0100000;
+ public static final int S_IFBLK = 0060000;
+ public static final int S_IFDIR = 0040000;
+ public static final int S_IFCHR = 0020000;
+ public static final int S_IFIFO = 0010000;
+
+ public static final int S_ISUID = 0004000;
+ public static final int S_ISGID = 0002000;
+ public static final int S_ISVTX = 0001000;
+
+ public static final int S_IRWXU = 00700;
+ public static final int S_IRUSR = 00400;
+ public static final int S_IWUSR = 00200;
+ public static final int S_IXUSR = 00100;
+
+ public static final int S_IRWXG = 00070;
+ public static final int S_IRGRP = 00040;
+ public static final int S_IWGRP = 00020;
+ public static final int S_IXGRP = 00010;
+
+ public static final int S_IRWXO = 00007;
+ public static final int S_IROTH = 00004;
+ public static final int S_IWOTH = 00002;
+ public static final int S_IXOTH = 00001;
+
+ static {
+ System.loadLibrary("ctssecurity_jni");
+ }
+
+ public static class FileStatus {
+
+ public int dev;
+ public int ino;
+ public int mode;
+ public int nlink;
+ public int uid;
+ public int gid;
+ public int rdev;
+ public long size;
+ public int blksize;
+ public long blocks;
+ public long atime;
+ public long mtime;
+ public long ctime;
+
+ public boolean hasModeFlag(int flag) {
+ if (((S_IRWXU | S_IRWXG | S_IRWXO) & flag) != flag) {
+ throw new IllegalArgumentException("Inappropriate flag " + flag);
+ }
+ return (mode & flag) == flag;
+ }
+
+ public boolean isOfType(int type) {
+ if ((type & S_IFMT) != type) {
+ throw new IllegalArgumentException("Unknown type " + type);
+ }
+ return (mode & S_IFMT) == type;
+ }
+ }
+
+ /**
+ * @param path of the file to stat
+ * @param status object to set the fields on
+ * @param statLinks or don't stat links (lstat vs stat)
+ * @return whether or not we were able to stat the file
+ */
+ public native static boolean getFileStatus(String path, FileStatus status, boolean statLinks);
+
+ public native static String getUserName(int uid);
+
+ public native static String getGroupName(int gid);
+
+ public native static int setPermissions(String file, int mode);
+
+ /**
+ * Copy data from a source stream to destFile.
+ * Return true if succeed, return false if failed.
+ */
+ public static boolean copyToFile(InputStream inputStream, File destFile) {
+ try {
+ if (destFile.exists()) {
+ destFile.delete();
+ }
+ FileOutputStream out = new FileOutputStream(destFile);
+ try {
+ byte[] buffer = new byte[4096];
+ int bytesRead;
+ while ((bytesRead = inputStream.read(buffer)) >= 0) {
+ out.write(buffer, 0, bytesRead);
+ }
+ } finally {
+ out.flush();
+ try {
+ out.getFD().sync();
+ } catch (IOException e) {
+ }
+ out.close();
+ }
+ return true;
+ } catch (IOException e) {
+ return false;
+ }
+ }
+
+ public static void createFile(File file, int numBytes) throws IOException {
+ File parentFile = file.getParentFile();
+ if (parentFile != null) {
+ parentFile.mkdirs();
+ }
+ byte[] buffer = new byte[numBytes];
+ FileOutputStream output = new FileOutputStream(file);
+ try {
+ output.write(buffer);
+ } finally {
+ output.close();
+ }
+ }
+
+ public static byte[] readInputStreamFully(InputStream is) {
+ ByteArrayOutputStream os = new ByteArrayOutputStream();
+ byte[] buffer = new byte[32768];
+ int count;
+ try {
+ while ((count = is.read(buffer)) != -1) {
+ os.write(buffer, 0, count);
+ }
+ is.close();
+ } catch (IOException e) {
+ throw new RuntimeException(e);
+ }
+ return os.toByteArray();
+ }
+}
diff --git a/tests/src/android/net/cts/NetlinkSocket.java b/tests/tests/security/src/android/security/cts/NetlinkSocket.java
similarity index 94%
rename from tests/src/android/net/cts/NetlinkSocket.java
rename to tests/tests/security/src/android/security/cts/NetlinkSocket.java
index 1635843..1ea6d26 100644
--- a/tests/src/android/net/cts/NetlinkSocket.java
+++ b/tests/tests/security/src/android/security/cts/NetlinkSocket.java
@@ -14,7 +14,7 @@
* limitations under the License.
*/
-package android.net.cts;
+package android.security.cts;
import java.io.FileDescriptor;
import java.io.IOException;
@@ -22,7 +22,7 @@
public class NetlinkSocket {
static {
- System.loadLibrary("cts_jni");
+ System.loadLibrary("ctssecurity_jni");
}
private static native void create_native(FileDescriptor fd);
diff --git a/tests/tests/security/src/android/security/cts/PackageSignatureTest.java b/tests/tests/security/src/android/security/cts/PackageSignatureTest.java
index 5d8a050..069fa72 100644
--- a/tests/tests/security/src/android/security/cts/PackageSignatureTest.java
+++ b/tests/tests/security/src/android/security/cts/PackageSignatureTest.java
@@ -16,7 +16,7 @@
package android.security.cts;
-import com.android.cts.stub.R;
+import com.android.cts.security.R;
import android.content.pm.PackageInfo;
import android.content.pm.PackageManager;
diff --git a/tests/tests/security/src/android/security/cts/ReadElf.java b/tests/tests/security/src/android/security/cts/ReadElf.java
new file mode 100644
index 0000000..a9a4e3c
--- /dev/null
+++ b/tests/tests/security/src/android/security/cts/ReadElf.java
@@ -0,0 +1,523 @@
+/*
+ * Copyright (C) 2014 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 java.io.File;
+import java.io.IOException;
+import java.io.RandomAccessFile;
+import java.util.HashMap;
+import java.util.Map;
+
+/**
+ * A poor man's implementation of the readelf command. This program is
+ * designed to parse ELF (Executable and Linkable Format) files.
+ */
+public class ReadElf implements AutoCloseable {
+ /** The magic values for the ELF identification. */
+ private static final byte[] ELF_IDENT = {
+ (byte) 0x7F, (byte) 'E', (byte) 'L', (byte) 'F',
+ };
+
+ private static final int EI_CLASS = 4;
+ private static final int EI_DATA = 5;
+
+ private static final int EM_386 = 3;
+ private static final int EM_MIPS = 8;
+ private static final int EM_ARM = 40;
+ // http://en.wikipedia.org/wiki/Qualcomm_Hexagon
+ private static final int EM_QDSP6 = 164;
+
+ /** Size of the e_ident[] structure in the ELF header. */
+ private static final int EI_NIDENT = 16;
+
+ /** Offset from end of ident structure in half-word sizes. */
+ private static final int OFFSET_TYPE = 0;
+
+ /** Machine type. */
+ private static final int OFFSET_MACHINE = 1;
+
+ /** ELF version. */
+ private static final int OFFSET_VERSION = 2;
+
+ /**
+ * The offset to which the system transfers control. e.g., the first thing
+ * executed.
+ */
+ private static final int OFFSET_ENTRY = 4;
+
+ /** Program header offset in bytes. */
+ private static final int OFFSET_PHOFF = 6;
+
+ /** Segment header offset in bytes. */
+ private static final int OFFSET_SHOFF = 8;
+
+ /** Processor-specific flags for binary. */
+ private static final int OFFSET_FLAGS = 10;
+
+ /** ELF header size in bytes. */
+ private static final int OFFSET_EHSIZE = 12;
+
+ /** All program headers entry size in bytes. */
+ private static final int OFFSET_PHENTSIZE = 13;
+
+ /** Number of program headers in ELF. */
+ private static final int OFFSET_PHNUM = 14;
+
+ /** All segment headers entry size in bytes. */
+ private static final int OFFSET_SHENTSIZE = 15;
+
+ /** Number of segment headers in ELF. */
+ private static final int OFFSET_SHNUM = 16;
+
+ /** The section header index that refers to string table. */
+ private static final int OFFSET_SHSTRNDX = 17;
+
+ /** Program header offset for type of this program header. */
+ private static final int PHOFF_TYPE = 0;
+
+ /** Program header offset for absolute offset in file. */
+ private static final int PHOFF_OFFSET = 2;
+
+ /** Program header offset for virtual address. */
+ private static final int PHOFF_VADDR = 4;
+
+ /** Program header offset for physical address. */
+ private static final int PHOFF_PADDR = 6;
+
+ /** Program header offset for file size in bytes. */
+ private static final int PHOFF_FILESZ = 8;
+
+ /** Program header offset for memory size in bytes. */
+ private static final int PHOFF_MEMSZ = 10;
+
+ /** Program header offset for flags. */
+ private static final int PHOFF_FLAGS = 12;
+
+ /**
+ * Program header offset for required alignment. 0 or 1 means no alignment
+ * necessary.
+ */
+ private static final int PHOFF_ALIGN = 14;
+
+ /** Index into string pool for segment name. */
+ private static final long SHOFF_NAME = 0;
+
+ /** Segment header offset for type (half-words) */
+ private static final long SHOFF_TYPE = 2;
+
+ /** Segment header offset for offset (meta!) (half-words) */
+ private static final long SHOFF_OFFSET = 8;
+
+ /** Segment header offset for size (half-words) */
+ private static final long SHOFF_SIZE = 10;
+
+ /** Data is presented in LSB format. */
+ private static final int ELFDATA2LSB = 1;
+
+ /** Date is presented in MSB format. */
+ private static final int ELFDATA2MSB = 2;
+
+ private static final int ELFCLASS32 = 1;
+
+ private static final int ELFCLASS64 = 2;
+
+ private static final long PT_LOAD = 1;
+
+ /** Section Type: Symbol Table */
+ private static final int SHT_SYMTAB = 2;
+
+ /** Section Type: String Table */
+ private static final int SHT_STRTAB = 3;
+
+ /** Section Type: Dynamic **/
+ private static final int SHT_DYNAMIC = 6;
+
+ /** Section Type: Dynamic Symbol Table */
+ private static final int SHT_DYNSYM = 11;
+
+ /** Symbol Table Entry: Name offset */
+ private static final int SYMTAB_NAME = 0;
+
+ /** Symbol Table Entry: SymTab Info */
+ private static final int SYMTAB_ST_INFO = 6;
+
+ /** Symbol Table Entry size (half-words) */
+ private static final int SYMTAB_ENTRY_HALFWORD_SIZE = 7;
+
+ /**
+ * Symbol Table Entry size (extra in bytes) to cover "st_info" and
+ * "st_other"
+ */
+ private static final int SYMTAB_ENTRY_BYTE_EXTRA_SIZE = 2;
+
+ public static class Symbol {
+ public static final int STB_LOCAL = 0;
+
+ public static final int STB_GLOBAL = 1;
+
+ public static final int STB_WEAK = 2;
+
+ public static final int STB_LOPROC = 13;
+
+ public static final int STB_HIPROC = 15;
+
+ public final String name;
+
+ public final int bind;
+
+ public final int type;
+
+ Symbol(String name, int st_info) {
+ this.name = name;
+ this.bind = (st_info >> 4) & 0x0F;
+ this.type = st_info & 0x0F;
+ }
+ };
+
+ private final String mPath;
+ private final RandomAccessFile mFile;
+ private final byte[] mBuffer = new byte[512];
+ private int mEndian;
+ private boolean mIsDynamic;
+ private boolean mIsPIE;
+ private int mType;
+ private int mWordSize;
+ private int mHalfWordSize;
+
+ /** Symbol Table offset */
+ private long mSymTabOffset;
+
+ /** Symbol Table size */
+ private long mSymTabSize;
+
+ /** Dynamic Symbol Table offset */
+ private long mDynSymOffset;
+
+ /** Dynamic Symbol Table size */
+ private long mDynSymSize;
+
+ /** Section Header String Table offset */
+ private long mShStrTabOffset;
+
+ /** Section Header String Table size */
+ private long mShStrTabSize;
+
+ /** String Table offset */
+ private long mStrTabOffset;
+
+ /** String Table size */
+ private long mStrTabSize;
+
+ /** Dynamic String Table offset */
+ private long mDynStrOffset;
+
+ /** Dynamic String Table size */
+ private long mDynStrSize;
+
+ /** Symbol Table symbol names */
+ private Map<String, Symbol> mSymbols;
+
+ /** Dynamic Symbol Table symbol names */
+ private Map<String, Symbol> mDynamicSymbols;
+
+ public static ReadElf read(File file) throws IOException {
+ return new ReadElf(file);
+ }
+
+ public boolean isDynamic() {
+ return mIsDynamic;
+ }
+
+ public int getType() {
+ return mType;
+ }
+
+ public boolean isPIE() {
+ return mIsPIE;
+ }
+
+ private ReadElf(File file) throws IOException {
+ mPath = file.getPath();
+ mFile = new RandomAccessFile(file, "r");
+
+ if (mFile.length() < EI_NIDENT) {
+ throw new IllegalArgumentException("Too small to be an ELF file: " + file);
+ }
+
+ readIdent();
+ readHeader();
+ }
+
+ public void close() {
+ try {
+ mFile.close();
+ } catch (IOException ignored) {
+ }
+ }
+
+ protected void finalize() throws Throwable {
+ try {
+ close();
+ } finally {
+ super.finalize();
+ }
+ }
+
+ private void readHeader() throws IOException {
+ mType = readHalf(getHeaderOffset(OFFSET_TYPE));
+ int e_machine = readHalf(getHeaderOffset(OFFSET_MACHINE));
+ if (e_machine != EM_386 && e_machine != EM_MIPS && e_machine != EM_ARM &&
+ e_machine != EM_QDSP6) {
+ throw new IOException("Invalid ELF e_machine: " + e_machine + ": " + mPath);
+ }
+
+ final long shOffset = readWord(getHeaderOffset(OFFSET_SHOFF));
+ final int shNumber = readHalf(getHeaderOffset(OFFSET_SHNUM));
+ final int shSize = readHalf(getHeaderOffset(OFFSET_SHENTSIZE));
+ final int shStrIndex = readHalf(getHeaderOffset(OFFSET_SHSTRNDX));
+
+ readSectionHeaders(shOffset, shNumber, shSize, shStrIndex);
+
+ final long phOffset = readWord(getHeaderOffset(OFFSET_PHOFF));
+ final int phNumber = readHalf(getHeaderOffset(OFFSET_PHNUM));
+ final int phSize = readHalf(getHeaderOffset(OFFSET_PHENTSIZE));
+
+ readProgramHeaders(phOffset, phNumber, phSize);
+ }
+
+ private void readSectionHeaders(long tableOffset, int shNumber, int shSize, int shStrIndex)
+ throws IOException {
+ // Read the Section Header String Table offset first.
+ {
+ final long shStrTabShOffset = tableOffset + shStrIndex * shSize;
+ final long type = readWord(shStrTabShOffset + mHalfWordSize * SHOFF_TYPE);
+
+ if (type == SHT_STRTAB) {
+ mShStrTabOffset = readWord(shStrTabShOffset + mHalfWordSize * SHOFF_OFFSET);
+ mShStrTabSize = readWord(shStrTabShOffset + mHalfWordSize * SHOFF_SIZE);
+ }
+ }
+
+ for (int i = 0; i < shNumber; i++) {
+ // Don't bother to re-read the Section Header StrTab.
+ if (i == shStrIndex) {
+ continue;
+ }
+
+ final long shOffset = tableOffset + i * shSize;
+
+ final long type = readWord(shOffset + mHalfWordSize * SHOFF_TYPE);
+ if ((type == SHT_SYMTAB) || (type == SHT_DYNSYM)) {
+ final long nameOffset = readWord(shOffset + mHalfWordSize * SHOFF_NAME);
+ final long offset = readWord(shOffset + mHalfWordSize * SHOFF_OFFSET);
+ final long size = readWord(shOffset + mHalfWordSize * SHOFF_SIZE);
+
+ final String symTabName = readShStrTabEntry(nameOffset);
+ if (".symtab".equals(symTabName)) {
+ mSymTabOffset = offset;
+ mSymTabSize = size;
+ } else if (".dynsym".equals(symTabName)) {
+ mDynSymOffset = offset;
+ mDynSymSize = size;
+ }
+ } else if (type == SHT_STRTAB) {
+ final long nameOffset = readWord(shOffset + mHalfWordSize * SHOFF_NAME);
+ final long offset = readWord(shOffset + mHalfWordSize * SHOFF_OFFSET);
+ final long size = readWord(shOffset + mHalfWordSize * SHOFF_SIZE);
+
+ final String strTabName = readShStrTabEntry(nameOffset);
+ if (".strtab".equals(strTabName)) {
+ mStrTabOffset = offset;
+ mStrTabSize = size;
+ } else if (".dynstr".equals(strTabName)) {
+ mDynStrOffset = offset;
+ mDynStrSize = size;
+ }
+ } else if (type == SHT_DYNAMIC) {
+ mIsDynamic = true;
+ }
+ }
+ }
+
+ private void readProgramHeaders(long phOffset, int phNumber, int phSize) throws IOException {
+ for (int i = 0; i < phNumber; i++) {
+ final long baseOffset = phOffset + i * phSize;
+ final long type = readWord(baseOffset);
+ if (type == PT_LOAD) {
+ final long virtAddress = readWord(baseOffset + mHalfWordSize * PHOFF_VADDR);
+ if (virtAddress == 0) {
+ mIsPIE = true;
+ }
+ }
+ }
+ }
+
+ private void readSymbolTable(Map<String, Symbol> symbolMap, long symStrOffset, long symStrSize,
+ long symOffset, long symSize) throws IOException {
+ final long symEnd = symOffset + symSize;
+ for (long off = symOffset; off < symEnd; off += SYMTAB_ENTRY_HALFWORD_SIZE * mHalfWordSize
+ + SYMTAB_ENTRY_BYTE_EXTRA_SIZE) {
+ long strOffset = readWord(off + SYMTAB_NAME);
+ if (strOffset == 0) {
+ continue;
+ }
+
+ final String symName = readStrTabEntry(symStrOffset, symStrSize, strOffset);
+ if (symName != null) {
+ final int st_info = readByte(off + SYMTAB_ST_INFO);
+ symbolMap.put(symName, new Symbol(symName, st_info));
+ }
+ }
+ }
+
+ private String readShStrTabEntry(long strOffset) throws IOException {
+ if ((mShStrTabOffset == 0) || (strOffset < 0) || (strOffset >= mShStrTabSize)) {
+ return null;
+ }
+
+ return readString(mShStrTabOffset + strOffset);
+ }
+
+ private String readStrTabEntry(long tableOffset, long tableSize, long strOffset)
+ throws IOException {
+ if ((tableOffset == 0) || (strOffset < 0) || (strOffset >= tableSize)) {
+ return null;
+ }
+
+ return readString(tableOffset + strOffset);
+ }
+
+ private int getHeaderOffset(int halfWorldOffset) {
+ return EI_NIDENT + halfWorldOffset * mHalfWordSize;
+ }
+
+ private int readByte(long offset) throws IOException {
+ mFile.seek(offset);
+ mFile.readFully(mBuffer, 0, 1);
+
+ return mBuffer[0] & 0xff;
+ }
+
+ private int readHalf(long offset) throws IOException {
+ mFile.seek(offset);
+ mFile.readFully(mBuffer, 0, mWordSize);
+
+ final int answer;
+ if (mEndian == ELFDATA2LSB) {
+ answer = mBuffer[1] << 8 | (mBuffer[0] & 0xff);
+ } else {
+ answer = mBuffer[0] << 8 | (mBuffer[1] & 0xff);
+ }
+
+ return answer;
+ }
+
+ private long readWord(long offset) throws IOException {
+ mFile.seek(offset);
+ mFile.readFully(mBuffer, 0, mWordSize);
+
+ int answer = 0;
+ if (mEndian == ELFDATA2LSB) {
+ for (int i = mWordSize - 1; i >= 0; i--) {
+ answer = (answer << 8) | (mBuffer[i] & 0xff);
+ }
+ } else {
+ final int N = mWordSize - 1;
+ for (int i = 0; i <= N; i++) {
+ answer = (answer << 8) | (mBuffer[i] & 0xff);
+ }
+ }
+
+ return answer;
+ }
+
+ private String readString(long offset) throws IOException {
+ mFile.seek(offset);
+ mFile.readFully(mBuffer, 0, (int) Math.min(mBuffer.length, mFile.length() - offset));
+
+ for (int i = 0; i < mBuffer.length; i++) {
+ if (mBuffer[i] == 0) {
+ return new String(mBuffer, 0, i);
+ }
+ }
+
+ return null;
+ }
+
+ private void readIdent() throws IOException {
+ mFile.seek(0);
+ mFile.readFully(mBuffer, 0, EI_NIDENT);
+
+ if ((mBuffer[0] != ELF_IDENT[0]) || (mBuffer[1] != ELF_IDENT[1])
+ || (mBuffer[2] != ELF_IDENT[2]) || (mBuffer[3] != ELF_IDENT[3])) {
+ throw new IllegalArgumentException("Invalid ELF file: " + mPath);
+ }
+
+ int elfClass = mBuffer[EI_CLASS];
+ if (elfClass == ELFCLASS32) {
+ mWordSize = 4;
+ mHalfWordSize = 2;
+ } else if (elfClass == ELFCLASS64) {
+ throw new IOException("Unsupported ELFCLASS64 file: " + mPath);
+ } else {
+ throw new IOException("Invalid ELF EI_CLASS: " + elfClass + ": " + mPath);
+ }
+
+ mEndian = mBuffer[EI_DATA];
+ if (mEndian == ELFDATA2LSB) {
+ } else if (mEndian == ELFDATA2MSB) {
+ throw new IOException("Unsupported ELFDATA2MSB file: " + mPath);
+ } else {
+ throw new IOException("Invalid ELF EI_DATA: " + mEndian + ": " + mPath);
+ }
+ }
+
+ public Symbol getSymbol(String name) {
+ if ((mSymTabOffset == 0) && (mSymTabSize == 0)) {
+ return null;
+ }
+
+ if (mSymbols == null) {
+ mSymbols = new HashMap<String, Symbol>();
+ try {
+ readSymbolTable(mSymbols, mStrTabOffset, mStrTabSize, mSymTabOffset, mSymTabSize);
+ } catch (IOException e) {
+ return null;
+ }
+ }
+
+ return mSymbols.get(name);
+ }
+
+ public Symbol getDynamicSymbol(String name) {
+ if ((mDynSymOffset == 0) && (mDynSymSize == 0)) {
+ return null;
+ }
+
+ if (mDynamicSymbols == null) {
+ mDynamicSymbols = new HashMap<String, Symbol>();
+ try {
+ readSymbolTable(mDynamicSymbols, mDynStrOffset, mDynStrSize, mDynSymOffset,
+ mDynSymSize);
+ } catch (IOException e) {
+ return null;
+ }
+ }
+
+ return mDynamicSymbols.get(name);
+ }
+}
diff --git a/tests/tests/security/src/android/security/cts/VoldExploitTest.java b/tests/tests/security/src/android/security/cts/VoldExploitTest.java
index 486d5f0..edaf82a 100644
--- a/tests/tests/security/src/android/security/cts/VoldExploitTest.java
+++ b/tests/tests/security/src/android/security/cts/VoldExploitTest.java
@@ -18,7 +18,6 @@
import android.content.Context;
import android.content.pm.PackageManager;
-import android.net.cts.NetlinkSocket;
import android.os.storage.StorageManager;
import android.test.AndroidTestCase;
diff --git a/tests/src/android/security/cts/activity/ISecureRandomService.aidl b/tests/tests/security/src/android/security/cts/activity/ISecureRandomService.aidl
similarity index 100%
rename from tests/src/android/security/cts/activity/ISecureRandomService.aidl
rename to tests/tests/security/src/android/security/cts/activity/ISecureRandomService.aidl
diff --git a/tests/src/android/security/cts/activity/SecureRandomService.java b/tests/tests/security/src/android/security/cts/activity/SecureRandomService.java
similarity index 100%
rename from tests/src/android/security/cts/activity/SecureRandomService.java
rename to tests/tests/security/src/android/security/cts/activity/SecureRandomService.java
diff --git a/tests/tests/telephony/src/android/telephony/cts/SimRestrictedApisTest.java b/tests/tests/telephony/src/android/telephony/cts/SimRestrictedApisTest.java
index 1123cb0..599bf79 100644
--- a/tests/tests/telephony/src/android/telephony/cts/SimRestrictedApisTest.java
+++ b/tests/tests/telephony/src/android/telephony/cts/SimRestrictedApisTest.java
@@ -214,25 +214,13 @@
}
/**
- * Tests the TelephonyManager.setPreferredNetworkType() API. This makes a call to
- * setPreferredNetworkType() API and expects a SecurityException since the test apk
+ * Tests the TelephonyManager.setGlobalPreferredNetworkType() API. This makes a call to
+ * setGlobalPreferredNetworkType() API and expects a SecurityException since the test apk
* is not signed by certificate on the SIM.
*/
- public void testSetPreferredNetworkType() {
+ public void testSetGlobalPreferredNetworkType() {
try {
- TelephonyManager.getDefault().setPreferredNetworkType(0);
- fail("Expected SecurityException. App doesn't have carrier privileges.");
- } catch (SecurityException expected) {}
- }
-
- /**
- * Tests the TelephonyManager.setCdmaSubscription() API. This makes a call to
- * setCdmaSubscription() API and expects a SecurityException since the test apk
- * is not signed by certificate on the SIM.
- */
- public void testSetCdmaSubscription() {
- try {
- TelephonyManager.getDefault().setCdmaSubscription(0);
+ TelephonyManager.getDefault().setGlobalPreferredNetworkType();
fail("Expected SecurityException. App doesn't have carrier privileges.");
} catch (SecurityException expected) {}
}
@@ -255,7 +243,7 @@
*/
public void testSetOperatorBrandOverride() {
try {
- TelephonyManager.getDefault().setOperatorBrandOverride("", "");
+ TelephonyManager.getDefault().setOperatorBrandOverride("");
fail("Expected SecurityException. App doesn't have carrier privileges.");
} catch (SecurityException expected) {}
}
diff --git a/tests/tests/tv/src/android/media/tv/cts/BundledTvInputServiceTest.java b/tests/tests/tv/src/android/media/tv/cts/BundledTvInputServiceTest.java
index 53b53b4..46ed5cc 100644
--- a/tests/tests/tv/src/android/media/tv/cts/BundledTvInputServiceTest.java
+++ b/tests/tests/tv/src/android/media/tv/cts/BundledTvInputServiceTest.java
@@ -20,19 +20,16 @@
import android.app.Instrumentation;
import android.content.Context;
import android.cts.util.PollingCheck;
-import android.test.ActivityInstrumentationTestCase2;
import android.media.tv.TvContract;
import android.media.tv.TvInputInfo;
import android.media.tv.TvInputManager;
import android.media.tv.TvView;
-import android.media.tv.cts.Utils;
-import android.net.Uri;
+import android.test.ActivityInstrumentationTestCase2;
import android.util.ArrayMap;
import com.android.cts.tv.R;
import java.util.ArrayList;
-import java.util.Collections;
import java.util.List;
import java.util.Map;
import java.util.Random;
@@ -42,7 +39,6 @@
*/
public class BundledTvInputServiceTest
extends ActivityInstrumentationTestCase2<TvViewStubActivity> {
- private static final String TAG = BundledTvInputServiceTest.class.getSimpleName();
/** The maximum time to wait for an operation. */
private static final long TIME_OUT = 15000L;
@@ -50,12 +46,12 @@
private Activity mActivity;
private Instrumentation mInstrumentation;
private TvInputManager mManager;
- private List<TvInputInfo> mPassthroughInputList = new ArrayList<>();
- private final MockListener mListener = new MockListener();
+ private final List<TvInputInfo> mPassthroughInputList = new ArrayList<>();
+ private final MockCallback mCallback = new MockCallback();
- private static class MockListener extends TvView.TvInputListener {
+ private static class MockCallback extends TvView.TvInputCallback {
private final Map<String, Integer> mVideoUnavailableReasonMap = new ArrayMap<>();
- private Object mLock = new Object();
+ private final Object mLock = new Object();
private final int VIDEO_AVAILABLE = -1;
public Integer getVideoUnavailableReason(String inputId) {
@@ -109,7 +105,7 @@
mPassthroughInputList.add(info);
}
}
- mTvView.setTvInputListener(mListener);
+ mTvView.setCallback(mCallback);
}
@Override
@@ -138,7 +134,7 @@
new PollingCheck(TIME_OUT) {
@Override
protected boolean check() {
- Integer reason = mListener.getVideoUnavailableReason(info.getId());
+ Integer reason = mCallback.getVideoUnavailableReason(info.getId());
return reason != null
&& reason != TvInputManager.VIDEO_UNAVAILABLE_REASON_TUNING
&& reason != TvInputManager.VIDEO_UNAVAILABLE_REASON_BUFFERING;
@@ -162,7 +158,7 @@
new PollingCheck(TIME_OUT) {
@Override
protected boolean check() {
- Integer reason = mListener.getVideoUnavailableReason(info.getId());
+ Integer reason = mCallback.getVideoUnavailableReason(info.getId());
return reason != null
&& reason != TvInputManager.VIDEO_UNAVAILABLE_REASON_TUNING
&& reason != TvInputManager.VIDEO_UNAVAILABLE_REASON_BUFFERING;
diff --git a/tests/tests/tv/src/android/media/tv/cts/TvContractTest.java b/tests/tests/tv/src/android/media/tv/cts/TvContractTest.java
index 6d31a80..6d9fe74 100644
--- a/tests/tests/tv/src/android/media/tv/cts/TvContractTest.java
+++ b/tests/tests/tv/src/android/media/tv/cts/TvContractTest.java
@@ -27,14 +27,12 @@
import android.media.tv.TvContentRating;
import android.media.tv.TvContract;
import android.net.Uri;
-import android.os.RemoteException;
import android.test.AndroidTestCase;
import com.android.cts.tv.R;
import java.io.InputStream;
import java.io.OutputStream;
-import java.util.Arrays;
/**
* Test for {@link android.media.tv.TvContract}.
diff --git a/tests/tests/tv/src/android/media/tv/cts/TvInputInfoTest.java b/tests/tests/tv/src/android/media/tv/cts/TvInputInfoTest.java
index 335e7dc..440ecb2 100644
--- a/tests/tests/tv/src/android/media/tv/cts/TvInputInfoTest.java
+++ b/tests/tests/tv/src/android/media/tv/cts/TvInputInfoTest.java
@@ -52,7 +52,7 @@
if (!Utils.hasTvInputFramework(getContext())) {
return;
}
- Intent intent = mStubInfo.getIntentForSettingsActivity();
+ Intent intent = mStubInfo.createSettingsIntent();
assertEquals(intent.getComponent(), new ComponentName(getContext(),
TvInputSettingsActivityStub.class));
@@ -64,7 +64,7 @@
if (!Utils.hasTvInputFramework(getContext())) {
return;
}
- Intent intent = mStubInfo.getIntentForSetupActivity();
+ Intent intent = mStubInfo.createSetupIntent();
assertEquals(intent.getComponent(), new ComponentName(getContext(),
TvInputSetupActivityStub.class));
diff --git a/tests/tests/tv/src/android/media/tv/cts/TvInputManagerTest.java b/tests/tests/tv/src/android/media/tv/cts/TvInputManagerTest.java
index 3b486f6..790adf9 100644
--- a/tests/tests/tv/src/android/media/tv/cts/TvInputManagerTest.java
+++ b/tests/tests/tv/src/android/media/tv/cts/TvInputManagerTest.java
@@ -16,15 +16,10 @@
package android.media.tv.cts;
-import android.content.ComponentName;
import android.content.Context;
-import android.content.Intent;
-import android.content.pm.PackageManager;
-import android.test.AndroidTestCase;
import android.media.tv.TvInputInfo;
import android.media.tv.TvInputManager;
-import android.media.tv.TvInputService;
-import android.media.tv.cts.Utils;
+import android.test.AndroidTestCase;
import java.util.List;
diff --git a/tests/tests/tv/src/android/media/tv/cts/TvInputServiceTest.java b/tests/tests/tv/src/android/media/tv/cts/TvInputServiceTest.java
index 202319f..6e30421 100644
--- a/tests/tests/tv/src/android/media/tv/cts/TvInputServiceTest.java
+++ b/tests/tests/tv/src/android/media/tv/cts/TvInputServiceTest.java
@@ -19,32 +19,24 @@
import android.app.Activity;
import android.app.Instrumentation;
import android.content.Context;
-import android.content.pm.PackageManager;
import android.cts.util.PollingCheck;
-import android.database.Cursor;
-import android.test.ActivityInstrumentationTestCase2;
import android.media.tv.TvContentRating;
import android.media.tv.TvContract;
import android.media.tv.TvInputInfo;
import android.media.tv.TvInputManager;
-import android.media.tv.TvInputService;
import android.media.tv.TvTrackInfo;
import android.media.tv.TvView;
-import android.media.tv.TvInputService.Session;
import android.media.tv.cts.TvInputServiceTest.CountingTvInputService.CountingSession;
-import android.media.tv.cts.Utils;
import android.net.Uri;
-import android.util.ArrayMap;
-import android.util.SparseIntArray;
+import android.test.ActivityInstrumentationTestCase2;
import android.view.KeyEvent;
-import android.view.MotionEvent;
import android.view.Surface;
import com.android.cts.tv.R;
import java.util.ArrayList;
import java.util.List;
-import java.util.Map;
+
/**
* Test {@link android.media.tv.TvInputService}.
@@ -58,9 +50,9 @@
private Instrumentation mInstrumentation;
private TvInputManager mManager;
private TvInputInfo mStubInfo;
- private final StubListener mListener = new StubListener();
+ private final StubCallback mCallback = new StubCallback();
- private static class StubListener extends TvView.TvInputListener {
+ private static class StubCallback extends TvView.TvInputCallback {
private int mChannelRetunedCount;
private int mVideoAvailableCount;
private int mVideoUnavailableCount;
@@ -126,7 +118,7 @@
}
}
assertNotNull(mStubInfo);
- mTvView.setTvInputListener(mListener);
+ mTvView.setCallback(mCallback);
CountingTvInputService.sSession = null;
}
@@ -171,7 +163,7 @@
}
public void verifyCommandSetStreamVolume() {
- mTvView.setStreamVolume(1.0f);;
+ mTvView.setStreamVolume(1.0f);
mInstrumentation.waitForIdleSync();
new PollingCheck(TIME_OUT) {
@Override
@@ -226,7 +218,7 @@
new PollingCheck(TIME_OUT) {
@Override
protected boolean check() {
- return mListener.mChannelRetunedCount > 0;
+ return mCallback.mChannelRetunedCount > 0;
}
}.run();
}
@@ -238,7 +230,7 @@
new PollingCheck(TIME_OUT) {
@Override
protected boolean check() {
- return mListener.mVideoAvailableCount > 0;
+ return mCallback.mVideoAvailableCount > 0;
}
}.run();
}
@@ -250,7 +242,7 @@
new PollingCheck(TIME_OUT) {
@Override
protected boolean check() {
- return mListener.mVideoUnavailableCount > 0;
+ return mCallback.mVideoUnavailableCount > 0;
}
}.run();
}
@@ -262,7 +254,7 @@
new PollingCheck(TIME_OUT) {
@Override
protected boolean check() {
- return mListener.mTrackChangedCount > 0;
+ return mCallback.mTrackChangedCount > 0;
}
}.run();
}
@@ -274,7 +266,7 @@
new PollingCheck(TIME_OUT) {
@Override
protected boolean check() {
- return mListener.mTrackSelectedCount > 0;
+ return mCallback.mTrackSelectedCount > 0;
}
}.run();
}
@@ -286,7 +278,7 @@
new PollingCheck(TIME_OUT) {
@Override
protected boolean check() {
- return mListener.mContentAllowedCount > 0;
+ return mCallback.mContentAllowedCount > 0;
}
}.run();
}
@@ -300,7 +292,7 @@
new PollingCheck(TIME_OUT) {
@Override
protected boolean check() {
- return mListener.mContentBlockedCount > 0;
+ return mCallback.mContentBlockedCount > 0;
}
}.run();
}
diff --git a/tests/tests/tv/src/android/media/tv/cts/TvViewTest.java b/tests/tests/tv/src/android/media/tv/cts/TvViewTest.java
index 960aef7..9dc3bb0 100644
--- a/tests/tests/tv/src/android/media/tv/cts/TvViewTest.java
+++ b/tests/tests/tv/src/android/media/tv/cts/TvViewTest.java
@@ -21,15 +21,14 @@
import android.content.Context;
import android.cts.util.PollingCheck;
import android.database.Cursor;
-import android.test.ActivityInstrumentationTestCase2;
-import android.media.tv.TvContentRating;
import android.media.tv.TvContract;
import android.media.tv.TvInputInfo;
import android.media.tv.TvInputManager;
import android.media.tv.TvTrackInfo;
import android.media.tv.TvView;
-import android.media.tv.cts.Utils;
+import android.media.tv.TvView.TvInputCallback;
import android.net.Uri;
+import android.test.ActivityInstrumentationTestCase2;
import android.util.ArrayMap;
import android.util.SparseIntArray;
import android.view.InputEvent;
@@ -54,13 +53,13 @@
private Instrumentation mInstrumentation;
private TvInputManager mManager;
private TvInputInfo mStubInfo;
- private final MockListener mListener = new MockListener();
+ private final MockCallback mCallback = new MockCallback();
- private static class MockListener extends TvView.TvInputListener {
+ private static class MockCallback extends TvInputCallback {
private final Map<String, Boolean> mVideoAvailableMap = new ArrayMap<>();
private final Map<String, SparseIntArray> mSelectedTrackGenerationMap = new ArrayMap<>();
private final Map<String, Integer> mTracksGenerationMap = new ArrayMap<>();
- private Object mLock = new Object();
+ private final Object mLock = new Object();
public boolean isVideoAvailable(String inputId) {
synchronized (mLock) {
@@ -80,13 +79,6 @@
}
}
- public int getTrackGeneration(String inputId) {
- synchronized (mLock) {
- Integer tracksGeneration = mTracksGenerationMap.get(inputId);
- return tracksGeneration == null ? 0 : tracksGeneration.intValue();
- }
- }
-
@Override
public void onVideoAvailable(String inputId) {
synchronized (mLock) {
@@ -159,7 +151,7 @@
}
}
assertNotNull(mStubInfo);
- mTvView.setTvInputListener(mListener);
+ mTvView.setCallback(mCallback);
}
@Override
@@ -203,7 +195,7 @@
new PollingCheck(TIME_OUT) {
@Override
protected boolean check() {
- return mListener.isVideoAvailable(mStubInfo.getId());
+ return mCallback.isVideoAvailable(mStubInfo.getId());
}
}.run();
@@ -223,13 +215,13 @@
private void selectTrackAndVerify(final int type, final TvTrackInfo track,
List<TvTrackInfo> tracks) {
- final int previousGeneration = mListener.getSelectedTrackGeneration(
+ final int previousGeneration = mCallback.getSelectedTrackGeneration(
mStubInfo.getId(), type);
mTvView.selectTrack(type, track == null ? null : track.getId());
new PollingCheck(TIME_OUT) {
@Override
protected boolean check() {
- return mListener.getSelectedTrackGeneration(
+ return mCallback.getSelectedTrackGeneration(
mStubInfo.getId(), type) > previousGeneration;
}
}.run();
@@ -304,7 +296,6 @@
final int[] types = { TvTrackInfo.TYPE_AUDIO, TvTrackInfo.TYPE_VIDEO,
TvTrackInfo.TYPE_SUBTITLE };
for (int type : types) {
- final int typeF = type;
for (TvTrackInfo track : mTvView.getTracks(type)) {
selectTrackAndVerify(type, track, tracks);
}
@@ -355,7 +346,7 @@
new PollingCheck(TIME_OUT) {
@Override
protected boolean check() {
- return mListener.isVideoAvailable(mStubInfo.getId());
+ return mCallback.isVideoAvailable(mStubInfo.getId());
}
}.run();
}
diff --git a/tools/utils/buildCts.py b/tools/utils/buildCts.py
index 0f74a81..aa5bbf1 100755
--- a/tools/utils/buildCts.py
+++ b/tools/utils/buildCts.py
@@ -164,7 +164,7 @@
# CTS Stable plan
plan = tools.TestPlan(packages)
- plan.Exclude(r'android\.display')
+ plan.Exclude(r'com\.android\.cts\.browserbench')
for package, test_list in flaky_tests.iteritems():
plan.ExcludeTests(package, test_list)
self.__WritePlan(plan, 'CTS-stable')
@@ -172,7 +172,7 @@
# CTS Flaky plan - inversion of CTS Stable
plan = tools.TestPlan(packages)
plan.Exclude('.*')
- plan.Include(r'android\.display')
+ plan.Include(r'com\.android\.cts\.browserbench')
for package, test_list in flaky_tests.iteritems():
plan.Include(package)
plan.IncludeTests(package, test_list)
@@ -187,6 +187,8 @@
'cts.ActivityManagerTest#testIsRunningInTestHarness',
'cts.AlertDialogTest#testAlertDialogCancelable',
'cts.ExpandableListActivityTest#testCallback',],
+ 'android.dpi' : [
+ 'cts.DefaultManifestAttributesSdkTest#testPackageHasExpectedSdkVersion',],
'android.hardware' : [
'camera2.cts.CameraDeviceTest#testCameraDeviceRepeatingRequest',
'camera2.cts.ImageReaderTest#testImageReaderFromCameraJpeg',
@@ -213,6 +215,9 @@
'wifi.cts.NsdManagerTest#testAndroidTestCaseSetupProperly',
'wifi.cts.ScanResultTest#testAndroidTestCaseSetupProperly',
'wifi.cts.ScanResultTest#testScanResultTimeStamp',],
+ 'android.os' : [
+ 'cts.BuildVersionTest#testReleaseVersion',
+ 'cts.BuildTest#testIsSecureUserBuild',],
'android.security' : [
'cts.BannedFilesTest#testNoSu',
'cts.BannedFilesTest#testNoSuInPath',