Skip to content

Commit 2968228

Browse files
authored
Merge pull request #676 from CleverTap/develop
Release corev7.0.2
2 parents 4b1ea75 + 944f643 commit 2968228

38 files changed

+1396
-316
lines changed

CHANGELOG.md

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,8 @@
11
## CHANGE LOG.
22

3+
### October 10, 2024
4+
* [CleverTap Android SDK v7.0.2](docs/CTCORECHANGELOG.md)
5+
36
### September 2, 2024
47
* [CleverTap Android SDK v7.0.1](docs/CTCORECHANGELOG.md)
58

README.md

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -26,15 +26,15 @@ We publish the SDK to `mavenCentral` as an `AAR` file. Just declare it as depend
2626

2727
```groovy
2828
dependencies {
29-
implementation "com.clevertap.android:clevertap-android-sdk:7.0.1"
29+
implementation "com.clevertap.android:clevertap-android-sdk:7.0.2"
3030
}
3131
```
3232

3333
Alternatively, you can download and add the AAR file included in this repo in your Module libs directory and tell gradle to install it like this:
3434

3535
```groovy
3636
dependencies {
37-
implementation (name: "clevertap-android-sdk-7.0.1", ext: 'aar')
37+
implementation (name: "clevertap-android-sdk-7.0.2", ext: 'aar')
3838
}
3939
```
4040

@@ -46,7 +46,7 @@ Add the Firebase Messaging library and Android Support Library v4 as dependencie
4646

