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

Commit 17134e29 authored by Heemin Seog's avatar Heemin Seog
Browse files

User switcher in primary sysui window

Bug: 147495368
Test: manual (add security, reboot, add new user, reboot)
Change-Id: I638f57de2e9117a1cb5aa6660d5a03b58894d31f
parent d9af298b
Loading
Loading
Loading
Loading
+7 −0
Original line number Original line Diff line number Diff line
@@ -15,9 +15,16 @@
  ~ limitations under the License.
  ~ limitations under the License.
  -->
  -->


<!-- Fullscreen views in sysui should be listed here in increasing Z order. -->
<FrameLayout
<FrameLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:background="@android:color/transparent"
    android:background="@android:color/transparent"
    android:layout_width="match_parent"
    android:layout_width="match_parent"
    android:layout_height="match_parent">
    android:layout_height="match_parent">

    <ViewStub android:id="@+id/fullscreen_user_switcher_stub"
              android:layout_width="match_parent"
              android:layout_height="match_parent"
              android:layout="@layout/car_fullscreen_user_switcher"/>

</FrameLayout>
</FrameLayout>
 No newline at end of file
+19 −3
Original line number Original line Diff line number Diff line
@@ -54,6 +54,7 @@ public class SystemUIPrimaryWindowController implements
    private ViewGroup mBaseLayout;
    private ViewGroup mBaseLayout;
    private WindowManager.LayoutParams mLp;
    private WindowManager.LayoutParams mLp;
    private WindowManager.LayoutParams mLpChanged;
    private WindowManager.LayoutParams mLpChanged;
    private boolean mIsAttached = false;


    @Inject
    @Inject
    public SystemUIPrimaryWindowController(
    public SystemUIPrimaryWindowController(
@@ -86,8 +87,17 @@ public class SystemUIPrimaryWindowController implements
        return mBaseLayout;
        return mBaseLayout;
    }
    }


    /** Returns {@code true} if the window is already attached. */
    public boolean isAttached() {
        return mIsAttached;
    }

    /** Attaches the window to the window manager. */
    /** Attaches the window to the window manager. */
    public void attach() {
    public void attach() {
        if (mIsAttached) {
            return;
        }
        mIsAttached = true;
        // Now that the status bar window encompasses the sliding panel and its
        // Now that the status bar window encompasses the sliding panel and its
        // translucent backdrop, the entire thing is made TRANSLUCENT and is
        // translucent backdrop, the entire thing is made TRANSLUCENT and is
        // hardware-accelerated.
        // hardware-accelerated.
@@ -98,13 +108,14 @@ public class SystemUIPrimaryWindowController implements
                WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE
                WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE
                        | WindowManager.LayoutParams.FLAG_SPLIT_TOUCH
                        | WindowManager.LayoutParams.FLAG_SPLIT_TOUCH
                        | WindowManager.LayoutParams.FLAG_WATCH_OUTSIDE_TOUCH
                        | WindowManager.LayoutParams.FLAG_WATCH_OUTSIDE_TOUCH
                        | WindowManager.LayoutParams.FLAG_LAYOUT_IN_SCREEN,
                        | WindowManager.LayoutParams.FLAG_LAYOUT_IN_SCREEN
                        | WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE,
                PixelFormat.TRANSLUCENT);
                PixelFormat.TRANSLUCENT);
        mLp.token = new Binder();
        mLp.token = new Binder();
        mLp.gravity = Gravity.TOP;
        mLp.gravity = Gravity.TOP;
        mLp.setFitWindowInsetsTypes(/* types= */ 0);
        mLp.setFitWindowInsetsTypes(/* types= */ 0);
        mLp.softInputMode = WindowManager.LayoutParams.SOFT_INPUT_ADJUST_RESIZE;
        mLp.softInputMode = WindowManager.LayoutParams.SOFT_INPUT_ADJUST_RESIZE;
        mLp.setTitle("NotificationShade");
        mLp.setTitle("SystemUIPrimaryWindow");
        mLp.packageName = mContext.getPackageName();
        mLp.packageName = mContext.getPackageName();
        mLp.layoutInDisplayCutoutMode = LAYOUT_IN_DISPLAY_CUTOUT_MODE_ALWAYS;
        mLp.layoutInDisplayCutoutMode = LAYOUT_IN_DISPLAY_CUTOUT_MODE_ALWAYS;


