Merge "remove zoomcontrols from ThemeDeviceTest" into oreo-cts-dev
diff --git a/apps/CtsVerifier/AndroidManifest.xml b/apps/CtsVerifier/AndroidManifest.xml
index 11f4111..e20aa08 100644
--- a/apps/CtsVerifier/AndroidManifest.xml
+++ b/apps/CtsVerifier/AndroidManifest.xml
@@ -18,7 +18,7 @@
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.android.cts.verifier"
android:versionCode="5"
- android:versionName="8.0_r6">
+ android:versionName="8.0_r7">
<uses-sdk android:minSdkVersion="19" android:targetSdkVersion="26"/>
diff --git a/hostsidetests/backup/src/android/cts/backup/FullbackupRulesHostSideTest.java b/hostsidetests/backup/src/android/cts/backup/FullbackupRulesHostSideTest.java
index 79ec24c..e93c913 100644
--- a/hostsidetests/backup/src/android/cts/backup/FullbackupRulesHostSideTest.java
+++ b/hostsidetests/backup/src/android/cts/backup/FullbackupRulesHostSideTest.java
@@ -19,6 +19,7 @@
import static org.junit.Assert.assertTrue;
import com.android.tradefed.testtype.DeviceJUnit4ClassRunner;
+import com.android.tradefed.log.LogUtil.CLog;
import org.junit.Test;
import org.junit.runner.RunWith;
@@ -45,6 +46,11 @@
@Test
public void testNoBackupFolder() throws Exception {
+ if (!mIsBackupSupported) {
+ CLog.i("android.software.backup feature is not supported on this device");
+ return;
+ }
+
// Generate the files that are going to be backed up.
checkDeviceTest(FULLBACKUP_TESTS_APP_NAME, FULLBACKUP_DEVICE_TEST_CLASS_NAME,
"createFiles");
@@ -70,6 +76,11 @@
@Test
public void testIncludeExcludeRules() throws Exception {
+ if (!mIsBackupSupported) {
+ CLog.i("android.software.backup feature is not supported on this device");
+ return;
+ }
+
// Generate the files that are going to be backed up.
checkDeviceTest(INCLUDE_EXCLUDE_TESTS_APP_NAME, INCLUDE_EXCLUDE_DEVICE_TEST_CLASS_NAME,
"createFiles");
diff --git a/hostsidetests/services/activityandwindowmanager/activitymanager/src/android/server/cts/ActivityManagerAppConfigurationTests.java b/hostsidetests/services/activityandwindowmanager/activitymanager/src/android/server/cts/ActivityManagerAppConfigurationTests.java
index 2ef8946..0da81bc 100755
--- a/hostsidetests/services/activityandwindowmanager/activitymanager/src/android/server/cts/ActivityManagerAppConfigurationTests.java
+++ b/hostsidetests/services/activityandwindowmanager/activitymanager/src/android/server/cts/ActivityManagerAppConfigurationTests.java
@@ -167,6 +167,26 @@
}
private void rotateAndCheckSizes(ReportedSizes prevSizes) throws Exception {
+ // If an activity gets almost square frame,
+ // resize docked stack to make sure the activity gets a non-square frame.
+ Rectangle adjustedDockedBounds = new Rectangle();
+ if (isInSplitMode(RESIZEABLE_ACTIVITY_NAME)) {
+ final int appWidth = prevSizes.displayWidth;
+ final int appHeight = prevSizes.displayHeight;
+ final float aspectRatio = (appWidth > appHeight) ?
+ appWidth / (float) appHeight : appHeight / (float) appWidth;
+ if (aspectRatio < 1.1f) {
+ final String logSeparator = clearLogcat();
+ Rectangle dockBounds = mAmWmState.getAmState().getStackById(
+ DOCKED_STACK_ID).getBounds();
+ adjustedDockedBounds.setBounds(dockBounds.x, dockBounds.y, dockBounds.width,
+ (int) (dockBounds.height * 0.7f));
+ resizeDockedStack(adjustedDockedBounds.width, adjustedDockedBounds.height,
+ adjustedDockedBounds.width, adjustedDockedBounds.height);
+ prevSizes = getActivityDisplaySize(RESIZEABLE_ACTIVITY_NAME, logSeparator);
+ }
+ }
+
for (int rotation = 3; rotation >= 0; --rotation) {
final String logSeparator = clearLogcat();
final int actualStackId = mAmWmState.getAmState().getTaskByActivityName(
@@ -183,6 +203,16 @@
return;
}
+ if (!adjustedDockedBounds.isEmpty()) {
+ if (rotation == ROTATION_0 || rotation == ROTATION_180) {
+ resizeDockedStack(adjustedDockedBounds.width, adjustedDockedBounds.height,
+ adjustedDockedBounds.width, adjustedDockedBounds.height);
+ } else {
+ resizeDockedStack(adjustedDockedBounds.height, adjustedDockedBounds.width,
+ adjustedDockedBounds.height, adjustedDockedBounds.width);
+ }
+ }
+
final ReportedSizes rotatedSizes = getActivityDisplaySize(RESIZEABLE_ACTIVITY_NAME,
logSeparator);
assertSizesRotate(prevSizes, rotatedSizes);
@@ -190,6 +220,17 @@
}
}
+ private boolean isInSplitMode(String activityName) throws Exception {
+ mAmWmState.computeState(mDevice, new String[] { activityName });
+ ActivityManagerState.ActivityTask task = mAmWmState.getAmState().getTaskByActivityName(
+ activityName);
+ return task != null && !task.isFullscreen() &&
+ (task.mStackId == HOME_STACK_ID
+ || task.mStackId == FULLSCREEN_WORKSPACE_STACK_ID
+ || task.mStackId == DOCKED_STACK_ID
+ || task.mStackId == RECENTS_STACK_ID);
+ }
+
/**
* Tests when activity moved from fullscreen stack to docked and back. Activity will be
* relaunched twice and it should have same config as initial one.
diff --git a/hostsidetests/services/activityandwindowmanager/activitymanager/src/android/server/cts/ActivityManagerAssistantStackTests.java b/hostsidetests/services/activityandwindowmanager/activitymanager/src/android/server/cts/ActivityManagerAssistantStackTests.java
index e1e108d..80a8e5f 100644
--- a/hostsidetests/services/activityandwindowmanager/activitymanager/src/android/server/cts/ActivityManagerAssistantStackTests.java
+++ b/hostsidetests/services/activityandwindowmanager/activitymanager/src/android/server/cts/ActivityManagerAssistantStackTests.java
@@ -85,8 +85,8 @@
// Dock a task
launchActivity(TEST_ACTIVITY);
launchActivityInDockStack(DOCKED_ACTIVITY);
- mAmWmState.assertContainsStack("Must contain fullscreen stack.",
- FULLSCREEN_WORKSPACE_STACK_ID);
+ mAmWmState.assertHasFullscreenTypeStackOnDisplay("Must contain fullscreen stack.",
+ mAssistantDisplayId);
mAmWmState.assertContainsStack("Must contain docked stack.", DOCKED_STACK_ID);
// Enable the assistant and launch an assistant activity, ensure it is on top
@@ -112,8 +112,8 @@
// Dock a task
launchActivity(TEST_ACTIVITY);
launchActivityInDockStack(DOCKED_ACTIVITY);
- mAmWmState.assertContainsStack("Must contain fullscreen stack.",
- FULLSCREEN_WORKSPACE_STACK_ID);
+ mAmWmState.assertHasFullscreenTypeStackOnDisplay("Must contain fullscreen stack.",
+ mAssistantDisplayId);
mAmWmState.assertContainsStack("Must contain docked stack.", DOCKED_STACK_ID);
enableAssistant();
@@ -132,10 +132,9 @@
// Ensure that the fullscreen stack is on top and the test activity is now visible
mAmWmState.waitForValidState(mDevice, TEST_ACTIVITY, FULLSCREEN_WORKSPACE_STACK_ID);
mAmWmState.assertFocusedActivity("TestActivity should be resumed", TEST_ACTIVITY);
- mAmWmState.assertFrontStack("Fullscreen stack should be on top.",
- FULLSCREEN_WORKSPACE_STACK_ID);
- mAmWmState.assertFocusedStack("Fullscreen stack should be focused.",
- FULLSCREEN_WORKSPACE_STACK_ID);
+ mAmWmState.assertActivityInFullscreenTypeStack(
+ "TestActivity should go on a suitable fullscreen-type stack.",
+ TEST_ACTIVITY);
// Now, tell it to finish itself and ensure that the assistant stack is brought back forward
executeShellCommand("am broadcast -a " + TEST_ACTIVITY_ACTION_FINISH_SELF);
@@ -155,10 +154,9 @@
mAmWmState.waitForValidState(mDevice, TEST_ACTIVITY, FULLSCREEN_WORKSPACE_STACK_ID);
mAmWmState.waitForActivityState(mDevice, TEST_ACTIVITY, STATE_RESUMED);
mAmWmState.assertFocusedActivity("TestActivity should be resumed", TEST_ACTIVITY);
- mAmWmState.assertFrontStack("Fullscreen stack should be on top.",
- FULLSCREEN_WORKSPACE_STACK_ID);
- mAmWmState.assertFocusedStack("Fullscreen stack should be focused.",
- FULLSCREEN_WORKSPACE_STACK_ID);
+ mAmWmState.assertActivityInFullscreenTypeStack(
+ "TestActivity should go on a suitable fullscreen-type stack.",
+ TEST_ACTIVITY);
}
public void testDisallowEnterPiPFromAssistantStack() throws Exception {
diff --git a/hostsidetests/services/activityandwindowmanager/util/src/android/server/cts/ActivityAndWindowManagersState.java b/hostsidetests/services/activityandwindowmanager/util/src/android/server/cts/ActivityAndWindowManagersState.java
index df16346..0f232e7 100644
--- a/hostsidetests/services/activityandwindowmanager/util/src/android/server/cts/ActivityAndWindowManagersState.java
+++ b/hostsidetests/services/activityandwindowmanager/util/src/android/server/cts/ActivityAndWindowManagersState.java
@@ -459,6 +459,18 @@
assertTrue(msg, mWmState.containsStack(stackId));
}
+ void assertHasFullscreenTypeStackOnDisplay(String msg, int displayId) {
+ assertTrue(msg, mAmState.containsSuitableStackOnDisplay(displayId));
+ }
+
+ void assertActivityInFullscreenTypeStack(String msg, String activityName)
+ throws Exception {
+ final int stackId = mAmState.getTaskByActivityName(activityName).mStackId;
+ assertTrue(mAmState.isSuitableStack(stackId));
+ assertFrontStack(msg, stackId);
+ assertFocusedStack(msg, stackId);
+ }
+
void assertDoesNotContainStack(String msg, int stackId) throws Exception {
assertFalse(msg, mAmState.containsStack(stackId));
assertFalse(msg, mWmState.containsStack(stackId));
diff --git a/hostsidetests/services/activityandwindowmanager/util/src/android/server/cts/ActivityManagerState.java b/hostsidetests/services/activityandwindowmanager/util/src/android/server/cts/ActivityManagerState.java
index b8f6811..2e53997 100644
--- a/hostsidetests/services/activityandwindowmanager/util/src/android/server/cts/ActivityManagerState.java
+++ b/hostsidetests/services/activityandwindowmanager/util/src/android/server/cts/ActivityManagerState.java
@@ -33,8 +33,7 @@
import java.util.regex.Pattern;
import java.util.regex.Matcher;
-import static android.server.cts.ActivityManagerTestBase.HOME_STACK_ID;
-import static android.server.cts.ActivityManagerTestBase.RECENTS_STACK_ID;
+import static android.server.cts.ActivityManagerTestBase.*;
import static android.server.cts.StateLogger.log;
import static android.server.cts.StateLogger.logE;
@@ -235,6 +234,21 @@
return null;
}
+ boolean containsSuitableStackOnDisplay(int displayId) {
+ for (ActivityStack stack : mDisplayStacks.get(displayId)) {
+ if (isSuitableStack(stack.mStackId)) {
+ return true;
+ }
+ }
+ return false;
+ }
+
+ boolean isSuitableStack(int stackId) {
+ return stackId != HOME_STACK_ID
+ && stackId != DOCKED_STACK_ID
+ && stackId != PINNED_STACK_ID;
+ }
+
int getStackPosition(int stackId) {
for (Integer displayId : mDisplayStacks.keySet()) {
List<ActivityStack> stacks = mDisplayStacks.get(displayId);
diff --git a/hostsidetests/services/activityandwindowmanager/util/src/android/server/cts/ActivityManagerTestBase.java b/hostsidetests/services/activityandwindowmanager/util/src/android/server/cts/ActivityManagerTestBase.java
index 5adf111..551a833 100644
--- a/hostsidetests/services/activityandwindowmanager/util/src/android/server/cts/ActivityManagerTestBase.java
+++ b/hostsidetests/services/activityandwindowmanager/util/src/android/server/cts/ActivityManagerTestBase.java
@@ -142,6 +142,13 @@
protected static final int INVALID_DEVICE_ROTATION = -1;
+ /** Corresponds to {@link Surface.ROTATION_0},
+ * {@link Surface.ROTATION_90}, {@link Surface.ROTATION_180}, {@link Surface.ROTATION_270} */
+ protected static final int ROTATION_0 = 0;
+ protected static final int ROTATION_90 = 1;
+ protected static final int ROTATION_180 = 2;
+ protected static final int ROTATION_270 = 3;
+
/** A reference to the device under test. */
protected ITestDevice mDevice;
diff --git a/hostsidetests/services/activityandwindowmanager/windowmanager/frametestapp/src/android/server/frametestapp/DialogTestActivity.java b/hostsidetests/services/activityandwindowmanager/windowmanager/frametestapp/src/android/server/frametestapp/DialogTestActivity.java
index 593cf34..e765a78 100644
--- a/hostsidetests/services/activityandwindowmanager/windowmanager/frametestapp/src/android/server/frametestapp/DialogTestActivity.java
+++ b/hostsidetests/services/activityandwindowmanager/windowmanager/frametestapp/src/android/server/frametestapp/DialogTestActivity.java
@@ -19,26 +19,38 @@
import android.app.Activity;
import android.app.AlertDialog;
import android.content.Intent;
+import android.graphics.Rect;
import android.os.Bundle;
+import android.view.View;
+import android.view.WindowInsets;
import android.view.WindowManager;
import android.view.Window;
import android.view.Gravity;
-public class DialogTestActivity extends Activity {
+public class DialogTestActivity extends Activity implements View.OnApplyWindowInsetsListener{
AlertDialog mDialog;
+ private Rect mOutsets = new Rect();
protected void onCreate(Bundle icicle) {
super.onCreate(icicle);
+ View content = new View(this);
+ content.setOnApplyWindowInsetsListener(this);
+ setContentView(content);
}
protected void onStop() {
super.onStop();
mDialog.dismiss();
}
- protected void onResume() {
- super.onResume();
+
+ public WindowInsets onApplyWindowInsets(View v, WindowInsets in) {
+ if (in.isRound()) {
+ mOutsets = new Rect(in.getSystemWindowInsetLeft(), in.getSystemWindowInsetTop(),
+ in.getSystemWindowInsetRight(), in.getSystemWindowInsetBottom());
+ }
setupTest(getIntent());
+ return in;
}
private void setupTest(Intent intent) {
@@ -129,23 +141,23 @@
private void testExplicitSize() {
doLayoutParamTest((WindowManager.LayoutParams params) -> {
- params.width = 200;
- params.height = 200;
+ params.width = 200 - mOutsets.left - mOutsets.right;
+ params.height = 200 - mOutsets.bottom - mOutsets.top;
});
}
private void testExplicitSizeTopLeftGravity() {
doLayoutParamTest((WindowManager.LayoutParams params) -> {
- params.width = 200;
- params.height = 200;
+ params.width = 200 - mOutsets.left - mOutsets.right;
+ params.height = 200 - mOutsets.bottom - mOutsets.top;
params.gravity = Gravity.TOP | Gravity.LEFT;
});
}
private void testExplicitSizeBottomRightGravity() {
doLayoutParamTest((WindowManager.LayoutParams params) -> {
- params.width = 200;
- params.height = 200;
+ params.width = 200 - mOutsets.left - mOutsets.right;
+ params.height = 200 - mOutsets.bottom - mOutsets.top;
params.gravity = Gravity.BOTTOM | Gravity.RIGHT;
});
}
@@ -170,8 +182,6 @@
doLayoutParamTest((WindowManager.LayoutParams params) -> {
params.width = WindowManager.LayoutParams.MATCH_PARENT;
params.height = WindowManager.LayoutParams.MATCH_PARENT;
- params.x = 100;
- params.y = 100;
});
}
@@ -181,8 +191,6 @@
params.height = WindowManager.LayoutParams.MATCH_PARENT;
params.gravity = Gravity.LEFT | Gravity.TOP;
params.flags |= WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS;
- params.x = 100;
- params.y = 100;
});
}
@@ -196,9 +204,9 @@
doLayoutParamTest((WindowManager.LayoutParams params) -> {
params.gravity = Gravity.LEFT | Gravity.TOP;
params.horizontalMargin = .25f;
- params.verticalMargin = .35f;
- params.width = 200;
- params.height = 200;
+ params.verticalMargin = .25f;
+ params.width = 200 - mOutsets.left - mOutsets.right;
+ params.height = 200 - mOutsets.bottom - mOutsets.top;
params.x = 0;
params.y = 0;
});
diff --git a/hostsidetests/services/activityandwindowmanager/windowmanager/src/android/server/cts/DialogFrameTests.java b/hostsidetests/services/activityandwindowmanager/windowmanager/src/android/server/cts/DialogFrameTests.java
index c99f001..9125a99 100644
--- a/hostsidetests/services/activityandwindowmanager/windowmanager/src/android/server/cts/DialogFrameTests.java
+++ b/hostsidetests/services/activityandwindowmanager/windowmanager/src/android/server/cts/DialogFrameTests.java
@@ -190,7 +190,7 @@
public void testMarginsArePercentagesOfContentFrame() throws Exception {
float horizontalMargin = .25f;
- float verticalMargin = .35f;
+ float verticalMargin = .25f;
doParentChildTest("WithMargins",
(WindowState parent, WindowState dialog) -> {
Rectangle frame = parent.getContentFrame();
diff --git a/hostsidetests/theme/assets/26/280dpi.zip b/hostsidetests/theme/assets/26/280dpi.zip
index d5260d9..201eaf4 100644
--- a/hostsidetests/theme/assets/26/280dpi.zip
+++ b/hostsidetests/theme/assets/26/280dpi.zip
Binary files differ
diff --git a/tests/accessibilityservice/src/android/accessibilityservice/cts/AccessibilityGestureDispatchTest.java b/tests/accessibilityservice/src/android/accessibilityservice/cts/AccessibilityGestureDispatchTest.java
index df8c6f3..aa30f77 100644
--- a/tests/accessibilityservice/src/android/accessibilityservice/cts/AccessibilityGestureDispatchTest.java
+++ b/tests/accessibilityservice/src/android/accessibilityservice/cts/AccessibilityGestureDispatchTest.java
@@ -34,6 +34,8 @@
import android.os.SystemClock;
import android.test.ActivityInstrumentationTestCase2;
import android.util.DisplayMetrics;
+import android.util.Log;
+import android.view.Display;
import android.view.MotionEvent;
import android.view.View;
import android.view.ViewConfiguration;
@@ -52,6 +54,8 @@
*/
public class AccessibilityGestureDispatchTest extends
ActivityInstrumentationTestCase2<AccessibilityGestureDispatchTest.GestureDispatchActivity> {
+ private static final String TAG = AccessibilityGestureDispatchTest.class.getSimpleName();
+
private static final int GESTURE_COMPLETION_TIMEOUT = 5000; // millis
private static final int MOTION_EVENT_TIMEOUT = 1000; // millis
@@ -300,6 +304,12 @@
return;
}
+ int displayId = getActivity().getWindow().getDecorView().getDisplay().getDisplayId();
+ if (displayId != Display.DEFAULT_DISPLAY) {
+ Log.i(TAG, "Magnification is not supported on virtual displays.");
+ return;
+ }
+
final WindowManager wm = (WindowManager) getInstrumentation().getContext().getSystemService(
Context.WINDOW_SERVICE);
final StubMagnificationAccessibilityService magnificationService =
diff --git a/tests/accessibilityservice/src/android/accessibilityservice/cts/AccessibilitySoftKeyboardModesTest.java b/tests/accessibilityservice/src/android/accessibilityservice/cts/AccessibilitySoftKeyboardModesTest.java
index 49c209f..eb8e0e8 100644
--- a/tests/accessibilityservice/src/android/accessibilityservice/cts/AccessibilitySoftKeyboardModesTest.java
+++ b/tests/accessibilityservice/src/android/accessibilityservice/cts/AccessibilitySoftKeyboardModesTest.java
@@ -140,26 +140,6 @@
assertTrue(mKeyboardController.removeOnShowModeChangedListener(listener));
}
- public void testHideSoftKeyboard_shouldHideKeyboardOnRequest() throws Exception {
- // The soft keyboard should be in its default mode.
- assertEquals(SHOW_MODE_AUTO, mKeyboardController.getShowMode());
-
- if (!tryShowSoftInput()) {
- // If the current (default) IME declined to show its window, then there is nothing we
- // can test here.
- // TODO: Create a mock IME so that we can test only the framework behavior.
- return;
- }
-
- waitForImePresentToBe(true);
- // Request the keyboard be hidden.
- assertTrue(mKeyboardController.setShowMode(SHOW_MODE_HIDDEN));
-
- waitForImePresentToBe(false);
-
- assertTrue(mKeyboardController.setShowMode(SHOW_MODE_AUTO));
- }
-
private void waitForCallbackValueWithLock(int expectedValue) throws Exception {
long timeoutTimeMillis = SystemClock.uptimeMillis() + TIMEOUT_PROPAGATE_SETTING;
@@ -180,89 +160,8 @@
+ "> does not match expected value < " + expectedValue + ">");
}
- private void waitForWindowChanges() {
- try {
- mUiAutomation.executeAndWaitForEvent(new Runnable() {
- @Override
- public void run() {
- // Do nothing.
- }
- },
- new UiAutomation.AccessibilityEventFilter() {
- @Override
- public boolean accept (AccessibilityEvent event) {
- return event.getEventType() == AccessibilityEvent.TYPE_WINDOWS_CHANGED;
- }
- },
- TIMEOUT_PROPAGATE_SETTING);
- } catch (TimeoutException ignored) {
- // Ignore since the event could have occurred before this method was called. There
- // should be a check after this method returns to catch incorrect values.
- }
- }
-
- private boolean isImeWindowPresent() {
- List<AccessibilityWindowInfo> windows = mUiAutomation.getWindows();
- for (int i = 0; i < windows.size(); i++) {
- if (windows.get(i).getType() == AccessibilityWindowInfo.TYPE_INPUT_METHOD) {
- return true;
- }
- }
- return false;
- }
-
- private void waitForImePresentToBe(boolean imeShown) {
- long timeOutTime = System.currentTimeMillis() + TIMEOUT_ASYNC_PROCESSING;
- while (isImeWindowPresent() != imeShown) {
- assertTrue(System.currentTimeMillis() < timeOutTime);
- waitForWindowChanges();
- }
- }
-
/**
- * Tries to call {@link InputMethodManager#hideSoftInputFromWindow(IBinder, int)} to see if
- * software keyboard is shown as a result or not.
- * @return {@code true} if the current input method reported that it is currently shown
- * @throws Exception when the result is unknown, including the system did not return the result
- * within {@link #TIMEOUT_SHOW_SOFTINPUT_RESULT}
- */
- private boolean tryShowSoftInput() throws Exception {
- final BlockingQueue<Integer> queue = new ArrayBlockingQueue<>(1);
-
- getInstrumentation().runOnMainSync(() -> {
- Activity activity = getActivity();
- ResultReceiver resultReceiver =
- new ResultReceiver(new Handler(activity.getMainLooper())) {
- @Override
- protected void onReceiveResult(int resultCode, Bundle resultData) {
- queue.add(resultCode);
- }
- };
- View editText = activity.findViewById(R.id.edit_text);
- activity.getSystemService(InputMethodManager.class)
- .showSoftInput(editText, InputMethodManager.SHOW_FORCED, resultReceiver);
- });
-
- Integer result;
- try {
- result = queue.poll(TIMEOUT_SHOW_SOFTINPUT_RESULT, TimeUnit.MILLISECONDS);
- } catch (InterruptedException e) {
- throw new Exception("Failed to get the result of showSoftInput().", e);
- }
- if (result == null) {
- throw new Exception("Failed to get the result of showSoftInput() within timeout.");
- }
- switch (result) {
- case InputMethodManager.RESULT_SHOWN:
- case InputMethodManager.RESULT_UNCHANGED_SHOWN:
- return true;
- default:
- return false;
- }
- }
-
- /**
- * Activity for testing the AccessibilityService API for hiding and showring the soft keyboard.
+ * Activity for testing the AccessibilityService API for hiding and showing the soft keyboard.
*/
public static class SoftKeyboardModesActivity extends AccessibilityTestActivity {
public SoftKeyboardModesActivity() {
diff --git a/tests/tests/graphics/src/android/graphics/cts/VulkanFeaturesTest.java b/tests/tests/graphics/src/android/graphics/cts/VulkanFeaturesTest.java
index 21e9086..5448b11 100644
--- a/tests/tests/graphics/src/android/graphics/cts/VulkanFeaturesTest.java
+++ b/tests/tests/graphics/src/android/graphics/cts/VulkanFeaturesTest.java
@@ -221,17 +221,14 @@
}
private int determineHardwareCompute(JSONObject device) throws JSONException {
- boolean have16bitStorage = false;
boolean haveVariablePointers = false;
JSONArray extensions = device.getJSONArray("extensions");
for (int i = 0; i < extensions.length(); i++) {
String name = extensions.getJSONObject(i).getString("extensionName");
- if (name.equals("VK_KHR_16bit_storage"))
- have16bitStorage = true;
- else if (name.equals("VK_KHR_variable_pointers"))
+ if (name.equals("VK_KHR_variable_pointers"))
haveVariablePointers = true;
}
- if (!have16bitStorage || !haveVariablePointers) {
+ if (!haveVariablePointers) {
return -1;
}
return 0;
diff --git a/tests/tests/media/src/android/media/cts/DecodeAccuracyTestBase.java b/tests/tests/media/src/android/media/cts/DecodeAccuracyTestBase.java
index 8ec6a97..0c98259 100644
--- a/tests/tests/media/src/android/media/cts/DecodeAccuracyTestBase.java
+++ b/tests/tests/media/src/android/media/cts/DecodeAccuracyTestBase.java
@@ -639,18 +639,16 @@
handler.post(viewCleaner);
}
- public synchronized Bitmap generateBitmapFromVideoViewSnapshot(VideoViewSnapshot snapshot) {
- final long timeOutMs = TimeUnit.SECONDS.toMillis(30);
- final long start = SystemClock.elapsedRealtime();
+ public Bitmap generateBitmapFromVideoViewSnapshot(VideoViewSnapshot snapshot) {
handler.post(snapshot);
- try {
- while (!snapshot.isBitmapReady()
- && (SystemClock.elapsedRealtime() - start < timeOutMs)) {
- Thread.sleep(100);
+ synchronized (snapshot.getSyncObject()) {
+ try {
+ snapshot.getSyncObject().wait(snapshot.SNAPSHOT_TIMEOUT_MS + 100);
+ } catch (InterruptedException e) {
+ e.printStackTrace();
+ Log.e(TAG, "Unable to finish generateBitmapFromVideoViewSnapshot().");
+ return null;
}
- } catch (InterruptedException e) {
- e.printStackTrace();
- return null;
}
if (!snapshot.isBitmapReady()) {
Log.e(TAG, "Time out in generateBitmapFromVideoViewSnapshot().");
@@ -1300,10 +1298,16 @@
/* Definition of a VideoViewSnapshot and a runnable to get a bitmap from a view. */
abstract class VideoViewSnapshot implements Runnable {
+ public static final long SNAPSHOT_TIMEOUT_MS = TimeUnit.SECONDS.toMillis(30);
+ public static final long SLEEP_TIME_MS = 30;
+ public static final Object SYNC_TOKEN = new Object();
+
public abstract Bitmap getBitmap();
public abstract boolean isBitmapReady();
+ public abstract Object getSyncObject();
+
}
/* Runnable to get a bitmap from a texture view on the UI thread via a handler.
@@ -1320,9 +1324,12 @@
}
@Override
- public synchronized void run() {
+ public void run() {
bitmap = null;
bitmap = tv.getBitmap();
+ synchronized (SYNC_TOKEN) {
+ SYNC_TOKEN.notify();
+ }
}
@Override
@@ -1335,6 +1342,11 @@
return bitmap != null;
}
+ @Override
+ public Object getSyncObject() {
+ return SYNC_TOKEN;
+ }
+
}
/**
@@ -1346,7 +1358,6 @@
class SurfaceViewSnapshot extends VideoViewSnapshot {
private static final String TAG = SurfaceViewSnapshot.class.getSimpleName();
- private static final int PIXELCOPY_REQUEST_SLEEP_MS = 30;
private static final int PIXELCOPY_TIMEOUT_MS = 1000;
private static final int INITIAL_STATE = -1;
@@ -1354,7 +1365,6 @@
private final int width;
private final int height;
- private SynchronousPixelCopy copyHelper;
private Bitmap bitmap;
private int copyResult;
@@ -1367,20 +1377,26 @@
}
@Override
- public synchronized void run() {
+ public void run() {
+ final long start = SystemClock.elapsedRealtime();
copyResult = INITIAL_STATE;
final SynchronousPixelCopy copyHelper = new SynchronousPixelCopy();
bitmap = Bitmap.createBitmap(width, height, Config.ARGB_8888);
try {
// Wait for PixelCopy to finish.
- while ((copyResult = copyHelper.request(surfaceView, bitmap)) != PixelCopy.SUCCESS) {
- Thread.sleep(PIXELCOPY_REQUEST_SLEEP_MS);
+ while ((copyResult = copyHelper.request(surfaceView, bitmap)) != PixelCopy.SUCCESS
+ && (SystemClock.elapsedRealtime() - start) < SNAPSHOT_TIMEOUT_MS) {
+ Thread.sleep(SLEEP_TIME_MS);
}
} catch (InterruptedException e) {
Log.e(TAG, "Pixel Copy is stopped/interrupted before it finishes.", e);
bitmap = null;
+ } finally {
+ copyHelper.release();
+ synchronized (SYNC_TOKEN) {
+ SYNC_TOKEN.notify();
+ }
}
- copyHelper.release();
}
@Override
@@ -1393,6 +1409,11 @@
return bitmap != null && copyResult == PixelCopy.SUCCESS;
}
+ @Override
+ public Object getSyncObject() {
+ return SYNC_TOKEN;
+ }
+
private static class SynchronousPixelCopy implements OnPixelCopyFinishedListener {
private final Handler handler;
@@ -1453,8 +1474,6 @@
class GLSurfaceViewSnapshot extends VideoViewSnapshot {
private static final String TAG = GLSurfaceViewSnapshot.class.getSimpleName();
- private static final int GET_BYTEBUFFER_SLEEP_MS = 30;
- private static final int GET_BYTEBUFFER_MAX_ATTEMPTS = 30;
private final GLSurfaceViewFactory glSurfaceViewFactory;
private final int width;
@@ -1470,7 +1489,7 @@
}
@Override
- public synchronized void run() {
+ public void run() {
bitmapIsReady = false;
bitmap = null;
try {
@@ -1478,6 +1497,7 @@
} catch (InterruptedException exception) {
Log.e(TAG, exception.getMessage());
bitmap = null;
+ notifyObject();
return;
}
try {
@@ -1490,6 +1510,8 @@
} catch (NullPointerException exception) {
Log.e(TAG, "glSurfaceViewFactory or byteBuffer may have been released", exception);
bitmap = null;
+ } finally {
+ notifyObject();
}
}
@@ -1503,13 +1525,25 @@
return bitmapIsReady;
}
+ @Override
+ public Object getSyncObject() {
+ return SYNC_TOKEN;
+ }
+
+ private void notifyObject() {
+ synchronized (SYNC_TOKEN) {
+ SYNC_TOKEN.notify();
+ }
+ }
+
private void waitForByteBuffer() throws InterruptedException {
// Wait for byte buffer to be ready.
- for (int i = 0; i < GET_BYTEBUFFER_MAX_ATTEMPTS; i++) {
+ final long start = SystemClock.elapsedRealtime();
+ while (SystemClock.elapsedRealtime() - start < SNAPSHOT_TIMEOUT_MS) {
if (glSurfaceViewFactory.byteBufferIsReady()) {
return;
}
- Thread.sleep(GET_BYTEBUFFER_SLEEP_MS);
+ Thread.sleep(SLEEP_TIME_MS);
}
throw new InterruptedException("Taking too long to read pixels into a ByteBuffer.");
}
diff --git a/tests/tests/telecom/src/android/telecom/cts/TestUtils.java b/tests/tests/telecom/src/android/telecom/cts/TestUtils.java
index eea7284..7e298ce 100644
--- a/tests/tests/telecom/src/android/telecom/cts/TestUtils.java
+++ b/tests/tests/telecom/src/android/telecom/cts/TestUtils.java
@@ -282,6 +282,9 @@
*/
public static SelfManagedConnection waitForAndGetConnection(Uri address) {
// Wait for creation of the new connection.
+ if (!CtsSelfManagedConnectionService.waitForBinding()) {
+ TestCase.fail("Could not bind to Self-Managed ConnectionService");
+ }
CtsSelfManagedConnectionService connectionService =
CtsSelfManagedConnectionService.getConnectionService();
TestCase.assertTrue(connectionService.waitForUpdate(
diff --git a/tests/tests/telephony/src/android/telephony/cts/CellInfoTest.java b/tests/tests/telephony/src/android/telephony/cts/CellInfoTest.java
index 2dffd4d..1e18760 100644
--- a/tests/tests/telephony/src/android/telephony/cts/CellInfoTest.java
+++ b/tests/tests/telephony/src/android/telephony/cts/CellInfoTest.java
@@ -125,8 +125,13 @@
int earfcn = lte.getCellIdentity().getEarfcn();
// Reference 3GPP 36.101 Table 5.7.3-1
- assertTrue("getEarfcn() out of range [0,47000], earfcn=" + earfcn,
- earfcn >= 0 && earfcn <= 47000);
+ // As per NOTE 1 in the table, although 0-6 are valid channel numbers for
+ // LTE, the reported EARFCN is the center frequency, rendering these channels
+ // out of the range of the narrowest 1.4Mhz deployment.
+ // TODO: cross-reference with the bandwidth to adjust the minimum for 5, 10, and 20
+ // MHz channels
+ assertTrue("getEarfcn() out of range [7,47000], earfcn=" + earfcn,
+ earfcn >= 7 && earfcn <= 47000);
CellSignalStrengthLte cellSignalStrengthLte = lte.getCellSignalStrength();
//Integer.MAX_VALUE indicates an unavailable field
int rsrp = cellSignalStrengthLte.getRsrp();
@@ -159,8 +164,10 @@
int uarfcn = wcdma.getCellIdentity().getUarfcn();
// Reference 3GPP 25.101 Table 5.2
- assertTrue("getUarfcn() out of range [400,11000], uarfcn=" + uarfcn,
- uarfcn >= 400 && uarfcn <= 11000);
+ // From Appendix E.1, even though UARFCN is numbered from 400, the minumum
+ // usable channel is 412 due to the fixed bandwidth of 5Mhz
+ assertTrue("getUarfcn() out of range [412,11000], uarfcn=" + uarfcn,
+ uarfcn >= 412 && uarfcn <= 11000);
int level = wcdma.getCellSignalStrength().getLevel();
assertTrue("getLevel() out of range [0,4], level=" + level, level >=0 && level <= 4);
diff --git a/tests/tests/transition/src/android/transition/cts/TransitionActivity.java b/tests/tests/transition/src/android/transition/cts/TransitionActivity.java
index afc48be..692d323 100644
--- a/tests/tests/transition/src/android/transition/cts/TransitionActivity.java
+++ b/tests/tests/transition/src/android/transition/cts/TransitionActivity.java
@@ -18,12 +18,31 @@
import android.app.Activity;
import android.os.Bundle;
+import android.view.View;
+import android.view.WindowInsets;
+import android.widget.FrameLayout;
-public class TransitionActivity extends Activity {
+public class TransitionActivity extends Activity implements View.OnApplyWindowInsetsListener{
+
+ private View mContent;
+
@Override
public void onCreate(Bundle bundle){
super.onCreate(bundle);
setContentView(R.layout.transition_main);
+ mContent = findViewById(R.id.container);
+ mContent.setOnApplyWindowInsetsListener(this);
+ }
+
+ @Override
+ public WindowInsets onApplyWindowInsets(View v, WindowInsets in) {
+ if (in.isRound()) {
+ FrameLayout.LayoutParams params = (FrameLayout.LayoutParams) mContent.getLayoutParams();
+ params.setMargins(in.getSystemWindowInsetLeft(), in.getSystemWindowInsetTop(),
+ in.getSystemWindowInsetRight(), in.getSystemWindowInsetBottom());
+ mContent.setLayoutParams(params);
+ }
+ return in;
}
}
diff --git a/tests/tests/webkit/src/android/webkit/cts/WebSettingsTest.java b/tests/tests/webkit/src/android/webkit/cts/WebSettingsTest.java
index b02deec..f10e7fd 100644
--- a/tests/tests/webkit/src/android/webkit/cts/WebSettingsTest.java
+++ b/tests/tests/webkit/src/android/webkit/cts/WebSettingsTest.java
@@ -20,10 +20,13 @@
import android.net.http.SslError;
import android.os.Build;
import android.test.ActivityInstrumentationTestCase2;
+import android.util.Base64;
import android.util.Log;
import android.webkit.ConsoleMessage;
import android.webkit.SslErrorHandler;
import android.webkit.WebIconDatabase;
+import android.webkit.WebResourceResponse;
+import android.webkit.WebResourceRequest;
import android.webkit.WebSettings;
import android.webkit.WebSettings.TextSize;
import android.webkit.WebStorage;
@@ -35,7 +38,9 @@
import com.android.compatibility.common.util.NullWebViewUtils;
import com.android.compatibility.common.util.PollingCheck;
+import java.io.ByteArrayInputStream;
import java.io.FileOutputStream;
+import java.nio.charset.StandardCharsets;
import java.util.Locale;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
@@ -944,61 +949,77 @@
if (!NullWebViewUtils.isWebViewAvailable()) {
return;
}
- final class SslWebViewClient extends WaitForLoadedClient {
- public SslWebViewClient() {
+
+ final String INSECURE_BASE_URL = "http://www.example.com/";
+ final String INSECURE_JS_URL = INSECURE_BASE_URL + "insecure.js";
+ final String INSECURE_IMG_URL = INSECURE_BASE_URL + "insecure.png";
+ final String SECURE_URL = "/secure.html";
+ final String JS_HTML = "<script src=\"" + INSECURE_JS_URL + "\"></script>";
+ final String IMG_HTML = "<img src=\"" + INSECURE_IMG_URL + "\" />";
+ final String SECURE_HTML = "<body>" + IMG_HTML + " " + JS_HTML + "</body>";
+ final String JS_CONTENT = "window.loaded_js = 42;";
+ final String IMG_CONTENT = "R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7";
+
+ final class InterceptClient extends WaitForLoadedClient {
+ public int mInsecureJsCounter;
+ public int mInsecureImgCounter;
+
+ public InterceptClient() {
super(mOnUiThread);
}
+
@Override
- public void onReceivedSslError(WebView view,
- SslErrorHandler handler, SslError error) {
+ public void onReceivedSslError(WebView view, SslErrorHandler handler, SslError error) {
handler.proceed();
}
+
+ @Override
+ public WebResourceResponse shouldInterceptRequest(
+ WebView view, WebResourceRequest request) {
+ if (request.getUrl().toString().equals(INSECURE_JS_URL)) {
+ mInsecureJsCounter++;
+ return new WebResourceResponse("text/javascript", "utf-8",
+ new ByteArrayInputStream(JS_CONTENT.getBytes(StandardCharsets.UTF_8)));
+ } else if (request.getUrl().toString().equals(INSECURE_IMG_URL)) {
+ mInsecureImgCounter++;
+ return new WebResourceResponse("image/gif", "utf-8",
+ new ByteArrayInputStream(Base64.decode(IMG_CONTENT, Base64.DEFAULT)));
+ }
+
+ if (request.getUrl().toString().startsWith(INSECURE_BASE_URL)) {
+ return new WebResourceResponse("text/html", "UTF-8", null);
+ }
+ return null;
+ }
}
+ InterceptClient interceptClient = new InterceptClient();
+ mOnUiThread.setWebViewClient(interceptClient);
mSettings.setJavaScriptEnabled(true);
TestWebServer httpsServer = null;
- TestWebServer httpServer = null;
try {
httpsServer = new TestWebServer(true);
- httpServer = new TestWebServer(false);
- final String JS_URL = "/insecure.js";
- final String IMG_URL = "/insecure.png";
- final String SECURE_URL = "/secure.html";
- final String JS_HTML = "<script src=\"" + httpServer.getResponseUrl(JS_URL) +
- "\"></script>";
- final String IMG_HTML = "<img src=\"" + httpServer.getResponseUrl(IMG_URL) + "\" />";
- final String SECURE_HTML = "<body>" + IMG_HTML + " " + JS_HTML + "</body>";
- httpServer.setResponse(JS_URL, "window.loaded_js = 42;", null);
- httpServer.setResponseBase64(IMG_URL,
- "data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7",
- null);
String secureUrl = httpsServer.setResponse(SECURE_URL, SECURE_HTML, null);
-
mOnUiThread.clearSslPreferences();
- mOnUiThread.setWebViewClient(new SslWebViewClient());
-
mSettings.setMixedContentMode(WebSettings.MIXED_CONTENT_NEVER_ALLOW);
mOnUiThread.loadUrlAndWaitForCompletion(secureUrl);
assertEquals(1, httpsServer.getRequestCount(SECURE_URL));
- assertEquals(0, httpServer.getRequestCount(JS_URL));
- assertEquals(0, httpServer.getRequestCount(IMG_URL));
+ assertEquals(0, interceptClient.mInsecureJsCounter);
+ assertEquals(0, interceptClient.mInsecureImgCounter);
mSettings.setMixedContentMode(WebSettings.MIXED_CONTENT_ALWAYS_ALLOW);
mOnUiThread.loadUrlAndWaitForCompletion(secureUrl);
assertEquals(2, httpsServer.getRequestCount(SECURE_URL));
- assertEquals(1, httpServer.getRequestCount(JS_URL));
- assertEquals(1, httpServer.getRequestCount(IMG_URL));
+ assertEquals(1, interceptClient.mInsecureJsCounter);
+ assertEquals(1, interceptClient.mInsecureImgCounter);
mSettings.setMixedContentMode(WebSettings.MIXED_CONTENT_COMPATIBILITY_MODE);
mOnUiThread.loadUrlAndWaitForCompletion(secureUrl);
assertEquals(3, httpsServer.getRequestCount(SECURE_URL));
- assertEquals(1, httpServer.getRequestCount(JS_URL));
- assertEquals(2, httpServer.getRequestCount(IMG_URL));
+ assertEquals(1, interceptClient.mInsecureJsCounter);
+ assertEquals(2, interceptClient.mInsecureImgCounter);
} finally {
- if (httpServer != null) {
- httpServer.shutdown();
- }
if (httpsServer != null) {
httpsServer.shutdown();
}
diff --git a/tools/cts-tradefed/Android.mk b/tools/cts-tradefed/Android.mk
index 5276105..947a486 100644
--- a/tools/cts-tradefed/Android.mk
+++ b/tools/cts-tradefed/Android.mk
@@ -25,7 +25,7 @@
LOCAL_SUITE_TARGET_ARCH := $(TARGET_ARCH)
LOCAL_SUITE_NAME := CTS
LOCAL_SUITE_FULLNAME := "Compatibility Test Suite"
-LOCAL_SUITE_VERSION := 8.0_r6
+LOCAL_SUITE_VERSION := 8.0_r7
LOCAL_MODULE := cts-tradefed
LOCAL_COMPATIBILITY_SUITE := general-tests