Baku - Factoring out sync error handlers

Change-Id: I39f66a9bc9896c502acd64bc53aa73b3d7c11d48
diff --git a/baku-toolkit/lib/src/main/java/io/v/baku/toolkit/BakuActivity.java b/baku-toolkit/lib/src/main/java/io/v/baku/toolkit/BakuActivity.java
index 27b3265..3e424ea 100644
--- a/baku-toolkit/lib/src/main/java/io/v/baku/toolkit/BakuActivity.java
+++ b/baku-toolkit/lib/src/main/java/io/v/baku/toolkit/BakuActivity.java
@@ -18,10 +18,10 @@
 @Slf4j
 public abstract class BakuActivity extends VActivity implements BakuActivityTrait<Activity> {
     @Delegate
-    private BakuActivityTrait mBakuActivityTrait;
+    private BakuActivityTrait<Activity> mBakuActivityTrait;
 
-    protected BakuActivityTrait createBakuActivityTrait() {
-        return new BakuActivityMixin(this);
+    protected BakuActivityTrait<Activity> createBakuActivityTrait() {
+        return new BakuActivityMixin<>(this);
     }
 
     @Override
diff --git a/baku-toolkit/lib/src/main/java/io/v/baku/toolkit/BakuActivityMixin.java b/baku-toolkit/lib/src/main/java/io/v/baku/toolkit/BakuActivityMixin.java
index c30ae1b..31e3082 100644
--- a/baku-toolkit/lib/src/main/java/io/v/baku/toolkit/BakuActivityMixin.java
+++ b/baku-toolkit/lib/src/main/java/io/v/baku/toolkit/BakuActivityMixin.java
@@ -112,7 +112,7 @@
     }
 
     public void onSyncError(final Throwable t) {
-        mVAndroidContextTrait.getErrorReporter().onError(R.string.err_sync, t);
+        ErrorReporters.getDefaultSyncErrorReporter(mVAndroidContextTrait);
     }
 
     public <U> SyncbaseBinding.Builder<U> binder() {
diff --git a/baku-toolkit/lib/src/main/java/io/v/baku/toolkit/ErrorReporters.java b/baku-toolkit/lib/src/main/java/io/v/baku/toolkit/ErrorReporters.java
index b9df48b..2ade39d 100644
--- a/baku-toolkit/lib/src/main/java/io/v/baku/toolkit/ErrorReporters.java
+++ b/baku-toolkit/lib/src/main/java/io/v/baku/toolkit/ErrorReporters.java
@@ -8,6 +8,7 @@
 
 import lombok.experimental.UtilityClass;
 import lombok.extern.slf4j.Slf4j;
+import rx.functions.Action1;
 
 @Slf4j
 @UtilityClass
@@ -23,4 +24,22 @@
             }
         };
     }
+
+    /**
+     * Derives a default sync error reporting function from a {@link VAndroidContextTrait}. The
+     * error message is {@link io.v.baku.toolkit.R.string#err_sync}.
+     *
+     * @see #getDefaultSyncErrorReporter(ErrorReporter)
+     */
+    public static Action1<Throwable> getDefaultSyncErrorReporter(final VAndroidContextTrait<?> v) {
+        return getDefaultSyncErrorReporter(v.getErrorReporter());
+    }
+
+    /**
+     * Derives a default sync error reporting function from an {@link ErrorReporter}. The error
+     * message is {@link io.v.baku.toolkit.R.string#err_sync}.
+     */
+    public static Action1<Throwable> getDefaultSyncErrorReporter(final ErrorReporter r) {
+        return t -> r.onError(R.string.err_sync, t);
+    }
 }
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 b08a6e1..f1e925e 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
@@ -8,6 +8,8 @@
 import android.app.Activity;
 
 import io.v.baku.toolkit.BakuActivityTrait;
+import io.v.baku.toolkit.ErrorReporters;
+import io.v.baku.toolkit.VAndroidContextTrait;
 import io.v.rx.syncbase.RxTable;
 import lombok.AccessLevel;
 import lombok.RequiredArgsConstructor;
@@ -35,6 +37,15 @@
         return mSelf;
     }
 
+    /**
+     * Sets the following properties from the given {@link BakuActivityTrait}:
+     * <ul>
+     *     <li>{@code activity}</li>
+     *     <li>{@code rxTable}</li>
+     *     <li>{@code subscriptionParent}</li>
+     *     <li>{@code onError}</li>
+     * </ul>
+     */
     public T bakuActivity(final BakuActivityTrait<?> trait) {
         return activity(trait.getVAndroidContextTrait().getAndroidContext())
                 .rxTable(trait.getSyncbaseTable())
@@ -42,6 +53,18 @@
                 .onError(trait::onSyncError);
     }
 
+    /**
+     * Sets the following properties from the given {@link VAndroidContextTrait}:
+     * <ul>
+     *     <li>{@code activity}</li>
+     *     <li>{@code onError}</li>
+     * </ul>
+     */
+    public T vActivity(final VAndroidContextTrait<? extends Activity> trait) {
+        return activity(trait.getAndroidContext())
+                .onError(ErrorReporters.getDefaultSyncErrorReporter(trait));
+    }
+
     public T subscriptionParent(final CompositeSubscription subscriptionParent) {
         mSubscriptionParent = subscriptionParent;
         return mSelf;
diff --git a/baku-toolkit/lib/src/main/java/io/v/baku/toolkit/bind/CollectionBinding.java b/baku-toolkit/lib/src/main/java/io/v/baku/toolkit/bind/CollectionBinding.java
index 62f9397..ac8abeb 100644
--- a/baku-toolkit/lib/src/main/java/io/v/baku/toolkit/bind/CollectionBinding.java
+++ b/baku-toolkit/lib/src/main/java/io/v/baku/toolkit/bind/CollectionBinding.java
@@ -22,7 +22,7 @@
         }
     }
 
-    public static <A extends RangeAdapter> Builder builder() {
+    public static Builder builder() {
         return new Builder();
     }
 }