Skip to content

Instantly share code, notes, and snippets.

@Felipe00
Last active February 21, 2017 12:40
Show Gist options
  • Save Felipe00/174ccb0716088865b83e77a5feb1b00c to your computer and use it in GitHub Desktop.
Save Felipe00/174ccb0716088865b83e77a5feb1b00c to your computer and use it in GitHub Desktop.
public class ServiceRace extends IntentService {
private static final String TAG = "UserTravelResponse";
private static final String TAXI_ACCEPTED = "taxi_accepted";
private static final String USER_RESPONSE_FINISHED = "finished";
private static final String USER_RESPONSE_CANCELED = "canceled";
private static final String USER_RESPONSE_MESSAGE = "message";
private final String[] route_status = {""};
private final Boolean[] acceptReceipt = {false};
private final Boolean[] cancelReceipt = {false};
private Travel travel;
public ServiceRace() {
super("ServiceRace");
}
@Override
protected void onHandleIntent(Intent intent) {
// Pega a corrida do Prefs
travel = PrefTravelUtils.getCurrentTravel(this);
RequestParams params = new RequestParams();
// parâmetros omitidos
while (!verifyUserResponse()) {
// chamada ao servidor
// Estou fazendo uma chamada Síncrona pois o IntentService não permite fazer chamadas Assíncronas com o "LoopJ"
EndpointClient.synchronousGet("minha_url", params, this, new AsyncHttpResponseHandler() {
@Override
public void onSuccess(int statusCode, Header[] headers, byte[] responseBody) {
// Broadcast pra avisar que a corrida começou
Intent connectionIntent = new Intent();
connectionIntent.setAction(TravelCallActivity.CONNECTION_SUCCESS);
sendBroadcast(connectionIntent);
Log.d(TAG, "Success - " + new String(responseBody));
// conversão de Byte pra String
String response = new String(responseBody);
try {
// Busca pelo status da corrida
JSONObject objectRoot = new JSONObject(response);
route_status[0] = objectRoot.getString("route_status");
Intent broadcastIntent = new Intent();
if (route_status[0].equalsIgnoreCase(TAXI_ACCEPTED) && !acceptReceipt[0]) {
// Taxista aceitou a corrida
acceptReceipt[0] = true;
broadcastIntent.setAction(TravelCallActivity.ACTION_FOUND_TRAVEL);
sendBroadcast(broadcastIntent);
} else if (route_status[0].equalsIgnoreCase(USER_RESPONSE_CANCELED) && !cancelReceipt[0]) {
// Usuário cancelou a corrida
cancelReceipt[0] = true;
broadcastIntent.setAction(TravelCallActivity.ACTION_CANCEL_TRAVEL);
sendBroadcast(broadcastIntent);
} else if (route_status[0].equalsIgnoreCase(USER_RESPONSE_FINISHED) && !cancelReceipt[0]) {
// Corrida finalizada
cancelReceipt[0] = true;
Log.i(TAG, "-> Corrida finalizada");
}
// Atualiza a sessão da corrida
updateTravelSession(response);
// Recebe as mensagens do passageiro
if (!objectRoot.isNull("taxi_message") && !objectRoot.isNull("taxi_message_time")) {
SharedPreferences prefs = getSharedPreferences("current_message", MODE_PRIVATE);
String prefsMsg = prefs.getString("msg", "NONE"), prefsTime = prefs.getString("time", "NONE");
String jsonMsg = objectRoot.getString("taxi_message"), jsonTime = objectRoot.getString("taxi_message_time");
if (prefsMsg.equals("NONE") || prefsTime.equals("NONE")) {
UserTravelResponse.this.sendMessage(prefs);
return;
}
if (!prefsMsg.equals(jsonMsg) || !prefsTime.equals(jsonTime)) {
UserTravelResponse.this.sendMessage(prefs);
}
}
} catch (JSONException e) {
e.printStackTrace();
}
}
@Override
public void onFailure(int statusCode, Header[] headers, byte[] responseBody, Throwable error) {
String erro = responseBody != null ? new String(responseBody) : " erro: " + error.getMessage();
Log.v(TAG, "Failure - SyncWithServer" + erro);
// Broadcast pra avisar que está sem internet
Intent broadcastIntent = new Intent();
broadcastIntent.setAction(TravelCallActivity.CONNECTION_FAILURE);
sendBroadcast(broadcastIntent);
}
});
try {
Thread.sleep(5000L);
} catch (InterruptedException e) {
e.printStackTrace();
}
// fim while
}
}
// Envia a mensagem recebida para activity
private void sendMessage(SharedPreferences prefs) {
SharedPreferences.Editor editor = prefs.edit();
editor.putString("msg", travel.getTaxi_message());
editor.putString("time", travel.getTaxi_message_time());
editor.commit();
SimpleDateFormat formatter = new SimpleDateFormat("HH:mm:ss");
String time = formatter.format(new Date());
AppHelper.taxiMessages.add(new Message(travel.getTaxi_message(), time));
Intent broadcastIntent = new Intent();
broadcastIntent.setAction(TravelCallActivity.ACTION_RECEIVE_MESSAGE);
sendBroadcast(broadcastIntent);
}
// Atualiza o Prefs
private void updateTravelSession(String responseBody) {
travel = JsonConverter.travelFromJson(responseBody);
PrefTravelUtils.setCurrentTravel(travel, UserTravelResponse.this);
}
// Verifica se a corrida tá cancelada pelo cliente ou foi finalizada
private boolean verifyUserResponse() {
return route_status[0].equalsIgnoreCase(USER_RESPONSE_CANCELED)
|| route_status[0].equalsIgnoreCase(USER_RESPONSE_FINISHED);
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment