Giter VIP home page Giter VIP logo

braze-android-sdk's People

Contributors

billmag avatar briancaw avatar bryanlogan avatar bucimis avatar catacom avatar christorbraze avatar davidbielik avatar gkaffka avatar marchy avatar martinmcroyappboy avatar matrixy avatar mnonnenmacher avatar radixdev avatar tobiblas avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

braze-android-sdk's Issues

[Bug]: Crash - NoSuchFieldError - No static field Key of type CoroutineExceptionHandler

Braze Android SDK Version

30.0.0

Steps To Reproduce

Couldn't reproduce

Expected Behavior

Not crashing the app

Actual Incorrect Behavior

Crashing the app

Verbose Logs

Fatal Exception: java.lang.NoSuchFieldError: No static field Key of type Lkotlinx/coroutines/CoroutineExceptionHandler$Key; in class Lkotlinx/coroutines/CoroutineExceptionHandler; or its superclasses (declaration of 'kotlinx.coroutines.CoroutineExceptionHandler' appears in base.apk)
       at com.braze.coroutine.BrazeCoroutineScope.<clinit>(SourceFile:1)
       at com.braze.images.DefaultBrazeImageLoader.initDiskCacheTask(SourceFile:1)
       at com.braze.images.DefaultBrazeImageLoader.<init>(SourceFile:9)
       at com.braze.Braze.<init>(SourceFile:49)
       at com.braze.Braze$Companion.getInstance(SourceFile:4)
       at fr.vestiairecollective.BaseApplication.initBraze(BaseApplication.kt:385)
       at fr.vestiairecollective.BaseApplication.onCreate(BaseApplication.kt:105)
       at fr.vestiairecollective.app.VestiaireApplication.onCreate(VestiaireApplication.kt:27)
       at android.app.Instrumentation.callApplicationOnCreate(Instrumentation.java:1154)
       at androidx.test.runner.MonitoringInstrumentation.callApplicationOnCreate(MonitoringInstrumentation.java:2)
       at android.app.ActivityThread.handleBindApplication(ActivityThread.java:5871)
       at android.app.ActivityThread.access$1100(ActivityThread.java:199)
       at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1650)
       at android.os.Handler.dispatchMessage(Handler.java:106)
       at android.os.Looper.loop(Looper.java:193)
       at android.app.ActivityThread.main(ActivityThread.java:6669)
       at java.lang.reflect.Method.invoke(Method.java)
       at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:493)
       at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:858)

Additional Information

Since we have upgrade the SDK to the latest version 30.0.0 we are noticing some crash only for Rooted, Unknown device - GCE X86 Phone, Android 9

Screenshot at Feb 22 10-53-14

[Bug]: Content Cards impression not logged when setting vertical padding to `Braze.ContentCardsDisplay.Recycler`

Braze Android SDK Version

26.1.0; 23.2.1

Steps To Reproduce

  1. Define Braze.ContentCardsDisplay.Recycler style with vertical padding:
    <style name="Braze.ContentCardsDisplay.Recycler">
        <item name="android:paddingTop">4dp</item>
        <item name="android:paddingBottom">4dp</item>
    </style>
    
  2. Insert ContentCardsFragment
  3. Send a couple content cards
  4. Open the ContentCardsFragment screen
  5. Close the ContentCardsFragment screen

Expected Behavior

All cards that were on the screen should log impression.

Actual Incorrect Behavior

None of the cards are logging the impression. When debugging, I saw that layoutManager.findFirstVisibleItemPosition() and layoutManager.findLastVisibleItemPosition() always return -1.

Verbose Logs

16:59:29.869  V  The card at position 0 isn't on screen or does not have a valid adapter position. Not logging impression.
16:59:29.872  V  The card at position 1 isn't on screen or does not have a valid adapter position. Not logging impression.

Additional Information

No response

[Feature]: IsAnonymous getter for BrazeUser

What problem are you facing?

Since Braze doesn't support any logout method, we would like to identify if the current user is from fresh installation (anonymous state) or after user has logged out in order to deal with Braze events differently (log directly or queue upon next login)

Workarounds

Probably we can introduce a shared preference to indicate if the user has logged in before or not.

Ideal Solution

Ideally it would be nice if we could access the state directly from the Braze User.

Other Information

Alternatively I would like to confirm what is the specifications for BrazeUser.userId when the user is anonymous - will it return a UUID or an empty string? Tests so far (SDK 25.0.0) seems it is empty string.

[Bug]: Double Activity shows up on Android in Recents tasks when a Push Notification is Clicked

Braze Android SDK Version

28.0.0

Steps To Reproduce

  1. Setup the Firebase Push Sample app (under samples) by following the instructions described in its readme
  2. [Probably optional] Comment out L34 in MainActivity so that data is not flushed (ref)
  3. Build and install the Firebase push sample app on Android 14 (either emulator or physical device)
  4. Go to app's setting to manually enable notifications for it since the app doesn't request for push notification permissions.
  5. Open the sample app and set a user id
  6. Head over to the braze dashboard and send a test notification to the above user id.
  7. Click on the notification
  8. Observe that two two tasks (or activities) show up in Android's recent tasks drawer.

Attached video:
https://github.com/braze-inc/braze-android-sdk/assets/117751562/d7f78a90-83b4-47d4-a842-7e9cec22c117

Expected Behavior

The behavior is different from Android 13. When the same steps are followed on Android 13, only a single task shows in the Recent tasks drawer. Attached video for Android 13.

android_13_push_notification_works_as_expected.mp4

Actual Incorrect Behavior

Double tasks show up in Recent tasks drawer. One of them is the actual launched app and the other one is Braze's NotificationTrampolineActivity. Ideally, the trampoline activity should finish after launching the app. When you try clicking on the black activity (from recent tasks - as shown in video), it launches the app again.

Verbose Logs

2023-09-27 11:14:37.022   589-1046  ActivityTaskManager     system_server                        W  startActivity called from non-Activity context; forcing Intent.FLAG_ACTIVITY_NEW_TASK for: Intent { act=com.braze.action.BRAZE_PUSH_CLICKED cmp=com.remitly.androidapp.internal/com.braze.push.NotificationTrampolineActivity (has extras) }
2023-09-27 11:14:37.034   953-996   WindowManagerShell      com.android.systemui                 V  Transition requested: android.os.BinderProxy@dabc836 TransitionRequestInfo { type = OPEN, triggerTask = TaskInfo{userId=0 taskId=89 displayId=0 isRunning=true baseIntent=Intent { act=com.braze.action.BRAZE_PUSH_CLICKED flg=0x10000000 cmp=com.remitly.androidapp.internal/com.braze.push.NotificationTrampolineActivity } baseActivity=ComponentInfo{com.remitly.androidapp.internal/com.braze.push.NotificationTrampolineActivity} topActivity=ComponentInfo{com.remitly.androidapp.internal/com.braze.push.NotificationTrampolineActivity} origActivity=null realActivity=ComponentInfo{com.remitly.androidapp.internal/com.braze.push.NotificationTrampolineActivity} numActivities=1 lastActiveTime=11184812 supportsMultiWindow=true resizeMode=1 isResizeable=true minWidth=-1 minHeight=-1 defaultMinSize=220 token=WCT{android.window.IWindowContainerToken$Stub$Proxy@8e8e337} topActivityType=1 pictureInPictureParams=null shouldDockBigOverlays=false launchIntoPipHostTaskId=-1 lastParentTaskIdBeforePip=-1 displayCutoutSafeInsets=Rect(0, 128 - 0, 0) topActivityInfo=ActivityInfo{3edb0a4 com.braze.push.NotificationTrampolineActivity} launchCookies=[] positionInParent=Point(0, 0) parentTaskId=-1 isFocused=false isVisible=false isVisibleRequested=false isSleeping=false topActivityInSizeCompat=false topActivityEligibleForLetterboxEducation= false topActivityLetterboxed= false isFromDoubleTap= false topActivityLetterboxVerticalPosition= -1 topActivityLetterboxHorizontalPosition= -1 topActivityLetterboxWidth=-1 topActivityLetterboxHeight=-1 locusId=null displayAreaFeatureId=1 cameraCompatControlState=hidden}, remoteTransition = RemoteTransition { remoteTransition = com.android.systemui.shared.system.RemoteAnimationRunnerCompat$1@ade5e0d, appThread = null, debugName = SysUILaunch }, displayChange = null }
2023-09-27 11:14:37.035   589-1046  ActivityTaskManager     system_server                        I  START u0 {act=com.braze.action.BRAZE_PUSH_CLICKED cmp=com.remitly.androidapp.internal/com.braze.push.NotificationTrampolineActivity (has extras)} with LAUNCH_SINGLE_INSTANCE from uid 10194 (realCallingUid=10158) (BAL_ALLOW_PENDING_INTENT) result code=0
2023-09-27 11:14:37.133 28113-28113 Braze v28....ckListener com.remitly.androidapp.internal      V  Skipping automatic registration for notification trampoline activity class.
2023-09-27 11:14:37.133 28113-28113 Braze v28....neActivity com.remitly.androidapp.internal      V  NotificationTrampolineActivity created
2023-09-27 11:14:37.143 28113-28113 Braze v28....ckListener com.remitly.androidapp.internal      V  Skipping automatic registration for notification trampoline activity class.
2023-09-27 11:14:37.145 28113-28113 Braze v28....ckListener com.remitly.androidapp.internal      V  Skipping automatic registration for notification trampoline activity class.
2023-09-27 11:14:37.145 28113-28113 Braze v28....neActivity com.remitly.androidapp.internal      V  Notification trampoline activity received intent: Intent { act=com.braze.action.BRAZE_PUSH_CLICKED flg=0x10000000 cmp=com.remitly.androidapp.internal/com.braze.push.NotificationTrampolineActivity (has extras) }
2023-09-27 11:14:37.146 28113-28113 Braze v28....shReceiver com.remitly.androidapp.internal      I  Received broadcast message. Message: Intent { act=com.braze.action.BRAZE_PUSH_CLICKED cmp=com.remitly.androidapp.internal/com.braze.push.BrazePushReceiver (has extras) }
2023-09-27 11:14:37.146 28113-28113 Braze v28.0.0 .Braze    com.remitly.androidapp.internal      D  Applying any pending runtime configuration values
2023-09-27 11:14:37.148 28113-28113 Braze v28....ationUtils com.remitly.androidapp.internal      D  Sending notification opened broadcast
2023-09-27 11:14:37.149 28113-28113 Braze v28....ationUtils com.remitly.androidapp.internal      V  Sending Braze broadcast receiver intent for OPENED
2023-09-27 11:14:37.149 28113-28113 Braze v28....ationUtils com.remitly.androidapp.internal      V  Sending push action intent: Intent { act=com.braze.push.intent.NOTIFICATION_OPENED pkg=com.remitly.androidapp.internal }
2023-09-27 11:14:37.150 28113-28113 Braze v28.0.0 .x0       com.remitly.androidapp.internal      D  com.braze.events.BrazePushEvent fired:
                                                                                                    BrazePushEvent(eventType=NOTIFICATION_OPENED, notificationPayload=
                                                                                                    IsPushStory = false
                                                                                                    IsInlineImagePush = false
                                                                                                    IsConversationalPush = false
                                                                                                    NotificationChannelId = com_appboy_default_notification_channel
                                                                                                    NotificationReceivedTimestampMillis = 1695838458345
                                                                                                    TitleText = Test push - Deeplink
                                                                                                    ContentText = Push sent - Open to deeplink
                                                                                                    AccentColor = -12038445
                                                                                                    ActionButtons = []
                                                                                                    PushStoryPageIndex = 0
                                                                                                    PushStoryPages = []
                                                                                                    ConversationMessages = []
                                                                                                    ConversationPersonMap = {}
                                                                                                    PushDeliveryEnabled = false)
2023-09-27 11:14:37.150 28113-28113 Braze v28.0.0 .x0       com.remitly.androidapp.internal      D  Triggering com.braze.events.BrazePushEvent on 0 subscribers.
2023-09-27 11:14:37.150 28113-28113 Braze v28.0.0 .x0       com.remitly.androidapp.internal      D  Triggering com.braze.events.BrazePushEvent on 0 subscribers.
2023-09-27 11:14:37.151 28113-28113 Braze v28.0.0 .x0       com.remitly.androidapp.internal      I  Event was published, but no subscribers were found. Saving event for later publishing to a matching subscriber. Event class: class com.braze.events.BrazePushEvent
2023-09-27 11:14:37.151 28113-28113 Braze v28....onProvider com.remitly.androidapp.internal      D  Using runtime override value for key: 'com_braze_handle_push_deep_links_automatically' and value: 'true'
2023-09-27 11:14:37.154 28113-28113 Braze v28....ationUtils com.remitly.androidapp.internal      D  Push notification had no deep link. Opening main activity: Intent { act=android.intent.action.MAIN cat=[android.intent.category.LAUNCHER] flg=0x34000000 pkg=com.remitly.androidapp.internal cmp=com.remitly.androidapp.internal/com.braze.firebasepush.MainActivity (has extras) }
2023-09-27 11:14:37.163 28113-28147 Braze v28.0.0 .t        com.remitly.androidapp.internal      D  Getting the stored open session
2023-09-27 11:14:37.164   589-1026  ActivityTaskManager     system_server                        I  START u0 {act=android.intent.action.MAIN cat=[android.intent.category.LAUNCHER] flg=0x34000000 pkg=com.remitly.androidapp.internal cmp=com.remitly.androidapp.internal/com.braze.firebasepush.MainActivity (has extras)} with LAUNCH_SINGLE_TASK from uid 10194 (BAL_ALLOW_VISIBLE_WINDOW) result code=0
2023-09-27 11:14:37.165 28113-28113 Braze v28....neActivity com.remitly.androidapp.internal      V  Notification trampoline activity finished processing. Delaying before finishing activity.
2023-09-27 11:14:37.166 28113-28147 Braze v28.0.0 .t        com.remitly.androidapp.internal      D  Checking if this session needs to be sealed: 82f933d2-09b0-45e7-9130-dbc18fcfb688
2023-09-27 11:14:37.167 28113-28147 Braze v28.0.0 .t        com.remitly.androidapp.internal      I  Session [82f933d2-09b0-45e7-9130-dbc18fcfb688] being sealed because its end time is over the grace period. Session: 
                                                                                                    MutableSession(sessionId=82f933d2-09b0-45e7-9130-dbc18fcfb688, startTime=1.695808795178E9, endTime=1.695808795204E9, isSealed=false, duration=0)
2023-09-27 11:14:37.168 28113-28147 Braze v28.0.0 .x0       com.remitly.androidapp.internal      D  bo.app.g5 fired:
                                                                                                    SessionSealedEvent(sealedSession=
                                                                                                    MutableSession(sessionId=82f933d2-09b0-45e7-9130-dbc18fcfb688, startTime=1.695808795178E9, endTime=1.695809775876E9, isSealed=true, duration=980))
