Merge "API REVIEW: android.view.accessibility" into jb-dev
diff --git a/hostsidetests/appsecurity/test-apps/PermissionDeclareApp/AndroidManifest.xml b/hostsidetests/appsecurity/test-apps/PermissionDeclareApp/AndroidManifest.xml
index c8eb70d..00c996c 100644
--- a/hostsidetests/appsecurity/test-apps/PermissionDeclareApp/AndroidManifest.xml
+++ b/hostsidetests/appsecurity/test-apps/PermissionDeclareApp/AndroidManifest.xml
@@ -91,7 +91,7 @@
android:authorities="ctspermissionwithsignaturepathrestricting">
<!-- Require signature permission to get into path. -->
<path-permission
- android:pathPrefix="/foo.*"
+ android:pathPrefix="/foo"
android:readPermission="com.android.cts.permissionWithSignature"
android:writePermission="com.android.cts.permissionWithSignature" />
<!-- Allow access to a specific path inside. -->
diff --git a/hostsidetests/appsecurity/test-apps/UsePermissionDiffCert/src/com/android/cts/usespermissiondiffcertapp/AccessPermissionWithDiffSigTest.java b/hostsidetests/appsecurity/test-apps/UsePermissionDiffCert/src/com/android/cts/usespermissiondiffcertapp/AccessPermissionWithDiffSigTest.java
index 212c440..41cddf5 100644
--- a/hostsidetests/appsecurity/test-apps/UsePermissionDiffCert/src/com/android/cts/usespermissiondiffcertapp/AccessPermissionWithDiffSigTest.java
+++ b/hostsidetests/appsecurity/test-apps/UsePermissionDiffCert/src/com/android/cts/usespermissiondiffcertapp/AccessPermissionWithDiffSigTest.java
@@ -1025,24 +1025,28 @@
public void testRestrictingProviderNoMatchingPath() {
assertReadingContentUriAllowed(PERM_URI_PATH_RESTRICTING);
assertWritingContentUriAllowed(PERM_URI_PATH_RESTRICTING);
+
+ // allowed by no top-level permission
+ final Uri test = PERM_URI_PATH_RESTRICTING.buildUpon().appendPath("fo").build();
+ assertReadingContentUriAllowed(test);
+ assertWritingContentUriAllowed(test);
}
/**
* Verify that paths under {@code path-permission} restriction aren't
* allowed, even though the {@code provider} requires no permissions.
*/
- public void testRestrictingProviderMatchingPath() {
- final Uri test1 = PERM_URI_PATH_RESTRICTING.buildUpon().appendPath("fo").build();
- assertReadingContentUriAllowed(test1);
- assertWritingContentUriAllowed(test1);
+ public void testRestrictingProviderMatchingPathDenied() {
+ // rejected by "foo" prefix
+ final Uri test1 = PERM_URI_PATH_RESTRICTING.buildUpon().appendPath("foo").build();
+ assertReadingContentUriNotAllowed(test1, null);
+ assertWritingContentUriNotAllowed(test1, null);
- final Uri test2 = PERM_URI_PATH_RESTRICTING.buildUpon().appendPath("foo").build();
+ // rejected by "foo" prefix
+ final Uri test2 = PERM_URI_PATH_RESTRICTING.buildUpon()
+ .appendPath("foo").appendPath("ba").build();
assertReadingContentUriNotAllowed(test2, null);
assertWritingContentUriNotAllowed(test2, null);
-
- final Uri test3 = PERM_URI_PATH_RESTRICTING.buildUpon().appendPath("foo/bar2").build();
- assertReadingContentUriNotAllowed(test3, null);
- assertWritingContentUriNotAllowed(test3, null);
}
/**
@@ -1050,9 +1054,17 @@
* even if the caller doesn't hold another matching {@code path-permission}.
*/
public void testRestrictingProviderMultipleMatchingPath() {
- final Uri test = PERM_URI_PATH_RESTRICTING.buildUpon().appendPath("foo/bar").build();
- assertReadingContentUriAllowed(test);
- assertWritingContentUriAllowed(test);
+ // allowed by narrow "foo/bar" prefix
+ final Uri test1 = PERM_URI_PATH_RESTRICTING.buildUpon()
+ .appendPath("foo").appendPath("bar").build();
+ assertReadingContentUriAllowed(test1);
+ assertWritingContentUriAllowed(test1);
+
+ // allowed by narrow "foo/bar" prefix
+ final Uri test2 = PERM_URI_PATH_RESTRICTING.buildUpon()
+ .appendPath("foo").appendPath("bar2").build();
+ assertReadingContentUriAllowed(test2);
+ assertWritingContentUriAllowed(test2);
}
public void testGetMimeTypePermission() {
diff --git a/tests/tests/view/src/android/view/cts/ViewTest.java b/tests/tests/view/src/android/view/cts/ViewTest.java
index 2bcb4e7..94aed3f 100644
--- a/tests/tests/view/src/android/view/cts/ViewTest.java
+++ b/tests/tests/view/src/android/view/cts/ViewTest.java
@@ -16,14 +16,9 @@
package android.view.cts;
-import com.google.android.collect.Lists;
-
import com.android.cts.stub.R;
import com.android.internal.view.menu.ContextMenuBuilder;
-
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.List;
+import com.google.android.collect.Lists;
import android.app.Activity;
import android.content.Context;
@@ -80,6 +75,10 @@
import android.widget.ListView;
import android.widget.cts.StubActivity;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.List;
+
/**
* Test {@link View}.
*/
@@ -212,7 +211,12 @@
});
getInstrumentation().waitForIdleSync();
- assertTrue(view.hasCalledOnAnimationStart());
+ new PollingCheck() {
+ @Override
+ protected boolean check() {
+ return view.hasCalledOnAnimationStart();
+ }
+ }.run();
// check whether it has ended after duration, and alpha changed during this time.
new PollingCheck(duration + TIMEOUT_DELTA) {
@@ -2268,7 +2272,12 @@
}
});
getInstrumentation().waitForIdleSync();
- assertTrue(view.hasCalledOnDraw());
+ new PollingCheck() {
+ @Override
+ protected boolean check() {
+ return view.hasCalledOnDraw();
+ }
+ }.run();
view.reset();
runTestOnUiThread(new Runnable() {
@@ -2300,7 +2309,12 @@
}
});
getInstrumentation().waitForIdleSync();
- assertTrue(view.hasCalledOnDraw());
+ new PollingCheck() {
+ @Override
+ protected boolean check() {
+ return view.hasCalledOnDraw();
+ }
+ }.run();
view.reset();
runTestOnUiThread(new Runnable() {
@@ -2326,7 +2340,12 @@
}
});
getInstrumentation().waitForIdleSync();
- assertTrue(view.hasCalledOnDraw());
+ new PollingCheck() {
+ @Override
+ protected boolean check() {
+ return view.hasCalledOnDraw();
+ }
+ }.run();
view.reset();
runTestOnUiThread(new Runnable() {
@@ -2352,7 +2371,12 @@
}
});
getInstrumentation().waitForIdleSync();
- assertTrue(view.hasCalledOnDraw());
+ new PollingCheck() {
+ @Override
+ protected boolean check() {
+ return view.hasCalledOnDraw();
+ }
+ }.run();
view.reset();
runTestOnUiThread(new Runnable() {
@@ -3059,7 +3083,14 @@
}.run();
imm.showSoftInput(editText, 0);
- assertTrue(editText.hasCalledOnCreateInputConnection());
+
+ new PollingCheck() {
+ @Override
+ protected boolean check() {
+ return editText.hasCalledOnCreateInputConnection();
+ }
+ }.run();
+
assertTrue(editText.hasCalledOnCheckIsTextEditor());
assertTrue(imm.isActive(editText));
diff --git a/tests/tests/view/src/android/view/cts/ViewTreeObserverTest.java b/tests/tests/view/src/android/view/cts/ViewTreeObserverTest.java
index 1dee2b3..5837290 100644
--- a/tests/tests/view/src/android/view/cts/ViewTreeObserverTest.java
+++ b/tests/tests/view/src/android/view/cts/ViewTreeObserverTest.java
@@ -21,6 +21,7 @@
import android.app.Activity;
import android.app.Instrumentation;
import android.app.cts.MockActivity;
+import android.cts.util.PollingCheck;
import android.test.ActivityInstrumentationTestCase2;
import android.test.TouchUtils;
import android.view.View;
@@ -118,7 +119,7 @@
mViewTreeObserver = b.getViewTreeObserver();
- MockOnTouchModeChangeListener listener = new MockOnTouchModeChangeListener();
+ final MockOnTouchModeChangeListener listener = new MockOnTouchModeChangeListener();
assertFalse(listener.hasCalledOnTouchModeChanged());
mViewTreeObserver.addOnTouchModeChangeListener(listener);
@@ -130,7 +131,12 @@
});
mInstrumentation.waitForIdleSync();
- assertTrue(listener.hasCalledOnTouchModeChanged());
+ new PollingCheck() {
+ @Override
+ protected boolean check() {
+ return listener.hasCalledOnTouchModeChanged();
+ }
+ }.run();
}
public void testAddOnComputeInternalInsetsListener() {
@@ -282,7 +288,7 @@
mViewTreeObserver = scrollView.getViewTreeObserver();
- MockOnScrollChangedListener listener = new MockOnScrollChangedListener();
+ final MockOnScrollChangedListener listener = new MockOnScrollChangedListener();
assertFalse(listener.hasCalledOnScrollChanged());
mViewTreeObserver.addOnScrollChangedListener(listener);
@@ -293,7 +299,12 @@
}
});
mInstrumentation.waitForIdleSync();
- assertTrue(listener.hasCalledOnScrollChanged());
+ new PollingCheck() {
+ @Override
+ protected boolean check() {
+ return listener.hasCalledOnScrollChanged();
+ }
+ }.run();
listener.reset();
assertFalse(listener.hasCalledOnScrollChanged());
diff --git a/tests/tests/widget/src/android/widget/cts/AbsListViewTest.java b/tests/tests/widget/src/android/widget/cts/AbsListViewTest.java
index c8a184a..6846d38 100644
--- a/tests/tests/widget/src/android/widget/cts/AbsListViewTest.java
+++ b/tests/tests/widget/src/android/widget/cts/AbsListViewTest.java
@@ -18,13 +18,13 @@
import com.android.cts.stub.R;
-
import org.xmlpull.v1.XmlPullParser;
import org.xmlpull.v1.XmlPullParserException;
import android.app.Activity;
import android.app.Instrumentation;
import android.content.Context;
+import android.cts.util.PollingCheck;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Rect;
@@ -304,12 +304,17 @@
Drawable drawable = mListView.getSelector();
assertNotNull(drawable);
- Rect r = drawable.getBounds();
+ final Rect r = drawable.getBounds();
- TextView v = (TextView) mListView.getSelectedView();
+ final TextView v = (TextView) mListView.getSelectedView();
+ new PollingCheck() {
+ @Override
+ protected boolean check() {
+ return v.getRight() == r.right;
+ }
+ }.run();
assertEquals(v.getLeft(), r.left);
assertEquals(v.getTop(), r.top);
- assertEquals(v.getRight(), r.right);
assertEquals(v.getBottom(), r.bottom);
}
@@ -518,10 +523,10 @@
});
mInstrumentation.waitForIdleSync();
- TextView v = (TextView) listView.getSelectedView();
+ final TextView v = (TextView) listView.getSelectedView();
assertNull(listView.getContextMenuInfo());
- MockOnItemLongClickListener listener = new MockOnItemLongClickListener();
+ final MockOnItemLongClickListener listener = new MockOnItemLongClickListener();
listView.setOnItemLongClickListener(listener);
assertNull(listener.getParent());
@@ -531,8 +536,14 @@
TouchUtils.longClickView(this, v);
+ new PollingCheck() {
+ @Override
+ protected boolean check() {
+ return v == listener.getView();
+ }
+ }.run();
+
assertSame(listView, listener.getParent());
- assertSame(v, listener.getView());
assertEquals(2, listener.getPosition());
assertEquals(listView.getItemIdAtPosition(2), listener.getID());
diff --git a/tests/tests/widget/src/android/widget/cts/AutoCompleteTextViewTest.java b/tests/tests/widget/src/android/widget/cts/AutoCompleteTextViewTest.java
index 27becec..7e46b82 100755
--- a/tests/tests/widget/src/android/widget/cts/AutoCompleteTextViewTest.java
+++ b/tests/tests/widget/src/android/widget/cts/AutoCompleteTextViewTest.java
@@ -494,11 +494,13 @@
// re-set 'clicked' flag to false
listener.clearItemClickedStatus();
+
runTestOnUiThread(new Runnable() {
public void run() {
mAutoCompleteTextView.showDropDown();
}
});
+ mInstrumentation.waitForIdleSync();
mInstrumentation.sendKeyDownUpSync(KeyEvent.KEYCODE_DPAD_DOWN);
mInstrumentation.sendKeyDownUpSync(KeyEvent.KEYCODE_DPAD_CENTER);
assertTrue(listener.isOnItemClicked());
@@ -511,6 +513,7 @@
mAutoCompleteTextView.showDropDown();
}
});
+ mInstrumentation.waitForIdleSync();
mInstrumentation.sendKeyDownUpSync(KeyEvent.KEYCODE_DPAD_DOWN);
// Test normal key code.
mInstrumentation.sendKeyDownUpSync(KeyEvent.KEYCODE_0);
@@ -526,7 +529,7 @@
mAutoCompleteTextView.dismissDropDown();
}
});
-
+ mInstrumentation.waitForIdleSync();
mInstrumentation.sendKeyDownUpSync(KeyEvent.KEYCODE_DPAD_DOWN);
mInstrumentation.sendKeyDownUpSync(KeyEvent.KEYCODE_ENTER);
assertFalse(listener.isOnItemClicked());
diff --git a/tests/tests/widget/src/android/widget/cts/FrameLayoutTest.java b/tests/tests/widget/src/android/widget/cts/FrameLayoutTest.java
index b8c3992..5b225e8 100755
--- a/tests/tests/widget/src/android/widget/cts/FrameLayoutTest.java
+++ b/tests/tests/widget/src/android/widget/cts/FrameLayoutTest.java
@@ -18,13 +18,13 @@
import com.android.cts.stub.R;
-
import org.xmlpull.v1.XmlPullParser;
import org.xmlpull.v1.XmlPullParserException;
import android.app.Activity;
import android.app.Instrumentation;
import android.content.Context;
+import android.cts.util.PollingCheck;
import android.graphics.Rect;
import android.graphics.Region;
import android.graphics.drawable.BitmapDrawable;
@@ -37,9 +37,9 @@
import android.view.ViewGroup;
import android.widget.Button;
import android.widget.FrameLayout;
+import android.widget.FrameLayout.LayoutParams;
import android.widget.LinearLayout;
import android.widget.TextView;
-import android.widget.FrameLayout.LayoutParams;
import java.io.IOException;
@@ -90,9 +90,14 @@
assertSame(foreground, mFrameLayout.getForeground());
// check the default gravity FILL, it completely fills its container
assertTrue(foreground.isVisible());
- Rect rect = foreground.getBounds();
+ final Rect rect = foreground.getBounds();
// foreground has been stretched
- assertEquals(mFrameLayout.getHeight(), rect.bottom - rect.top);
+ new PollingCheck() {
+ @Override
+ protected boolean check() {
+ return mFrameLayout.getHeight() == rect.bottom - rect.top;
+ }
+ }.run();
assertEquals(mFrameLayout.getWidth(), rect.right - rect.left);
// should get a new foreground again, because former foreground has been stretched
@@ -112,10 +117,10 @@
mInstrumentation.waitForIdleSync();
assertSame(newForeground, mFrameLayout.getForeground());
assertTrue(newForeground.isVisible());
- rect = newForeground.getBounds();
+ Rect rect2 = newForeground.getBounds();
// not changing its size
- assertEquals(foreground.getIntrinsicHeight(), rect.bottom - rect.top);
- assertEquals(foreground.getIntrinsicWidth(), rect.right - rect.left);
+ assertEquals(foreground.getIntrinsicHeight(), rect2.bottom - rect2.top);
+ assertEquals(foreground.getIntrinsicWidth(), rect2.right - rect2.left);
assertCenterAligned(mFrameLayout, newForeground);
}
diff --git a/tests/tests/widget/src/android/widget/cts/ListViewTest.java b/tests/tests/widget/src/android/widget/cts/ListViewTest.java
index 50a2f16..d2bd4f4 100644
--- a/tests/tests/widget/src/android/widget/cts/ListViewTest.java
+++ b/tests/tests/widget/src/android/widget/cts/ListViewTest.java
@@ -19,12 +19,12 @@
import com.android.cts.stub.R;
import com.google.android.collect.Lists;
-
import org.xmlpull.v1.XmlPullParser;
import android.app.Activity;
import android.app.Instrumentation;
import android.content.Context;
+import android.cts.util.PollingCheck;
import android.graphics.Canvas;
import android.graphics.Rect;
import android.graphics.drawable.Drawable;
@@ -39,10 +39,10 @@
import android.view.ViewGroup;
import android.view.animation.LayoutAnimationController;
import android.widget.AdapterView;
+import android.widget.AdapterView.OnItemClickListener;
import android.widget.ArrayAdapter;
import android.widget.ListView;
import android.widget.TextView;
-import android.widget.AdapterView.OnItemClickListener;
import java.util.List;
@@ -142,8 +142,13 @@
mInstrumentation.waitForIdleSync();
Drawable d = mListView.getDivider();
- Rect r = d.getBounds();
- assertTrue(r.bottom - r.top > 0);
+ final Rect r = d.getBounds();
+ new PollingCheck() {
+ @Override
+ protected boolean check() {
+ return r.bottom - r.top > 0;
+ }
+ }.run();
mInstrumentation.runOnMainSync(new Runnable() {
public void run() {
@@ -362,11 +367,17 @@
mInstrumentation.waitForIdleSync();
Drawable defaultDrawable = mListView.getDivider();
- Rect r = defaultDrawable.getBounds();
- assertTrue(r.bottom - r.top > 0);
+ final Rect r = defaultDrawable.getBounds();
+ new PollingCheck() {
+ @Override
+ protected boolean check() {
+ return r.bottom - r.top > 0;
+ }
+ }.run();
final Drawable d = mActivity.getResources().getDrawable(R.drawable.scenery);
- r = d.getBounds();
+
+ Rect r2 = d.getBounds();
mInstrumentation.runOnMainSync(new Runnable() {
public void run() {
mListView.setDivider(d);
@@ -374,7 +385,7 @@
});
mInstrumentation.waitForIdleSync();
assertSame(d, mListView.getDivider());
- assertEquals(r.bottom - r.top, mListView.getDividerHeight());
+ assertEquals(r2.bottom - r2.top, mListView.getDividerHeight());
mInstrumentation.runOnMainSync(new Runnable() {
public void run() {
@@ -383,7 +394,7 @@
});
mInstrumentation.waitForIdleSync();
assertEquals(10, mListView.getDividerHeight());
- assertEquals(10, r.bottom - r.top);
+ assertEquals(10, r2.bottom - r2.top);
}
public void testSetSelection() {