@@ -118,8 +129,11 @@ public class SystemUIPrimaryWindowController implements
            // TODO: Update this so that the windowing type gets the full height of the display
            // TODO: Update this so that the windowing type gets the full height of the display
            //  when we use MATCH_PARENT.
            //  when we use MATCH_PARENT.
            mLpChanged.height = mDisplayHeight + mNavBarHeight;
            mLpChanged.height = mDisplayHeight + mNavBarHeight;
            mLpChanged.flags &= ~WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE;
        } else {
        } else {
            mLpChanged.height = mStatusBarHeight;
            mLpChanged.height = mStatusBarHeight;
            // TODO: Allow touches to go through to the status bar to handle notification panel.
            mLpChanged.flags |= WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE;
        }
        }
        updateWindow();
        updateWindow();
    }
    }
@@ -131,7 +145,9 @@ public class SystemUIPrimaryWindowController implements


    private void updateWindow() {
    private void updateWindow() {
        if (mLp != null && mLp.copyFrom(mLpChanged) != 0) {
        if (mLp != null && mLp.copyFrom(mLpChanged) != 0) {
            if (isAttached()) {
                mWindowManager.updateViewLayout(mBaseLayout, mLp);
                mWindowManager.updateViewLayout(mBaseLayout, mLp);
            }
            }
        }
        }
    }
    }
}
+19 −41
Original line number Original line Diff line number Diff line
@@ -68,6 +68,7 @@ import com.android.systemui.bubbles.BubbleController;
import com.android.systemui.car.CarDeviceProvisionedController;
import com.android.systemui.car.CarDeviceProvisionedController;
import com.android.systemui.car.CarDeviceProvisionedListener;
import com.android.systemui.car.CarDeviceProvisionedListener;
import com.android.systemui.car.CarServiceProvider;
import com.android.systemui.car.CarServiceProvider;
import com.android.systemui.car.SystemUIPrimaryWindowController;
import com.android.systemui.classifier.FalsingLog;
import com.android.systemui.classifier.FalsingLog;
import com.android.systemui.colorextraction.SysuiColorExtractor;
import com.android.systemui.colorextraction.SysuiColorExtractor;
import com.android.systemui.dagger.qualifiers.UiBackground;
import com.android.systemui.dagger.qualifiers.UiBackground;
@@ -168,6 +169,7 @@ public class CarStatusBar extends StatusBar implements CarBatteryController.Batt
    // acceleration rate for the fling animation
    // acceleration rate for the fling animation
    private static final float FLING_SPEED_UP_FACTOR = 0.6f;
    private static final float FLING_SPEED_UP_FACTOR = 0.6f;


    private final UserSwitcherController mUserSwitcherController;
    private final ScrimController mScrimController;
    private final ScrimController mScrimController;
    private final LockscreenLockIconController mLockscreenLockIconController;
    private final LockscreenLockIconController mLockscreenLockIconController;