2023-09-27 11:14:37.169 28113-28147 Braze v28.0.0 .x0       com.remitly.androidapp.internal      D  Triggering bo.app.g5 on 0 subscribers.
2023-09-27 11:14:37.169 28113-28147 Braze v28.0.0 .x0       com.remitly.androidapp.internal      D  Triggering bo.app.g5 on 1 subscribers.
2023-09-27 11:14:37.171 28113-28147 Braze v28.0.0 .o        com.remitly.androidapp.internal      D  Not adding session id to event: {
                                                                                                      "name": "se",
                                                                                                      "data": {
                                                                                                        "d": 980
                                                                                                      },
                                                                                                      "time": 1.695809775879E9,
                                                                                                      "session_id": "82f933d2-09b0-45e7-9130-dbc18fcfb688"
                                                                                                    }
2023-09-27 11:14:37.173 28113-28147 Braze v28.0.0 .o        com.remitly.androidapp.internal      V  Attempting to log event: {
                                                                                                      "name": "se",
                                                                                                      "data": {
                                                                                                        "d": 980
                                                                                                      },
                                                                                                      "time": 1.695809775879E9,
                                                                                                      "user_id": "my-user-id",
                                                                                                      "session_id": "82f933d2-09b0-45e7-9130-dbc18fcfb688"
                                                                                                    }
2023-09-27 11:14:37.178 28113-28145 Braze v28.0.0 .k5       com.remitly.androidapp.internal      D  Adding event to storage with uid d98b0c57-e845-4e3e-be19-24d4de05a4cc
2023-09-27 11:14:37.181 28113-28147 Braze v28.0.0 .x0       com.remitly.androidapp.internal      D  bo.app.m0 fired:
                                                                                                    commandType = ADD_BRAZE_EVENT
                                                                                                    brazeEvent = {"name":"se","data":{"d":980},"time":1.695809775879E9,"user_id":"my-user-id","session_id":"82f933d2-09b0-45e7-9130-dbc18fcfb688"}
                                                                                                    sessionId = null
                                                                                                    brazeRequest = null
2023-09-27 11:14:37.181 28113-28147 Braze v28.0.0 .x0       com.remitly.androidapp.internal      D  Triggering bo.app.m0 on 0 subscribers.
2023-09-27 11:14:37.181 28113-28147 Braze v28.0.0 .x0       com.remitly.androidapp.internal      D  Triggering bo.app.m0 on 1 subscribers.
2023-09-27 11:14:37.185 28113-28147 Braze v28.0.0 .w0       com.remitly.androidapp.internal      D  Performing push delivery event flush
2023-09-27 11:14:37.187 28113-28147 Braze v28.0.0 .o        com.remitly.androidapp.internal      D  Attempted to flush Push Delivery events, but no events are available
2023-09-27 11:14:37.188 28113-28147 Braze v28.0.0 .x0       com.remitly.androidapp.internal      D  com.braze.events.SessionStateChangedEvent fired:
                                                                                                    SessionStateChangedEvent{sessionId='82f933d2-09b0-45e7-9130-dbc18fcfb688', eventType='SESSION_ENDED'}'

Additional Information

While debugging i found it useful to use dumpsys to get activity logs.

adb shell dumpsys activity >> output.txt

In these logs, we can search for ACTIVITY MANAGER RECENT TASKS (dumpsys activity recents) and find the Visible recent tasks.

[Bug]: getInstance(Context) method may unexpectedly provide different Braze instances

Braze Android SDK Version

30.0.0

Steps To Reproduce

Create two singleton entities with a Braze instance field (created with the same Context instance)

class BrazeContentCardsHandler(private val braze: IBraze)
class BrazeAnalyticsHandler(private val braze: IBraze)

Expected Behavior

As specified in a KDoc, the same Braze instance (singleton) should be provided

Actual Incorrect Behavior

Sometimes two different instances are created with the first being isInstanceStopped == true

Screenshot 2024-03-05 at 14 03 41

Verbose Logs

No response

Additional Information

No response

[Bug]: Strict Mode in In-app messages

Braze Android SDK Version

29.0.1

Steps To Reproduce

Incoming html in-app messages on a device

Expected Behavior

Not have an alert about strict mode

Actual Incorrect Behavior

We have an alert

Process:X, PID: 2426 android.os.strictmode.DiskReadViolation at android.os.StrictMode$AndroidBlockGuardPolicy.onReadFromDisk(StrictMode.java:1658) at libcore.io.BlockGuardOs.access(BlockGuardOs.java:74) at libcore.io.ForwardingOs.access(ForwardingOs.java:128) at android.app.ActivityThread$AndroidOs.access(ActivityThread.java:7795) at java.io.UnixFileSystem.checkAccess(UnixFileSystem.java:313) at java.io.File.exists(File.java:813) at android.app.ContextImpl.getDataDir(ContextImpl.java:2962) at android.app.ContextImpl.getPreferencesDir(ContextImpl.java:704) at android.app.ContextImpl.getSharedPreferencesPath(ContextImpl.java:931) at android.app.ContextImpl.getSharedPreferences(ContextImpl.java:553) at android.content.ContextWrapper.getSharedPreferences(ContextWrapper.java:217) at android.content.ContextWrapper.getSharedPreferences(ContextWrapper.java:217) at com.braze.configuration.RuntimeAppConfigurationProvider.<init>(SourceFile:2) at com.braze.configuration.CachedConfigurationProvider.<init>(SourceFile:16) at com.braze.configuration.BrazeConfigurationProvider.<init>(SourceFile:1) at com.braze.ui.inappmessage.views.InAppMessageHtmlBaseView.getMessageWebView(InAppMessageHtmlBaseView.kt:108) at com.braze.ui.inappmessage.views.InAppMessageHtmlBaseView.setWebViewContent(InAppMessageHtmlBaseView.kt:215) at com.braze.ui.inappmessage.views.InAppMessageHtmlBaseView.setWebViewContent$default(InAppMessageHtmlBaseView.kt:210) at com.braze.ui.inappmessage.factories.DefaultInAppMessageHtmlViewFactory.createInAppMessageView(DefaultInAppMessageHtmlViewFactory.kt:43) at com.braze.ui.inappmessage.factories.DefaultInAppMessageHtmlViewFactory.createInAppMessageView(DefaultInAppMessageHtmlViewFactory.kt:22) at com.braze.ui.inappmessage.BrazeInAppMessageManager.displayInAppMessage(BrazeInAppMessageManager.kt:520) at com.braze.ui.inappmessage.utils.BackgroundInAppMessagePreparer$displayPreparedInAppMessage$2.invokeSuspend(BackgroundInAppMessagePreparer.kt:274) at kotlin.coroutines.jvm.internal.BaseContinuationImpl.resumeWith(ContinuationImpl.kt:33) at kotlinx.coroutines.DispatchedTask.run(DispatchedTask.kt:108) at android.os.Handler.handleCallback(Handler.java:942) at android.os.Handler.dispatchMessage(Handler.java:99) at android.os.Looper.loopOnce(Looper.java:201) at android.os.Looper.loop(Looper.java:288) at android.app.ActivityThread.main(ActivityThread.java:7918) at java.lang.reflect.Method.invoke(Native Method) at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:548) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:936)

Verbose Logs

No response

Additional Information

No response

[Bug]: Android resource linking failed

Braze Android SDK Version

29.0.1

Steps To Reproduce

Android resource linking failed
/root/.gradle/caches/transforms-3/c65ea9d3bc20d0320da8dfecbb75b1d3/transformed/commons-0.8.5.5/res/layout/md_preference_custom.xml:21: warn: generated id 'android:id/icon' for external package 'android'.
error: resource style/Braze.ContentCards.BannerImage (aka com.*.mobile.debug:style/Braze.ContentCards.BannerImage) not found.
error: failed linking references.

Expected Behavior

I am not able to sync the project because of this issue while trying to upgarde the braze sdk this issue starts coming from version 29

Actual Incorrect Behavior

NA

Verbose Logs

NA

Additional Information

NA

the return value of remoteMessage.getNotification() is null.

Braze Android SDK Version

com.braze:android-sdk-ui:24.3.0

Steps To Reproduce

Test Braze push notification.

by Braze dashboard creat campaign and send push notification.

image

I already have a Firebase Messaging Service registered ------> MySelfFCMService

public class MySelfFCMService extends FirebaseMessagingService {
@OverRide
public void onNewToken(@nonnull String token) {
super.onNewToken(token);
}
@OverRide
public void onMessageReceived(@nonnull RemoteMessage remoteMessage) {
super.onMessageReceived(remoteMessage);
// if (BrazeFirebaseMessagingService.handleBrazeRemoteMessage(this, remoteMessage)) {
// // This Remote Message originated from Braze and a push notification was displayed.
// // No further action is needed.
// return;
// }
RemoteMessage.Notification notification = remoteMessage.getNotification();
if (notification != null) {
String title = notification.getTitle();
String body = notification.getBody();
}
}
@OverRide
public void onDeletedMessages() {
super.onDeletedMessages();
}
}

When I clicked the Send Test button,

unnamed

the method onMessageReceived(@nonnull RemoteMessage remoteMessage) of the MySelfFCMService class was called.

However, I am unable to obtain the title and body of this notification through the class RemoteMessage.Notification.

    RemoteMessage.Notification notification = remoteMessage.getNotification();
    if (notification != null) {
        String title = notification.getTitle();
        String body = notification.getBody();
    }

Because the return value of remoteMessage.getNotification() is null. notification == null ,I cannot execute the following code:

        String title = notification.getTitle();
        String body = notification.getBody();

But, by firebase dashboard send push notification ,
I can obtain the title and body through notification,

    if (notification != null) {
        String title = notification.getTitle();
        String body = notification.getBody();
    }

Expected Behavior

if (notification != null) {
String title = notification.getTitle();
String body = notification.getBody();
}

Actual Incorrect Behavior

the return value of remoteMessage.getNotification() is null. notification == null ,I cannot execute the following code:

        String title = notification.getTitle();
        String body = notification.getBody();

Verbose Logs

No response

Additional Information

I want to know if this situation is normal?

Is this result caused by an issue with my operating steps on the Braze dashboard?

Is that the design of Braze Sdk?

[Bug]: Crash in HTML IAM when calling `window.open`

Braze Android SDK Version

26.3.2

Steps To Reproduce

Hello, after an upgrade from 25 to 26.3.2 (React Native module 5 => 6), we noticed that the app crashes when a user clicks on the following "Close" link. It seems related to window.open.

<html>
<meta charset="utf-8">
<meta name="viewport" content="viewport-fit=cover, initial-scale=1, maximum-scale=1">
<body style="padding: 50px;">
<a href="#" onclick="window.open('myScheme://myPath')">Close</a>
</body>
</html>

Note that a button will do nothing but won't crash.

Stacktrace below :

System.err  W  android.os.FileUriExposedException: file://null/# exposed beyond app through Intent.getData()
                         W      at android.os.StrictMode.onFileUriExposed(StrictMode.java:2208)
                         W      at android.net.Uri.checkFileUriExposed(Uri.java:2407)
                         W      at android.content.Intent.prepareToLeaveProcess(Intent.java:11914)
                         W      at android.content.Intent.prepareToLeaveProcess(Intent.java:11863)
                         W      at android.app.Instrumentation.execStartActivity(Instrumentation.java:1833)
                         W      at android.app.Activity.startActivityForResult(Activity.java:5507)
                         W      at androidx.activity.ComponentActivity.startActivityForResult(ComponentActivity.java:597)
                         W      at android.app.Activity.startActivityForResult(Activity.java:5465)
                         W      at androidx.activity.ComponentActivity.startActivityForResult(ComponentActivity.java:583)
                         W      at android.app.Activity.startActivity(Activity.java:5963)
                         W      at android.app.Activity.startActivity(Activity.java:5930)
                         W      at com.braze.ui.inappmessage.views.InAppMessageHtmlBaseView$messageWebView$7.onCreateWindow(InAppMessageHtmlBaseView.kt:147)

Expected Behavior

No crash

Actual Incorrect Behavior

Crashes

Verbose Logs

No response

Additional Information

This works great on iOS and on the Android SDK 25.

Note that replacing the redirection with window.location.href = somehow works.

<a href="#" onclick="window.location.href = 'myScheme://myPath'">Close</a>

[Bug]: Braze Accent Color

Braze Android SDK Version

25.0.0

Steps To Reproduce

