Skip to content

Commit 100ed29

Browse files
Align APIs: split up Sync listeners, group in listener package.
Make change listener part of general listener.
1 parent 016b6d8 commit 100ed29

17 files changed

+277
-150
lines changed

objectbox-java/src/main/java/io/objectbox/sync/AbstractSyncClientListener.java

Lines changed: 0 additions & 26 deletions
This file was deleted.

objectbox-java/src/main/java/io/objectbox/sync/SyncBuilder.java

Lines changed: 56 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,11 @@
55
import io.objectbox.BoxStore;
66
import io.objectbox.annotation.apihint.Experimental;
77
import 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,8 +24,11 @@ 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;
@@ -103,24 +111,59 @@ public SyncBuilder uncommittedAcks() {
103111
}
104112

105113
/**
106-
* Sets a listener to observe sync events like login or sync completion.
107-
* This listener can also be set (or removed) on the sync client directly.
108-
*
109-
* @see SyncClient#setSyncListener(SyncClientListener)
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.
110118
*/
111-
public SyncBuilder listener(SyncClientListener listener) {
112-
this.listener = listener;
119+
public SyncBuilder loginListener(SyncLoginListener loginListener) {
120+
this.loginListener = loginListener;
121+
return this;
122+
}
123+
124+
/**
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.
129+
*/
130+
public SyncBuilder completedListener(SyncCompletedListener completedListener) {
131+
this.completedListener = completedListener;
113132
return this;
114133
}
115134

116135
/**
117136
* Sets a listener to observe fine granular changes happening during sync.
118-
* This listener can also be set (or removed) on the sync client directly.
119-
*
120-
* @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.
121140
*/
122-
public SyncBuilder changesListener(SyncChangesListener changesListener) {
123-
this.changesListener = changesListener;
141+
public SyncBuilder changeListener(SyncChangeListener changeListener) {
142+
this.changeListener = changeListener;
143+
return this;
144+
}
145+
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;
124167
return this;
125168
}
126169

objectbox-java/src/main/java/io/objectbox/sync/SyncChange.java

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,12 @@
11
package io.objectbox.sync;
22

33
import io.objectbox.annotation.apihint.Experimental;
4+
import io.objectbox.sync.listener.SyncChangeListener;
45

6+
// Note: this class is expected to be in this package by JNI, check before modifying/removing it.
57
/**
68
* A collection of changes made to one entity type during a sync transaction.
7-
* Delivered via {@link SyncChangesListener}.
9+
* Delivered via {@link SyncChangeListener}.
810
* IDs of changed objects are available via {@link #getChangedIds()} and those of removed objects via
911
* {@link #getRemovedIds()}.
1012
*/

objectbox-java/src/main/java/io/objectbox/sync/SyncClient.java

Lines changed: 26 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -2,9 +2,16 @@
22

33
import io.objectbox.annotation.apihint.Experimental;
44
import io.objectbox.sync.SyncBuilder.RequestUpdatesMode;
5+
import io.objectbox.sync.listener.SyncChangeListener;
6+
import io.objectbox.sync.listener.SyncCompletedListener;
7+
import io.objectbox.sync.listener.SyncConnectionListener;
8+
import io.objectbox.sync.listener.SyncListener;
9+
import io.objectbox.sync.listener.SyncLoginListener;
510

611
import java.io.Closeable;
712

13+
import javax.annotation.Nullable;
14+
815
/**
916
* ObjectBox sync client. Build a client with {@link Sync#client}.
1017
*
@@ -40,24 +47,35 @@ public interface SyncClient extends Closeable {
4047
long getLastLoginCode();
4148

4249
/**
43-
* Sets a {@link SyncClientListener}. Replaces a previously set listener.
50+
* Sets a listener to observe login events. Replaces a previously set listener.
51+
* Set to {@code null} to remove the listener.
52+
*/
53+
void setSyncLoginListener(@Nullable SyncLoginListener listener);
54+
55+
/**
56+
* Sets a listener to observe Sync completed events. Replaces a previously set listener.
57+
* Set to {@code null} to remove the listener.
4458
*/
45-
void setSyncListener(SyncClientListener listener);
59+
void setSyncCompletedListener(@Nullable SyncCompletedListener listener);
4660

4761
/**
48-
* Removes a previously set {@link SyncClientListener}. Does nothing if no listener was set.
62+
* Sets a listener to observe Sync connection events. Replaces a previously set listener.
63+
* Set to {@code null} to remove the listener.
4964
*/
50-
void removeSyncListener();
65+
void setSyncConnectionListener(@Nullable SyncConnectionListener listener);
5166

5267
/**
53-
* Sets a {@link SyncChangesListener}. Replaces a previously set listener.
68+
* Sets a listener to observe all Sync events.
69+
* Replaces all other previously set listeners, except a {@link SyncChangeListener}.
70+
* Set to {@code null} to remove the listener.
5471
*/
55-
void setSyncChangesListener(SyncChangesListener listener);
72+
void setSyncListener(@Nullable SyncListener listener);
5673

5774
/**
58-
* Removes a previously set {@link SyncChangesListener}. Does nothing if no listener was set.
75+
* Sets a {@link SyncChangeListener}. Replaces a previously set listener.
76+
* Set to {@code null} to remove the listener.
5977
*/
60-
void removeSyncChangesListener();
78+
void setSyncChangeListener(@Nullable SyncChangeListener listener);
6179

6280
/**
6381
* Updates the login credentials. This should not be required during regular use.

objectbox-java/src/main/java/io/objectbox/sync/SyncClientImpl.java

Lines changed: 52 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,11 @@
44
import io.objectbox.annotation.apihint.Experimental;
55
import io.objectbox.annotation.apihint.Internal;
66
import io.objectbox.sync.SyncBuilder.RequestUpdatesMode;
7+
import io.objectbox.sync.listener.SyncChangeListener;
8+
import io.objectbox.sync.listener.SyncCompletedListener;
9+
import io.objectbox.sync.listener.SyncConnectionListener;
10+
import io.objectbox.sync.listener.SyncListener;
11+
import io.objectbox.sync.listener.SyncLoginListener;
712

813
import javax.annotation.Nullable;
914
import java.util.concurrent.CountDownLatch;
@@ -17,13 +22,17 @@
1722
public class SyncClientImpl implements SyncClient {
1823

1924
private final String serverUrl;
20-
private final InternalListener internalListener;
25+
private final InternalSyncClientListener internalListener;
2126
@Nullable
2227
private final ConnectivityMonitor connectivityMonitor;
2328

2429
private volatile long handle;
2530
@Nullable
26-
private volatile SyncClientListener listener;
31+
private volatile SyncLoginListener loginListener;
32+
@Nullable
33+
private volatile SyncCompletedListener completedListener;
34+
@Nullable
35+
private volatile SyncConnectionListener connectionListener;
2736
private volatile long lastLoginCode;
2837
private volatile boolean started;
2938

@@ -47,15 +56,20 @@ public class SyncClientImpl implements SyncClient {
4756
nativeSetUncommittedAcks(handle, true);
4857
}
4958

50-
this.listener = builder.listener;
59+
if (builder.listener != null) {
60+
setSyncListener(builder.listener);
61+
} else {
62+
this.loginListener = builder.loginListener;
63+
this.completedListener = builder.completedListener;
64+
if (builder.changeListener != null) {
65+
setSyncChangeListener(builder.changeListener);
66+
}
67+
this.connectionListener = builder.connectionListener;
68+
}
5169

52-
this.internalListener = new InternalListener();
70+
this.internalListener = new InternalSyncClientListener();
5371
nativeSetListener(handle, internalListener);
5472

55-
if (builder.changesListener != null) {
56-
setSyncChangesListener(builder.changesListener);
57-
}
58-
5973
setLoginCredentials(builder.credentials);
6074
}
6175

@@ -82,25 +96,31 @@ public SyncClientState getSyncState() {
8296
}
8397

8498
@Override
85-
public void setSyncListener(SyncClientListener listener) {
86-
checkNotNull(listener, "Listener must not be null. Use removeSyncListener to remove existing listener.");
87-
this.listener = listener;
99+
public void setSyncLoginListener(@Nullable SyncLoginListener listener) {
100+
this.loginListener = listener;
88101
}
89102

90103
@Override
91-
public void removeSyncListener() {
92-
this.listener = null;
104+
public void setSyncCompletedListener(@Nullable SyncCompletedListener listener) {
105+
this.completedListener = listener;
93106
}
94107

95108
@Override
96-
public void setSyncChangesListener(SyncChangesListener changesListener) {
97-
checkNotNull(changesListener, "Listener must not be null. Use removeSyncChangesListener to remove existing listener.");
109+
public void setSyncChangeListener(@Nullable SyncChangeListener changesListener) {
98110
nativeSetSyncChangesListener(handle, changesListener);
99111
}
100112

101113
@Override
102-
public void removeSyncChangesListener() {
103-
nativeSetSyncChangesListener(handle, null);
114+
public void setSyncConnectionListener(@Nullable SyncConnectionListener listener) {
115+
this.connectionListener = listener;
116+
}
117+
118+
@Override
119+
public void setSyncListener(@Nullable SyncListener listener) {
120+
this.loginListener = listener;
121+
this.completedListener = listener;
122+
this.connectionListener = listener;
123+
setSyncChangeListener(listener);
104124
}
105125

106126
@Override
@@ -203,13 +223,6 @@ public void notifyConnectionAvailable() {
203223
nativeTriggerReconnect(handle);
204224
}
205225

206-
private void checkNotNull(Object object, String message) {
207-
//noinspection ConstantConditions Non-null annotation does not enforce, so check for null.
208-
if (object == null) {
209-
throw new IllegalArgumentException(message);
210-
}
211-
}
212-
213226
/**
214227
* Creates a native sync client for the given store handle ready to connect to the server at the given URI.
215228
* Uses certificate authorities trusted by the host if no trusted certificate paths are passed.
@@ -224,9 +237,9 @@ private void checkNotNull(Object object, String message) {
224237

225238
private native void nativeSetLoginInfo(long handle, long credentialsType, @Nullable byte[] credentials);
226239

227-
private native void nativeSetListener(long handle, @Nullable SyncClientListener listener);
240+
private native void nativeSetListener(long handle, @Nullable InternalSyncClientListener listener);
228241

229-
private native void nativeSetSyncChangesListener(long handle, @Nullable SyncChangesListener advancedListener);
242+
private native void nativeSetSyncChangesListener(long handle, @Nullable SyncChangeListener advancedListener);
230243

231244
/** @param subscribeForPushes Pass true to automatically receive updates for future changes. */
232245
private native void nativeSetRequestUpdatesMode(long handle, boolean autoRequestUpdates, boolean subscribeForPushes);
@@ -253,44 +266,44 @@ private void checkNotNull(Object object, String message) {
253266
/** Hints to the native client that an active network connection is available. */
254267
private native void nativeTriggerReconnect(long handle);
255268

256-
private class InternalListener implements SyncClientListener {
269+
/**
270+
* Methods on this class must match those expected by JNI implementation.
271+
*/
272+
@SuppressWarnings("unused") // Methods called from native code.
273+
private class InternalSyncClientListener {
257274
private final CountDownLatch firstLoginLatch = new CountDownLatch(1);
258275

259-
@Override
260276
public void onLogin() {
261277
lastLoginCode = SyncLoginCodes.OK;
262278
firstLoginLatch.countDown();
263279

264-
SyncClientListener listenerToFire = listener;
280+
SyncLoginListener listenerToFire = loginListener;
265281
if (listenerToFire != null) {
266-
listenerToFire.onLogin();
282+
listenerToFire.onLoggedIn();
267283
}
268284
}
269285

270-
@Override
271286
public void onLoginFailure(long errorCode) {
272287
lastLoginCode = errorCode;
273288
firstLoginLatch.countDown();
274289

275-
SyncClientListener listenerToFire = listener;
290+
SyncLoginListener listenerToFire = loginListener;
276291
if (listenerToFire != null) {
277-
listenerToFire.onLoginFailure(errorCode);
292+
listenerToFire.onLoginFailed(errorCode);
278293
}
279294
}
280295

281-
@Override
282296
public void onSyncComplete() {
283-
SyncClientListener listenerToFire = listener;
297+
SyncCompletedListener listenerToFire = completedListener;
284298
if (listenerToFire != null) {
285-
listenerToFire.onSyncComplete();
299+
listenerToFire.onUpdatesCompleted();
286300
}
287301
}
288302

289-
@Override
290303
public void onDisconnect() {
291-
SyncClientListener listenerToFire = listener;
304+
SyncConnectionListener listenerToFire = connectionListener;
292305
if (listenerToFire != null) {
293-
listenerToFire.onDisconnect();
306+
listenerToFire.onDisconnected();
294307
}
295308
}
296309

0 commit comments

Comments
 (0)