Skip to content

RUM-10269: Fix NullPointerException in isOnSecondaryDisplay method#2701

Merged
0xnm merged 1 commit into
developfrom
nogorodnikov/rum-10269/fix-npe-in-isOnSecondaryDisplay-method
Jun 5, 2025
Merged

RUM-10269: Fix NullPointerException in isOnSecondaryDisplay method#2701
0xnm merged 1 commit into
developfrom
nogorodnikov/rum-10269/fix-npe-in-isOnSecondaryDisplay-method

Conversation

@0xnm

@0xnm 0xnm commented Jun 5, 2025

Copy link
Copy Markdown
Member

What does this PR do?

There is an NPE in ViewUtilsInternalTest.isOnSecondaryDisplay method due to the possibility View.getDisplay returning null. It is possible when:

return The logical display, or null if the view is not currently attached to a window.

Full stacktrace:

java.lang.NullPointerException: Attempt to invoke virtual method 'int android.view.Display.getDisplayId()' on a null object reference
	at com.datadog.android.sessionreplay.internal.recorder.ViewUtilsInternal.isOnSecondaryDisplay$dd_sdk_android_session_replay_release(ViewUtilsInternal.java:36)
	at com.datadog.android.sessionreplay.internal.recorder.TreeViewTraversal.traverse(TreeViewTraversal.java:49)
	at com.datadog.android.sessionreplay.internal.recorder.SnapshotProducer.convertViewToNode(SnapshotProducer.java:70)
	at com.datadog.android.sessionreplay.internal.recorder.SnapshotProducer.convertViewToNode(SnapshotProducer.java:89)
	at com.datadog.android.sessionreplay.internal.recorder.SnapshotProducer.convertViewToNode(SnapshotProducer.java:89)
	at com.datadog.android.sessionreplay.internal.recorder.SnapshotProducer.convertViewToNode(SnapshotProducer.java:89)
	at com.datadog.android.sessionreplay.internal.recorder.SnapshotProducer.convertViewToNode(SnapshotProducer.java:89)
	at com.datadog.android.sessionreplay.internal.recorder.SnapshotProducer.convertViewToNode(SnapshotProducer.java:89)
	at com.datadog.android.sessionreplay.internal.recorder.SnapshotProducer.convertViewToNode(SnapshotProducer.java:89)
	at com.datadog.android.sessionreplay.internal.recorder.SnapshotProducer.convertViewToNode(SnapshotProducer.java:89)
	at com.datadog.android.sessionreplay.internal.recorder.SnapshotProducer.convertViewToNode(SnapshotProducer.java:89)
	at com.datadog.android.sessionreplay.internal.recorder.SnapshotProducer.convertViewToNode(SnapshotProducer.java:89)
	at com.datadog.android.sessionreplay.internal.recorder.SnapshotProducer.convertViewToNode(SnapshotProducer.java:89)
	at com.datadog.android.sessionreplay.internal.recorder.SnapshotProducer.convertViewToNode(SnapshotProducer.java:89)
	at com.datadog.android.sessionreplay.internal.recorder.SnapshotProducer.convertViewToNode(SnapshotProducer.java:89)
	at com.datadog.android.sessionreplay.internal.recorder.SnapshotProducer.convertViewToNode(SnapshotProducer.java:89)
	at com.datadog.android.sessionreplay.internal.recorder.SnapshotProducer.convertViewToNode(SnapshotProducer.java:89)
	at com.datadog.android.sessionreplay.internal.recorder.SnapshotProducer.produce(SnapshotProducer.java:42)
	at com.datadog.android.sessionreplay.internal.recorder.listener.WindowsOnDrawListener$snapshotRunnable$1$run$nodes$1.invoke(WindowsOnDrawListener.java:71)
	at com.datadog.android.sessionreplay.internal.recorder.listener.WindowsOnDrawListener$snapshotRunnable$1$run$nodes$1.invoke(WindowsOnDrawListener.java:62)
	at com.datadog.android.api.feature.FeatureScopeExtKt.measureMethodCallPerf(FeatureScopeExtKt.java:35)
	at com.datadog.android.sessionreplay.internal.recorder.listener.WindowsOnDrawListener$snapshotRunnable$1.run(WindowsOnDrawListener.java:62)
	at com.datadog.android.sessionreplay.internal.recorder.Debouncer$executeRunnable$1.invoke(Debouncer.java:47)
	at com.datadog.android.sessionreplay.internal.recorder.Debouncer$executeRunnable$1.invoke(Debouncer.java:46)
	at com.datadog.android.sessionreplay.internal.recorder.Debouncer.runInTimeBalance(Debouncer.java:58)
	at com.datadog.android.sessionreplay.internal.recorder.Debouncer.executeRunnable(Debouncer.java:46)
	at com.datadog.android.sessionreplay.internal.recorder.Debouncer.debounce$dd_sdk_android_session_replay_release(Debouncer.java:38)
	at com.datadog.android.sessionreplay.internal.recorder.listener.WindowsOnDrawListener.onDraw(WindowsOnDrawListener.java:47)
	at android.view.ViewTreeObserver.dispatchOnDraw(ViewTreeObserver.java:1165)
	at android.view.ViewRootImpl.draw(ViewRootImpl.java:5556)
	at android.view.ViewRootImpl.performDraw(ViewRootImpl.java:5330)
	at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:4486)
	at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:3116)
	at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:10885)
	at android.view.Choreographer$CallbackRecord.run(Choreographer.java:1301)
	at android.view.Choreographer$CallbackRecord.run(Choreographer.java:1309)
	at android.view.Choreographer.doCallbacks(Choreographer.java:923)
	at android.view.Choreographer.doFrame(Choreographer.java:852)
	at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:1283)
	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:8762)
	at java.lang.reflect.Method.invoke(Native Method:0)
	at <redacted>(unknown:2)

