Search in sources :

Example 1 with EventReportBody

use of org.infobip.mobile.messaging.api.geo.EventReportBody in project mobile-messaging-sdk-android by infobip.

the class MobileApiGeoTest method create_eventReport_success.

@Test
public void create_eventReport_success() throws Exception {
    String jsonResponse = "{" + "  'finishedCampaignIds':['id1', 'id2', 'id3']," + "  'suspendedCampaignIds':['id4', 'id5', 'id6']," + "  'messageIds':{'messageId1':'newMessageId1', 'messageId2':'newMessageId2', 'messageId3':'newMessageId3'}" + "}";
    Set<EventReport> events = new HashSet<EventReport>() {

        {
            add(new EventReport(EventType.entry, "myAreaId1", "campaignId1", "messageId1", "sdkMessageId1", 1L));
            add(new EventReport(EventType.exit, "myAreaId2", "campaignId1", "messageId1", "sdkMessageId2", 2L));
            add(new EventReport(EventType.dwell, "myAreaId3", "campaignId2", "messageId2", "sdkMessageId3", 3L));
        }
    };
    Set<MessagePayload> messages = new HashSet<MessagePayload>() {

        {
            add(new MessagePayload("messageId1", null, null, null, null, null, null, null, null));
            add(new MessagePayload("messageId2", null, null, null, null, null, null, null, null));
        }
    };
    debugServer.respondWith(NanoHTTPD.Response.Status.OK, jsonResponse);
    EventReportResponse response = mobileApiGeo.report(new EventReportBody(messages, events, "SomeDeviceInstanceId"));
    // inspect http context
    assertThat(debugServer.getUri()).isEqualTo("/mobile/4/geo/event");
    assertThat(debugServer.getRequestCount()).isEqualTo(1);
    assertThat(debugServer.getRequestMethod()).isEqualTo(NanoHTTPD.Method.POST);
    assertThat(debugServer.getQueryParametersCount()).isEqualTo(0);
    assertThat(response.getFinishedCampaignIds().size()).isEqualTo(3);
    assertThat(response.getFinishedCampaignIds()).contains("id1");
    assertThat(response.getFinishedCampaignIds()).contains("id2");
    assertThat(response.getFinishedCampaignIds()).contains("id3");
    assertThat(response.getSuspendedCampaignIds().size()).isEqualTo(3);
    assertThat(response.getSuspendedCampaignIds()).contains("id4");
    assertThat(response.getSuspendedCampaignIds()).contains("id5");
    assertThat(response.getSuspendedCampaignIds()).contains("id6");
    assertThat(response.getMessageIds().get("messageId1")).isEqualTo("newMessageId1");
    assertThat(response.getMessageIds().get("messageId2")).isEqualTo("newMessageId2");
    assertThat(response.getMessageIds().get("messageId3")).isEqualTo("newMessageId3");
    JSONAssert.assertEquals(debugServer.getBody(), "{" + "\"platformType\":\"GCM\"," + "\"deviceApplicationInstanceId\":\"SomeDeviceInstanceId\"," + "\"messages\": [" + "{\n" + "      \"messageId\": \"messageId1\",\n" + "      \"title\": null,\n" + "      \"body\": null,\n" + "      \"sound\": null,\n" + "      \"vibrate\": null,\n" + "      \"category\": null,\n" + "      \"silent\": null,\n" + "      \"customPayload\": null,\n" + "      \"internalData\": null\n" + "    },\n" + "    {\n" + "      \"messageId\": \"messageId2\",\n" + "      \"title\": null,\n" + "      \"body\": null,\n" + "      \"sound\": null,\n" + "      \"vibrate\": null,\n" + "      \"category\": null,\n" + "      \"silent\": null,\n" + "      \"customPayload\": null,\n" + "      \"internalData\": null\n" + "    }" + "]," + "\"reports\": [" + "{" + "\"event\":\"entry\"," + "\"geoAreaId\":\"myAreaId1\"," + "\"campaignId\":\"campaignId1\"," + "\"messageId\":\"messageId1\"," + "\"sdkMessageId\":\"sdkMessageId1\"," + "\"timestampDelta\":1" + "}," + "{" + "\"event\":\"exit\"," + "\"geoAreaId\":\"myAreaId2\"," + "\"campaignId\":\"campaignId1\"," + "\"messageId\":\"messageId1\"," + "\"sdkMessageId\":\"sdkMessageId2\"," + "\"timestampDelta\":2" + "}," + "{" + "\"event\":\"dwell\"," + "\"geoAreaId\":\"myAreaId3\"," + "\"campaignId\":\"campaignId2\"," + "\"messageId\":\"messageId2\"," + "\"sdkMessageId\":\"sdkMessageId3\"," + "\"timestampDelta\":3" + "}" + "]" + "}", JSONCompareMode.LENIENT);
}
Also used : EventReportResponse(org.infobip.mobile.messaging.api.geo.EventReportResponse) EventReport(org.infobip.mobile.messaging.api.geo.EventReport) EventReportBody(org.infobip.mobile.messaging.api.geo.EventReportBody) HashSet(java.util.HashSet) MessagePayload(org.infobip.mobile.messaging.api.geo.MessagePayload) Test(org.junit.Test)

