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
This commit is contained in:
@@ -118,4 +118,7 @@
|
||||
<item>com.android.systemui.car.window.SystemUIOverlayWindowManager</item>
|
||||
<item>com.android.systemui.car.volume.VolumeUI</item>
|
||||
</string-array>
|
||||
|
||||
<!-- How many milliseconds to wait before force hiding the UserSwitchTransitionView -->
|
||||
<integer name="config_userSwitchTransitionViewShownTimeoutMs" translatable="false">5000</integer>
|
||||
</resources>
|
||||
|
||||
@@ -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) {
|
||||
|
||||
@@ -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 {
|
||||
|
||||
|
||||
Reference in New Issue
Block a user