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

Commit 6e94a9eb authored by Wale Ogunwale's avatar Wale Ogunwale
Browse files

Added rules for status/nav bar customization when in multi-window mode

Status & nav bars are always visible and opaque when freeform or docked
stack is visible

We still need to refactor the code to allow force opaque to be updated
independently for the status bar and nav. bar. Once that is done, the
status bar should be transcluent if freeform stack is visible and
docked stack isn't and the status bar should be opaque if freeform
& docked stack are both visible.

Bug: 24365214
Change-Id: I48ecc6067c9b0f7239c12c98eb46f3fcefacd4f9
parent daa65215
Loading
Loading
Loading
Loading
+3 −0
Original line number Original line Diff line number Diff line
@@ -263,4 +263,7 @@ public abstract class WindowManagerInternal {
      */
      */
    public abstract void setOnHardKeyboardStatusChangeListener(
    public abstract void setOnHardKeyboardStatusChangeListener(
        OnHardKeyboardStatusChangeListener listener);
        OnHardKeyboardStatusChangeListener listener);

    /** Returns true if the stack with the input Id is currently visible. */
    public abstract boolean isStackVisible(int stackId);
}
}
+37 −27
Original line number Original line Diff line number Diff line
@@ -16,6 +16,16 @@


package com.android.server.policy;
package com.android.server.policy;


import static android.app.ActivityManager.DOCKED_STACK_ID;
import static android.app.ActivityManager.FREEFORM_WORKSPACE_STACK_ID;
import static android.view.WindowManager.LayoutParams.*;
import static android.view.WindowManagerPolicy.WindowManagerFuncs.LID_ABSENT;
import static android.view.WindowManagerPolicy.WindowManagerFuncs.LID_OPEN;
import static android.view.WindowManagerPolicy.WindowManagerFuncs.LID_CLOSED;
import static android.view.WindowManagerPolicy.WindowManagerFuncs.CAMERA_LENS_COVER_ABSENT;
import static android.view.WindowManagerPolicy.WindowManagerFuncs.CAMERA_LENS_UNCOVERED;
import static android.view.WindowManagerPolicy.WindowManagerFuncs.CAMERA_LENS_COVERED;

import android.app.ActivityManager;
import android.app.ActivityManager;
import android.app.ActivityManagerInternal;
import android.app.ActivityManagerInternal;
import android.app.ActivityManagerInternal.SleepToken;
import android.app.ActivityManagerInternal.SleepToken;
@@ -40,7 +50,6 @@ import android.content.pm.ResolveInfo;
import android.content.res.CompatibilityInfo;
import android.content.res.CompatibilityInfo;
import android.content.res.Configuration;
import android.content.res.Configuration;
import android.content.res.Resources;
import android.content.res.Resources;
import android.content.res.TypedArray;
import android.database.ContentObserver;
import android.database.ContentObserver;
import android.graphics.PixelFormat;
import android.graphics.PixelFormat;
import android.graphics.Rect;
import android.graphics.Rect;
@@ -130,14 +139,6 @@ import java.io.PrintWriter;
import java.util.HashSet;
import java.util.HashSet;
import java.util.List;
import java.util.List;


import static android.view.WindowManager.LayoutParams.*;
import static android.view.WindowManagerPolicy.WindowManagerFuncs.LID_ABSENT;
import static android.view.WindowManagerPolicy.WindowManagerFuncs.LID_OPEN;
import static android.view.WindowManagerPolicy.WindowManagerFuncs.LID_CLOSED;
import static android.view.WindowManagerPolicy.WindowManagerFuncs.CAMERA_LENS_COVER_ABSENT;
import static android.view.WindowManagerPolicy.WindowManagerFuncs.CAMERA_LENS_UNCOVERED;
import static android.view.WindowManagerPolicy.WindowManagerFuncs.CAMERA_LENS_COVERED;

