Skip to content

Commit 84af52d

Browse files
committed
DataTransport update
1 parent 0df01a3 commit 84af52d

2 files changed

Lines changed: 53 additions & 55 deletions

File tree

play-services-wearable/core/src/main/java/org/microg/gms/wearable/DataTransport.java

Lines changed: 52 additions & 54 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,12 @@
1919
public 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() {

play-services-wearable/core/src/main/java/org/microg/gms/wearable/WearableImpl.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -600,7 +600,7 @@ private void removeConnectedNode(String nodeId) {
600600

601601
Runnable old = pendingDisconnects.put(nodeId, r);
602602
if (old != null)
603-
disconnectDebounceHandler.removeCallbacksAndMessages(old);
603+
disconnectDebounceHandler.removeCallbacks(old);
604604

605605
disconnectDebounceHandler.postDelayed(r, NODE_DISCONNECT_DEBOUNCE_MS);
606606
Log.d(TAG, "removeConnectedNode: debouncing disconnect broadcast for "

0 commit comments

Comments
 (0)