Skip to content

Commit 8db87e7

Browse files
authored
Merge pull request #1 from BatchLabs/feature/custom_tracker_instance
Allow overriding of the ATInternet tracker instance
2 parents 206684d + f9a807c commit 8db87e7

File tree

7 files changed

+248
-80
lines changed

7 files changed

+248
-80
lines changed

.idea/runConfigurations/dispatcher_test.xml

Lines changed: 1 addition & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

CHANGELOG

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,12 @@
1+
UPCOMING
2+
-----
3+
4+
* Changed `AtInternetRegistrar.getInstance()`'s type to AtInternetDispatcher so that methods specific to this dispatcher can be easily called.
5+
6+
* Added the ability to set your own ATInternet `Tracker` instance using `setTrackerOverride()` on `AtInternetDispatcher`.
7+
Use `AtInternetRegistrar` to get the instance of this class.
8+
Ex: `AtInternetRegistrar.getInstance().setTrackerOverride(myTracker)`
9+
110
1.0
211
-----
312

atinternet-dispatcher/src/main/java/com/batch/android/dispatcher/atinternet/AtInternetDispatcher.java

Lines changed: 44 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
import android.net.Uri;
44

55
import androidx.annotation.NonNull;
6+
import androidx.annotation.Nullable;
67

78
import com.atinternet.tracker.ATInternet;
89
import com.atinternet.tracker.Publisher;
@@ -40,13 +41,13 @@ public class AtInternetDispatcher implements BatchEventDispatcher
4041
private static final String MESSAGING_CLICK_NAME = "ClickedBatchInAppMessage";
4142
private static final String UNKNOWN_EVENT_NAME = "UnknownBatchMessage";
4243

43-
private Tracker publisherTracker;
44-
private Tracker campaignTracker;
44+
private final Map<String, Tracker> trackerCache;
45+
46+
private Tracker trackerOverride;
4547

4648
AtInternetDispatcher()
4749
{
48-
campaignTracker = ATInternet.getInstance().getTracker(BATCH_CAMPAIGN_TRACKER);
49-
publisherTracker = ATInternet.getInstance().getTracker(BATCH_PUBLISHER_TRACKER);
50+
trackerCache = new HashMap<>();
5051
}
5152

5253
/**
@@ -65,14 +66,51 @@ public void dispatchEvent(@NonNull Batch.EventDispatcher.Type type,
6566
dispatchAsOnSiteAd(type, payload, xtorTag);
6667
}
6768

68-
Screen screen = campaignTracker.Screens().add(getATEventName(type));
69+
Screen screen = getTracker(BATCH_CAMPAIGN_TRACKER).Screens().add(getATEventName(type));
6970
if (xtorTag != null) {
7071
screen.Campaign(xtorTag);
7172
}
7273
screen.sendView();
7374

7475
}
7576

77+
/**
78+
Specify the ATInternet {@link Tracker} instance that the dispatcher should use.
79+
If set to null (its default value), Batch will automatically instantiate its own trackers
80+
using the default configuration.
81+
This method is useful if you set your {@link Tracker} instances in your code.
82+
*/
83+
public void setTrackerOverride(@Nullable Tracker trackerOverride) {
84+
this.trackerOverride = trackerOverride;
85+
if (trackerOverride == null) {
86+
clearTrackerCache();
87+
}
88+
}
89+
90+
private Tracker getTracker(@NonNull String trackerName) {
91+
if (trackerOverride != null) {
92+
return trackerOverride;
93+
}
94+
95+
Tracker tracker = trackerCache.get(trackerName);
96+
if (tracker == null) {
97+
synchronized (trackerCache) {
98+
tracker = trackerCache.get(trackerName);
99+
if (tracker == null) {
100+
tracker = ATInternet.getInstance().getTracker(trackerName);
101+
trackerCache.put(trackerName, tracker);
102+
}
103+
}
104+
}
105+
return tracker;
106+
}
107+
108+
private void clearTrackerCache() {
109+
synchronized (trackerCache) {
110+
trackerCache.clear();
111+
}
112+
}
113+
76114
private void dispatchAsOnSiteAd(Batch.EventDispatcher.Type type, Batch.EventDispatcher.Payload payload, String xtorTag) {
77115

78116
Publisher publisher;
@@ -85,6 +123,7 @@ private void dispatchAsOnSiteAd(Batch.EventDispatcher.Type type, Batch.EventDisp
85123
}
86124
}
87125

