From a31515a99937773bd08c0c7fde296b5a09e156fe Mon Sep 17 00:00:00 2001 From: Chandru S Date: Fri, 27 Jan 2023 12:01:28 -0800 Subject: [PATCH] Add unit test for ScreenDecorations Test: atest ScreenDecorationsTest Bug: 263449289 Change-Id: I3340a2e5787e2160de1fb5fb58f3217a0cbf8597 --- .../android/systemui/ScreenDecorations.java | 27 +++++----- .../systemui/ScreenDecorationsTest.java | 49 ++++++++++++++++++- 2 files changed, 64 insertions(+), 12 deletions(-) diff --git a/packages/SystemUI/src/com/android/systemui/ScreenDecorations.java b/packages/SystemUI/src/com/android/systemui/ScreenDecorations.java index c1c7f2d892a6d..fb655884d9498 100644 --- a/packages/SystemUI/src/com/android/systemui/ScreenDecorations.java +++ b/packages/SystemUI/src/com/android/systemui/ScreenDecorations.java @@ -124,16 +124,7 @@ public class ScreenDecorations implements CoreStartable, Tunable , Dumpable { }; private final ScreenDecorationsLogger mLogger; - private final AuthController.Callback mAuthControllerCallback = new AuthController.Callback() { - @Override - public void onFaceSensorLocationChanged() { - mLogger.onSensorLocationChanged(); - if (mExecutor != null) { - mExecutor.execute( - () -> updateOverlayProviderViews(new Integer[]{mFaceScanningViewId})); - } - } - }; + private final AuthController mAuthController; private DisplayTracker mDisplayTracker; @VisibleForTesting @@ -340,9 +331,22 @@ public class ScreenDecorations implements CoreStartable, Tunable , Dumpable { mFaceScanningFactory = faceScanningFactory; mFaceScanningViewId = com.android.systemui.R.id.face_scanning_anim; mLogger = logger; - authController.addCallback(mAuthControllerCallback); + mAuthController = authController; } + + private final AuthController.Callback mAuthControllerCallback = new AuthController.Callback() { + @Override + public void onFaceSensorLocationChanged() { + mLogger.onSensorLocationChanged(); + if (mExecutor != null) { + mExecutor.execute( + () -> updateOverlayProviderViews( + new Integer[]{mFaceScanningViewId})); + } + } + }; + @Override public void start() { if (DEBUG_DISABLE_SCREEN_DECORATIONS) { @@ -353,6 +357,7 @@ public class ScreenDecorations implements CoreStartable, Tunable , Dumpable { mExecutor = mThreadFactory.buildDelayableExecutorOnHandler(mHandler); mExecutor.execute(this::startOnScreenDecorationsThread); mDotViewController.setUiExecutor(mExecutor); + mAuthController.addCallback(mAuthControllerCallback); } private boolean isPrivacyDotEnabled() { diff --git a/packages/SystemUI/tests/src/com/android/systemui/ScreenDecorationsTest.java b/packages/SystemUI/tests/src/com/android/systemui/ScreenDecorationsTest.java index fc111485971ca..4cf5a4be0b601 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/ScreenDecorationsTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/ScreenDecorationsTest.java @@ -34,8 +34,10 @@ import static org.junit.Assert.assertThat; import static org.junit.Assert.assertTrue; import static org.junit.Assert.fail; import static org.mockito.ArgumentMatchers.any; +import static org.mockito.ArgumentMatchers.anyInt; import static org.mockito.ArgumentMatchers.eq; import static org.mockito.ArgumentMatchers.isA; +import static org.mockito.Mockito.clearInvocations; import static org.mockito.Mockito.doAnswer; import static org.mockito.Mockito.doNothing; import static org.mockito.Mockito.doReturn; @@ -104,8 +106,12 @@ import com.android.systemui.util.time.FakeSystemClock; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; +import org.mockito.ArgumentCaptor; +import org.mockito.Captor; import org.mockito.Mock; import org.mockito.MockitoAnnotations; +import org.mockito.invocation.InvocationOnMock; +import org.mockito.stubbing.Answer; import java.util.ArrayList; import java.util.List; @@ -119,7 +125,7 @@ public class ScreenDecorationsTest extends SysuiTestCase { private WindowManager mWindowManager; private DisplayManager mDisplayManager; private SecureSettings mSecureSettings; - private final FakeExecutor mExecutor = new FakeExecutor(new FakeSystemClock()); + private FakeExecutor mExecutor; private final FakeDisplayTracker mDisplayTracker = new FakeDisplayTracker(mContext); private FakeThreadFactory mThreadFactory; private ArrayList mPrivacyDecorProviders; @@ -161,6 +167,8 @@ public class ScreenDecorationsTest extends SysuiTestCase { private PrivacyDotViewController.ShowingListener mPrivacyDotShowingListener; @Mock private CutoutDecorProviderFactory mCutoutFactory; + @Captor + private ArgumentCaptor mAuthControllerCallback; private List mMockCutoutList; @Before @@ -169,6 +177,7 @@ public class ScreenDecorationsTest extends SysuiTestCase { Handler mainHandler = new Handler(TestableLooper.get(this).getLooper()); mSecureSettings = new FakeSettings(); + mExecutor = new FakeExecutor(new FakeSystemClock()); mThreadFactory = new FakeThreadFactory(mExecutor); mThreadFactory.setHandler(mainHandler); @@ -1165,6 +1174,44 @@ public class ScreenDecorationsTest extends SysuiTestCase { verifyOverlaysExistAndAdded(false, true, false, true, View.VISIBLE); } + @Test + public void faceSensorLocationChangesReloadsFaceScanningOverlay() { + mFaceScanningProviders = new ArrayList<>(); + mFaceScanningProviders.add(mFaceScanningDecorProvider); + when(mFaceScanningProviderFactory.getProviders()).thenReturn(mFaceScanningProviders); + when(mFaceScanningProviderFactory.getHasProviders()).thenReturn(true); + ScreenDecorations screenDecorations = new ScreenDecorations(mContext, mExecutor, + mSecureSettings, mTunerService, mUserTracker, mDisplayTracker, mDotViewController, + mThreadFactory, mPrivacyDotDecorProviderFactory, mFaceScanningProviderFactory, + new ScreenDecorationsLogger(logcatLogBuffer("TestLogBuffer")), mAuthController); + screenDecorations.start(); + verify(mAuthController).addCallback(mAuthControllerCallback.capture()); + when(mContext.getDisplay()).thenReturn(mDisplay); + when(mDisplay.getDisplayInfo(any())).thenAnswer(new Answer() { + @Override + public Boolean answer(InvocationOnMock invocation) throws Throwable { + DisplayInfo displayInfo = invocation.getArgument(0); + int modeId = 1; + displayInfo.modeId = modeId; + displayInfo.supportedModes = new Display.Mode[]{new Display.Mode(modeId, 1024, 1024, + 90)}; + return false; + } + }); + mExecutor.runAllReady(); + clearInvocations(mFaceScanningDecorProvider); + + AuthController.Callback callback = mAuthControllerCallback.getValue(); + callback.onFaceSensorLocationChanged(); + mExecutor.runAllReady(); + + verify(mFaceScanningDecorProvider).onReloadResAndMeasure(any(), + anyInt(), + anyInt(), + anyInt(), + any()); + } + @Test public void testPrivacyDotShowingListenerWorkWellWithNullParameter() { mPrivacyDotShowingListener.onPrivacyDotShown(null);