Example 2 with EventReportBody

use of org.infobip.mobile.messaging.api.geo.EventReportBody in project mobile-messaging-sdk-android by infobip.

the class GeoReporter method reportSync.

/**
 * Reports geo events synchronously
 *
 * @param geoReports set that contains original messages and corresponding events
 * @return result that will contain lists of campaign ids and mappings between library generated message ids and IPCore ids
 */
@NonNull
public GeoReportingResult reportSync(@NonNull GeoReport[] geoReports) {
    EventReportBody eventReportBody = prepareEventReportBody(context, geofenceHelper.getMessageStoreForGeo(), geoReports);
    MobileMessagingLogger.v("GEO REPORT >>>", eventReportBody);
    EventReportResponse eventResponse = mobileApiGeo.report(eventReportBody);
    MobileMessagingLogger.v("GEO REPORT <<<", eventResponse);
    GeoReportingResult result = new GeoReportingResult(eventResponse);
    handleSuccess(context, geoReports, result);
    return result;
}
Also used : EventReportResponse(org.infobip.mobile.messaging.api.geo.EventReportResponse) EventReportBody(org.infobip.mobile.messaging.api.geo.EventReportBody) NonNull(android.support.annotation.NonNull)

Example 3 with EventReportBody

use of org.infobip.mobile.messaging.api.geo.EventReportBody in project mobile-messaging-sdk-android by infobip.

the class GeoReporter method prepareEventReportBody.

/**
 * Creates event report request body based on provided geofencing report.
 *
 * @param geoMessageStore message store for geo
 * @param geoReports      map that contains original signaling messages as keys and related geo reports as values.
 * @return request body for geo reporting.
 */
@NonNull
private static EventReportBody prepareEventReportBody(Context context, MessageStore geoMessageStore, @NonNull GeoReport[] geoReports) {
    Set<MessagePayload> messagePayloads = new HashSet<>();
    Set<EventReport> eventReports = new HashSet<>();
    List<Message> messages = geoMessageStore.findAll(context);
    for (GeoReport r : geoReports) {
        Message m = GeoReportHelper.getSignalingMessageForReport(messages, r);
        if (m == null) {
            MobileMessagingLogger.e("Cannot find signaling message for id: " + r.getSignalingMessageId());
            continue;
        }
        messagePayloads.add(new MessagePayload(m.getMessageId(), m.getTitle(), m.getBody(), m.getSound(), m.isVibrate(), m.getCategory(), m.isSilent(), m.getCustomPayload() != null ? m.getCustomPayload().toString() : null, InternalDataMapper.createInternalDataBasedOnMessageContents(m)));
        Long timestampDelta = Time.now() - r.getTimestampOccurred();
        Long timestampDeltaSeconds = TimeUnit.MILLISECONDS.toSeconds(timestampDelta);
        eventReports.add(new EventReport(EventType.valueOf(r.getEvent().name()), r.getArea().getId(), r.getCampaignId(), r.getSignalingMessageId(), r.getMessageId(), timestampDeltaSeconds));
    }
    String deviceInstanceId = MobileMessagingCore.getInstance(context).getPushRegistrationId();
    return new EventReportBody(messagePayloads, eventReports, deviceInstanceId);
}
Also used : Message(org.infobip.mobile.messaging.Message) EventReport(org.infobip.mobile.messaging.api.geo.EventReport) EventReportBody(org.infobip.mobile.messaging.api.geo.EventReportBody) MessagePayload(org.infobip.mobile.messaging.api.geo.MessagePayload) HashSet(java.util.HashSet) NonNull(android.support.annotation.NonNull)

Example 4 with EventReportBody

use of org.infobip.mobile.messaging.api.geo.EventReportBody in project mobile-messaging-sdk-android by infobip.

the class GeoReporterTest method test_success.

