This was almost certainly my fault, but as I look at the implementation of Sets.cartesianProduct, I think its `contains` method made the assumption that `ImmutableSet.asList().indexOf` was O(1), which is no longer the case for Android.  It should probably get a specific `contains` implementation that actually is O(sets), not O(sets*setSize).
private static class FilteredNavigableSet<E> extends FilteredSortedSet<E>
      implements NavigableSet<E> {
    FilteredNavigableSet(NavigableSet<E> unfiltered, Predicate<? super E> predicate) {
      super(unfiltered, predicate);
    }
    NavigableSet<E> unfiltered() {
      return (NavigableSet<E>) unfiltered;
    }
    @Override
    @NullableDecl
    public E lower(E e) {
      return Iterators.find(unfiltered().headSet(e, false).descendingIterator(), predicate, null);
    }
    @Override
    @NullableDecl
    public E floor(E e) {
      return Iterators.find(unfiltered().headSet(e, true).descendingIterator(), predicate, null);
    }
    @Override
    public E ceiling(E e) {
      return Iterables.find(unfiltered().tailSet(e, true), predicate, null);
    }
    @Override
    public E higher(E e) {
      return Iterables.find(unfiltered().tailSet(e, false), predicate, null);