2626import java .util .List ;
2727import java .util .Locale ;
2828import java .util .Map ;
29+ import java .util .concurrent .Callable ;
2930import java .util .concurrent .ExecutorService ;
31+ import java .util .concurrent .Future ;
3032import java .util .concurrent .LinkedBlockingQueue ;
3133import java .util .concurrent .ThreadPoolExecutor ;
3234import java .util .concurrent .TimeUnit ;
@@ -250,6 +252,15 @@ public void run() {
250252 });
251253 }
252254
255+ public Future <List <AnalyticsEvent >> submitEventsWithResult () {
256+ return submissionRunnableQueue .submit (new Callable <List <AnalyticsEvent >>() {
257+ @ Override
258+ public List <AnalyticsEvent > call () throws Exception {
259+ return processEvents ();
260+ }
261+ });
262+ }
263+
253264 /**
254265 * Reads events of maximum of KEY_MAX_SUBMISSION_SIZE size.
255266 * The default max request size is DEFAULT_MAX_SUBMISSION_SIZE.
@@ -302,18 +313,18 @@ public List<JSONObject> getAllEvents() {
302313 return events ;
303314 }
304315
305- void processEvents () {
316+ List < AnalyticsEvent > processEvents () {
306317 final long start = TimeUnit .NANOSECONDS .toMillis (System .nanoTime ());
307318
308319 Cursor cursor = null ;
309-
320+ List < AnalyticsEvent > result = new ArrayList <>();
310321 try {
311322 cursor = dbUtil .queryAllEvents ();
312323
313324 if (!cursor .moveToFirst ()) {
314325 // if the cursor is empty there is nothing to do.
315326 log .info ("No events available to submit." );
316- return ;
327+ return result ;
317328 }
318329
319330 int submissions = 0 ;
@@ -336,6 +347,8 @@ void processEvents() {
336347 submissions ++;
337348 }
338349
350+ //Add all successfully submitted events to result
351+ result .addAll (getSuccessfullySyncedEvents (events , batchIdsAndSizeToDelete ));
339352 // Delete events from the local database. At this point batchIdsAndSizeToDelete
340353 // reflects the set of events that can be deleted from the local database.
341354 for (Integer id : batchIdsAndSizeToDelete .keySet ()) {
@@ -351,12 +364,28 @@ void processEvents() {
351364 } while (cursor .moveToNext ());
352365
353366 log .info (String .format (Locale .US , "Time of attemptDelivery: %d" ,
354- TimeUnit .NANOSECONDS .toMillis (System .nanoTime ()) - start ));
367+ TimeUnit .NANOSECONDS .toMillis (System .nanoTime ()) - start ));
368+ } catch (JSONException jsonException ) {
369+ log .error ("Failed to parse to event object" , jsonException );
355370 } finally {
356371 if (cursor != null ) {
357372 cursor .close ();
358373 }
359374 }
375+ log .info (String .format ("Submitted %s events" , result .size ()));
376+ return result ;
377+ }
378+
379+ private List <AnalyticsEvent > getSuccessfullySyncedEvents (JSONArray events ,
380+ HashMap <Integer , Integer > batchIdsAndSizeToDelete )
381+ throws JSONException {
382+ List <AnalyticsEvent > result = new ArrayList <>();
383+ for (int i = 0 ; i <events .length (); i ++) {
384+ if (batchIdsAndSizeToDelete .containsKey (events .getJSONObject (i ).getInt (DATABASE_ID_KEY ))) {
385+ result .add (AnalyticsEvent .translateToEvent (events .getJSONObject (i )));
386+ }
387+ }
388+ return result ;
360389 }
361390
362391 private void submitEventsAndEndpoint (final JSONArray eventArray ,
0 commit comments