I tried to use the accent icon color function in the Braze function, but the colors don't seem to be compatible.
(https://www.braze.com/docs/developer_guide/platform_integration_guides/android/push_notifications/android/integration/standard_integration/#step-3-configure-notification-icons)

Expected Behavior

To confirm proper color application, we only carried out a basic push-linked campaign.

Actual Incorrect Behavior

We know that starting from Android specifiy version and higher, the icon color changes differently depending on the user-defined theme, but the braze icon accent color is not applied properly even when the theme is not applied.

Verbose Logs

There is no separate verbose log, and we share the braze xml file applied by the customer.

[braze.xml]

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <string name="com_braze_custom_endpoint" translatable="false">sdk.iad-05.braze.com</string>

    <bool name="com_braze_firebase_cloud_messaging_registration_enabled" translatable="false">true</bool>

    <bool name="com_braze_handle_push_deep_links_automatically">true</bool>
    <bool name="com_braze_push_deep_link_back_stack_activity_enabled">true</bool>
    <string name="com_braze_push_deep_link_back_stack_activity_class_name">com.app.celebshop.main.MainActivity</string>

    <drawable name="com_braze_push_small_notification_icon">@drawable/ic_small_launcher</drawable>
    <drawable name="com_braze_push_large_notification_icon">@mipmap/ic_launcher</drawable>
    <color name="com_braze_default_notification_accent_color">@color/sys_background_coral</color>
    <bool name="com_braze_push_notification_html_rendering_enabled" translatable="false">true</bool>
</resources>

Additional Information

스크린샷 2023-10-10 오전 9 53 13 [Braze_icon_image.zip](https://github.com/braze-inc/braze-android-sdk/files/12851600/Braze_icon_image.zip)

[Bug]: Content Card is not enabled when upgrading Braze SDK

Braze Android SDK Version

Migrate between version e.g. 25.0.0 to 26.0.0

Steps To Reproduce

  1. Run app with Braze 25.0.0 and switch user - check to receive updates etc.
  2. Close app, update SDK to 26.0.0 and install the update
class BrazeManager {

    private lateinit var brazeInstance: Braze

    fun init(application: Application) {
        BrazeLogger.logLevel = Log.VERBOSE
        brazeInstance = Braze.getInstance(application)
        application.registerActivityLifecycleCallbacks(
            BrazeActivityLifecycleCallbackListener(
                true,
                true,
                emptySet(),
                null
            )
        )
        // Request content card update after braze init
        requestContentCards()
    }

    fun switchUser(userId: String) {
        brazeInstance.changeUser(userId)
    }

     fun requestContentCards(cache: Boolean = false) = runBlocking {
        val result = suspendCoroutineWithTimeout<List<Card>>(30_000) { continuation ->
            var contentCardsUpdatedSubscriber: IEventSubscriber<ContentCardsUpdatedEvent>? = null
            contentCardsUpdatedSubscriber = IEventSubscriber { event ->
               // unsubscribe
                contentCardsUpdatedSubscriber?.let {
                    brazeInstance.removeSingleSubscription(
                        it, ContentCardsUpdatedEvent::class.java
                    )
                }
                // Return value
                continuation.resume(event.allCards)
            }
            brazeInstance.subscribeToContentCardsUpdates(
                contentCardsUpdatedSubscriber
            )
            brazeInstance.requestContentCardsRefresh(cache)
        }
        Log.wtf("braze", "result: ${result?.size}")
    }
 }    
 
 private suspend inline fun <T> suspendCoroutineWithTimeout(
    timeout: Long,
    crossinline block: (Continuation<T>) -> Unit
): T? {
    var finalValue: T? = null
    withTimeoutOrNull(timeout) {
        finalValue = suspendCancellableCoroutine(block = block)
    }
    return finalValue
}

Expected Behavior

Requesting Content Card update after SDK upgrade will succeed and return content cards from Braze backend

Actual Incorrect Behavior

subscribeToContentCardsUpdates callback won't return within the 30 seconds timeout (probably would never return) and LogCat states that no request was done because:

Content Cards is not enabled, skipping API call to refresh

Verbose Logs

---------------------------- PROCESS STARTED (11106) for package com.xxxx.debug ----------------------------
2023-06-09 14:10:43.883 11106-11106 Braze v26.0.0 .Braze     V  The instance is null. Allowing instance initialization
2023-06-09 14:10:43.883 11106-11106 Braze v26.0.0 .Braze     V  The instance is null. Allowing instance initialization
2023-06-09 14:10:43.883 11106-11106 Braze v26.0.0 .Braze     D  Braze SDK Initializing
2023-06-09 14:10:43.894 11106-11143 Braze v26....mageLoader  D  Initializing disk cache
2023-06-09 14:10:43.895 11106-11106 Braze v26.0.0 .Braze     D  Braze SDK loaded in 12 ms.
2023-06-09 14:10:43.898 11106-11106 Braze v26....ckListener  V  BrazeActivityLifecycleCallbackListener using in-app messaging blocklist: []
2023-06-09 14:10:43.899 11106-11106 Braze v26....ckListener  V  BrazeActivityLifecycleCallbackListener using session handling blocklist: []
2023-06-09 14:10:43.902 11106-11147 Braze v26.0.0 .Braze     D  Applying any pending runtime configuration values
2023-06-09 14:10:43.902 11106-11143 Braze v26....mageLoader  D  Disk cache initialized
2023-06-09 14:10:43.905 11106-11147 Braze v26....onProvider  D  Using resources value for key: 'com_braze_api_key' and value: 'xxxxxx'
2023-06-09 14:10:43.905 11106-11147 Braze v26....onProvider  D  Unable to find the xml INTEGER configuration value with primary key 'com_braze_logger_initial_log_level'. Using default value '4'.
2023-06-09 14:10:43.906 11106-11147 Braze v26....onProvider  D  Using resources value for key: 'com_braze_logger_initial_log_level' and value: '4'
2023-06-09 14:10:43.913 11106-11147 Braze v26....onProvider  D  Using resources value for key: 'com_braze_custom_endpoint' and value: 'sdk.iad-01.braze.com'
2023-06-09 14:10:43.914 11106-11147 Braze v26....onProvider  D  Using resources value for key: 'com_braze_firebase_cloud_messaging_registration_enabled' and value: 'true'
2023-06-09 14:10:43.917 11106-11147 Braze v26.0.0 .Braze     I  Firebase Cloud Messaging found. Setting up Firebase Cloud Messaging.
2023-06-09 14:10:43.917 11106-11147 Braze v26....onProvider  D  Using resources value for key: 'com_braze_firebase_cloud_messaging_sender_id' and value: 'xxxxxxx'
2023-06-09 14:10:43.918 11106-11147 Braze v26....onProvider  D  Unable to find the xml BOOLEAN configuration value with primary key 'com_braze_push_adm_messaging_registration_enabled'. Using default value 'false'.
2023-06-09 14:10:43.918 11106-11147 Braze v26....onProvider  D  Using resources value for key: 'com_braze_push_adm_messaging_registration_enabled' and value: 'false'
2023-06-09 14:10:43.918 11106-11147 Braze v26.0.0 .Braze     I  Automatic ADM registration not enabled in configuration. Braze will not register for ADM.
2023-06-09 14:10:43.919 11106-11147 Braze v26.0.0 .Braze     V  Starting up a new user dependency manager
2023-06-09 14:10:43.931 11106-11147 Braze v26....dPrefUtils  V  Detected SDK update from '25.0.0' -> '26.0.0'. Clearing com.braze.storage.server_config.a8781125-b32e-458b-9700-b9711b1d2f50 storage.
2023-06-09 14:10:43.940 11106-11147 Braze v26....onProvider  D  Using resources value for key: 'com_braze_session_timeout' and value: '2700'
2023-06-09 14:10:43.940 11106-11147 Braze v26....onProvider  D  Unable to find the xml BOOLEAN configuration value with primary key 'com_braze_session_start_based_timeout_enabled'. Using default value 'false'.
2023-06-09 14:10:43.940 11106-11147 Braze v26....onProvider  D  Using resources value for key: 'com_braze_session_start_based_timeout_enabled' and value: 'false'
2023-06-09 14:10:43.950 11106-11147 Braze v26....onProvider  D  Unable to find the xml INTEGER configuration value with primary key 'com_braze_trigger_action_minimum_time_interval_seconds'. Using default value '30'.
2023-06-09 14:10:43.950 11106-11147 Braze v26....onProvider  D  Using resources value for key: 'com_braze_trigger_action_minimum_time_interval_seconds' and value: '30'
2023-06-09 14:10:43.953 11106-11147 Braze v26.0.0 .g6        D  Retrieving trigger local asset path '/data/user/0/com.xxxx.debug/cache/ab_triggers/500368795.png' from local storage for remote path 'https://braze-images.com/appboy/communication/marketing/slide_up/slide_up_message_parameters/images/6170fd59ee9f6f1aa2584bc9/19dc5aa81389dd9e8a3b7cc0cc6505eefc236555/original.png?1634794844'
2023-06-09 14:10:43.953 11106-11147 Braze v26.0.0 .g6        D  Retrieving trigger local asset path '/data/user/0/com.xxxx.debug/cache/ab_triggers/1025422296.png' from local storage for remote path 'https://braze-images.com/appboy/communication/marketing/slide_up/slide_up_message_parameters/images/6180a89e3fe96a3df4026148/676f19f018a09dfd5dc8830e4ad802ab62311108/original.png?1635821730'
2023-06-09 14:10:43.953 11106-11147 Braze v26.0.0 .g6        D  Retrieving trigger local asset path '/data/user/0/com.xxxx.debug/cache/ab_triggers/925351799.png' from local storage for remote path 'https://braze-images.com/appboy/communication/marketing/slide_up/slide_up_message_parameters/images/62fa15b059fdd24f2ab797d2/de81351e4a783038063125754f17dceeb5b59e0f/original.png?1660891117'
2023-06-09 14:10:43.953 11106-11147 Braze v26.0.0 .g6        D  Retrieving trigger local asset path '/data/user/0/com.xxxx.debug/cache/ab_triggers/408190321.png' from local storage for remote path 'https://braze-images.com/appboy/communication/marketing/slide_up/slide_up_message_parameters/images/62624497f5f4207b248d9454/37b72f338ee9b8114b61ccaa4b16a6feaae178ff/original.png?1650607780'
2023-06-09 14:10:43.953 11106-11147 Braze v26.0.0 .g6        D  Retrieving trigger local asset path '/data/user/0/com.xxxx.debug/cache/ab_triggers/427599600.png' from local storage for remote path 'https://braze-images.com/appboy/communication/marketing/slide_up/slide_up_message_parameters/images/62fa12f42876cd1a2cec1852/fca7d1258b62065f75296896a01e32f5f48f7806/original.png?1662347838'
2023-06-09 14:10:43.953 11106-11147 Braze v26.0.0 .g6        D  Retrieving trigger local asset path '/data/user/0/com.xxxx.debug/cache/ab_triggers/913084475.png' from local storage for remote path 'https://braze-images.com/appboy/communication/marketing/slide_up/slide_up_message_parameters/images/62fa15333352c671bc300a96/a9535c4ea28795c71ba4173bf7495ee513059d06/original.png?1660889826'
2023-06-09 14:10:43.961 11106-11147 Braze v26.0.0 .f3        V  Attempting to parse in-app message triggered action with JSON: {
      "re_eligibility": -1,
      "start_time": 1631160900,
      "end_time": -1,
      "priority": 2000176000,
      "min_seconds_since_last_trigger": -1,
      "timeout": -1,
      "delay": 0,
      "id": "62fa15b059fdd2xxxxx",
      "trigger_condition": [...],
      "prefetch": true,
      "data": {
        "message": "",
        "click_action": "URI",
        "uri": "xxxx",
        "use_webview": null,
        "type": "MODAL",
        "message_close": "SWIPE",
        "image_url": "https:\/\/braze-images.com\/appboy\/communication\/marketing\/slide_up\/slide_up_message_parameters\/images\/62fa15b059fdd24f2ab797d2\/de81351e4a783038063125754f17dceeb5b59e0f\/xxxx.png?1660891117",
        "image_style": "GRAPHIC",
        "close_btn_color": 4291085508,
        "bg_color": 4294243575,
        "frame_color": 3207803699,
        "trigger_id": "NjJmYTE1YjA1OWZkZDI0ZjJhYjc5N2U4XyRfbXY9NjJmYTE1YjA1OWZkZDI0ZjJhYjc5N2Q2JnBpPWNtcA=="
      },
      "type": "inapp"
    }
2023-06-09 14:10:43.969 11106-11147 Braze v26....ssageModal  D  Requested in-app message duration 0 is lower than the minimum of 999. Defaulting to 5000 milliseconds.
2023-06-09 14:10:43.970 11106-11147 Braze v26.....bo.app.o6  D  Retrieving templated triggered action id 62fa15b059fdd24f2ab797e8 from local storage.
2023-06-09 14:10:43.982 11106-11147 Braze v26.....bo.app.o6  V  Subscribing to trigger dispatch events.
2023-06-09 14:10:43.984 11106-11147 Braze v26....onProvider  D  Unable to find the xml STRING_ARRAY configuration value with primary key 'com_braze_custom_location_providers_list'. Using default value '[]'.
2023-06-09 14:10:43.984 11106-11147 Braze v26....onProvider  D  Using resources value for key: 'com_braze_custom_location_providers_list' and value: '[]'
2023-06-09 14:10:43.986 11106-11147 Braze v26....nceManager  D  Did not find stored geofences.
2023-06-09 14:10:43.987 11106-11147 Braze v26....nceManager  I  Geofences implicitly disabled via server configuration.
2023-06-09 14:10:43.987 11106-11147 Braze v26....nceManager  I  ***Geofence API not found. Please include the android-sdk-location module***
2023-06-09 14:10:43.988 11106-11147 Braze v26....nceManager  D  Braze geofences not enabled. Geofences not set up.
2023-06-09 14:10:43.988 11106-11147 Braze v26.0.0 .o         I  ***Location API not found. Please include android-sdk-location module***
2023-06-09 14:10:43.989 11106-11147 Braze v26.0.0 .g1        D  Did not find stored Feature Flags.
2023-06-09 14:10:43.994 11106-11147 Braze v26....dPrefUtils  V  Detected SDK update from '25.0.0' -> '26.0.0'. Clearing com.braze.storage.content_cards_storage_provider.metadata.d41d8cd98f00b204e9800998ecf8427e.a8781125-b32e-458b-9700-b9711b1d2f50 storage.
2023-06-09 14:10:44.002 11106-11147 Braze v26.0.0 .i0        V  recalculateDispatchState called with session state: NO_SESSION lastNetworkLevel: NONE
2023-06-09 14:10:44.002 11106-11147 Braze v26.0.0 .i0        V  currentIntervalMs: -1
2023-06-09 14:10:44.002 11106-11147 Braze v26.0.0 .i0        D  Data sync started
2023-06-09 14:10:44.011 11106-11147 Braze v26.0.0 .i0        V  recalculateDispatchState called with session state: NO_SESSION lastNetworkLevel: GOOD
2023-06-09 14:10:44.012 11106-11147 Braze v26.0.0 .i0        V  currentIntervalMs: -1
2023-06-09 14:10:44.013 11106-11184 Braze v26.0.0 .i0        V  recalculateDispatchState called with session state: NO_SESSION lastNetworkLevel: GOOD
2023-06-09 14:10:44.013 11106-11184 Braze v26.0.0 .i0        V  currentIntervalMs: -1
2023-06-09 14:10:44.016 11106-11147 Braze v26.0.0 .d1        D  Started offline event recovery task.
2023-06-09 14:10:44.017 11106-11147 Braze v26.0.0 .Braze     D  Content Cards is not enabled, skipping API call to refresh
2023-06-09 14:11:13.911 11106-11106 braze        E  result: null

Additional Information

I've observed the same behavior by upgrading from Braze SDK 18.0.0 to 25.0.0.

[Bug]: MainThread freezes up to 40 seconds on initial app launch

Braze Android SDK Version

19.0.0 and above

Steps To Reproduce

We updated from SDK 18.0.1 to SDK 25.0.0
Before release we noticed that the first start after fresh installation took 30-40 seconds which normally is like 1-2 seconds.
We narrowed the issue down to the SDK Upgrade, reverting to previous 18.0.1 fixed the issue. We tried also every version between 18.0.1 and 25.0.0 with the same results.

After removing the Braze session setup application.registerActivityLifecycleCallbacks(BrazeActivityLifecycleCallbackListener(...)) the delay didn't disappeared until we also removed the Braze.getInstance(applicationContext) call.
Which let us suspect that any background process is triggered when creating an instance which runs on the main thread.
The first message in LogCat after the freeze relates to Firebase (Messaging?), so might be related to it.
Screen Shot 2023-05-10 at 0 49 34

I tried to re-create the issue in a sample project, but the issue seemed not replicable by default, probably because the FCM setup is missing. I will try to investigate that further.

Expected Behavior

No freezing during initial app launch

Actual Incorrect Behavior

Freezing during initial app launch

Verbose Logs

See screenshot above, please let me know if you need more details.

Additional Information

I can't tell for sure if that issue is caused by the Braze SDK or missing/misconfiguration on our side. But I would appreciate any help in this matter 🙏 Please understand that we are not able to share any code, if it is better for us to reach out to the support instead, please let me know 🙇

[Bug]: ActivityNotFoundException: No Activity found to handle Intent { act=android.intent.action.VIEW dat=appboy://close/...

Braze Android SDK Version

30.2.0

Steps To Reproduce

Not sure, but we observe the crash from Firebase.

Expected Behavior

No crash

Actual Incorrect Behavior

ActivityNotFoundException is not handled, which caused app crash.

Verbose Logs

Fatal Exception: org.chromium.base.JniAndroid$UncaughtExceptionException: Native stack trace:
#00 pc 0x00000000040ef587 /data/app/~~7bjPe4Gt3i2zigI4H0azzw==/com.google.android.trichromelibrary_626111933-LYkp38bkj02Depk3cUgkoQ==/base.apk (offset 0x8dc000)
#01 pc 0x0000000002c9a367 /data/app/~~7bjPe4Gt3i2zigI4H0azzw==/com.google.android.trichromelibrary_626111933-LYkp38bkj02Depk3cUgkoQ==/base.apk (offset 0x8dc000)
#02 pc 0x0000000002c9926f /data/app/~~7bjPe4Gt3i2zigI4H0azzw==/com.google.android.trichromelibrary_626111933-LYkp38bkj02Depk3cUgkoQ==/base.apk (offset 0x8dc000)
#03 pc 0x000000000472cadb /data/app/~~7bjPe4Gt3i2zigI4H0azzw==/com.google.android.trichromelibrary_626111933-LYkp38bkj02Depk3cUgkoQ==/base.apk (offset 0x8dc000)
#04 pc 0x00000000056f7163 /data/app/~~7bjPe4Gt3i2zigI4H0azzw==/com.google.android.trichromelibrary_626111933-LYkp38bkj02Depk3cUgkoQ==/base.apk (offset 0x8dc000)
#05 pc 0x000000000564d0fb /data/app/~~7bjPe4Gt3i2zigI4H0azzw==/com.google.android.trichromelibrary_626111933-LYkp38bkj02Depk3cUgkoQ==/base.apk (offset 0x8dc000)
#06 pc 0x00000000051f9877 /data/app/~~7bjPe4Gt3i2zigI4H0azzw==/com.google.android.trichromelibrary_626111933-LYkp38bkj02Depk3cUgkoQ==/base.apk (offset 0x8dc000)
#07 pc 0x00000000066ce8a7 /data/app/~~7bjPe4Gt3i2zigI4H0azzw==/com.google.android.trichromelibrary_626111933-LYkp38bkj02Depk3cUgkoQ==/base.apk (offset 0x8dc000)
#08 pc 0x0000000002c0613b /data/app/~~7bjPe4Gt3i2zigI4H0azzw==/com.google.android.trichromelibrary_626111933-LYkp38bkj02Depk3cUgkoQ==/base.apk (offset 0x8dc000)
#09 pc 0x0000000002c061d7 /data/app/~~7bjPe4Gt3i2zigI4H0azzw==/com.google.android.trichromelibrary_626111933-LYkp38bkj02Depk3cUgkoQ==/base.apk (offset 0x8dc000)
#10 pc 0x00000000039c5113 /data/app/~~7bjPe4Gt3i2zigI4H0azzw==/com.google.android.trichromelibrary_626111933-LYkp38bkj02Depk3cUgkoQ==/base.apk (offset 0x8dc000)
#11 pc 0x00000000039c401b /data/app/~~7bjPe4Gt3i2zigI4H0azzw==/com.google.android.trichromelibrary_626111933-LYkp38bkj02Depk3cUgkoQ==/base.apk (offset 0x8dc000)
#12 pc 0x0000000002c26323 /data/app/~~7bjPe4Gt3i2zigI4H0azzw==/com.google.android.trichromelibra<truncated: 553 chars>
       at org.chromium.base.JniAndroid.handleException(chromium-TrichromeWebViewGoogle6432.aab-stable-626111933:11)
       at android.os.MessageQueue.nativePollOnce(MessageQueue.java)
       at android.os.MessageQueue.next(MessageQueue.java:335)
       at android.os.Looper.loopOnce(Looper.java:187)
       at android.os.Looper.loop(Looper.java:319)
       at android.app.ActivityThread.main(ActivityThread.java:8913)
       at java.lang.reflect.Method.invoke(Method.java)
       at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:608)
       at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1103)


Caused by android.content.ActivityNotFoundException: No Activity found to handle Intent { act=android.intent.action.VIEW dat=appboy://close/... }
       at android.app.Instrumentation.checkStartActivityResult(Instrumentation.java:2252)
       at android.app.Instrumentation.execStartActivity(Instrumentation.java:1878)
       at android.app.Activity.startActivityForResult(Activity.java:5743)
       at androidx.activity.ComponentActivity.startActivityForResult(ComponentActivity.java:754)
       at android.app.Activity.startActivityForResult(Activity.java:5701)
       at androidx.activity.ComponentActivity.startActivityForResult(ComponentActivity.java:735)
       at android.app.Activity.startActivity(Activity.java:6199)
       at android.app.Activity.startActivity(Activity.java:6166)
       at com.braze.ui.inappmessage.views.InAppMessageHtmlBaseView$messageWebView$7.onCreateWindow(InAppMessageHtmlBaseView.kt:150)
       at WV.z8.addNewContents(chromium-TrichromeWebViewGoogle6432.aab-stable-626111933:39)
       at android.os.MessageQueue.nativePollOnce(MessageQueue.java)
       at android.os.MessageQueue.next(MessageQueue.java:335)
       at android.os.Looper.loopOnce(Looper.java:187)
       at android.os.Looper.loop(Looper.java:319)
       at android.app.ActivityThread.main(ActivityThread.java:8913)
       at java.lang.reflect.Method.invoke(Method.java)
       at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:608)
       at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1103)

