java: Add the WatchPatterns class and make the KeyValue static

Change-Id: I7e10262015fbcdfc371b8d90d52e83b2ce581bd4
diff --git a/syncbase/src/main/java/io/v/syncbase/internal/Collection.java b/syncbase/src/main/java/io/v/syncbase/internal/Collection.java
index ffde4d7..4710ece 100644
--- a/syncbase/src/main/java/io/v/syncbase/internal/Collection.java
+++ b/syncbase/src/main/java/io/v/syncbase/internal/Collection.java
@@ -13,7 +13,7 @@
     public static native boolean Exists(String name, String batchHandle) throws VError;
     public static native void DeleteRange(String name, String batchHandle, byte[] start, byte[] limit) throws VError;
 
-    public class KeyValue {
+    public static class KeyValue {
         String key;
         byte[] value;
     }
diff --git a/syncbase/src/main/java/io/v/syncbase/internal/Database.java b/syncbase/src/main/java/io/v/syncbase/internal/Database.java
index 8a43caf..8af8855 100644
--- a/syncbase/src/main/java/io/v/syncbase/internal/Database.java
+++ b/syncbase/src/main/java/io/v/syncbase/internal/Database.java
@@ -53,4 +53,29 @@
     public static native VersionedSyncgroupSpec GetSyncgroupSpec(String name, Id syncgroupId) throws VError;
     public static native void SetSyncgroupSpec(String name, Id syncgroupId, VersionedSyncgroupSpec spec) throws VError;
     public static native List<SyncgroupMemberInfo> GetSyncgroupMembers(String name, Id syncgroupId) throws VError;
+
+    public static class CollectionRowPattern {
+        String collectionBlessing;
+        String collectionName;
+        String rowKey;
+    }
+
+    public enum ChangeType { PUT, DELETE }
+
+    public static class WatchChange {
+        Id collection;
+        String row;
+        ChangeType changeType;
+        byte[] value;
+        String resumeMarker;
+        boolean fromSync;
+        boolean continued;
+    }
+
+    public interface WatchPatternsCallbacks {
+        void onChange(WatchChange watchChange);
+        void onError(VError vError);
+    }
+
+    public static native void WatchPatterns(String name, String resumeMarker, List<CollectionRowPattern> patterns, WatchPatternsCallbacks callbacks) throws VError;
 }
\ No newline at end of file