@attentive-mobile/attentive-react-native-sdk 2.0.0-beta.3 → 2.0.0-beta.5
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +145 -10
- package/android/build.gradle +4 -0
- package/android/src/main/AndroidManifest.xml +2 -0
- package/android/src/main/kotlin/com/attentivereactnativesdk/AttentivePushHelper.kt +93 -0
- package/android/src/main/kotlin/com/attentivereactnativesdk/AttentiveReactNativeSdkModule.kt +382 -56
- package/android/src/main/kotlin/com/attentivereactnativesdk/debug/NetworkingHelper.kt +220 -0
- package/ios/AttentiveReactNativeSdk.mm +33 -0
- package/ios/AttentiveReactNativeSdk.xcodeproj/project.xcworkspace/contents.xcworkspacedata +7 -0
- package/ios/AttentiveReactNativeSdk.xcodeproj/project.xcworkspace/xcuserdata/zheref.xcuserdatad/UserInterfaceState.xcuserstate +0 -0
- package/ios/AttentiveReactNativeSdk.xcodeproj/xcuserdata/zheref.xcuserdatad/xcschemes/xcschememanagement.plist +14 -0
- package/ios/Bridging/ATTNNativeSDK.swift +47 -6
- package/lib/commonjs/NativeAttentiveReactNativeSdk.js.map +1 -1
- package/lib/commonjs/eventTypes.js.map +1 -1
- package/lib/commonjs/index.js +28 -9
- package/lib/commonjs/index.js.map +1 -1
- package/lib/module/NativeAttentiveReactNativeSdk.js.map +1 -1
- package/lib/module/eventTypes.js.map +1 -1
- package/lib/module/index.js +29 -11
- package/lib/module/index.js.map +1 -1
- package/lib/typescript/NativeAttentiveReactNativeSdk.d.ts +9 -1
- package/lib/typescript/NativeAttentiveReactNativeSdk.d.ts.map +1 -1
- package/lib/typescript/index.d.ts +24 -9
- package/lib/typescript/index.d.ts.map +1 -1
- package/package.json +7 -3
- package/src/NativeAttentiveReactNativeSdk.ts +11 -2
- package/src/index.tsx +29 -10
- package/ios/AttentiveReactNativeSdk.xcworkspace/contents.xcworkspacedata +0 -10
package/android/src/main/kotlin/com/attentivereactnativesdk/AttentiveReactNativeSdkModule.kt
CHANGED
|
@@ -22,6 +22,7 @@ import com.facebook.react.bridge.ReadableArray
|
|
|
22
22
|
import com.facebook.react.bridge.ReadableMap
|
|
23
23
|
import com.facebook.react.bridge.UiThreadUtil
|
|
24
24
|
import com.facebook.react.bridge.Promise
|
|
25
|
+
import com.facebook.react.bridge.Callback
|
|
25
26
|
import com.attentivereactnativesdk.debug.AttentiveDebugHelper
|
|
26
27
|
import java.math.BigDecimal
|
|
27
28
|
import java.security.InvalidParameterException
|
|
@@ -34,6 +35,7 @@ class AttentiveReactNativeSdkModule(reactContext: ReactApplicationContext) :
|
|
|
34
35
|
companion object {
|
|
35
36
|
const val NAME = "AttentiveReactNativeSdk"
|
|
36
37
|
private const val TAG = NAME
|
|
38
|
+
private const val PUSH_PERMISSION_REQUEST_CODE = 3901
|
|
37
39
|
}
|
|
38
40
|
|
|
39
41
|
private var attentiveConfig: AttentiveConfig? = null
|
|
@@ -236,69 +238,381 @@ class AttentiveReactNativeSdkModule(reactContext: ReactApplicationContext) :
|
|
|
236
238
|
}
|
|
237
239
|
|
|
238
240
|
// ==========================================================================
|
|
239
|
-
// MARK: - Push Notification Methods (Android Implementation
|
|
241
|
+
// MARK: - Push Notification Methods (Android Implementation)
|
|
240
242
|
// ==========================================================================
|
|
241
243
|
//
|
|
242
|
-
// These methods
|
|
243
|
-
// Android push notifications typically use Firebase Cloud Messaging (FCM)
|
|
244
|
-
// and require different handling than iOS APNs.
|
|
244
|
+
// These methods provide Android push notification support.
|
|
245
245
|
//
|
|
246
|
-
//
|
|
247
|
-
//
|
|
248
|
-
//
|
|
249
|
-
// - Handle push notification opens and foreground notifications
|
|
250
|
-
// - Consider using the attentive-android-sdk's push notification features if available
|
|
246
|
+
// IMPORTANT NOTE: The Attentive Android SDK version 1.0.1 has limited push notification
|
|
247
|
+
// support compared to version 2.x. These methods provide logging and debugging infrastructure
|
|
248
|
+
// but may require SDK upgrade or custom implementation for full functionality.
|
|
251
249
|
//
|
|
252
|
-
//
|
|
253
|
-
// - registerForPushNotifications() - Request permission
|
|
254
|
-
// - registerDeviceToken() - Send token to backend
|
|
255
|
-
// - handlePushOpened() - Track push open events
|
|
256
|
-
// - handleForegroundNotification() - Handle foreground push display
|
|
250
|
+
// The iOS implementation uses APNs; Android uses Firebase Cloud Messaging (FCM).
|
|
257
251
|
// ==========================================================================
|
|
258
252
|
|
|
259
253
|
/**
|
|
260
254
|
* Request push notification permission from the user.
|
|
261
255
|
*
|
|
262
|
-
*
|
|
263
|
-
*
|
|
264
|
-
*
|
|
265
|
-
* - Initialize FCM and get the registration token
|
|
256
|
+
* On Android 13+ (API 33+), requests [android.permission.POST_NOTIFICATIONS] via the
|
|
257
|
+
* system dialog. On older versions, no-op (notifications allowed by default).
|
|
258
|
+
* Uses [AttentivePushHelper] for the actual request.
|
|
266
259
|
*/
|
|
267
260
|
override fun registerForPushNotifications() {
|
|
268
|
-
Log.i(TAG, "[
|
|
269
|
-
|
|
270
|
-
|
|
271
|
-
|
|
272
|
-
|
|
273
|
-
|
|
261
|
+
Log.i(TAG, "📱 [AttentiveSDK] registerForPushNotifications called (Android)")
|
|
262
|
+
|
|
263
|
+
UiThreadUtil.runOnUiThread {
|
|
264
|
+
val activity = reactApplicationContext.currentActivity
|
|
265
|
+
val requested = AttentivePushHelper.requestPermissionIfNeeded(activity, PUSH_PERMISSION_REQUEST_CODE)
|
|
266
|
+
if (!requested && activity == null) {
|
|
267
|
+
Log.w(TAG, " Current activity is null; permission request deferred. Call again when app is in foreground.")
|
|
268
|
+
}
|
|
269
|
+
if (debugHelper.isDebuggingEnabled()) {
|
|
270
|
+
val debugData = mutableMapOf<String, Any>()
|
|
271
|
+
debugData["platform"] = "Android"
|
|
272
|
+
debugData["request_started"] = requested
|
|
273
|
+
debugHelper.showDebugInfo("Push Registration Requested", debugData)
|
|
274
|
+
}
|
|
275
|
+
}
|
|
276
|
+
}
|
|
277
|
+
|
|
278
|
+
/**
|
|
279
|
+
* Returns the current push notification authorization status for Android.
|
|
280
|
+
*
|
|
281
|
+
* On API 33+: returns "authorized" if POST_NOTIFICATIONS is granted, else "notDetermined".
|
|
282
|
+
* On API < 33: returns "authorized" (no runtime permission required).
|
|
283
|
+
*/
|
|
284
|
+
override fun getPushAuthorizationStatus(promise: Promise) {
|
|
285
|
+
try {
|
|
286
|
+
val status = AttentivePushHelper.getAuthorizationStatus(reactApplicationContext)
|
|
287
|
+
Log.d(TAG, "getPushAuthorizationStatus: $status")
|
|
288
|
+
promise.resolve(status)
|
|
289
|
+
} catch (e: Exception) {
|
|
290
|
+
Log.e(TAG, "getPushAuthorizationStatus error: ${e.message}", e)
|
|
291
|
+
promise.reject("GET_STATUS_ERROR", e.message ?: "Unknown error", e)
|
|
292
|
+
}
|
|
274
293
|
}
|
|
275
294
|
|
|
276
295
|
/**
|
|
277
|
-
* Register the device token with the Attentive backend.
|
|
296
|
+
* Register the device token (FCM token) with the Attentive backend.
|
|
278
297
|
*
|
|
279
|
-
*
|
|
280
|
-
*
|
|
281
|
-
* - Token format and registration endpoint may differ
|
|
298
|
+
* This method attempts to register the FCM push token with the Attentive SDK.
|
|
299
|
+
* Note: The exact API for push token registration may vary by SDK version.
|
|
282
300
|
*
|
|
283
|
-
* @param token The FCM registration token
|
|
284
|
-
* @param authorizationStatus Push authorization status (
|
|
301
|
+
* @param token The FCM registration token from Firebase
|
|
302
|
+
* @param authorizationStatus Push authorization status (used for consistency with iOS)
|
|
285
303
|
*/
|
|
286
304
|
override fun registerDeviceToken(token: String, authorizationStatus: String) {
|
|
287
|
-
Log.i(TAG, "[
|
|
288
|
-
Log.
|
|
289
|
-
|
|
290
|
-
|
|
291
|
-
|
|
305
|
+
Log.i(TAG, "🎫 [AttentiveSDK] registerDeviceToken called (Android)")
|
|
306
|
+
Log.i(TAG, " Token (preview): ${token.take(16)}...")
|
|
307
|
+
Log.i(TAG, " Token length: ${token.length}")
|
|
308
|
+
Log.i(TAG, " Authorization status: $authorizationStatus")
|
|
309
|
+
|
|
310
|
+
try {
|
|
311
|
+
// Note: Attentive Android SDK 1.0.1 may not have direct push token registration
|
|
312
|
+
// For SDK version 2.x, use: AttentiveConfig.setDeviceToken() or similar
|
|
313
|
+
// For now, we log the token and make it available for custom implementation
|
|
314
|
+
|
|
315
|
+
Log.i(TAG, "⚠️ [AttentiveSDK] Push token registration requires manual implementation")
|
|
316
|
+
Log.i(TAG, " FCM token available: ${token.take(16)}...")
|
|
317
|
+
Log.i(TAG, " Store this token and register it with Attentive backend manually")
|
|
318
|
+
Log.i(TAG, " Or upgrade to Attentive Android SDK 2.x for built-in support")
|
|
319
|
+
|
|
320
|
+
if (debugHelper.isDebuggingEnabled()) {
|
|
321
|
+
val debugData = mutableMapOf<String, Any>()
|
|
322
|
+
debugData["token_preview"] = "${token.take(16)}..."
|
|
323
|
+
debugData["token_length"] = token.length.toString()
|
|
324
|
+
debugData["authorization_status"] = authorizationStatus
|
|
325
|
+
debugData["sdk_version"] = "1.0.1"
|
|
326
|
+
debugData["implementation_status"] = "manual_required"
|
|
327
|
+
debugHelper.showDebugInfo("Device Token (Android)", debugData)
|
|
328
|
+
}
|
|
329
|
+
} catch (e: Exception) {
|
|
330
|
+
Log.e(TAG, "❌ [AttentiveSDK] Error in registerDeviceToken: ${e.message}", e)
|
|
331
|
+
|
|
332
|
+
if (debugHelper.isDebuggingEnabled()) {
|
|
333
|
+
val debugData = mutableMapOf<String, Any>()
|
|
334
|
+
debugData["error"] = e.message ?: "Unknown error"
|
|
335
|
+
debugData["error_type"] = e.javaClass.simpleName
|
|
336
|
+
debugHelper.showDebugInfo("Device Token Registration Error", debugData)
|
|
337
|
+
}
|
|
338
|
+
}
|
|
339
|
+
}
|
|
340
|
+
|
|
341
|
+
/**
|
|
342
|
+
* Register the device token with callback for network response tracking.
|
|
343
|
+
*
|
|
344
|
+
* Note: The Android SDK version 1.0.1 doesn't provide a callback mechanism for
|
|
345
|
+
* push token registration. This method logs the token and invokes the callback
|
|
346
|
+
* immediately for consistency with the iOS API.
|
|
347
|
+
*
|
|
348
|
+
* @param token The FCM registration token
|
|
349
|
+
* @param authorizationStatus Push authorization status
|
|
350
|
+
* @param callback Callback invoked after registration attempt
|
|
351
|
+
*/
|
|
352
|
+
override fun registerDeviceTokenWithCallback(
|
|
353
|
+
token: String,
|
|
354
|
+
authorizationStatus: String,
|
|
355
|
+
callback: Callback
|
|
356
|
+
) {
|
|
357
|
+
Log.i(TAG, "🎫 [AttentiveSDK] registerDeviceTokenWithCallback called (Android)")
|
|
358
|
+
Log.i(TAG, " Token (preview): ${token.take(16)}...")
|
|
359
|
+
Log.i(TAG, " Authorization status: $authorizationStatus")
|
|
360
|
+
|
|
361
|
+
try {
|
|
362
|
+
// Register using the standard method (which logs the token)
|
|
363
|
+
registerDeviceToken(token, authorizationStatus)
|
|
364
|
+
|
|
365
|
+
// Invoke callback immediately with success response
|
|
366
|
+
val responseData = mapOf(
|
|
367
|
+
"success" to true,
|
|
368
|
+
"token" to "${token.take(16)}...",
|
|
369
|
+
"platform" to "Android",
|
|
370
|
+
"sdk_version" to "1.0.1",
|
|
371
|
+
"note" to "Manual push token registration required"
|
|
372
|
+
)
|
|
373
|
+
|
|
374
|
+
// Invoke callback with: data, url, response, error
|
|
375
|
+
callback.invoke(
|
|
376
|
+
responseData, // data
|
|
377
|
+
null, // url (not available in Android SDK)
|
|
378
|
+
mapOf("statusCode" to 200), // response
|
|
379
|
+
null // error
|
|
380
|
+
)
|
|
381
|
+
|
|
382
|
+
Log.i(TAG, "📥 [AttentiveSDK] Callback invoked with success response")
|
|
383
|
+
|
|
384
|
+
if (debugHelper.isDebuggingEnabled()) {
|
|
385
|
+
val debugData = mutableMapOf<String, Any>()
|
|
386
|
+
debugData["token_preview"] = "${token.take(16)}..."
|
|
387
|
+
debugData["authorization_status"] = authorizationStatus
|
|
388
|
+
debugData["callback_invoked"] = "true"
|
|
389
|
+
debugHelper.showDebugInfo("Device Token (with callback)", debugData)
|
|
390
|
+
}
|
|
391
|
+
} catch (e: Exception) {
|
|
392
|
+
Log.e(TAG, "❌ [AttentiveSDK] Error in registerDeviceTokenWithCallback: ${e.message}", e)
|
|
393
|
+
|
|
394
|
+
val errorData = mapOf(
|
|
395
|
+
"code" to 0,
|
|
396
|
+
"message" to (e.message ?: "Unknown error"),
|
|
397
|
+
"type" to e.javaClass.simpleName
|
|
398
|
+
)
|
|
399
|
+
|
|
400
|
+
// Invoke callback with error
|
|
401
|
+
callback.invoke(null, null, null, errorData)
|
|
402
|
+
|
|
403
|
+
if (debugHelper.isDebuggingEnabled()) {
|
|
404
|
+
val debugData = mutableMapOf<String, Any>()
|
|
405
|
+
debugData["error"] = e.message ?: "Unknown error"
|
|
406
|
+
debugData["error_type"] = e.javaClass.simpleName
|
|
407
|
+
debugHelper.showDebugInfo("Device Token Error (callback)", debugData)
|
|
408
|
+
}
|
|
409
|
+
}
|
|
410
|
+
}
|
|
411
|
+
|
|
412
|
+
/**
|
|
413
|
+
* Handle regular/direct app open (not from a push notification).
|
|
414
|
+
*
|
|
415
|
+
* This tracks app open events using the Attentive SDK's event tracking system.
|
|
416
|
+
*
|
|
417
|
+
* @param authorizationStatus Current push authorization status
|
|
418
|
+
*/
|
|
419
|
+
override fun handleRegularOpen(authorizationStatus: String) {
|
|
420
|
+
Log.i(TAG, "🌉 [AttentiveSDK] handleRegularOpen called (Android)")
|
|
421
|
+
Log.i(TAG, " Authorization status: $authorizationStatus")
|
|
422
|
+
Log.i(TAG, " Tracking regular app open event...")
|
|
423
|
+
|
|
424
|
+
try {
|
|
425
|
+
// Attentive Android SDK 1.0.1 doesn't have a built-in handleRegularOpen method
|
|
426
|
+
// We can track this as a custom event or use AttentiveEventTracker
|
|
427
|
+
|
|
428
|
+
// Option 1: Track as custom event
|
|
429
|
+
|
|
430
|
+
Log.i(TAG, " Tracking regular open as custom event 'app_open' with properties")
|
|
431
|
+
|
|
432
|
+
val properties = mapOf(
|
|
433
|
+
"event_type" to "app_open",
|
|
434
|
+
"authorization_status" to authorizationStatus,
|
|
435
|
+
"platform" to "Android"
|
|
436
|
+
)
|
|
437
|
+
|
|
438
|
+
try {
|
|
439
|
+
Log.i(TAG, " Attempting to track custom event for regular app open")
|
|
440
|
+
|
|
441
|
+
val customEvent = com.attentive.androidsdk.events.CustomEvent.Builder(
|
|
442
|
+
"app_open",
|
|
443
|
+
properties
|
|
444
|
+
).build()
|
|
445
|
+
|
|
446
|
+
Log.i(TAG, " Custom event built successfully, recording event...")
|
|
447
|
+
|
|
448
|
+
AttentiveEventTracker.getInstance().recordEvent(customEvent)
|
|
449
|
+
|
|
450
|
+
Log.i(TAG, "✅ [AttentiveSDK] handleRegularOpen completed (tracked as custom event)")
|
|
451
|
+
Log.i(TAG, " Event sent to Attentive backend")
|
|
452
|
+
} catch (e: Exception) {
|
|
453
|
+
Log.w(TAG, "⚠️ [AttentiveSDK] Could not track app open as custom event: ${e.message}")
|
|
454
|
+
Log.i(TAG, " App open tracking requires manual implementation or SDK upgrade")
|
|
455
|
+
}
|
|
456
|
+
|
|
457
|
+
if (debugHelper.isDebuggingEnabled()) {
|
|
458
|
+
val debugData = mutableMapOf<String, Any>()
|
|
459
|
+
debugData["authorization_status"] = authorizationStatus
|
|
460
|
+
debugData["event_type"] = "regular_open"
|
|
461
|
+
debugData["platform"] = "Android"
|
|
462
|
+
debugData["sdk_version"] = "1.0.1"
|
|
463
|
+
debugHelper.showDebugInfo("Regular Open Event", debugData)
|
|
464
|
+
}
|
|
465
|
+
} catch (e: Exception) {
|
|
466
|
+
Log.e(TAG, "❌ [AttentiveSDK] Error in handleRegularOpen: ${e.message}", e)
|
|
467
|
+
|
|
468
|
+
if (debugHelper.isDebuggingEnabled()) {
|
|
469
|
+
val debugData = mutableMapOf<String, Any>()
|
|
470
|
+
debugData["error"] = e.message ?: "Unknown error"
|
|
471
|
+
debugData["error_type"] = e.javaClass.simpleName
|
|
472
|
+
debugHelper.showDebugInfo("Regular Open Error", debugData)
|
|
473
|
+
}
|
|
474
|
+
}
|
|
475
|
+
}
|
|
476
|
+
|
|
477
|
+
/**
|
|
478
|
+
* Handle when a push notification is opened by the user (app in background/inactive state).
|
|
479
|
+
*
|
|
480
|
+
* This tracks push notification open events using the Attentive SDK's event tracking system.
|
|
481
|
+
*
|
|
482
|
+
* @param userInfo The notification payload
|
|
483
|
+
* @param authorizationStatus Current push authorization status
|
|
484
|
+
*/
|
|
485
|
+
override fun handlePushOpen(userInfo: ReadableMap, authorizationStatus: String) {
|
|
486
|
+
Log.i(TAG, "🔔 [AttentiveSDK] handlePushOpen called (Android)")
|
|
487
|
+
Log.i(TAG, " Authorization status: $authorizationStatus")
|
|
488
|
+
Log.i(TAG, " User opened push notification while app was in background/inactive")
|
|
489
|
+
|
|
490
|
+
try {
|
|
491
|
+
// Convert ReadableMap to HashMap for processing
|
|
492
|
+
val payload = userInfo.toHashMap()
|
|
493
|
+
|
|
494
|
+
Log.d(TAG, " Notification payload: $payload")
|
|
495
|
+
|
|
496
|
+
// Track push open as custom event
|
|
497
|
+
val properties = mutableMapOf<String, String>()
|
|
498
|
+
properties["event_type"] = "push_open"
|
|
499
|
+
properties["authorization_status"] = authorizationStatus
|
|
500
|
+
properties["platform"] = "Android"
|
|
501
|
+
|
|
502
|
+
// Add notification payload to properties (converting to strings)
|
|
503
|
+
payload.forEach { (key, value) ->
|
|
504
|
+
properties["notification_$key"] = value?.toString() ?: "null"
|
|
505
|
+
}
|
|
506
|
+
|
|
507
|
+
try {
|
|
508
|
+
val customEvent = com.attentive.androidsdk.events.CustomEvent.Builder(
|
|
509
|
+
"push_open",
|
|
510
|
+
properties
|
|
511
|
+
).build()
|
|
512
|
+
|
|
513
|
+
AttentiveEventTracker.getInstance().recordEvent(customEvent)
|
|
514
|
+
|
|
515
|
+
Log.i(TAG, "✅ [AttentiveSDK] handlePushOpen completed (tracked as custom event)")
|
|
516
|
+
Log.i(TAG, " Push open event sent to Attentive backend")
|
|
517
|
+
} catch (e: Exception) {
|
|
518
|
+
Log.w(TAG, "⚠️ [AttentiveSDK] Could not track push open as custom event: ${e.message}")
|
|
519
|
+
Log.i(TAG, " Push open tracking requires manual implementation or SDK upgrade")
|
|
520
|
+
}
|
|
521
|
+
|
|
522
|
+
if (debugHelper.isDebuggingEnabled()) {
|
|
523
|
+
val debugData = mutableMapOf<String, Any>()
|
|
524
|
+
debugData["authorization_status"] = authorizationStatus
|
|
525
|
+
debugData["event_type"] = "push_open"
|
|
526
|
+
debugData["platform"] = "Android"
|
|
527
|
+
debugData["payload_keys"] = payload.keys.joinToString(", ")
|
|
528
|
+
debugData["sdk_version"] = "1.0.1"
|
|
529
|
+
debugHelper.showDebugInfo("Push Open Event", debugData)
|
|
530
|
+
}
|
|
531
|
+
} catch (e: Exception) {
|
|
532
|
+
Log.e(TAG, "❌ [AttentiveSDK] Error in handlePushOpen: ${e.message}", e)
|
|
533
|
+
|
|
534
|
+
if (debugHelper.isDebuggingEnabled()) {
|
|
535
|
+
val debugData = mutableMapOf<String, Any>()
|
|
536
|
+
debugData["error"] = e.message ?: "Unknown error"
|
|
537
|
+
debugData["error_type"] = e.javaClass.simpleName
|
|
538
|
+
debugHelper.showDebugInfo("Push Open Error", debugData)
|
|
539
|
+
}
|
|
540
|
+
}
|
|
292
541
|
}
|
|
293
542
|
|
|
294
543
|
/**
|
|
295
|
-
* Handle
|
|
544
|
+
* Handle a push notification when the app is in the foreground (active state).
|
|
296
545
|
*
|
|
297
|
-
*
|
|
298
|
-
* - Track push open events with Attentive
|
|
299
|
-
* - Handle deep linking if present in payload
|
|
546
|
+
* This tracks foreground push notification events using the Attentive SDK's event tracking system.
|
|
300
547
|
*
|
|
301
|
-
* @param userInfo The notification payload
|
|
548
|
+
* @param userInfo The notification payload
|
|
549
|
+
* @param authorizationStatus Current push authorization status
|
|
550
|
+
*/
|
|
551
|
+
override fun handleForegroundPush(userInfo: ReadableMap, authorizationStatus: String) {
|
|
552
|
+
Log.i(TAG, "📱 [AttentiveSDK] handleForegroundPush called (Android)")
|
|
553
|
+
Log.i(TAG, " Authorization status: $authorizationStatus")
|
|
554
|
+
Log.i(TAG, " Push received while app was in foreground (active)")
|
|
555
|
+
|
|
556
|
+
try {
|
|
557
|
+
// Convert ReadableMap to HashMap for processing
|
|
558
|
+
val payload = userInfo.toHashMap()
|
|
559
|
+
|
|
560
|
+
Log.d(TAG, " Notification payload: $payload")
|
|
561
|
+
|
|
562
|
+
// Track foreground push as custom event
|
|
563
|
+
val properties = mutableMapOf<String, String>()
|
|
564
|
+
properties["event_type"] = "foreground_push"
|
|
565
|
+
properties["authorization_status"] = authorizationStatus
|
|
566
|
+
properties["platform"] = "Android"
|
|
567
|
+
|
|
568
|
+
// Add notification payload to properties (converting to strings)
|
|
569
|
+
payload.forEach { (key, value) ->
|
|
570
|
+
properties["notification_$key"] = value?.toString() ?: "null"
|
|
571
|
+
}
|
|
572
|
+
|
|
573
|
+
try {
|
|
574
|
+
val customEvent = com.attentive.androidsdk.events.CustomEvent.Builder(
|
|
575
|
+
"foreground_push",
|
|
576
|
+
properties
|
|
577
|
+
).build()
|
|
578
|
+
|
|
579
|
+
AttentiveEventTracker.getInstance().recordEvent(customEvent)
|
|
580
|
+
|
|
581
|
+
Log.i(TAG, "✅ [AttentiveSDK] handleForegroundPush completed (tracked as custom event)")
|
|
582
|
+
Log.i(TAG, " Foreground push event sent to Attentive backend")
|
|
583
|
+
} catch (e: Exception) {
|
|
584
|
+
Log.w(TAG, "⚠️ [AttentiveSDK] Could not track foreground push as custom event: ${e.message}")
|
|
585
|
+
Log.i(TAG, " Foreground push tracking requires manual implementation or SDK upgrade")
|
|
586
|
+
}
|
|
587
|
+
|
|
588
|
+
if (debugHelper.isDebuggingEnabled()) {
|
|
589
|
+
val debugData = mutableMapOf<String, Any>()
|
|
590
|
+
debugData["authorization_status"] = authorizationStatus
|
|
591
|
+
debugData["event_type"] = "foreground_push"
|
|
592
|
+
debugData["platform"] = "Android"
|
|
593
|
+
debugData["payload_keys"] = payload.keys.joinToString(", ")
|
|
594
|
+
debugData["sdk_version"] = "1.0.1"
|
|
595
|
+
debugHelper.showDebugInfo("Foreground Push Event", debugData)
|
|
596
|
+
}
|
|
597
|
+
} catch (e: Exception) {
|
|
598
|
+
Log.e(TAG, "❌ [AttentiveSDK] Error in handleForegroundPush: ${e.message}", e)
|
|
599
|
+
|
|
600
|
+
if (debugHelper.isDebuggingEnabled()) {
|
|
601
|
+
val debugData = mutableMapOf<String, Any>()
|
|
602
|
+
debugData["error"] = e.message ?: "Unknown error"
|
|
603
|
+
debugData["error_type"] = e.javaClass.simpleName
|
|
604
|
+
debugHelper.showDebugInfo("Foreground Push Error", debugData)
|
|
605
|
+
}
|
|
606
|
+
}
|
|
607
|
+
}
|
|
608
|
+
|
|
609
|
+
/**
|
|
610
|
+
* Handle when a push notification is opened by the user (legacy method).
|
|
611
|
+
*
|
|
612
|
+
* This is kept for backward compatibility with the iOS implementation.
|
|
613
|
+
* For new code, prefer using handlePushOpen or handleForegroundPush based on app state.
|
|
614
|
+
*
|
|
615
|
+
* @param userInfo The notification payload
|
|
302
616
|
* @param applicationState App state when notification was opened
|
|
303
617
|
* @param authorizationStatus Push authorization status
|
|
304
618
|
*/
|
|
@@ -307,30 +621,42 @@ class AttentiveReactNativeSdkModule(reactContext: ReactApplicationContext) :
|
|
|
307
621
|
applicationState: String,
|
|
308
622
|
authorizationStatus: String
|
|
309
623
|
) {
|
|
310
|
-
Log.i(TAG, "[
|
|
311
|
-
Log.
|
|
312
|
-
|
|
313
|
-
|
|
314
|
-
//
|
|
315
|
-
|
|
624
|
+
Log.i(TAG, "🔔 [AttentiveSDK] handlePushOpened called (Android - legacy method)")
|
|
625
|
+
Log.i(TAG, " App state: $applicationState")
|
|
626
|
+
Log.i(TAG, " Authorization status: $authorizationStatus")
|
|
627
|
+
|
|
628
|
+
// Route to the appropriate method based on application state
|
|
629
|
+
when (applicationState.lowercase()) {
|
|
630
|
+
"active" -> {
|
|
631
|
+
Log.i(TAG, " Routing to handleForegroundPush")
|
|
632
|
+
handleForegroundPush(userInfo, authorizationStatus)
|
|
633
|
+
}
|
|
634
|
+
"background", "inactive" -> {
|
|
635
|
+
Log.i(TAG, " Routing to handlePushOpen")
|
|
636
|
+
handlePushOpen(userInfo, authorizationStatus)
|
|
637
|
+
}
|
|
638
|
+
else -> {
|
|
639
|
+
Log.w(TAG, " Unknown application state, defaulting to handlePushOpen")
|
|
640
|
+
handlePushOpen(userInfo, authorizationStatus)
|
|
641
|
+
}
|
|
642
|
+
}
|
|
316
643
|
}
|
|
317
644
|
|
|
318
645
|
/**
|
|
319
|
-
* Handle when a push notification arrives while the app is in foreground.
|
|
646
|
+
* Handle when a push notification arrives while the app is in foreground (legacy method).
|
|
320
647
|
*
|
|
321
|
-
*
|
|
322
|
-
*
|
|
323
|
-
* - By default, FCM data messages don't show UI in foreground
|
|
324
|
-
* - Need to create NotificationCompat.Builder to show notification
|
|
648
|
+
* This is kept for backward compatibility with the iOS implementation.
|
|
649
|
+
* For new code, prefer using handleForegroundPush.
|
|
325
650
|
*
|
|
326
651
|
* @param userInfo The notification payload
|
|
327
652
|
*/
|
|
328
653
|
override fun handleForegroundNotification(userInfo: ReadableMap) {
|
|
329
|
-
Log.i(TAG, "[
|
|
330
|
-
|
|
331
|
-
|
|
332
|
-
//
|
|
333
|
-
//
|
|
654
|
+
Log.i(TAG, "📱 [AttentiveSDK] handleForegroundNotification called (Android - legacy method)")
|
|
655
|
+
Log.i(TAG, " Routing to handleForegroundPush with default authorization status")
|
|
656
|
+
|
|
657
|
+
// Route to handleForegroundPush with a default authorization status
|
|
658
|
+
// Note: Authorization status is less relevant on Android than iOS
|
|
659
|
+
handleForegroundPush(userInfo, "authorized")
|
|
334
660
|
}
|
|
335
661
|
|
|
336
662
|
private fun convertToStringMap(inputMap: Map<String, Any?>): Map<String, String> {
|