55import io .objectbox .BoxStore ;
66import io .objectbox .annotation .apihint .Experimental ;
77import io .objectbox .sync .internal .Platform ;
8+ import io .objectbox .sync .listener .SyncChangeListener ;
9+ import io .objectbox .sync .listener .SyncCompletedListener ;
10+ import io .objectbox .sync .listener .SyncConnectionListener ;
11+ import io .objectbox .sync .listener .SyncListener ;
12+ import io .objectbox .sync .listener .SyncLoginListener ;
813
914/**
1015 * A builder to create a {@link SyncClient}; the builder itself should be created via
@@ -19,13 +24,15 @@ public class SyncBuilder {
1924 final String url ;
2025 final SyncCredentials credentials ;
2126
22- SyncClientListener listener ;
23- SyncChangesListener changesListener ;
27+ @ Nullable SyncLoginListener loginListener ;
28+ @ Nullable SyncCompletedListener completedListener ;
29+ @ Nullable SyncChangeListener changeListener ;
30+ @ Nullable SyncConnectionListener connectionListener ;
31+ @ Nullable SyncListener listener ;
2432
2533 @ Nullable
2634 String [] trustedCertPaths ;
2735 boolean uncommittedAcks ;
28- boolean manualStart ;
2936
3037 RequestUpdatesMode requestUpdatesMode = RequestUpdatesMode .AUTO ;
3138
@@ -103,50 +110,82 @@ public SyncBuilder uncommittedAcks() {
103110 return this ;
104111 }
105112
106-
107113 /**
108- * Prevents the client from starting (connecting, logging in, syncing) automatically .
109- * It will need to be started manually later.
110- *
111- * @see SyncClient#start()
114+ * Sets a listener to only observe Sync login events .
115+ * <p>
116+ * This listener can also be {@link SyncClient#setSyncLoginListener(SyncLoginListener) set or removed}
117+ * on the Sync client directly.
112118 */
113- public SyncBuilder manualStart ( ) {
114- manualStart = true ;
119+ public SyncBuilder loginListener ( SyncLoginListener loginListener ) {
120+ this . loginListener = loginListener ;
115121 return this ;
116122 }
117123
118124 /**
119- * Sets a listener to observe sync events like login or sync completion .
120- * This listener can also be set (or removed) on the sync client directly.
121- *
122- * @see SyncClient#setSyncListener(SyncClientListener)
125+ * Sets a listener to only observe Sync completed events .
126+ * <p>
127+ * This listener can also be {@link SyncClient#setSyncCompletedListener(SyncCompletedListener) set or removed}
128+ * on the Sync client directly.
123129 */
124- public SyncBuilder listener ( SyncClientListener listener ) {
125- this .listener = listener ;
130+ public SyncBuilder completedListener ( SyncCompletedListener completedListener ) {
131+ this .completedListener = completedListener ;
126132 return this ;
127133 }
128134
129135 /**
130136 * Sets a listener to observe fine granular changes happening during sync.
131- * This listener can also be set (or removed) on the sync client directly.
132- *
133- * @see SyncClient#setSyncChangesListener(SyncChangesListener)
137+ * <p>
138+ * This listener can also be {@link SyncClient#setSyncChangeListener(SyncChangeListener) set or removed}
139+ * on the Sync client directly.
134140 */
135- public SyncBuilder changesListener ( SyncChangesListener changesListener ) {
136- this .changesListener = changesListener ;
141+ public SyncBuilder changeListener ( SyncChangeListener changeListener ) {
142+ this .changeListener = changeListener ;
137143 return this ;
138144 }
139145
146+ /**
147+ * Sets a listener to only observe Sync connection events.
148+ * <p>
149+ * This listener can also be {@link SyncClient#setSyncConnectionListener(SyncConnectionListener) set or removed}
150+ * on the Sync client directly.
151+ */
152+ public SyncBuilder connectionListener (SyncConnectionListener connectionListener ) {
153+ this .connectionListener = connectionListener ;
154+ return this ;
155+ }
156+
157+ /**
158+ * Sets a listener to observe all Sync events like login or sync completion.
159+ * <p>
160+ * Note: this will replace any login, completed or connection listener.
161+ * <p>
162+ * This listener can also be {@link SyncClient#setSyncListener(SyncListener) set or removed}
163+ * on the Sync client directly.
164+ */
165+ public SyncBuilder listener (SyncListener listener ) {
166+ this .listener = listener ;
167+ return this ;
168+ }
169+
170+ /**
171+ * Builds and returns a Sync client ready to {@link SyncClient#start()}.
172+ */
140173 public SyncClient build () {
141- if (credentials == null ) {
142- throw new IllegalStateException ("Credentials are required." );
143- }
144174 if (boxStore .getSyncClient () != null ) {
145175 throw new IllegalStateException ("The given store is already associated with a Sync client, close it first." );
146176 }
147177 return new SyncClientImpl (this );
148178 }
149179
180+ /**
181+ * Builds, {@link SyncClient#start() starts} and returns a Sync client.
182+ */
183+ public SyncClient buildAndStart () {
184+ SyncClient syncClient = build ();
185+ syncClient .start ();
186+ return syncClient ;
187+ }
188+
150189 private void checkNotNull (Object object , String message ) {
151190 //noinspection ConstantConditions Non-null annotation does not enforce, so check for null.
152191 if (object == null ) {
0 commit comments