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() {