Additional Information

No response

[Bug]: Crash with IndexOutOfBoundsException in compose ContentCardsList

Braze Android SDK Version

30.4.0

Steps To Reproduce

Not able to reproduce, saw the crashes from Crashlytics

Expected Behavior

No crash

Actual Incorrect Behavior

Crash with IndexOutOfBoundsException, stack trace attached

Fatal Exception: java.lang.IndexOutOfBoundsException: index: 1, size: 0
       at androidx.compose.runtime.external.kotlinx.collections.immutable.internal.ListImplementation.checkElementIndex$runtime_release(ListImplementation.java:15)
       at androidx.compose.runtime.external.kotlinx.collections.immutable.implementations.immutableList.SmallPersistentVector.get(SmallPersistentVector.kt:146)
       at androidx.compose.runtime.snapshots.SnapshotStateList.get(SnapshotStateList.kt:91)
       at androidx.compose.foundation.lazy.LazyDslKt$items$3.invoke(LazyDsl.kt:147)
       at com.braze.jetpackcompose.contentcards.ContentCardsListKt$ContentCardsList$7$1$1$invoke$$inlined$items$default$3.invoke(LazyDsl.kt:147)
       at androidx.compose.foundation.lazy.LazyDslKt$items$3.invoke(LazyDsl.kt:144)
       at com.braze.jetpackcompose.contentcards.ContentCardsListKt$ContentCardsList$7$1$1$invoke$$inlined$items$default$3.invoke(LazyDsl.kt:144)
       at androidx.compose.foundation.lazy.layout.LazyLayoutIntervalContent.getContentType(LazyLayoutIntervalContent.java:49)
       at androidx.compose.foundation.lazy.LazyListItemProviderImpl.getContentType(LazyListItemProvider.kt:87)
       at androidx.compose.foundation.lazy.layout.LazyLayoutMeasureScopeImpl.measure-0kLqBqw(LazyLayoutMeasureScope.kt:123)
       at androidx.compose.foundation.lazy.LazyListMeasuredItemProvider.getAndMeasure(LazyListMeasuredItemProvider.java:48)
       at androidx.compose.foundation.lazy.LazyListMeasureKt.measureLazyList-5IMabDg(LazyListMeasure.kt:195)
       at androidx.compose.foundation.lazy.LazyListKt$rememberLazyListMeasurePolicy$1$1.invoke-0kLqBqw(LazyList.kt:313)
       at androidx.compose.foundation.lazy.LazyListKt$rememberLazyListMeasurePolicy$1$1.invoke(LazyList.kt:178)
       at androidx.compose.foundation.lazy.layout.LazyLayoutKt$LazyLayout$3$2$1.invoke-0kLqBqw(LazyLayout.kt:107)
       at androidx.compose.foundation.lazy.layout.LazyLayoutKt$LazyLayout$3$2$1.invoke(LazyLayout.kt:100)
       at androidx.compose.ui.layout.LayoutNodeSubcompositionsState$createMeasurePolicy$1.measure-3p2s80s(SubcomposeLayout.kt:709)
       at androidx.compose.ui.node.InnerNodeCoordinator.measure-BRTryo0(InnerNodeCoordinator.kt:126)
       at androidx.compose.foundation.AndroidOverscroll_androidKt$StretchOverscrollNonClippingLayer$2.invoke-3p2s80s(AndroidOverscroll_android.kt:584)
       at androidx.compose.foundation.AndroidOverscroll_androidKt$StretchOverscrollNonClippingLayer$2.invoke(AndroidOverscroll_android.kt:583)
       at androidx.compose.ui.layout.LayoutModifierImpl.measure-3p2s80s(LayoutModifier.kt:294)
       at androidx.compose.ui.node.LayoutModifierNodeCoordinator.measure-BRTryo0(LayoutModifierNodeCoordinator.kt:116)
       at androidx.compose.foundation.AndroidOverscroll_androidKt$StretchOverscrollNonClippingLayer$1.invoke-3p2s80s(AndroidOverscroll.android.kt:568)
       at androidx.compose.foundation.AndroidOverscroll_androidKt$StretchOverscrollNonClippingLayer$1.invoke(AndroidOverscroll.android.kt:567)
       at androidx.compose.ui.layout.LayoutModifierImpl.measure-3p2s80s(LayoutModifier.kt:294)
       at androidx.compose.ui.node.LayoutModifierNodeCoordinator.measure-BRTryo0(LayoutModifierNodeCoordinator.kt:116)
       at androidx.compose.ui.graphics.SimpleGraphicsLayerModifier.measure-3p2s80s(GraphicsLayerModifier.kt:646)
       at androidx.compose.ui.node.LayoutModifierNodeCoordinator.measure-BRTryo0(LayoutModifierNodeCoordinator.kt:116)
       at androidx.compose.ui.node.LayoutNodeLayoutDelegate$performMeasureBlock$1.invoke(LayoutNodeLayoutDelegate.java:252)
       at androidx.compose.ui.node.LayoutNodeLayoutDelegate$performMeasureBlock$1.invoke(LayoutNodeLayoutDelegate.java:251)
       at androidx.compose.runtime.snapshots.Snapshot$Companion.observe(Snapshot.java:2303)
       at androidx.compose.runtime.snapshots.SnapshotStateObserver$ObservedScopeMap.observe(SnapshotStateObserver.kt:500)
       at androidx.compose.runtime.snapshots.SnapshotStateObserver.observeReads(SnapshotStateObserver.kt:256)
       at androidx.compose.ui.node.OwnerSnapshotObserver.observeReads$ui_release(OwnerSnapshotObserver.kt:133)
       at androidx.compose.ui.node.OwnerSnapshotObserver.observeMeasureSnapshotReads$ui_release(OwnerSnapshotObserver.kt:113)
       at androidx.compose.ui.node.LayoutNodeLayoutDelegate.performMeasure-BRTryo0(LayoutNodeLayoutDelegate.java:1617)
       at androidx.compose.ui.node.LayoutNodeLayoutDelegate.access$performMeasure-BRTryo0(LayoutNodeLayoutDelegate.java:36)
       at androidx.compose.ui.node.LayoutNodeLayoutDelegate$MeasurePassDelegate.remeasure-BRTryo0(LayoutNodeLayoutDelegate.kt:620)
       at androidx.compose.ui.node.LayoutNode.remeasure-_Sx5XlM$ui_release(LayoutNode.java:1145)
       at androidx.compose.ui.node.LayoutNode.remeasure-_Sx5XlM$ui_release$default(LayoutNode.java:1136)
       at androidx.compose.ui.node.MeasureAndLayoutDelegate.doRemeasure-sdFAvZA(MeasureAndLayoutDelegate.kt:356)
       at androidx.compose.ui.node.MeasureAndLayoutDelegate.remeasureAndRelayoutIfNeeded(MeasureAndLayoutDelegate.kt:514)
       at androidx.compose.ui.node.MeasureAndLayoutDelegate.remeasureAndRelayoutIfNeeded$default(MeasureAndLayoutDelegate.kt:491)
       at androidx.compose.ui.node.MeasureAndLayoutDelegate.measureAndLayout(MeasureAndLayoutDelegate.kt:377)
       at androidx.compose.ui.platform.AndroidComposeView.measureAndLayout(AndroidComposeView.android.kt:971)
       at androidx.compose.ui.node.Owner.measureAndLayout$default(Owner.java:228)
       at androidx.compose.ui.platform.AndroidComposeView.dispatchDraw(AndroidComposeView.android.kt:1224)
       at android.view.View.draw(View.java:23901)
       at android.view.View.updateDisplayListIfDirty(View.java:22767)
       at android.view.ViewGroup.recreateChildDisplayList(ViewGroup.java:5339)
       at android.view.ViewGroup.dispatchGetDisplayList(ViewGroup.java:5311)
       at android.view.View.updateDisplayListIfDirty(View.java:22714)
       at android.view.ViewGroup.recreateChildDisplayList(ViewGroup.java:5339)
       at android.view.ViewGroup.dispatchGetDisplayList(ViewGroup.java:5311)
       at android.view.View.updateDisplayListIfDirty(View.java:22714)
       at android.view.ViewGroup.recreateChildDisplayList(ViewGroup.java:5339)
       at android.view.ViewGroup.dispatchGetDisplayList(ViewGroup.java:5311)
       at android.view.View.updateDisplayListIfDirty(View.java:22714)
       at android.view.ViewGroup.recreateChildDisplayList(ViewGroup.java:5339)
       at android.view.ViewGroup.dispatchGetDisplayList(ViewGroup.java:5311)
       at android.view.View.updateDisplayListIfDirty(View.java:22714)
       at android.view.ViewGroup.recreateChildDisplayList(ViewGroup.java:5339)
       at android.view.ViewGroup.dispatchGetDisplayList(ViewGroup.java:5311)
       at android.view.View.updateDisplayListIfDirty(View.java:22714)
       at android.view.ViewGroup.recreateChildDisplayList(ViewGroup.java:5339)
       at android.view.ViewGroup.dispatchGetDisplayList(ViewGroup.java:5311)
       at android.view.View.updateDisplayListIfDirty(View.java:22714)
       at android.view.ViewGroup.recreateChildDisplayList(ViewGroup.java:5339)
       at android.view.ViewGroup.dispatchGetDisplayList(ViewGroup.java:5311)
       at android.view.View.updateDisplayListIfDirty(View.java:22714)
       at android.view.ViewGroup.recreateChildDisplayList(ViewGroup.java:5339)
       at android.view.ViewGroup.dispatchGetDisplayList(ViewGroup.java:5311)
       at android.view.View.updateDisplayListIfDirty(View.java:22714)
       at android.view.ViewGroup.recreateChildDisplayList(ViewGroup.java:5339)
       at android.view.ViewGroup.dispatchGetDisplayList(ViewGroup.java:5311)
       at android.view.View.updateDisplayListIfDirty(View.java:22714)
       at android.view.ThreadedRenderer.updateViewTreeDisplayList(ThreadedRenderer.java:602)
       at android.view.ThreadedRenderer.updateRootDisplayList(ThreadedRenderer.java:608)
       at android.view.ThreadedRenderer.draw(ThreadedRenderer.java:684)
       at android.view.ViewRootImpl.draw(ViewRootImpl.java:5440)
       at android.view.ViewRootImpl.performDraw(ViewRootImpl.java:5148)
       at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:4212)
       at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:2919)
       at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:10491)
       at android.view.Choreographer$CallbackRecord.run(Choreographer.java:1108)
       at android.view.Choreographer.doCallbacks(Choreographer.java:866)
       at android.view.Choreographer.doFrame(Choreographer.java:797)
       at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:1092)
       at android.os.Handler.handleCallback(Handler.java:938)
       at android.os.Handler.dispatchMessage(Handler.java:99)
       at android.os.Looper.loopOnce(Looper.java:226)
       at android.os.Looper.loop(Looper.java:313)
       at android.app.ActivityThread.main(ActivityThread.java:8663)
       at java.lang.reflect.Method.invoke(Method.java)
       at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:571)
       at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1135)