/**
/**
 * WindowManagerPolicy implementation for the Android phone UI.  This
 * WindowManagerPolicy implementation for the Android phone UI.  This
 * introduces a new method suffix, Lp, for an internal lock of the
 * introduces a new method suffix, Lp, for an internal lock of the
@@ -4627,7 +4628,9 @@ public class PhoneWindowManager implements WindowManagerPolicy {
                    if (mStatusBarController.setBarShowingLw(true)) {
                    if (mStatusBarController.setBarShowingLw(true)) {
                        changes |= FINISH_LAYOUT_REDO_LAYOUT;
                        changes |= FINISH_LAYOUT_REDO_LAYOUT;
                    }
                    }
                } else if (topIsFullscreen) {
                } else if (topIsFullscreen
                        && !mWindowManagerInternal.isStackVisible(FREEFORM_WORKSPACE_STACK_ID)
                        && !mWindowManagerInternal.isStackVisible(DOCKED_STACK_ID)) {
                    if (DEBUG_LAYOUT) Slog.v(TAG, "** HIDING status bar");
                    if (DEBUG_LAYOUT) Slog.v(TAG, "** HIDING status bar");
                    if (mStatusBarController.setBarShowingLw(false)) {
                    if (mStatusBarController.setBarShowingLw(false)) {
                        changes |= FINISH_LAYOUT_REDO_LAYOUT;
                        changes |= FINISH_LAYOUT_REDO_LAYOUT;
@@ -6714,6 +6717,15 @@ public class PhoneWindowManager implements WindowManagerPolicy {
    }
    }


    private int updateSystemBarsLw(WindowState win, int oldVis, int vis) {
    private int updateSystemBarsLw(WindowState win, int oldVis, int vis) {
        final boolean dockedStackVisible = mWindowManagerInternal.isStackVisible(DOCKED_STACK_ID);
        final boolean freeformStackVisible =
                mWindowManagerInternal.isStackVisible(FREEFORM_WORKSPACE_STACK_ID);
        final boolean forceShowSystemBars = dockedStackVisible || freeformStackVisible;
        // TODO(multi-window): Update to force opaque independently for status bar and nav bar.
        // This will require refactoring the code to have separate vis flag for each bar so it can
        // be adjusted independently.
        final boolean forceOpaqueSystemBars = forceShowSystemBars;

        // apply translucent bar vis flags
        // apply translucent bar vis flags
        WindowState transWin = isStatusBarKeyguard() && !mHideLockScreen
        WindowState transWin = isStatusBarKeyguard() && !mHideLockScreen
                ? mStatusBar
                ? mStatusBar
@@ -6736,7 +6748,8 @@ public class PhoneWindowManager implements WindowManagerPolicy {
            vis = (vis & ~flags) | (oldVis & flags);
            vis = (vis & ~flags) | (oldVis & flags);
        }
        }


        if (!areTranslucentBarsAllowed() && transWin != mStatusBar) {
        if ((!areTranslucentBarsAllowed() && transWin != mStatusBar)
                || forceOpaqueSystemBars) {
            vis &= ~(View.NAVIGATION_BAR_TRANSLUCENT | View.STATUS_BAR_TRANSLUCENT
            vis &= ~(View.NAVIGATION_BAR_TRANSLUCENT | View.STATUS_BAR_TRANSLUCENT
                    | View.SYSTEM_UI_TRANSPARENT);
                    | View.SYSTEM_UI_TRANSPARENT);
        }
        }
@@ -6744,24 +6757,21 @@ public class PhoneWindowManager implements WindowManagerPolicy {
        // update status bar
        // update status bar
        boolean immersiveSticky =
        boolean immersiveSticky =
                (vis & View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY) != 0;
                (vis & View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY) != 0;
        boolean hideStatusBarWM =
        final boolean hideStatusBarWM =
                mTopFullscreenOpaqueWindowState != null &&
                mTopFullscreenOpaqueWindowState != null
                (PolicyControl.getWindowFlags(mTopFullscreenOpaqueWindowState, null)
                && (PolicyControl.getWindowFlags(mTopFullscreenOpaqueWindowState, null)
                        & WindowManager.LayoutParams.FLAG_FULLSCREEN) != 0;
                        & WindowManager.LayoutParams.FLAG_FULLSCREEN) != 0;
        boolean hideStatusBarSysui =
        final boolean hideStatusBarSysui =
                (vis & View.SYSTEM_UI_FLAG_FULLSCREEN) != 0;
                (vis & View.SYSTEM_UI_FLAG_FULLSCREEN) != 0;
        boolean hideNavBarSysui =
        final boolean hideNavBarSysui =
                (vis & View.SYSTEM_UI_FLAG_HIDE_NAVIGATION) != 0;
                (vis & View.SYSTEM_UI_FLAG_HIDE_NAVIGATION) != 0;


        boolean transientStatusBarAllowed =
        final boolean transientStatusBarAllowed = mStatusBar != null
                mStatusBar != null && (
                && (statusBarHasFocus || (!forceShowSystemBars
                hideStatusBarWM
                        && (hideStatusBarWM || (hideStatusBarSysui && immersiveSticky))));
                || (hideStatusBarSysui && immersiveSticky)
                || statusBarHasFocus);


        boolean transientNavBarAllowed =
        final boolean transientNavBarAllowed = mNavigationBar != null
                mNavigationBar != null &&
                && !forceShowSystemBars && hideNavBarSysui && immersiveSticky;
                hideNavBarSysui && immersiveSticky;


        final long now = SystemClock.uptimeMillis();
        final long now = SystemClock.uptimeMillis();
        final boolean pendingPanic = mPendingPanicGestureUptime != 0
        final boolean pendingPanic = mPendingPanicGestureUptime != 0
@@ -6774,11 +6784,11 @@ public class PhoneWindowManager implements WindowManagerPolicy {
            mNavigationBarController.showTransient();
            mNavigationBarController.showTransient();
        }
        }


        boolean denyTransientStatus = mStatusBarController.isTransientShowRequested()
        final boolean denyTransientStatus = mStatusBarController.isTransientShowRequested()
                && !transientStatusBarAllowed && hideStatusBarSysui;
                && !transientStatusBarAllowed && hideStatusBarSysui;
        boolean denyTransientNav = mNavigationBarController.isTransientShowRequested()
        final boolean denyTransientNav = mNavigationBarController.isTransientShowRequested()
                && !transientNavBarAllowed;
                && !transientNavBarAllowed;
        if (denyTransientStatus || denyTransientNav) {
        if (denyTransientStatus || denyTransientNav || forceShowSystemBars) {
            // clear the clearable flags instead
            // clear the clearable flags instead
            clearClearableFlagsLw();
            clearClearableFlagsLw();
            vis &= ~View.SYSTEM_UI_CLEARABLE_FLAGS;
            vis &= ~View.SYSTEM_UI_CLEARABLE_FLAGS;
+7 −0
Original line number Original line Diff line number Diff line
@@ -10133,5 +10133,12 @@ public class WindowManagerService extends IWindowManager.Stub
            }
            }
        }
        }


        @Override
        public boolean isStackVisible(int stackId) {
            synchronized (mWindowMap) {
                final TaskStack stack = mStackIdToStack.get(stackId);
                return (stack != null && stack.isVisibleLocked());
            }
        }
    }
    }
}
}