@@ -177,17 +179,16 @@ public class CarStatusBar extends StatusBar implements CarBatteryController.Batt
    private float mBackgroundAlphaDiff;
    private float mBackgroundAlphaDiff;
    private float mInitialBackgroundAlpha;
    private float mInitialBackgroundAlpha;


    private final Lazy<FullscreenUserSwitcher> mFullscreenUserSwitcherLazy;
    private FullscreenUserSwitcher mFullscreenUserSwitcher;

    private CarBatteryController mCarBatteryController;
    private CarBatteryController mCarBatteryController;
    private BatteryMeterView mBatteryMeterView;
    private BatteryMeterView mBatteryMeterView;
    private Drawable mNotificationPanelBackground;
    private Drawable mNotificationPanelBackground;


    private final Object mQueueLock = new Object();
    private final Object mQueueLock = new Object();
    private final SystemUIPrimaryWindowController mSystemUIPrimaryWindowController;
    private final CarNavigationBarController mCarNavigationBarController;
    private final CarNavigationBarController mCarNavigationBarController;
    private final FlingAnimationUtils.Builder mFlingAnimationUtilsBuilder;
    private final FlingAnimationUtils.Builder mFlingAnimationUtilsBuilder;
    private final Lazy<PowerManagerHelper> mPowerManagerHelperLazy;
    private final Lazy<PowerManagerHelper> mPowerManagerHelperLazy;
    private final FullscreenUserSwitcher mFullscreenUserSwitcher;
    private final ShadeController mShadeController;
    private final ShadeController mShadeController;
    private final CarServiceProvider mCarServiceProvider;
    private final CarServiceProvider mCarServiceProvider;
    private final CarDeviceProvisionedController mCarDeviceProvisionedController;
    private final CarDeviceProvisionedController mCarDeviceProvisionedController;
@@ -338,7 +339,8 @@ public class CarStatusBar extends StatusBar implements CarBatteryController.Batt
            /* Car Settings injected components. */
            /* Car Settings injected components. */
            CarServiceProvider carServiceProvider,
            CarServiceProvider carServiceProvider,
            Lazy<PowerManagerHelper> powerManagerHelperLazy,
            Lazy<PowerManagerHelper> powerManagerHelperLazy,
            Lazy<FullscreenUserSwitcher> fullscreenUserSwitcherLazy,
            FullscreenUserSwitcher fullscreenUserSwitcher,
            SystemUIPrimaryWindowController systemUIPrimaryWindowController,
            CarNavigationBarController carNavigationBarController,
            CarNavigationBarController carNavigationBarController,
            FlingAnimationUtils.Builder flingAnimationUtilsBuilder) {
            FlingAnimationUtils.Builder flingAnimationUtilsBuilder) {
        super(
        super(
@@ -422,6 +424,7 @@ public class CarStatusBar extends StatusBar implements CarBatteryController.Batt
                extensionController,
                extensionController,
                userInfoControllerImpl,
                userInfoControllerImpl,
                dismissCallbackRegistry);
                dismissCallbackRegistry);
        mUserSwitcherController = userSwitcherController;
        mScrimController = scrimController;
        mScrimController = scrimController;
        mLockscreenLockIconController = lockscreenLockIconController;
        mLockscreenLockIconController = lockscreenLockIconController;
        mCarDeviceProvisionedController =
        mCarDeviceProvisionedController =
@@ -429,7 +432,8 @@ public class CarStatusBar extends StatusBar implements CarBatteryController.Batt
        mShadeController = shadeController;
        mShadeController = shadeController;
        mCarServiceProvider = carServiceProvider;
        mCarServiceProvider = carServiceProvider;
        mPowerManagerHelperLazy = powerManagerHelperLazy;
        mPowerManagerHelperLazy = powerManagerHelperLazy;
        mFullscreenUserSwitcherLazy = fullscreenUserSwitcherLazy;
        mFullscreenUserSwitcher = fullscreenUserSwitcher;
        mSystemUIPrimaryWindowController = systemUIPrimaryWindowController;
        mCarNavigationBarController = carNavigationBarController;
        mCarNavigationBarController = carNavigationBarController;
        mFlingAnimationUtilsBuilder = flingAnimationUtilsBuilder;
        mFlingAnimationUtilsBuilder = flingAnimationUtilsBuilder;
    }
    }
