summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
author Oleg Blinnikov <olb@google.com> 2024-05-29 18:42:06 +0000
committer Oleg Blinnikov <olb@google.com> 2024-05-29 19:43:19 +0000
commit782c49d799da95fc6ff686aa3d87c2b481ac6d9f (patch)
tree1bd2cc54a2a44d476c5c5268238cec6f63e47c97
parent52ad3e2ac04d0818bb9a976ca9b308c7b9217de6 (diff)
Check that modespecs are not null
Change-Id: I259dad565ef86ca9e31918948f8a09caf1106969 Bug: 335720463 Test: atest LocalDisplayAdapterTest
-rw-r--r--services/core/java/com/android/server/display/LocalDisplayAdapter.java6
-rw-r--r--services/tests/displayservicetests/src/com/android/server/display/LocalDisplayAdapterTest.java14
2 files changed, 20 insertions, 0 deletions
diff --git a/services/core/java/com/android/server/display/LocalDisplayAdapter.java b/services/core/java/com/android/server/display/LocalDisplayAdapter.java
index 182b05a68028..44846f310348 100644
--- a/services/core/java/com/android/server/display/LocalDisplayAdapter.java
+++ b/services/core/java/com/android/server/display/LocalDisplayAdapter.java
@@ -168,6 +168,12 @@ final class LocalDisplayAdapter extends DisplayAdapter {
}
SurfaceControl.DesiredDisplayModeSpecs modeSpecs =
mSurfaceControlProxy.getDesiredDisplayModeSpecs(displayToken);
+ if (modeSpecs == null) {
+ // If mode specs is null, it most probably means that display got
+ // unplugged very rapidly.
+ Slog.w(TAG, "Desired display mode specs from SurfaceFlinger are null");
+ return;
+ }
LocalDisplayDevice device = mDevices.get(physicalDisplayId);
if (device == null) {
// Display was added.
diff --git a/services/tests/displayservicetests/src/com/android/server/display/LocalDisplayAdapterTest.java b/services/tests/displayservicetests/src/com/android/server/display/LocalDisplayAdapterTest.java
index 12050e1beaed..01ff35fc088c 100644
--- a/services/tests/displayservicetests/src/com/android/server/display/LocalDisplayAdapterTest.java
+++ b/services/tests/displayservicetests/src/com/android/server/display/LocalDisplayAdapterTest.java
@@ -1142,6 +1142,20 @@ public class LocalDisplayAdapterTest {
}
@Test
+ public void test_createLocalExternalDisplay_displayManagementEnabled_doesNotCrash()
+ throws Exception {
+ FakeDisplay display = new FakeDisplay(PORT_A);
+ display.info.isInternal = false;
+ setUpDisplay(display);
+ updateAvailableDisplays();
+ mAdapter.registerLocked();
+ when(mSurfaceControlProxy.getDesiredDisplayModeSpecs(display.token)).thenReturn(null);
+ mInjector.getTransmitter().sendHotplug(display, /* connected */ true);
+ waitForHandlerToComplete(mHandler, HANDLER_WAIT_MS);
+ assertThat(mListener.addedDisplays.size()).isEqualTo(1);
+ }
+
+ @Test
public void test_createLocalExternalDisplay_displayManagementEnabled_shouldHaveDefaultGroup()
throws Exception {
FakeDisplay display = new FakeDisplay(PORT_A);