Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 12930e8d authored by kwaky's avatar kwaky
Browse files

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
parent e4c1cb51
Loading
Loading
Loading
Loading
+3 −0
Original line number Diff line number Diff line
@@ -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>
+22 −0
Original line number Diff line number Diff line
@@ -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) {
+25 −0
Original line number Diff line number Diff line
@@ -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 {