@Test
public void test_success() throws Exception {
    // Given
    Area area1 = createArea("areaId1");
    Area area2 = createArea("areaId2");
    Area area3 = createArea("areaId3");
    createMessage(context, "signalingMessageId1", "campaignId1", true, area1, area2);
    createMessage(context, "signalingMessageId2", "campaignId3", true, area3);
    createReport(context, "signalingMessageId1", "campaignId1", "messageId1", true, area1);
    createReport(context, "signalingMessageId1", "campaignId1", "messageId2", true, area2);
    createReport(context, "signalingMessageId2", "campaignId3", "messageId3", true, area3);
    // When
    geoReporter.synchronize();
    // Then
    // Examine what is reported back via broadcast intent
    Mockito.verify(geoBroadcaster, Mockito.after(5000).atLeastOnce()).geoReported(geoReportCaptor.capture());
    List<GeoReport> broadcastedReports = geoReportCaptor.getValue();
    assertEquals(3, broadcastedReports.size());
    for (GeoReport r : broadcastedReports) {
        switch(r.getMessageId()) {
            case "messageId1":
                assertEquals(GeoEventType.entry, r.getEvent());
                assertEquals("campaignId1", r.getCampaignId());
                assertEquals("signalingMessageId1", r.getSignalingMessageId());
                assertEquals(r.getMessageId(), "messageId1");
                assertEquals(r.getArea().getId(), "areaId1");
                break;
            case "messageId2":
                assertEquals(GeoEventType.entry, r.getEvent());
                assertEquals("campaignId1", r.getCampaignId());
                assertEquals("signalingMessageId1", r.getSignalingMessageId());
                assertEquals("messageId2", r.getMessageId());
                assertEquals("areaId2", r.getArea().getId());
                break;
            case "messageId3":
                assertEquals(GeoEventType.entry, r.getEvent());
                assertEquals("campaignId3", r.getCampaignId());
                assertEquals("signalingMessageId2", r.getSignalingMessageId());
                assertEquals("messageId3", r.getMessageId());
                assertEquals("areaId3", r.getArea().getId());
                break;
            default:
                assertTrue("Unexpected message id " + r.getMessageId(), false);
                break;
        }
    }
    // Examine HTTP request body
    final EventReportBody body = reportBodyCaptor.getValue();
    assertEquals(2, body.getMessages().size());
    Set<String> messageIds = new HashSet<String>() {

        {
            List<MessagePayload> ps = new ArrayList<>(body.getMessages());
            add(ps.get(0).getMessageId());
            add(ps.get(1).getMessageId());
        }
    };
    assertTrue(messageIds.contains("signalingMessageId1"));
    assertTrue(messageIds.contains("signalingMessageId2"));
    assertEquals(3, body.getReports().size());
    EventReport[] reports = body.getReports().toArray(new EventReport[body.getReports().size()]);
    assertNotSame(reports[0].getTimestampDelta(), reports[1].getTimestampDelta());
    assertNotSame(reports[0].getTimestampDelta(), reports[2].getTimestampDelta());
    assertNotSame(reports[1].getTimestampDelta(), reports[2].getTimestampDelta());
    assertEquals(3, reports.length);
    for (EventReport report : reports) {
        switch(report.getSdkMessageId()) {
            case "messageId1":
                assertEquals(EventType.entry, report.getEvent());
                assertEquals("areaId1", report.getGeoAreaId());
                assertEquals("signalingMessageId1", report.getMessageId());
                assertEquals("campaignId1", report.getCampaignId());
                assertNotNull(report.getTimestampDelta());
                break;
            case "messageId2":
                assertEquals(EventType.entry, report.getEvent());
                assertEquals("areaId2", report.getGeoAreaId());
                assertEquals("signalingMessageId1", report.getMessageId());
                assertEquals("campaignId1", report.getCampaignId());
                assertNotNull(report.getTimestampDelta());
                break;
            case "messageId3":
                assertEquals(EventType.entry, report.getEvent());
                assertEquals("areaId3", report.getGeoAreaId());
                assertEquals("signalingMessageId2", report.getMessageId());
                assertEquals("campaignId3", report.getCampaignId());
                assertNotNull(report.getTimestampDelta());
                break;
            default:
                assertTrue("Unexpected message id " + report.getMessageId(), false);
                break;
        }
    }
}
Also used : GeoReport(org.infobip.mobile.messaging.geo.report.GeoReport) ArrayList(java.util.ArrayList) EventReport(org.infobip.mobile.messaging.api.geo.EventReport) EventReportBody(org.infobip.mobile.messaging.api.geo.EventReportBody) HashSet(java.util.HashSet) MessagePayload(org.infobip.mobile.messaging.api.geo.MessagePayload) Test(org.junit.Test)

Aggregations

EventReportBody (org.infobip.mobile.messaging.api.geo.EventReportBody)4 HashSet (java.util.HashSet)3 EventReport (org.infobip.mobile.messaging.api.geo.EventReport)3 MessagePayload (org.infobip.mobile.messaging.api.geo.MessagePayload)3 NonNull (android.support.annotation.NonNull)2 EventReportResponse (org.infobip.mobile.messaging.api.geo.EventReportResponse)2 Test (org.junit.Test)2 ArrayList (java.util.ArrayList)1 Message (org.infobip.mobile.messaging.Message)1 GeoReport (org.infobip.mobile.messaging.geo.report.GeoReport)1