2424import java .io .ObjectOutputStream ;
2525import java .io .OptionalDataException ;
2626import java .lang .ref .WeakReference ;
27+ import java .util .HashMap ;
2728import java .util .Locale ;
2829import java .util .Map ;
2930import java .util .concurrent .Executors ;
3637import android .content .pm .ApplicationInfo ;
3738import android .content .pm .PackageManager ;
3839import android .content .pm .PackageManager .NameNotFoundException ;
40+ import android .net .Uri ;
3941import android .os .Bundle ;
4042import android .os .Handler ;
4143import android .os .HandlerThread ;
@@ -49,6 +51,7 @@ public class ActivityHandler extends HandlerThread {
4951 private static long SESSION_INTERVAL ;
5052 private static long SUBSESSION_INTERVAL ;
5153 private static final String TIME_TRAVEL = "Time travel!" ;
54+ private static final String ADJUST_PREFIX = "adjust_" ;
5255
5356 private final SessionHandler sessionHandler ;
5457 private IPackageHandler packageHandler ;
@@ -195,13 +198,22 @@ public Boolean isEnabled() {
195198 }
196199 }
197200
201+ public void readOpenUrl (Uri url ) {
202+ Message message = Message .obtain ();
203+ message .arg1 = SessionHandler .DEEP_LINK ;
204+ message .obj = url ;
205+ sessionHandler .sendMessage (message );
206+ }
207+
198208 private static final class SessionHandler extends Handler {
199209 private static final int INIT_BUNDLE = 72630 ;
200210 private static final int INIT_PRESET = 72633 ;
201211 private static final int START = 72640 ;
202212 private static final int END = 72650 ;
203213 private static final int EVENT = 72660 ;
204214 private static final int REVENUE = 72670 ;
215+ private static final int DEEP_LINK = 72680 ;
216+
205217
206218 private final WeakReference <ActivityHandler > sessionHandlerReference ;
207219
@@ -240,6 +252,10 @@ public void handleMessage(Message message) {
240252 PackageBuilder revenueBuilder = (PackageBuilder ) message .obj ;
241253 sessionHandler .trackRevenueInternal (revenueBuilder );
242254 break ;
255+ case DEEP_LINK :
256+ Uri url = (Uri ) message .obj ;
257+ sessionHandler .readOpenUrlInternal (url );
258+ break ;
243259 }
244260 }
245261 }
@@ -412,6 +428,49 @@ private void trackRevenueInternal(PackageBuilder revenueBuilder) {
412428 logger .debug (String .format (Locale .US , "Event %d (revenue)" , activityState .eventCount ));
413429 }
414430
431+ private void readOpenUrlInternal (Uri url ) {
432+ if (url == null ) {
433+ return ;
434+ }
435+
436+ String queryString = url .getQuery ();
437+ if (queryString == null ) {
438+ return ;
439+ }
440+
441+ Map <String , String > adjustDeepLinks = new HashMap <String , String >();
442+
443+ String [] queryPairs = queryString .split ("&" );
444+ for (String pair : queryPairs ) {
445+ String [] pairComponents = pair .split ("=" );
446+ if (pairComponents .length != 2 ) continue ;
447+
448+ String key = pairComponents [0 ];
449+ if (!key .startsWith (ADJUST_PREFIX )) continue ;
450+
451+ String value = pairComponents [1 ];
452+ if (value .length () == 0 ) continue ;
453+
454+ String keyWOutPrefix = key .substring (ADJUST_PREFIX .length ());
455+ if (keyWOutPrefix .length () == 0 ) continue ;
456+
457+ adjustDeepLinks .put (keyWOutPrefix , value );
458+ }
459+
460+ if (adjustDeepLinks .size () == 0 ) {
461+ return ;
462+ }
463+
464+ PackageBuilder builder = new PackageBuilder (context );
465+ builder .setDeepLinkParameters (adjustDeepLinks );
466+ injectGeneralAttributes (builder );
467+ ActivityPackage reattributionPackage = builder .buildReattributionPackage ();
468+ packageHandler .addPackage (reattributionPackage );
469+ packageHandler .sendFirstPackage ();
470+
471+ logger .debug (String .format ("Reattribution %s" , adjustDeepLinks .toString ()));
472+ }
473+
415474 private boolean canTrackEvent (PackageBuilder revenueBuilder ) {
416475 return checkAppTokenNotNull (appToken )
417476 && checkActivityState (activityState )
@@ -486,7 +545,7 @@ private void writeActivityState() {
486545
487546 try {
488547 objectStream .writeObject (activityState );
489- logger .verbose (String .format ("Wrote activity state: %s" , activityState ));
548+ logger .debug (String .format ("Wrote activity state: %s" , activityState ));
490549 } catch (NotSerializableException e ) {
491550 logger .error ("Failed to serialize activity state" );
492551 } finally {
0 commit comments