Skip to content

Commit e0f1404

Browse files
committed
Add synchronization to to fix possible race condition
Fixes a null pointer exception occurring due to attempt to call `showView` on a null `messageView` object, likely due to it being set to null by a background thread resulting in a race condition. By locking the `messageView` to one thread at a time, we can prevent this issue from occurring.
1 parent 0a21c1f commit e0f1404

File tree

1 file changed

+24
-14
lines changed

1 file changed

+24
-14
lines changed

OneSignalSDK/onesignal/src/main/java/com/onesignal/WebViewManager.java

Lines changed: 24 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,7 @@ class WebViewManager extends ActivityLifecycleHandler.ActivityAvailableListener
3838
private static final String TAG = WebViewManager.class.getCanonicalName();
3939
private static final int MARGIN_PX_SIZE = dpToPx(24);
4040
private static final int IN_APP_MESSAGE_INIT_DELAY = 200;
41+
private final Object messageViewSyncLock = new Object() {};
4142

4243
enum Position {
4344
TOP_BANNER,
@@ -333,23 +334,25 @@ void stopped(@NonNull Activity activity) {
333334
void lostFocus() {
334335
OneSignal.getInAppMessageController().messageWasDismissedByBackPress(message);
335336
removeActivityListener();
336-
messageView = null;
337+
setMessageView(null);
337338
}
338339

339340
private void showMessageView(@Nullable Integer newHeight) {
340-
if (messageView == null) {
341-
OneSignal.Log(OneSignal.LOG_LEVEL.WARN, "No messageView found to update a with a new height.");
342-
return;
343-
}
341+
synchronized (messageViewSyncLock) {
342+
if (messageView == null) {
343+
OneSignal.Log(OneSignal.LOG_LEVEL.WARN, "No messageView found to update a with a new height.");
344+
return;
345+
}
344346

345-
OneSignal.Log(OneSignal.LOG_LEVEL.DEBUG, "In app message, showing first one with height: " + newHeight);
346-
messageView.setWebView(webView);
347-
if (newHeight != null) {
348-
lastPageHeight = newHeight;
349-
messageView.updateHeight(newHeight);
347+
OneSignal.Log(OneSignal.LOG_LEVEL.DEBUG, "In app message, showing first one with height: " + newHeight);
348+
messageView.setWebView(webView);
349+
if (newHeight != null) {
350+
lastPageHeight = newHeight;
351+
messageView.updateHeight(newHeight);
352+
}
353+
messageView.showView(activity);
354+
messageView.checkIfShouldDismiss();
350355
}
351-
messageView.showView(activity);
352-
messageView.checkIfShouldDismiss();
353356
}
354357

355358
@SuppressLint({"SetJavaScriptEnabled", "AddJavascriptInterface"})
@@ -395,9 +398,16 @@ private void setWebViewToMaxSize(Activity activity) {
395398
webView.layout(0,0, getWebViewMaxSizeX(activity), getWebViewMaxSizeY(activity));
396399
}
397400

401+
private void setMessageView(InAppMessageView view) {
402+
synchronized (messageViewSyncLock) {
403+
messageView = view;
404+
}
405+
}
406+
398407
private void createNewInAppMessageView(@NonNull Position displayLocation, int pageHeight, boolean dragToDismissDisabled) {
399408
lastPageHeight = pageHeight;
400-
messageView = new InAppMessageView(webView, displayLocation, pageHeight, message.getDisplayDuration(), dragToDismissDisabled);
409+
InAppMessageView newView = new InAppMessageView(webView, displayLocation, pageHeight, message.getDisplayDuration(), dragToDismissDisabled);
410+
setMessageView(newView);
401411
messageView.setMessageController(new InAppMessageView.InAppMessageViewListener() {
402412
@Override
403413
public void onMessageWasShown() {
@@ -451,7 +461,7 @@ protected void dismissAndAwaitNextMessage(@Nullable final OneSignalGenericCallba
451461
messageView.dismissAndAwaitNextMessage(new OneSignalGenericCallback() {
452462
@Override
453463
public void onComplete() {
454-
messageView = null;
464+
setMessageView(null);
455465
if (callback != null)
456466
callback.onComplete();
457467
}

0 commit comments

Comments
 (0)