@@ -776,6 +776,14 @@ - (void)trackAdRevenue:(ADJAdRevenue *)adRevenue {
776776 }];
777777}
778778
779+ - (void )checkForNewAttStatus {
780+ [ADJUtil launchInQueue: self .internalQueue
781+ selfInject: self
782+ block: ^(ADJActivityHandler * selfI) {
783+ [selfI checkForNewAttStatusI: selfI];
784+ }];
785+ }
786+
779787- (void )writeActivityState {
780788 [ADJUtil launchInQueue: self .internalQueue
781789 selfInject: self
@@ -914,7 +922,7 @@ - (void)initI:(ADJActivityHandler *)selfI
914922 if (selfI.adjustConfig .eventBufferingEnabled ) {
915923 [selfI.logger info: @" Event buffering is enabled" ];
916924 }
917-
925+
918926 if (selfI.adjustConfig .defaultTracker != nil ) {
919927 [selfI.logger info: @" Default tracker: '%@ '" , selfI.adjustConfig.defaultTracker];
920928 }
@@ -1034,7 +1042,9 @@ - (void)startI:(ADJActivityHandler *)selfI {
10341042 }
10351043
10361044 [selfI updateHandlersStatusAndSendI: selfI];
1037-
1045+
1046+ [selfI processCoppaComplianceI: selfI];
1047+
10381048 [selfI processSessionI: selfI];
10391049
10401050 [selfI checkAttributionStateI: selfI];
@@ -1064,6 +1074,8 @@ - (void)processSessionI:(ADJActivityHandler *)selfI {
10641074 if ([ADJUserDefaults getGdprForgetMe ]) {
10651075 [selfI setGdprForgetMeI: selfI];
10661076 } else {
1077+ [selfI processCoppaComplianceI: selfI];
1078+
10671079 // check if disable third party sharing request came, then send it first
10681080 if ([ADJUserDefaults getDisableThirdPartySharing ]) {
10691081 [selfI disableThirdPartySharingI: selfI];
@@ -1356,6 +1368,10 @@ - (void)disableThirdPartySharingI:(ADJActivityHandler *)selfI {
13561368 if (selfI.activityState .isThirdPartySharingDisabled ) {
13571369 return ;
13581370 }
1371+ if (selfI.adjustConfig .coppaCompliantEnabled ) {
1372+ [selfI.logger warn: @" Call to disable third party sharing API ignored, already done when COPPA enabled" ];
1373+ return ;
1374+ }
13591375
13601376 [ADJUtil launchSynchronisedWithObject: [ADJActivityState class ]
13611377 block: ^{
@@ -1399,6 +1415,10 @@ - (BOOL)trackThirdPartySharingI:(ADJActivityHandler *)selfI
13991415 if (selfI.activityState .isGdprForgotten ) {
14001416 return NO ;
14011417 }
1418+ if (selfI.adjustConfig .coppaCompliantEnabled ) {
1419+ [selfI.logger warn: @" Calling third party sharing API not allowed when COPPA enabled" ];
1420+ return NO ;
1421+ }
14021422
14031423 double now = [NSDate .date timeIntervalSince1970 ];
14041424
@@ -1497,6 +1517,23 @@ - (void)trackAdRevenueI:(ADJActivityHandler *)selfI
14971517 }
14981518}
14991519
1520+ - (void )checkForNewAttStatusI : (ADJActivityHandler *)selfI {
1521+ if (!selfI.activityState ) {
1522+ return ;
1523+ }
1524+ if (![selfI isEnabledI: selfI]) {
1525+ return ;
1526+ }
1527+ if (selfI.activityState .isGdprForgotten ) {
1528+ return ;
1529+ }
1530+ if (!selfI.trackingStatusManager ) {
1531+ return ;
1532+ }
1533+
1534+ [selfI.trackingStatusManager checkForNewAttStatus ];
1535+ }
1536+
15001537- (void )launchEventResponseTasksI : (ADJActivityHandler *)selfI
15011538 eventResponseData : (ADJEventResponseData *)eventResponseData {
15021539 [selfI updateAdidI: selfI adid: eventResponseData.adid];
@@ -1709,29 +1746,18 @@ - (void)setEnabledI:(ADJActivityHandler *)selfI enabled:(BOOL)enabled {
17091746
17101747 // Check if upon enabling install has been tracked.
17111748 if (enabled) {
1712- if (![ADJUserDefaults getInstallTracked ]) {
1713- double now = [NSDate .date timeIntervalSince1970 ];
1714- [self trackNewSessionI: now withActivityHandler: selfI];
1715- }
1716- NSData *deviceToken = [ADJUserDefaults getPushTokenData ];
1717- if (deviceToken != nil && ![selfI.activityState.deviceToken isEqualToString: [ADJUtil convertDeviceToken: deviceToken]]) {
1718- [self setDeviceToken: deviceToken];
1719- }
1720- NSString *pushToken = [ADJUserDefaults getPushTokenString ];
1721- if (pushToken != nil && ![selfI.activityState.deviceToken isEqualToString: pushToken]) {
1722- [self setPushToken: pushToken];
1723- }
17241749 if ([ADJUserDefaults getGdprForgetMe ]) {
17251750 [selfI setGdprForgetMe ];
17261751 } else {
1752+ [selfI processCoppaComplianceI: selfI];
17271753 if ([ADJUserDefaults getDisableThirdPartySharing ]) {
17281754 [selfI disableThirdPartySharing ];
17291755 }
17301756 if (selfI.savedPreLaunch .preLaunchAdjustThirdPartySharingArray != nil ) {
17311757 for (ADJThirdPartySharing *thirdPartySharing
17321758 in selfI.savedPreLaunch .preLaunchAdjustThirdPartySharingArray )
17331759 {
1734- [selfI trackThirdPartySharing : thirdPartySharing];
1760+ [selfI trackThirdPartySharingI: selfI thirdPartySharing : thirdPartySharing];
17351761 }
17361762
17371763 selfI.savedPreLaunch .preLaunchAdjustThirdPartySharingArray = nil ;
@@ -1745,6 +1771,19 @@ - (void)setEnabledI:(ADJActivityHandler *)selfI enabled:(BOOL)enabled {
17451771 }
17461772
17471773 }
1774+
1775+ if (![ADJUserDefaults getInstallTracked ]) {
1776+ double now = [NSDate .date timeIntervalSince1970 ];
1777+ [self trackNewSessionI: now withActivityHandler: selfI];
1778+ }
1779+ NSData *deviceToken = [ADJUserDefaults getPushTokenData ];
1780+ if (deviceToken != nil && ![selfI.activityState.deviceToken isEqualToString: [ADJUtil convertDeviceToken: deviceToken]]) {
1781+ [self setDeviceToken: deviceToken];
1782+ }
1783+ NSString *pushToken = [ADJUserDefaults getPushTokenString ];
1784+ if (pushToken != nil && ![selfI.activityState.deviceToken isEqualToString: pushToken]) {
1785+ [self setPushToken: pushToken];
1786+ }
17481787 if (selfI.adjustConfig .allowiAdInfoReading == YES ) {
17491788 [selfI checkForiAdI: selfI];
17501789 }
@@ -2791,6 +2830,78 @@ - (void)updateAttStatusFromUserCallback:(int)newAttStatusFromUser {
27912830 [self .trackingStatusManager updateAttStatusFromUserCallback: newAttStatusFromUser];
27922831}
27932832
2833+ - (void )processCoppaComplianceI : (ADJActivityHandler *)selfI {
2834+ if (!selfI.adjustConfig .coppaCompliantEnabled ) {
2835+ [self resetThirdPartySharingCoppaActivityStateI: selfI];
2836+ return ;
2837+ }
2838+
2839+ [self disableThirdPartySharingForCoppaEnabledI: selfI];
2840+ }
2841+
2842+ - (void )disableThirdPartySharingForCoppaEnabledI : (ADJActivityHandler *)selfI {
2843+ if (![selfI shouldDisableThirdPartySharingWhenCoppaEnabled: selfI]) {
2844+ return ;
2845+ }
2846+
2847+ [ADJUtil launchSynchronisedWithObject: [ADJActivityState class ]
2848+ block: ^{
2849+ selfI.activityState .isThirdPartySharingDisabledForCoppa = YES ;
2850+ }];
2851+ [selfI writeActivityStateI: selfI];
2852+
2853+ ADJThirdPartySharing *thirdPartySharing = [[ADJThirdPartySharing alloc ] initWithIsEnabledNumberBool: [NSNumber numberWithBool: NO ]];
2854+
2855+ double now = [NSDate .date timeIntervalSince1970 ];
2856+
2857+ // build package
2858+ ADJPackageBuilder *tpsBuilder = [[ADJPackageBuilder alloc ]
2859+ initWithPackageParams: selfI.packageParams
2860+ activityState: selfI.activityState
2861+ config: selfI.adjustConfig
2862+ sessionParameters: selfI.sessionParameters
2863+ trackingStatusManager: self .trackingStatusManager
2864+ createdAt: now];
2865+
2866+ ADJActivityPackage *dtpsPackage = [tpsBuilder buildThirdPartySharingPackage: thirdPartySharing];
2867+
2868+ [selfI.packageHandler addPackage: dtpsPackage];
2869+
2870+ if (selfI.adjustConfig .eventBufferingEnabled ) {
2871+ [selfI.logger info: @" Buffered event %@ " , dtpsPackage.suffix];
2872+ } else {
2873+ [selfI.packageHandler sendFirstPackage ];
2874+ }
2875+ }
2876+
2877+ - (void )resetThirdPartySharingCoppaActivityStateI : (ADJActivityHandler *)selfI {
2878+ if (selfI.activityState == nil ) {
2879+ return ;
2880+ }
2881+
2882+ if (selfI.activityState .isThirdPartySharingDisabledForCoppa ) {
2883+ [ADJUtil launchSynchronisedWithObject: [ADJActivityState class ]
2884+ block: ^{
2885+ selfI.activityState .isThirdPartySharingDisabledForCoppa = NO ;
2886+ }];
2887+ [selfI writeActivityStateI: selfI];
2888+ }
2889+ }
2890+
2891+ - (BOOL )shouldDisableThirdPartySharingWhenCoppaEnabled : (ADJActivityHandler *)selfI {
2892+ if (selfI.activityState == nil ) {
2893+ return NO ;
2894+ }
2895+ if (![selfI isEnabledI: selfI]) {
2896+ return NO ;
2897+ }
2898+ if (selfI.activityState .isGdprForgotten ) {
2899+ return NO ;
2900+ }
2901+
2902+ return !selfI.activityState .isThirdPartySharingDisabledForCoppa ;
2903+ }
2904+
27942905@end
27952906
27962907@interface ADJTrackingStatusManager ()
@@ -2864,4 +2975,5 @@ - (BOOL)updateAttStatus:(int)readAttStatus {
28642975
28652976 return YES ;
28662977}
2978+
28672979@end
0 commit comments