Skip to content

Commit 3796f9d

Browse files
authored
Merge branch 'staging' into 2543
2 parents 61ca513 + 0010a1b commit 3796f9d

18 files changed

+431
-153
lines changed

CHANGELOG.md

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,10 @@
11
## 25.4.3
2-
* Mitigated an ANR that occurred when the back button was pressed on the content activity.
2+
* Improved Health Check metric information.
3+
* Improved Content display mechanics.
4+
5+
* Mitigated an issue that could have happened when navigating back from a Content.
6+
* Mitigated a persistency issue with configuration provided SBS and its initial state.
7+
* Mitigated an issue where SBS could have been fetched twice.
38

49
## 25.4.2
510
* Mitigated an issue where latest fetched behavior settings were replacing the current settings instead of merging.

sdk/src/androidTest/java/ly/count/android/sdk/BreadcrumbHelperTests.java

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@ public void addBreadcrumb() {
2929
@Test(expected = AssertionError.class)
3030
public void addBreadcrumb_emptyString() {
3131
BreadcrumbHelper breadcrumbHelper = new BreadcrumbHelper(5, new ModuleLog());
32-
breadcrumbHelper.addBreadcrumb("", 10);
32+
breadcrumbHelper.addBreadcrumb("", 10, 5);
3333
}
3434

3535
/**
@@ -39,7 +39,7 @@ public void addBreadcrumb_emptyString() {
3939
@Test(expected = AssertionError.class)
4040
public void addBreadcrumb_null() {
4141
BreadcrumbHelper breadcrumbHelper = new BreadcrumbHelper(5, new ModuleLog());
42-
breadcrumbHelper.addBreadcrumb(null, 10);
42+
breadcrumbHelper.addBreadcrumb(null, 10, 5);
4343
}
4444

4545
/**
@@ -49,7 +49,7 @@ public void addBreadcrumb_null() {
4949
@Test
5050
public void addBreadcrumb_exceedsCharacterLimit() {
5151
BreadcrumbHelper breadcrumbHelper = new BreadcrumbHelper(5, new ModuleLog());
52-
breadcrumbHelper.addBreadcrumb("Test", 2);
52+
breadcrumbHelper.addBreadcrumb("Test", 2, 5);
5353
Assert.assertEquals(list("Te"), breadcrumbHelper.getBreadcrumbs());
5454
}
5555

@@ -60,11 +60,11 @@ public void addBreadcrumb_exceedsCharacterLimit() {
6060
@Test
6161
public void addBreadcrumb_exceedsLimit() {
6262
BreadcrumbHelper breadcrumbHelper = new BreadcrumbHelper(2, new ModuleLog());
63-
breadcrumbHelper.addBreadcrumb("Test", 3);
63+
breadcrumbHelper.addBreadcrumb("Test", 3, 2);
6464
Assert.assertEquals(list("Tes"), breadcrumbHelper.getBreadcrumbs());
65-
breadcrumbHelper.addBreadcrumb("Doggy", 3);
65+
breadcrumbHelper.addBreadcrumb("Doggy", 3, 2);
6666
Assert.assertEquals(list("Tes", "Dog"), breadcrumbHelper.getBreadcrumbs());
67-
breadcrumbHelper.addBreadcrumb("Geralt", 3);
67+
breadcrumbHelper.addBreadcrumb("Geralt", 3, 2);
6868
Assert.assertEquals(list("Dog", "Ger"), breadcrumbHelper.getBreadcrumbs());
6969
}
7070

sdk/src/androidTest/java/ly/count/android/sdk/ModuleConfigurationTests.java

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1089,6 +1089,10 @@ public void doWork(String requestData, String customEndpoint, ConnectionProcesso
10891089
}
10901090
};
10911091
}
1092+
1093+
@Override public ImmediateRequestI CreatePreflightRequestMaker() {
1094+
return null;
1095+
}
10921096
};
10931097
}
10941098

@@ -1162,6 +1166,10 @@ private int[] setupTest_allFeatures(JSONObject serverConfig) {
11621166
}
11631167
};
11641168
}
1169+
1170+
@Override public ImmediateRequestI CreatePreflightRequestMaker() {
1171+
return null;
1172+
}
11651173
};
11661174
countlyConfig.metricProviderOverride = new MockedMetricProvider();
11671175
Countly.sharedInstance().init(countlyConfig);

sdk/src/main/java/ly/count/android/sdk/BreadcrumbHelper.java

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -7,19 +7,17 @@
77
public class BreadcrumbHelper {
88

99
private final @NonNull LinkedList<String> logs = new LinkedList<>();
10-
private final int maxBreadcrumbs;
1110

1211
private final @NonNull ModuleLog L;
1312

1413
protected BreadcrumbHelper(int maxBreadcrumbs, @NonNull ModuleLog L) {
1514
assert maxBreadcrumbs > 0;
1615
assert L != null;
1716

18-
this.maxBreadcrumbs = maxBreadcrumbs;
1917
this.L = L;
2018
}
2119

22-
protected void addBreadcrumb(@NonNull String breadcrumb, int valueSize) {
20+
protected void addBreadcrumb(@NonNull String breadcrumb, int valueSize, int maxBreadcrumbs) {
2321
assert breadcrumb != null;
2422
assert !breadcrumb.isEmpty();
2523
assert valueSize > 0;
Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
package ly.count.android.sdk;
2+
3+
interface ConfigurationValueValidator<T> {
4+
5+
Boolean validate(T value);
6+
}

sdk/src/main/java/ly/count/android/sdk/ConnectionProcessor.java

Lines changed: 58 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -247,6 +247,63 @@ private enum RequestResult {
247247
return conn;
248248
}
249249

250+
synchronized public @NonNull URLConnection urlConnectionForPreflightRequest(@NonNull String preflightData) throws IOException {
251+
long approxSize = preflightData.length();
252+
URL url = new URL(preflightData);
253+
254+
long tOpen = pcc != null ? UtilsTime.getNanoTime() : 0;
255+
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
256+
257+
if (conn instanceof HttpsURLConnection && (Countly.publicKeyPinCertificates != null || Countly.certificatePinCertificates != null)) {
258+
((HttpsURLConnection) conn).setSSLSocketFactory(sslContext_.getSocketFactory());
259+
}
260+
261+
if (pcc != null) {
262+
pcc.TrackCounterTimeNs("ConnectionProcessorUrlConnectionForPreflightRequest_01_OpenURLConnection", UtilsTime.getNanoTime() - tOpen);
263+
tOpen = UtilsTime.getNanoTime();
264+
}
265+
266+
conn.setRequestMethod("HEAD");
267+
conn.setConnectTimeout(CONNECT_TIMEOUT_IN_MILLISECONDS);
268+
conn.setReadTimeout(READ_TIMEOUT_IN_MILLISECONDS);
269+
conn.setUseCaches(false);
270+
conn.setDoInput(true);
271+
conn.setDoOutput(false);
272+
conn.setInstanceFollowRedirects(true);
273+
274+
if (requestHeaderCustomValues_ != null) {
275+
L.v("[ConnectionProcessor] Adding [" + requestHeaderCustomValues_.size() + "] custom header fields");
276+
for (Map.Entry<String, String> e : requestHeaderCustomValues_.entrySet()) {
277+
if (e.getKey() != null && e.getValue() != null && !e.getKey().isEmpty()) {
278+
conn.addRequestProperty(e.getKey(), e.getValue());
279+
}
280+
}
281+
}
282+
283+
if (pcc != null) {
284+
pcc.TrackCounterTimeNs("ConnectionProcessorUrlConnectionForPreflightRequest_02_ConfigureConnection", UtilsTime.getNanoTime() - tOpen);
285+
tOpen = UtilsTime.getNanoTime();
286+
}
287+
288+
try {
289+
for (int i = 0; ; i++) {
290+
String key = conn.getHeaderFieldKey(i);
291+
if (key == null) break;
292+
String value = conn.getHeaderField(i);
293+
approxSize += key.getBytes(StandardCharsets.US_ASCII).length + value.getBytes(StandardCharsets.US_ASCII).length + 2L;
294+
}
295+
} catch (Exception e) {
296+
L.e("[ConnectionProcessor] urlConnectionForPreflightRequest, exception while calculating header field size: " + e);
297+
}
298+
299+
if (pcc != null) {
300+
pcc.TrackCounterTimeNs("ConnectionProcessorUrlConnectionForPreflightRequest_03_HeaderFieldSize", UtilsTime.getNanoTime() - tOpen);
301+
}
302+
303+
L.v("[ConnectionProcessor] urlConnectionForPreflightRequest, Approx data size: [" + approxSize + " B]");
304+
return conn;
305+
}
306+
250307
/**
251308
* Return the size of the text multipart entry
252309
*
@@ -530,7 +587,7 @@ public void run() {
530587
// this one from the stored events collection
531588
storageProvider_.removeRequest(originalRequest);
532589

533-
if (configProvider_.getBOMEnabled() && backoff(setupServerRequestTime, storedRequestCount, requestData)) {
590+
if (configProvider_.getBOMEnabled() && backoff(setupServerRequestTime, storedRequestCount - 1, requestData)) {
534591
backoffCallback_.run();
535592
break;
536593
}

sdk/src/main/java/ly/count/android/sdk/Countly.java

Lines changed: 10 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -493,6 +493,10 @@ public synchronized Countly init(CountlyConfig config) {
493493
@Override public ImmediateRequestI CreateImmediateRequestMaker() {
494494
return (new ImmediateRequestMaker());
495495
}
496+
497+
@Override public ImmediateRequestI CreatePreflightRequestMaker() {
498+
return (new PreflightRequestMaker());
499+
}
496500
};
497501
}
498502

@@ -969,13 +973,15 @@ void onStartInternal(Activity activity) {
969973
}
970974

971975
++activityCount_;
972-
if (activityCount_ == 1 && !moduleSessions.manualSessionControlEnabled) {
976+
if (activityCount_ == 1) {
977+
// start the timer in the first activity
978+
moduleConfiguration.fetchIfTimeIsUpForFetchingServerConfig();
973979
//if we open the first activity
974980
//and we are not using manual session control,
975981
//begin a session
976-
977-
moduleSessions.beginSessionInternal();
978-
moduleConfiguration.fetchIfTimeIsUpForFetchingServerConfig();
982+
if (!moduleSessions.manualSessionControlEnabled) {
983+
moduleSessions.beginSessionInternal();
984+
}
979985
}
980986

981987
config_.deviceInfo.inForeground();

sdk/src/main/java/ly/count/android/sdk/CountlyWebViewClient.java

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,10 +10,13 @@
1010

1111
class CountlyWebViewClient extends WebViewClient {
1212
private final List<WebViewUrlListener> listeners;
13+
WebViewPageLoadedListener afterPageFinished;
14+
long pageLoadTime;
1315

1416
public CountlyWebViewClient() {
1517
super();
1618
this.listeners = new ArrayList<>();
19+
this.pageLoadTime = System.currentTimeMillis();
1720
}
1821

1922
@Override
@@ -38,6 +41,20 @@ public boolean shouldOverrideUrlLoading(WebView view, WebResourceRequest request
3841
return false;
3942
}
4043

44+
@Override
45+
public void onPageFinished(WebView view, String url) {
46+
Log.v(Countly.TAG, "[CountlyWebViewClient] onPageFinished, url: [" + url + "]");
47+
super.onPageFinished(view, url);
48+
if (afterPageFinished != null) {
49+
pageLoadTime = System.currentTimeMillis() - pageLoadTime;
50+
boolean timeOut = (pageLoadTime / 1000L) >= 60;
51+
Log.d(Countly.TAG, "[CountlyWebViewClient] onPageFinished, pageLoadTime: " + pageLoadTime + " ms");
52+
53+
afterPageFinished.onPageLoaded(timeOut);
54+
afterPageFinished = null;
55+
}
56+
}
57+
4158
public void registerWebViewUrlListener(WebViewUrlListener listener) {
4259
this.listeners.add(listener);
4360
}

sdk/src/main/java/ly/count/android/sdk/DeviceInfo.java

Lines changed: 0 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -674,32 +674,6 @@ String getMetrics(@NonNull final Context context, @Nullable final Map<String, St
674674
return result;
675675
}
676676

677-
@NonNull
678-
String getMetricsHealthCheck(@NonNull final Context context, @Nullable final Map<String, String> metricOverride) {
679-
Map<String, Object> metrics = new ConcurrentHashMap<>();
680-
681-
String appVersion = mp.getAppVersion(context);
682-
683-
if (metricOverride != null) {
684-
if (metricOverride.containsKey("_app_version")) {
685-
appVersion = metricOverride.get("_app_version");
686-
}
687-
}
688-
689-
metrics.put("_app_version", appVersion);
690-
691-
String result = new JSONObject(metrics).toString();
692-
693-
try {
694-
result = java.net.URLEncoder.encode(result, "UTF-8");
695-
} catch (UnsupportedEncodingException ex) {
696-
// should never happen because Android guarantees UTF-8 support
697-
Countly.sharedInstance().L.e("[getMetrics] encode failed, [" + ex + "]");
698-
}
699-
700-
return result;
701-
}
702-
703677
/**
704678
* Returns a JSON object containing the device crash report
705679
*/

sdk/src/main/java/ly/count/android/sdk/ImmediateRequestGenerator.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,4 +2,6 @@
22

33
interface ImmediateRequestGenerator {
44
ImmediateRequestI CreateImmediateRequestMaker();
5+
6+
ImmediateRequestI CreatePreflightRequestMaker();
57
}

0 commit comments

Comments
 (0)