11/**
22 * Modified MIT License
33 *
4- * Copyright 2016 OneSignal
4+ * Copyright 2017 OneSignal
55 *
66 * Permission is hereby granted, free of charge, to any person obtaining a copy
77 * of this software and associated documentation files (the "Software"), to deal
2727
2828package com .onesignal ;
2929
30- import android .content .ComponentName ;
3130import android .content .Context ;
32- import android .content .Intent ;
33- import android .content .ServiceConnection ;
34- import android .content .pm .PackageManager ;
3531import android .os .Bundle ;
36- import android .os .IBinder ;
3732
38- import org .json .JSONArray ;
39- import org .json .JSONException ;
40- import org .json .JSONObject ;
41-
42- import java .lang .reflect .InvocationTargetException ;
4333import java .lang .reflect .Method ;
44- import java .math .BigDecimal ;
45- import java .util .ArrayList ;
46- import java .util .HashMap ;
47- import java .util .Map ;
4834import java .util .concurrent .atomic .AtomicLong ;
4935
5036class TrackFirebaseAnalytics {
51-
52- static private boolean firebaseAnalyticsEnabled = false ;
37+
5338 private static Class <?> FirebaseAnalyticsClass ;
5439 private Object mFirebaseAnalyticsInstance ;
5540 private Context appContext ;
5641
5742 private static AtomicLong lastReceivedTime ;
43+ private static AtomicLong lastOpenedTime ;
44+
5845 private static OSNotificationPayload lastReceivedPayload ;
5946
6047 private static final String EVENT_NOTIFICATION_OPENED = "os_notification_opened" ;
@@ -65,52 +52,56 @@ class TrackFirebaseAnalytics {
6552 appContext = activity ;
6653 }
6754
68- static boolean CanTrack (Context context ) {
55+ static boolean CanTrack () {
6956 try {
7057 FirebaseAnalyticsClass = Class .forName ("com.google.firebase.analytics.FirebaseAnalytics" );
71- firebaseAnalyticsEnabled = true ;
58+ return true ;
7259 } catch (Throwable t ) {
73- firebaseAnalyticsEnabled = false ;
74- }
75- finally {
76- return firebaseAnalyticsEnabled ;
60+ return false ;
7761 }
7862 }
7963
8064 void trackInfluenceOpenEvent () {
65+ if (lastReceivedTime == null || lastReceivedPayload == null )
66+ return ;
67+
68+ // Attribute if app was opened in 2 minutes or less after displaying the notification
69+ long now = System .currentTimeMillis ();
70+ if (now - lastReceivedTime .get () > 1000 * 60 * 2 )
71+ return ;
72+
73+ // Don't attribute if we opened a notification in the last 30 seconds.
74+ // To prevent an open and an influenced open from firing for the same notification.
75+ if (lastOpenedTime != null && now - lastOpenedTime .get () < 1000 * 30 )
76+ return ;
77+
8178 try {
79+ Object firebaseAnalyticsInstance = getFirebaseAnalyticsInstance (appContext );
8280
83- long currentTime = System .currentTimeMillis ();
84- if (lastReceivedTime != null &&
85- currentTime -lastReceivedTime .get () < 1000 *60 *2 &&
86- lastReceivedPayload != null ) {
87-
88- Object firebaseAnalyticsInstance = getFirebaseAnalyticsInstance (appContext );
89-
90- Method trackMethod = getTrackMethod (FirebaseAnalyticsClass );
91-
92- String event = EVENT_NOTIFICATION_INFLUENCE_OPEN ;
81+ Method trackMethod = getTrackMethod (FirebaseAnalyticsClass );
9382
94- //construct the firebase analytics event bundle
95- Bundle bundle = new Bundle ();
96- bundle .putString ("source" , "OneSignal" );
97- bundle .putString ("medium" , "notification" );
98- bundle .putString ("notification_id" , lastReceivedPayload .notificationID );
99- bundle .putString ("campaign" , getCampaignNameFromPayload (lastReceivedPayload ));
83+ String event = EVENT_NOTIFICATION_INFLUENCE_OPEN ;
10084
101- trackMethod .invoke (firebaseAnalyticsInstance , event , bundle );
102- }
85+ //construct the firebase analytics event bundle
86+ Bundle bundle = new Bundle ();
87+ bundle .putString ("source" , "OneSignal" );
88+ bundle .putString ("medium" , "notification" );
89+ bundle .putString ("notification_id" , lastReceivedPayload .notificationID );
90+ bundle .putString ("campaign" , getCampaignNameFromPayload (lastReceivedPayload ));
10391
92+ trackMethod .invoke (firebaseAnalyticsInstance , event , bundle );
10493 } catch (Throwable t ) {
10594 t .printStackTrace ();
10695 }
10796 }
10897
10998 void trackOpenedEvent (OSNotificationOpenResult openResult ) {
99+ if (lastOpenedTime == null )
100+ lastOpenedTime = new AtomicLong ();
101+ lastOpenedTime .set (System .currentTimeMillis ());
102+
110103 try {
111-
112104 //get the source, medium, campaign params from the openResult
113-
114105 Object firebaseAnalyticsInstance = getFirebaseAnalyticsInstance (appContext );
115106
116107 Method trackMethod = getTrackMethod (FirebaseAnalyticsClass );
@@ -134,7 +125,6 @@ void trackOpenedEvent(OSNotificationOpenResult openResult) {
134125 void trackReceivedEvent (OSNotificationOpenResult receivedResult ) {
135126 try {
136127 //get the source, medium, campaign params from the openResult
137-
138128 Object firebaseAnalyticsInstance = getFirebaseAnalyticsInstance (appContext );
139129
140130 Method trackMethod = getTrackMethod (FirebaseAnalyticsClass );
@@ -156,18 +146,15 @@ void trackReceivedEvent(OSNotificationOpenResult receivedResult) {
156146 } catch (Throwable t ) {
157147 t .printStackTrace ();
158148 }
159-
160-
161149 }
162150
163151 private String getCampaignNameFromPayload (OSNotificationPayload payload ) {
164- String campaign ;
165- if (!payload .templateName .isEmpty () && !payload .templateId .isEmpty ())
166- campaign = payload .templateName + " - " + payload .templateId ;
167- else
168- campaign = payload .title .substring (0 , Math .min (10 , payload .title .length ()));
169-
170- return campaign ;
152+ if (!payload .templateName .isEmpty () && !payload .templateId .isEmpty ())
153+ return payload .templateName + " - " + payload .templateId ;
154+ else if (payload .title != null )
155+ return payload .title .substring (0 , Math .min (10 , payload .title .length ()));
156+
157+ return "" ;
171158 }
172159
173160 private Object getFirebaseAnalyticsInstance (Context context ) {
0 commit comments