package info.ozkan.vipera.business.notification; import info.ozkan.vipera.business.notification.android.AndroidRegistrationDao; import info.ozkan.vipera.business.notification.android.AndroidRegistrationResult; import info.ozkan.vipera.entities.Doctor; import info.ozkan.vipera.entities.DoctorAndroidDevice; import info.ozkan.vipera.entities.HealthDataField; import info.ozkan.vipera.entities.HealthDataValue; import info.ozkan.vipera.entities.Notification; import info.ozkan.vipera.entities.Patient; import java.io.IOException; import java.util.Arrays; import java.util.HashMap; import java.util.List; import java.util.Map; import javax.inject.Inject; import org.apache.http.client.ClientProtocolException; import org.apache.http.client.fluent.Request; import org.apache.http.entity.ContentType; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import com.google.gson.Gson; /** * Android Push notification Provider * * @author Ömer Özkan * */ public class AndroidPushNotificationProvider implements NotificationProvider { /** * Gönderilecek olan tckn boyutu */ private static final int TCKN_SIZE = 4; /** * Bildiri mesaj deseni */ private static final String NOTIFICATION_MSG_PATTERN = "%s isimli hastanıza ait , %s değeri sınırların dışında %s %s olarak ölçülmüştür!"; /** * LOGGER */ private static final Logger LOGGER = LoggerFactory .getLogger(AndroidPushNotificationProvider.class); /** * Api anahtarı */ private String apiKey; /** * GCM adresi */ private static final String GCM_URL = "https://android.googleapis.com/gcm/send"; /** * DAo */ @Inject private AndroidRegistrationDao androidRegistrationDao; /** * push notification gönderme işlemlerini yürütür */ public void send(final Notification notification) { final Doctor doctor = notification.getDoctor(); final AndroidRegistrationResult result = androidRegistrationDao.findDevices(doctor); final List<DoctorAndroidDevice> devices = result.getDevices(); for (final DoctorAndroidDevice device : devices) { final String registerId = device.getRegistrationId(); sendNotification(registerId, notification); } } /** * push notification gönderir * * @param registerId * @param notification */ private void sendNotification(final String registerId, final Notification notification) { try { String result; final AndroidGCMNotificationSendModel model = new AndroidGCMNotificationSendModel(); final Map<String, String> map = createNotificationValues(notification); model.setData(map); model.setRegistrationIds(Arrays.asList(registerId)); final Gson gson = new Gson(); final String json = gson.toJson(model); final Request request = Request.Post(GCM_URL) .addHeader("Authorization", "key=" + apiKey) .bodyString(json, ContentType.APPLICATION_JSON); result = request.execute().returnContent().toString(); LOGGER.info("System result: " + result); } catch (final ClientProtocolException e) { LOGGER.error("exception: " + e); } catch (final IOException e) { LOGGER.error("exception: " + e); } } /** * Bildirim için gereken verileri üretir * * @param notification * @return */ private Map<String, String> createNotificationValues( final Notification notification) { final Patient patient = notification.getPatient(); final HealthDataValue value = notification.getHealthDataValue(); final HealthDataField field = value.getField(); final Map<String, String> map = new HashMap<String, String>(); final String patientName = patient.getTckn().toString().substring(0, TCKN_SIZE) + "-" + patient.getFullname(); final String msg = String.format(NOTIFICATION_MSG_PATTERN, patientName, field.getName(), value.getValue(), field.getUnit()); map.put("message", msg); map.put("patientName", patientName); map.put("patientPhone", patient.getPhone()); map.put("patientMobilePhone", patient.getMobilePhone()); map.put("fieldName", field.getTitle()); map.put("fieldUnit", field.getUnit()); map.put("value", value.getValue().toString()); return map; } public void setKey(final String apiKey) { this.apiKey = apiKey; } public void setPassword(final String password) { } }