Merge changes from topic 'baku-old'

* changes:
  TBR: Renaming SyncbaseXAdapter -> RxXAdapter
  More support for using ID list bindings
diff --git a/baku-toolkit/lib/src/androidTest/java/io/v/baku/toolkit/bind/CollectionBindingTest.java b/baku-toolkit/lib/src/androidTest/java/io/v/baku/toolkit/bind/CollectionBindingTest.java
index 2b17d53..60ababf 100644
--- a/baku-toolkit/lib/src/androidTest/java/io/v/baku/toolkit/bind/CollectionBindingTest.java
+++ b/baku-toolkit/lib/src/androidTest/java/io/v/baku/toolkit/bind/CollectionBindingTest.java
@@ -37,7 +37,7 @@
                 mTable.put("Good morning", "starshine")));
 
         final ListView listView = new ListView(getContext());
-        try (final SyncbaseListAdapter<RxTable.Row<String>> adapter = CollectionBinding.builder()
+        try (final RxListAdapter<RxTable.Row<String>> adapter = CollectionBinding.builder()
                 .onError(t -> fail(Throwables.getStackTraceAsString(t)))
                 .viewAdapterContext(getContext())
                 .rxTable(mTable)
diff --git a/baku-toolkit/lib/src/main/java/io/v/baku/toolkit/bind/BaseBuilder.java b/baku-toolkit/lib/src/main/java/io/v/baku/toolkit/bind/BaseBuilder.java
index 64ba08a..a0da69b 100644
--- a/baku-toolkit/lib/src/main/java/io/v/baku/toolkit/bind/BaseBuilder.java
+++ b/baku-toolkit/lib/src/main/java/io/v/baku/toolkit/bind/BaseBuilder.java
@@ -25,6 +25,7 @@
     protected Activity mActivity;
     protected RxTable mRxTable;
     protected CompositeSubscription mSubscriptionParent;
+    protected Subscription mLastSubscription;
     protected Action1<Throwable> mOnError;
 
     public T activity(final Activity activity) {
@@ -75,13 +76,21 @@
             mSubscriptionParent = new CompositeSubscription();
         }
         mSubscriptionParent.add(subscription);
+        mLastSubscription = subscription;
         return subscription;
     }
 
-    public Subscription getSubscription() {
+    /**
+     * @return the current subscription parent.
+     */
+    public CompositeSubscription getAllBindings() {
         return mSubscriptionParent;
     }
 
+    public Subscription getLastBinding() {
+        return mLastSubscription;
+    }
+
     public T onError(final Action1<Throwable> onError) {
         mOnError = onError;
         return mSelf;
diff --git a/baku-toolkit/lib/src/main/java/io/v/baku/toolkit/bind/CollectionAdapterBuilder.java b/baku-toolkit/lib/src/main/java/io/v/baku/toolkit/bind/CollectionAdapterBuilder.java
index bbaf946..9a8c972 100644
--- a/baku-toolkit/lib/src/main/java/io/v/baku/toolkit/bind/CollectionAdapterBuilder.java
+++ b/baku-toolkit/lib/src/main/java/io/v/baku/toolkit/bind/CollectionAdapterBuilder.java
@@ -56,24 +56,24 @@
 
     public abstract Observable<? extends ListAccumulator<T>> buildListAccumulator();
 
-    public SyncbaseListAdapter<T> buildListAdapter() {
-        return subscribeAdapter(new SyncbaseListAdapter<>(
+    public RxListAdapter<T> buildListAdapter() {
+        return subscribeAdapter(new RxListAdapter<>(
                 buildListAccumulator(), getViewAdapter(), mBase.mOnError));
     }
 
-    public SyncbaseRecyclerAdapter<T, ?> buildRecyclerAdapter() {
-        return subscribeAdapter(new SyncbaseRecyclerAdapter<>(
+    public RxRecyclerAdapter<T, ?> buildRecyclerAdapter() {
+        return subscribeAdapter(new RxRecyclerAdapter<>(
                 buildListAccumulator(), getViewAdapter(), mBase.mOnError));
     }
 
-    public SyncbaseListAdapter<T> bindTo(final ListView listView) {
-        final SyncbaseListAdapter<T> adapter = buildListAdapter();
+    public RxListAdapter<T> bindTo(final ListView listView) {
+        final RxListAdapter<T> adapter = buildListAdapter();
         listView.setAdapter(adapter);
         return adapter;
     }
 
-    public SyncbaseRecyclerAdapter<T, ?> bindTo(final RecyclerView recyclerView) {
-        final SyncbaseRecyclerAdapter<T, ?> adapter = buildRecyclerAdapter();
+    public RxRecyclerAdapter<T, ?> bindTo(final RecyclerView recyclerView) {
+        final RxRecyclerAdapter<T, ?> adapter = buildRecyclerAdapter();
         recyclerView.setAdapter(adapter);
         return adapter;
     }
diff --git a/baku-toolkit/lib/src/main/java/io/v/baku/toolkit/bind/IdListAccumulator.java b/baku-toolkit/lib/src/main/java/io/v/baku/toolkit/bind/IdListAccumulator.java
index b75997e..9ff9b85 100644
--- a/baku-toolkit/lib/src/main/java/io/v/baku/toolkit/bind/IdListAccumulator.java
+++ b/baku-toolkit/lib/src/main/java/io/v/baku/toolkit/bind/IdListAccumulator.java
@@ -48,4 +48,9 @@
         // TODO(rosswang): possibly index
         return mIds.indexOf(rowName);
     }
+
+    @Override
+    public ImmutableList<String> getListSnapshot() {
+        return mIds;
+    }
 }
diff --git a/baku-toolkit/lib/src/main/java/io/v/baku/toolkit/bind/LayoutAdapter.java b/baku-toolkit/lib/src/main/java/io/v/baku/toolkit/bind/LayoutAdapter.java
new file mode 100644
index 0000000..eec0a29
--- /dev/null
+++ b/baku-toolkit/lib/src/main/java/io/v/baku/toolkit/bind/LayoutAdapter.java
@@ -0,0 +1,30 @@
+// Copyright 2015 The Vanadium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+package io.v.baku.toolkit.bind;
+
+import android.content.Context;
+import android.support.annotation.LayoutRes;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.view.ViewGroup;
+
+import lombok.RequiredArgsConstructor;
+
+@RequiredArgsConstructor
+public abstract class LayoutAdapter<T, VH extends ViewHolder> extends AbstractViewAdapter<T, VH> {
+
+    private final LayoutInflater mInflater;
+    @LayoutRes
+    private final int mResource;
+
+    public LayoutAdapter(final Context context, final @LayoutRes int resource) {
+        this(LayoutInflater.from(context), resource);
+    }
+
+    @Override
+    public View createView(final ViewGroup parent) {
+        return mInflater.inflate(mResource, parent, false);
+    }
+}
diff --git a/baku-toolkit/lib/src/main/java/io/v/baku/toolkit/bind/ListAccumulator.java b/baku-toolkit/lib/src/main/java/io/v/baku/toolkit/bind/ListAccumulator.java
index b7d2f9c..2325e1b 100644
--- a/baku-toolkit/lib/src/main/java/io/v/baku/toolkit/bind/ListAccumulator.java
+++ b/baku-toolkit/lib/src/main/java/io/v/baku/toolkit/bind/ListAccumulator.java
@@ -4,6 +4,8 @@
 
 package io.v.baku.toolkit.bind;
 
+import com.google.common.collect.ImmutableList;
+
 public interface ListAccumulator<T> {
     boolean containsRow(String rowName);
     int getCount();
@@ -14,4 +16,6 @@
      *  not it has meaning) may vary by implementation.
      */
     int getRowIndex(String rowName);
+
+    ImmutableList<T> getListSnapshot();
 }
diff --git a/baku-toolkit/lib/src/main/java/io/v/baku/toolkit/bind/ListAccumulators.java b/baku-toolkit/lib/src/main/java/io/v/baku/toolkit/bind/ListAccumulators.java
index f6737a4..babf78f 100644
--- a/baku-toolkit/lib/src/main/java/io/v/baku/toolkit/bind/ListAccumulators.java
+++ b/baku-toolkit/lib/src/main/java/io/v/baku/toolkit/bind/ListAccumulators.java
@@ -4,6 +4,8 @@
 
 package io.v.baku.toolkit.bind;
 
+import com.google.common.collect.ImmutableList;
+
 import java.util.NoSuchElementException;
 
 import io.v.rx.syncbase.RxTable;
@@ -33,6 +35,11 @@
         public int getRowIndex(final String rowName) {
             return -1;
         }
+
+        @Override
+        public ImmutableList<Object> getListSnapshot() {
+            return ImmutableList.of();
+        }
     };
 
     @SuppressWarnings("unchecked")
diff --git a/baku-toolkit/lib/src/main/java/io/v/baku/toolkit/bind/PrefixListAccumulator.java b/baku-toolkit/lib/src/main/java/io/v/baku/toolkit/bind/PrefixListAccumulator.java
index af5bd6c..c03eece 100644
--- a/baku-toolkit/lib/src/main/java/io/v/baku/toolkit/bind/PrefixListAccumulator.java
+++ b/baku-toolkit/lib/src/main/java/io/v/baku/toolkit/bind/PrefixListAccumulator.java
@@ -4,6 +4,7 @@
 
 package io.v.baku.toolkit.bind;
 
+import com.google.common.collect.ImmutableList;
 import com.google.common.collect.Ordering;
 
 import java.util.ArrayList;
@@ -130,4 +131,9 @@
     public boolean containsRow(final String rowName) {
         return mRows.containsKey(rowName);
     }
+
+    @Override
+    public ImmutableList<RxTable.Row<T>> getListSnapshot() {
+        return ImmutableList.copyOf(mSorted);
+    }
 }
diff --git a/baku-toolkit/lib/src/main/java/io/v/baku/toolkit/bind/SyncbaseListAdapter.java b/baku-toolkit/lib/src/main/java/io/v/baku/toolkit/bind/RxListAdapter.java
similarity index 86%
rename from baku-toolkit/lib/src/main/java/io/v/baku/toolkit/bind/SyncbaseListAdapter.java
rename to baku-toolkit/lib/src/main/java/io/v/baku/toolkit/bind/RxListAdapter.java
index 7877239..29b2f51 100644
--- a/baku-toolkit/lib/src/main/java/io/v/baku/toolkit/bind/SyncbaseListAdapter.java
+++ b/baku-toolkit/lib/src/main/java/io/v/baku/toolkit/bind/RxListAdapter.java
@@ -17,7 +17,7 @@
 import rx.functions.Action1;
 
 @Accessors(prefix = "m")
-public class SyncbaseListAdapter<T> extends BaseAdapter
+public class RxListAdapter<T> extends BaseAdapter
         implements RangeAdapter, ListAccumulator<T> {
     private final ViewAdapter<? super T, ?> mViewAdapter;
     @Delegate
@@ -25,9 +25,9 @@
     @Getter
     private final Subscription mSubscription;
 
-    public SyncbaseListAdapter(final Observable<? extends ListAccumulator<T>> data,
-                               final ViewAdapter<? super T, ?> viewAdapter,
-                               final Action1<Throwable> onError) {
+    public RxListAdapter(final Observable<? extends ListAccumulator<T>> data,
+                         final ViewAdapter<? super T, ?> viewAdapter,
+                         final Action1<Throwable> onError) {
         mViewAdapter = viewAdapter;
         mSubscription = data
                 .observeOn(AndroidSchedulers.mainThread())
diff --git a/baku-toolkit/lib/src/main/java/io/v/baku/toolkit/bind/SyncbaseRecyclerAdapter.java b/baku-toolkit/lib/src/main/java/io/v/baku/toolkit/bind/RxRecyclerAdapter.java
similarity index 85%
rename from baku-toolkit/lib/src/main/java/io/v/baku/toolkit/bind/SyncbaseRecyclerAdapter.java
rename to baku-toolkit/lib/src/main/java/io/v/baku/toolkit/bind/RxRecyclerAdapter.java
index 1bc4d83..34ee173 100644
--- a/baku-toolkit/lib/src/main/java/io/v/baku/toolkit/bind/SyncbaseRecyclerAdapter.java
+++ b/baku-toolkit/lib/src/main/java/io/v/baku/toolkit/bind/RxRecyclerAdapter.java
@@ -16,8 +16,8 @@
 import rx.functions.Action1;
 
 @Accessors(prefix = "m")
-public class SyncbaseRecyclerAdapter<T, VH extends ViewHolder>
-        extends RecyclerView.Adapter<SyncbaseRecyclerAdapter.ViewHolderAdapter<VH>>
+public class RxRecyclerAdapter<T, VH extends ViewHolder>
+        extends RecyclerView.Adapter<RxRecyclerAdapter.ViewHolderAdapter<VH>>
         implements RangeAdapter, ListAccumulator<T> {
 
     public static class ViewHolderAdapter<B extends ViewHolder> extends RecyclerView.ViewHolder {
@@ -34,9 +34,9 @@
     @Getter
     private final Subscription mSubscription;
 
-    public SyncbaseRecyclerAdapter(final Observable<? extends ListAccumulator<T>> data,
-                                   final ViewAdapter<? super T, VH> viewAdapter,
-                                   final Action1<Throwable> onError) {
+    public RxRecyclerAdapter(final Observable<? extends ListAccumulator<T>> data,
+                             final ViewAdapter<? super T, VH> viewAdapter,
+                             final Action1<Throwable> onError) {
         mViewAdapter = viewAdapter;
         mSubscription = data
                 .observeOn(AndroidSchedulers.mainThread())
diff --git a/baku-toolkit/lib/src/main/java/io/v/baku/toolkit/bind/TextViewAdapter.java b/baku-toolkit/lib/src/main/java/io/v/baku/toolkit/bind/TextViewAdapter.java
index a233704..9b77972 100644
--- a/baku-toolkit/lib/src/main/java/io/v/baku/toolkit/bind/TextViewAdapter.java
+++ b/baku-toolkit/lib/src/main/java/io/v/baku/toolkit/bind/TextViewAdapter.java
@@ -9,7 +9,6 @@
 import android.support.annotation.LayoutRes;
 import android.view.LayoutInflater;
 import android.view.View;
-import android.view.ViewGroup;
 import android.widget.TextView;
 
 import java.util.Objects;
@@ -17,11 +16,8 @@
 import lombok.Getter;
 import lombok.RequiredArgsConstructor;
 import lombok.experimental.Accessors;
-import lombok.extern.slf4j.Slf4j;
 
-@RequiredArgsConstructor
-@Slf4j
-public class TextViewAdapter extends AbstractViewAdapter<Object, TextViewAdapter.ViewHolder> {
+public class TextViewAdapter extends LayoutAdapter<Object, TextViewAdapter.ViewHolder> {
     @Accessors(prefix = "m")
     @Getter
     @RequiredArgsConstructor
@@ -48,9 +44,6 @@
         }
     }
 
-    private final LayoutInflater mInflater;
-    @LayoutRes
-    private final int mResource;
     @IdRes
     private final int mFieldId;
 
@@ -67,9 +60,10 @@
         this(LayoutInflater.from(context), resource, textViewResourceId);
     }
 
-    @Override
-    public View createView(final ViewGroup parent) {
-        return mInflater.inflate(mResource, parent, false);
+    public TextViewAdapter(final LayoutInflater inflater, final @LayoutRes int resource,
+                           final @IdRes int textViewResourceId) {
+        super(inflater, resource);
+        mFieldId = textViewResourceId;
     }
 
     @Override
diff --git a/baku-toolkit/lib/src/main/java/io/v/rx/syncbase/RxTable.java b/baku-toolkit/lib/src/main/java/io/v/rx/syncbase/RxTable.java
index ead7b5f..ba7e941 100644
--- a/baku-toolkit/lib/src/main/java/io/v/rx/syncbase/RxTable.java
+++ b/baku-toolkit/lib/src/main/java/io/v/rx/syncbase/RxTable.java
@@ -326,8 +326,13 @@
     }
 
     public <T> Observable<Void> put(final String key, final T value,
+                                    final TypeToken<T> tt) {
+        return exec(t -> t.put(mVContext, key, value, tt.getType()));
+    }
+
+    public <T> Observable<Void> put(final String key, final T value,
                                     final Class<T> type) {
-        return exec(t -> t.put(mVContext, key, value, type));
+        return put(key, value, TypeToken.of(type));
     }
 
     @SuppressWarnings("unchecked")
@@ -336,11 +341,15 @@
     }
 
     @SuppressWarnings("unchecked")
-    public <T> Observable<T> get(final String key, final Class<? extends T> type) {
-        return exec(t -> t.get(mVContext, key, type))
+    public <T> Observable<T> get(final String key, final TypeToken<? extends T> tt) {
+        return exec(t -> t.get(mVContext, key, tt.getType()))
                 .map(x -> (T) x);
     }
 
+    public <T> Observable<T> get(final String key, final Class<? extends T> type) {
+        return get(key, TypeToken.of(type));
+    }
+
     public <T> Observable<T> get(final String key, final Class<? extends T> type,
                                  final T defaultValue) {
         return get(key, type).onErrorResumeNext(t -> t instanceof NoExistException ?