Skip to content

Commit 120f8a4

Browse files
authored
Merge pull request #501 from Countly/manual_metrics
Manual metrics
2 parents b3f5c32 + 512bc26 commit 120f8a4

File tree

11 files changed

+60
-13
lines changed

11 files changed

+60
-13
lines changed

CHANGELOG.md

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,9 @@
11
## 25.4.4
22
* Improved disk size calculation in crash reports.
3-
* Added "setRequestTimeoutDuration(requestTimeoutDuration)" init config method configure request timeout in seconds.
3+
4+
* Added a new function "sendMetricsRequest(metricsOverride)" to send a device metrics request, accessible through the requestQueue interface.
5+
* Added a new Consent option "metrics" for controlling "sendMetricsRequest" method. (This has no effect on Session metrics.)
6+
* Added "setRequestTimeoutDuration(requestTimeoutDuration)" init config method to change request timeout duration in seconds.
47

58
* Rolled back Health Check metric information to previous state.
69
* Mitigated an issue displaying Content on API level 35 and above.

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -74,7 +74,7 @@ public void testGetDevice() {
7474
@Test
7575
public void testGetResolution() {
7676
final DisplayMetrics metrics = new DisplayMetrics();
77-
((WindowManager) TestUtils.getContext().getSystemService(Context.WINDOW_SERVICE)).getDefaultDisplay().getMetrics(metrics);
77+
((WindowManager) TestUtils.getContext().getSystemService(Context.WINDOW_SERVICE)).getDefaultDisplay().getRealMetrics(metrics);
7878
final String expected = metrics.widthPixels + "x" + metrics.heightPixels;
7979
assertEquals(expected, regularDeviceInfo.mp.getResolution(TestUtils.getContext()));
8080
}

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

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -212,7 +212,7 @@ public void consentEnabled_allFeatures() throws JSONException, InterruptedExcept
212212

213213
Assert.assertEquals(2, TestUtils.getCurrentRQ().length);
214214
Assert.assertEquals(0, countlyStore.getEventQueueSize());
215-
ModuleConsentTests.validateConsentRequest(TestUtils.commonDeviceId, 0, new boolean[] { false, false, false, false, false, false, false, false, false, false, false, false, false, false, false });
215+
ModuleConsentTests.validateConsentRequest(TestUtils.commonDeviceId, 0, new boolean[] { false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false });
216216
TestUtils.validateRequest(TestUtils.commonDeviceId, TestUtils.map("location", ""), 1);
217217

218218
flow_allFeatures();
@@ -959,7 +959,7 @@ public void scenario_consentRequiredDisabled() throws JSONException {
959959

960960
Countly.sharedInstance().attribution().recordDirectAttribution("_special_test", "_special_test");
961961
Assert.assertEquals(3, TestUtils.getCurrentRQ().length); // changes nothing because no consent for attribution
962-
ModuleConsentTests.validateConsentRequest(TestUtils.commonDeviceId, 1, new boolean[] { false, false, false, false, false, false, false, false, false, false, false, false, false, false, false });
962+
ModuleConsentTests.validateConsentRequest(TestUtils.commonDeviceId, 1, new boolean[] { false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false });
963963
TestUtils.validateRequest(TestUtils.commonDeviceId, TestUtils.map("location", ""), 2);
964964
}
965965

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

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,7 @@ public class ModuleConsentTests {
3232
Countly.CountlyFeatureNames.clicks,
3333
Countly.CountlyFeatureNames.scrolls,
3434
Countly.CountlyFeatureNames.content,
35+
Countly.CountlyFeatureNames.metrics,
3536
};
3637

3738
@Before
@@ -253,12 +254,12 @@ public void initTimeSetConsentRQ_4() throws JSONException {
253254
protected static void validateConsentRequest(String deviceId, int idx, boolean[] consents) {
254255
Map<String, Object> consentsMap =
255256
TestUtils.map("sessions", consents[0], "crashes", consents[1], "users", consents[2], "push", consents[3], "feedback", consents[4], "scrolls", consents[5], "remote-config", consents[6], "attribution", consents[7], "clicks", consents[8], "location", consents[9], "star-rating",
256-
consents[10], "events", consents[11], "views", consents[12], "apm", consents[13], "content", consents[14]);
257+
consents[10], "events", consents[11], "views", consents[12], "apm", consents[13], "content", consents[14], "metrics", consents[15]);
257258
TestUtils.validateRequest(deviceId, TestUtils.map("consent", consentsMap), idx);
258259
}
259260

260261
protected static void validateAllConsentRequest(String deviceId, int idx) {
261-
validateConsentRequest(deviceId, idx, new boolean[] { true, true, true, true, true, true, true, true, true, true, true, true, true, true, true });
262+
validateConsentRequest(deviceId, idx, new boolean[] { true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true });
262263
}
263264

264265
// TODO test that makes sure that the consent change request is created correctly

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

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1342,7 +1342,7 @@ public void clearFirstViewFlagSessionConsentRemoved() throws JSONException {
13421342
mCountly.views().startView("a", null);
13431343

13441344
// 0 is consent request
1345-
ModuleConsentTests.validateConsentRequest(TestUtils.commonDeviceId, 0, new boolean[] { false, false, false, false, false, false, false, false, false, false, false, false, true, false, false });
1345+
ModuleConsentTests.validateConsentRequest(TestUtils.commonDeviceId, 0, new boolean[] { false, false, false, false, false, false, false, false, false, false, false, false, true, false, false, false });
13461346
TestUtils.validateRequest(TestUtils.commonDeviceId, TestUtils.map("location", ""), 1);
13471347
// start false because session did not start
13481348
validateView("a", 0.0, 2, 3, false, true, null, vals[0], "");
@@ -1351,12 +1351,12 @@ public void clearFirstViewFlagSessionConsentRemoved() throws JSONException {
13511351
mCountly.consent().giveConsent(new String[] { Countly.CountlyFeatureNames.sessions });
13521352
mCountly.views().startView("b", null);
13531353

1354-
ModuleConsentTests.validateConsentRequest(TestUtils.commonDeviceId, 3, new boolean[] { true, false, false, false, false, false, false, false, false, false, false, false, true, false, false });
1354+
ModuleConsentTests.validateConsentRequest(TestUtils.commonDeviceId, 3, new boolean[] { true, false, false, false, false, false, false, false, false, false, false, false, true, false, false, false });
13551355
validateView("b", 0.0, 4, 5, false, true, null, vals[1], vals[0]);
13561356

13571357
//internal flag should be reset whens session consent is removed
13581358
mCountly.consent().removeConsent(new String[] { Countly.CountlyFeatureNames.sessions });
1359-
ModuleConsentTests.validateConsentRequest(TestUtils.commonDeviceId, 5, new boolean[] { false, false, false, false, false, false, false, false, false, false, false, false, true, false, false });
1359+
ModuleConsentTests.validateConsentRequest(TestUtils.commonDeviceId, 5, new boolean[] { false, false, false, false, false, false, false, false, false, false, false, false, true, false, false, false });
13601360

13611361
mCountly.views().startView("c", null);
13621362
// start false because session did not start
@@ -1941,7 +1941,7 @@ public void startView_consentRemoval() throws JSONException {
19411941
validateView("test", 0.0, 4, 6, false, false, TestUtils.map(), "_CLY_", "_CLY_", null);
19421942
validateView("test2", 0.0, 3, 6, false, false, TestUtils.map(), "_CLY_", "_CLY_", null);
19431943
}
1944-
ModuleConsentTests.validateConsentRequest(TestUtils.commonDeviceId, 5, new boolean[] { true, true, true, true, true, true, true, true, true, true, true, true, false, true, true });
1944+
ModuleConsentTests.validateConsentRequest(TestUtils.commonDeviceId, 5, new boolean[] { true, true, true, true, true, true, true, true, true, true, true, true, false, true, true, true });
19451945

19461946
countly.consent().giveConsent(new String[] { Countly.CountlyFeatureNames.views });
19471947
ModuleConsentTests.validateAllConsentRequest(TestUtils.commonDeviceId, 6);
@@ -1975,7 +1975,7 @@ public void startAutoStoppedView_consentRemoval() throws JSONException {
19751975

19761976
countly.consent().removeConsent(new String[] { Countly.CountlyFeatureNames.views });
19771977
validateView("test2", 0.0, 4, 6, false, false, TestUtils.map(), "_CLY_", "_CLY_", null);
1978-
ModuleConsentTests.validateConsentRequest(TestUtils.commonDeviceId, 5, new boolean[] { true, true, true, true, true, true, true, true, true, true, true, true, false, true, true });
1978+
ModuleConsentTests.validateConsentRequest(TestUtils.commonDeviceId, 5, new boolean[] { true, true, true, true, true, true, true, true, true, true, true, true, false, true, true, true });
19791979

19801980
countly.consent().giveConsent(new String[] { Countly.CountlyFeatureNames.views });
19811981
ModuleConsentTests.validateAllConsentRequest(TestUtils.commonDeviceId, 6);
@@ -2054,7 +2054,7 @@ public void autoViewTracking_consentRemoval() throws JSONException {
20542054

20552055
countly.consent().removeConsent(new String[] { Countly.CountlyFeatureNames.views });
20562056
validateView(activity2.getClass().getName(), 0.0, 6, 8, false, false, TestUtils.map(), "_CLY_", "_CLY_", null);
2057-
ModuleConsentTests.validateConsentRequest(TestUtils.commonDeviceId, 7, new boolean[] { true, true, true, true, true, true, true, true, true, true, true, true, false, true, true });
2057+
ModuleConsentTests.validateConsentRequest(TestUtils.commonDeviceId, 7, new boolean[] { true, true, true, true, true, true, true, true, true, true, true, true, false, true, true, true });
20582058

20592059
countly.consent().giveConsent(new String[] { Countly.CountlyFeatureNames.views });
20602060

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -392,7 +392,7 @@ protected static Map<String, String> validateSessionUpdateRequest(int idx, Integ
392392
}
393393

394394
private void validateSessionConsentRequest(int idx, boolean consentForSession, String deviceId) {
395-
ModuleConsentTests.validateConsentRequest(deviceId, idx, new boolean[] { consentForSession, false, false, false, false, false, false, false, false, false, false, false, false, false, false });
395+
ModuleConsentTests.validateConsentRequest(deviceId, idx, new boolean[] { consentForSession, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false });
396396
}
397397

398398
private void validateRequest(Map<String, Object> expectedExtras, int idx) {

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

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -539,6 +539,17 @@ public void sendDirectRequest(@NonNull final Map<String, String> requestData) {
539539
tick();
540540
}
541541

542+
@Override
543+
public void sendMetricsRequest(@NonNull String preparedMetrics) {
544+
if (!checkInternalState()) {
545+
return;
546+
}
547+
548+
L.d("[ConnectionQueue] sendMetricsRequest");
549+
addRequestToQueue(prepareCommonRequestData() + preparedMetrics, false);
550+
tick();
551+
}
552+
542553
/**
543554
* Records the specified events and sends them to the server.
544555
*

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

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -227,6 +227,7 @@ public static class CountlyFeatureNames {
227227
public static final String feedback = "feedback";
228228
public static final String remoteConfig = "remote-config";
229229
public static final String content = "content";
230+
public static final String metrics = "metrics";
230231
//public static final String accessoryDevices = "accessory-devices";
231232
}
232233

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

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,7 @@ public class ModuleConsent extends ModuleBase implements ConsentProvider {
3030
Countly.CountlyFeatureNames.clicks,
3131
Countly.CountlyFeatureNames.scrolls,
3232
Countly.CountlyFeatureNames.content,
33+
Countly.CountlyFeatureNames.metrics
3334
};
3435

3536
public enum ConsentChangeSource {ChangeConsentCall, DeviceIDChangedNotMerged}

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

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
import java.util.HashMap;
88
import java.util.List;
99
import java.util.Map;
10+
import java.util.concurrent.ConcurrentHashMap;
1011

1112
public class ModuleRequestQueue extends ModuleBase implements BaseInfoProvider {
1213
RequestQueue requestQueueInterface;
@@ -296,6 +297,16 @@ synchronized public void addDirectRequestInternal(@NonNull Map<String, String> r
296297
}
297298
}
298299

300+
private void recordMetricsInternal(@NonNull Map<String, String> metricsOverride) {
301+
if (!consentProvider.getConsent(Countly.CountlyFeatureNames.metrics)) {
302+
L.d("[ModuleRequestQueue] recordMetricsInternal, no consent given for metrics");
303+
return;
304+
}
305+
306+
String preparedMetrics = deviceInfo.getMetrics(_cly.context_, metricsOverride, L);
307+
requestQueueProvider.sendMetricsRequest(preparedMetrics);
308+
}
309+
299310
void esWriteCachesToPersistenceInternal(@Nullable ExplicitStorageCallback callback) {
300311
L.i("[ModuleRequestQueue] Calling esWriteCachesToPersistenceInternal");
301312
storageProvider.esWriteCacheToStorage(callback);
@@ -428,5 +439,22 @@ public void esWriteCachesToPersistence(@Nullable ExplicitStorageCallback callbac
428439
esWriteCachesToPersistenceInternal(callback);
429440
}
430441
}
442+
443+
/**
444+
* Record device metrics manually as a standalone call
445+
*
446+
* @param metricsOverride map of key value pairs to override the default metrics
447+
*/
448+
public void recordMetrics(@Nullable Map<String, String> metricsOverride) {
449+
synchronized (_cly) {
450+
L.i("[RequestQueue] recordMetrics, Calling recordMetrics");
451+
Map<String, String> tempMetricsOverride = metricsOverride;
452+
if (tempMetricsOverride == null) {
453+
tempMetricsOverride = new ConcurrentHashMap<>();
454+
}
455+
456+
recordMetricsInternal(tempMetricsOverride);
457+
}
458+
}
431459
}
432460
}

0 commit comments

Comments
 (0)