Review checklist (to be filled by reviewers)

  • Feature or bugfix MUST have appropriate tests (unit, integration, e2e)
  • Make sure you discussed the feature or bugfix with the maintaining team in an Issue
  • Make sure each commit and the PR mention the Issue number (cf the CONTRIBUTING doc)

@0xnm
0xnm requested review from a team as code owners June 5, 2025 08:03
@0xnm 0xnm changed the title RUM-10269: Fix NullPointerException in isOnSecondaryDisplay method RUM-10269: Fix NullPointerException in isOnSecondaryDisplay method Jun 5, 2025
@codecov-commenter

codecov-commenter commented Jun 5, 2025

Copy link
Copy Markdown

Codecov Report

❌ Patch coverage is 50.00000% with 3 lines in your changes missing coverage. Please review.
✅ Project coverage is 69.93%. Comparing base (e2c7dfa) to head (644df81).
⚠️ Report is 2042 commits behind head on develop.

Files with missing lines Patch % Lines
...ssionreplay/internal/recorder/ViewUtilsInternal.kt 50.00% 0 Missing and 3 partials ⚠️
Additional details and impacted files
@@             Coverage Diff             @@
##           develop    #2701      +/-   ##
===========================================
- Coverage    69.95%   69.93%   -0.01%     
===========================================
  Files          822      822              
  Lines        30693    30698       +5     
  Branches      5170     5175       +5     
===========================================
- Hits         21469    21468       -1     
- Misses        7775     7782       +7     
+ Partials      1449     1448       -1     
Files with missing lines Coverage Δ
...ssionreplay/internal/recorder/ViewUtilsInternal.kt 93.75% <50.00%> (-6.25%) ⬇️

... and 36 files with indirect coverage changes

🚀 New features to boost your workflow:
  • ❄️ Test Analytics: Detect flaky tests, report on failures, and find test suite problems.

ambushwork
ambushwork previously approved these changes Jun 5, 2025
@0xnm
0xnm force-pushed the nogorodnikov/rum-10269/fix-npe-in-isOnSecondaryDisplay-method branch from b324d3c to 644df81 Compare June 5, 2025 09:06
@0xnm
0xnm requested a review from ambushwork June 5, 2025 09:06
@0xnm
0xnm merged commit 4912bc6 into develop Jun 5, 2025
3 checks passed
@0xnm
0xnm deleted the nogorodnikov/rum-10269/fix-npe-in-isOnSecondaryDisplay-method branch June 5, 2025 11:37
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants