diff --git a/iterableapi/src/main/java/com/iterable/iterableapi/IterableActivityMonitor.java b/iterableapi/src/main/java/com/iterable/iterableapi/IterableActivityMonitor.java index 0f7a91c3e..7241d6f5a 100644 --- a/iterableapi/src/main/java/com/iterable/iterableapi/IterableActivityMonitor.java +++ b/iterableapi/src/main/java/com/iterable/iterableapi/IterableActivityMonitor.java @@ -3,13 +3,14 @@ import android.app.Activity; import android.app.Application; import android.content.Context; -import android.os.Build; import android.os.Bundle; import android.os.Handler; import android.os.Looper; import androidx.annotation.NonNull; import androidx.annotation.Nullable; +import com.iterable.iterableapi.util.DeviceInfoUtils; + import java.lang.ref.WeakReference; import java.util.ArrayList; import java.util.Iterator; @@ -57,10 +58,8 @@ public void onActivityStarted(Activity activity) { @Override public void onActivityResumed(Activity activity) { currentActivity = new WeakReference<>(activity); - String amazonFireTvHardware = "amazon.hardware.fire_tv"; - String amazonModel = Build.MODEL; - if (!inForeground || amazonModel.matches("AFTN") || activity.getPackageManager().hasSystemFeature(amazonFireTvHardware)) { + if (!inForeground || DeviceInfoUtils.isFireTV(activity.getPackageManager())) { inForeground = true; for (WeakReference callback : callbacks) { if (callback.get() != null) { diff --git a/iterableapi/src/main/java/com/iterable/iterableapi/IterableApi.java b/iterableapi/src/main/java/com/iterable/iterableapi/IterableApi.java index 58aacc75d..a958e9640 100644 --- a/iterableapi/src/main/java/com/iterable/iterableapi/IterableApi.java +++ b/iterableapi/src/main/java/com/iterable/iterableapi/IterableApi.java @@ -11,6 +11,8 @@ import androidx.annotation.RestrictTo; import androidx.annotation.VisibleForTesting; +import com.iterable.iterableapi.util.DeviceInfoUtils; + import org.json.JSONException; import org.json.JSONObject; @@ -508,6 +510,17 @@ public static void initialize(@NonNull Context context, @NonNull String apiKey, loadLastSavedConfiguration(context); IterablePushNotificationUtil.processPendingAction(context); + if (DeviceInfoUtils.isFireTV(context.getPackageManager())) { + try { + JSONObject dataFields = new JSONObject(); + JSONObject deviceDetails = new JSONObject(); + DeviceInfoUtils.populateDeviceDetails(deviceDetails, context, sharedInstance.getDeviceId()); + dataFields.put(IterableConstants.KEY_FIRETV, deviceDetails); + sharedInstance.apiClient.updateUser(dataFields, false); + } catch (JSONException e) { + IterableLogger.e(TAG, "initialize: exception", e); + } + } } public static void setContext(Context context) { diff --git a/iterableapi/src/main/java/com/iterable/iterableapi/IterableApiClient.java b/iterableapi/src/main/java/com/iterable/iterableapi/IterableApiClient.java index 6564a198d..3d0a6db0f 100644 --- a/iterableapi/src/main/java/com/iterable/iterableapi/IterableApiClient.java +++ b/iterableapi/src/main/java/com/iterable/iterableapi/IterableApiClient.java @@ -7,6 +7,8 @@ import androidx.annotation.Nullable; import androidx.core.app.NotificationManagerCompat; +import com.iterable.iterableapi.util.DeviceInfoUtils; + import org.json.JSONArray; import org.json.JSONException; import org.json.JSONObject; @@ -204,7 +206,7 @@ public void getInAppMessages(int count, @NonNull IterableHelper.IterableActionHa try { addEmailOrUserIdToJson(requestJSON); requestJSON.put(IterableConstants.ITERABLE_IN_APP_COUNT, count); - requestJSON.put(IterableConstants.KEY_PLATFORM, IterableConstants.ITBL_PLATFORM_ANDROID); + requestJSON.put(IterableConstants.KEY_PLATFORM, DeviceInfoUtils.isFireTV(authProvider.getContext().getPackageManager()) ? IterableConstants.ITBL_PLATFORM_OTT : IterableConstants.ITBL_PLATFORM_ANDROID); requestJSON.put(IterableConstants.ITBL_KEY_SDK_VERSION, IterableConstants.ITBL_KEY_SDK_VERSION_NUMBER); requestJSON.put(IterableConstants.ITBL_SYSTEM_VERSION, Build.VERSION.RELEASE); requestJSON.put(IterableConstants.KEY_PACKAGE_NAME, authProvider.getContext().getPackageName()); @@ -427,18 +429,7 @@ protected void registerDeviceToken(@Nullable String email, @Nullable String user dataFields.put(IterableConstants.FIREBASE_TOKEN_TYPE, IterableConstants.MESSAGING_PLATFORM_FIREBASE); dataFields.put(IterableConstants.FIREBASE_COMPATIBLE, true); - dataFields.put(IterableConstants.DEVICE_BRAND, Build.BRAND); //brand: google - dataFields.put(IterableConstants.DEVICE_MANUFACTURER, Build.MANUFACTURER); //manufacturer: samsung - dataFields.put(IterableConstants.DEVICE_SYSTEM_NAME, Build.DEVICE); //device name: toro - dataFields.put(IterableConstants.DEVICE_SYSTEM_VERSION, Build.VERSION.RELEASE); //version: 4.0.4 - dataFields.put(IterableConstants.DEVICE_MODEL, Build.MODEL); //device model: Galaxy Nexus - dataFields.put(IterableConstants.DEVICE_SDK_VERSION, Build.VERSION.SDK_INT); //sdk version/api level: 15 - - dataFields.put(IterableConstants.DEVICE_ID, authProvider.getDeviceId()); // Random UUID - dataFields.put(IterableConstants.DEVICE_APP_PACKAGE_NAME, context.getPackageName()); - dataFields.put(IterableConstants.DEVICE_APP_VERSION, IterableUtil.getAppVersion(context)); - dataFields.put(IterableConstants.DEVICE_APP_BUILD, IterableUtil.getAppVersionCode(context)); - dataFields.put(IterableConstants.DEVICE_ITERABLE_SDK_VERSION, IterableConstants.ITBL_KEY_SDK_VERSION_NUMBER); + DeviceInfoUtils.populateDeviceDetails(dataFields, context, authProvider.getDeviceId()); dataFields.put(IterableConstants.DEVICE_NOTIFICATIONS_ENABLED, NotificationManagerCompat.from(context).areNotificationsEnabled()); JSONObject device = new JSONObject(); diff --git a/iterableapi/src/main/java/com/iterable/iterableapi/IterableConstants.java b/iterableapi/src/main/java/com/iterable/iterableapi/IterableConstants.java index e49f06b35..fabd9a3f4 100644 --- a/iterableapi/src/main/java/com/iterable/iterableapi/IterableConstants.java +++ b/iterableapi/src/main/java/com/iterable/iterableapi/IterableConstants.java @@ -54,6 +54,7 @@ public final class IterableConstants { public static final String KEY_USER_TEXT = "userText"; public static final String KEY_INBOX_SESSION_ID = "inboxSessionId"; public static final String KEY_OFFLINE_MODE = "offlineMode"; + public static final String KEY_FIRETV = "FireTV"; //API Endpoint Key Constants public static final String ENDPOINT_DISABLE_DEVICE = "users/disableDevice"; @@ -245,6 +246,7 @@ public final class IterableConstants { public static final String ITBL_KEY_SDK_VERSION = "SDKVersion"; public static final String ITBL_PLATFORM_ANDROID = "Android"; + public static final String ITBL_PLATFORM_OTT = "OTT"; public static final String ITBL_KEY_SDK_VERSION_NUMBER = BuildConfig.ITERABLE_SDK_VERSION; public static final String ITBL_SYSTEM_VERSION = "systemVersion"; diff --git a/iterableapi/src/main/java/com/iterable/iterableapi/IterableUtil.java b/iterableapi/src/main/java/com/iterable/iterableapi/IterableUtil.java index 62538b803..593972257 100644 --- a/iterableapi/src/main/java/com/iterable/iterableapi/IterableUtil.java +++ b/iterableapi/src/main/java/com/iterable/iterableapi/IterableUtil.java @@ -11,19 +11,21 @@ import java.io.File; -class IterableUtil { +public class IterableUtil { @VisibleForTesting static IterableUtilImpl instance = new IterableUtilImpl(); + private IterableUtil() { } + static long currentTimeMillis() { return instance.currentTimeMillis(); } - static String getAppVersion(Context context) { + public static String getAppVersion(Context context) { return instance.getAppVersion(context); } - static String getAppVersionCode(Context context) { + public static String getAppVersionCode(Context context) { return instance.getAppVersionCode(context); } diff --git a/iterableapi/src/main/java/com/iterable/iterableapi/util/DeviceInfoUtils.java b/iterableapi/src/main/java/com/iterable/iterableapi/util/DeviceInfoUtils.java new file mode 100644 index 000000000..741297e28 --- /dev/null +++ b/iterableapi/src/main/java/com/iterable/iterableapi/util/DeviceInfoUtils.java @@ -0,0 +1,37 @@ +package com.iterable.iterableapi.util; + +import android.content.Context; +import android.content.pm.PackageManager; +import android.os.Build; + +import com.iterable.iterableapi.IterableConstants; +import com.iterable.iterableapi.IterableUtil; + +import org.json.JSONException; +import org.json.JSONObject; + +public final class DeviceInfoUtils { + + private DeviceInfoUtils() { + } + + public static boolean isFireTV(PackageManager packageManager) { + String amazonFireTvHardware = "amazon.hardware.fire_tv"; + String amazonModel = Build.MODEL; + return amazonModel.matches("AFTN") || packageManager.hasSystemFeature(amazonFireTvHardware); + } + public static void populateDeviceDetails(JSONObject dataFields, Context context, String deviceId) throws JSONException { + dataFields.put(IterableConstants.DEVICE_BRAND, Build.BRAND); //brand: google + dataFields.put(IterableConstants.DEVICE_MANUFACTURER, Build.MANUFACTURER); //manufacturer: samsung + dataFields.put(IterableConstants.DEVICE_SYSTEM_NAME, Build.DEVICE); //device name: toro + dataFields.put(IterableConstants.DEVICE_SYSTEM_VERSION, Build.VERSION.RELEASE); //version: 4.0.4 + dataFields.put(IterableConstants.DEVICE_MODEL, Build.MODEL); //device model: Galaxy Nexus + dataFields.put(IterableConstants.DEVICE_SDK_VERSION, Build.VERSION.SDK_INT); //sdk version/api level: 15 + + dataFields.put(IterableConstants.DEVICE_ID, deviceId); // Random UUID + dataFields.put(IterableConstants.DEVICE_APP_PACKAGE_NAME, context.getPackageName()); + dataFields.put(IterableConstants.DEVICE_APP_VERSION, IterableUtil.getAppVersion(context)); + dataFields.put(IterableConstants.DEVICE_APP_BUILD, IterableUtil.getAppVersionCode(context)); + dataFields.put(IterableConstants.DEVICE_ITERABLE_SDK_VERSION, IterableConstants.ITBL_KEY_SDK_VERSION_NUMBER); + } +} diff --git a/iterableapi/src/test/java/com/iterable/iterableapi/IterableApiTest.java b/iterableapi/src/test/java/com/iterable/iterableapi/IterableApiTest.java index fa720e969..5a2a0d7ec 100644 --- a/iterableapi/src/test/java/com/iterable/iterableapi/IterableApiTest.java +++ b/iterableapi/src/test/java/com/iterable/iterableapi/IterableApiTest.java @@ -1,5 +1,6 @@ package com.iterable.iterableapi; +import com.iterable.iterableapi.util.DeviceInfoUtils; import android.app.Activity; import android.net.Uri; @@ -395,7 +396,8 @@ public void testGetInAppMessages() throws Exception { Uri uri = Uri.parse(getInAppMessagesRequest.getRequestUrl().toString()); assertEquals("/" + IterableConstants.ENDPOINT_GET_INAPP_MESSAGES, uri.getPath()); assertEquals("10", uri.getQueryParameter(IterableConstants.ITERABLE_IN_APP_COUNT)); - assertEquals(IterableConstants.ITBL_PLATFORM_ANDROID, uri.getQueryParameter(IterableConstants.KEY_PLATFORM)); + assertEquals(DeviceInfoUtils.isFireTV(getContext().getPackageManager()) ? IterableConstants.ITBL_PLATFORM_OTT : IterableConstants.ITBL_PLATFORM_ANDROID, uri.getQueryParameter(IterableConstants.KEY_PLATFORM)); + assertEquals(IterableConstants.ITBL_KEY_SDK_VERSION_NUMBER, uri.getQueryParameter(IterableConstants.ITBL_KEY_SDK_VERSION)); assertNotNull(uri.getQueryParameter(IterableConstants.ITBL_SYSTEM_VERSION)); assertEquals(getContext().getPackageName(), uri.getQueryParameter(IterableConstants.KEY_PACKAGE_NAME));