@@ -444,6 +448,13 @@ public class CarStatusBar extends StatusBar implements CarBatteryController.Batt
        mScreenLifecycle = Dependency.get(ScreenLifecycle.class);
        mScreenLifecycle = Dependency.get(ScreenLifecycle.class);
        mScreenLifecycle.addObserver(mScreenObserver);
        mScreenLifecycle.addObserver(mScreenObserver);


        // TODO: Remove the setup of user switcher from Car Status Bar.
        mSystemUIPrimaryWindowController.attach();
        mFullscreenUserSwitcher.setStatusBar(this);
        mFullscreenUserSwitcher.setContainer(
                mSystemUIPrimaryWindowController.getBaseLayout().findViewById(
                        R.id.fullscreen_user_switcher_stub));

        // Notification bar related setup.
        // Notification bar related setup.
        mInitialBackgroundAlpha = (float) mContext.getResources().getInteger(
        mInitialBackgroundAlpha = (float) mContext.getResources().getInteger(
                R.integer.config_initialNotificationBackgroundAlpha) / 100;
                R.integer.config_initialNotificationBackgroundAlpha) / 100;
@@ -510,16 +521,6 @@ public class CarStatusBar extends StatusBar implements CarBatteryController.Batt
                });
                });
    }
    }


    /**
     * Allows for showing or hiding just the navigation bars. This is indented to be used when
     * the full screen user selector is shown.
     */
    void setNavBarVisibility(@View.Visibility int visibility) {
        mCarNavigationBarController.setBottomWindowVisibility(visibility);
        mCarNavigationBarController.setLeftWindowVisibility(visibility);
        mCarNavigationBarController.setRightWindowVisibility(visibility);
    }

    @Override
    @Override
    public boolean hideKeyguard() {
    public boolean hideKeyguard() {
        boolean result = super.hideKeyguard();
        boolean result = super.hideKeyguard();
@@ -924,9 +925,6 @@ public class CarStatusBar extends StatusBar implements CarBatteryController.Batt
                    + " scroll " + mStackScroller.getScrollX()
                    + " scroll " + mStackScroller.getScrollX()
                    + "," + mStackScroller.getScrollY());
                    + "," + mStackScroller.getScrollY());
        }
        }

        pw.print("  mFullscreenUserSwitcher=");
        pw.println(mFullscreenUserSwitcher);
        pw.print("  mCarBatteryController=");
        pw.print("  mCarBatteryController=");
        pw.println(mCarBatteryController);
        pw.println(mCarBatteryController);
        pw.print("  mBatteryMeterView=");
        pw.print("  mBatteryMeterView=");
@@ -972,14 +970,7 @@ public class CarStatusBar extends StatusBar implements CarBatteryController.Batt


    @Override
    @Override
    protected void createUserSwitcher() {
    protected void createUserSwitcher() {
        UserSwitcherController userSwitcherController =
        if (!mUserSwitcherController.useFullscreenUserSwitcher()) {
                Dependency.get(UserSwitcherController.class);
        if (userSwitcherController.useFullscreenUserSwitcher()) {
            mFullscreenUserSwitcher = mFullscreenUserSwitcherLazy.get();
            mFullscreenUserSwitcher.setStatusBar(this);
            mFullscreenUserSwitcher.setContainer(
                    mStatusBarWindow.findViewById(R.id.fullscreen_user_switcher_stub));
        } else {
            super.createUserSwitcher();
            super.createUserSwitcher();
        }
        }
    }
    }
