From 12930e8ddce8620923ec6d887a3bc355fa4b2240 Mon Sep 17 00:00:00 2001 From: kwaky Date: Fri, 12 Jun 2020 13:18:54 -0700 Subject: [PATCH] Hide UserSwitchTransitionView if it is not hidden within timeout. This prevents being stuck in the Loading screen even if the proper User Lifecycle event was not broadcast. Test: Unit Tests + Manual -- Verify that the UserSwitchTransitionView is hidden after the timeout threshold when the UserLifecycleEvent listener is not registered. Bug: 158705895 Change-Id: I895f04bda395bac271b01fbb414a8bf484348324 --- packages/CarSystemUI/res/values/config.xml | 3 +++ .../UserSwitchTransitionViewController.java | 22 ++++++++++++++++ ...serSwitchTransitionViewControllerTest.java | 25 +++++++++++++++++++ 3 files changed, 50 insertions(+) diff --git a/packages/CarSystemUI/res/values/config.xml b/packages/CarSystemUI/res/values/config.xml index 4bf0fca445d10..cf967c02bec53 100644 --- a/packages/CarSystemUI/res/values/config.xml +++ b/packages/CarSystemUI/res/values/config.xml @@ -118,4 +118,7 @@ com.android.systemui.car.window.SystemUIOverlayWindowManager com.android.systemui.car.volume.VolumeUI + + + 5000 diff --git a/packages/CarSystemUI/src/com/android/systemui/car/userswitcher/UserSwitchTransitionViewController.java b/packages/CarSystemUI/src/com/android/systemui/car/userswitcher/UserSwitchTransitionViewController.java index 8aa7b6389d85c..45f3d342fb6e8 100644 --- a/packages/CarSystemUI/src/com/android/systemui/car/userswitcher/UserSwitchTransitionViewController.java +++ b/packages/CarSystemUI/src/com/android/systemui/car/userswitcher/UserSwitchTransitionViewController.java @@ -33,6 +33,7 @@ import android.widget.ImageView; import android.widget.TextView; import com.android.internal.annotations.GuardedBy; +import com.android.internal.annotations.VisibleForTesting; import com.android.settingslib.drawable.CircleFramedDrawable; import com.android.systemui.R; import com.android.systemui.car.window.OverlayViewController; @@ -49,12 +50,22 @@ import javax.inject.Singleton; public class UserSwitchTransitionViewController extends OverlayViewController { private static final String TAG = "UserSwitchTransition"; private static final String ENABLE_DEVELOPER_MESSAGE_TRUE = "true"; + private static final boolean DEBUG = false; private final Context mContext; private final Handler mHandler; private final Resources mResources; private final UserManager mUserManager; private final IWindowManager mWindowManagerService; + private final int mWindowShownTimeoutMs; + private final Runnable mWindowShownTimeoutCallback = () -> { + if (DEBUG) { + Log.w(TAG, "Window was not hidden within " + getWindowShownTimeoutMs() + " ms, so it" + + "was hidden by mWindowShownTimeoutCallback."); + } + + handleHide(); + }; @GuardedBy("this") private boolean mShowing; @@ -76,6 +87,8 @@ public class UserSwitchTransitionViewController extends OverlayViewController { mResources = resources; mUserManager = userManager; mWindowManagerService = windowManagerService; + mWindowShownTimeoutMs = mResources.getInteger( + R.integer.config_userSwitchTransitionViewShownTimeoutMs); } /** @@ -98,6 +111,9 @@ public class UserSwitchTransitionViewController extends OverlayViewController { populateDialog(mPreviousUserId, newUserId); // next time a new user is selected, this current new user will be the previous user. mPreviousUserId = newUserId; + // In case the window is still showing after WINDOW_SHOWN_TIMEOUT_MS, then hide the + // window and log a warning message. + mHandler.postDelayed(mWindowShownTimeoutCallback, mWindowShownTimeoutMs); }); } @@ -105,6 +121,12 @@ public class UserSwitchTransitionViewController extends OverlayViewController { if (!mShowing) return; mShowing = false; mHandler.post(this::stop); + mHandler.removeCallbacks(mWindowShownTimeoutCallback); + } + + @VisibleForTesting + int getWindowShownTimeoutMs() { + return mWindowShownTimeoutMs; } private void populateDialog(@UserIdInt int previousUserId, @UserIdInt int newUserId) { diff --git a/packages/CarSystemUI/tests/src/com/android/systemui/car/userswitcher/UserSwitchTransitionViewControllerTest.java b/packages/CarSystemUI/tests/src/com/android/systemui/car/userswitcher/UserSwitchTransitionViewControllerTest.java index 65c556269f13d..797dbf515b7ec 100644 --- a/packages/CarSystemUI/tests/src/com/android/systemui/car/userswitcher/UserSwitchTransitionViewControllerTest.java +++ b/packages/CarSystemUI/tests/src/com/android/systemui/car/userswitcher/UserSwitchTransitionViewControllerTest.java @@ -18,6 +18,8 @@ package com.android.systemui.car.userswitcher; import static org.mockito.ArgumentMatchers.any; import static org.mockito.ArgumentMatchers.eq; +import static org.mockito.Mockito.never; +import static org.mockito.Mockito.reset; import static org.mockito.Mockito.verify; import android.content.Context; @@ -122,6 +124,29 @@ public class UserSwitchTransitionViewControllerTest extends SysuiTestCase { any()); } + @Test + public void onWindowShownTimeoutPassed_viewNotHidden_hidesUserSwitchTransitionView() { + mCarUserSwitchingDialogController.handleShow(/* currentUserId= */ TEST_USER_1); + reset(mOverlayViewGlobalStateController); + + getContext().getMainThreadHandler().postDelayed(() -> { + verify(mOverlayViewGlobalStateController).hideView( + eq(mCarUserSwitchingDialogController), any()); + }, mCarUserSwitchingDialogController.getWindowShownTimeoutMs() + 10); + } + + @Test + public void onWindowShownTimeoutPassed_viewHidden_doesNotHideUserSwitchTransitionViewAgain() { + mCarUserSwitchingDialogController.handleShow(/* currentUserId= */ TEST_USER_1); + mCarUserSwitchingDialogController.handleHide(); + reset(mOverlayViewGlobalStateController); + + getContext().getMainThreadHandler().postDelayed(() -> { + verify(mOverlayViewGlobalStateController, never()).hideView( + eq(mCarUserSwitchingDialogController), any()); + }, mCarUserSwitchingDialogController.getWindowShownTimeoutMs() + 10); + } + private final class TestableUserSwitchTransitionViewController extends UserSwitchTransitionViewController {