fix: recover thread takeover session on android

This commit is contained in:
kris
2026-04-05 12:15:05 +08:00
parent e00f7a55ea
commit f046adc393
2 changed files with 275 additions and 7 deletions

View File

@@ -49,13 +49,12 @@ public class ConversationInfoActivity extends BossScreenActivity {
setRefreshing(true);
executor.execute(() -> {
try {
BossApiClient.ApiResponse detailResponse = apiClient.getProjectDetail(projectId);
if (!detailResponse.ok()) throw new IllegalStateException(detailResponse.message());
BossApiClient.ApiResponse participantsResponse = apiClient.getConversationParticipants(projectId);
if (!participantsResponse.ok()) throw new IllegalStateException(participantsResponse.message());
LoadedConversation loadedConversation = loadConversation();
BossApiClient.ApiResponse detailResponse = loadedConversation.detailResponse;
BossApiClient.ApiResponse participantsResponse = loadedConversation.participantsResponse;
JSONObject threadStatusPayload = null;
try {
BossApiClient.ApiResponse threadStatusResponse = apiClient.getThreadStatus(projectId);
BossApiClient.ApiResponse threadStatusResponse = loadedConversation.threadStatusResponse;
if (threadStatusResponse.ok()) {
threadStatusPayload = threadStatusResponse.json;
}
@@ -351,7 +350,7 @@ public class ConversationInfoActivity extends BossScreenActivity {
setRefreshing(true);
executor.execute(() -> {
try {
BossApiClient.ApiResponse response = apiClient.updateProjectTakeoverSettings(
BossApiClient.ApiResponse response = saveTakeoverSettingsWithRetry(
projectId,
enabled,
null
@@ -373,6 +372,56 @@ public class ConversationInfoActivity extends BossScreenActivity {
});
}
private LoadedConversation loadConversation() throws Exception {
BossApiClient.ApiResponse detailResponse = apiClient.getProjectDetail(projectId);
if (isUnauthorized(detailResponse)) {
BossApiClient.ApiResponse loginResponse = apiClient.autoLogin();
if (!loginResponse.ok()) {
throw new IllegalStateException(loginResponse.message());
}
detailResponse = apiClient.getProjectDetail(projectId);
}
if (!detailResponse.ok()) {
throw new IllegalStateException(detailResponse.message());
}
BossApiClient.ApiResponse participantsResponse = apiClient.getConversationParticipants(projectId);
if (!participantsResponse.ok()) {
throw new IllegalStateException(participantsResponse.message());
}
BossApiClient.ApiResponse threadStatusResponse = apiClient.getThreadStatus(projectId);
return new LoadedConversation(detailResponse, participantsResponse, threadStatusResponse);
}
private BossApiClient.ApiResponse saveTakeoverSettingsWithRetry(
String targetProjectId,
boolean takeoverEnabled,
@Nullable Boolean globalTakeoverEnabled
) throws Exception {
BossApiClient.ApiResponse response = apiClient.updateProjectTakeoverSettings(
targetProjectId,
takeoverEnabled,
globalTakeoverEnabled
);
if (!isUnauthorized(response)) {
return response;
}
BossApiClient.ApiResponse loginResponse = apiClient.autoLogin();
if (!loginResponse.ok()) {
return response;
}
return apiClient.updateProjectTakeoverSettings(
targetProjectId,
takeoverEnabled,
globalTakeoverEnabled
);
}
private boolean isUnauthorized(@Nullable BossApiClient.ApiResponse response) {
return response != null && response.statusCode == 401 && "UNAUTHORIZED".equals(response.message());
}
private String buildSubtitle(@Nullable JSONObject threadMeta, int count) {
String folder = threadMeta == null ? "" : threadMeta.optString("folderName", "");
String suffix = count <= 0 ? "暂无参与线程" : count + " 个参与线程";
@@ -410,4 +459,20 @@ public class ConversationInfoActivity extends BossScreenActivity {
}
return project.optString("id", "");
}
private static final class LoadedConversation {
private final BossApiClient.ApiResponse detailResponse;
private final BossApiClient.ApiResponse participantsResponse;
private final BossApiClient.ApiResponse threadStatusResponse;
private LoadedConversation(
BossApiClient.ApiResponse detailResponse,
BossApiClient.ApiResponse participantsResponse,
BossApiClient.ApiResponse threadStatusResponse
) {
this.detailResponse = detailResponse;
this.participantsResponse = participantsResponse;
this.threadStatusResponse = threadStatusResponse;
}
}
}