2525import java .io .OptionalDataException ;
2626import java .lang .ref .WeakReference ;
2727import java .util .HashMap ;
28- import java .util .Locale ;
28+ import java .util .List ;
2929import java .util .Map ;
3030import java .util .concurrent .Executors ;
3131import java .util .concurrent .ScheduledExecutorService ;
3232import java .util .concurrent .TimeUnit ;
3333
3434import android .app .Activity ;
3535import android .content .Context ;
36+ import android .content .Intent ;
3637import android .content .SharedPreferences ;
3738import android .content .pm .ApplicationInfo ;
3839import android .content .pm .PackageManager ;
3940import android .content .pm .PackageManager .NameNotFoundException ;
41+ import android .content .pm .ResolveInfo ;
4042import android .net .Uri ;
4143import android .os .Bundle ;
4244import android .os .Handler ;
@@ -158,8 +160,8 @@ public void trackRevenue(double amountInCents, String eventToken, Map<String, St
158160 sessionHandler .sendMessage (message );
159161 }
160162
161- public void finishedTrackingActivity (final ResponseData responseData ) {
162- if (onFinishedListener == null ) {
163+ public void finishedTrackingActivity (final ResponseData responseData , final String deepLink ) {
164+ if (onFinishedListener == null && deepLink == null ) {
163165 return ;
164166 }
165167
@@ -168,7 +170,8 @@ public void finishedTrackingActivity(final ResponseData responseData) {
168170 @ Override
169171 public void run () {
170172 try {
171- onFinishedListener .onFinishedTracking (responseData );
173+ runDelegateMain (responseData );
174+ launchDeepLinkMain (deepLink );
172175 } catch (NullPointerException e ) {
173176 }
174177 }
@@ -344,18 +347,16 @@ private void startInternal() {
344347 transferSessionPackage ();
345348 activityState .resetSessionAttributes (now );
346349 writeActivityState ();
347- logger .debug (String .format (Locale .US ,
348- "Session %d" , activityState .sessionCount ));
350+ logger .debug ("Session %d" , activityState .sessionCount );
349351 return ;
350352 }
351353
352354 // new subsession
353355 if (lastInterval > SUBSESSION_INTERVAL ) {
354356 activityState .subsessionCount ++;
355- logger .info (String .format (Locale .US ,
356- "Started subsession %d of session %d" ,
357- activityState .subsessionCount ,
358- activityState .sessionCount ));
357+ logger .info ("Started subsession %d of session %d" ,
358+ activityState .subsessionCount ,
359+ activityState .sessionCount );
359360 }
360361 activityState .sessionLength += lastInterval ;
361362 activityState .lastActivity = now ;
@@ -393,13 +394,13 @@ private void trackEventInternal(PackageBuilder eventBuilder) {
393394 packageHandler .addPackage (eventPackage );
394395
395396 if (eventBuffering ) {
396- logger .info (String . format ( "Buffered event %s" , eventPackage .getSuffix () ));
397+ logger .info ("Buffered event %s" , eventPackage .getSuffix ());
397398 } else {
398399 packageHandler .sendFirstPackage ();
399400 }
400401
401402 writeActivityState ();
402- logger .debug (String . format ( Locale . US , "Event %d" , activityState .eventCount ) );
403+ logger .debug ("Event %d" , activityState .eventCount );
403404 }
404405
405406 private void trackRevenueInternal (PackageBuilder revenueBuilder ) {
@@ -423,13 +424,13 @@ private void trackRevenueInternal(PackageBuilder revenueBuilder) {
423424 packageHandler .addPackage (eventPackage );
424425
425426 if (eventBuffering ) {
426- logger .info (String . format ( "Buffered revenue %s" , eventPackage .getSuffix () ));
427+ logger .info ("Buffered revenue %s" , eventPackage .getSuffix ());
427428 } else {
428429 packageHandler .sendFirstPackage ();
429430 }
430431
431432 writeActivityState ();
432- logger .debug (String . format ( Locale . US , "Event %d (revenue)" , activityState .eventCount ) );
433+ logger .debug ("Event %d (revenue)" , activityState .eventCount );
433434 }
434435
435436 private void readOpenUrlInternal (Uri url ) {
@@ -472,7 +473,35 @@ private void readOpenUrlInternal(Uri url) {
472473 packageHandler .addPackage (reattributionPackage );
473474 packageHandler .sendFirstPackage ();
474475
475- logger .debug (String .format ("Reattribution %s" , adjustDeepLinks .toString ()));
476+ logger .debug ("Reattribution %s" , adjustDeepLinks .toString ());
477+ }
478+
479+ private void runDelegateMain (ResponseData responseData ) {
480+ if (onFinishedListener == null ) return ;
481+ if (responseData == null ) return ;
482+ onFinishedListener .onFinishedTracking (responseData );
483+ }
484+
485+ private void launchDeepLinkMain (String deepLink ) {
486+ if (deepLink == null ) return ;
487+
488+ Uri location = Uri .parse (deepLink );
489+ Intent mapIntent = new Intent (Intent .ACTION_VIEW , location );
490+ mapIntent .setFlags (Intent .FLAG_ACTIVITY_NEW_TASK );
491+
492+ // Verify it resolves
493+ PackageManager packageManager = context .getPackageManager ();
494+ List <ResolveInfo > activities = packageManager .queryIntentActivities (mapIntent , 0 );
495+ boolean isIntentSafe = activities .size () > 0 ;
496+
497+ // Start an activity if it's safe
498+ if (!isIntentSafe ) {
499+ logger .error ("Unable to open deep link (%s)" , deepLink );
500+ return ;
501+ }
502+
503+ logger .info ("Open deep link (%s)" , deepLink );
504+ context .startActivity (mapIntent );
476505 }
477506
478507 private boolean canTrackEvent (PackageBuilder revenueBuilder ) {
@@ -517,7 +546,7 @@ private void readActivityState() {
517546
518547 try {
519548 activityState = (ActivityState ) objectStream .readObject ();
520- logger .debug (String . format ( "Read activity state: %s uuid:%s" , activityState , activityState .uuid ) );
549+ logger .debug ("Read activity state: %s uuid:%s" , activityState , activityState .uuid );
521550 return ;
522551 } catch (ClassNotFoundException e ) {
523552 logger .error ("Failed to find activity state class" );
@@ -534,7 +563,7 @@ private void readActivityState() {
534563 } catch (FileNotFoundException e ) {
535564 logger .verbose ("Activity state file not found" );
536565 } catch (Exception e ) {
537- logger .error (String . format ( "Failed to open activity state file for reading (%s)" , e ) );
566+ logger .error ("Failed to open activity state file for reading (%s)" , e );
538567 }
539568
540569 // start with a fresh activity state in case of any exception
@@ -549,15 +578,15 @@ private void writeActivityState() {
549578
550579 try {
551580 objectStream .writeObject (activityState );
552- logger .debug (String . format ( "Wrote activity state: %s" , activityState ) );
581+ logger .debug ("Wrote activity state: %s" , activityState );
553582 } catch (NotSerializableException e ) {
554583 logger .error ("Failed to serialize activity state" );
555584 } finally {
556585 objectStream .close ();
557586 }
558587
559588 } catch (Exception e ) {
560- logger .error (String . format ( "Failed to open activity state for writing (%s)" , e ) );
589+ logger .error ("Failed to open activity state for writing (%s)" , e );
561590 }
562591 }
563592
@@ -593,7 +622,7 @@ private void injectReferrer(PackageBuilder builder) {
593622 builder .setReferrer (preferences .getString (ReferrerReceiver .REFERRER_KEY , null ));
594623 }
595624 catch (Exception e ) {
596- logger .error (String . format ( "Failed to inject referrer (%s)" , e ) );
625+ logger .error ("Failed to inject referrer (%s)" , e );
597626 }
598627 }
599628
@@ -674,7 +703,7 @@ private void setEnvironment(String env) {
674703 "PRODUCTION: Adjust is running in Production mode. Use this setting only for the build that you want to publish. Set the environment to `sandbox` if you want to test your app!" );
675704 logger .setLogLevel (Logger .LogLevel .ASSERT );
676705 } else {
677- logger .Assert (String . format ( "Malformed environment '%s'" , environment ) );
706+ logger .Assert ("Malformed environment '%s'" , environment );
678707 logger .setLogLevel (Logger .LogLevel .ASSERT );
679708 environment = Constants .MALFORMED ;
680709 }
@@ -690,7 +719,7 @@ private void setEventBuffering(boolean buffering) {
690719 private void setDefaultTracker (String tracker ) {
691720 defaultTracker = tracker ;
692721 if (defaultTracker != null ) {
693- logger .info (String . format ( "Default tracker: '%s'" , defaultTracker ) );
722+ logger .info ("Default tracker: '%s'" , defaultTracker );
694723 }
695724 }
696725
@@ -710,7 +739,7 @@ private Bundle getApplicationBundle() {
710739 } catch (NameNotFoundException e ) {
711740 logger .error ("ApplicationInfo not found" );
712741 } catch (Exception e ) {
713- logger .error (String . format ( "Failed to get ApplicationBundle (%s)" , e ) );
742+ logger .error ("Failed to get ApplicationBundle (%s)" , e );
714743 }
715744 return null ;
716745 }
@@ -746,7 +775,7 @@ private boolean checkAppTokenNotNull(String appToken) {
746775
747776 private boolean checkAppTokenLength (String appToken ) {
748777 if (12 != appToken .length ()) {
749- logger .error (String . format ( "Malformed App Token '%s'" , appToken ) );
778+ logger .error ("Malformed App Token '%s'" , appToken );
750779 return false ;
751780 }
752781 return true ;
0 commit comments