Skip to content

Commit ed52d6e

Browse files
nonelseuerceg
authored andcommitted
Add all commits from preinstallinfo_file_reader
1 parent 0ac1a82 commit ed52d6e

File tree

12 files changed

+562
-1
lines changed

12 files changed

+562
-1
lines changed

Adjust/example-app-java/src/main/AndroidManifest.xml

+3
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,9 @@
77
<!-- Use ONLY IF you are using plugin-imei and if your app is NOT DISTRIBUTED in Play Store -->
88
<uses-permission android:name="android.permission.READ_PHONE_STATE" />
99

10+
<!-- Use ONLY IF you are supporting preinstall tracker via content provider -->
11+
<uses-permission android:name="com.adjust.preinstall.READ_PERMISSION"/>
12+
1013
<application
1114
android:name=".GlobalApplication"
1215
android:allowBackup="true"

Adjust/example-app-java/src/main/java/com/adjust/examples/GlobalApplication.java

+3
Original file line numberDiff line numberDiff line change
@@ -109,6 +109,9 @@ public boolean launchReceivedDeeplink(Uri deeplink) {
109109
// Delay first session.
110110
// config.setDelayStart(7);
111111

112+
// Allow tracking preinstall
113+
// config.setPreinstallTrackingEnabled(true);
114+
112115
// Add session callback parameters.
113116
Adjust.addSessionCallbackParameter("sc_foo", "sc_bar");
114117
Adjust.addSessionCallbackParameter("sc_key", "sc_value");

Adjust/sdk-core/src/main/java/com/adjust/sdk/ActivityHandler.java

+130
Original file line numberDiff line numberDiff line change
@@ -142,6 +142,7 @@ public class InternalState {
142142
boolean firstLaunch;
143143
boolean sessionResponseProcessed;
144144
boolean firstSdkStart;
145+
boolean preinstallHasBeenRead;
145146

146147
public boolean isEnabled() {
147148
return enabled;
@@ -198,6 +199,10 @@ public boolean hasFirstSdkStartOcurred() {
198199
public boolean hasFirstSdkStartNotOcurred() {
199200
return !firstSdkStart;
200201
}
202+
203+
public boolean hasPreinstallBeenRead() {
204+
return preinstallHasBeenRead;
205+
}
201206
}
202207

203208
private ActivityHandler(AdjustConfig adjustConfig) {
@@ -225,6 +230,8 @@ private ActivityHandler(AdjustConfig adjustConfig) {
225230
internalState.sessionResponseProcessed = false;
226231
// does not have first start by default
227232
internalState.firstSdkStart = false;
233+
// preinstall has not been read by default
234+
internalState.preinstallHasBeenRead = false;
228235

229236
executor.submit(new Runnable() {
230237
@Override
@@ -866,6 +873,127 @@ public void onInstallReferrerRead(ReferrerDetails referrerDetails) {
866873
sendReftagReferrerI();
867874
}
868875

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+
869997
private void readConfigFile(Context context) {
870998
Properties properties;
871999

@@ -1410,6 +1538,8 @@ private void checkAfterNewStartI(SharedPreferencesManager sharedPreferencesManag
14101538
sendReftagReferrer();
14111539
}
14121540

1541+
checkForPreinstallI();
1542+
14131543
// try to read and send the install referrer
14141544
installReferrer.startConnection();
14151545
installReferrerHuawei.readReferrer();

Adjust/sdk-core/src/main/java/com/adjust/sdk/AdjustConfig.java

+6
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,7 @@ public class AdjustConfig {
3737
String secretId;
3838
String appSecret;
3939
String externalDeviceId;
40+
boolean preinstallTrackingEnabled;
4041

4142
public static final String ENVIRONMENT_SANDBOX = "sandbox";
4243
public static final String ENVIRONMENT_PRODUCTION = "production";
@@ -90,6 +91,7 @@ private void init(Context context, String appToken, String environment, boolean
9091
// default values
9192
this.eventBufferingEnabled = false;
9293
this.sendInBackground = false;
94+
this.preinstallTrackingEnabled = false;
9395
}
9496

9597
public void setEventBufferingEnabled(Boolean eventBufferingEnabled) {
@@ -172,6 +174,10 @@ public void setExternalDeviceId(String externalDeviceId) {
172174
this.externalDeviceId = externalDeviceId;
173175
}
174176

177+
public void setPreinstallTrackingEnabled(boolean preinstallTrackingEnabled) {
178+
this.preinstallTrackingEnabled = preinstallTrackingEnabled;
179+
}
180+
175181
public boolean isValid() {
176182
if (!checkAppToken(appToken)) return false;
177183
if (!checkEnvironment(environment)) return false;

Adjust/sdk-core/src/main/java/com/adjust/sdk/Constants.java

+16
Original file line numberDiff line numberDiff line change
@@ -68,4 +68,20 @@ public interface Constants {
6868
int MAX_INSTALL_REFERRER_RETRIES = 2;
6969

7070
String FB_AUTH_REGEX = "^(fb|vk)[0-9]{5,}[^:]*://authorize.*access_token=.*";
71+
72+
String PREINSTALL = "preinstall";
73+
String SYSTEM_PROPERTIES = "system_properties";
74+
String SYSTEM_PROPERTIES_REFLECTION = "system_properties_reflection";
75+
String SYSTEM_PROPERTIES_PATH = "system_properties_path";
76+
String SYSTEM_PROPERTIES_PATH_REFLECTION = "system_properties_path_reflection";
77+
String CONTENT_PROVIDER = "content_provider";
78+
String CONTENT_PROVIDER_INTENT_ACTION = "content_provider_intent_action";
79+
String FILE_SYSTEM = "file_system";
80+
81+
String ADJUST_PREINSTALL_SYSTEM_PROPERTY_PREFIX = "adjust.preinstall.";
82+
String ADJUST_PREINSTALL_SYSTEM_PROPERTY_PATH = "adjust.preinstall.path";
83+
String ADJUST_PREINSTALL_CONTENT_URI_AUTHORITY = "com.adjust.preinstall";
84+
String ADJUST_PREINSTALL_CONTENT_URI_PATH = "trackers";
85+
String ADJUST_PREINSTALL_CONTENT_PROVIDER_INTENT_ACTION = "com.attribution.REFERRAL_PROVIDER";
86+
String ADJUST_PREINSTALL_FILE_SYSTEM_PATH = "/data/local/tmp/adjust.preinstall";
7187
}

Adjust/sdk-core/src/main/java/com/adjust/sdk/ISdkClickHandler.java

+5
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,11 @@ public interface ISdkClickHandler {
3838
*/
3939
void sendReftagReferrers();
4040

41+
/**
42+
* Send sdk_click package carrying preinstall info.
43+
*/
44+
void sendPreinstallPayload(String payload, String location);
45+
4146
/**
4247
* Teardown SdkClickHandler instance.
4348
*/

Adjust/sdk-core/src/main/java/com/adjust/sdk/PackageBuilder.java

+4
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,8 @@ public class PackageBuilder {
3636
String installVersion;
3737
String rawReferrer;
3838
String referrerApi;
39+
String preinstallPayload;
40+
String preinstallLocation;
3941
Boolean googlePlayInstant;
4042
AdjustAttribution attribution;
4143
Map<String, String> extraParameters;
@@ -536,6 +538,8 @@ private Map<String, String> getClickParameters(String source) {
536538
PackageBuilder.addLong(parameters, "subsession_count", activityStateCopy.subsessionCount);
537539
PackageBuilder.addDuration(parameters, "time_spent", activityStateCopy.timeSpent);
538540
PackageBuilder.addString(parameters, "updated_at", deviceInfo.appUpdateTime);
541+
PackageBuilder.addString(parameters, "payload", preinstallPayload);
542+
PackageBuilder.addString(parameters, "found_location", preinstallLocation);
539543

540544
checkDeviceIds(parameters);
541545
return parameters;

Adjust/sdk-core/src/main/java/com/adjust/sdk/PackageFactory.java

+27
Original file line numberDiff line numberDiff line change
@@ -142,6 +142,33 @@ public static ActivityPackage buildInstallReferrerSdkClickPackage(final Referrer
142142
return clickPackage;
143143
}
144144

145+
public static ActivityPackage buildPreinstallSdkClickPackage(final String preinstallPayload,
146+
final String preinstallLocation,
147+
final ActivityState activityState,
148+
final AdjustConfig adjustConfig,
149+
final DeviceInfo deviceInfo,
150+
final SessionParameters sessionParameters) {
151+
if (preinstallPayload == null || preinstallPayload.length() == 0) {
152+
return null;
153+
}
154+
155+
long now = System.currentTimeMillis();
156+
157+
PackageBuilder clickPackageBuilder = new PackageBuilder(
158+
adjustConfig,
159+
deviceInfo,
160+
activityState,
161+
sessionParameters,
162+
now);
163+
164+
clickPackageBuilder.preinstallPayload = preinstallPayload;
165+
clickPackageBuilder.preinstallLocation = preinstallLocation;
166+
167+
ActivityPackage clickPackage = clickPackageBuilder.buildClickPackage(Constants.PREINSTALL);
168+
169+
return clickPackage;
170+
}
171+
145172
private static PackageBuilder queryStringClickPackageBuilder(
146173
final List<UrlQuerySanitizer.ParameterValuePair> queryList,
147174
final ActivityState activityState,

0 commit comments

Comments
 (0)