package org.starfishrespect.myconsumption.android.tasks;
import android.content.Context;
import android.os.AsyncTask;
import com.google.android.gms.gcm.GoogleCloudMessaging;
import org.codehaus.jackson.map.ObjectMapper;
import org.springframework.http.HttpEntity;
import org.springframework.http.HttpHeaders;
import org.springframework.http.HttpMethod;
import org.springframework.http.ResponseEntity;
import org.springframework.http.converter.FormHttpMessageConverter;
import org.springframework.http.converter.StringHttpMessageConverter;
import org.springframework.web.client.RestTemplate;
import org.starfishrespect.myconsumption.android.Config;
import org.starfishrespect.myconsumption.android.SingleInstance;
import org.starfishrespect.myconsumption.android.util.CryptoUtils;
import org.starfishrespect.myconsumption.android.util.PrefUtils;
import org.starfishrespect.myconsumption.server.api.dto.SimpleResponseDTO;
import java.io.IOException;
import java.util.List;
import static org.starfishrespect.myconsumption.android.util.LogUtils.LOGI;
import static org.starfishrespect.myconsumption.android.util.LogUtils.makeLogTag;
/**
* Registers the application with GCM servers asynchronously.
* S23Y (2015). Licensed under the Apache License, Version 2.0.
* Author: Thibaud Ledent
*/
public class GCMRegister {
private static final String TAG = makeLogTag(GCMRegister.class);
private GoogleCloudMessaging gcm;
/**
* Registers the application with GCM servers asynchronously.
* <p>
* Stores the registration ID and app versionCode in the application's
* shared preferences.
*/
public void registerInBackground(final Context context) {
AsyncTask<Void, List, String> task = new AsyncTask<Void, List, String>() {
@Override
protected String doInBackground(Void... params) {
RestTemplate template = new RestTemplate();
HttpHeaders httpHeaders = CryptoUtils.createHeadersCurrentUser();
ResponseEntity<String> responseEnt;
template.getMessageConverters().add(new FormHttpMessageConverter());
template.getMessageConverters().add(new StringHttpMessageConverter());
String msg = "";
try {
if (gcm == null) {
gcm = GoogleCloudMessaging.getInstance(context);
}
String regid = gcm.register(Config.SENDER_ID);
msg = "Device registered, registration ID=" + regid;
// Send the registration ID to the server
String url = SingleInstance.getServerUrl() + "notifs/"
+ SingleInstance.getUserController().getUser().getName() + "/id/" + regid;
responseEnt = template.exchange(url, HttpMethod.POST, new HttpEntity<>(httpHeaders), String.class);
SimpleResponseDTO response = new ObjectMapper().readValue(responseEnt.getBody(), SimpleResponseDTO.class);
if (response.getStatus() != SimpleResponseDTO.STATUS_SUCCESS) {
msg = "Error: " + response.getStatus() + " Cannot post register id on server side.";
}
// Persist the registration ID - no need to register again.
PrefUtils.setRegistrationId(context, regid);
} catch (IOException ex) {
msg = "Error:" + ex.getMessage();
// If there is an error, don't just keep trying to register.
// Require the user to click a button again, or perform
// exponential back-off.
}
return msg;
}
@Override
protected void onPostExecute(String msg) {
LOGI(TAG, msg);
}
};
task.execute();
}
}