126+
Tracker publisherTracker = getTracker(BATCH_PUBLISHER_TRACKER);
88127
if (campaign != null && !campaign.isEmpty()) {
89128
publisher = publisherTracker.Publishers().add(campaign);
90129
} else {

atinternet-dispatcher/src/main/java/com/batch/android/dispatcher/atinternet/AtInternetRegistrar.java

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,6 @@
22

33
import android.content.Context;
44

5-
import com.batch.android.BatchEventDispatcher;
65
import com.batch.android.eventdispatcher.DispatcherRegistrar;
76

87
/**
@@ -23,7 +22,7 @@ public class AtInternetRegistrar implements DispatcherRegistrar
2322
* @return Dispatcher instance
2423
*/
2524
@Override
26-
public BatchEventDispatcher getDispatcher(Context context)
25+
public AtInternetDispatcher getDispatcher(Context context)
2726
{
2827
if (instance == null) {
2928
instance = new AtInternetDispatcher();

atinternet-dispatcher/src/test/java/com/batch/android/dispatcher/atinternet/AtInternetDispatcherTest.java

Lines changed: 3 additions & 72 deletions
Original file line numberDiff line numberDiff line change
@@ -55,13 +55,13 @@ public void setUp() {
5555

5656
PowerMockito.mockStatic(ATInternet.class);
5757
Mockito.when(ATInternet.getInstance()).thenReturn(atInternet);
58-
Mockito.when(atInternet.getDefaultTracker()).thenReturn(tracker);
59-
Mockito.when(atInternet.getTracker(AtInternetDispatcher.BATCH_PUBLISHER_TRACKER)).thenReturn(tracker);
60-
Mockito.when(atInternet.getTracker(AtInternetDispatcher.BATCH_CAMPAIGN_TRACKER)).thenReturn(tracker);
58+
Mockito.when(atInternet.getDefaultTracker()).thenThrow(new RuntimeException("getDefaultTracker should not be called"));
59+
Mockito.when(atInternet.getTracker(Mockito.any())).thenThrow(new RuntimeException("getTracker should not be called"));
6160
Mockito.when(tracker.Publishers()).thenReturn(publishers);
6261
Mockito.when(tracker.Screens()).thenReturn(screens);
6362

6463
atInternetDispatcher = new AtInternetDispatcher();
64+
atInternetDispatcher.setTrackerOverride(tracker);
6565
}
6666

6767
@Test
@@ -691,73 +691,4 @@ public void testInAppAutoClose() {
691691
Mockito.verify(screen).sendView();
692692
}
693693

694-
private static class TestEventPayload implements Batch.EventDispatcher.Payload {
695-
696-
private String trackingId;
697-
private String deeplink;
698-
private Bundle customPayload;
699-
private boolean isPositive;
700-
701-
TestEventPayload(String trackingId,
702-
String deeplink,
703-
Bundle customPayload)
704-
{
705-
this(trackingId, deeplink, customPayload, false);
706-
}
707-
708-
TestEventPayload(String trackingId,
709-
String deeplink,
710-
Bundle customPayload,
711-
boolean isPositive)
712-
{
713-
this.trackingId = trackingId;
714-
this.deeplink = deeplink;
715-
this.customPayload = customPayload;
716-
this.isPositive = isPositive;
717-
}
718-
719-
@Nullable
720-
@Override
721-
public String getTrackingId()
722-
{
723-
return trackingId;
724-
}
725-
726-
@Nullable
727-
@Override
728-
public String getDeeplink()
729-
{
730-
return deeplink;
731-
}
732-
733-
@Override
734-
public boolean isPositiveAction()
735-
{
736-
return isPositive;
737-
}
738-
739-
@Nullable
740-
@Override
741-
public String getCustomValue(@NonNull String key)
742-
{
743-
if (customPayload == null) {
744-
return null;
745-
}
746-
return customPayload.getString(key);
747-
}
748-
749-
@Nullable
750-
@Override
751-
public BatchMessage getMessagingPayload()
752-
{
753-
return null;
754-
}
755-
756-
@Nullable
757-
@Override
758-
public BatchPushPayload getPushPayload()
759-
{
760-
return null;
761-
}
762-
}
763694
}
Lines changed: 80 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,80 @@
1+
package com.batch.android.dispatcher.atinternet;
2+
3+
import android.os.Bundle;
4+
5+
import androidx.annotation.NonNull;
6+
import androidx.annotation.Nullable;
7+
8+
import com.batch.android.Batch;
9+
import com.batch.android.BatchMessage;
10+
import com.batch.android.BatchPushPayload;
11+
12+
public class TestEventPayload implements Batch.EventDispatcher.Payload {
13+
14+
private String trackingId;
15+
private String deeplink;
16+
private Bundle customPayload;
17+
private boolean isPositive;
18+
19+
TestEventPayload(String trackingId,
20+
String deeplink,
21+
Bundle customPayload)
22+
{
23+
this(trackingId, deeplink, customPayload, false);
24+
}
25+
26+
TestEventPayload(String trackingId,
27+
String deeplink,
28+
Bundle customPayload,
29+
boolean isPositive)
30+
{
31+
this.trackingId = trackingId;
32+
this.deeplink = deeplink;
33+
this.customPayload = customPayload;
34+
this.isPositive = isPositive;
35+
}
36+
37+
@Nullable
38+
@Override
39+
public String getTrackingId()
40+
{
41+
return trackingId;
42+
}
43+
44+
@Nullable
45+
@Override
46+
public String getDeeplink()
47+
{
48+
return deeplink;
49+
}
50+
51+
@Override
52+
public boolean isPositiveAction()
53+
{
54+
return isPositive;
55+
}
56+
57+
@Nullable
58+
@Override
59+
public String getCustomValue(@NonNull String key)
60+
{
61+
if (customPayload == null) {
62+
return null;
63+
}
64+
return customPayload.getString(key);
65+
}
66+
67+
@Nullable
68+
@Override
69+
public BatchMessage getMessagingPayload()
70+
{
71+
return null;
72+
}
73+
74+
@Nullable
75+
@Override
76+
public BatchPushPayload getPushPayload()
77+
{
78+
return null;
79+
}
80+
}

0 commit comments

Comments
 (0)