Hello!
I am working on a Samsung-specific crash and could use help figuring out a solution. In short, the User enabled the device Magnifier, is editing android.widget.TextView, and is moving the drag handle. Under these conditions, the user initiates a crash from Magnifier. The effected app has a large, US-focused user base spanning many manufacturers and Android OS versions.
According to Crashlytics, the crash report has
- 100% Samsung users across a wide variety of devices. For example: Galaxy S25 Ultra, Galaxy A35 5G, Galaxy Tab A9+ 5G,
Galaxy Z Fold5, Galaxy Tab S8+. - 100% Android 15 users.
- 100% users in foreground
- 0% users rooted.
- 100% users in portrait orientation
The stacktrace demonstrates the user is
- editing android.widget.TextView via android.widget.Editor
- moving the drag handle (HandleView.updateHandlesVisibility)
- has Magnifier running (Magnifier.getPosition throws NPE)
After devoting multiple hours to reproduction, I have been unsuccessful. Even despite being under the same conditions (device, manufacturer, Android SDK, magnifier, editing text & moving drag handle).
90% of stacktraces are exactly the same, and 100% are very similar. They originate entirely from system level code. Below is the common stacktrace.
Fatal Exception: java.lang.NullPointerException: Attempt to read from field ‘int android.graphics.Rect.left’ on a null object reference in method ‘android.graphics.Point android.widget.Magnifier.getPosition()’
at android.widget.Magnifier.getPosition(Magnifier.java:594)
at android.widget.Editor$HandleView.updateHandlesVisibility(Editor.java:6486)
at android.widget.Editor$HandleView.updateMagnifier(Editor.java:6551)
at android.widget.Editor$SelectionHandleView.onTouchEvent(Editor.java:7872)
at android.view.View.performOnTouchCallback(View.java:17047)
at android.view.View.dispatchTouchEvent(View.java:17004)
at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:3353)
at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:3023)
at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:3353)
at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:3023)
at android.widget.PopupWindow$PopupDecorView.dispatchTouchEvent(PopupWindow.java:2921)
at android.view.View.dispatchPointerEvent(View.java:17329)
at android.view.ViewRootImpl$ViewPostImeInputStage.processPointerEvent(ViewRootImpl.java:9551)
at android.view.ViewRootImpl$ViewPostImeInputStage.onProcess(ViewRootImpl.java:9268)
at android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:8590)
at android.view.ViewRootImpl$InputStage.onDeliverToNext(ViewRootImpl.java:8647)
at android.view.ViewRootImpl$InputStage.forward(ViewRootImpl.java:8613)
at android.view.ViewRootImpl$AsyncInputStage.forward(ViewRootImpl.java:8813)
at android.view.ViewRootImpl$InputStage.apply(ViewRootImpl.java:8621)
at android.view.ViewRootImpl$AsyncInputStage.apply(ViewRootImpl.java:8870)
at android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:8594)
at android.view.ViewRootImpl$InputStage.onDeliverToNext(ViewRootImpl.java:8647)
at android.view.ViewRootImpl$InputStage.forward(ViewRootImpl.java:8613)
at android.view.ViewRootImpl$InputStage.apply(ViewRootImpl.java:8621)
at android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:8594)
at android.view.ViewRootImpl.deliverInputEvent(ViewRootImpl.java:12432)
at android.view.ViewRootImpl.doProcessInputEvents(ViewRootImpl.java:12327)
at android.view.ViewRootImpl.enqueueInputEvent(ViewRootImpl.java:12283)
at android.view.ViewRootImpl$WindowInputEventReceiver.onInputEvent(ViewRootImpl.java:12582)
at android.view.InputEventReceiver.dispatchInputEvent(InputEventReceiver.java:385)
at android.view.InputEventReceiver.nativeConsumeBatchedInputEvents(InputEventReceiver.java)
at android.view.InputEventReceiver.consumeBatchedInputEvents(InputEventReceiver.java:313)
at android.view.ViewRootImpl.doConsumeBatchedInput(ViewRootImpl.java:12531)
at android.view.ViewRootImpl$ConsumeBatchedInputRunnable.run(ViewRootImpl.java:12679)
at android.view.Choreographer$CallbackRecord.run(Choreographer.java:1751)
at android.view.Choreographer$CallbackRecord.run(Choreographer.java:1760)
at android.view.Choreographer.doCallbacks(Choreographer.java:1216)
at android.view.Choreographer.doFrame(Choreographer.java:1127)
at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:1707)
at android.os.Handler.handleCallback(Handler.java:959)
at android.os.Handler.dispatchMessage(Handler.java:100)
at android.os.Looper.loopOnce(Looper.java:257)
at android.os.Looper.loop(Looper.java:342)
at android.app.ActivityThread.main(ActivityThread.java:9634)
at java.lang.reflect.Method.invoke(Method.java)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:619)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:929)
Please let me know if you need further information!