@@ -996,25 +987,12 @@ public class CarStatusBar extends StatusBar implements CarBatteryController.Batt
        super.onStateChanged(newState);
        super.onStateChanged(newState);


        if (newState != StatusBarState.FULLSCREEN_USER_SWITCHER) {
        if (newState != StatusBarState.FULLSCREEN_USER_SWITCHER) {
            hideUserSwitcher();
            mFullscreenUserSwitcher.hide();
        } else {
        } else {
            dismissKeyguardWhenUserSwitcherNotDisplayed();
            dismissKeyguardWhenUserSwitcherNotDisplayed();
        }
        }
    }
    }


    /** Makes the full screen user switcher visible, if applicable. */
    public void showUserSwitcher() {
        if (mFullscreenUserSwitcher != null && mState == StatusBarState.FULLSCREEN_USER_SWITCHER) {
            mFullscreenUserSwitcher.show(); // Makes the switcher visible.
        }
    }

    private void hideUserSwitcher() {
        if (mFullscreenUserSwitcher != null) {
            mFullscreenUserSwitcher.hide();
        }
    }

    final ScreenLifecycle.Observer mScreenObserver = new ScreenLifecycle.Observer() {
    final ScreenLifecycle.Observer mScreenObserver = new ScreenLifecycle.Observer() {
        @Override
        @Override
        public void onScreenTurnedOn() {
        public void onScreenTurnedOn() {
@@ -1024,7 +1002,7 @@ public class CarStatusBar extends StatusBar implements CarBatteryController.Batt


    // We automatically dismiss keyguard unless user switcher is being shown on the keyguard.
    // We automatically dismiss keyguard unless user switcher is being shown on the keyguard.
    private void dismissKeyguardWhenUserSwitcherNotDisplayed() {
    private void dismissKeyguardWhenUserSwitcherNotDisplayed() {
        if (mFullscreenUserSwitcher == null) {
        if (!mUserSwitcherController.useFullscreenUserSwitcher()) {
            return; // Not using the full screen user switcher.
            return; // Not using the full screen user switcher.
        }
        }


+13 −5
Original line number Original line Diff line number Diff line
@@ -24,6 +24,7 @@ import com.android.keyguard.KeyguardUpdateMonitor;
import com.android.keyguard.ViewMediatorCallback;
import com.android.keyguard.ViewMediatorCallback;
import com.android.systemui.R;
import com.android.systemui.R;
import com.android.systemui.dock.DockManager;
import com.android.systemui.dock.DockManager;
import com.android.systemui.navigationbar.car.CarNavigationBarController;
import com.android.systemui.statusbar.NotificationMediaManager;
import com.android.systemui.statusbar.NotificationMediaManager;
import com.android.systemui.statusbar.SysuiStatusBarStateController;
import com.android.systemui.statusbar.SysuiStatusBarStateController;
import com.android.systemui.statusbar.phone.NavigationModeController;
import com.android.systemui.statusbar.phone.NavigationModeController;
@@ -40,6 +41,8 @@ import javax.inject.Singleton;
public class CarStatusBarKeyguardViewManager extends StatusBarKeyguardViewManager {
public class CarStatusBarKeyguardViewManager extends StatusBarKeyguardViewManager {


    protected boolean mShouldHideNavBar;
    protected boolean mShouldHideNavBar;
    private final CarNavigationBarController mCarNavigationBarController;
    private final FullscreenUserSwitcher mFullscreenUserSwitcher;


    @Inject
    @Inject
    public CarStatusBarKeyguardViewManager(Context context,
    public CarStatusBarKeyguardViewManager(Context context,
@@ -52,13 +55,17 @@ public class CarStatusBarKeyguardViewManager extends StatusBarKeyguardViewManage
            DockManager dockManager,
            DockManager dockManager,
            StatusBarWindowController statusBarWindowController,
            StatusBarWindowController statusBarWindowController,
            KeyguardStateController keyguardStateController,
            KeyguardStateController keyguardStateController,
            NotificationMediaManager notificationMediaManager) {
            NotificationMediaManager notificationMediaManager,
            CarNavigationBarController carNavigationBarController,
            FullscreenUserSwitcher fullscreenUserSwitcher) {
        super(context, callback, lockPatternUtils, sysuiStatusBarStateController,
        super(context, callback, lockPatternUtils, sysuiStatusBarStateController,
                configurationController, keyguardUpdateMonitor, navigationModeController,
                configurationController, keyguardUpdateMonitor, navigationModeController,
                dockManager, statusBarWindowController, keyguardStateController,
                dockManager, statusBarWindowController, keyguardStateController,
                notificationMediaManager);
                notificationMediaManager);
        mShouldHideNavBar = context.getResources()
        mShouldHideNavBar = context.getResources()
                .getBoolean(R.bool.config_hideNavWhenKeyguardBouncerShown);
                .getBoolean(R.bool.config_hideNavWhenKeyguardBouncerShown);
        mCarNavigationBarController = carNavigationBarController;
        mFullscreenUserSwitcher = fullscreenUserSwitcher;
    }
    }


    @Override
    @Override
@@ -66,8 +73,10 @@ public class CarStatusBarKeyguardViewManager extends StatusBarKeyguardViewManage
        if (!mShouldHideNavBar) {
        if (!mShouldHideNavBar) {
            return;
            return;
        }
        }
        CarStatusBar statusBar = (CarStatusBar) mStatusBar;
        int visibility = navBarVisible ? View.VISIBLE : View.GONE;
        statusBar.setNavBarVisibility(navBarVisible ? View.VISIBLE : View.GONE);
        mCarNavigationBarController.setBottomWindowVisibility(visibility);
        mCarNavigationBarController.setLeftWindowVisibility(visibility);
        mCarNavigationBarController.setRightWindowVisibility(visibility);
    }
    }


    /**
    /**
@@ -86,8 +95,7 @@ public class CarStatusBarKeyguardViewManager extends StatusBarKeyguardViewManage
     */
     */
    @Override
    @Override
    public void onCancelClicked() {
    public void onCancelClicked() {
        CarStatusBar statusBar = (CarStatusBar) mStatusBar;
        mFullscreenUserSwitcher.show();
        statusBar.showUserSwitcher();
    }
    }


    /**
    /**
+5 −2
Original line number Original line Diff line number Diff line
@@ -32,6 +32,7 @@ import com.android.systemui.assist.AssistManager;
import com.android.systemui.broadcast.BroadcastDispatcher;
import com.android.systemui.broadcast.BroadcastDispatcher;
import com.android.systemui.bubbles.BubbleController;
import com.android.systemui.bubbles.BubbleController;
import com.android.systemui.car.CarServiceProvider;
import com.android.systemui.car.CarServiceProvider;
import com.android.systemui.car.SystemUIPrimaryWindowController;
import com.android.systemui.colorextraction.SysuiColorExtractor;
import com.android.systemui.colorextraction.SysuiColorExtractor;
import com.android.systemui.dagger.qualifiers.UiBackground;
import com.android.systemui.dagger.qualifiers.UiBackground;
import com.android.systemui.keyguard.DismissCallbackRegistry;
import com.android.systemui.keyguard.DismissCallbackRegistry;
@@ -207,7 +208,8 @@ public class CarStatusBarModule {
            DismissCallbackRegistry dismissCallbackRegistry,
            DismissCallbackRegistry dismissCallbackRegistry,
            CarServiceProvider carServiceProvider,
            CarServiceProvider carServiceProvider,
            Lazy<PowerManagerHelper> powerManagerHelperLazy,
            Lazy<PowerManagerHelper> powerManagerHelperLazy,
            Lazy<FullscreenUserSwitcher> fullscreenUserSwitcherLazy,
            FullscreenUserSwitcher fullscreenUserSwitcher,
            SystemUIPrimaryWindowController systemUIPrimaryWindowController,
            CarNavigationBarController carNavigationBarController,
            CarNavigationBarController carNavigationBarController,
            FlingAnimationUtils.Builder flingAnimationUtilsBuilder) {
            FlingAnimationUtils.Builder flingAnimationUtilsBuilder) {
        return new CarStatusBar(
        return new CarStatusBar(
@@ -292,7 +294,8 @@ public class CarStatusBarModule {
                dismissCallbackRegistry,
                dismissCallbackRegistry,
                carServiceProvider,
                carServiceProvider,
                powerManagerHelperLazy,
                powerManagerHelperLazy,
                fullscreenUserSwitcherLazy,
                fullscreenUserSwitcher,
                systemUIPrimaryWindowController,
                carNavigationBarController,
                carNavigationBarController,
                flingAnimationUtilsBuilder);
                flingAnimationUtilsBuilder);
    }
    }
Loading