Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 4 additions & 1 deletion CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,6 +1,9 @@
## 25.4.4
* Improved disk size calculation in crash reports.
* Added "setRequestTimeoutDuration(requestTimeoutDuration)" init config method configure request timeout in seconds.

* Added a new function "sendMetricsRequest(metricsOverride)" to send a device metrics request, accessible through the requestQueue interface.
* Added a new Consent option "metrics" for controlling "sendMetricsRequest" method. (This has no effect on Session metrics.)
* Added "setRequestTimeoutDuration(requestTimeoutDuration)" init config method to change request timeout duration in seconds.

* Mitigated an issue displaying Content on API level 35 and above.

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -74,7 +74,7 @@ public void testGetDevice() {
@Test
public void testGetResolution() {
final DisplayMetrics metrics = new DisplayMetrics();
((WindowManager) TestUtils.getContext().getSystemService(Context.WINDOW_SERVICE)).getDefaultDisplay().getMetrics(metrics);
((WindowManager) TestUtils.getContext().getSystemService(Context.WINDOW_SERVICE)).getDefaultDisplay().getRealMetrics(metrics);
final String expected = metrics.widthPixels + "x" + metrics.heightPixels;
assertEquals(expected, regularDeviceInfo.mp.getResolution(TestUtils.getContext()));
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -212,7 +212,7 @@ public void consentEnabled_allFeatures() throws JSONException, InterruptedExcept

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

flow_allFeatures();
Expand Down Expand Up @@ -959,7 +959,7 @@ public void scenario_consentRequiredDisabled() throws JSONException {

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

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -32,6 +32,7 @@ public class ModuleConsentTests {
Countly.CountlyFeatureNames.clicks,
Countly.CountlyFeatureNames.scrolls,
Countly.CountlyFeatureNames.content,
Countly.CountlyFeatureNames.metrics,
};

@Before
Expand Down Expand Up @@ -253,12 +254,12 @@ public void initTimeSetConsentRQ_4() throws JSONException {
protected static void validateConsentRequest(String deviceId, int idx, boolean[] consents) {
Map<String, Object> consentsMap =
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",
consents[10], "events", consents[11], "views", consents[12], "apm", consents[13], "content", consents[14]);
consents[10], "events", consents[11], "views", consents[12], "apm", consents[13], "content", consents[14], "metrics", consents[15]);
TestUtils.validateRequest(deviceId, TestUtils.map("consent", consentsMap), idx);
}

protected static void validateAllConsentRequest(String deviceId, int idx) {
validateConsentRequest(deviceId, idx, new boolean[] { true, true, true, true, true, true, true, true, true, true, true, true, true, true, true });
validateConsentRequest(deviceId, idx, new boolean[] { true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true });
}

// TODO test that makes sure that the consent change request is created correctly
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -1342,7 +1342,7 @@ public void clearFirstViewFlagSessionConsentRemoved() throws JSONException {
mCountly.views().startView("a", null);

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

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

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

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

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

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

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

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

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

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -392,7 +392,7 @@ protected static Map<String, String> validateSessionUpdateRequest(int idx, Integ
}

private void validateSessionConsentRequest(int idx, boolean consentForSession, String deviceId) {
ModuleConsentTests.validateConsentRequest(deviceId, idx, new boolean[] { consentForSession, false, false, false, false, false, false, false, false, false, false, false, false, false, false });
ModuleConsentTests.validateConsentRequest(deviceId, idx, new boolean[] { consentForSession, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false });
}

private void validateRequest(Map<String, Object> expectedExtras, int idx) {
Expand Down
11 changes: 11 additions & 0 deletions sdk/src/main/java/ly/count/android/sdk/ConnectionQueue.java
Original file line number Diff line number Diff line change
Expand Up @@ -539,6 +539,17 @@ public void sendDirectRequest(@NonNull final Map<String, String> requestData) {
tick();
}

@Override
public void sendMetricsRequest(@NonNull String preparedMetrics) {
if (!checkInternalState()) {
return;
}

L.d("[ConnectionQueue] sendMetricsRequest");
addRequestToQueue(prepareCommonRequestData() + preparedMetrics, false);
tick();
}

/**
* Records the specified events and sends them to the server.
*
Expand Down
1 change: 1 addition & 0 deletions sdk/src/main/java/ly/count/android/sdk/Countly.java
Original file line number Diff line number Diff line change
Expand Up @@ -227,6 +227,7 @@ public static class CountlyFeatureNames {
public static final String feedback = "feedback";
public static final String remoteConfig = "remote-config";
public static final String content = "content";
public static final String metrics = "metrics";
//public static final String accessoryDevices = "accessory-devices";
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,7 @@ public class ModuleConsent extends ModuleBase implements ConsentProvider {
Countly.CountlyFeatureNames.clicks,
Countly.CountlyFeatureNames.scrolls,
Countly.CountlyFeatureNames.content,
Countly.CountlyFeatureNames.metrics
};

public enum ConsentChangeSource {ChangeConsentCall, DeviceIDChangedNotMerged}
Expand Down
28 changes: 28 additions & 0 deletions sdk/src/main/java/ly/count/android/sdk/ModuleRequestQueue.java
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;

public class ModuleRequestQueue extends ModuleBase implements BaseInfoProvider {
RequestQueue requestQueueInterface;
Expand Down Expand Up @@ -296,6 +297,16 @@ synchronized public void addDirectRequestInternal(@NonNull Map<String, String> r
}
}

private void recordMetricsInternal(@NonNull Map<String, String> metricsOverride) {
if (!consentProvider.getConsent(Countly.CountlyFeatureNames.metrics)) {
L.d("[ModuleRequestQueue] recordMetricsInternal, no consent given for metrics");
return;
}

String preparedMetrics = deviceInfo.getMetrics(_cly.context_, metricsOverride, L);
requestQueueProvider.sendMetricsRequest(preparedMetrics);
}

void esWriteCachesToPersistenceInternal(@Nullable ExplicitStorageCallback callback) {
L.i("[ModuleRequestQueue] Calling esWriteCachesToPersistenceInternal");
storageProvider.esWriteCacheToStorage(callback);
Expand Down Expand Up @@ -428,5 +439,22 @@ public void esWriteCachesToPersistence(@Nullable ExplicitStorageCallback callbac
esWriteCachesToPersistenceInternal(callback);
}
}

/**
* Record device metrics manually as a standalone call
*
* @param metricsOverride map of key value pairs to override the default metrics
*/
public void recordMetrics(@Nullable Map<String, String> metricsOverride) {
synchronized (_cly) {
L.i("[RequestQueue] recordMetrics, Calling recordMetrics");
Map<String, String> tempMetricsOverride = metricsOverride;
if (tempMetricsOverride == null) {
tempMetricsOverride = new ConcurrentHashMap<>();
}

recordMetricsInternal(tempMetricsOverride);
}
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -41,6 +41,8 @@ interface RequestQueueProvider {

void sendDirectRequest(@NonNull final Map<String, String> requestData);

void sendMetricsRequest(@NonNull String preparedMetrics);

void enrollToKeys(@NonNull String[] keys);

void exitForKeys(@NonNull String[] keys);
Expand Down
Loading