Panagiotis Triantafyllou

questionnaire part3

package ly.warp.sdk.activities;
import android.app.Activity;
import android.app.AlertDialog;
import android.content.Intent;
import android.os.Bundle;
import android.os.Handler;
......@@ -34,6 +35,7 @@ import com.google.common.util.concurrent.MoreExecutors;
import com.google.common.util.concurrent.SettableFuture;
import org.json.JSONArray;
import org.json.JSONObject;
import java.util.ArrayList;
import java.util.LinkedHashMap;
......@@ -80,6 +82,8 @@ public class HomeActivity extends Activity implements View.OnClickListener, Coup
private LinearLayout mSectionsContainer;
private RelativeLayout mSectionsLoading;
private int mCurrentQuestionIndex = 0;
private ArrayList<User.QuestionnaireAnswer> mQuestionnaireAnswers = new ArrayList<>();
private String[] mCustom1Selections = new String[3];
private SettableFuture<ArrayList<CarouselItem>> carouselFuture = SettableFuture.create();
private SettableFuture<LinkedHashMap<String, ArrayList<Couponset>>> couponsetsFuture = SettableFuture.create();
......@@ -117,7 +121,7 @@ public class HomeActivity extends Activity implements View.OnClickListener, Coup
public void onSuccess(List<Object> result) {
runOnUiThread(() -> {
User user = WarplyManagerHelper.getUser();
if (user != null && user.getQuestionnaireAnswers() == null && user.getQuestionnaire() != null) {
if (user != null && (user.getQuestionnaireAnswers() == null || user.getQuestionnaireAnswers().isEmpty()) && user.getQuestionnaire() != null) {
new Handler(getMainLooper()).postDelayed(() -> showQuestionnaireDialog(user.getQuestionnaire()), 1000);
}
});
......@@ -138,8 +142,10 @@ public class HomeActivity extends Activity implements View.OnClickListener, Coup
@Override
public void onClick(View v) {
if (v.getId() == R.id.profile_icon) {
// Intent myIntent = new Intent(HomeActivity.this, ProfileActivity.class);
// startActivity(myIntent);
User user = WarplyManagerHelper.getUser();
if (user != null && user.getQuestionnaire() != null) {
showQuestionnaireDialog(user.getQuestionnaire());
}
return;
}
if (v.getId() == R.id.ll_my_coupons) {
......@@ -558,6 +564,18 @@ public class HomeActivity extends Activity implements View.OnClickListener, Coup
});
mCurrentQuestionIndex = 0;
mCustom1Selections = new String[3];
// Seed session answers from server answers if they exist (button trigger / re-open case)
// This ensures prefill works correctly when the user opens the questionnaire again
User user = WarplyManagerHelper.getUser();
ArrayList<User.QuestionnaireAnswer> serverAnswers = (user != null) ? user.getQuestionnaireAnswers() : null;
if (serverAnswers != null && !serverAnswers.isEmpty()) {
mQuestionnaireAnswers = new ArrayList<>(serverAnswers);
} else {
mQuestionnaireAnswers = new ArrayList<>();
}
renderQuestion(questionnaire, dialogView, bottomSheetDialog);
bottomSheetDialog.setOnShowListener(dialog -> {
......@@ -607,6 +625,18 @@ public class HomeActivity extends Activity implements View.OnClickListener, Coup
List<Integer> selectedPositions = new ArrayList<>();
// Look up existing answer from session answers
// mQuestionnaireAnswers is already seeded with server answers on dialog open,
// so this single lookup covers both the auto-trigger and button-trigger cases
User.QuestionnaireAnswer existingAnswer = null;
for (User.QuestionnaireAnswer qa : mQuestionnaireAnswers) {
if (qa.getQuestionId() == question.getId()) {
existingAnswer = qa;
break;
}
}
final User.QuestionnaireAnswer prefillAnswer = existingAnswer;
if ("select".equals(type)) {
tvQuestionHeaderSubtitle.setVisibility(View.GONE);
......@@ -614,8 +644,11 @@ public class HomeActivity extends Activity implements View.OnClickListener, Coup
TextView tvDropdownTitle = dropdownHeader.findViewById(R.id.tv_dropdown_option_header);
ImageView ivArrow = dropdownHeader.findViewById(R.id.iv_terms_arrow);
String optionHeaderText = options != null && options.length() > 0 ? options.optString(0) : "Επιλέξτε";
tvDropdownTitle.setText(optionHeaderText);
// Prefill: if answer exists, show it; otherwise show first option as placeholder
String prefillText = (prefillAnswer != null && !prefillAnswer.getAnswerList().isEmpty())
? prefillAnswer.getAnswerList().get(0)
: (options != null && options.length() > 0 ? options.optString(0) : "Επιλέξτε");
tvDropdownTitle.setText(prefillText);
WarpUtils.renderCustomFont(this, R.font.ping_lcg_regular, tvDropdownTitle);
llOptionsContainer.addView(dropdownHeader);
......@@ -672,6 +705,15 @@ public class HomeActivity extends Activity implements View.OnClickListener, Coup
} else if ("custom1".equals(type)) {
String[] headers = {"Ενήλικες", "Παιδιά έως 9 ετών", "Παιδιά 10-18 ετών"};
// Prefill mCustom1Selections from existing answer
mCustom1Selections = new String[3];
if (prefillAnswer != null) {
ArrayList<String> prefillList = prefillAnswer.getAnswerList();
for (int k = 0; k < Math.min(prefillList.size(), 3); k++) {
mCustom1Selections[k] = prefillList.get(k);
}
}
if (options != null) {
for (int i = 0; i < options.length(); i++) {
Object outerItem = options.opt(i);
......@@ -705,7 +747,10 @@ public class HomeActivity extends Activity implements View.OnClickListener, Coup
);
dropdownHeader.setLayoutParams(dropdownParams);
tvDropdownTitle.setText("Επιλέξτε");
// Prefill: show saved selection or default placeholder
String custom1Prefill = (mCustom1Selections[i] != null && !mCustom1Selections[i].isEmpty())
? mCustom1Selections[i] : "Επιλέξτε";
tvDropdownTitle.setText(custom1Prefill);
WarpUtils.renderCustomFont(this, R.font.ping_lcg_regular, tvDropdownTitle);
llCustomContainer.addView(dropdownHeader);
......@@ -749,8 +794,7 @@ public class HomeActivity extends Activity implements View.OnClickListener, Coup
final int headerIndex = i;
listPopupWindow.setOnItemClickListener((parent, view, position, id) -> {
selectedPositions.clear();
selectedPositions.add(headerIndex * 100 + position);
mCustom1Selections[headerIndex] = popupOptions.get(position);
tvDropdownTitle.setText(popupOptions.get(position));
listPopupWindow.dismiss();
});
......@@ -778,7 +822,15 @@ public class HomeActivity extends Activity implements View.OnClickListener, Coup
TextView tvOptionTitle = optionView.findViewById(R.id.tv_option_title);
tvOptionTitle.setText(optionText);
WarpUtils.renderCustomFont(this, R.font.ping_lcg_bold, tvOptionTitle);
llOptionContainer.setBackground(AppCompatResources.getDrawable(this, R.drawable.shape_questionnaire_option_unselected));
// Prefill: check if this option was previously selected
boolean isPrefilled = prefillAnswer != null && prefillAnswer.getAnswerList().contains(optionText);
if (isPrefilled) {
llOptionContainer.setBackground(AppCompatResources.getDrawable(this, R.drawable.shape_questionnaire_option_selected));
selectedPositions.add(position);
} else {
llOptionContainer.setBackground(AppCompatResources.getDrawable(this, R.drawable.shape_questionnaire_option_unselected));
}
optionView.setOnClickListener(v -> {
if ("string".equals(type)) {
......@@ -810,15 +862,81 @@ public class HomeActivity extends Activity implements View.OnClickListener, Coup
}
llNextButton.setOnClickListener(v -> {
saveAnswer(question, selectedPositions, options, type);
if (mCurrentQuestionIndex < questionnaire.getQuestions().size() - 1) {
mCurrentQuestionIndex++;
renderQuestion(questionnaire, dialogView, dialog);
} else {
// Final screen, leave action empty as requested
// Final screen: submit answers to the backend
String questionnaireId = questionnaire.getQuestionnaireId();
WarplyManager.saveQuestionnaire(mQuestionnaireAnswers, questionnaireId, new CallbackReceiver<JSONObject>() {
@Override
public void onSuccess(JSONObject result) {
dialog.dismiss();
WarplyManager.getUser(mUserReceiver);
if (!isFinishing()) {
new AlertDialog.Builder(HomeActivity.this)
.setTitle(getString(R.string.demo_questionnaire_title))
.setMessage("Οι απαντήσεις σου αποθηκεύτηκαν επιτυχώς!")
.setPositiveButton("OK", (d, which) -> d.dismiss())
.show();
}
}
@Override
public void onFailure(int errorCode) {
dialog.dismiss();
if (!isFinishing()) {
new AlertDialog.Builder(HomeActivity.this)
.setTitle(getString(R.string.demo_questionnaire_title))
.setMessage("Κάτι πήγε στραβά. Παρακαλώ δοκίμασε ξανά.")
.setPositiveButton("OK", (d, which) -> d.dismiss())
.show();
}
}
});
}
});
}
private void saveAnswer(User.Question question, List<Integer> selectedPositions, JSONArray options, String type) {
// Remove any previously saved answer for this question_id (handles going back + re-answering)
mQuestionnaireAnswers.removeIf(a -> a.getQuestionId() == question.getId());
User.QuestionnaireAnswer answer = new User.QuestionnaireAnswer();
answer.setQuestionId(question.getId());
answer.setVersion(question.getVersion());
if ("string".equals(type) || "select".equals(type)) {
if (!selectedPositions.isEmpty()) {
JSONArray arr = new JSONArray();
arr.put(options.optString(selectedPositions.get(0)));
answer.setAnswer(arr);
answer.setSingleAnswer(true);
mQuestionnaireAnswers.add(answer);
}
} else if ("multi".equals(type)) {
if (!selectedPositions.isEmpty()) {
JSONArray arr = new JSONArray();
for (int pos : selectedPositions) {
arr.put(options.optString(pos));
}
answer.setAnswer(arr);
answer.setSingleAnswer(false);
mQuestionnaireAnswers.add(answer);
}
} else if ("custom1".equals(type)) {
JSONArray arr = new JSONArray();
for (String sel : mCustom1Selections) {
arr.put(sel != null ? sel : "");
}
answer.setAnswer(arr);
answer.setSingleAnswer(false);
mQuestionnaireAnswers.add(answer);
}
}
private final CallbackReceiver<ArrayList<CarouselItem>> mCarouselCallback = new CallbackReceiver<ArrayList<CarouselItem>>() {
@Override
public void onSuccess(ArrayList<CarouselItem> result) {
......@@ -882,4 +1000,14 @@ public class HomeActivity extends Activity implements View.OnClickListener, Coup
Toast.makeText(HomeActivity.this, "COUPONS ERROR", Toast.LENGTH_SHORT).show();
}
};
private final CallbackReceiver<User> mUserReceiver = new CallbackReceiver<User>() {
@Override
public void onSuccess(User user) {
}
@Override
public void onFailure(int errorCode) {
}
};
}
......
......@@ -72,7 +72,7 @@ public class User implements Parcelable, Serializable {
private String msisdn;
private String profileMetadata;
private Questionnaire questionnaire;
private JSONObject questionnaireAnswers;
private ArrayList<QuestionnaireAnswer> questionnaireAnswers;
private JSONObject userAnswers;
private String userId;
private JSONArray userSegments;
......@@ -128,7 +128,18 @@ public class User implements Parcelable, Serializable {
this.msisdn = optNullableString(json, MSISDN);
this.profileMetadata = optNullableString(json, PROFILE_METADATA);
this.questionnaire = json.isNull(QUESTIONNAIRE) ? null : new Questionnaire(json.optJSONObject(QUESTIONNAIRE));
this.questionnaireAnswers = json.optJSONObject(QUESTIONNAIRE_ANSWERS);
JSONArray answersArr = json.optJSONArray(QUESTIONNAIRE_ANSWERS);
if (answersArr != null) {
this.questionnaireAnswers = new ArrayList<>();
for (int i = 0; i < answersArr.length(); i++) {
JSONObject answerJson = answersArr.optJSONObject(i);
if (answerJson != null) {
this.questionnaireAnswers.add(new QuestionnaireAnswer(answerJson));
}
}
} else {
this.questionnaireAnswers = null;
}
this.userAnswers = json.optJSONObject(USER_ANSWERS);
this.userId = optNullableString(json, USER_ID);
this.userSegments = json.optJSONArray(USER_SEGMENTS);
......@@ -164,7 +175,18 @@ public class User implements Parcelable, Serializable {
}
try {
String questionnaireAnswersStr = source.readString();
this.questionnaireAnswers = questionnaireAnswersStr != null ? new JSONObject(questionnaireAnswersStr) : null;
if (questionnaireAnswersStr != null) {
this.questionnaireAnswers = new ArrayList<>();
JSONArray answersArr = new JSONArray(questionnaireAnswersStr);
for (int i = 0; i < answersArr.length(); i++) {
JSONObject answerJson = answersArr.optJSONObject(i);
if (answerJson != null) {
this.questionnaireAnswers.add(new QuestionnaireAnswer(answerJson));
}
}
} else {
this.questionnaireAnswers = null;
}
} catch (JSONException e) {
this.questionnaireAnswers = null;
}
......@@ -194,7 +216,15 @@ public class User implements Parcelable, Serializable {
dest.writeString(this.consumerMetadata != null ? this.consumerMetadata.toString() : null);
dest.writeString(this.favoriteCouponsets != null ? this.favoriteCouponsets.toString() : null);
dest.writeString(this.questionnaire != null ? this.questionnaire.toString() : null);
dest.writeString(this.questionnaireAnswers != null ? this.questionnaireAnswers.toString() : null);
if (this.questionnaireAnswers != null) {
JSONArray answersArr = new JSONArray();
for (QuestionnaireAnswer qa : this.questionnaireAnswers) {
answersArr.put(qa.toJSONObject());
}
dest.writeString(answersArr.toString());
} else {
dest.writeString(null);
}
dest.writeString(this.userAnswers != null ? this.userAnswers.toString() : null);
dest.writeString(this.userSegments != null ? this.userSegments.toString() : null);
}
......@@ -215,7 +245,15 @@ public class User implements Parcelable, Serializable {
jObj.put(MSISDN, this.msisdn != null ? this.msisdn : JSONObject.NULL);
jObj.put(PROFILE_METADATA, this.profileMetadata != null ? this.profileMetadata : JSONObject.NULL);
jObj.put(QUESTIONNAIRE, this.questionnaire != null ? this.questionnaire.toJSONObject() : JSONObject.NULL);
jObj.put(QUESTIONNAIRE_ANSWERS, this.questionnaireAnswers != null ? this.questionnaireAnswers : JSONObject.NULL);
if (this.questionnaireAnswers != null) {
JSONArray answersArr = new JSONArray();
for (QuestionnaireAnswer qa : this.questionnaireAnswers) {
answersArr.put(qa.toJSONObject());
}
jObj.put(QUESTIONNAIRE_ANSWERS, answersArr);
} else {
jObj.put(QUESTIONNAIRE_ANSWERS, JSONObject.NULL);
}
jObj.put(USER_ANSWERS, this.userAnswers != null ? this.userAnswers : JSONObject.NULL);
jObj.put(USER_ID, this.userId != null ? this.userId : JSONObject.NULL);
jObj.put(USER_SEGMENTS, this.userSegments != null ? this.userSegments : JSONObject.NULL);
......@@ -312,7 +350,7 @@ public class User implements Parcelable, Serializable {
return questionnaire;
}
public JSONObject getQuestionnaireAnswers() {
public ArrayList<QuestionnaireAnswer> getQuestionnaireAnswers() {
return questionnaireAnswers;
}
......@@ -372,7 +410,7 @@ public class User implements Parcelable, Serializable {
this.questionnaire = questionnaire;
}
public void setQuestionnaireAnswers(JSONObject questionnaireAnswers) {
public void setQuestionnaireAnswers(ArrayList<QuestionnaireAnswer> questionnaireAnswers) {
this.questionnaireAnswers = questionnaireAnswers;
}
......@@ -417,6 +455,108 @@ public class User implements Parcelable, Serializable {
return listData;
}
public static class QuestionnaireAnswer implements Parcelable, Serializable {
private int questionId;
private JSONArray answer; // Stored as JSONArray internally for uniformity
private int version;
private boolean isSingleAnswer; // Tracks original format for serialization
public QuestionnaireAnswer() {}
public QuestionnaireAnswer(JSONObject json) {
if (json != null) {
this.questionId = json.optInt("question_id", -1);
this.version = json.optInt("version", 0);
Object rawAnswer = json.opt("answer");
if (rawAnswer instanceof JSONArray) {
this.answer = (JSONArray) rawAnswer;
this.isSingleAnswer = false;
} else {
// Single string answer — wrap into JSONArray for uniformity
this.answer = new JSONArray();
this.answer.put(rawAnswer != null ? rawAnswer.toString() : "");
this.isSingleAnswer = true;
}
}
}
protected QuestionnaireAnswer(Parcel in) {
questionId = in.readInt();
version = in.readInt();
isSingleAnswer = in.readByte() != 0;
try {
String answerStr = in.readString();
answer = answerStr != null ? new JSONArray(answerStr) : null;
} catch (JSONException e) {
answer = null;
}
}
@Override
public void writeToParcel(Parcel dest, int flags) {
dest.writeInt(questionId);
dest.writeInt(version);
dest.writeByte((byte) (isSingleAnswer ? 1 : 0));
dest.writeString(answer != null ? answer.toString() : null);
}
@Override
public int describeContents() {
return 0;
}
public static final Creator<QuestionnaireAnswer> CREATOR = new Creator<QuestionnaireAnswer>() {
@Override
public QuestionnaireAnswer createFromParcel(Parcel in) {
return new QuestionnaireAnswer(in);
}
@Override
public QuestionnaireAnswer[] newArray(int size) {
return new QuestionnaireAnswer[size];
}
};
public JSONObject toJSONObject() {
JSONObject jObj = new JSONObject();
try {
jObj.put("question_id", this.questionId);
jObj.put("version", this.version);
// Serialize back to original format
if (this.isSingleAnswer && this.answer != null && this.answer.length() > 0) {
jObj.put("answer", this.answer.optString(0));
} else {
jObj.put("answer", this.answer != null ? this.answer : JSONObject.NULL);
}
} catch (JSONException e) {
if (WarpConstants.DEBUG) e.printStackTrace();
}
return jObj;
}
public int getQuestionId() { return questionId; }
public void setQuestionId(int questionId) { this.questionId = questionId; }
public JSONArray getAnswer() { return answer; }
public void setAnswer(JSONArray answer) { this.answer = answer; }
public boolean isSingleAnswer() { return isSingleAnswer; }
public void setSingleAnswer(boolean singleAnswer) { isSingleAnswer = singleAnswer; }
public int getVersion() { return version; }
public void setVersion(int version) { this.version = version; }
/**
* Convenience method to get the answer as a list of strings.
*/
public ArrayList<String> getAnswerList() {
ArrayList<String> list = new ArrayList<>();
if (answer != null) {
for (int i = 0; i < answer.length(); i++) {
list.add(answer.optString(i));
}
}
return list;
}
}
public static class Questionnaire implements Parcelable, Serializable {
private String questionnaireId;
private ArrayList<Question> questions;
......
......@@ -204,6 +204,18 @@ public interface ApiService {
@Header(WarpConstants.HEADER_SIGNATURE) String signature,
@Header(WarpConstants.HEADER_AUTHORIZATION) String bearer);
@Headers("Content-Type: application/json")
@POST("/oauth/{appUuid}/context")
Call<ResponseBody> saveQuestionnaire(@Path("appUuid") String appUuid,
@Body RequestBody request,
@Header(WarpConstants.HEADER_DATE) String timeStamp,
@Header(WarpConstants.HEADER_LOYALTY_BUNDLE_ID) String bundleId,
@Header(WarpConstants.HEADER_UNIQUE_DEVICE_ID) String deviceId,
@Header(WarpConstants.HEADER_CHANNEL) String channel,
@Header(WarpConstants.HEADER_WEB_ID) String webId,
@Header(WarpConstants.HEADER_SIGNATURE) String signature,
@Header(WarpConstants.HEADER_AUTHORIZATION) String bearer);
// ===========================================================
// Getter & Setter
// ===========================================================
......
......@@ -1549,4 +1549,112 @@ public class WarplyManager {
});
return future;
}
public static void saveQuestionnaire(ArrayList<User.QuestionnaireAnswer> answers, String questionnaireId, final CallbackReceiver<JSONObject> receiver) {
WarpUtils.log("************* WARPLY Questionnaire Request ********************");
WarpUtils.log("[WARP Trace] WARPLY Questionnaire Request is active");
WarpUtils.log("**************************************************");
ApiService service = ApiClient.getRetrofitInstance().create(ApiService.class);
ListeningExecutorService executorService = MoreExecutors.listeningDecorator(Executors.newFixedThreadPool(1));
ListenableFuture<JSONObject> futureFilters = saveQuestionnaireRetro(answers, questionnaireId, service);
ListenableFuture<List<Object>> allResultsFuture = Futures.allAsList(futureFilters);
ListenableFuture<JSONObject> mergedResultFuture = Futures.transformAsync(allResultsFuture, results -> {
JSONObject resultFilters = (JSONObject) results.get(0);
return executorService.submit(() -> resultFilters);
}, executorService);
Futures.addCallback(mergedResultFuture, new FutureCallback<JSONObject>() {
@Override
public void onSuccess(JSONObject mergedResult) {
executorService.shutdownNow();
new Handler(Looper.getMainLooper()).post(() -> receiver.onSuccess(mergedResult));
}
@Override
public void onFailure(Throwable throwable) {
executorService.shutdownNow();
new Handler(Looper.getMainLooper()).post(() -> receiver.onFailure(2));
}
}, executorService);
}
private static ListenableFuture<JSONObject> saveQuestionnaireRetro(ArrayList<User.QuestionnaireAnswer> answers, String questionnaireId, ApiService service) {
SettableFuture<JSONObject> future = SettableFuture.create();
String timeStamp = DateFormat.format("yyyy-MM-dd hh:mm:ss", System.currentTimeMillis()).toString();
String apiKey = WarpUtils.getApiKey(Warply.getWarplyContext());
String webId = WarpUtils.getWebId(Warply.getWarplyContext());
// Serialize answers list to JSONArray using toJSONObject() on each element
JSONArray answersJsonArray = new JSONArray();
for (User.QuestionnaireAnswer answer : answers) {
answersJsonArray.put(answer.toJSONObject());
}
Map<String, Object> jsonParamsDetails = new ArrayMap<>();
Map<String, Object> jsonParams = new ArrayMap<>();
jsonParams.put("action", "handle_user_details");
jsonParams.put("process", "questionnaire");
jsonParams.put("del_empty", false);
Map<String, Object> jsonParamsQuestionnaireAnswers = new ArrayMap<>();
jsonParamsQuestionnaireAnswers.put("questionnaire_answers", answersJsonArray);
jsonParamsQuestionnaireAnswers.put("questionnaire_id", questionnaireId);
jsonParamsQuestionnaireAnswers.put("first_write", false);
jsonParams.put("data", jsonParamsQuestionnaireAnswers);
jsonParamsDetails.put("consumer_data", jsonParams);
RequestBody detailsRequest = RequestBody.create(MediaType.get("application/json; charset=utf-8"), (new JSONObject(jsonParamsDetails)).toString());
Call<ResponseBody> detailsCall = service.saveQuestionnaire(
WarplyProperty.getAppUuid(Warply.getWarplyContext()),
detailsRequest,
timeStamp,
"android:" + Warply.getWarplyContext().getPackageName(),
new WarplyDeviceInfoCollector(Warply.getWarplyContext()).getUniqueDeviceId(),
"mobile",
webId,
WarpUtils.produceSignature(apiKey + timeStamp),
"Bearer " + WarplyDBHelper.getInstance(Warply.getWarplyContext()).getAuthValue("access_token")
);
detailsCall.enqueue(new Callback<ResponseBody>() {
@Override
public void onResponse(@NonNull Call<ResponseBody> call, @NonNull Response<ResponseBody> response) {
if (response.code() == 200 && response.body() != null) {
JSONObject jobjDetailsResponse = null;
try {
jobjDetailsResponse = new JSONObject(response.body().string());
} catch (Exception e) {
e.printStackTrace();
}
if (jobjDetailsResponse != null && jobjDetailsResponse.has("status") && jobjDetailsResponse.optString("status", "2").equals("1")) {
JSONObject newResult = new JSONObject();
try {
newResult.putOpt("status", 1);
newResult.putOpt("message", "Success");
future.set(newResult);
} catch (JSONException e) {
e.printStackTrace();
future.set(new JSONObject());
}
} else {
future.set(new JSONObject());
}
} else if (String.valueOf(response.code()).startsWith("5")) {
future.set(new JSONObject());
} else {
// future.set(new CouponsetsList());
future.setException(new Throwable());
}
}
@Override
public void onFailure(@NonNull Call<ResponseBody> call, @NonNull Throwable t) {
// future.set(new CouponsetsList());
future.setException(new Throwable());
}
});
return future;
}
}
......