Scope folder realtime refreshes by device

This commit is contained in:
kris
2026-04-10 12:55:43 +08:00
parent d1e5a1ac5e
commit 0cba837ed3
11 changed files with 357 additions and 9 deletions

View File

@@ -24,6 +24,7 @@ public class ConversationFolderActivity extends BossScreenActivity {
private String folderKey;
private String folderName;
private String folderDeviceId;
private String targetProjectId;
private ArrayList<String> targetProjectIds;
private String targetProjectLabel;
@@ -36,6 +37,7 @@ public class ConversationFolderActivity extends BossScreenActivity {
super.onCreate(savedInstanceState);
folderKey = getIntent().getStringExtra(EXTRA_FOLDER_KEY);
folderName = getIntent().getStringExtra(EXTRA_FOLDER_NAME);
folderDeviceId = parseFolderDeviceId(folderKey);
targetProjectId = getIntent().getStringExtra(EXTRA_TARGET_PROJECT_ID);
targetProjectIds = new ArrayList<>();
String[] extraTargetProjectIds = getIntent().getStringArrayExtra(EXTRA_TARGET_PROJECT_IDS);
@@ -137,12 +139,16 @@ public class ConversationFolderActivity extends BossScreenActivity {
return false;
}
String payloadProjectId = event.payload.optString("projectId", "").trim();
if (payloadProjectId.isEmpty()) {
if (!payloadProjectId.isEmpty()) {
return trackedProjectIds.contains(payloadProjectId)
|| (!targetProjectIds.isEmpty() && targetProjectIds.contains(payloadProjectId))
|| (targetProjectId != null && targetProjectId.equals(payloadProjectId));
}
String payloadDeviceId = event.payload.optString("deviceId", "").trim();
if (payloadDeviceId.isEmpty() || folderDeviceId == null || folderDeviceId.isEmpty()) {
return false;
}
return trackedProjectIds.contains(payloadProjectId)
|| (!targetProjectIds.isEmpty() && targetProjectIds.contains(payloadProjectId))
|| (targetProjectId != null && targetProjectId.equals(payloadProjectId));
return payloadDeviceId.equals(folderDeviceId);
}
private boolean isDuplicateRealtimeEvent(String eventFingerprint, long now) {
@@ -175,6 +181,7 @@ public class ConversationFolderActivity extends BossScreenActivity {
}
String resolvedFolderName = folder.optString("folderLabel", folderName == null ? "项目线程" : folderName);
folderDeviceId = folder.optString("deviceId", folderDeviceId == null ? "" : folderDeviceId).trim();
int threadCount = folder.optInt("threadCount", 0);
configureScreen(resolvedFolderName, threadCount + " 个线程");
appendContent(BossUi.buildSoftPanel(
@@ -239,6 +246,17 @@ public class ConversationFolderActivity extends BossScreenActivity {
}
}
private String parseFolderDeviceId(@Nullable String candidateFolderKey) {
if (candidateFolderKey == null) {
return "";
}
int separatorIndex = candidateFolderKey.indexOf(':');
if (separatorIndex <= 0) {
return "";
}
return candidateFolderKey.substring(0, separatorIndex).trim();
}
private void renderThreadAtIndex(JSONArray threads, int index, boolean highlighted) {
JSONObject item = threads.optJSONObject(index);
if (item == null) return;