From 835f63f972aa96945f518d139456cf794d041ca0 Mon Sep 17 00:00:00 2001 From: Yi Jiang Date: Wed, 29 Dec 2021 23:59:33 +0000 Subject: [PATCH] Fixes NPE from resolveRotation() RotatatinResolverInternal can be null when the service is not ready. This change adds a null check to avoid NPE. Test: atest WindowOrientatinListenerTest Bug: 199375757 Bug: 199381926 Change-Id: I1b6f3aee3eddf8f565f7ca21b1879f40c36f4e5c --- .../android/server/wm/WindowOrientationListener.java | 4 ++++ .../server/wm/WindowOrientationListenerTest.java | 11 ++++++++++- 2 files changed, 14 insertions(+), 1 deletion(-) diff --git a/services/core/java/com/android/server/wm/WindowOrientationListener.java b/services/core/java/com/android/server/wm/WindowOrientationListener.java index a967ea8fbf8c4..de87ab9dcce09 100644 --- a/services/core/java/com/android/server/wm/WindowOrientationListener.java +++ b/services/core/java/com/android/server/wm/WindowOrientationListener.java @@ -1167,6 +1167,10 @@ public abstract class WindowOrientationListener { if (mRotationResolverService == null) { mRotationResolverService = LocalServices.getService( RotationResolverInternal.class); + if (mRotationResolverService == null) { + finalizeRotation(reportedRotation); + return; + } } String packageName = null; diff --git a/services/tests/servicestests/src/com/android/server/wm/WindowOrientationListenerTest.java b/services/tests/servicestests/src/com/android/server/wm/WindowOrientationListenerTest.java index 2794d48371012..c64ff9e128e62 100644 --- a/services/tests/servicestests/src/com/android/server/wm/WindowOrientationListenerTest.java +++ b/services/tests/servicestests/src/com/android/server/wm/WindowOrientationListenerTest.java @@ -114,7 +114,7 @@ public class WindowOrientationListenerTest { } @Test - public void testSensorChanged_normalCase2() { + public void testOnSensorChanged_normalCase2() { mWindowOrientationListener.mOrientationJudge.onSensorChanged(mFakeSensorEvent); mFakeRotationResolverInternal.callbackWithFailureResult( @@ -123,6 +123,15 @@ public class WindowOrientationListenerTest { assertThat(mFinalizedRotation).isEqualTo(DEFAULT_SENSOR_ROTATION); } + @Test + public void testOnSensorChanged_rotationResolverServiceIsNull_useSensorResult() { + mWindowOrientationListener.mRotationResolverService = null; + + mWindowOrientationListener.mOrientationJudge.onSensorChanged(mFakeSensorEvent); + + assertThat(mFinalizedRotation).isEqualTo(DEFAULT_SENSOR_ROTATION); + } + static final class TestableRotationResolver extends RotationResolverInternal { @Surface.Rotation RotationResolverCallbackInternal mCallback;