package de.stephanlindauer.criticalmaps.handler;
import android.os.AsyncTask;
import android.util.Log;
import com.squareup.okhttp.MediaType;
import com.squareup.okhttp.OkHttpClient;
import com.squareup.okhttp.Request;
import com.squareup.okhttp.RequestBody;
import com.squareup.okhttp.Response;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;
import java.io.IOException;
import javax.inject.Inject;
import de.stephanlindauer.criticalmaps.model.ChatModel;
import de.stephanlindauer.criticalmaps.model.OwnLocationModel;
import de.stephanlindauer.criticalmaps.model.UserModel;
import de.stephanlindauer.criticalmaps.vo.Endpoints;
public class PullServerHandler extends AsyncTask<Void, Void, String> {
//const
private static final String LOG_TAG = "CM_PullServerHandler";
//dependencies
private final ChatModel chatModel;
private final OwnLocationModel ownLocationModel;
private final UserModel userModel;
private final ServerResponseProcessor serverResponseProcessor;
private final OkHttpClient okHttpClient;
@Inject
public PullServerHandler(ChatModel chatModel, OwnLocationModel ownLocationModel, UserModel userModel, ServerResponseProcessor serverResponseProcessor, OkHttpClient okHttpClient) {
this.chatModel = chatModel;
this.ownLocationModel = ownLocationModel;
this.userModel = userModel;
this.serverResponseProcessor = serverResponseProcessor;
this.okHttpClient = okHttpClient;
}
@Override
protected String doInBackground(Void... params) {
String jsonPostString = getJsonObject().toString();
final RequestBody body = RequestBody.create(MediaType.parse("application/json"), jsonPostString);
final Request postRequest = new Request.Builder().url(Endpoints.MAIN_POST).post(body).build();
try {
final Response response = okHttpClient.newCall(postRequest).execute();
if (response.isSuccessful()) {
String responseBodyString = response.body().string();
response.body().close();
return responseBodyString;
}
} catch (IOException e) {
Log.e(LOG_TAG, Log.getStackTraceString(e));
}
return "";
}
@Override
protected void onPostExecute(String result) {
if (!result.isEmpty()) {
serverResponseProcessor.process(result);
}
}
private JSONObject getJsonObject() {
JSONObject jsonObject = new JSONObject();
try {
jsonObject.put("device", userModel.getChangingDeviceToken());
if (ownLocationModel.hasPreciseLocation() && ownLocationModel.isLocationFresh()) {
jsonObject.put("location", ownLocationModel.getLocationJson());
}
if (chatModel.hasOutgoingMessages()) {
JSONArray messages = chatModel.getOutgoingMessagesAsJson();
jsonObject.put("messages", messages);
}
} catch (JSONException e) {
Log.e(LOG_TAG, Log.getStackTraceString(e));
}
return jsonObject;
}
}