@@ -34,7 +34,7 @@ public class DataTransport {
3434
3535 private volatile SyncStart pendingSyncStart = null ;
3636 private volatile Runnable syncFallback = null ;
37-
37+ private volatile long syncDeadline = 0L ;
3838 private volatile boolean isV1Peer = false ;
3939
4040 public DataTransport (String localNodeId , String peerNodeId , WearableImpl wearable ) {
@@ -122,18 +122,11 @@ public void sendSyncStart() {
122122 + " receivedSeqId=" + receivedSeqId + " entries=" + table .size ());
123123 }
124124
125- private static final long SYNC_FALLBACK_MS = 10_000 ;
125+ private static final long SYNC_FALLBACK_MS = 1500 ;
126+ private static final long SYNC_MAX_DEFER_MS = 4_000 ;
126127 public void respondToSyncStart (SyncStart syncStart ) {
127- // ConnectionConfiguration cfg = wearable.getConfigurationByPeerNodeId(peerNodeId);
128- // if (cfg != null && !cfg.dataItemSyncEnabled) {
129- // Log.d(TAG, "respondToSyncStart: dataItemSyncEnabled=false, deferring sync for " + peerNodeId);
130- // pendingSyncStart = syncStart;
131- // return;
132- // }
133- //
134- // doRespondToSyncStart(syncStart);
135-
136128 pendingSyncStart = syncStart ;
129+ syncDeadline = android .os .SystemClock .uptimeMillis () + SYNC_MAX_DEFER_MS ;
137130
138131 scheduleFallback ();
139132 Log .d (TAG , "respondToSyncStart: deferred sync for " + peerNodeId
@@ -145,7 +138,8 @@ private void scheduleFallback() {
145138 if (pendingSyncStart == null ) return ;
146139 ChannelManager cm = wearable .getChannelManager ();
147140 boolean channelActive = cm != null && cm .hasActiveChannelForNode (peerNodeId );
148- if (channelActive ) {
141+ boolean deadlinePassed = android .os .SystemClock .uptimeMillis () >= syncDeadline ;
142+ if (channelActive && !deadlinePassed ) {
149143 Log .d (TAG , "syncFallback: channel still active for " + peerNodeId
150144 + ", rescheduling" );
151145 scheduleFallback ();
@@ -221,12 +215,23 @@ private void runSync(Map<String, Long> remotePeerSeqIds) {
221215 Log .d (TAG , "runSync start: peer=" + peerNodeId );
222216 try {
223217 Map <String , Long > localSeqIds = wearable .getNodeDatabase ().getAllCurrentSeqIds ();
218+ int synced = 0 ;
219+ int skipped = 0 ;
224220 for (Map .Entry <String , Long > local : localSeqIds .entrySet ()) {
225221 if (Thread .currentThread ().isInterrupted ()) {
226222 Log .d (TAG , "runSync interrupted for peer=" + peerNodeId );
227223 return ;
228224 }
229225
226+ String src = local .getKey ();
227+ long peer = remotePeerSeqIds .containsKey (src ) ? remotePeerSeqIds .get (src ) : -1 ;
228+ long localMax = local .getValue () != null ? local .getValue () : -1 ;
229+
230+ if (localMax <= peer ) {
231+ skipped ++;
232+ continue ;
233+ }
234+
230235 if (hasActiveChannelForPeer ()) {
231236 try {
232237 Thread .sleep (20 );
@@ -236,10 +241,8 @@ private void runSync(Map<String, Long> remotePeerSeqIds) {
236241 }
237242 }
238243
239- String src = local .getKey ();
240- long peer = remotePeerSeqIds .containsKey (src ) ? remotePeerSeqIds .get (src ) : -1l ;
241-
242244 wearable .syncToPeer (peerNodeId , src , peer );
245+ synced ++;
243246 }
244247 } catch (Exception e ) {
245248 Log .w (TAG , "runSync exception for peer=" + peerNodeId , e );
0 commit comments