Merge "App Standby Settings key is set incorrectly" into pie-cts-dev
diff --git a/common/device-side/util/src/com/android/compatibility/common/util/ApiLevelUtil.java b/common/device-side/util/src/com/android/compatibility/common/util/ApiLevelUtil.java
index a49e949..943ebc7 100644
--- a/common/device-side/util/src/com/android/compatibility/common/util/ApiLevelUtil.java
+++ b/common/device-side/util/src/com/android/compatibility/common/util/ApiLevelUtil.java
@@ -46,7 +46,7 @@
}
public static boolean isAtLeast(String version) {
- return Build.VERSION.SDK_INT > resolveVersionString(version);
+ return Build.VERSION.SDK_INT >= resolveVersionString(version);
}
public static boolean isAtMost(int version) {
diff --git a/tests/framework/base/activitymanager/app/src/android/server/am/AssistantVoiceInteractionService.java b/tests/framework/base/activitymanager/app/src/android/server/am/AssistantVoiceInteractionService.java
index b772ce2..30f7a85 100644
--- a/tests/framework/base/activitymanager/app/src/android/server/am/AssistantVoiceInteractionService.java
+++ b/tests/framework/base/activitymanager/app/src/android/server/am/AssistantVoiceInteractionService.java
@@ -29,10 +29,14 @@
private boolean mReady;
+ private boolean mStarted;
+ private Bundle mExtras;
+
@Override
public void onReady() {
super.onReady();
mReady = true;
+ showSessionIfReady();
}
@Override
@@ -43,13 +47,18 @@
stopSelf();
return START_NOT_STICKY;
}
- if (mReady) {
- Bundle extras = intent.getExtras() != null ? intent.getExtras() : new Bundle();
- showSession(extras, 0);
- }
+ mExtras = intent.getExtras() != null ? intent.getExtras() : new Bundle();
+ mStarted = true;
+ showSessionIfReady();
return START_NOT_STICKY;
}
+ private void showSessionIfReady() {
+ if (mReady && mStarted) {
+ showSession(mExtras, 0);
+ }
+ };
+
/**
* Starts the assistant voice interaction service, which initiates a new session that starts
* the assistant activity.
diff --git a/tests/framework/base/activitymanager/src/android/server/am/ActivityManagerPinnedStackTests.java b/tests/framework/base/activitymanager/src/android/server/am/ActivityManagerPinnedStackTests.java
index b866101..dbc93b4 100644
--- a/tests/framework/base/activitymanager/src/android/server/am/ActivityManagerPinnedStackTests.java
+++ b/tests/framework/base/activitymanager/src/android/server/am/ActivityManagerPinnedStackTests.java
@@ -565,7 +565,7 @@
// Launch first PIP activity
launchActivity(PIP_ACTIVITY, EXTRA_ENTER_PIP, "true");
- waitForEnterPip(PIP_ACTIVITY);
+ waitForEnterPipAnimationComplete(PIP_ACTIVITY);
// Launch second PIP activity
launchActivity(PIP_ACTIVITY2, EXTRA_ENTER_PIP, "true");
diff --git a/tests/libcore/wycheproof-bc/AndroidTest.xml b/tests/libcore/wycheproof-bc/AndroidTest.xml
index 2e92706..8e455bf 100644
--- a/tests/libcore/wycheproof-bc/AndroidTest.xml
+++ b/tests/libcore/wycheproof-bc/AndroidTest.xml
@@ -30,7 +30,7 @@
<option name="instrumentation-arg" key="filter"
value="com.android.cts.core.runner.ExpectationBasedFilter" />
<option name="core-expectation" value="/knownfailures.txt" />
- <option name="runtime-hint" value="10m"/>
- <option name="test-timeout" value="600000" />
+ <option name="runtime-hint" value="16m"/>
+ <option name="test-timeout" value="3600000" />
</test>
</configuration>
diff --git a/tests/signature/dex-checker/dex-checker.cpp b/tests/signature/dex-checker/dex-checker.cpp
index 4a80e02..61d9e32 100644
--- a/tests/signature/dex-checker/dex-checker.cpp
+++ b/tests/signature/dex-checker/dex-checker.cpp
@@ -49,7 +49,8 @@
ScopedUtfChars utf_type(env, type);
jfieldID fid = env->GetFieldID(klass, utf_name.c_str(), utf_type.c_str());
if (env->ExceptionCheck()) {
- env->ExceptionClear();
+ // GetFieldID could have thrown either NoSuchFieldError or ExceptionInInitializerError.
+ // Do not clear the exception, let Java code handle it.
return nullptr;
}
return env->ToReflectedField(klass, fid, /* static */ false);
@@ -62,7 +63,8 @@
ScopedUtfChars utf_type(env, type);
jfieldID fid = env->GetStaticFieldID(klass, utf_name.c_str(), utf_type.c_str());
if (env->ExceptionCheck()) {
- env->ExceptionClear();
+ // GetStaticFieldID could have thrown either NoSuchFieldError or ExceptionInInitializerError.
+ // Do not clear the exception, let Java code handle it.
return nullptr;
}
return env->ToReflectedField(klass, fid, /* static */ true);
@@ -75,7 +77,8 @@
ScopedUtfChars utf_signature(env, signature);
jmethodID mid = env->GetMethodID(klass, utf_name.c_str(), utf_signature.c_str());
if (env->ExceptionCheck()) {
- env->ExceptionClear();
+ // GetMethodID could have thrown either NoSuchMethodError or ExceptionInInitializerError.
+ // Do not clear the exception, let Java code handle it.
return nullptr;
}
return env->ToReflectedMethod(klass, mid, /* static */ false);
@@ -88,7 +91,8 @@
ScopedUtfChars utf_signature(env, signature);
jmethodID mid = env->GetStaticMethodID(klass, utf_name.c_str(), utf_signature.c_str());
if (env->ExceptionCheck()) {
- env->ExceptionClear();
+ // GetStaticMethodID could have thrown either NoSuchMethodError or ExceptionInInitializerError.
+ // Do not clear the exception, let Java code handle it.
return nullptr;
}
return env->ToReflectedMethod(klass, mid, /* static */ true);
diff --git a/tests/signature/intent-check/DynamicConfig.xml b/tests/signature/intent-check/DynamicConfig.xml
index 934d60a..88e4e1c 100644
--- a/tests/signature/intent-check/DynamicConfig.xml
+++ b/tests/signature/intent-check/DynamicConfig.xml
@@ -25,6 +25,8 @@
Bug: 78574873 android.intent.action.EPHEMERAL_RESOLVER_SETTINGS
Bug: 115799975 android.intent.action.ACTION_AIRPLANE_MODE_CHANGED
Will be removed after v17 of CS.apk is released.
+ Bug: 117590943 android.intent.action.View
+ Fixed in GMSCore v14.7.68.
-->
<dynamicConfig>
<entry key ="intent_whitelist">
@@ -37,5 +39,6 @@
<value>android.intent.action.RESOLVE_EPHEMERAL_PACKAGE</value>
<value>android.intent.action.EPHEMERAL_RESOLVER_SETTINGS</value>
<value>android.intent.action.ACTION_AIRPLANE_MODE_CHANGED</value>
+ <value>android.intent.action.View</value>
</entry>
</dynamicConfig>
diff --git a/tests/signature/src/android/signature/cts/DexMemberChecker.java b/tests/signature/src/android/signature/cts/DexMemberChecker.java
index 528e868..1efdbad 100644
--- a/tests/signature/src/android/signature/cts/DexMemberChecker.java
+++ b/tests/signature/src/android/signature/cts/DexMemberChecker.java
@@ -16,6 +16,7 @@
package android.signature.cts;
+import android.util.Log;
import java.lang.reflect.Constructor;
import java.lang.reflect.Executable;
import java.lang.reflect.Field;
@@ -24,6 +25,7 @@
import java.util.List;
public class DexMemberChecker {
+ public static final String TAG = "DexMemberChecker";
public interface Observer {
void classAccessible(boolean accessible, DexMember member);
@@ -85,17 +87,39 @@
observer.fieldAccessibleViaReflection(
hasMatchingField_Reflection(klass, field),
field);
- observer.fieldAccessibleViaJni(
- hasMatchingField_JNI(klass, field),
- field);
+ try {
+ observer.fieldAccessibleViaJni(
+ hasMatchingField_JNI(klass, field),
+ field);
+ } catch (ExceptionInInitializerError | UnsatisfiedLinkError | NoClassDefFoundError e) {
+ if ((e instanceof NoClassDefFoundError)
+ && !(e.getCause() instanceof ExceptionInInitializerError)
+ && !(e.getCause() instanceof UnsatisfiedLinkError)) {
+ throw e;
+ }
+
+ // Could not initialize the class. Skip JNI test.
+ Log.w(TAG, "JNI failed for " + dexMember.toString(), e);
+ }
} else if (dexMember instanceof DexMethod) {
DexMethod method = (DexMethod) dexMember;
observer.methodAccessibleViaReflection(
hasMatchingMethod_Reflection(klass, method),
method);
- observer.methodAccessibleViaJni(
- hasMatchingMethod_JNI(klass, method),
- method);
+ try {
+ observer.methodAccessibleViaJni(
+ hasMatchingMethod_JNI(klass, method),
+ method);
+ } catch (ExceptionInInitializerError | UnsatisfiedLinkError | NoClassDefFoundError e) {
+ if ((e instanceof NoClassDefFoundError)
+ && !(e.getCause() instanceof ExceptionInInitializerError)
+ && !(e.getCause() instanceof UnsatisfiedLinkError)) {
+ throw e;
+ }
+
+ // Could not initialize the class. Skip JNI test.
+ Log.w(TAG, "JNI failed for " + dexMember.toString(), e);
+ }
} else {
throw new IllegalStateException("Unexpected type of dex member");
}
@@ -134,10 +158,25 @@
}
private static boolean hasMatchingField_JNI(Class<?> klass, DexField dexField) {
- Field ifield = getField_JNI(klass, dexField.getName(), dexField.getDexType());
- Field sfield = getStaticField_JNI(klass, dexField.getName(), dexField.getDexType());
- return (ifield != null && ifield.getDeclaringClass() == klass) ||
- (sfield != null && sfield.getDeclaringClass() == klass);
+ try {
+ Field ifield = getField_JNI(klass, dexField.getName(), dexField.getDexType());
+ if (ifield.getDeclaringClass() == klass) {
+ return true;
+ }
+ } catch (NoSuchFieldError e) {
+ // Not found.
+ }
+
+ try {
+ Field sfield = getStaticField_JNI(klass, dexField.getName(), dexField.getDexType());
+ if (sfield.getDeclaringClass() == klass) {
+ return true;
+ }
+ } catch (NoSuchFieldError e) {
+ // Not found.
+ }
+
+ return false;
}
private static boolean hasMatchingMethod_Reflection(Class<?> klass, DexMethod dexMethod) {
@@ -163,11 +202,29 @@
}
private static boolean hasMatchingMethod_JNI(Class<?> klass, DexMethod dexMethod) {
- Executable imethod = getMethod_JNI(klass, dexMethod.getName(), dexMethod.getDexSignature());
- Executable smethod = dexMethod.isConstructor() ? null :
- getStaticMethod_JNI(klass, dexMethod.getName(), dexMethod.getDexSignature());
- return (imethod != null && imethod.getDeclaringClass() == klass) ||
- (smethod != null && smethod.getDeclaringClass() == klass);
+ try {
+ Executable imethod = getMethod_JNI(
+ klass, dexMethod.getName(), dexMethod.getDexSignature());
+ if (imethod.getDeclaringClass() == klass) {
+ return true;
+ }
+ } catch (NoSuchMethodError e) {
+ // Not found.
+ }
+
+ if (!dexMethod.isConstructor()) {
+ try {
+ Executable smethod =
+ getStaticMethod_JNI(klass, dexMethod.getName(), dexMethod.getDexSignature());
+ if (smethod.getDeclaringClass() == klass) {
+ return true;
+ }
+ } catch (NoSuchMethodError e) {
+ // Not found.
+ }
+ }
+
+ return false;
}
private static native Field getField_JNI(Class<?> klass, String name, String type);
diff --git a/tests/tests/jni/src/android/jni/cts/LinkerNamespacesHelper.java b/tests/tests/jni/src/android/jni/cts/LinkerNamespacesHelper.java
index cf6da3c..1bc5f8c 100644
--- a/tests/tests/jni/src/android/jni/cts/LinkerNamespacesHelper.java
+++ b/tests/tests/jni/src/android/jni/cts/LinkerNamespacesHelper.java
@@ -41,8 +41,6 @@
private final static String SYSTEM_CONFIG_FILE = PUBLIC_CONFIG_DIR + "public.libraries.txt";
private final static Pattern EXTENSION_CONFIG_FILE_PATTERN = Pattern.compile(
"public\\.libraries-([A-Za-z0-9\\-_.]+)\\.txt");
- private final static Pattern EXTENSION_LIBRARY_FILE_PATTERN = Pattern.compile(
- "lib[^.]+\\.([A-Za-z0-9\\-_.]+)\\.so");
private final static String VENDOR_CONFIG_FILE = "/vendor/etc/public.libraries.txt";
private final static String[] PUBLIC_SYSTEM_LIBRARIES = {
"libaaudio.so",
@@ -126,8 +124,12 @@
// libFoo.acme.so
List<String> libNames = readPublicLibrariesFile(configFile);
for (String lib : libNames) {
- Matcher libMatcher = EXTENSION_LIBRARY_FILE_PATTERN.matcher(lib);
- if (libMatcher.matches() && libMatcher.group(1).equals(companyName)) {
+ int space = lib.lastIndexOf(' ');
+ if (space != -1) {
+ // Drop 64 or 32 from 'libFoo.so 64'
+ lib = lib.substring(0, space);
+ }
+ if (lib.endsWith("." + companyName + ".so")) {
libs.add(lib);
} else {
return "Library \"" + lib + "\" in " + configFile.toString()
diff --git a/tests/tests/media/src/android/media/cts/MediaSessionManagerTest.java b/tests/tests/media/src/android/media/cts/MediaSessionManagerTest.java
index 1d77473..926abd8 100644
--- a/tests/tests/media/src/android/media/cts/MediaSessionManagerTest.java
+++ b/tests/tests/media/src/android/media/cts/MediaSessionManagerTest.java
@@ -226,6 +226,11 @@
session.setFlags(MediaSession.FLAG_HANDLES_MEDIA_BUTTONS
| MediaSession.FLAG_HANDLES_TRANSPORT_CONTROLS);
session.setCallback(callback, handler);
+ PlaybackState state = new PlaybackState.Builder()
+ .setState(PlaybackState.STATE_PLAYING, 0, 1.0f).build();
+ // Fake the media session service so this session can take the media key events.
+ session.setPlaybackState(state);
+ session.setActive(true);
// A media playback is also needed to receive media key events.
Utils.assertMediaPlaybackStarted(context);
diff --git a/tests/tests/nativehardware/jni/AHardwareBufferGLTest.cpp b/tests/tests/nativehardware/jni/AHardwareBufferGLTest.cpp
index 36f1b8a..fd0d37b 100644
--- a/tests/tests/nativehardware/jni/AHardwareBufferGLTest.cpp
+++ b/tests/tests/nativehardware/jni/AHardwareBufferGLTest.cpp
@@ -502,29 +502,14 @@
}
)glsl";
-const char* kSsboVertexShaderEs31 = R"glsl(#version 310 es
- in vec2 aPosition;
- in float aDepth;
- uniform mediump float uScale;
+const char* kSsboComputeShaderEs31 = R"glsl(#version 310 es
+ layout(local_size_x = 1) in;
layout(std430, binding=0) buffer Output {
- vec2 data[];
+ uint data[];
} bOutput;
- out mediump vec2 vTexCoords;
void main() {
- bOutput.data[gl_VertexID] = aPosition;
- vTexCoords = (vec2(1.0) + aPosition) * 0.5;
- gl_Position.xy = aPosition * uScale;
- gl_Position.z = aDepth;
- gl_Position.w = 1.0;
- }
-)glsl";
-
-const char* kColorFragmentShaderEs3x = R"glsl(
- precision mediump float;
- uniform lowp vec4 uColor;
- out mediump vec4 color;
- void main() {
- color = uColor;
+ bOutput.data[gl_GlobalInvocationID.x] =
+ gl_GlobalInvocationID.x * 3u;
}
)glsl";
@@ -998,6 +983,7 @@
internal_format = GL_DEPTH_STENCIL_OES;
format = GL_DEPTH_STENCIL;
type = GL_UNSIGNED_INT_24_8;
+ break;
default:
FAIL() << "Unrecognized GL format"; break;
}
@@ -1232,8 +1218,9 @@
mGLVersion / 10, mGLVersion % 10);
return;
}
+ const int kBufferElements = 16;
AHardwareBuffer_Desc desc = GetParam();
- desc.width = sizeof kQuadPositions;
+ desc.width = kBufferElements * sizeof(int);
desc.usage = AHARDWAREBUFFER_USAGE_CPU_READ_RARELY | AHARDWAREBUFFER_USAGE_GPU_DATA_BUFFER;
if (!SetUpBuffer(desc)) return;
@@ -1244,30 +1231,44 @@
}
// Clear the buffer to zero
- std::vector<float> zero_data(desc.width / sizeof(float), 0.f);
- glBufferSubData(GL_SHADER_STORAGE_BUFFER, 0, desc.width, zero_data.data());
+ std::vector<unsigned int> expected_data(kBufferElements, 0U);
+ glBufferSubData(GL_SHADER_STORAGE_BUFFER, 0, desc.width, expected_data.data());
glFinish();
- // Write into the buffer with a shader
- SetUpFramebuffer(40, 40, 0, kRenderbuffer);
- SetUpProgram(kSsboVertexShaderEs31, std::string("#version 310 es") + kColorFragmentShaderEs3x,
- kQuadPositions, 0.5f);
+ // Write into the buffer with a compute shader
+ GLint status = 0;
+ mProgram = glCreateProgram();
+ GLuint shader = glCreateShader(GL_COMPUTE_SHADER);
+ glShaderSource(shader, 1, &kSsboComputeShaderEs31, nullptr);
+ glCompileShader(shader);
+ glGetShaderiv(shader, GL_COMPILE_STATUS, &status);
+ ASSERT_EQ(GL_TRUE, status) << "Compute shader compilation failed";
+ glAttachShader(mProgram, shader);
+ glLinkProgram(mProgram);
+ glGetProgramiv(mProgram, GL_LINK_STATUS, &status);
+ ASSERT_EQ(GL_TRUE, status) << "Shader program linking failed";
+ glDetachShader(mProgram, shader);
+ glDeleteShader(shader);
+ glUseProgram(mProgram);
+ ASSERT_EQ(GLenum{GL_NO_ERROR}, glGetError());
glBindBufferBase(GL_SHADER_STORAGE_BUFFER, 0, mBufferObjects[mWhich]);
- glDrawArrays(GL_TRIANGLES, 0, kQuadVertexCount);
+ glDispatchCompute(kBufferElements, 1, 1);
+ glMemoryBarrier(GL_BUFFER_UPDATE_BARRIER_BIT);
glFinish();
EXPECT_EQ(GLenum{GL_NO_ERROR}, glGetError());
// Inspect the data written into the buffer using CPU access.
MakeCurrent(0);
- float* data = nullptr;
+ unsigned int* data = nullptr;
int result = AHardwareBuffer_lock(mBuffer, AHARDWAREBUFFER_USAGE_CPU_READ_RARELY,
-1, nullptr, reinterpret_cast<void**>(&data));
ASSERT_EQ(NO_ERROR, result);
std::ostringstream s;
- for (int i = 0; i < 12; ++i) {
+ for (int i = 0; i < kBufferElements; ++i) {
+ expected_data[i] = static_cast<unsigned int>(i * 3);
s << data[i] << ", ";
}
- EXPECT_EQ(0, memcmp(kQuadPositions, data, desc.width)) << s.str();
+ EXPECT_EQ(0, memcmp(expected_data.data(), data, desc.width)) << s.str();
AHardwareBuffer_unlock(mBuffer, nullptr);
}
diff --git a/tests/tests/systemui/src/android/systemui/cts/LightBarTestBase.java b/tests/tests/systemui/src/android/systemui/cts/LightBarTestBase.java
index dde2ce1..a56ab29 100644
--- a/tests/tests/systemui/src/android/systemui/cts/LightBarTestBase.java
+++ b/tests/tests/systemui/src/android/systemui/cts/LightBarTestBase.java
@@ -26,10 +26,11 @@
import android.content.pm.PackageManager;
import android.content.res.Configuration;
import android.graphics.Bitmap;
+import android.graphics.Rect;
import android.support.test.InstrumentationRegistry;
import android.support.test.rule.ActivityTestRule;
import android.util.Log;
-import android.view.KeyEvent;
+import android.view.DisplayCutout;
import android.view.WindowInsets;
import java.io.File;
@@ -37,6 +38,8 @@
import java.io.IOException;
import java.nio.file.FileSystems;
import java.nio.file.Path;
+import java.util.ArrayList;
+import java.util.Locale;
public class LightBarTestBase {
@@ -45,6 +48,8 @@
public static final Path DUMP_PATH = FileSystems.getDefault()
.getPath("/sdcard/LightBarTestBase/");
+ private ArrayList<Rect> mCutouts;
+
protected Bitmap takeStatusBarScreenshot(LightBarBaseActivity activity) {
Bitmap fullBitmap = getInstrumentation().getUiAutomation().takeScreenshot();
return Bitmap.createBitmap(fullBitmap, 0, 0, activity.getWidth(), activity.getTop());
@@ -144,18 +149,30 @@
int[] pixels = new int[bitmap.getHeight() * bitmap.getWidth()];
bitmap.getPixels(pixels, 0, bitmap.getWidth(), 0, 0, bitmap.getWidth(), bitmap.getHeight());
+ loadCutout(activity);
int backgroundColorPixelCount = 0;
+ int shiftY = activity.getBottom();
for (int i = 0; i < pixels.length; i++) {
- if (pixels[i] == backgroundColor) {
+ int x = i % bitmap.getWidth();
+ int y = i / bitmap.getWidth();
+
+ if (pixels[i] == backgroundColor
+ || isInsideCutout(x, shiftY + y)) {
backgroundColorPixelCount++;
}
}
assumeNavigationBarChangesColor(backgroundColorPixelCount, pixels.length);
for (int col = 0; col < bitmap.getWidth(); col++) {
+ if (isInsideCutout(col, shiftY)) {
+ continue;
+ }
+
if (dividerColor != pixels[col]) {
dumpBitmap(bitmap, methodName);
- fail("Invalid color exptected=" + dividerColor + " actual=" + pixels[col]);
+ fail(String.format(Locale.ENGLISH,
+ "Invalid color expected= 0x%08x, actual= 0x%08x",
+ dividerColor, pixels[col]));
}
}
}
@@ -164,4 +181,25 @@
assumeTrue("Not enough background pixels. The navigation bar may not be able to change "
+ "color.", backgroundColorPixelCount > 0.3f * totalPixel);
}
+
+ protected ArrayList loadCutout(LightBarBaseActivity activity) {
+ mCutouts = new ArrayList<>();
+ InstrumentationRegistry.getInstrumentation().runOnMainSync(()-> {
+ WindowInsets windowInsets = activity.getRootWindowInsets();
+ DisplayCutout displayCutout = windowInsets.getDisplayCutout();
+ if (displayCutout != null) {
+ mCutouts.addAll(displayCutout.getBoundingRects());
+ }
+ });
+ return mCutouts;
+ }
+
+ protected boolean isInsideCutout(int x, int y) {
+ for (Rect cutout : mCutouts) {
+ if (cutout.contains(x, y)) {
+ return true;
+ }
+ }
+ return false;
+ }
}
diff --git a/tests/tests/systemui/src/android/systemui/cts/LightBarTests.java b/tests/tests/systemui/src/android/systemui/cts/LightBarTests.java
index 724bca0..5566a0d 100644
--- a/tests/tests/systemui/src/android/systemui/cts/LightBarTests.java
+++ b/tests/tests/systemui/src/android/systemui/cts/LightBarTests.java
@@ -20,13 +20,11 @@
import static org.junit.Assert.assertTrue;
import static org.junit.Assert.fail;
-import android.app.ActivityManager;
import android.app.Notification;
import android.app.NotificationChannel;
import android.app.NotificationManager;
import android.app.UiAutomation;
import android.content.Context;
-import android.content.pm.PackageManager;
import android.graphics.Bitmap;
import android.graphics.Color;
import android.os.SystemClock;
@@ -96,7 +94,7 @@
Thread.sleep(WAIT_TIME);
Bitmap bitmap = takeStatusBarScreenshot(mActivityRule.getActivity());
- Stats s = evaluateLightBarBitmap(bitmap, Color.RED /* background */);
+ Stats s = evaluateLightBarBitmap(bitmap, Color.RED /* background */, 0);
assertLightStats(bitmap, s);
mNm.cancelAll();
@@ -116,8 +114,9 @@
injectCanceledTap(x, y);
Thread.sleep(WAIT_TIME);
- Bitmap bitmap = takeNavigationBarScreenshot(mActivityRule.getActivity());
- Stats s = evaluateLightBarBitmap(bitmap, Color.RED /* background */);
+ LightBarActivity activity = mActivityRule.getActivity();
+ Bitmap bitmap = takeNavigationBarScreenshot(activity);
+ Stats s = evaluateLightBarBitmap(bitmap, Color.RED /* background */, activity.getBottom());
assertLightStats(bitmap, s);
}
@@ -225,7 +224,7 @@
}
}
- private Stats evaluateLightBarBitmap(Bitmap bitmap, int background) {
+ private Stats evaluateLightBarBitmap(Bitmap bitmap, int background, int shiftY) {
int iconColor = 0x99000000;
int iconPartialColor = 0x3d000000;
@@ -247,8 +246,17 @@
Stats s = new Stats();
float eps = 0.005f;
+ loadCutout(mActivityRule.getActivity());
float [] hsvPixel = new float[3];
+ int i = 0;
for (int c : pixels) {
+ int x = i % bitmap.getWidth();
+ int y = i / bitmap.getWidth();
+ i++;
+ if (isInsideCutout(x, shiftY + y)) {
+ continue;
+ }
+
if (isColorSame(c, background)) {
s.backgroundPixels++;
continue;
diff --git a/tests/tests/webkit/src/android/webkit/cts/TestHtmlConstants.java b/tests/tests/webkit/src/android/webkit/cts/TestHtmlConstants.java
index 68d944b..2996c76 100644
--- a/tests/tests/webkit/src/android/webkit/cts/TestHtmlConstants.java
+++ b/tests/tests/webkit/src/android/webkit/cts/TestHtmlConstants.java
@@ -69,6 +69,7 @@
public static final String STOP_LOADING_URL = "webkit/test_stop_loading.html";
public static final String BLANK_TAG_URL = "webkit/blank_tag.html";
public static final String PAGE_WITH_LINK_URL = "webkit/page_with_link.html";
+ public static final String URL_IN_PAGE_WITH_LINK = "http://foo.com/";
// Not a real page, just triggers a 404 response.
public static final String NON_EXISTENT_PAGE_URL = "webkit/generate_404.html";
public static final String BAD_IMAGE_PAGE_URL = "webkit/test_bad_image_url.html";
diff --git a/tests/tests/webkit/src/android/webkit/cts/WebViewClientTest.java b/tests/tests/webkit/src/android/webkit/cts/WebViewClientTest.java
index 58e59e5..3ce66ac 100644
--- a/tests/tests/webkit/src/android/webkit/cts/WebViewClientTest.java
+++ b/tests/tests/webkit/src/android/webkit/cts/WebViewClientTest.java
@@ -137,6 +137,7 @@
final WebView childWebView = mOnUiThread.createWebView();
+ WebViewOnUiThread childWebViewOnUiThread = new WebViewOnUiThread(this, childWebView);
mOnUiThread.setWebChromeClient(new WebChromeClient() {
@Override
public boolean onCreateWindow(
@@ -152,21 +153,26 @@
return true;
}
});
- mOnUiThread.loadUrl(mWebServer.getAssetUrl(TestHtmlConstants.BLANK_TAG_URL));
+ {
+ final int childCallCount = childWebViewClient.getShouldOverrideUrlLoadingCallCount();
+ mOnUiThread.loadUrl(mWebServer.getAssetUrl(TestHtmlConstants.BLANK_TAG_URL));
- new PollingCheck(TEST_TIMEOUT) {
- @Override
- protected boolean check() {
- return childWebViewClient.hasOnPageFinishedCalled();
- }
- }.run();
- assertEquals(mWebServer.getAssetUrl(TestHtmlConstants.PAGE_WITH_LINK_URL),
- childWebViewClient.getLastShouldOverrideUrl());
+ new PollingCheck(TEST_TIMEOUT) {
+ @Override
+ protected boolean check() {
+ return childWebViewClient.hasOnPageFinishedCalled();
+ }
+ }.run();
+ new PollingCheck(TEST_TIMEOUT) {
+ @Override
+ protected boolean check() {
+ return childWebViewClient.getShouldOverrideUrlLoadingCallCount() > childCallCount;
+ }
+ }.run();
+ assertEquals(mWebServer.getAssetUrl(TestHtmlConstants.PAGE_WITH_LINK_URL),
+ childWebViewClient.getLastShouldOverrideUrl());
+ }
- // Now test a navigation within the page
- //TODO(hush) Enable this portion when b/12804986 is fixed.
- /*
- WebViewOnUiThread childWebViewOnUiThread = new WebViewOnUiThread(this, childWebView);
final int childCallCount = childWebViewClient.getShouldOverrideUrlLoadingCallCount();
final int mainCallCount = mainWebViewClient.getShouldOverrideUrlLoadingCallCount();
clickOnLinkUsingJs("link", childWebViewOnUiThread);
@@ -177,8 +183,8 @@
}
}.run();
assertEquals(mainCallCount, mainWebViewClient.getShouldOverrideUrlLoadingCallCount());
- assertEquals(TEST_URL, childWebViewClient.getLastShouldOverrideUrl());
- */
+ assertEquals(
+ TestHtmlConstants.URL_IN_PAGE_WITH_LINK, childWebViewClient.getLastShouldOverrideUrl());
}
private void clickOnLinkUsingJs(final String linkId, WebViewOnUiThread webViewOnUiThread) {
@@ -781,7 +787,6 @@
@Override
public void onLoadResource(WebView view, String url) {
super.onLoadResource(view, url);
- assertTrue(mOnPageStartedCalled);
mOnLoadResourceCalled = true;
}