Verbose Logs

No response

Additional Information

No response

[Bug]: InAppMessageWebView ANR

Braze Android SDK Version

30.2.0

Steps To Reproduce

Unfortunately, we don't have a way to reproduce this issue, only logs we receive from DataDog RUM.

Expected Behavior

No such logs

Actual Incorrect Behavior

The stacktrace

at com.android.webview.chromium.WebViewChromium.init(chromium-TrichromeWebViewGoogle.aab-stable-626111931:97)
...
at android.webkit.WebView.<init>(WebView.java:338)
at com.braze.ui.inappmessage.views.InAppMessageWebView.<init>(InAppMessageWebView.java:13)
...
at android.view.LayoutInflater.inflate(LayoutInflater.java:481)
at com.braze.ui.inappmessage.factories.DefaultInAppMessageHtmlViewFactory.createInAppMessageView(DefaultInAppMessageHtmlViewFactory.java:31)
at com.braze.ui.inappmessage.factories.DefaultInAppMessageHtmlViewFactory.createInAppMessageView(DefaultInAppMessageHtmlViewFactory.java:22)
at com.braze.ui.inappmessage.BrazeInAppMessageManager.displayInAppMessage(BrazeInAppMessageManager.java:520)
at com.braze.ui.inappmessage.utils.BackgroundInAppMessagePreparer$displayPreparedInAppMessage$2.invokeSuspend(BackgroundInAppMessagePreparer.java:274)

Verbose Logs

No response

Additional Information

This ANR is being reported by DataDog RUM. But we don't see this issue on Crashlytics or Play Console.

We are not sure if you can mitigate it on your side, or if ANR just propagates from WebView through Braze.

[Bug]: Crash IllegalArgumentException in compose ContentCardsList

Braze Android SDK Version

30.4.0

Steps To Reproduce

Not able to reproduce, saw the crashes from Crashlytics

Expected Behavior

No crash

Actual Incorrect Behavior

Crash with IllegalArgumentException, stack trace attached

Fatal Exception: java.lang.IllegalArgumentException: Key "NjU0ZTBiNDRkZjc0YjkwMDRlMGQ3MDc0XyRfY2M9MzJkZTRlN2ItNmFlYy1jYThlLWNiOWQtYjljOGU1YzYyYjEzJmRpJmRtJm12PTY1NGUwYjQ0ZGY3NGI5MDA0ZTBkNzA3NiZvZCZwaT13ZnMmdz02NTRlMGI0NGRmNzRiOTAwNGUwZDcwMmYmd3A9MTcxNDE0NjkzMSZ3dj02NTRlMGI0NGRmNzRiOTAwNGUwZDczNmM=" was already used. If you are using LazyColumn/Row please make sure you provide a unique key for each item.
       at androidx.compose.ui.layout.LayoutNodeSubcompositionsState.subcompose(LayoutNodeSubcompositionsState.java:437)
       at androidx.compose.ui.layout.LayoutNodeSubcompositionsState$Scope.subcompose(SubcomposeLayout.kt:872)
       at androidx.compose.foundation.lazy.layout.LazyLayoutMeasureScopeImpl.measure-0kLqBqw(LazyLayoutMeasureScope.kt:125)
       at androidx.compose.foundation.lazy.LazyListMeasuredItemProvider.getAndMeasure(LazyListMeasuredItemProvider.java:48)
       at androidx.compose.foundation.lazy.LazyListMeasureKt.measureLazyList-5IMabDg(LazyListMeasure.kt:195)
       at androidx.compose.foundation.lazy.LazyListKt$rememberLazyListMeasurePolicy$1$1.invoke-0kLqBqw(LazyList.kt:313)
       at androidx.compose.foundation.lazy.LazyListKt$rememberLazyListMeasurePolicy$1$1.invoke(LazyList.kt:178)
       at androidx.compose.foundation.lazy.layout.LazyLayoutKt$LazyLayout$3$2$1.invoke-0kLqBqw(LazyLayout.kt:107)
       at androidx.compose.foundation.lazy.layout.LazyLayoutKt$LazyLayout$3$2$1.invoke(LazyLayout.kt:100)
       at androidx.compose.ui.layout.LayoutNodeSubcompositionsState$createMeasurePolicy$1.measure-3p2s80s(SubcomposeLayout.kt:709)
       at androidx.compose.ui.node.InnerNodeCoordinator.measure-BRTryo0(InnerNodeCoordinator.kt:126)
       at androidx.compose.foundation.AndroidOverscroll_androidKt$StretchOverscrollNonClippingLayer$2.invoke-3p2s80s(AndroidOverscroll_android.kt:584)
       at androidx.compose.foundation.AndroidOverscroll_androidKt$StretchOverscrollNonClippingLayer$2.invoke(AndroidOverscroll_android.kt:583)
       at androidx.compose.ui.layout.LayoutModifierImpl.measure-3p2s80s(LayoutModifier.kt:294)
       at androidx.compose.ui.node.LayoutModifierNodeCoordinator.measure-BRTryo0(LayoutModifierNodeCoordinator.kt:116)
       at androidx.compose.foundation.AndroidOverscroll_androidKt$StretchOverscrollNonClippingLayer$1.invoke-3p2s80s(AndroidOverscroll.android.kt:568)
       at androidx.compose.foundation.AndroidOverscroll_androidKt$StretchOverscrollNonClippingLayer$1.invoke(AndroidOverscroll.android.kt:567)
       at androidx.compose.ui.layout.LayoutModifierImpl.measure-3p2s80s(LayoutModifier.kt:294)
       at androidx.compose.ui.node.LayoutModifierNodeCoordinator.measure-BRTryo0(LayoutModifierNodeCoordinator.kt:116)
       at androidx.compose.ui.graphics.SimpleGraphicsLayerModifier.measure-3p2s80s(GraphicsLayerModifier.kt:646)
       at androidx.compose.ui.node.LayoutModifierNodeCoordinator.measure-BRTryo0(LayoutModifierNodeCoordinator.kt:116)
       at androidx.compose.ui.node.LayoutNodeLayoutDelegate$performMeasureBlock$1.invoke(LayoutNodeLayoutDelegate.java:252)
       at androidx.compose.ui.node.LayoutNodeLayoutDelegate$performMeasureBlock$1.invoke(LayoutNodeLayoutDelegate.java:251)
       at androidx.compose.runtime.snapshots.Snapshot$Companion.observe(Snapshot.java:2303)
       at androidx.compose.runtime.snapshots.SnapshotStateObserver$ObservedScopeMap.observe(SnapshotStateObserver.kt:500)
       at androidx.compose.runtime.snapshots.SnapshotStateObserver.observeReads(SnapshotStateObserver.kt:256)
       at androidx.compose.ui.node.OwnerSnapshotObserver.observeReads$ui_release(OwnerSnapshotObserver.kt:133)
       at androidx.compose.ui.node.OwnerSnapshotObserver.observeMeasureSnapshotReads$ui_release(OwnerSnapshotObserver.kt:113)
       at androidx.compose.ui.node.LayoutNodeLayoutDelegate.performMeasure-BRTryo0(LayoutNodeLayoutDelegate.java:1617)
       at androidx.compose.ui.node.LayoutNodeLayoutDelegate.access$performMeasure-BRTryo0(LayoutNodeLayoutDelegate.java:36)
       at androidx.compose.ui.node.LayoutNodeLayoutDelegate$MeasurePassDelegate.remeasure-BRTryo0(LayoutNodeLayoutDelegate.kt:620)
       at androidx.compose.ui.node.LayoutNode.remeasure-_Sx5XlM$ui_release(LayoutNode.java:1145)
       at androidx.compose.ui.node.LayoutNode.remeasure-_Sx5XlM$ui_release$default(LayoutNode.java:1136)
       at androidx.compose.ui.node.MeasureAndLayoutDelegate.doRemeasure-sdFAvZA(MeasureAndLayoutDelegate.kt:356)
       at androidx.compose.ui.node.MeasureAndLayoutDelegate.remeasureAndRelayoutIfNeeded(MeasureAndLayoutDelegate.kt:514)
       at androidx.compose.ui.node.MeasureAndLayoutDelegate.remeasureAndRelayoutIfNeeded$default(MeasureAndLayoutDelegate.kt:491)
       at androidx.compose.ui.node.MeasureAndLayoutDelegate.measureAndLayout(MeasureAndLayoutDelegate.kt:377)
       at androidx.compose.ui.platform.AndroidComposeView.measureAndLayout(AndroidComposeView.android.kt:971)
       at androidx.compose.ui.node.Owner.measureAndLayout$default(Owner.java:228)
       at androidx.compose.ui.platform.AndroidComposeView.dispatchDraw(AndroidComposeView.android.kt:1224)
       at android.view.View.draw(View.java:23303)
       at android.view.View.updateDisplayListIfDirty(View.java:22151)
       at android.view.ViewGroup.recreateChildDisplayList(ViewGroup.java:4593)
       at android.view.ViewGroup.dispatchGetDisplayList(ViewGroup.java:4566)
       at android.view.View.updateDisplayListIfDirty(View.java:22097)
       at android.view.ViewGroup.recreateChildDisplayList(ViewGroup.java:4593)
       at android.view.ViewGroup.dispatchGetDisplayList(ViewGroup.java:4566)
       at android.view.View.updateDisplayListIfDirty(View.java:22097)
       at android.view.ViewGroup.recreateChildDisplayList(ViewGroup.java:4593)
       at android.view.ViewGroup.dispatchGetDisplayList(ViewGroup.java:4566)
       at android.view.View.updateDisplayListIfDirty(View.java:22097)
       at android.view.ViewGroup.recreateChildDisplayList(ViewGroup.java:4593)
       at android.view.ViewGroup.dispatchGetDisplayList(ViewGroup.java:4566)
       at android.view.View.updateDisplayListIfDirty(View.java:22097)
       at android.view.ViewGroup.recreateChildDisplayList(ViewGroup.java:4593)
       at android.view.ViewGroup.dispatchGetDisplayList(ViewGroup.java:4566)
       at android.view.View.updateDisplayListIfDirty(View.java:22097)
       at android.view.ViewGroup.recreateChildDisplayList(ViewGroup.java:4593)
       at android.view.ViewGroup.dispatchGetDisplayList(ViewGroup.java:4566)
       at android.view.View.updateDisplayListIfDirty(View.java:22097)
       at android.view.ViewGroup.recreateChildDisplayList(ViewGroup.java:4593)
       at android.view.ViewGroup.dispatchGetDisplayList(ViewGroup.java:4566)
       at android.view.View.updateDisplayListIfDirty(View.java:22097)
       at android.view.ViewGroup.recreateChildDisplayList(ViewGroup.java:4593)
       at android.view.ViewGroup.dispatchGetDisplayList(ViewGroup.java:4566)
       at android.view.View.updateDisplayListIfDirty(View.java:22097)
       at android.view.ViewGroup.recreateChildDisplayList(ViewGroup.java:4593)
       at android.view.ViewGroup.dispatchGetDisplayList(ViewGroup.java:4566)
       at android.view.View.updateDisplayListIfDirty(View.java:22097)
       at android.view.ThreadedRenderer.updateViewTreeDisplayList(ThreadedRenderer.java:682)
       at android.view.ThreadedRenderer.updateRootDisplayList(ThreadedRenderer.java:688)
       at android.view.ThreadedRenderer.draw(ThreadedRenderer.java:786)
       at android.view.ViewRootImpl.draw(ViewRootImpl.java:4678)
       at android.view.ViewRootImpl.performDraw(ViewRootImpl.java:4389)
       at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:3604)
       at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:2372)
       at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:9082)
       at android.view.Choreographer$CallbackRecord.run(Choreographer.java:1234)
       at android.view.Choreographer$CallbackRecord.run(Choreographer.java:1242)
       at android.view.Choreographer.doCallbacks(Choreographer.java:902)
       at android.view.Choreographer.doFrame(Choreographer.java:835)
       at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:1217)
       at android.os.Handler.handleCallback(Handler.java:942)
       at android.os.Handler.dispatchMessage(Handler.java:99)
       at android.os.Looper.loopOnce(Looper.java:201)
       at android.os.Looper.loop(Looper.java:288)
       at android.app.ActivityThread.main(ActivityThread.java:8066)
       at java.lang.reflect.Method.invoke(Method.java)
       at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:703)
       at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:911)

Verbose Logs

No response

Additional Information

No response

[Bug]: Register activity lifecycle callbacks

Braze Android SDK Version

com.braze:android-sdk-ui:24.3.0

Steps To Reproduce

Register activity lifecycle callbacks Android Studio prompts:

register_callbacks

However, Android Studio can compile normally.

Expected Behavior

Android Studio does not have a red line prompt.

Actual Incorrect Behavior

Perhaps this is a problem caused by Android Studio.

Verbose Logs

No response

Additional Information

No response

[Bug]: StrictMode DiskReadViolation crash when clicking on a Content Card

Braze Android SDK Version

30.0.0

Steps To Reproduce

With StrictMode enabled, call com.braze.models.cards.Card.logClick() by clicking on a Content Card

Expected Behavior

Crash shouldn't happen

Actual Incorrect Behavior

Crash happens