4747
```groovy
4848
dependencies {
49-
implementation "com.clevertap.android:clevertap-android-sdk:7.0.1"
49+
implementation "com.clevertap.android:clevertap-android-sdk:7.0.2"
5050
implementation "androidx.core:core:1.9.0"
5151
implementation "com.google.firebase:firebase-messaging:23.0.6"
5252
implementation "com.google.android.gms:play-services-ads:22.3.0" // Required only if you enable Google ADID collection in the SDK (turned off by default).

clevertap-core/src/main/java/com/clevertap/android/sdk/CTXtensions.kt

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,8 @@ import com.clevertap.android.sdk.task.CTExecutorFactory
1919
import org.json.JSONArray
2020
import org.json.JSONException
2121
import org.json.JSONObject
22+
import kotlin.contracts.ExperimentalContracts
23+
import kotlin.contracts.contract
2224

2325
fun Context.isPackageAndOsTargetsAbove(apiLevel: Int) =
2426
VERSION.SDK_INT > apiLevel && targetSdkVersion > apiLevel
@@ -299,3 +301,9 @@ fun String?.toJsonOrNull(): JSONObject? {
299301
}
300302
}
301303
}
304+
305+
@OptIn(ExperimentalContracts::class)
306+
fun String?.isNotNullAndBlank() : Boolean {
307+
contract { returns(true) implies (this@isNotNullAndBlank != null) }
308+
return isNullOrBlank().not()
309+
}

clevertap-core/src/main/java/com/clevertap/android/sdk/CleverTapAPI.java

Lines changed: 74 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,9 @@
4040
import com.clevertap.android.sdk.inapp.CTLocalInApp;
4141
import com.clevertap.android.sdk.inapp.callbacks.FetchInAppsCallback;
4242
import com.clevertap.android.sdk.inapp.customtemplates.CustomTemplateContext;
43+
import com.clevertap.android.sdk.inapp.customtemplates.FunctionPresenter;
44+
import com.clevertap.android.sdk.inapp.customtemplates.JsonTemplatesProducer;
45+
import com.clevertap.android.sdk.inapp.customtemplates.TemplatePresenter;
4346
import com.clevertap.android.sdk.inapp.customtemplates.TemplateProducer;
4447
import com.clevertap.android.sdk.inapp.customtemplates.TemplatesManager;
4548
import com.clevertap.android.sdk.inapp.data.CtCacheType;
@@ -56,7 +59,6 @@
5659
import com.clevertap.android.sdk.interfaces.NotificationRenderedListener;
5760
import com.clevertap.android.sdk.interfaces.OnInitCleverTapIDListener;
5861
import com.clevertap.android.sdk.interfaces.SCDomainListener;
59-
import com.clevertap.android.sdk.network.BaseNetworkManager;
6062
import com.clevertap.android.sdk.network.NetworkManager;
6163
import com.clevertap.android.sdk.product_config.CTProductConfigController;
6264
import com.clevertap.android.sdk.product_config.CTProductConfigListener;
@@ -205,7 +207,12 @@ public static void changeCredentials(String accountID, String token, String regi
205207
* @param spikyProxyDomain CleverTap Spiky Proxy Domain
206208
* @noinspection unused
207209
*/
208-
public static void changeCredentials(String accountID, String token, String proxyDomain, String spikyProxyDomain) {
210+
public static void changeCredentials(
211+
String accountID,
212+
String token,
213+
String proxyDomain,
214+
String spikyProxyDomain
215+
) {
209216
if (defaultConfig != null) {
210217
Logger.i("CleverTap SDK already initialized with accountID:" + defaultConfig.getAccountId()
211218
+ ", token:" + defaultConfig.getAccountToken() + ", proxyDomain: " + defaultConfig.getProxyDomain() +
@@ -218,6 +225,36 @@ public static void changeCredentials(String accountID, String token, String prox
218225
ManifestInfo.changeCredentials(accountID, token, proxyDomain, spikyProxyDomain);
219226
}
220227

228+
/**
229+
* This method is used to change the credentials of CleverTap account Id, token, proxyDomain, spikyProxyDomain programmatically
230+
*
231+
* @param accountID CleverTap Account Id
232+
* @param token CleverTap Account Token
233+
* @param proxyDomain CleverTap Proxy Domain
234+
* @param spikyProxyDomain CleverTap Spiky Proxy Domain
235+
* @param customHandshakeDomain Custom handshake Domain
236+
* @noinspection unused
237+
*/
238+
public static void changeCredentials(
239+
String accountID,
240+
String token,
241+
String proxyDomain,
242+
String spikyProxyDomain,
243+
String customHandshakeDomain
244+
) {
245+
if (defaultConfig != null) {
246+
Logger.i("CleverTap SDK already initialized with accountID:" + defaultConfig.getAccountId()
247+
+ ", token:" + defaultConfig.getAccountToken() + ", proxyDomain: " + defaultConfig.getProxyDomain() +
248+
", spikyDomain: " + defaultConfig.getSpikyProxyDomain() + ", handshakeDomain: " + defaultConfig.getCustomHandshakeDomain()
249+
+ ". Cannot change credentials to accountID: " + accountID +
250+
", token: " + token + ", proxyDomain: " + proxyDomain + ", spikyProxyDomain: " + spikyProxyDomain
251+
+ "and customHandshakeDomain: " + customHandshakeDomain);
252+
return;
253+
}
254+
255+
ManifestInfo.changeCredentials(accountID, token, proxyDomain, spikyProxyDomain, customHandshakeDomain);
256+
}
257+
221258
/**
222259
* Launches an asynchronous task to download the notification icon from CleverTap,
223260
* and create the Android notification.
@@ -1027,7 +1064,7 @@ public static void tokenRefresh(Context context, String token, PushType pushType
10271064
* {@link TemplateProducer}. See {@link com.clevertap.android.sdk.inapp.customtemplates.CustomTemplate.Builder
10281065
* CustomTemplate.Builder}. Templates must be registered before the {@link CleverTapAPI} instance, that would use
10291066
* them, is created. A common place for this initialization is in {@link Application#onCreate()}. If your
1030-
* application uses multiple {@link CleverTapAPI} instance, use the {@link CleverTapInstanceConfig} within the
1067+
* application uses multiple {@link CleverTapAPI} instances, use the {@link CleverTapInstanceConfig} within the
10311068
* TemplateProducer to differentiate which templates should be registered to which {@link CleverTapAPI}
10321069
* instances.This method can be called multiple times with different TemplateProducers, however all of the
10331070
* produced templates must have unique names.
@@ -1061,6 +1098,32 @@ public static synchronized void registerCustomInAppTemplates(TemplateProducer pr
10611098
TemplatesManager.register(producer);
10621099
}
10631100

1101+
/**
1102+
* Register {@link com.clevertap.android.sdk.inapp.customtemplates.CustomTemplate CustomTemplates} through a
1103+
* json definition. Templates must be registered before the {@link CleverTapAPI} instance, that would use
1104+
* them, is created. A common place for this initialization is in {@link Application#onCreate()}. If your
1105+
* application uses multiple {@link CleverTapAPI} instances, extend {@link JsonTemplatesProducer}
1106+
* with definitions for each instance and register using {@link #registerCustomInAppTemplates(TemplateProducer)}.
1107+
* Use the {@link CleverTapInstanceConfig} in {@link JsonTemplatesProducer#defineTemplates} to control
1108+
* for which instance the templates should be registered.
1109+
* </br>
1110+
* This method can be called multiple times with different json definitions and presenters,
1111+
* however all of the templates must have unique names.
1112+
*
1113+
* @param templatesJson A string with the json definitions of templates. See
1114+
* {@link JsonTemplatesProducer} for the json format.
1115+
* @param templatesPresenter A presenter for all templates in the json definitions.
1116+
* Required if there is at least one template with type "template".
1117+
* @param functionsPresenter A presenter for all functions in the json definitions.
1118+
* Required if there is at least one template with type "function".
1119+
*/
1120+
public static synchronized void registerCustomInAppTemplates
1121+
(@NonNull String templatesJson,
1122+
@Nullable TemplatePresenter templatesPresenter,
1123+
@Nullable FunctionPresenter functionsPresenter) {
1124+
TemplatesManager.register(new JsonTemplatesProducer(templatesJson, templatesPresenter, functionsPresenter));
1125+
}
1126+
10641127
/**
10651128
* Retrieve a {@link CustomTemplateContext} for a template that is currently displaying. If the provided template
10661129
* name is not of a currently active template this method returns <code>null</code>.
@@ -1104,7 +1167,7 @@ public void syncRegisteredInAppTemplates() {
11041167
}
11051168

11061169
TemplatesManager templatesManager = coreState.getTemplatesManager();
1107-
BaseNetworkManager networkManager = coreState.getNetworkManager();
1170+
NetworkManager networkManager = coreState.getNetworkManager();
11081171

11091172
getCleverTapID(x -> {
11101173
// getCleverTapID is executed on the main thread
@@ -1365,10 +1428,10 @@ public void flush() {
13651428
public void setSCDomainListener(SCDomainListener scDomainListener) {
13661429
coreState.getCallbackManager().setSCDomainListener(scDomainListener);
13671430

1368-
if(coreState.getNetworkManager() != null) {
1369-
NetworkManager networkManager = (NetworkManager) coreState.getNetworkManager();
1431+
if (coreState.getNetworkManager() != null) {
1432+
NetworkManager networkManager = coreState.getNetworkManager();
13701433
String domain = networkManager.getDomain(EventGroup.REGULAR);
1371-
if(domain != null) {
1434+
if (domain != null) {
13721435
scDomainListener.onSCDomainAvailable(getSCDomain(domain));
13731436
}
13741437
}
@@ -3039,6 +3102,7 @@ private static CleverTapInstanceConfig getDefaultConfig(Context context) {
30393102
String accountRegion = manifest.getAccountRegion();
30403103
String proxyDomain = manifest.getProxyDomain();
30413104
String spikyProxyDomain = manifest.getSpikeyProxyDomain();
3105+
String handshakeDomain = manifest.getHandshakeDomain();
30423106
if (accountId == null || accountToken == null) {
30433107
Logger.i(
30443108
"Account ID or Account token is missing from AndroidManifest.xml, unable to create default instance");
@@ -3055,6 +3119,9 @@ private static CleverTapInstanceConfig getDefaultConfig(Context context) {
30553119
if (spikyProxyDomain != null && !spikyProxyDomain.trim().isEmpty()) {
30563120
defaultInstanceConfig.setSpikyProxyDomain(spikyProxyDomain);
30573121
}
3122+
if (handshakeDomain != null && !handshakeDomain.trim().isEmpty()) {
3123+
defaultInstanceConfig.setCustomHandshakeDomain(handshakeDomain);
3124+
}
30583125
return defaultInstanceConfig;
30593126
}
30603127

clevertap-core/src/main/java/com/clevertap/android/sdk/CleverTapInstanceConfig.java

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,8 @@ public CleverTapInstanceConfig[] newArray(int size) {
4949

5050
private String spikyProxyDomain;
5151

52+
private String customHandshakeDomain;
53+
5254
@NonNull
5355
private ArrayList<String> allowedPushTypes = getAll();
5456

@@ -113,6 +115,7 @@ public static CleverTapInstanceConfig createInstance(Context context, @NonNull S
113115
this.accountRegion = config.accountRegion;
114116
this.proxyDomain = config.proxyDomain;
115117
this.spikyProxyDomain = config.spikyProxyDomain;
118+
this.customHandshakeDomain = config.customHandshakeDomain;
116119
this.isDefaultInstance = config.isDefaultInstance;
117120
this.analyticsOnly = config.analyticsOnly;
118121
this.personalization = config.personalization;
@@ -181,6 +184,9 @@ private CleverTapInstanceConfig(String jsonString) throws Throwable {
181184
if (configJsonObject.has(Constants.KEY_SPIKY_PROXY_DOMAIN)) {
182185
this.spikyProxyDomain = configJsonObject.getString(Constants.KEY_SPIKY_PROXY_DOMAIN);
183186
}
187+
if (configJsonObject.has(Constants.KEY_CUSTOM_HANDSHAKE_DOMAIN)) {
188+
this.customHandshakeDomain = configJsonObject.optString(Constants.KEY_CUSTOM_HANDSHAKE_DOMAIN, null);
189+
}
184190
if (configJsonObject.has(Constants.KEY_ACCOUNT_REGION)) {
185191
this.accountRegion = configJsonObject.getString(Constants.KEY_ACCOUNT_REGION);
186192
}
@@ -243,6 +249,7 @@ private CleverTapInstanceConfig(Parcel in) {
243249
accountRegion = in.readString();
244250
proxyDomain = in.readString();
245251
spikyProxyDomain = in.readString();
252+
customHandshakeDomain = in.readString();
246253
analyticsOnly = in.readByte() != 0x00;
247254
isDefaultInstance = in.readByte() != 0x00;
248255
useGoogleAdId = in.readByte() != 0x00;
@@ -313,6 +320,14 @@ public void setSpikyProxyDomain(String spikyProxyDomain) {
313320
this.spikyProxyDomain = spikyProxyDomain;
314321
}
315322

323+
public String getCustomHandshakeDomain() {
324+
return customHandshakeDomain;
325+
}
326+
327+
public void setCustomHandshakeDomain(String handshakeDomain) {
328+
this.customHandshakeDomain = handshakeDomain;
329+
}
330+
316331
@SuppressWarnings({"unused"})
317332
public void setDebugLevel(CleverTapAPI.LogLevel debugLevel) {
318333
setDebugLevel(debugLevel.intValue());
@@ -394,6 +409,7 @@ public void writeToParcel(Parcel dest, int flags) {
394409
dest.writeString(accountRegion);
395410
dest.writeString(proxyDomain);
396411
dest.writeString(spikyProxyDomain);
412+
dest.writeString(customHandshakeDomain);
397413
dest.writeByte((byte) (analyticsOnly ? 0x01 : 0x00));
398414
dest.writeByte((byte) (isDefaultInstance ? 0x01 : 0x00));
399415
dest.writeByte((byte) (useGoogleAdId ? 0x01 : 0x00));
@@ -474,6 +490,7 @@ String toJSONString() {
474490
configJsonObject.put(Constants.KEY_ACCOUNT_REGION, getAccountRegion());
475491
configJsonObject.put(Constants.KEY_PROXY_DOMAIN, getProxyDomain());
476492
configJsonObject.put(Constants.KEY_SPIKY_PROXY_DOMAIN, getSpikyProxyDomain());
493+
configJsonObject.put(Constants.KEY_CUSTOM_HANDSHAKE_DOMAIN, getCustomHandshakeDomain());
477494
configJsonObject.put(Constants.KEY_FCM_SENDER_ID, getFcmSenderId());
478495
configJsonObject.put(Constants.KEY_ANALYTICS_ONLY, isAnalyticsOnly());
479496
configJsonObject.put(Constants.KEY_DEFAULT_INSTANCE, isDefaultInstance());

clevertap-core/src/main/java/com/clevertap/android/sdk/CleverTapState.java

Lines changed: 0 additions & 31 deletions
This file was deleted.

clevertap-core/src/main/java/com/clevertap/android/sdk/Constants.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,7 @@ public interface Constants {
3232
String LABEL_REGION = "CLEVERTAP_REGION";
3333
String LABEL_PROXY_DOMAIN = "CLEVERTAP_PROXY_DOMAIN";
3434
String LABEL_SPIKY_PROXY_DOMAIN = "CLEVERTAP_SPIKY_PROXY_DOMAIN";
35+
String LABEL_CLEVERTAP_HANDSHAKE_DOMAIN = "CLEVERTAP_HANDSHAKE_DOMAIN";
3536
String LABEL_DISABLE_APP_LAUNCH = "CLEVERTAP_DISABLE_APP_LAUNCHED";
3637
String LABEL_SSL_PINNING = "CLEVERTAP_SSL_PINNING";
3738
String LABEL_BACKGROUND_SYNC = "CLEVERTAP_BACKGROUND_SYNC";
@@ -190,6 +191,7 @@ public interface Constants {
190191
String KEY_ACCOUNT_REGION = "accountRegion";
191192
String KEY_PROXY_DOMAIN = "proxyDomain";
192193
String KEY_SPIKY_PROXY_DOMAIN = "spikyProxyDomain";
194+
String KEY_CUSTOM_HANDSHAKE_DOMAIN = "customHandshakeDomain";
193195
String KEY_ANALYTICS_ONLY = "analyticsOnly";
194196
String KEY_DEFAULT_INSTANCE = "isDefaultInstance";
195197
String KEY_USE_GOOGLE_AD_ID = "useGoogleAdId";

0 commit comments

Comments
 (0)