Allow querying collections without query objects.

Add methods to ListQuery and Set Query to allow for querying without needing to
convert an object into its respective query type.

Bug: 198294382
Test: atest com.android.queryable.queries.ListQueryHelperTest
Test: atest com.android.queryable.queries.SetQueryHelperTest
Change-Id: I58a5792b70c66a7f0164e8975fd3b107f58f0abf
diff --git a/common/device-side/bedstead/queryable/src/main/java/com/android/queryable/queries/ListQuery.java b/common/device-side/bedstead/queryable/src/main/java/com/android/queryable/queries/ListQuery.java
index b4b945a..15d6272 100644
--- a/common/device-side/bedstead/queryable/src/main/java/com/android/queryable/queries/ListQuery.java
+++ b/common/device-side/bedstead/queryable/src/main/java/com/android/queryable/queries/ListQuery.java
@@ -18,8 +18,8 @@
 
 import com.android.queryable.Queryable;
 
+import java.util.Collection;
 import java.util.List;
-import java.util.Set;
 
 /** Query for a {@link java.util.List}. */
 public interface ListQuery<E extends Queryable, F, G extends Query<F>> extends Query<List<F>> {
@@ -30,6 +30,49 @@
 
     IntegerQuery<E> size();
 
+    /**
+     * Used to query whether a list contains certain objects.
+     */
     E contains(G... objects);
+
+    /**
+     * Used to query whether a list contains certain objects.
+     *
+     * <p>There are no bounds on the type for this method and therefore to find matches objects are
+     * compared using {@link Object#equals} If you are not checking for equality use
+     * {@link #contains(Query[])}.
+     */
+    E contains(F... objects);
+
+    /**
+     * Used to query whether a list does not contain certain objects.
+     */
     E doesNotContain(G... objects);
+
+    /**
+     * Used to query whether a list does not contain certain objects.
+     *
+     * <p>There are no bounds on the type for this method and therefore to find matches objects are
+     * compared using {@link Object#equals}. If you are not checking for equality use
+     * {@link #contains(Query[])}.
+     */
+    E doesNotContain(F... objects);
+
+    /**
+     * Used to query whether a list contains all of the elements from a collection.
+     *
+     * <p>There are no bounds on the type for this method and therefore to find matches objects are
+     * compared using {@link Object#equals} If you are not checking for equality use
+     * {@link #contains(Query[])}.
+     */
+    <H extends Collection<F>> E containsAll(H... collection);
+
+    /**
+     * Used to query whether a list does not contain any elements given in a collection.
+     *
+     * <p>There are no bounds on the type for this method and therefore to find matches objects are
+     * compared using {@link Object#equals} If you are not checking for equality use
+     * {@link #contains(Query[])}.
+     */
+    <H extends Collection<F>> E doesNotContainAny(H... collections);
 }
\ No newline at end of file
diff --git a/common/device-side/bedstead/queryable/src/main/java/com/android/queryable/queries/ListQueryHelper.java b/common/device-side/bedstead/queryable/src/main/java/com/android/queryable/queries/ListQueryHelper.java
index 871caa7..a2957f7 100644
--- a/common/device-side/bedstead/queryable/src/main/java/com/android/queryable/queries/ListQueryHelper.java
+++ b/common/device-side/bedstead/queryable/src/main/java/com/android/queryable/queries/ListQueryHelper.java
@@ -21,6 +21,8 @@
 import java.io.Serializable;
 import java.util.ArrayList;
 import java.util.Arrays;
+import java.util.Collection;
+import java.util.Iterator;
 import java.util.List;
 import java.util.stream.Collectors;
 
@@ -29,8 +31,10 @@
 
     private E mQuery;
     private final IntegerQueryHelper<E> mSizeQuery;
