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

Commit e0fe7dd5 authored by LuK1337's avatar LuK1337 Committed by Bruno Martins
Browse files

fixup! Add support for runtime toggle of navbar

* Due to race condition we end up calling
  DisplayPolicy.hasNavigationBar() before
  the settings value is updated.
* Switch over few more navigation bar
  checks that'd likely also fail.
* Call WindowManagerService.onOverlayChanged()
  so that we don't end up with reserved
  space for 3-button style navbar when gestural
  navigation is enabled.

Change-Id: I46ffe56b8fe8b3fe94629915a636b6cdeaa0b50d
parent 9e997d4b
Loading
Loading
Loading
Loading
+5 −0
Original line number Diff line number Diff line
@@ -772,4 +772,9 @@ interface IWindowManager
     */
    void requestScrollCapture(int displayId, IBinder behindClient, int taskId,
            IScrollCaptureController controller);

    /**
     * Notifies DisplayPolicy that overlays changed.
     */
    void onOverlayChanged();
}
+1 −0
Original line number Diff line number Diff line
@@ -36,6 +36,7 @@ android_library {

    static_libs: [
        "PluginCoreLib",
        "org.lineageos.platform.internal",
    ],


+12 −1
Original line number Diff line number Diff line
@@ -23,10 +23,13 @@ import static android.view.WindowManagerPolicyConstants.NAV_BAR_LEFT;
import static android.view.WindowManagerPolicyConstants.NAV_BAR_RIGHT;

import android.app.WindowConfiguration;
import android.content.Context;
import android.graphics.Rect;
import android.os.Handler;
import android.os.UserHandle;
import android.os.RemoteException;
import android.util.Log;
import android.view.Display;
import android.view.SurfaceControl;
import android.view.WindowManager;
import android.view.WindowManagerGlobal;
@@ -35,6 +38,8 @@ import com.android.systemui.shared.recents.view.AppTransitionAnimationSpecsFutur
import com.android.systemui.shared.recents.view.RecentsTransition;
import com.android.systemui.shared.system.PinnedStackListenerForwarder.PinnedStackListener;

import lineageos.providers.LineageSettings;

public class WindowManagerWrapper {

    private static final String TAG = "WindowManagerWrapper";
@@ -166,7 +171,13 @@ public class WindowManagerWrapper {
     *
     * @return whether there is a soft nav bar on specific display.
     */
    public boolean hasSoftNavigationBar(int displayId) {
    public boolean hasSoftNavigationBar(Context context, int displayId) {
        if (displayId == Display.DEFAULT_DISPLAY &&
                LineageSettings.System.getIntForUser(context.getContentResolver(),
                            LineageSettings.System.FORCE_SHOW_NAVBAR, 0,
                            UserHandle.USER_CURRENT) == 1) {
            return true;
        }
        try {
            return WindowManagerGlobal.getWindowManagerService().hasNavigationBar(displayId);
        } catch (RemoteException e) {
+1 −1
Original line number Diff line number Diff line
@@ -247,7 +247,7 @@ public class ScreenPinningRequest implements View.OnClickListener,
            View buttons = mLayout.findViewById(R.id.screen_pinning_buttons);
            WindowManagerWrapper wm = WindowManagerWrapper.getInstance();
            if (!QuickStepContract.isGesturalMode(mNavBarMode) 
            	    && wm.hasSoftNavigationBar(mContext.getDisplayId())) {
            	    && wm.hasSoftNavigationBar(mContext, mContext.getDisplayId())) {
                buttons.setLayoutDirection(View.LAYOUT_DIRECTION_LOCALE);
                swapChildrenIfRtlAndVertical(buttons);
            } else {
+11 −10
Original line number Diff line number Diff line
@@ -38,6 +38,7 @@ import com.android.systemui.assist.AssistHandleViewController;
import com.android.systemui.dagger.qualifiers.Main;
import com.android.systemui.fragments.FragmentHostManager;
import com.android.systemui.plugins.DarkIconDispatcher;
import com.android.systemui.shared.system.WindowManagerWrapper;
import com.android.systemui.statusbar.CommandQueue.Callbacks;
import com.android.systemui.statusbar.phone.AutoHideController;
import com.android.systemui.statusbar.phone.BarTransitions.TransitionMode;
@@ -116,20 +117,14 @@ public class NavigationBarController implements Callbacks {

        final int displayId = display.getDisplayId();
        final boolean isOnDefaultDisplay = displayId == DEFAULT_DISPLAY;
        final WindowManagerWrapper wm = WindowManagerWrapper.getInstance();
        final IWindowManager wms = WindowManagerGlobal.getWindowManagerService();

        try {
            if (!wms.hasNavigationBar(displayId)) {
                return;
            }
        } catch (RemoteException e) {
            // Cannot get wms, just return with warning message.
            Log.w(TAG, "Cannot get WindowManager.");
            return;
        }
        final Context context = isOnDefaultDisplay
                ? mContext
                : mContext.createDisplayContext(display);
        if (!wm.hasSoftNavigationBar(context, displayId)) {
            return;
        }
        NavigationBarFragment.create(context, (tag, fragment) -> {
            NavigationBarFragment navBar = (NavigationBarFragment) fragment;

@@ -162,6 +157,12 @@ public class NavigationBarController implements Callbacks {
                        result.mShowImeSwitcher);
            }
        });

        try {
            wms.onOverlayChanged();
        } catch (RemoteException e) {
            // Do nothing.
        }
    }

    private void removeNavigationBar(int displayId) {
Loading