Skip to content

Commit 70a66ae

Browse files
author
“Akshay
committed
Merge branch 'master' into encryption
# Conflicts: # iterableapi/src/main/java/com/iterable/iterableapi/IterableConfig.java
2 parents be29cfd + 62ac73e commit 70a66ae

File tree

9 files changed

+166
-26
lines changed

9 files changed

+166
-26
lines changed

.github/workflows/jira.yml

+27
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
on:
2+
issues:
3+
types: [opened]
4+
5+
name: Create Jira Issue
6+
7+
jobs:
8+
build:
9+
runs-on: ubuntu-latest
10+
name: Create Jira Issue
11+
steps:
12+
- name: Login
13+
uses: atlassian/gajira-login@v3
14+
env:
15+
JIRA_BASE_URL: ${{ secrets.JIRA_BASE_URL }}
16+
JIRA_USER_EMAIL: ${{ secrets.JIRA_ILYA_USER_EMAIL }}
17+
JIRA_API_TOKEN: ${{ secrets.JIRA_ILYA_API_TOKEN }}
18+
19+
- name: Create
20+
id: create
21+
uses: atlassian/gajira-create@v3
22+
with:
23+
project: MOB
24+
issuetype: Bug
25+
summary: "${{ github.repository }}: #${{ github.event.issue.number }} by ${{ github.event.issue.user.login }}: ${{ github.event.issue.title }}"
26+
description: ${{ github.event.issue.body }}
27+
fields: '{"customfield_11268": {"id": "10668"} }'

app/build.gradle

+4
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,10 @@ apply plugin: 'kotlin-android'
33
apply plugin: 'kotlin-android-extensions'
44
apply plugin: 'jacoco'
55