-    private final List<G> mContains = new ArrayList<>();
-    private final List<G> mDoesNotContain = new ArrayList<>();
+    private final List<G> mContainsByQuery = new ArrayList<>();
+    private final List<G> mDoesNotContainByQuery = new ArrayList<>();
+    private final List<F> mContainsByType = new ArrayList<>();
+    private final List<F> mDoesNotContainByType = new ArrayList<>();
 
     ListQueryHelper() {
         mQuery = (E) this;
@@ -49,17 +53,51 @@
 
     @Override
     public E contains(G... objects) {
-        mContains.addAll(Arrays.asList(objects));
+        mContainsByQuery.addAll(Arrays.asList(objects));
+        return mQuery;
+    }
+
+    @Override
+    public E contains(F... objects) {
+        mContainsByType.addAll(Arrays.asList(objects));
         return mQuery;
     }
 
     @Override
     public E doesNotContain(G... objects) {
-        mDoesNotContain.addAll(Arrays.asList(objects));
+        mDoesNotContainByQuery.addAll(Arrays.asList(objects));
         return mQuery;
     }
 
     @Override
+    public E doesNotContain(F... objects) {
+        mDoesNotContainByType.addAll(Arrays.asList(objects));
+        return mQuery;
+    }
+
+    @Override
+    public <H extends Collection<F>> E containsAll(H... collections) {
+        for (H collection : collections) {
+            Iterator<F> iterator = collection.iterator();
+            while (iterator.hasNext()) {
+                contains(iterator.next());
+            }
+        }
+        return  mQuery;
+    }
+
+    @Override
+    public <H extends Collection<F>> E doesNotContainAny(H... collections) {
+        for (H collection : collections) {
+            Iterator<F> iterator = collection.iterator();
+            while (iterator.hasNext()) {
+                doesNotContain(iterator.next());
+            }
+        }
+        return  mQuery;
+    }
+
+    @Override
     public boolean matches(List<F> value) {
         if (!mSizeQuery.matches(value.size())) {
             return false;
@@ -69,7 +107,7 @@
             return false;
         }
 
-        if (!checkDoesNotContain(value)) {
+        if (!(checkDoesNotContain(value))) {
             return false;
         }
 
@@ -79,7 +117,16 @@
     private boolean checkContainsAtLeast(List<F> value) {
         List<F> v = new ArrayList<>(value);
 
-        for (G containsAtLeast : mContains) {
+        for (F containsAtLeast : mContainsByType) {
+            F match = findMatch(containsAtLeast, v);
+
+            if (match == null) {
+                return false;
+            }
+            v.remove(match);
+        }
+
+        for (G containsAtLeast : mContainsByQuery) {
             F match = findMatch(containsAtLeast, v);
 
             if (match == null) {
@@ -92,7 +139,13 @@
     }
 
     private boolean checkDoesNotContain(List<F> value) {
-        for (G doesNotContain : mDoesNotContain) {
+        for (F doesNotContain : mDoesNotContainByType) {
+            if (findMatch(doesNotContain, value) != null) {
+                return false;
+            }
+        }
+
+        for (G doesNotContain : mDoesNotContainByQuery) {
             if (findMatch(doesNotContain, value) != null) {
                 return false;
             }
@@ -111,19 +164,27 @@
         return null;
     }
 
+    private F findMatch(F object, List<F> values) {
+        return values.contains(object) ? object : null;
+    }
+
     @Override
     public String describeQuery(String fieldName) {
         List<String> queryStrings = new ArrayList<>();
         queryStrings.add(mSizeQuery.describeQuery(fieldName + ".size"));
-        if (!mContains.isEmpty()) {
+        if (!mContainsByQuery.isEmpty() && !mContainsByType.isEmpty()) {
             queryStrings.add(fieldName + " contains matches of ["
-                    + mContains.stream().map(t -> "{" + t.describeQuery("") + "}").collect(
-                            Collectors.joining(", ")) + "]");
+                    + mContainsByQuery.stream().map(t -> "{" + t.describeQuery("")
+                    + "}").collect(Collectors.joining(", ")) + "]"
+                    + mContainsByType.stream().map(t -> "{" + t.toString()
+                    + "}").collect(Collectors.joining(", ")) + "]");
         }
-        if (!mDoesNotContain.isEmpty()) {
+        if (!mDoesNotContainByQuery.isEmpty() && !mDoesNotContainByType.isEmpty()) {
             queryStrings.add(fieldName + " does not contain anything matching any of ["
-                    + mDoesNotContain.stream().map(t -> "{" + t.describeQuery("") + "}").collect(
-                            Collectors.joining(", ")) + "]");
+                    + mDoesNotContainByQuery.stream().map(t -> "{" + t.describeQuery("")
+                    + "}").collect(Collectors.joining(", "))
+                    + mDoesNotContainByType.stream().map(t -> "{"
+                    + t.toString() + "}").collect(Collectors.joining(", ")) + "]");
         }
 
         return Queryable.joinQueryStrings(queryStrings);
diff --git a/common/device-side/bedstead/queryable/src/main/java/com/android/queryable/queries/SetQuery.java b/common/device-side/bedstead/queryable/src/main/java/com/android/queryable/queries/SetQuery.java
index fc8e07f..63c45a2 100644
--- a/common/device-side/bedstead/queryable/src/main/java/com/android/queryable/queries/SetQuery.java
+++ b/common/device-side/bedstead/queryable/src/main/java/com/android/queryable/queries/SetQuery.java
@@ -20,6 +20,7 @@
 
 import com.android.queryable.Queryable;
 
+import java.util.Collection;
 import java.util.Set;
 
 /** Query for a {@link Set}. */
@@ -36,6 +37,49 @@
     E isEmpty();
     E isNotEmpty();
 
+    /**
+     * Used to query whether a set contains certain objects.
+     */
     E contains(G... objects);
+
+    /**
+     * Used to query whether a set contains certain objects.
+     *
+     * <p>There are no bounds on the type for this method and therefore to find matches objects are
+     * compared using {@link Object#equals} If you are not checking for equality use
+     * {@link #contains(Query[])}.
+     */
+    E contains(F... objects);
+
+    /**
+     * Used to query whether a set does not contain certain objects.
+     */
     E doesNotContain(G... objects);
+
+    /**
+     * Used to query whether a set does not contain certain objects.
+     *
+     * <p>There are no bounds on the type for this method and therefore to find matches objects are
+     * compared using {@link Object#equals} If you are not checking for equality use
+     * {@link #contains(Query[])}.
+     */
+    E doesNotContain(F... objects);
+
+    /**
+     * Used to query whether a set contains all of the elements from a collection.
+     *
+     * <p>There are no bounds on the type for this method and therefore to find matches objects are
+     * compared using {@link Object#equals} If you are not checking for equality use
+     * {@link #contains(Query[])}.
+     */
+    <H extends Collection<F>> E containsAll(H... collections);
+
+    /**
+     * Used to query whether a set does not contain any elements given in a collection.
+     *
+     * <p>There are no bounds on the type for this method and therefore to find matches objects are
+     * compared using {@link Object#equals} If you are not checking for equality use
+     * {@link #contains(Query[])}.
+     */
+    <H extends Collection<F>> E doesNotContainAny(H... collections);
 }
\ No newline at end of file
diff --git a/common/device-side/bedstead/queryable/src/main/java/com/android/queryable/queries/SetQueryHelper.java b/common/device-side/bedstead/queryable/src/main/java/com/android/queryable/queries/SetQueryHelper.java
index 8d9ddf9..870cadc 100644
--- a/common/device-side/bedstead/queryable/src/main/java/com/android/queryable/queries/SetQueryHelper.java
+++ b/common/device-side/bedstead/queryable/src/main/java/com/android/queryable/queries/SetQueryHelper.java
@@ -21,7 +21,9 @@
 import java.io.Serializable;
 import java.util.ArrayList;
 import java.util.Arrays;
+import java.util.Collection;
 import java.util.HashSet;
+import java.util.Iterator;
 import java.util.List;
 import java.util.Set;
 import java.util.stream.Collectors;
@@ -30,8 +32,10 @@
 
     private E mQuery;
     private final IntegerQueryHelper<E> mSizeQuery;
-    private final Set<G> mContains = new HashSet<>();
-    private final Set<G> mDoesNotContain = new HashSet<>();
+    private final Set<G> mContainsByQuery = new HashSet<>();
+    private final Set<F> mContainsByType = new HashSet<>();
+    private final Set<G> mDoesNotContainByQuery = new HashSet<>();
+    private final Set<F> mDoesNotContainByType = new HashSet<>();
 
     SetQueryHelper() {
         mQuery = (E) this;
@@ -61,17 +65,51 @@
 
     @Override
     public E contains(G... objects) {
-        mContains.addAll(Arrays.asList(objects));
+        mContainsByQuery.addAll(Arrays.asList(objects));
+        return mQuery;
+    }
+
+    @Override
+    public E contains(F... objects) {
+        mContainsByType.addAll(Arrays.asList(objects));
         return mQuery;
     }
 
     @Override
     public E doesNotContain(G... objects) {
-        mDoesNotContain.addAll(Arrays.asList(objects));
+        mDoesNotContainByQuery.addAll(Arrays.asList(objects));
         return mQuery;
     }
 
     @Override
+    public E doesNotContain(F... objects) {
+        mDoesNotContainByType.addAll(Arrays.asList(objects));
+        return mQuery;
+    }
+
+    @Override
+    public <H extends Collection<F>> E containsAll(H... collections) {
+        for (H collection : collections) {
+            Iterator<F> iterator = collection.iterator();
+            while (iterator.hasNext()) {
+                contains(iterator.next());
+            }
+        }
+        return  mQuery;
+    }
+
+    @Override
+    public <H extends Collection<F>> E doesNotContainAny(H... collections) {
+        for (H collection : collections) {
+            Iterator<F> iterator = collection.iterator();
+            while (iterator.hasNext()) {
+                doesNotContain(iterator.next());
+            }
+        }
+        return  mQuery;
+    }
+
+    @Override
     public boolean matches(Set<F> value) {
         if (!mSizeQuery.matches(value.size())) {
             return false;
@@ -95,7 +133,16 @@
     private boolean checkContainsAtLeast(Set<F> value) {
         Set<F> v = new HashSet<>(value);
 
-        for (G containsAtLeast : mContains) {
+        for (F containsAtLeast : mContainsByType) {
+            F match = findMatch(containsAtLeast, v);
+
+            if (match == null) {
+                return false;
+            }
+            v.remove(match);
+        }
+
+        for (G containsAtLeast : mContainsByQuery) {
             F match = findMatch(containsAtLeast, v);
 
             if (match == null) {
@@ -108,7 +155,13 @@
     }
 
     private boolean checkDoesNotContain(Set<F> value) {
-        for (G doesNotContain : mDoesNotContain) {
+        for (F doesNotContain : mDoesNotContainByType) {
+            if (findMatch(doesNotContain, value) != null) {
+                return false;
+            }
+        }
+
+        for (G doesNotContain : mDoesNotContainByQuery) {
             if (findMatch(doesNotContain, value) != null) {
                 return false;
             }
@@ -127,19 +180,27 @@
         return null;
     }
 
+    private F findMatch(F object, Set<F> values) {
+        return values.contains(object) ? object : null;
+    }
+
     @Override
     public String describeQuery(String fieldName) {
         List<String> queryStrings = new ArrayList<>();
         queryStrings.add(mSizeQuery.describeQuery(fieldName + ".size"));
-        if (!mContains.isEmpty()) {
+        if (!mContainsByQuery.isEmpty() && !mContainsByType.isEmpty()) {
             queryStrings.add(fieldName + " contains matches of ["
-                    + mContains.stream().map(t -> "{" + t.describeQuery("") + "}").collect(
-                            Collectors.joining(", ")) + "]");
+                    + mContainsByQuery.stream().map(t -> "{" + t.describeQuery("")
+                    + "}").collect(Collectors.joining(", ")) + "]"
+                    + mContainsByType.stream().map(t -> "{" + t.toString()
+                    + "}").collect(Collectors.joining(", ")) + "]");
         }
-        if (!mDoesNotContain.isEmpty()) {
+        if (!mDoesNotContainByQuery.isEmpty() && !mDoesNotContainByType.isEmpty()) {
             queryStrings.add(fieldName + " does not contain anything matching any of ["
-                    + mDoesNotContain.stream().map(t -> "{" + t.describeQuery("") + "}").collect(
-                            Collectors.joining(", ")) + "]");
+                    + mDoesNotContainByQuery.stream().map(t -> "{" + t.describeQuery("")
+                    + "}").collect(Collectors.joining(", ")) + "]"
+                    + mDoesNotContainByType.stream().map(t -> "{" + t.toString()
+                    + "}").collect(Collectors.joining(", ")) + "]");
         }
 
         return Queryable.joinQueryStrings(queryStrings);
diff --git a/common/device-side/bedstead/queryable/src/test/java/com/android/queryable/queries/ListQueryHelperTest.java b/common/device-side/bedstead/queryable/src/test/java/com/android/queryable/queries/ListQueryHelperTest.java
index 45d7d62..6fd2278 100644
--- a/common/device-side/bedstead/queryable/src/test/java/com/android/queryable/queries/ListQueryHelperTest.java
+++ b/common/device-side/bedstead/queryable/src/test/java/com/android/queryable/queries/ListQueryHelperTest.java
@@ -29,7 +29,6 @@
 import org.junit.runners.JUnit4;
 
 import java.util.List;
-import java.util.Set;
 
 @RunWith(JUnit4.class)
 public class ListQueryHelperTest {
@@ -38,6 +37,9 @@
     private static final String BUNDLE_KEY = "key";
     private static final Bundle BUNDLE_CONTAINING_KEY = new Bundle();
     private static final Bundle BUNDLE_NOT_CONTAINING_KEY = new Bundle();
+    private static final Integer INTEGER = 1;
+    private static final Integer DIFFERENT_INTEGER = 2;
+    private static final Integer ANOTHER_DIFFERENT_INTEGER = 3;
     static {
         BUNDLE_CONTAINING_KEY.putString(BUNDLE_KEY, "value");
     }
@@ -63,7 +65,7 @@
     }
 
     @Test
-    public void matches_contains_doesContain_returnsTrue() {
+    public void matches_contains_withQuery_doesContain_returnsTrue() {
         ListQueryHelper<Queryable, Bundle, BundleQuery<Queryable>> listQueryHelper =
                 new ListQueryHelper<>(mQuery);
 
@@ -76,7 +78,7 @@
     }
 
     @Test
-    public void matches_contains_doesNotContain_returnsFalse() {
+    public void matches_contains_withQuery_doesNotContain_returnsFalse() {
         ListQueryHelper<Queryable, Bundle, BundleQuery<Queryable>> listQueryHelper =
                 new ListQueryHelper<>(mQuery);
 
@@ -88,7 +90,7 @@
     }
 
     @Test
-    public void matches_doesNotContain_doesContain_returnsFalse() {
+    public void matches_doesNotContain_withQuery_doesContain_returnsFalse() {
         ListQueryHelper<Queryable, Bundle, BundleQuery<Queryable>> listQueryHelper =
                 new ListQueryHelper<>(mQuery);
 
@@ -101,7 +103,7 @@
     }
 
     @Test
-    public void matches_doesNotContain_doesNotContain_returnsTrue() {
+    public void matches_doesNotContain_withQuery_doesNotContain_returnsTrue() {
         ListQueryHelper<Queryable, Bundle, BundleQuery<Queryable>> listQueryHelper =
                 new ListQueryHelper<>(mQuery);
 
@@ -112,4 +114,89 @@
         assertThat(listQueryHelper.matches(List.of(BUNDLE_NOT_CONTAINING_KEY))).isTrue();
     }
 
+    @Test
+    public void matches_contains_withNonQuery_doesContain_returnsTrue() {
+        ListQueryHelper<Queryable, Integer, IntegerQuery<Queryable>> listQueryHelper =
+                new ListQueryHelper<>(mQuery);
+
+        listQueryHelper.contains(INTEGER);
+
+        assertThat(listQueryHelper.matches(
+                List.of(INTEGER, DIFFERENT_INTEGER))).isTrue();
+    }
+
+    @Test
+    public void matches_contains_withNonQuery_doesNotContain_returnsFalse() {
+        ListQueryHelper<Queryable, Integer, IntegerQuery<Queryable>> listQueryHelper =
+                new ListQueryHelper<>(mQuery);
+
+        listQueryHelper.contains(INTEGER);
+
+        assertThat(listQueryHelper.matches(List.of(DIFFERENT_INTEGER))).isFalse();
+    }
+
+    @Test
+    public void matches_doesNotContain_withNonQuery_doesContain_returnsFalse() {
+        ListQueryHelper<Queryable, Integer, IntegerQuery<Queryable>> listQueryHelper =
+                new ListQueryHelper<>(mQuery);
+
+        listQueryHelper.doesNotContain(INTEGER);
+
+        assertThat(listQueryHelper.matches(
+                List.of(INTEGER, DIFFERENT_INTEGER))).isFalse();
+    }
+
+    @Test
+    public void matches_doesNotContain_withNonQuery_doesNotContain_returnsTrue() {
+        ListQueryHelper<Queryable, Integer, IntegerQuery<Queryable>> listQueryHelper =
+                new ListQueryHelper<>(mQuery);
+
+        listQueryHelper.doesNotContain(INTEGER);
+
+        assertThat(listQueryHelper.matches(List.of(DIFFERENT_INTEGER))).isTrue();
+    }
+
+    @Test
+    public void matches_containsAll_withNonQueries_doesContain_returnsTrue() {
+        ListQueryHelper<Queryable, Integer, IntegerQuery<Queryable>> listQueryHelper =
+                new ListQueryHelper<>(mQuery);
+
+        listQueryHelper.containsAll(List.of(INTEGER, DIFFERENT_INTEGER));
+
+        assertThat(listQueryHelper.matches(
+                List.of(INTEGER, DIFFERENT_INTEGER, ANOTHER_DIFFERENT_INTEGER))).isTrue();
+    }
+
+    @Test
+    public void matches_containsAll_withNonQueries_doesNotContain_returnsFalse() {
+        ListQueryHelper<Queryable, Integer, IntegerQuery<Queryable>> listQueryHelper =
+                new ListQueryHelper<>(mQuery);
+
+        listQueryHelper.containsAll(List.of(INTEGER, DIFFERENT_INTEGER));
+
+        assertThat(listQueryHelper.matches(
+                List.of(DIFFERENT_INTEGER, ANOTHER_DIFFERENT_INTEGER))).isFalse();
+    }
+
+    @Test
+    public void matches_doesNotContainAny_withNonQueries_doesContain_returnsFalse() {
+        ListQueryHelper<Queryable, Integer, IntegerQuery<Queryable>> listQueryHelper =
+                new ListQueryHelper<>(mQuery);
+
+        listQueryHelper.doesNotContainAny(List.of(INTEGER, DIFFERENT_INTEGER));
+
+        assertThat(listQueryHelper.matches(
+                List.of(INTEGER, ANOTHER_DIFFERENT_INTEGER))).isFalse();
+    }
+
+    @Test
+    public void matches_doesNotContainAny_withNonQueries_doesNotContain_returnsTrue() {
+        ListQueryHelper<Queryable, Integer, IntegerQuery<Queryable>> listQueryHelper =
+                new ListQueryHelper<>(mQuery);
+
+        listQueryHelper.doesNotContainAny(List.of(INTEGER, DIFFERENT_INTEGER));
+
+        assertThat(listQueryHelper.matches(
+                List.of(ANOTHER_DIFFERENT_INTEGER))).isTrue();
+    }
 }
diff --git a/common/device-side/bedstead/queryable/src/test/java/com/android/queryable/queries/SetQueryHelperTest.java b/common/device-side/bedstead/queryable/src/test/java/com/android/queryable/queries/SetQueryHelperTest.java
index c43697c..855b6e7 100644
--- a/common/device-side/bedstead/queryable/src/test/java/com/android/queryable/queries/SetQueryHelperTest.java
+++ b/common/device-side/bedstead/queryable/src/test/java/com/android/queryable/queries/SetQueryHelperTest.java
@@ -37,13 +37,18 @@
     private static final String BUNDLE_KEY = "key";
     private static final Bundle BUNDLE_CONTAINING_KEY = new Bundle();
     private static final Bundle BUNDLE_NOT_CONTAINING_KEY = new Bundle();
+    private static final Integer INTEGER = 1;
+    private static final Integer DIFFERENT_INTEGER = 2;
+    private static final Integer ANOTHER_DIFFERENT_INTEGER = 3;
+
     static {
         BUNDLE_CONTAINING_KEY.putString(BUNDLE_KEY, "value");
     }
 
     @Test
     public void matches_size_matches_returnsTrue() {
-        SetQueryHelper<Queryable, Bundle, BundleQuery<Queryable>> setQueryHelper = new SetQueryHelper<>(mQuery);
+        SetQueryHelper<Queryable, Bundle, BundleQuery<Queryable>> setQueryHelper =
+                new SetQueryHelper<>(mQuery);
 
         setQueryHelper.size().isEqualTo(1);
 
@@ -52,7 +57,8 @@
 
     @Test
     public void matches_size_doesNotMatch_returnsFalse() {
-        SetQueryHelper<Queryable, Bundle, BundleQuery<Queryable>> setQueryHelper = new SetQueryHelper<>(mQuery);
+        SetQueryHelper<Queryable, Bundle, BundleQuery<Queryable>> setQueryHelper =
+                new SetQueryHelper<>(mQuery);
 
         setQueryHelper.size().isEqualTo(1);
 
@@ -60,8 +66,9 @@
     }
 
     @Test
-    public void matches_contains_doesContain_returnsTrue() {
-        SetQueryHelper<Queryable, Bundle, BundleQuery<Queryable>> setQueryHelper = new SetQueryHelper<>(mQuery);
+    public void matches_contains_withQuery_doesContain_returnsTrue() {
+        SetQueryHelper<Queryable, Bundle, BundleQuery<Queryable>> setQueryHelper =
+                new SetQueryHelper<>(mQuery);
 
         setQueryHelper.contains(
                 bundle().key(BUNDLE_KEY).exists()
@@ -71,8 +78,9 @@
     }
 
     @Test
-    public void matches_contains_doesNotContain_returnsFalse() {
-        SetQueryHelper<Queryable, Bundle, BundleQuery<Queryable>> setQueryHelper = new SetQueryHelper<>(mQuery);
+    public void matches_contains_withQuery_doesNotContain_returnsFalse() {
+        SetQueryHelper<Queryable, Bundle, BundleQuery<Queryable>> setQueryHelper =
+                new SetQueryHelper<>(mQuery);
 
         setQueryHelper.contains(
                 bundle().key(BUNDLE_KEY).exists()
@@ -82,8 +90,9 @@
     }
 
     @Test
-    public void matches_doesNotContain_doesContain_returnsFalse() {
-        SetQueryHelper<Queryable, Bundle, BundleQuery<Queryable>> setQueryHelper = new SetQueryHelper<>(mQuery);
+    public void matches_doesNotContain_withQuery_doesContain_returnsFalse() {
+        SetQueryHelper<Queryable, Bundle, BundleQuery<Queryable>> setQueryHelper =
+                new SetQueryHelper<>(mQuery);
 
         setQueryHelper.doesNotContain(
                 bundle().key(BUNDLE_KEY).exists()
@@ -93,8 +102,9 @@
     }
 
     @Test
-    public void matches_doesNotContain_doesNotContain_returnsTrue() {
-        SetQueryHelper<Queryable, Bundle, BundleQuery<Queryable>> setQueryHelper = new SetQueryHelper<>(mQuery);
+    public void matches_doesNotContain_withQuery_doesNotContain_returnsTrue() {
+        SetQueryHelper<Queryable, Bundle, BundleQuery<Queryable>> setQueryHelper =
+                new SetQueryHelper<>(mQuery);
 
         setQueryHelper.doesNotContain(
                 bundle().key(BUNDLE_KEY).exists()
@@ -103,4 +113,89 @@
         assertThat(setQueryHelper.matches(Set.of(BUNDLE_NOT_CONTAINING_KEY))).isTrue();
     }
 
+    @Test
+    public void matches_contains_withNonQuery_doesContain_returnsTrue() {
+        SetQueryHelper<Queryable, Integer, IntegerQuery<Queryable>> setQueryHelper =
+                new SetQueryHelper<>(mQuery);
+
+        setQueryHelper.contains(INTEGER);
+
+        assertThat(setQueryHelper.matches(
+                Set.of(INTEGER, DIFFERENT_INTEGER))).isTrue();
+    }
+
+    @Test
+    public void matches_contains_withNonQuery_doesNotContain_returnsFalse() {
+        SetQueryHelper<Queryable, Integer, IntegerQuery<Queryable>> setQueryHelper =
+                new SetQueryHelper<>(mQuery);
+
+        setQueryHelper.contains(INTEGER);
+
+        assertThat(setQueryHelper.matches(Set.of(DIFFERENT_INTEGER))).isFalse();
+    }
+
+    @Test
+    public void matches_doesNotContain_withNonQuery_doesContain_returnsFalse() {
+        SetQueryHelper<Queryable, Integer, IntegerQuery<Queryable>> setQueryHelper =
+                new SetQueryHelper<>(mQuery);
+
+        setQueryHelper.doesNotContain(INTEGER);
+
+        assertThat(setQueryHelper.matches(
+                Set.of(INTEGER, DIFFERENT_INTEGER))).isFalse();
+    }
+
+    @Test
+    public void matches_doesNotContain_withNonQuery_doesNotContain_returnsTrue() {
+        SetQueryHelper<Queryable, Integer, IntegerQuery<Queryable>> setQueryHelper =
+                new SetQueryHelper<>(mQuery);
+
+        setQueryHelper.doesNotContain(INTEGER);
+
+        assertThat(setQueryHelper.matches(Set.of(DIFFERENT_INTEGER))).isTrue();
+    }
+
+    @Test
+    public void matches_containsAll_withNonQueries_doesContain_returnsTrue() {
+        SetQueryHelper<Queryable, Integer, IntegerQuery<Queryable>> setQueryHelper =
+                new SetQueryHelper<>(mQuery);
+
+        setQueryHelper.containsAll(Set.of(INTEGER, DIFFERENT_INTEGER));
+
+        assertThat(setQueryHelper.matches(
+                Set.of(INTEGER, DIFFERENT_INTEGER, ANOTHER_DIFFERENT_INTEGER))).isTrue();
+    }
+
+    @Test
+    public void matches_containsAll_withNonQueries_doesNotContain_returnsFalse() {
+        SetQueryHelper<Queryable, Integer, IntegerQuery<Queryable>> setQueryHelper =
+                new SetQueryHelper<>(mQuery);
+
+        setQueryHelper.containsAll(Set.of(INTEGER, DIFFERENT_INTEGER));
+
+        assertThat(setQueryHelper.matches(
+                Set.of(DIFFERENT_INTEGER, ANOTHER_DIFFERENT_INTEGER))).isFalse();
+    }
+
+    @Test
+    public void matches_doesNotContainAny_withNonQueries_doesContain_returnsFalse() {
+        SetQueryHelper<Queryable, Integer, IntegerQuery<Queryable>> setQueryHelper =
+                new SetQueryHelper<>(mQuery);
+
+        setQueryHelper.doesNotContainAny(Set.of(INTEGER, DIFFERENT_INTEGER));
+
+        assertThat(setQueryHelper.matches(
+                Set.of(INTEGER, ANOTHER_DIFFERENT_INTEGER))).isFalse();
+    }
+
+    @Test
+    public void matches_doesNotContainAny_withNonQueries_doesNotContain_returnsTrue() {
+        SetQueryHelper<Queryable, Integer, IntegerQuery<Queryable>> setQueryHelper =
+                new SetQueryHelper<>(mQuery);
+
+        setQueryHelper.doesNotContainAny(Set.of(INTEGER, DIFFERENT_INTEGER));
+
+        assertThat(setQueryHelper.matches(
+                Set.of(ANOTHER_DIFFERENT_INTEGER))).isTrue();
+    }
 }
diff --git a/common/device-side/bedstead/testapp/src/test/java/com/android/bedstead/testapp/TestAppProviderTest.java b/common/device-side/bedstead/testapp/src/test/java/com/android/bedstead/testapp/TestAppProviderTest.java
index 72026b7..7d80b57 100644
--- a/common/device-side/bedstead/testapp/src/test/java/com/android/bedstead/testapp/TestAppProviderTest.java
+++ b/common/device-side/bedstead/testapp/src/test/java/com/android/bedstead/testapp/TestAppProviderTest.java
@@ -17,7 +17,6 @@
 package com.android.bedstead.testapp;
 
 import static com.android.queryable.queries.ActivityQuery.activity;
-import static com.android.queryable.queries.StringQuery.string;
 
 import static com.google.common.truth.Truth.assertThat;
 
@@ -177,9 +176,8 @@
     @Test
     public void query_withPermission_returnsMatching() {
         TestApp testApp = mTestAppProvider.query()
-                .wherePermissions().contains(
-                        string().isEqualTo(PERMISSION_DECLARED_BY_TESTAPP)
-                ).get();
+                .wherePermissions().contains(PERMISSION_DECLARED_BY_TESTAPP)
+                .get();
 
         assertThat(testApp.permissions()).contains(PERMISSION_DECLARED_BY_TESTAPP);
     }
@@ -187,9 +185,8 @@
     @Test
     public void query_withoutPermission_returnsMatching() {
         TestApp testApp = mTestAppProvider.query()
-                .wherePermissions().doesNotContain(
-                        string().isEqualTo(PERMISSION_DECLARED_BY_TESTAPP)
-                ).get();
+                .wherePermissions().doesNotContain(PERMISSION_DECLARED_BY_TESTAPP)
+                .get();
 
         assertThat(testApp.permissions()).doesNotContain(PERMISSION_DECLARED_BY_TESTAPP);
     }
diff --git a/tests/devicepolicy/src/android/devicepolicy/cts/CrossProfileAppsTest.java b/tests/devicepolicy/src/android/devicepolicy/cts/CrossProfileAppsTest.java
index 76fec56..0fcf2dd 100644
--- a/tests/devicepolicy/src/android/devicepolicy/cts/CrossProfileAppsTest.java
+++ b/tests/devicepolicy/src/android/devicepolicy/cts/CrossProfileAppsTest.java
@@ -20,7 +20,6 @@
 import static com.android.bedstead.harrier.DeviceState.UserType.WORK_PROFILE;
 import static com.android.bedstead.harrier.OptionalBoolean.FALSE;
 import static com.android.bedstead.harrier.OptionalBoolean.TRUE;
-import static com.android.queryable.queries.StringQuery.string;
 
 import static com.google.common.truth.Truth.assertThat;
 import static com.google.common.truth.Truth.assertWithMessage;
@@ -80,11 +79,9 @@
     private static final TestAppProvider sTestAppProvider = new TestAppProvider();
 
     private static final TestApp sCrossProfileTestApp = sTestAppProvider.query()
-            .wherePermissions().contains(
-                    string().isEqualTo("android.permission.INTERACT_ACROSS_PROFILES")).get();
+            .wherePermissions().contains("android.permission.INTERACT_ACROSS_PROFILES").get();
     private static final TestApp sNonCrossProfileTestApp = sTestAppProvider.query()
-            .wherePermissions().doesNotContain(
-                    string().isEqualTo("android.permission.INTERACT_ACROSS_PROFILES")).get();
+            .wherePermissions().doesNotContain("android.permission.INTERACT_ACROSS_PROFILES").get();
 
     @Test
     @RequireRunOnPrimaryUser