plaid / plaid-link-android

Plaid Link Android SDK
https://plaid.com/docs/link/android
MIT License
114 stars 48 forks source link

Webview related crash in 4.2.0 #276

Closed adamalyyan closed 4 months ago

adamalyyan commented 4 months ago

The problem

We recently updated to use version 4.2.0 of the SDK and when the app version with this SDK went out, we started seeing crashes related to Webview. Attached the full trace below. It seems to originate from com.plaid.internal.pf.onKeyDown(pf:7)

Environment

Android OS Version 8-14
Android Devices/Emulators Various (Samsungs, Pixels, Moto)

Expected Result

The flow to complete successfully.

Actual Result

Caused by: kotlin.UninitializedPropertyAccessException: lateinit property listener has not been initialized
        at com.plaid.internal.pf.onKeyDown(pf:7)
        at android.view.KeyEvent.dispatch(KeyEvent.java:3498)
        at android.view.View.dispatchKeyEvent(View.java:16061)
        at android.view.ViewGroup.dispatchKeyEvent(ViewGroup.java:1983)
        at android.webkit.WebView.access$701(WebView.java:114)
        at android.webkit.WebView$PrivateAccess.super_dispatchKeyEvent(WebView.java:2455)
        at com.android.webview.chromium.C.b(chromium-TrichromeWebViewGoogle6432.aab-stable-631211833:5)
        at org.chromium.content.browser.ContentUiEventHandler.dispatchKeyEvent(chromium-TrichromeWebViewGoogle6432.aab-stable-631211833:112)
        at J.N.MZE$0qqv(chromium-TrichromeWebViewGoogle6432.aab-stable-631211833:-2)
        at WV.H5.dispatchKeyEvent(chromium-TrichromeWebViewGoogle6432.aab-stable-631211833:117)
        at com.android.webview.chromium.WebViewChromium.dispatchKeyEvent(chromium-TrichromeWebViewGoogle6432.aab-stable-631211833:50)
        at android.webkit.WebView.dispatchKeyEvent(WebView.java:3014)
        at android.view.ViewGroup.dispatchKeyEvent(ViewGroup.java:1988)
        at android.view.ViewGroup.dispatchKeyEvent(ViewGroup.java:1988)
        at android.view.ViewGroup.dispatchKeyEvent(ViewGroup.java:1988)
        at android.view.ViewGroup.dispatchKeyEvent(ViewGroup.java:1988)
        at android.view.ViewGroup.dispatchKeyEvent(ViewGroup.java:1988)
        at android.view.ViewGroup.dispatchKeyEvent(ViewGroup.java:1988)
        at android.view.ViewGroup.dispatchKeyEvent(ViewGroup.java:1988)
        at android.view.ViewGroup.dispatchKeyEvent(ViewGroup.java:1988)
        at com.android.internal.policy.DecorView.superDispatchKeyEvent(DecorView.java:764)
        at com.android.internal.policy.PhoneWindow.superDispatchKeyEvent(PhoneWindow.java:1957)
        at android.app.Activity.dispatchKeyEvent(Activity.java:4483)
        at androidx.core.app.ComponentActivity.superDispatchKeyEvent(ComponentActivity:120)
        at androidx.core.view.KeyEventDispatcher.dispatchKeyEvent(KeyEventDispatcher:85)
        at androidx.core.app.ComponentActivity.dispatchKeyEvent(ComponentActivity:138)
        at androidx.appcompat.app.AppCompatActivity.dispatchKeyEvent(AppCompatActivity:604)
        at com.datadog.android.rum.internal.instrumentation.gestures.WindowCallbackWrapper.dispatchKeyEvent(WindowCallbackWrapper:113)
        at androidx.appcompat.view.WindowCallbackWrapper.dispatchKeyEvent(WindowCallbackWrapper:60)
        at androidx.appcompat.app.AppCompatDelegateImpl$AppCompatWindowCallback.dispatchKeyEvent(AppCompatDelegateImpl:3413)
        at curtains.internal.WindowCallbackWrapper$dispatchKeyEvent$dispatch$1.invoke(WindowCallbackWrapper:32)
        at curtains.internal.WindowCallbackWrapper$dispatchKeyEvent$dispatch$1.invoke(WindowCallbackWrapper:26)
        at curtains.internal.WindowCallbackWrapper$dispatchKeyEvent$dispatch$1.invoke$bridge(WindowCallbackWrapper:84)
        at papa.internal.RealInputTracker$listener$1.onRootViewAdded$lambda-8$lambda-7(RealInputTracker:185)
        at papa.internal.RealInputTracker$listener$1$$InternalSyntheticLambda$2$af507575381c594f0046549b14b3d85987e91006e02bec5b1d2e51b4793b20f7$1.intercept(RealInputTracker:166)
        at curtains.internal.WindowCallbackWrapper.dispatchKeyEvent(WindowCallbackWrapper:39)
        at com.android.internal.policy.DecorView.dispatchKeyEvent(DecorView.java:678)
        at android.view.ViewRootImpl$ViewPostImeInputStage.processKeyEvent(ViewRootImpl.java:8378)
        at android.view.ViewRootImpl$ViewPostImeInputStage.onProcess(ViewRootImpl.java:8238)
        at android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:7571)
        at android.view.ViewRootImpl$InputStage.onDeliverToNext(ViewRootImpl.java:7628)
        at android.view.ViewRootImpl$InputStage.forward(ViewRootImpl.java:7594)
        at android.view.ViewRootImpl$AsyncInputStage.forward(ViewRootImpl.java:7797)
        at android.view.ViewRootImpl$InputStage.apply(ViewRootImpl.java:7602)
        at android.view.ViewRootImpl$AsyncInputStage.apply(ViewRootImpl.java:7854)
        at android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:7575)
        at android.view.ViewRootImpl$InputStage.onDeliverToNext(ViewRootImpl.java:7628)
        at android.view.ViewRootImpl$InputStage.forward(ViewRootImpl.java:7594)
        at android.view.ViewRootImpl$InputStage.apply(ViewRootImpl.java:7602)
        at android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:7575)
        at android.view.ViewRootImpl$InputStage.onDeliverToNext(ViewRootImpl.java:7628)
        at android.view.ViewRootImpl$InputStage.forward(ViewRootImpl.java:7594)
        at android.view.ViewRootImpl$AsyncInputStage.forward(ViewRootImpl.java:7830)
        at android.view.ViewRootImpl$ImeInputStage.onFinishedInputEvent(ViewRootImpl.java:8072)
        at android.view.inputmethod.InputMethodManager$PendingEvent.run(InputMethodManager.java:4578)
        at android.view.inputmethod.InputMethodManager.invokeFinishedInputEventCallback(InputMethodManager.java:4012)
        at android.view.inputmethod.InputMethodManager.finishedInputEvent(InputMethodManager.java:4003)
        at android.view.inputmethod.InputMethodManager.-$$Nest$mfinishedInputEvent(Unknown)
        at android.view.inputmethod.InputMethodManager$ImeInputEventSender.onInputEventFinished(InputMethodManager.java:4555)
        at android.view.InputEventSender.dispatchInputEventFinished(InputEventSender.java:154)
        at android.os.MessageQueue.nativePollOnce(MessageQueue.java:-2)
        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:8893)
        at java.lang.reflect.Method.invoke(Method.java:-2)
        at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:608)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1103)
melissaosullivan commented 4 months ago

Hi @adamalyyan,

This issue has been addressed in 4.2.1 and all later releases, so please upgrade.

In 4.2.0 this crash should only happen when the user presses the back button on the first page of Plaid webview, in which case it will cause a link LinkExit with this crash message -- however a LinkExit (without a crash message) is the intended behavior. So there shouldn't be large behavior difference, but we recommend upgrading. Thanks!

adamalyyan commented 4 months ago

Hi @melissaosullivan sounds good, thank you! We'll go ahead and upgrade to 4.2.1!