fix: recover thread takeover session on android
This commit is contained in:
@@ -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;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user