1919public class DataTransport {
2020 private static final String TAG = "WearDataTransport" ;
2121
22+ public enum DataSyncMode {
23+ SYNC_ENABLED ,
24+ SYNC_DISABLED_UNTIL_STARTED ,
25+ SYNC_DISABLED_UNTIL_MESSAGE_RECEIVED
26+ }
27+
2228 public final String localNodeId ;
2329 public final String peerNodeId ;
2430
@@ -33,8 +39,7 @@ public class DataTransport {
3339 private final AtomicBoolean initialSyncFinished = new AtomicBoolean (false );
3440
3541 private volatile SyncStart pendingSyncStart = null ;
36- private volatile Runnable syncFallback = null ;
37- private volatile long syncDeadline = 0L ;
42+ private volatile DataSyncMode dataSyncMode = DataSyncMode .SYNC_ENABLED ;
3843 private volatile boolean isV1Peer = false ;
3944
4045 public DataTransport (String localNodeId , String peerNodeId , WearableImpl wearable ) {
@@ -62,11 +67,22 @@ public long updateSeqIdForSource(String sourceNodeId, long seqId) {
6267 }
6368
6469 public void onConnected (WearableWriter writer ) {
70+ onConnected (writer , DataSyncMode .SYNC_ENABLED );
71+ }
72+
73+ public void onConnected (WearableWriter writer , DataSyncMode mode ) {
74+ DataSyncMode effective = (mode != null ) ? mode : DataSyncMode .SYNC_ENABLED ;
6575 synchronized (lock ) {
6676 this .writer = writer ;
77+ this .dataSyncMode = effective ;
6778 this .initialSyncFinished .set (false );
6879 }
69- sendSyncStart ();
80+
81+ if (effective == DataSyncMode .SYNC_ENABLED )
82+ sendSyncStart ();
83+ else
84+ Log .d (TAG , "onConnected: SyncStart withheld, mode=" + effective
85+ + " peer=" + peerNodeId );
7086 }
7187
7288 public void onDisconnect () {
@@ -79,6 +95,8 @@ public void onDisconnect() {
7995 this .writer = null ;
8096 this .initialSyncFinished .set (false );
8197 this .peerSeqIds = new HashMap <>();
98+ this .pendingSyncStart = null ;
99+ this .dataSyncMode = DataSyncMode .SYNC_ENABLED ;
82100 }
83101 if (prevWriter != null ) prevWriter .close ();
84102 if (prev != null ) prev .interrupt ();
@@ -122,48 +140,45 @@ public void sendSyncStart() {
122140 + " receivedSeqId=" + receivedSeqId + " entries=" + table .size ());
123141 }
124142
125- private static final long SYNC_FALLBACK_MS = 1500 ;
126- private static final long SYNC_MAX_DEFER_MS = 4_000 ;
127143 public void respondToSyncStart (SyncStart syncStart ) {
128- pendingSyncStart = syncStart ;
129- syncDeadline = android .os .SystemClock .uptimeMillis () + SYNC_MAX_DEFER_MS ;
144+ synchronized (lock ) {
145+ if (dataSyncMode == DataSyncMode .SYNC_DISABLED_UNTIL_STARTED ) {
146+ Log .d (TAG , "respondToSyncStart: parked (sync disabled) for " + peerNodeId );
147+ pendingSyncStart = syncStart ;
148+ return ;
149+ }
130150
131- scheduleFallback ();
132- Log .d (TAG , "respondToSyncStart: deferred sync for " + peerNodeId
133- + ", fallback in " + SYNC_FALLBACK_MS + "ms" );
151+ if (dataSyncMode == DataSyncMode .SYNC_DISABLED_UNTIL_MESSAGE_RECEIVED ) {
152+ Log .d (TAG , "respondToSyncStart: enabling sync because SyncStart arrived for " + peerNodeId );
153+ pendingSyncStart = syncStart ;
154+ onSyncEnabledLocked ();
155+ return ;
156+ }
157+
158+ doRespondToSyncStart (syncStart );
159+ }
134160 }
135161
136- private void scheduleFallback () {
137- Runnable fb = () -> {
138- if (pendingSyncStart == null ) return ;
139- ChannelManager cm = wearable .getChannelManager ();
140- boolean channelActive = cm != null && cm .hasActiveChannelForNode (peerNodeId );
141- boolean deadlinePassed = android .os .SystemClock .uptimeMillis () >= syncDeadline ;
142- if (channelActive && !deadlinePassed ) {
143- Log .d (TAG , "syncFallback: channel still active for " + peerNodeId
144- + ", rescheduling" );
145- scheduleFallback ();
146- } else {
147- Log .d (TAG , "syncFallback: no active channel for " + peerNodeId
148- + ", starting deferred sync" );
149- startPendingSync ();
150- }
151- };
152- syncFallback = fb ;
153- wearable .networkHandler .postDelayed (fb , SYNC_FALLBACK_MS );
162+ public void onSyncEnabled () {
163+ synchronized (lock ) {
164+ onSyncEnabledLocked ();
165+ }
154166 }
155167
156- private void startPendingSync () {
168+ private void onSyncEnabledLocked ()
169+ {
170+ if (dataSyncMode == DataSyncMode .SYNC_ENABLED || writer == null )
171+ return ;
172+
173+ dataSyncMode = DataSyncMode .SYNC_ENABLED ;
157174 SyncStart pending = pendingSyncStart ;
158175 pendingSyncStart = null ;
159- Runnable fb = syncFallback ;
160- syncFallback = null ;
161- if (fb != null )
162- wearable .networkHandler .removeCallbacks (fb );
176+ sendSyncStart ();
177+
163178 if (pending != null )
164179 doRespondToSyncStart (pending );
165180 }
166-
181+
167182 private void doRespondToSyncStart (SyncStart syncStart ) {
168183 if (syncStart == null ) return ;
169184
@@ -292,29 +307,12 @@ public boolean isInitialSyncFinished() {
292307 public boolean isV1Peer () {
293308 return isV1Peer ;
294309 }
295-
310+
296311 public void onDataItemSyncEnabled () {
297- if (pendingSyncStart != null ) {
298- Log .d (TAG , "onDataItemSyncEnabled: triggering deferred SyncStart for " + peerNodeId );
299- startPendingSync ();
300- }
312+ onSyncEnabled ();
301313 }
302314
303- public void onPeerChannelClosed () {
304- if (pendingSyncStart == null )
305- return ;
306-
307- ChannelManager cm = wearable .getChannelManager ();
308- boolean channelActive = cm != null && cm .hasActiveChannelForNode (peerNodeId );
309- if (!channelActive ) {
310- Log .d (TAG , "onPeerChannelClosed: no more channels for " + peerNodeId
311- + ", starting deferred sync" );
312- startPendingSync ();
313- } else {
314- Log .d (TAG , "onPeerChannelClosed: channels still active for " + peerNodeId
315- + ", waiting" );
316- }
317- }
315+ public void onPeerChannelClosed () {}
318316
319317 @ Override
320318 public String toString () {
0 commit comments