@@ -54,6 +54,7 @@ public class ActivityHandler implements IActivityHandler {
5454 private TimerOnce delayStartTimer ;
5555 private InternalState internalState ;
5656 private String basePath ;
57+ private String gdprPath ;
5758
5859 private DeviceInfo deviceInfo ;
5960 private AdjustConfig adjustConfig ; // always valid after construction
@@ -592,6 +593,26 @@ public void run() {
592593 });
593594 }
594595
596+ @ Override
597+ public void gdprForgetMe () {
598+ scheduledExecutor .submit (new Runnable () {
599+ @ Override
600+ public void run () {
601+ gdprForgetMeI ();
602+ }
603+ });
604+ }
605+
606+ @ Override
607+ public void gotOptOutResponse () {
608+ scheduledExecutor .submit (new Runnable () {
609+ @ Override
610+ public void run () {
611+ gotOptOutResponseI ();
612+ }
613+ });
614+ }
615+
595616 @ Override
596617 public Context getContext () {
597618 return adjustConfig .context ;
@@ -633,6 +654,11 @@ public String getBasePath() {
633654 return this .basePath ;
634655 }
635656
657+ @ Override
658+ public String getGdprPath () {
659+ return this .gdprPath ;
660+ }
661+
636662 public ActivityPackage getAttributionPackageI () {
637663 long now = System .currentTimeMillis ();
638664 PackageBuilder attributionBuilder = new PackageBuilder (adjustConfig ,
@@ -727,6 +753,14 @@ public void run(ActivityHandler activityHandler) {
727753 }
728754 }
729755
756+ // GDPR
757+ if (internalState .hasFirstSdkStartOcurred ()) {
758+ SharedPreferencesManager sharedPreferencesManager = new SharedPreferencesManager (getContext ());
759+ if (sharedPreferencesManager .getGdprForgetMe ()) {
760+ gdprForgetMe ();
761+ }
762+ }
763+
730764 foregroundTimer = new TimerCycle (
731765 new Runnable () {
732766 @ Override
@@ -765,6 +799,7 @@ public void run() {
765799 UtilNetworking .setUserAgent (adjustConfig .userAgent );
766800
767801 this .basePath = adjustConfig .basePath ;
802+ this .gdprPath = adjustConfig .gdprPath ;
768803
769804 packageHandler = AdjustFactory .getPackageHandler (this , adjustConfig .context , toSendI (false ));
770805
@@ -780,10 +815,8 @@ public void run() {
780815 updatePackagesI ();
781816 }
782817
783- preLaunchActionsI (adjustConfig .preLaunchActionsArray );
784-
785818 installReferrer = new InstallReferrer (adjustConfig .context , this );
786-
819+ preLaunchActionsI ( adjustConfig . preLaunchActionsArray );
787820 sendReftagReferrerI ();
788821 }
789822
@@ -848,13 +881,17 @@ private void startFirstSessionI() {
848881
849882 SharedPreferencesManager sharedPreferencesManager = new SharedPreferencesManager (getContext ());
850883 activityState .pushToken = sharedPreferencesManager .getPushToken ();
884+ // activityState.isGdprForgotten = sharedPreferencesManager.getGdprForgetMe();
851885
852886 // track the first session package only if it's enabled
853887 if (internalState .isEnabled ()) {
854- activityState .sessionCount = 1 ; // this is the first session
855- transferSessionPackageI (now );
856-
857- checkAfterNewStartI (sharedPreferencesManager );
888+ if (!sharedPreferencesManager .getGdprForgetMe ()) {
889+ activityState .sessionCount = 1 ; // this is the first session
890+ transferSessionPackageI (now );
891+ checkAfterNewStartI (sharedPreferencesManager );
892+ } else {
893+ gdprForgetMeI ();
894+ }
858895 }
859896
860897 activityState .resetSessionAttributes (now );
@@ -863,11 +900,16 @@ private void startFirstSessionI() {
863900
864901 writeActivityStateI ();
865902 sharedPreferencesManager .removePushToken ();
903+ sharedPreferencesManager .removeGdprForgetMe ();
866904
867905 // don't check attribution right after first sdk start
868906 }
869907
870908 private void processSessionI () {
909+ if (activityState .isGdprForgotten ) {
910+ return ;
911+ }
912+
871913 long now = System .currentTimeMillis ();
872914
873915 long lastInterval = now - activityState .lastActivity ;
@@ -951,6 +993,7 @@ private void trackEventI(AdjustEvent event) {
951993 if (!isEnabledI ()) return ;
952994 if (!checkEventI (event )) return ;
953995 if (!checkOrderIdI (event .orderId )) return ;
996+ if (activityState .isGdprForgotten ) return ;
954997
955998 long now = System .currentTimeMillis ();
956999
@@ -1213,6 +1256,13 @@ private void setEnabledI(boolean enabled) {
12131256 return ;
12141257 }
12151258
1259+ if (enabled ) {
1260+ if (activityState .isGdprForgotten ) {
1261+ logger .error ("Re-enabling SDK not possible for forgotten user" );
1262+ return ;
1263+ }
1264+ }
1265+
12161266 // save new enabled state in internal state
12171267 internalState .enabled = enabled ;
12181268
@@ -1224,9 +1274,16 @@ private void setEnabledI(boolean enabled) {
12241274 return ;
12251275 }
12261276
1277+ activityState .enabled = enabled ;
1278+ writeActivityStateI ();
1279+
12271280 if (enabled ) {
12281281 SharedPreferencesManager sharedPreferencesManager = new SharedPreferencesManager (getContext ());
12291282
1283+ if (sharedPreferencesManager .getGdprForgetMe ()) {
1284+ gdprForgetMeI ();
1285+ }
1286+
12301287 // check if install was tracked
12311288 if (!sharedPreferencesManager .getInstallTracked ()) {
12321289 long now = System .currentTimeMillis ();
@@ -1235,9 +1292,6 @@ private void setEnabledI(boolean enabled) {
12351292 checkAfterNewStartI (sharedPreferencesManager );
12361293 }
12371294
1238- activityState .enabled = enabled ;
1239- writeActivityStateI ();
1240-
12411295 updateStatusI (!enabled ,
12421296 "Pausing handlers due to SDK being disabled" ,
12431297 "Handlers remain paused" ,
@@ -1729,6 +1783,7 @@ public void resetSessionPartnerParametersI() {
17291783 private void setPushTokenI (String token ) {
17301784 if (!checkActivityStateI (activityState )) { return ; }
17311785 if (!isEnabledI ()) { return ; }
1786+ if (activityState .isGdprForgotten ) { return ; }
17321787
17331788 if (token == null ) { return ; }
17341789 if (token .equals (activityState .pushToken )) { return ; }
@@ -1754,6 +1809,39 @@ private void setPushTokenI(String token) {
17541809 }
17551810 }
17561811
1812+ private void gdprForgetMeI () {
1813+ if (!checkActivityStateI (activityState )) { return ; }
1814+ if (!isEnabledI ()) { return ; }
1815+ if (activityState .isGdprForgotten ) { return ; }
1816+
1817+ activityState .isGdprForgotten = true ;
1818+ writeActivityStateI ();
1819+
1820+ long now = System .currentTimeMillis ();
1821+ PackageBuilder gdprPackageBuilder = new PackageBuilder (adjustConfig , deviceInfo , activityState , sessionParameters , now );
1822+
1823+ ActivityPackage gdprPackage = gdprPackageBuilder .buildGdprPackage ();
1824+ packageHandler .addPackage (gdprPackage );
1825+
1826+ // If GDPR choice was cached, remove it.
1827+ SharedPreferencesManager sharedPreferencesManager = new SharedPreferencesManager (getContext ());
1828+ sharedPreferencesManager .removeGdprForgetMe ();
1829+
1830+ if (adjustConfig .eventBufferingEnabled ) {
1831+ logger .info ("Buffered event %s" , gdprPackage .getSuffix ());
1832+ } else {
1833+ packageHandler .sendFirstPackage ();
1834+ }
1835+ }
1836+
1837+ private void gotOptOutResponseI () {
1838+ activityState .isGdprForgotten = true ;
1839+ writeActivityStateI ();
1840+
1841+ packageHandler .flush ();
1842+ setEnabledI (false );
1843+ }
1844+
17571845 private void readActivityStateI (Context context ) {
17581846 try {
17591847 activityState = Util .readObject (context , ACTIVITY_STATE_FILENAME , ACTIVITY_STATE_NAME , ActivityState .class );
0 commit comments