package uprrp.tania; import android.os.AsyncTask; import android.util.Log; import com.amazonaws.auth.CognitoCachingCredentialsProvider; import com.amazonaws.services.sns.AmazonSNSClient; import com.amazonaws.services.sns.model.CreatePlatformEndpointRequest; import com.amazonaws.services.sns.model.CreatePlatformEndpointResult; import com.amazonaws.services.sns.model.GetEndpointAttributesRequest; import com.amazonaws.services.sns.model.GetEndpointAttributesResult; import com.amazonaws.services.sns.model.InvalidParameterException; import com.amazonaws.services.sns.model.NotFoundException; import com.amazonaws.services.sns.model.SetEndpointAttributesRequest; import java.util.HashMap; import java.util.Map; import java.util.regex.Matcher; import java.util.regex.Pattern; public class SNSRegister extends AsyncTask { private static final String TAG = "SNSRegister"; AmazonSNSClient client; String arnStorage = null; public SNSRegister (CognitoCachingCredentialsProvider credentialsProvider){ client = new AmazonSNSClient(credentialsProvider); } @Override protected void onPostExecute(String s) { super.onPostExecute(s); } @Override protected String doInBackground(String... strings) { String endpointArn = retrieveEndpointArn(); String token = GlobalValues.getInstance().getDeviceToken(); // FirebaseInstanceId.getInstance().getToken() boolean updateNeeded = false; boolean createNeeded = (null == endpointArn); if (createNeeded) { // No platform endpoint ARN is stored; need to call createEndpoint. endpointArn = createEndpoint(token); createNeeded = false; } Log.i(TAG, "Retrieving platform endpoint data..."); // Look up the platform endpoint and make sure the data in it is current, even if // it was just created. try { GetEndpointAttributesRequest geaReq = new GetEndpointAttributesRequest() .withEndpointArn(endpointArn); GetEndpointAttributesResult geaRes = client.getEndpointAttributes(geaReq); updateNeeded = !geaRes.getAttributes().get("Token").equals(token) || !geaRes.getAttributes().get("Enabled").equalsIgnoreCase("true"); } catch (NotFoundException nfe) { // We had a stored ARN, but the platform endpoint associated with it // disappeared. Recreate it. createNeeded = true; } if (createNeeded) { createEndpoint(token); } Log.d(TAG, "updateNeeded = " + updateNeeded); if (updateNeeded) { // The platform endpoint is out of sync with the current data; // update the token and enable it. Log.d(TAG, "Updating platform endpoint " + endpointArn); Map attribs = new HashMap(); attribs.put("Token", token); attribs.put("Enabled", "true"); SetEndpointAttributesRequest saeReq = new SetEndpointAttributesRequest() .withEndpointArn(endpointArn) .withAttributes(attribs); client.setEndpointAttributes(saeReq); } return endpointArn; } /** * @return never null * */ private String createEndpoint(String token) { String endpointArn = null; try { Log.d(TAG, "Creating platform endpoint with token " + token); CreatePlatformEndpointRequest cpeReq = new CreatePlatformEndpointRequest() .withPlatformApplicationArn("arn:aws:sns:us-east-1:227586183436:app/GCM/TANIA_Android") .withToken(token); CreatePlatformEndpointResult cpeRes = client .createPlatformEndpoint(cpeReq); endpointArn = cpeRes.getEndpointArn(); } catch (InvalidParameterException ipe) { String message = ipe.getErrorMessage(); Log.d(TAG, "Exception message: " + message); Pattern p = Pattern .compile(".*Endpoint (arn:aws:sns[^ ]+) already exists " + "with the same token.*"); Matcher m = p.matcher(message); if (m.matches()) { // The platform endpoint already exists for this token, but with // additional custom data that // createEndpoint doesn't want to overwrite. Just use the // existing platform endpoint. endpointArn = m.group(1); } else { // Rethrow the exception, the input is actually bad. throw ipe; } } storeEndpointArn(endpointArn); return endpointArn; } private String retrieveEndpointArn() { return arnStorage; } private void storeEndpointArn(String endpointArn) { arnStorage = endpointArn; } }