From 049dd7c79ae9c3b32cdad5238eb5adc94cb4c789 Mon Sep 17 00:00:00 2001 From: Aditya-Srivastav <54016427+4D17Y4@users.noreply.github.com> Date: Tue, 6 Apr 2021 19:26:34 +0530 Subject: [PATCH] Fixes #4278 "Media details categories editor: Category not actually added" (#4328) * rectified category update * changed class name, added javadoc * javadoc --- .../org/wikipedia/csrf/CsrfTokenClient.java | 36 ++++++++++++++++++- 1 file changed, 35 insertions(+), 1 deletion(-) diff --git a/data-client/src/main/java/org/wikipedia/csrf/CsrfTokenClient.java b/data-client/src/main/java/org/wikipedia/csrf/CsrfTokenClient.java index ef3475371..78b9fa8c2 100644 --- a/data-client/src/main/java/org/wikipedia/csrf/CsrfTokenClient.java +++ b/data-client/src/main/java/org/wikipedia/csrf/CsrfTokenClient.java @@ -6,6 +6,8 @@ import androidx.annotation.NonNull; import androidx.annotation.Nullable; import androidx.annotation.VisibleForTesting; +import java.util.concurrent.Callable; +import java.util.concurrent.Executors; import org.wikipedia.AppAdapter; import org.wikipedia.dataclient.Service; import org.wikipedia.dataclient.ServiceFactory; @@ -142,7 +144,9 @@ public class CsrfTokenClient { AppAdapter.get().getPassword(), ""); } - Response response = service.getCsrfTokenCall().execute(); + // Get CSRFToken response off the main thread. + Response response = Executors.newSingleThreadExecutor().submit(new CsrfTokenCallExecutor(service)).get(); + if (response.body() == null || response.body().query() == null || TextUtils.isEmpty(response.body().query().csrfToken())) { continue; @@ -210,4 +214,34 @@ public class CsrfTokenClient { private interface RetryCallback { void retry(); } + + /** + * Class CsrfTokenCallExecutor which implement callable interface to get CsrfTokenCall. + */ + class CsrfTokenCallExecutor implements Callable> { + + /** + * Service for token call. + */ + private Service service; + + /** + * Default Constructor. + * @param service + */ + public CsrfTokenCallExecutor(Service service){ + this.service = service; + } + + /** + * Computes a result, or throws an exception if unable to do so. + * + * @return computed result + * @throws Exception if unable to compute a result + */ + @Override + public Response call() throws Exception { + return service.getCsrfTokenCall().execute(); + } + } }