6+
repositories {
7+
mavenCentral()
8+
}
9+
610
android {
711
compileSdkVersion 29
812
buildToolsVersion '29.0.3'

iterableapi/src/main/java/com/iterable/iterableapi/IterableActivityMonitor.java

+3-4
Original file line numberDiff line numberDiff line change
@@ -3,13 +3,14 @@
33
import android.app.Activity;
44
import android.app.Application;
55
import android.content.Context;
6-
import android.os.Build;
76
import android.os.Bundle;
87
import android.os.Handler;
98
import android.os.Looper;
109
import androidx.annotation.NonNull;
1110
import androidx.annotation.Nullable;
1211

12+
import com.iterable.iterableapi.util.DeviceInfoUtils;
13+
1314
import java.lang.ref.WeakReference;
1415
import java.util.ArrayList;
1516
import java.util.Iterator;
@@ -57,10 +58,8 @@ public void onActivityStarted(Activity activity) {
5758
@Override
5859
public void onActivityResumed(Activity activity) {
5960
currentActivity = new WeakReference<>(activity);
60-
String amazonFireTvHardware = "amazon.hardware.fire_tv";
61-
String amazonModel = Build.MODEL;
6261

63-
if (!inForeground || amazonModel.matches("AFTN") || activity.getPackageManager().hasSystemFeature(amazonFireTvHardware)) {
62+
if (!inForeground || DeviceInfoUtils.isFireTV(activity.getPackageManager())) {
6463
inForeground = true;
6564
for (WeakReference<AppStateCallback> callback : callbacks) {
6665
if (callback.get() != null) {

iterableapi/src/main/java/com/iterable/iterableapi/IterableApi.java

+40-3
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,8 @@
1212
import androidx.annotation.RestrictTo;
1313
import androidx.annotation.VisibleForTesting;
1414

15+
import com.iterable.iterableapi.util.DeviceInfoUtils;
16+
1517
import org.json.JSONException;
1618
import org.json.JSONObject;
1719

@@ -39,6 +41,8 @@ public class IterableApi {
3941
private IterableNotificationData _notificationData;
4042
private String _deviceId;
4143
private boolean _firstForegroundHandled;
44+
private IterableHelper.SuccessHandler _setUserSuccessCallbackHandler;
45+
private IterableHelper.FailureHandler _setUserFailureCallbackHandler;
4246

4347
IterableApiClient apiClient = new IterableApiClient(new IterableApiAuthProvider());
4448
private @Nullable IterableInAppManager inAppManager;
@@ -291,6 +295,8 @@ private void completeUserLogin() {
291295

292296
if (config.autoPushRegistration) {
293297
registerForPush();
298+
} else if (_setUserSuccessCallbackHandler != null) {
299+
_setUserSuccessCallbackHandler.onSuccess(new JSONObject()); // passing blank json object here as onSuccess is @Nonnull
294300
}
295301

296302
getInAppManager().syncInApp();
@@ -478,7 +484,7 @@ protected void registerDeviceToken(@Nullable String email, @Nullable String user
478484
IterableLogger.e(TAG, "registerDeviceToken: applicationName is null, check that pushIntegrationName is set in IterableConfig");
479485
}
480486

481-
apiClient.registerDeviceToken(email, userId, authToken, applicationName, deviceToken, dataFields, deviceAttributes);
487+
apiClient.registerDeviceToken(email, userId, authToken, applicationName, deviceToken, dataFields, deviceAttributes, _setUserSuccessCallbackHandler, _setUserFailureCallbackHandler);
482488
}
483489
//endregion
484490

@@ -519,6 +525,17 @@ public static void initialize(@NonNull Context context, @NonNull String apiKey,
519525

520526
loadLastSavedConfiguration(context);
521527
IterablePushNotificationUtil.processPendingAction(context);
528+
if (DeviceInfoUtils.isFireTV(context.getPackageManager())) {
529+
try {
530+
JSONObject dataFields = new JSONObject();
531+
JSONObject deviceDetails = new JSONObject();
532+
DeviceInfoUtils.populateDeviceDetails(deviceDetails, context, sharedInstance.getDeviceId());
533+
dataFields.put(IterableConstants.KEY_FIRETV, deviceDetails);
534+
sharedInstance.apiClient.updateUser(dataFields, false);
535+
} catch (JSONException e) {
536+
IterableLogger.e(TAG, "initialize: exception", e);
537+
}
538+
}
522539
}
523540

524541
public static void setContext(Context context) {
@@ -571,10 +588,18 @@ public IterableAttributionInfo getAttributionInfo() {
571588
}
572589

573590
public void setEmail(@Nullable String email) {
574-
setEmail(email, null);
591+
setEmail(email, null, null, null);
592+
}
593+
594+
public void setEmail(@Nullable String email, @Nullable IterableHelper.SuccessHandler successHandler, @Nullable IterableHelper.FailureHandler failureHandler) {
595+
setEmail(email, null, successHandler, failureHandler);
575596
}
576597

577598
public void setEmail(@Nullable String email, @Nullable String authToken) {
599+
setEmail(email, authToken, null, null);
600+
}
601+
602+
public void setEmail(@Nullable String email, @Nullable String authToken, @Nullable IterableHelper.SuccessHandler successHandler, @Nullable IterableHelper.FailureHandler failureHandler) {
578603
//Only if passed in same non-null email
579604
if (_email != null && _email.equals(email)) {
580605
checkAndUpdateAuthToken(authToken);
@@ -589,16 +614,26 @@ public void setEmail(@Nullable String email, @Nullable String authToken) {
589614

590615
_email = email;
591616
_userId = null;
617+
_setUserSuccessCallbackHandler = successHandler;
618+
_setUserFailureCallbackHandler = failureHandler;
592619
storeAuthData();
593620

594621
onLogin(authToken);
595622
}
596623

597624
public void setUserId(@Nullable String userId) {
598-
setUserId(userId, null);
625+
setUserId(userId, null, null, null);
626+
}
627+
628+
public void setUserId(@Nullable String userId, @Nullable IterableHelper.SuccessHandler successHandler, @Nullable IterableHelper.FailureHandler failureHandler) {
629+
setUserId(userId, null, successHandler, failureHandler);
599630
}
600631

601632
public void setUserId(@Nullable String userId, @Nullable String authToken) {
633+
setUserId(userId, authToken, null, null);
634+
}
635+
636+
public void setUserId(@Nullable String userId, @Nullable String authToken, @Nullable IterableHelper.SuccessHandler successHandler, @Nullable IterableHelper.FailureHandler failureHandler) {
602637
//If same non null userId is passed
603638
if (_userId != null && _userId.equals(userId)) {
604639
checkAndUpdateAuthToken(authToken);
@@ -613,6 +648,8 @@ public void setUserId(@Nullable String userId, @Nullable String authToken) {
613648

614649
_email = null;
615650
_userId = userId;
651+
_setUserSuccessCallbackHandler = successHandler;
652+
_setUserFailureCallbackHandler = failureHandler;
616653
storeAuthData();
617654

618655
onLogin(authToken);

iterableapi/src/main/java/com/iterable/iterableapi/IterableApiClient.java

+6-15
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,8 @@
77
import androidx.annotation.Nullable;
88
import androidx.core.app.NotificationManagerCompat;
99

10+
import com.iterable.iterableapi.util.DeviceInfoUtils;
11+
1012
import org.json.JSONArray;
1113
import org.json.JSONException;
1214
import org.json.JSONObject;
@@ -204,7 +206,7 @@ public void getInAppMessages(int count, @NonNull IterableHelper.IterableActionHa
204206
try {
205207
addEmailOrUserIdToJson(requestJSON);
206208
requestJSON.put(IterableConstants.ITERABLE_IN_APP_COUNT, count);
207-
requestJSON.put(IterableConstants.KEY_PLATFORM, IterableConstants.ITBL_PLATFORM_ANDROID);
209+
requestJSON.put(IterableConstants.KEY_PLATFORM, DeviceInfoUtils.isFireTV(authProvider.getContext().getPackageManager()) ? IterableConstants.ITBL_PLATFORM_OTT : IterableConstants.ITBL_PLATFORM_ANDROID);
208210
requestJSON.put(IterableConstants.ITBL_KEY_SDK_VERSION, IterableConstants.ITBL_KEY_SDK_VERSION_NUMBER);
209211
requestJSON.put(IterableConstants.ITBL_SYSTEM_VERSION, Build.VERSION.RELEASE);
210212
requestJSON.put(IterableConstants.KEY_PACKAGE_NAME, authProvider.getContext().getPackageName());
@@ -411,7 +413,7 @@ protected void disableToken(@Nullable String email, @Nullable String userId, @Nu
411413
}
412414
}
413415

414-
protected void registerDeviceToken(@Nullable String email, @Nullable String userId, @Nullable String authToken, @NonNull String applicationName, @NonNull String deviceToken, @Nullable JSONObject dataFields, HashMap<String, String> deviceAttributes) {
416+
protected void registerDeviceToken(@Nullable String email, @Nullable String userId, @Nullable String authToken, @NonNull String applicationName, @NonNull String deviceToken, @Nullable JSONObject dataFields, HashMap<String, String> deviceAttributes, @Nullable final IterableHelper.SuccessHandler successHandler, @Nullable final IterableHelper.FailureHandler failureHandler) {
415417
Context context = authProvider.getContext();
416418
JSONObject requestJSON = new JSONObject();
417419
try {
@@ -427,18 +429,7 @@ protected void registerDeviceToken(@Nullable String email, @Nullable String user
427429

428430
dataFields.put(IterableConstants.FIREBASE_TOKEN_TYPE, IterableConstants.MESSAGING_PLATFORM_FIREBASE);
429431
dataFields.put(IterableConstants.FIREBASE_COMPATIBLE, true);
430-
dataFields.put(IterableConstants.DEVICE_BRAND, Build.BRAND); //brand: google
431-
dataFields.put(IterableConstants.DEVICE_MANUFACTURER, Build.MANUFACTURER); //manufacturer: samsung
432-
dataFields.put(IterableConstants.DEVICE_SYSTEM_NAME, Build.DEVICE); //device name: toro
433-
dataFields.put(IterableConstants.DEVICE_SYSTEM_VERSION, Build.VERSION.RELEASE); //version: 4.0.4
434-
dataFields.put(IterableConstants.DEVICE_MODEL, Build.MODEL); //device model: Galaxy Nexus
435-
dataFields.put(IterableConstants.DEVICE_SDK_VERSION, Build.VERSION.SDK_INT); //sdk version/api level: 15
436-
437-
dataFields.put(IterableConstants.DEVICE_ID, authProvider.getDeviceId()); // Random UUID
438-
dataFields.put(IterableConstants.DEVICE_APP_PACKAGE_NAME, context.getPackageName());
439-
dataFields.put(IterableConstants.DEVICE_APP_VERSION, IterableUtil.getAppVersion(context));
440-
dataFields.put(IterableConstants.DEVICE_APP_BUILD, IterableUtil.getAppVersionCode(context));
441-
dataFields.put(IterableConstants.DEVICE_ITERABLE_SDK_VERSION, IterableConstants.ITBL_KEY_SDK_VERSION_NUMBER);
432+
DeviceInfoUtils.populateDeviceDetails(dataFields, context, authProvider.getDeviceId());
442433
dataFields.put(IterableConstants.DEVICE_NOTIFICATIONS_ENABLED, NotificationManagerCompat.from(context).areNotificationsEnabled());
443434

444435
JSONObject device = new JSONObject();
@@ -453,7 +444,7 @@ protected void registerDeviceToken(@Nullable String email, @Nullable String user
453444
requestJSON.put(IterableConstants.KEY_PREFER_USER_ID, true);
454445
}
455446

456-
sendPostRequest(IterableConstants.ENDPOINT_REGISTER_DEVICE_TOKEN, requestJSON, authToken);
447+
sendPostRequest(IterableConstants.ENDPOINT_REGISTER_DEVICE_TOKEN, requestJSON, authToken, successHandler, failureHandler);
457448
} catch (JSONException e) {
458449
IterableLogger.e(TAG, "registerDeviceToken: exception", e);
459450
}

iterableapi/src/main/java/com/iterable/iterableapi/IterableConstants.java

+2
Original file line numberDiff line numberDiff line change
@@ -54,6 +54,7 @@ public final class IterableConstants {
5454
public static final String KEY_USER_TEXT = "userText";
5555
public static final String KEY_INBOX_SESSION_ID = "inboxSessionId";
5656
public static final String KEY_OFFLINE_MODE = "offlineMode";
57+
public static final String KEY_FIRETV = "FireTV";
5758

5859
//API Endpoint Key Constants
5960
public static final String ENDPOINT_DISABLE_DEVICE = "users/disableDevice";
@@ -245,6 +246,7 @@ public final class IterableConstants {
245246

246247
public static final String ITBL_KEY_SDK_VERSION = "SDKVersion";
247248
public static final String ITBL_PLATFORM_ANDROID = "Android";
249+
public static final String ITBL_PLATFORM_OTT = "OTT";
248250
public static final String ITBL_KEY_SDK_VERSION_NUMBER = BuildConfig.ITERABLE_SDK_VERSION;
249251
public static final String ITBL_SYSTEM_VERSION = "systemVersion";
250252

iterableapi/src/main/java/com/iterable/iterableapi/IterableUtil.java

+5-3
Original file line numberDiff line numberDiff line change
@@ -11,19 +11,21 @@
1111

1212
import java.io.File;
1313

14-
class IterableUtil {
14+
public class IterableUtil {
1515
@VisibleForTesting
1616
static IterableUtilImpl instance = new IterableUtilImpl();
1717

18+
private IterableUtil() { }
19+
1820
static long currentTimeMillis() {
1921
return instance.currentTimeMillis();
2022
}
2123

22-
static String getAppVersion(Context context) {
24+
public static String getAppVersion(Context context) {
2325
return instance.getAppVersion(context);
2426
}
2527

26-
static String getAppVersionCode(Context context) {
28+
public static String getAppVersionCode(Context context) {
2729
return instance.getAppVersionCode(context);
2830
}
2931

Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
package com.iterable.iterableapi.util;
2+
3+
import android.content.Context;
4+
import android.content.pm.PackageManager;
5+
import android.os.Build;
6+
7+
import com.iterable.iterableapi.IterableConstants;
8+
import com.iterable.iterableapi.IterableUtil;
9+
10+
import org.json.JSONException;
11+
import org.json.JSONObject;
12+
13+
public final class DeviceInfoUtils {
14+
15+
private DeviceInfoUtils() {
16+
}
17+
18+
public static boolean isFireTV(PackageManager packageManager) {
19+
String amazonFireTvHardware = "amazon.hardware.fire_tv";
20+
String amazonModel = Build.MODEL;
21+
return amazonModel.matches("AFTN") || packageManager.hasSystemFeature(amazonFireTvHardware);
22+
}
23+
public static void populateDeviceDetails(JSONObject dataFields, Context context, String deviceId) throws JSONException {
24+
dataFields.put(IterableConstants.DEVICE_BRAND, Build.BRAND); //brand: google
25+
dataFields.put(IterableConstants.DEVICE_MANUFACTURER, Build.MANUFACTURER); //manufacturer: samsung
26+
dataFields.put(IterableConstants.DEVICE_SYSTEM_NAME, Build.DEVICE); //device name: toro
27+
dataFields.put(IterableConstants.DEVICE_SYSTEM_VERSION, Build.VERSION.RELEASE); //version: 4.0.4
28+
dataFields.put(IterableConstants.DEVICE_MODEL, Build.MODEL); //device model: Galaxy Nexus
29+
dataFields.put(IterableConstants.DEVICE_SDK_VERSION, Build.VERSION.SDK_INT); //sdk version/api level: 15
30+
31+
dataFields.put(IterableConstants.DEVICE_ID, deviceId); // Random UUID
32+
dataFields.put(IterableConstants.DEVICE_APP_PACKAGE_NAME, context.getPackageName());
33+
dataFields.put(IterableConstants.DEVICE_APP_VERSION, IterableUtil.getAppVersion(context));
34+
dataFields.put(IterableConstants.DEVICE_APP_BUILD, IterableUtil.getAppVersionCode(context));
35+
dataFields.put(IterableConstants.DEVICE_ITERABLE_SDK_VERSION, IterableConstants.ITBL_KEY_SDK_VERSION_NUMBER);
36+
}
37+
}

iterableapi/src/test/java/com/iterable/iterableapi/IterableApiTest.java

+42-1
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,12 @@
11
package com.iterable.iterableapi;
22

3+
import com.iterable.iterableapi.util.DeviceInfoUtils;
34
import android.app.Activity;
45
import android.net.Uri;
56

7+
import androidx.annotation.NonNull;
8+
import androidx.annotation.Nullable;
9+
610
import org.json.JSONArray;
711
import org.json.JSONException;
812
import org.json.JSONObject;
@@ -160,6 +164,42 @@ public void testUpdateEmailPersistence() throws Exception {
160164
assertEquals("[email protected]", IterableApi.getInstance().getEmail());
161165
}
162166

167+
@Test
168+
public void testSetEmailWithCallback() {
169+
IterableApi.initialize(getContext(), "apiKey");
170+
171+
String email = "[email protected]";
172+
IterableApi.getInstance().setEmail(email, null, new IterableHelper.SuccessHandler() {
173+
@Override
174+
public void onSuccess(@NonNull JSONObject data) {
175+
assertTrue(true); // callback should be called with success
176+
}
177+
}, new IterableHelper.FailureHandler() {
178+
@Override
179+
public void onFailure(@NonNull String reason, @Nullable JSONObject data) {
180+
assertTrue(false); // callback should be called with failure
181+
}
182+
});
183+
}
184+
185+
@Test
186+
public void testSetUserIdWithCallback() {
187+
IterableApi.initialize(getContext(), "apiKey");
188+
189+
String userId = "test_user_id";
190+
IterableApi.getInstance().setUserId(userId, null, new IterableHelper.SuccessHandler() {
191+
@Override
192+
public void onSuccess(@NonNull JSONObject data) {
193+
assertTrue(true); // callback should be called with success
194+
}
195+
}, new IterableHelper.FailureHandler() {
196+
@Override
197+
public void onFailure(@NonNull String reason, @Nullable JSONObject data) {
198+
assertTrue(false); // callback should be called with failure
199+
}
200+
});
201+
}
202+
163203
@Test
164204
public void testUpdateEmailWithOldEmail() throws Exception {
165205
server.enqueue(new MockResponse().setResponseCode(200).setBody("{}"));
@@ -395,7 +435,8 @@ public void testGetInAppMessages() throws Exception {
395435
Uri uri = Uri.parse(getInAppMessagesRequest.getRequestUrl().toString());
396436
assertEquals("/" + IterableConstants.ENDPOINT_GET_INAPP_MESSAGES, uri.getPath());
397437
assertEquals("10", uri.getQueryParameter(IterableConstants.ITERABLE_IN_APP_COUNT));
398-
assertEquals(IterableConstants.ITBL_PLATFORM_ANDROID, uri.getQueryParameter(IterableConstants.KEY_PLATFORM));
438+
assertEquals(DeviceInfoUtils.isFireTV(getContext().getPackageManager()) ? IterableConstants.ITBL_PLATFORM_OTT : IterableConstants.ITBL_PLATFORM_ANDROID, uri.getQueryParameter(IterableConstants.KEY_PLATFORM));
439+
399440
assertEquals(IterableConstants.ITBL_KEY_SDK_VERSION_NUMBER, uri.getQueryParameter(IterableConstants.ITBL_KEY_SDK_VERSION));
400441
assertNotNull(uri.getQueryParameter(IterableConstants.ITBL_SYSTEM_VERSION));
401442
assertEquals(getContext().getPackageName(), uri.getQueryParameter(IterableConstants.KEY_PACKAGE_NAME));

0 commit comments

Comments
 (0)