Last active
February 21, 2017 12:40
-
-
Save Felipe00/174ccb0716088865b83e77a5feb1b00c to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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