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

Commit 64172bbc authored by Charles Chen's avatar Charles Chen
Browse files

Hide nav bar when keyguard on the 2nd display

Bug: 130963707
Test: atest SystemUITest
Test: atest DisplayPolicyLayoutTests#layoutWindowLw_keyguardDialog_hideNav
Test: manual - use chromecast with debug patch + force Desktop mode
               Press power key to make the lockscreen show and check if
	       nav bar is gone
Change-Id: I7f8f9c2c6d1157218e5dda1068170799fdccb64b
parent 87d2f6c9
Loading
Loading
Loading
Loading
+40 −1
Original line number Diff line number Diff line
@@ -19,6 +19,7 @@ import static android.view.Display.DEFAULT_DISPLAY;

import android.app.Presentation;
import android.content.Context;
import android.graphics.Color;
import android.graphics.Point;
import android.hardware.display.DisplayManager;
import android.media.MediaRouter;
@@ -32,9 +33,11 @@ import android.view.LayoutInflater;
import android.view.View;
import android.view.WindowManager;

import com.android.systemui.Dependency;
import com.android.systemui.statusbar.NavigationBarController;
import com.android.systemui.statusbar.phone.NavigationBarView;
import com.android.systemui.util.InjectionInflationController;

// TODO(multi-display): Support multiple external displays
public class KeyguardDisplayManager {
    protected static final String TAG = "KeyguardDisplayManager";
    private static boolean DEBUG = KeyguardConstants.DEBUG;
@@ -49,6 +52,9 @@ public class KeyguardDisplayManager {

    private final SparseArray<Presentation> mPresentations = new SparseArray<>();

    private final NavigationBarController mNavBarController =
            Dependency.get(NavigationBarController.class);

    private final DisplayManager.DisplayListener mDisplayListener =
            new DisplayManager.DisplayListener() {

@@ -56,6 +62,7 @@ public class KeyguardDisplayManager {
        public void onDisplayAdded(int displayId) {
            final Display display = mDisplayService.getDisplay(displayId);
            if (mShowing) {
                updateNavigationBarVisibility(displayId, false /* navBarVisible */);
                showPresentation(display);
            }
        }
@@ -192,11 +199,15 @@ public class KeyguardDisplayManager {
        if (showing) {
            final Display[] displays = mDisplayService.getDisplays();
            for (Display display : displays) {
                int displayId = display.getDisplayId();
                updateNavigationBarVisibility(displayId, false /* navBarVisible */);
                changed |= showPresentation(display);
            }
        } else {
            changed = mPresentations.size() > 0;
            for (int i = mPresentations.size() - 1; i >= 0; i--) {
                int displayId = mPresentations.keyAt(i);
                updateNavigationBarVisibility(displayId, true /* navBarVisible */);
                mPresentations.valueAt(i).dismiss();
            }
            mPresentations.clear();
@@ -204,6 +215,25 @@ public class KeyguardDisplayManager {
        return changed;
    }

    // TODO(b/127878649): this logic is from
    //  {@link StatusBarKeyguardViewManager#updateNavigationBarVisibility}. Try to revisit a long
    //  term solution in R.
    private void updateNavigationBarVisibility(int displayId, boolean navBarVisible) {
        // Leave this task to {@link StatusBarKeyguardViewManager}
        if (displayId == DEFAULT_DISPLAY) return;

        NavigationBarView navBarView = mNavBarController.getNavigationBarView(displayId);
        // We may not have nav bar on a display.
        if (navBarView == null) return;

        if (navBarVisible) {
            navBarView.getRootView().setVisibility(View.VISIBLE);
        } else {
            navBarView.getRootView().setVisibility(View.GONE);
        }

    }

    private final static class KeyguardPresentation extends Presentation {
        private static final int VIDEO_SAFE_REGION = 80; // Percentage of display width & height
        private static final int MOVE_CLOCK_TIMEOUT = 10000; // 10s
@@ -251,6 +281,15 @@ public class KeyguardDisplayManager {
            LayoutInflater inflater = mInjectableInflater.injectable(
                    LayoutInflater.from(getContext()));
            setContentView(inflater.inflate(R.layout.keyguard_presentation, null));

            // Logic to make the lock screen fullscreen
            getWindow().getDecorView().setSystemUiVisibility(
                    View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN
                            | View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION
                            | View.SYSTEM_UI_FLAG_LAYOUT_STABLE);
            getWindow().setNavigationBarContrastEnforced(false);
            getWindow().setNavigationBarColor(Color.TRANSPARENT);

            mClock = findViewById(R.id.clock);

            // Avoid screen burn in
+13 −2
Original line number Diff line number Diff line
@@ -32,6 +32,8 @@ import android.view.IWindowManager;
import android.view.View;
import android.view.WindowManagerGlobal;

import androidx.annotation.Nullable;

import com.android.internal.annotations.VisibleForTesting;
import com.android.internal.statusbar.RegisterStatusBarResult;
import com.android.systemui.Dependency;
@@ -213,8 +215,17 @@ public class NavigationBarController implements Callbacks {
    }

    /** @return {@link NavigationBarView} on the default display. */
    public NavigationBarView getDefaultNavigationBarView() {
        NavigationBarFragment navBar = mNavigationBars.get(DEFAULT_DISPLAY);
    public @Nullable NavigationBarView getDefaultNavigationBarView() {
        return getNavigationBarView(DEFAULT_DISPLAY);
    }

    /**
     * @param displayId the ID of display which Navigation bar is on
     * @return {@link NavigationBarView} on the display with {@code displayId}.
     *         {@code null} if no navigation bar on that display.
     */
    public @Nullable NavigationBarView getNavigationBarView(int displayId) {
        NavigationBarFragment navBar = mNavigationBars.get(displayId);
        return (navBar == null) ? null : (NavigationBarView) navBar.getView();
    }

+1 −1
Original line number Diff line number Diff line
@@ -3487,7 +3487,7 @@ public class StatusBar extends SystemUI implements DemoMode,

    // TODO: Figure out way to remove these.
    public NavigationBarView getNavigationBarView() {
        return mNavigationBarController.getDefaultNavigationBarView();
        return mNavigationBarController.getNavigationBarView(mDisplayId);
    }

    /**
+3 −1
Original line number Diff line number Diff line
@@ -70,6 +70,7 @@ import static android.view.WindowManager.LayoutParams.TYPE_DOCK_DIVIDER;
import static android.view.WindowManager.LayoutParams.TYPE_DREAM;
import static android.view.WindowManager.LayoutParams.TYPE_INPUT_CONSUMER;
import static android.view.WindowManager.LayoutParams.TYPE_INPUT_METHOD;
import static android.view.WindowManager.LayoutParams.TYPE_KEYGUARD_DIALOG;
import static android.view.WindowManager.LayoutParams.TYPE_NAVIGATION_BAR;
import static android.view.WindowManager.LayoutParams.TYPE_NAVIGATION_BAR_PANEL;
import static android.view.WindowManager.LayoutParams.TYPE_SCREENSHOT;
@@ -2007,7 +2008,8 @@ public class DisplayPolicy {
                        pf.set(displayFrames.mOverscan);
                    } else if ((sysUiFl & SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION) != 0
                            && (type >= FIRST_APPLICATION_WINDOW && type <= LAST_SUB_WINDOW
                            || type == TYPE_VOLUME_OVERLAY)) {
                            || type == TYPE_VOLUME_OVERLAY
                            || type == TYPE_KEYGUARD_DIALOG)) {
                        // Asking for layout as if the nav bar is hidden, lets the application
                        // extend into the unrestricted overscan screen area. We only do this for
                        // application windows and certain system windows to ensure no window that
+2 −1
Original line number Diff line number Diff line
@@ -1078,7 +1078,8 @@ class WindowState extends WindowContainer<WindowState> implements WindowManagerP
                + mRequestedWidth + ", mRequestedheight="
                + mRequestedHeight + ") to" + " (pw=" + pw + ", ph=" + ph
                + "): frame=" + mWindowFrames.mFrame.toShortString()
                + " " + mWindowFrames.getInsetsInfo());
                + " " + mWindowFrames.getInsetsInfo()
                + " " + mAttrs.getTitle());
    }

    // TODO: Look into whether this override is still necessary.
Loading