@@ -142,6 +142,7 @@ public class InternalState {
142
142
boolean firstLaunch ;
143
143
boolean sessionResponseProcessed ;
144
144
boolean firstSdkStart ;
145
+ boolean preinstallHasBeenRead ;
145
146
146
147
public boolean isEnabled () {
147
148
return enabled ;
@@ -198,6 +199,10 @@ public boolean hasFirstSdkStartOcurred() {
198
199
public boolean hasFirstSdkStartNotOcurred () {
199
200
return !firstSdkStart ;
200
201
}
202
+
203
+ public boolean hasPreinstallBeenRead () {
204
+ return preinstallHasBeenRead ;
205
+ }
201
206
}
202
207
203
208
private ActivityHandler (AdjustConfig adjustConfig ) {
@@ -225,6 +230,8 @@ private ActivityHandler(AdjustConfig adjustConfig) {
225
230
internalState .sessionResponseProcessed = false ;
226
231
// does not have first start by default
227
232
internalState .firstSdkStart = false ;
233
+ // preinstall has not been read by default
234
+ internalState .preinstallHasBeenRead = false ;
228
235
229
236
executor .submit (new Runnable () {
230
237
@ Override
@@ -866,6 +873,127 @@ public void onInstallReferrerRead(ReferrerDetails referrerDetails) {
866
873
sendReftagReferrerI ();
867
874
}
868
875
876
+ private void checkForPreinstallI () {
877
+ if (activityState == null ) return ;
878
+ if (!activityState .enabled ) return ;
879
+ if (activityState .isGdprForgotten ) return ;
880
+ if (!adjustConfig .preinstallTrackingEnabled ) return ;
881
+ if (internalState .hasPreinstallBeenRead ()) return ;
882
+
883
+ executor .submit (new Runnable () {
884
+ @ Override
885
+ public void run () {
886
+ if (deviceInfo .packageName == null || deviceInfo .packageName .isEmpty ()) {
887
+ logger .debug ("Can't read preinstall payload, invalid package name" );
888
+ return ;
889
+ }
890
+
891
+ SharedPreferencesManager sharedPreferencesManager = new SharedPreferencesManager (getContext ());
892
+ long readStatus = sharedPreferencesManager .getPreinstallPayloadReadStatus ();
893
+
894
+ if (PreinstallUtil .hasAllLocationsBeenRead (readStatus )) {
895
+ internalState .preinstallHasBeenRead = true ;
896
+ return ;
897
+ }
898
+
899
+ // 1. try reading preinstall payload from standard system property
900
+ if (PreinstallUtil .hasNotBeenRead (Constants .SYSTEM_PROPERTIES , readStatus )) {
901
+ String payloadSystemProperty = PreinstallUtil .getPayloadFromSystemProperty (
902
+ deviceInfo .packageName , logger );
903
+
904
+ if (payloadSystemProperty != null && !payloadSystemProperty .isEmpty ()) {
905
+ sdkClickHandler .sendPreinstallPayload (payloadSystemProperty , Constants .SYSTEM_PROPERTIES );
906
+ } else {
907
+ readStatus = PreinstallUtil .markAsRead (Constants .SYSTEM_PROPERTIES , readStatus );
908
+ }
909
+ }
910
+
911
+ // 2. try reading preinstall payload from system property using reflection
912
+ if (PreinstallUtil .hasNotBeenRead (Constants .SYSTEM_PROPERTIES_REFLECTION , readStatus )) {
913
+ String payloadSystemPropertyReflection = PreinstallUtil .getPayloadFromSystemPropertyReflection (
914
+ deviceInfo .packageName , logger );
915
+
916
+ if (payloadSystemPropertyReflection != null && !payloadSystemPropertyReflection .isEmpty ()) {
917
+ sdkClickHandler .sendPreinstallPayload (payloadSystemPropertyReflection , Constants .SYSTEM_PROPERTIES_REFLECTION );
918
+ } else {
919
+ readStatus = PreinstallUtil .markAsRead (Constants .SYSTEM_PROPERTIES_REFLECTION , readStatus );
920
+ }
921
+ }
922
+
923
+ // 3. try reading preinstall payload from system property file path
924
+ if (PreinstallUtil .hasNotBeenRead (Constants .SYSTEM_PROPERTIES_PATH , readStatus )) {
925
+ String payloadSystemPropertyFilePath = PreinstallUtil .getPayloadFromSystemPropertyFilePath (
926
+ deviceInfo .packageName , logger );
927
+
928
+ if (payloadSystemPropertyFilePath != null && !payloadSystemPropertyFilePath .isEmpty ()) {
929
+ sdkClickHandler .sendPreinstallPayload (payloadSystemPropertyFilePath , Constants .SYSTEM_PROPERTIES_PATH );
930
+ } else {
931
+ readStatus = PreinstallUtil .markAsRead (Constants .SYSTEM_PROPERTIES_PATH , readStatus );
932
+ }
933
+ }
934
+
935
+ // 4. try reading preinstall payload from system property file path using reflection
936
+ if (PreinstallUtil .hasNotBeenRead (Constants .SYSTEM_PROPERTIES_PATH_REFLECTION , readStatus )) {
937
+ String payloadSystemPropertyFilePathReflection = PreinstallUtil .getPayloadFromSystemPropertyFilePathReflection (
938
+ deviceInfo .packageName , logger );
939
+
940
+ if (payloadSystemPropertyFilePathReflection != null && !payloadSystemPropertyFilePathReflection .isEmpty ()) {
941
+ sdkClickHandler .sendPreinstallPayload (payloadSystemPropertyFilePathReflection , Constants .SYSTEM_PROPERTIES_PATH_REFLECTION );
942
+ } else {
943
+ readStatus = PreinstallUtil .markAsRead (Constants .SYSTEM_PROPERTIES_PATH_REFLECTION , readStatus );
944
+ }
945
+ }
946
+
947
+ // 5. try reading preinstall payload from default content uri
948
+ if (PreinstallUtil .hasNotBeenRead (Constants .CONTENT_PROVIDER , readStatus )) {
949
+ String payloadContentProviderDefault = PreinstallUtil .getPayloadFromContentProviderDefault (
950
+ adjustConfig .context ,
951
+ deviceInfo .packageName ,
952
+ logger );
953
+
954
+ if (payloadContentProviderDefault != null && !payloadContentProviderDefault .isEmpty ()) {
955
+ sdkClickHandler .sendPreinstallPayload (payloadContentProviderDefault , Constants .CONTENT_PROVIDER );
956
+ } else {
957
+ readStatus = PreinstallUtil .markAsRead (Constants .CONTENT_PROVIDER , readStatus );
958
+ }
959
+ }
960
+
961
+ // 6. try reading preinstall payload from all content provider with intent action
962
+ if (PreinstallUtil .hasNotBeenRead (Constants .CONTENT_PROVIDER_INTENT_ACTION , readStatus )) {
963
+ List <String > payloadListContentProviderIntentAction = PreinstallUtil .getPayloadsFromContentProviderIntentAction (
964
+ adjustConfig .context ,
965
+ deviceInfo .packageName ,
966
+ logger );
967
+
968
+ if (payloadListContentProviderIntentAction != null && !payloadListContentProviderIntentAction .isEmpty ()) {
969
+ for (String payload : payloadListContentProviderIntentAction ) {
970
+ sdkClickHandler .sendPreinstallPayload (payload , Constants .CONTENT_PROVIDER_INTENT_ACTION );
971
+ }
972
+ } else {
973
+ readStatus = PreinstallUtil .markAsRead (Constants .CONTENT_PROVIDER_INTENT_ACTION , readStatus );
974
+ }
975
+ }
976
+
977
+ // 7. try reading preinstall payload from file system (world readable)
978
+ if (PreinstallUtil .hasNotBeenRead (Constants .FILE_SYSTEM , readStatus )) {
979
+ String payloadFileSystem = PreinstallUtil .getPayloadFromFileSystem (
980
+ deviceInfo .packageName ,
981
+ logger );
982
+
983
+ if (payloadFileSystem != null && !payloadFileSystem .isEmpty ()) {
984
+ sdkClickHandler .sendPreinstallPayload (payloadFileSystem , Constants .FILE_SYSTEM );
985
+ } else {
986
+ readStatus = PreinstallUtil .markAsRead (Constants .FILE_SYSTEM , readStatus );
987
+ }
988
+ }
989
+
990
+ sharedPreferencesManager .setPreinstallPayloadReadStatus (readStatus );
991
+
992
+ internalState .preinstallHasBeenRead = true ;
993
+ }
994
+ });
995
+ }
996
+
869
997
private void readConfigFile (Context context ) {
870
998
Properties properties ;
871
999
@@ -1410,6 +1538,8 @@ private void checkAfterNewStartI(SharedPreferencesManager sharedPreferencesManag
1410
1538
sendReftagReferrer ();
1411
1539
}
1412
1540
1541
+ checkForPreinstallI ();
1542
+
1413
1543
// try to read and send the install referrer
1414
1544
installReferrer .startConnection ();
1415
1545
installReferrerHuawei .readReferrer ();
0 commit comments