E  FATAL EXCEPTION: pool-16-thread-1
android.os.strictmode.DiskReadViolation
    at android.os.StrictMode$AndroidBlockGuardPolicy.onReadFromDisk(StrictMode.java:1658)
    at [libcore.io](http://libcore.io/).BlockGuardOs.access(BlockGuardOs.java:74)
    at [libcore.io](http://libcore.io/).ForwardingOs.access(ForwardingOs.java:128)
    at android.app.ActivityThread$AndroidOs.access(ActivityThread.java:8615)
    at [java.io](http://java.io/).UnixFileSystem.checkAccess(UnixFileSystem.java:281)
    at [java.io](http://java.io/).File.exists(File.java:813)
    at android.app.SharedPreferencesImpl$EditorImpl.isSpeg(SharedPreferencesImpl.java:505)
    at android.app.SharedPreferencesImpl$EditorImpl.apply(SharedPreferencesImpl.java:517)
    at bo.app.y.a(SourceFile:1528)
    at bo.app.y.a(SourceFile:1512)
    at bo.app.y.markCardAsClicked(SourceFile:1)
    at com.braze.models.cards.Card.logClick(SourceFile:6)

Verbose Logs

No response

Additional Information

Device
Brand:Samsung
Model:Galaxy S20 FE

Operating System
Version:Android 13

[Bug]: ContentCardFragment does not display first in-app message

Braze Android SDK Version

29.0.1

Steps To Reproduce

We currently have a content card that displays an in-app messaged when tapped. This in-app message creates an InAppMessageHtmlView. When we try to display this in-app message for the first time, or any other in-app message for that matter, while the ContentCardFragment is displaying, we get the error thrown in the logs below. After closing the screen and opening again, it works as intended. But with the first time after killing the app, this always happens, and the common denominator seems to be the ContentCardFragment.

  1. Open a screen with a ContentCardFragment.
  2. Try to display an in-app message.
  3. Check that the in-app message does not display if it's the first we're trying to display after a cold start.
  4. Leave the screen.
  5. Re-enter the screen.
  6. Try to display an in-app message.
  7. Check that the in-app message now displays properly.

Expected Behavior

The expected behaviour is like version 29.0.0. No error is thrown and the in-app message opens the first time. Everything appears to be working with no issues with version 29.0.0.

Verbose Logs

E  Child job of BrazeCoroutineScope got exception: android.view.ViewRootImpl$CalledFromWrongThreadException: Only the original thread that created a view hierarchy can touch its views.android.view.ViewRootImpl$CalledFromWrongThreadException: Only the original thread that created a view hierarchy can touch its views.
at android.view.ViewRootImpl.checkThread(ViewRootImpl.java:11199)
at android.view.ViewRootImpl.requestLayout(ViewRootImpl.java:2487)
at android.view.View.requestLayout(View.java:27053)
at android.view.View.requestLayout(View.java:27053)
at android.view.View.requestLayout(View.java:27053)
at android.view.View.requestLayout(View.java:27053)
at android.view.View.requestLayout(View.java:27053)
at android.view.View.requestLayout(View.java:27053)
at android.view.View.requestLayout(View.java:27053)
at android.view.View.requestLayout(View.java:27053)
at android.view.View.requestLayout(View.java:27053)
at androidx.recyclerview.widget.RecyclerView.requestLayout(RecyclerView.java:4881)
at android.view.View.requestLayout(View.java:27053)
at android.view.View.requestLayout(View.java:27053)
at androidx.constraintlayout.widget.ConstraintLayout.requestLayout(ConstraintLayout.java:3605)
at android.view.View.requestLayout(View.java:27053)
at android.widget.ImageView.setImageDrawable(ImageView.java:606)
at androidx.appcompat.widget.AppCompatImageView.setImageDrawable(AppCompatImageView.java:112)
at android.widget.ImageView.setImageBitmap(ImageView.java:772)
at androidx.appcompat.widget.AppCompatImageView.setImageBitmap(AppCompatImageView.java:124)
at com.braze.images.DefaultBrazeImageLoader$q.invokeSuspend(SourceFile:13)
at kotlin.coroutines.jvm.internal.BaseContinuationImpl.resumeWith(ContinuationImpl.kt:33)
at kotlinx.coroutines.DispatchedTask.run(DispatchedTask.kt:108)
at kotlinx.coroutines.internal.LimitedDispatcher$Worker.run(LimitedDispatcher.kt:115)
at kotlinx.coroutines.scheduling.TaskImpl.run(Tasks.kt:103)
at kotlinx.coroutines.scheduling.CoroutineScheduler.runSafely(CoroutineScheduler.kt:584)
at kotlinx.coroutines.scheduling.CoroutineScheduler$Worker.executeTask(CoroutineScheduler.kt:793)
at kotlinx.coroutines.scheduling.CoroutineScheduler$Worker.runWorker(CoroutineScheduler.kt:697)
at kotlinx.coroutines.scheduling.CoroutineScheduler$Worker.run(CoroutineScheduler.kt:684)

Additional Information

No response

[Bug]: In-app message disappears after blocking/minimizing the application

Braze Android SDK Version

29.0.1

Steps To Reproduce

Steps:

  1. Open the app and wait 30 seconds until the app appears
  2. Minimize the application/lock the phone
  3. Expand the application / unlock the phone

Expected Behavior

An in-app message is displayed

Actual Incorrect Behavior

In-app message disappears

Verbose Logs

2023-11-23 11:42:10.566 14711-14878/***** D/Braze v29.0.1 .e1: Triggering com.braze.events.InAppMessageEvent on 1 subscribers.
2023-11-23 11:42:10.566 14711-14878/***** D/Braze v29.0.1 .e1: Triggering com.braze.events.InAppMessageEvent on 0 subscribers.
2023-11-23 11:42:10.568 14711-14873/***** D/Braze v29.0.1 .BrazeInAppMessageManager: The IInAppMessageManagerListener method beforeInAppMessageDisplayed returned DISPLAY_NOW. The in-app message will be displayed.
2023-11-23 11:42:10.572 14711-14873/***** D/Braze v29.0.1 .BackgroundInAppMessagePreparer: Starting asynchronous in-app message preparation for message.
2023-11-23 11:42:10.573 14711-14878/***** D/Braze v29.0.1 .q6: Updating re-eligibility for action Id 655606e972225b1cd71afef4 to time 1700732530.
2023-11-23 11:42:10.573 14711-14878/***** D/Braze v29.0.1 .n6: TriggerManager lastDisplayTimeSeconds updated to 1700732530
2023-11-23 11:42:10.575 14711-14873/***** D/Braze v29.0.1 .WebContentUtils: Replacing remote url "https://cdn.braze.eu/appboy/communication/assets/image_assets/images/6554844d502ded04debee6f8/original.jpg?1700037708" with local uri "file:///data/user/0/*****/cache/ab_triggers/448429470.jpg"
2023-11-23 11:42:10.575 14711-14873/***** D/Braze v29.0.1 .WebContentUtils: Replacing remote url "https://cdn.braze.eu/appboy/communication/assets/image_assets/images/655487b76fce81021da8535b/original.png?1700038582" with local uri "file:///data/user/0/*****/cache/ab_triggers/365651839.png"
2023-11-23 11:42:10.577 14711-14711/***** D/Braze v29.0.1 .BackgroundInAppMessagePreparer: Displaying in-app message.
2023-11-23 11:42:10.580 14711-14711/***** D/Braze v29.0.1 .BrazeInAppMessageManager: Expiration timestamp not defined. Continuing.
2023-11-23 11:42:10.581 14711-14711/***** D/Braze v29.0.1 .ViewUtils: Current and preferred orientation are portrait.
2023-11-23 11:42:10.581 14711-14711/***** D/Braze v29.0.1 .BrazeInAppMessageManager: Requesting orientation lock.
2023-11-23 11:42:10.712 14711-14711/***** D/Braze v29.0.1 .BrazeConfigurationProvider: Unable to find the xml BOOLEAN configuration value with primary key 'com_braze_require_touch_mode_for_html_in_app_messages'. Using default value 'true'.
2023-11-23 11:42:10.712 14711-14711/***** D/Braze v29.0.1 .BrazeConfigurationProvider: Using resources value for key: 'com_braze_require_touch_mode_for_html_in_app_messages' and value: 'true'
2023-11-23 11:42:10.717 14711-14711/***** D/Braze v29.0.1 .BrazeConfigurationProvider: Unable to find the xml BOOLEAN configuration value with primary key 'com_braze_html_in_app_message_enable_html_link_target'. Using default value 'true'.
2023-11-23 11:42:10.717 14711-14711/***** D/Braze v29.0.1 .BrazeConfigurationProvider: Using resources value for key: 'com_braze_html_in_app_message_enable_html_link_target' and value: 'true'
2023-11-23 11:42:10.733 14711-14711/***** D/Braze v29.0.1 .BrazeConfigurationProvider: Unable to find the xml INTEGER configuration value with primary key 'com_braze_in_app_message_webview_client_max_onpagefinished_wait_ms'. Using default value '15000'.
2023-11-23 11:42:10.733 14711-14711/***** D/Braze v29.0.1 .BrazeConfigurationProvider: Using resources value for key: 'com_braze_in_app_message_webview_client_max_onpagefinished_wait_ms' and value: '15000'
2023-11-23 11:42:10.737 14711-14711/***** D/Braze v29.0.1 .BrazeInAppMessageManager: Creating view wrapper for base in-app message.
2023-11-23 11:42:10.738 14711-14711/***** D/Braze v29.0.1 .BrazeInAppMessageManager: In-app message view includes HTML. Delaying display until the content has finished loading.
2023-11-23 11:42:10.857 14711-14711/***** D/Braze v29.0.1 .BrazeInAppMessageManager: Page has finished loading. Opening in-app message view wrapper.
2023-11-23 11:42:10.857 14711-14711/***** D/Braze v29.0.1 .BrazeConfigurationProvider: Unable to find the xml BOOLEAN configuration value with primary key 'com_braze_device_in_app_message_accessibility_exclusive_mode_enabled'. Using default value 'false'.
2023-11-23 11:42:10.857 14711-14711/***** D/Braze v29.0.1 .BrazeConfigurationProvider: Using resources value for key: 'com_braze_device_in_app_message_accessibility_exclusive_mode_enabled' and value: 'false'
2023-11-23 11:42:10.857 14711-14711/***** D/Braze v29.0.1 .DefaultInAppMessageViewWrapper: Detected root view height of 2065
2023-11-23 11:42:10.857 14711-14711/***** D/Braze v29.0.1 .DefaultInAppMessageViewLifecycleListener: IInAppMessageViewLifecycleListener.beforeOpened called.
2023-11-23 11:42:10.857 14711-14711/***** D/Braze v29.0.1 .t: Checking if this session needs to be sealed: 8479879f-4ba3-4da1-a8fe-18db372ebf7e
2023-11-23 11:42:10.857 14711-14711/***** D/Braze v29.0.1 .t: Checking if this session needs to be sealed: 8479879f-4ba3-4da1-a8fe-18db372ebf7e
2023-11-23 11:42:10.858 14711-14711/***** D/Braze v29.0.1 .e1: bo.app.n0 fired:
    commandType = ADD_BRAZE_EVENT
    brazeEvent = {"name":"si","data":{"trigger_ids":["NjU1NjA2ZTk3MjIyNWIxY2Q3MWFmZWY0XyRfbXY9NjU1NjA2ZTk3MjIyNWIxY2Q3MWFmZWZlJnBpPWNtcA=="]},"time":1.700732530857E9,"user_id":"******","session_id":"8479879f-4ba3-4da1-a8fe-18db372ebf7e"}
    sessionId = null
    brazeRequest = null
2023-11-23 11:42:10.858 14711-14711/***** D/Braze v29.0.1 .e1: Triggering bo.app.n0 on 0 subscribers.
2023-11-23 11:42:10.858 14711-14711/***** D/Braze v29.0.1 .e1: Triggering bo.app.n0 on 1 subscribers.
2023-11-23 11:42:10.858 14711-14711/***** D/Braze v29.0.1 .DefaultInAppMessageViewWrapper: Adding In-app message view to parent view group.
2023-11-23 11:42:10.860 14711-14711/***** D/Braze v29.0.1 .DefaultInAppMessageViewWrapper: In-app message view will animate into the visible area.
2023-11-23 11:42:10.860 14711-14742/***** D/Braze v29.0.1 .u5: Adding event to storage with uid 8d4a5335-1f5e-4f88-994e-e614cd8f3e98
2023-11-23 11:42:11.092 14711-14711/***** D/Braze v29.0.1 .DefaultInAppMessageViewWrapper: In-app message animated into view.
2023-11-23 11:42:11.093 14711-14711/***** D/Braze v29.0.1 .DefaultInAppMessageViewLifecycleListener: IInAppMessageViewLifecycleListener.afterOpened called.
2023-11-23 11:42:13.187 14711-14711/***** D/Braze v29.0.1 .BrazeInAppMessageManager: In-app message view includes HTML. Removing the page finished listener.
2023-11-23 11:42:13.190 14711-14711/***** D/Braze v29.0.1 .ViewUtils: Removed view: com.braze.ui.inappmessage.views.InAppMessageHtmlView{6e8cefe VFE...C.. ......ID 0,0-1080,2065 #7f0b01a5 app:id/com_braze_inappmessage_html}
    from parent: androidx.appcompat.widget.ContentFrameLayout{6a5b65f V.E...... ......ID 0,0-1080,2065 #1020002 android:id/content}
2023-11-23 11:42:13.910 14711-14796/***** D/Braze v29.0.1 .p: Messaging session stopped. Adding new messaging session timestamp: 1700732533
2023-11-23 11:42:13.910 14711-14796/***** D/Braze v29.0.1 .t: Checking if this session needs to be sealed: 8479879f-4ba3-4da1-a8fe-18db372ebf7e
2023-11-23 11:42:13.910 14711-14796/***** D/Braze v29.0.1 .t: Creating a session seal alarm with a delay of 240000 ms
2023-11-23 11:42:13.913 14711-14796/***** D/Braze v29.0.1 .e1: bo.app.t5 fired:
    bo.app.t5@6c33ae7
2023-11-23 11:42:13.913 14711-14796/***** D/Braze v29.0.1 .e1: Triggering bo.app.t5 on 0 subscribers.
2023-11-23 11:42:13.913 14711-14796/***** D/Braze v29.0.1 .e1: Triggering bo.app.t5 on 2 subscribers.
2023-11-23 11:42:13.913 14711-14796/***** D/Braze v29.0.1 .t0: Ending DUST subscription on delay
2023-11-23 11:42:13.913 14711-14796/***** D/Braze v29.0.1 .t: Closed session with id 8479879f-4ba3-4da1-a8fe-18db372ebf7e
2023-11-23 11:42:15.631 14711-14796/***** D/Braze v29.0.1 .t: Checking if this session needs to be sealed: 8479879f-4ba3-4da1-a8fe-18db372ebf7e
2023-11-23 11:42:15.631 14711-14796/***** D/Braze v29.0.1 .t: Cancelling session seal alarm
2023-11-23 11:42:15.633 14711-14796/***** D/Braze v29.0.1 .e1: bo.app.r5 fired:
    bo.app.r5@81b77d7
2023-11-23 11:42:15.633 14711-14796/***** D/Braze v29.0.1 .e1: Triggering bo.app.r5 on 0 subscribers.
2023-11-23 11:42:15.633 14711-14796/***** D/Braze v29.0.1 .e1: Triggering bo.app.r5 on 3 subscribers.
2023-11-23 11:42:15.634 14711-14796/***** D/Braze v29.0.1 .d1: Session start event for new session received.
2023-11-23 11:42:15.634 14711-14796/***** D/Braze v29.0.1 .d1: Not automatically requesting Content Card refresh on session created event due to server configuration.
2023-11-23 11:42:15.634 14711-14796/***** D/Braze v29.0.1 .d1: Not automatically requesting Feature Flags refresh on session created event due to server configuration.
2023-11-23 11:42:15.634 14711-14796/***** D/Braze v29.0.1 .d1: Not automatically requesting Push Max on session created event due to server configuration.
2023-11-23 11:42:15.634 14711-14796/***** D/Braze v29.0.1 .d1: Not automatically starting DUST subscription on session created event due to server configuration.
2023-11-23 11:42:15.634 14711-14796/***** D/Braze v29.0.1 .g0: Data flush interval has changed from -1 ms to 10000 ms after connectivity state change to: GREAT and session state: OPEN_SESSION
2023-11-23 11:42:15.634 14711-14796/***** D/Braze v29.0.1 .g0: Posting new sync runnable with delay 10000 ms
2023-11-23 11:42:15.636 14711-14796/***** D/Braze v29.0.1 .t0: Cancelling ending of DUST subscription on delay and resuming stream
2023-11-23 11:42:15.636 14711-14796/***** D/Braze v29.0.1 .t0: Cannot start a dust subscription with mite null and enabled false
2023-11-23 11:42:15.636 14711-14796/***** D/Braze v29.0.1 .t: Checking if this session needs to be sealed: 8479879f-4ba3-4da1-a8fe-18db372ebf7e
2023-11-23 11:42:15.636 14711-14796/***** I/Braze v29.0.1 .o: Completed the openSession call. Starting or continuing session 8479879f-4ba3-4da1-a8fe-18db372ebf7e
2023-11-23 11:42:15.637 14711-14796/***** D/Braze v29.0.1 .p: Messaging session timeout: 21600, current diff: 2
2023-11-23 11:42:15.637 14711-14796/***** D/Braze v29.0.1 .p: Messaging session not started.
2023-11-23 11:42:15.643 14711-14711/***** D/Braze v29.0.1 .BrazeInAppMessageManager: Removing existing in-app message event subscriber before subscribing a new one.
2023-11-23 11:42:15.643 14711-14711/***** D/Braze v29.0.1 .BrazeInAppMessageManager: Subscribing in-app message event subscriber
2023-11-23 11:42:15.643 14711-14711/***** D/Braze v29.0.1 .BrazeInAppMessageManager: Removing existing in-app message event subscriber before subscribing a new one.
2023-11-23 11:42:15.643 14711-14711/***** D/Braze v29.0.1 .BrazeInAppMessageManager: Subscribing in-app message event subscriber
2023-11-23 11:42:15.911 14711-14796/***** D/Braze v29.0.1 .t: Checking if this session needs to be sealed: 8479879f-4ba3-4da1-a8fe-18db372ebf7e
2023-11-23 11:42:15.911 14711-14796/***** D/Braze v29.0.1 .t: Checking if this session needs to be sealed: 8479879f-4ba3-4da1-a8fe-18db372ebf7e
2023-11-23 11:42:15.912 14711-14872/***** D/Braze v29.0.1 .u5: Adding event to storage with uid c54534b7-877f-4192-af5c-157da171777b
2023-11-23 11:42:15.912 14711-14796/***** D/Braze v29.0.1 .e1: bo.app.n0 fired:
    commandType = ADD_BRAZE_EVENT
    brazeEvent = {"name":"ce","data":{"n":"screen_view","p":{"name":"Account"}},"time":1.70073253591E9,"user_id":"******","session_id":"8479879f-4ba3-4da1-a8fe-18db372ebf7e"}
    sessionId = null
    brazeRequest = null
2023-11-23 11:42:15.912 14711-14796/***** D/Braze v29.0.1 .e1: Triggering bo.app.n0 on 0 subscribers.
2023-11-23 11:42:15.912 14711-14796/***** D/Braze v29.0.1 .e1: Triggering bo.app.n0 on 1 subscribers.
2023-11-23 11:42:15.912 14711-14796/***** D/Braze v29.0.1 .bo.app.n6: In flight trigger requests is empty. Executing any pending trigger events.
2023-11-23 11:42:15.912 14711-14796/***** D/Braze v29.0.1 .bo.app.n6: New incoming <custom_event>. Searching for matching triggers.
2023-11-23 11:42:15.912 14711-14796/***** D/Braze v29.0.1 .bo.app.n6: Failed to match triggered action for incoming <custom_event>.
2023-11-23 11:42:15.912 14711-14796/***** D/Braze v29.0.1 .n6: No action found for custom_event event, publishing NoMatchingTriggerEvent
2023-11-23 11:42:15.913 14711-14796/***** D/Braze v29.0.1 .e1: com.braze.events.NoMatchingTriggerEvent fired:
    NoMatchingTriggerEvent(sourceEventType=custom_event)
2023-11-23 11:42:15.913 14711-14796/***** D/Braze v29.0.1 .e1: Triggering com.braze.events.NoMatchingTriggerEvent on 0 subscribers.
2023-11-23 11:42:15.913 14711-14796/***** D/Braze v29.0.1 .e1: Triggering com.braze.events.NoMatchingTriggerEvent on 0 subscribers.
2023-11-23 11:42:15.913 14711-14796/***** I/Braze v29.0.1 .e1: Event was published, but no subscribers were found. But not saving event for publishing later. Event class: class com.braze.events.NoMatchingTriggerEvent

Additional Information

No response

[Bug]: Notification runtime permission, POST_NOTIFICATIONS

Braze Android SDK Version

26.0.0

Steps To Reproduce

targetSdkVersion: 33
implementation "com.braze:android-sdk-ui:26.0.0"

Expected Behavior

We should show the notification permission flow.

Actual Incorrect Behavior

The notification permission flow is not working on Android 13.

Verbose Logs

No response

Additional Information

Hi there,

Updating the targetSdkVersion to 33 we’re experimenting with some issues with the Notification Permission.

In our project we're using:

targetSdkVersion: 33
implementation "com.braze:android-sdk-ui:26.0.0"

We realized in devices with Android 13 the Push notification permission is not shown.
So, since from API 33 and above in Android we need to ask for that permission in a different way, it's called POST_NOTIFICATIONS.
https://developer.android.com/develop/ui/views/notifications/notification-permission

just wondering if this is something that you will address and give us support for that, or is something that we should handle on our side?

Thanks in advance
Jero

[Bug]: logs getting flooded with "java.time.DateTimeException: Missing network time fix"

Braze Android SDK Version

30.3.0

Steps To Reproduce

Run Flutter Android app using the Flutter braze_plugin v9.0.0 which uses the Braze Android SDK v30.3.0 under the hood.

Expected Behavior

No errors in the logs.

Actual Incorrect Behavior

The app works fine, however, ever since upgrading from v29.0.1 to v30.3.0 my logs get flooded with errors like these

E/Braze v30.3.0 .DateTimeUtils(10408): Error reading date and time from network. Using system time instead.
E/Braze v30.3.0 .DateTimeUtils(10408): java.time.DateTimeException: Missing network time fix
E/Braze v30.3.0 .DateTimeUtils(10408): 	at java.lang.reflect.Constructor.newInstance0(Native Method)
E/Braze v30.3.0 .DateTimeUtils(10408): 	at java.lang.reflect.Constructor.newInstance(Constructor.java:343)
E/Braze v30.3.0 .DateTimeUtils(10408): 	at android.os.ParcelableException.readFromParcel(ParcelableException.java:56)
E/Braze v30.3.0 .DateTimeUtils(10408): 	at android.os.ParcelableException$1.createFromParcel(ParcelableException.java:82)
E/Braze v30.3.0 .DateTimeUtils(10408): 	at android.os.ParcelableException$1.createFromParcel(ParcelableException.java:79)
E/Braze v30.3.0 .DateTimeUtils(10408): 	at android.os.Parcel.readParcelableInternal(Parcel.java:5015)
E/Braze v30.3.0 .DateTimeUtils(10408): 	at android.os.Parcel.readParcelable(Parcel.java:4997)
E/Braze v30.3.0 .DateTimeUtils(10408): 	at android.os.Parcel.createExceptionOrNull(Parcel.java:3177)
E/Braze v30.3.0 .DateTimeUtils(10408): 	at android.os.Parcel.createException(Parcel.java:3166)
E/Braze v30.3.0 .DateTimeUtils(10408): 	at android.os.Parcel.readException(Parcel.java:3149)
E/Braze v30.3.0 .DateTimeUtils(10408): 	at android.os.Parcel.readException(Parcel.java:3091)
E/Braze v30.3.0 .DateTimeUtils(10408): 	at android.app.timedetector.ITimeDetectorService$Stub$Proxy.latestNetworkTime(ITimeDetectorService.java:462)
E/Braze v30.3.0 .DateTimeUtils(10408): 	at android.os.SystemClock.currentNetworkTimeMillis(SystemClock.java:345)
E/Braze v30.3.0 .DateTimeUtils(10408): 	at android.os.SystemClock$3.millis(SystemClock.java:392)
E/Braze v30.3.0 .DateTimeUtils(10408): 	at com.braze.support.DateTimeUtils.nowInMilliseconds(SourceFile:4)
E/Braze v30.3.0 .DateTimeUtils(10408): 	at bo.app.c5.a(SourceFile:19)
E/Braze v30.3.0 .DateTimeUtils(10408): 	at bo.app.c5$g.invokeSuspend(SourceFile:4)
E/Braze v30.3.0 .DateTimeUtils(10408): 	at kotlin.coroutines.jvm.internal.BaseContinuationImpl.resumeWith(ContinuationImpl.kt:33)
E/Braze v30.3.0 .DateTimeUtils(10408): 	at kotlinx.coroutines.DispatchedTask.run(DispatchedTask.kt:104)
E/Braze v30.3.0 .DateTimeUtils(10408): 	at kotlinx.coroutines.internal.LimitedDispatcher$Worker.run(LimitedDispatcher.kt:111)
E/Braze v30.3.0 .DateTimeUtils(10408): 	at kotlinx.coroutines.scheduling.TaskImpl.run(Tasks.kt:99)
E/Braze v30.3.0 .DateTimeUtils(10408): 	at kotlinx.coroutines.scheduling.CoroutineScheduler.runSafely(CoroutineScheduler.kt:585)
E/Braze v30.3.0 .DateTimeUtils(10408): 	at kotlinx.coroutines.scheduling.CoroutineScheduler$Worker.executeTask(CoroutineScheduler.kt:802)
E/Braze v30.3.0 .DateTimeUtils(10408): 	at kotlinx.coroutines.scheduling.CoroutineScheduler$Worker.runWorker(CoroutineScheduler.kt:706)
E/Braze v30.3.0 .DateTimeUtils(10408): 	at kotlinx.coroutines.scheduling.CoroutineScheduler$Worker.run(CoroutineScheduler.kt:693)

Using v29.0.1 I only got 1 of these on app startup, now they are just constant and won't go away unless I set

BrazeLogger.logLevel = Log.ASSERT

Verbose Logs

E/Braze v30.3.0 .DateTimeUtils(10408): Error reading date and time from network. Using system time instead.
E/Braze v30.3.0 .DateTimeUtils(10408): java.time.DateTimeException: Missing network time fix
E/Braze v30.3.0 .DateTimeUtils(10408): 	at java.lang.reflect.Constructor.newInstance0(Native Method)
E/Braze v30.3.0 .DateTimeUtils(10408): 	at java.lang.reflect.Constructor.newInstance(Constructor.java:343)
E/Braze v30.3.0 .DateTimeUtils(10408): 	at android.os.ParcelableException.readFromParcel(ParcelableException.java:56)
E/Braze v30.3.0 .DateTimeUtils(10408): 	at android.os.ParcelableException$1.createFromParcel(ParcelableException.java:82)
E/Braze v30.3.0 .DateTimeUtils(10408): 	at android.os.ParcelableException$1.createFromParcel(ParcelableException.java:79)
E/Braze v30.3.0 .DateTimeUtils(10408): 	at android.os.Parcel.readParcelableInternal(Parcel.java:5015)
E/Braze v30.3.0 .DateTimeUtils(10408): 	at android.os.Parcel.readParcelable(Parcel.java:4997)
E/Braze v30.3.0 .DateTimeUtils(10408): 	at android.os.Parcel.createExceptionOrNull(Parcel.java:3177)
E/Braze v30.3.0 .DateTimeUtils(10408): 	at android.os.Parcel.createException(Parcel.java:3166)
E/Braze v30.3.0 .DateTimeUtils(10408): 	at android.os.Parcel.readException(Parcel.java:3149)
E/Braze v30.3.0 .DateTimeUtils(10408): 	at android.os.Parcel.readException(Parcel.java:3091)
E/Braze v30.3.0 .DateTimeUtils(10408): 	at android.app.timedetector.ITimeDetectorService$Stub$Proxy.latestNetworkTime(ITimeDetectorService.java:462)
E/Braze v30.3.0 .DateTimeUtils(10408): 	at android.os.SystemClock.currentNetworkTimeMillis(SystemClock.java:345)
E/Braze v30.3.0 .DateTimeUtils(10408): 	at android.os.SystemClock$3.millis(SystemClock.java:392)
E/Braze v30.3.0 .DateTimeUtils(10408): 	at com.braze.support.DateTimeUtils.nowInMilliseconds(SourceFile:4)
E/Braze v30.3.0 .DateTimeUtils(10408): 	at bo.app.c5.a(SourceFile:19)
E/Braze v30.3.0 .DateTimeUtils(10408): 	at bo.app.c5$g.invokeSuspend(SourceFile:4)
E/Braze v30.3.0 .DateTimeUtils(10408): 	at kotlin.coroutines.jvm.internal.BaseContinuationImpl.resumeWith(ContinuationImpl.kt:33)
E/Braze v30.3.0 .DateTimeUtils(10408): 	at kotlinx.coroutines.DispatchedTask.run(DispatchedTask.kt:104)
E/Braze v30.3.0 .DateTimeUtils(10408): 	at kotlinx.coroutines.internal.LimitedDispatcher$Worker.run(LimitedDispatcher.kt:111)
E/Braze v30.3.0 .DateTimeUtils(10408): 	at kotlinx.coroutines.scheduling.TaskImpl.run(Tasks.kt:99)
E/Braze v30.3.0 .DateTimeUtils(10408): 	at kotlinx.coroutines.scheduling.CoroutineScheduler.runSafely(CoroutineScheduler.kt:585)
E/Braze v30.3.0 .DateTimeUtils(10408): 	at kotlinx.coroutines.scheduling.CoroutineScheduler$Worker.executeTask(CoroutineScheduler.kt:802)
E/Braze v30.3.0 .DateTimeUtils(10408): 	at kotlinx.coroutines.scheduling.CoroutineScheduler$Worker.runWorker(CoroutineScheduler.kt:706)
E/Braze v30.3.0 .DateTimeUtils(10408): 	at kotlinx.coroutines.scheduling.CoroutineScheduler$Worker.run(CoroutineScheduler.kt:693)

Additional Information

Device: Google Pixel 6
OS: Android 14 (SDK 34)

[Feature]: Jetpack Compose Support

What problem are you facing?

I would like to know if there are any plans for Jetpack Compose support in near future?

In our new App that is completely build of Jetpack Compose components (UI, Navigation, etc) we still need to use XML layouts for our customized views like In-App-Modal and implement a custom Braze Navigator to work with the new compose navigation.

Technically it is working, but preference would be to have support for it to avoid workarounds.

Thank you!

Workarounds

Cloned from Appboy/appboy-android-sdk#208

Ideal Solution

No response

Other Information

No response

[Bug]: ANR at Broadcast of Intent { act=com.safetyculture.iauditor.intent.BRAZE_SESSION_SHOULD_SEAL }

Braze Android SDK Version

25.0.0

Steps To Reproduce

Hi Braze team.

We are facing a huge number of ANR.
And the Android Vitals presenting that ANR is happening when
Broadcast of Intent { act=com.safetyculture.iauditor.intent.BRAZE_SESSION_SHOULD_SEAL }

Following are stacktrace

"main" tid=1 Native
  #00  pc 0x00000000000a6b6c  /apex/com.android.runtime/lib64/bionic/libc.so (__epoll_pwait+12)
  #01  pc 0x0000000000017cbc  /system/lib64/libutils.so (android::Looper::pollInner+192)
  #02  pc 0x0000000000017b98  /system/lib64/libutils.so (android::Looper::pollOnce+116)
  #03  pc 0x0000000000162854  /system/lib64/libandroid_runtime.so (android::android_os_MessageQueue_nativePollOnce+48)
  at android.os.MessageQueue.nativePollOnce (Native method)
  at android.os.MessageQueue.next (MessageQueue.java:335)
  at android.os.Looper.loopOnce (Looper.java:161)
  at android.os.Looper.loop (Looper.java:288)
  at android.app.ActivityThread.main (ActivityThread.java:8022)
  at java.lang.reflect.Method.invoke (Native method)
  at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run (RuntimeInit.java:548)
  at com.android.internal.os.ZygoteInit.main (ZygoteInit.java:942)

"ReferenceQueueDaemon" tid=10 Waiting
  at java.lang.Object.wait (Native method)
  at java.lang.Object.wait (Object.java:386)
  at java.lang.Object.wait (Object.java:524)
  at java.lang.Daemons$ReferenceQueueDaemon.runInternal (Daemons.java:239)
  at java.lang.Daemons$Daemon.run (Daemons.java:145)
  at java.lang.Thread.run (Thread.java:1012)

"FinalizerDaemon" tid=11 Waiting
  at java.lang.Object.wait (Native method)
  at java.lang.Object.wait (Object.java:386)
  at java.lang.ref.ReferenceQueue.remove (ReferenceQueue.java:210)
  at java.lang.ref.ReferenceQueue.remove (ReferenceQueue.java:231)
  at java.lang.Daemons$FinalizerDaemon.runInternal (Daemons.java:309)
  at java.lang.Daemons$Daemon.run (Daemons.java:145)
  at java.lang.Thread.run (Thread.java:1012)

"FinalizerWatchdogDaemon" tid=12 Waiting
  at java.lang.Object.wait (Native method)
  at java.lang.Object.wait (Object.java:386)
  at java.lang.Object.wait (Object.java:524)
  at java.lang.Daemons$FinalizerWatchdogDaemon.sleepUntilNeeded (Daemons.java:428)
  at java.lang.Daemons$FinalizerWatchdogDaemon.runInternal (Daemons.java:408)
  at java.lang.Daemons$Daemon.run (Daemons.java:145)
  at java.lang.Thread.run (Thread.java:1012)

It's looks like Main thread get blocked when Braze broadcasting the intent with action BRAZE_SESSION_SHOULD_SEAL.

Could you please have a look?

Thanks and regards.

Expected Behavior

No ANR

Actual Incorrect Behavior

ANR

Verbose Logs

No response

Additional Information

No response

[Bug]: jdk.internal.misc.Unsafe.park

Braze Android SDK Version

30.3.0

Steps To Reproduce

As per the log, this method is getting ANR

setPushNotificationSubscriptionType

Expected Behavior

Should not create ANR

Actual Incorrect Behavior

ANR is getting for many users

Verbose Logs

main (timed waiting):tid=1 systid=30487 
       at jdk.internal.misc.Unsafe.park(Native method)
       at java.util.concurrent.locks.LockSupport.parkNanos(LockSupport.java:252)
       at kotlinx.coroutines.BlockingCoroutine.joinBlocking(Builders.kt:91)
       at kotlinx.coroutines.BuildersKt__BuildersKt.runBlocking(Builders.kt:85)
       at kotlinx.coroutines.BuildersKt.runBlocking(Builders.kt:9)
       at kotlinx.coroutines.BuildersKt__BuildersKt.runBlocking$default(Builders.kt:15)
       at kotlinx.coroutines.BuildersKt.runBlocking$default(Builders.kt:9)
       at t55649196.m5c55e4a0.k797572f3.t8e970ce4(unavailable:36)
       at t55649196.m5c55e4a0.k797572f3.getCurrentUser(SourceFile:1)
       at t55649196.ief4fea39.s80dc7ca3.s66f4d0f1.zd76f9813.d021e715b.m5c55e4a0.ee1fd6ba8.setPushNotificationSubscriptionType(unavailable:22)
       at t55649196.ief4fea39.s80dc7ca3.s66f4d0f1.ui.y77eb7b70.x22c24678.p9d5e45b0(unavailable:60)
       at t55649196.ief4fea39.s80dc7ca3.s66f4d0f1.ui.y77eb7b70.x22c24678.b25920628(unavailable:9)
       at t55649196.ief4fea39.s80dc7ca3.s66f4d0f1.ui.y77eb7b70.x22c24678$ca044e827$1.invoke(SourceFile:5)
       at t55649196.ief4fea39.s80dc7ca3.s66f4d0f1.ui.y77eb7b70.x22c24678$ca044e827$1.invoke(SourceFile:1)
       at t55649196.ief4fea39.s80dc7ca3.s66f4d0f1.qe9d7ecf2.r6efb82ac.se4e1f682.requestPermissions(unavailable:99)
       at t55649196.ief4fea39.s80dc7ca3.s66f4d0f1.qe9d7ecf2.r6efb82ac.p5c0587ce$h7b0fed00.zfe4715f0(unavailable:16)
       at t55649196.ief4fea39.s80dc7ca3.s66f4d0f1.ui.y77eb7b70.x22c24678.requestPermissions(unavailable:38)
       at t55649196.ief4fea39.s80dc7ca3.s66f4d0f1.ui.ec636fe97.yc420334c.m1cb83989.o1eeac866(unavailable:44)
       at t55649196.ief4fea39.s80dc7ca3.s66f4d0f1.ui.ec636fe97.yc420334c.m1cb83989.h4486e06b(unavailable:12)
       at t55649196.ief4fea39.s80dc7ca3.s66f4d0f1.ui.ec636fe97.yc420334c.m1cb83989.wccd3ab75(unavailable:9)
       at t55649196.ief4fea39.s80dc7ca3.s66f4d0f1.ui.ec636fe97.yc420334c.m1cb83989$w8d912e17$1$1$1.h57fc69a7(unavailable:9)
       at t55649196.ief4fea39.s80dc7ca3.s66f4d0f1.ui.ec636fe97.yc420334c.m1cb83989$w8d912e17$1$1$1.r106c1bda(unavailable:9)
       at t55649196.ief4fea39.s80dc7ca3.s66f4d0f1.ui.ec636fe97.yc420334c.m1cb83989$w8d912e17$1$1$1$1.emit(SourceFile:2)
       at t55649196.ief4fea39.s80dc7ca3.s66f4d0f1.ui.ec636fe97.yc420334c.m1cb83989$w8d912e17$1$1$1$1.emit(SourceFile:1)
       at kotlinx.coroutines.flow.StateFlowImpl.collect(StateFlow.kt:400)
       at kotlinx.coroutines.flow.StateFlowImpl$collect$1.invokeSuspend(StateFlow.kt:21)
       at kotlin.coroutines.jvm.internal.BaseContinuationImpl.resumeWith(ContinuationImpl.kt:34)
       at kotlinx.coroutines.CoroutineContextKt.withContinuationContext(CoroutineContext.kt:119)
       at kotlinx.coroutines.DispatchedTaskKt.resume(DispatchedTask.kt:178)
       at kotlinx.coroutines.DispatchedTaskKt.runUnconfinedEventLoop(DispatchedTask.kt:214)
       at kotlinx.coroutines.DispatchedTaskKt.resumeUnconfined(DispatchedTask.kt:190)
       at kotlinx.coroutines.DispatchedTaskKt.dispatch(DispatchedTask.kt:56)
       at kotlinx.coroutines.CancellableContinuationImpl.dispatchResume(CancellableContinuationImpl.kt:16)
       at kotlinx.coroutines.CancellableContinuationImpl.resumeImpl(CancellableContinuationImpl.kt:517)
       at kotlinx.coroutines.CancellableContinuationImpl.resumeImpl$default(CancellableContinuationImpl.kt:497)
       at kotlinx.coroutines.CancellableContinuationImpl.resumeWith(CancellableContinuationImpl.kt:19)
       at kotlinx.coroutines.flow.StateFlowSlot.makePending(StateFlow.kt:66)
       at kotlinx.coroutines.flow.StateFlowImpl.updateState(StateFlow.kt:353)
       at kotlinx.coroutines.flow.StateFlowImpl.setValue(StateFlow.kt:14)
       at t55649196.ief4fea39.s80dc7ca3.s66f4d0f1.ui.ec636fe97.yc420334c.pd9de8f35.cce07e5a6(unavailable:97)
       at t55649196.ief4fea39.s80dc7ca3.s66f4d0f1.ui.ec636fe97.yc420334c.pd9de8f35.gb38dae6f(unavailable:9)
       at t55649196.ief4fea39.s80dc7ca3.s66f4d0f1.ui.ec636fe97.yc420334c.pd9de8f35$cce07e5a6$1.invokeSuspend(unavailable:20)
       at kotlin.coroutines.jvm.internal.BaseContinuationImpl.resumeWith(ContinuationImpl.kt:34)
       at kotlinx.coroutines.CoroutineContextKt.withContinuationContext(CoroutineContext.kt:118)
       at kotlinx.coroutines.DispatchedTask.run(DispatchedTask.kt:90)
       at android.os.Handler.handleCallback(Handler.java:958)
       at android.os.Handler.dispatchMessage(Handler.java:99)
       at android.os.Looper.loopOnce(Looper.java:230)
       at android.os.Looper.loop(Looper.java:319)
       at android.app.ActivityThread.main(ActivityThread.java:8893)
       at java.lang.reflect.Method.invoke(Native method)
       at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:608)
       at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1103)

Additional Information

No response

[Bug]: Strict Mode DiskReadViolation

Braze Android SDK Version

29.0.1

Steps To Reproduce

Call the method Braze.disableSdk(context)

Expected Behavior

Not have an alert about strict mode

Actual Incorrect Behavior

We have an alert

Fatal Exception: android.os.strictmode.DiskReadViolation:
       at android.os.StrictMode$AndroidBlockGuardPolicy.onReadFromDisk(StrictMode.java:1658)
       at libcore.io.BlockGuardOs.access(BlockGuardOs.java:74)
       at libcore.io.ForwardingOs.access(ForwardingOs.java:128)
       at android.app.ActivityThread$AndroidOs.access(ActivityThread.java:8610)
       at java.io.UnixFileSystem.checkAccess(UnixFileSystem.java:281)
       at java.io.File.exists(File.java:813)
       at android.app.SharedPreferencesImpl$EditorImpl.isSpeg(SharedPreferencesImpl.java:505)
       at android.app.SharedPreferencesImpl$EditorImpl.apply(SharedPreferencesImpl.java:517)
       at bo.app.g5.a(SourceFile:5)
       at com.braze.Braze$Companion.disableSdk(SourceFile:1)
       at kotlin.coroutines.jvm.internal.BaseContinuationImpl.resumeWith(ContinuationImpl.kt:33)
       at kotlinx.coroutines.DispatchedTask.run(DispatchedTask.kt:108)
       at android.os.Handler.handleCallback(Handler.java:942)
       at android.os.Handler.dispatchMessage(Handler.java:99)
       at android.os.Looper.loopOnce(Looper.java:226)
       at android.os.Looper.loop(Looper.java:313)
       at android.app.ActivityThread.main(ActivityThread.java:8757)
       at java.lang.reflect.Method.invoke(Method.java)
       at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:571)
       at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1067)

Verbose Logs

No response

Additional Information

Device
Brand:Samsung
Model:Galaxy S20 FE

Operating System
Version:Android 13

[Bug]: Crash when removing view from parent IndexOutOfBoundsException

Braze Android SDK Version

30.1.0

Steps To Reproduce

This Braze crash is the number 1 top crash from our app in production. We have not identified a way to reproduce the crash.

Expected Behavior

App should not crash when activity goes in pause

Actual Incorrect Behavior

App crash when activity goes in pause (not easy to reproduce)

Verbose Logs

Caused by java.lang.IndexOutOfBoundsException:
       at android.view.ViewGroup.removeFromArray(ViewGroup.java:6215)
       at android.view.ViewGroup.removeViewInternal(ViewGroup.java:6403)
       at android.view.ViewGroup.removeViewInternal(ViewGroup.java:6365)
       at android.view.ViewGroup.removeView(ViewGroup.java:6296)
       at com.braze.ui.support.ViewUtils.removeViewFromParent(ViewUtils.kt:28)
       at com.braze.ui.inappmessage.BrazeInAppMessageManager.unregisterInAppMessageManager(BrazeInAppMessageManager.kt:259)
       at com.braze.BrazeActivityLifecycleCallbackListener.onActivityPaused(BrazeActivityLifecycleCallbackListener.kt:122)
       at android.app.Application.dispatchActivityPaused(Application.java:485)
       at android.app.Activity.dispatchActivityPaused(Activity.java:1454)
       at android.app.Activity.onPause(Activity.java:2392)
       at androidx.fragment.app.FragmentActivity.onPause(FragmentActivity.java:282)
       at android.app.Activity.performPause(Activity.java:8400)
       at android.app.Instrumentation.callActivityOnPause(Instrumentation.java:1510)
       at android.app.ActivityThread.performPauseActivityIfNeeded(ActivityThread.java:5261)
       at android.app.ActivityThread.performPauseActivity(ActivityThread.java:5222)
       at android.app.ActivityThread.handleRelaunchActivityInner(ActivityThread.java:6040)
       at android.app.ActivityThread.handleRelaunchActivity(ActivityThread.java:5958)
       at android.app.servertransaction.ActivityRelaunchItem.execute(ActivityRelaunchItem.java:69)
       at android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:135)
       at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:95)
       at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2336)
       at android.os.Handler.dispatchMessage(Handler.java:106)
       at android.os.Looper.loop(Looper.java:247)
       at android.app.ActivityThread.main(ActivityThread.java:8676)
       at java.lang.reflect.Method.invoke(Method.java)
       at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:602)
       at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1130)

Additional Information

We are using the recommended Activity lifecycle callback integration

[Bug]: requestContentCardsRefresh() not refreshing the content cards

Braze Android SDK Version

29.0.1

Steps To Reproduce

     braze.requestContentCardsRefresh()

Expected Behavior

Local content cards list should get updated, remove dismissed cards or add new ones

Actual Incorrect Behavior

The content cards list is not changed

The refresh works as expected when using the deprecated method instead

    braze.requestContentCardsRefresh(
        fromCache = false
    )

Verbose Logs

No response

Additional Information

No response

[Bug]: Black screen visible on Notification click with Android 14

Braze Android SDK Version

com.appboy:android-sdk-ui:24.2.+

Steps To Reproduce

Steps to reproduce :

  1. Integrate appboy/braze sdk-ui with application
  2. Launch application
  3. Send push notification to application when it's in foreground / background [Don't kill application]
  4. Click on notification present in notification bar
  5. Application behaves as expected but it will leave one black screen in background as another instance of application.

Check attached video

Expected Behavior

When application in foreground or background and user clicks on notification to redirect on expected screen, it should not leave black window as another app instance in background.

Actual Incorrect Behavior

When application is in foreground / background and user clicks on notification present in notification bar to redirect on specific page, it's triggering another instance of application with blank/black screen in background as shown in attached video

Verbose Logs

No response

Additional Information

Multiple_Instance.issue.Android.14.webm

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.