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

Commit 625c820e authored by Bruno Martins's avatar Bruno Martins Committed by Michael Bestas
Browse files

Add support for runtime toggle of navbar

This is a refactor of the following changes, so to make use of tuner API.

Author: Timo Wendt <timo@tjwendt.de>
Date:   Thu Aug 30 12:18:41 2012 +0300

    Runtime toggle of navbar

    This adds the framework support for enabling the Navigation bar
    on devices with hardware keys. It is toggled from Settings, and
    depends on device-specific support for the KeyDisabler hardware
    control

    Change-Id: I88fecb2ca1e8613591c327a93f53909b00239cd8

    wm: Nullify hardkey function assignments if enabling the navbar

    This caused erroneous (and sometimes duplicate) events being generated
    due to the regular key function assignments. The navbar does its
    own action management, so don't try to derive from the actions
    usually present in hard keys.

    Change-Id: I82866e24547f8145cac4f07820ae90aacce09281

    Update DEV_FORCE_SHOW_NAVBAR constant.

    Change-Id: Ie5b4317162c514d22276956f81007e064a3d0f32

    Settings: Move DEV_FORCE_SHOW_NAVBAR load to loadSecureSettings.

    Change-Id: I6ac53b8c9f7fce6f9ca6b4ad7bf31a1c1e896863

Author: Paul Keith <javelinanddart@gmail.com>
Date:   Tue Jan 16 15:47:07 2018 +0100

    PhoneWindowManager: Make sure KeyDisabler is always called on boot

    * Otherwise, some KeyDisabler classes are left in a weird state
    * Because we don't keep track of whether an initial state was ever set,
      we never call KeyDisabler on boot if the setting is set to 0
    * To remedy this, keep track of whether an initial state was set

    Change-Id: Ib432ed3278dd8f4f4cba3ba488879b3c1cd9c8f4

Author: LuK1337 <priv.luk@gmail.com>
Date:   Sat Sep 29 20:42:04 2018 +0200

    PhoneWindowManager: Fix issues introduced with runtime navbar

    * With system settings we need to pass UserHandle.USER_CURRENT
      to make sure we are getting proper value, otherwise we always
      end up getting '0'. Also we need to make sure to set valid
      mHasNavigationBar in setInitialDisplaySize().

    Change-Id: I3efd614e735f9a602f13263a742ce858a9d14769

Author: dianlujitao <dianlujitao@lineageos.org>
Date:   Thu Nov 15 11:33:20 2018 +0800

    TunerServiceImpl: Blacklist Lineage settings from tuner reset

    [Partial pick for navbar]

    * They use the tunable infrastructure but are real user settings and
      shouldn't be reset with tuner settings. Moreover, setting them to
      null would cause a IllegalArgumentException.

    Change-Id: Ie05910efaee867632a3bd2e84625d7735259130e

Change-Id: I4a6d3f89bc171c3921875b24c077cb78c03517ad
parent 04be8898
Loading
Loading
Loading
Loading
+44 −2
Original line number Diff line number Diff line
@@ -22,6 +22,7 @@ import static com.android.systemui.Dependency.MAIN_HANDLER_NAME;
import static com.android.systemui.SysUiServiceProvider.getComponent;

import android.content.Context;
import android.graphics.Rect;
import android.hardware.display.DisplayManager;
import android.os.Handler;
import android.os.RemoteException;
@@ -61,6 +62,17 @@ public class NavigationBarController implements Callbacks {
    private final Handler mHandler;
    private final DisplayManager mDisplayManager;

    public class SystemUiVisibility {
        public int displayId;
        public int vis;
        public int fullscreenStackVis;
        public int dockedStackVis;
        public int mask;
        public Rect fullscreenStackBounds;
        public Rect dockedStackBounds;
        public boolean navbarColorManagedByIme;
    }

    /** A displayId - nav bar maps. */
    @VisibleForTesting
    SparseArray<NavigationBarFragment> mNavigationBars = new SparseArray<>();
@@ -83,8 +95,16 @@ public class NavigationBarController implements Callbacks {

    @Override
    public void onDisplayReady(int displayId) {
        onDisplayReady(displayId, null);
    }

    public void onDisplayReady(int displayId, SystemUiVisibility systemUiVisibility) {
        Display display = mDisplayManager.getDisplay(displayId);
        createNavigationBar(display, null);
        createNavigationBar(display, null, systemUiVisibility);
    }

    public SystemUiVisibility createSystemUiVisibility() {
        return new SystemUiVisibility();
    }

    // TODO(b/117478341): I use {@code includeDefaultDisplay} to make this method compatible to
@@ -96,10 +116,15 @@ public class NavigationBarController implements Callbacks {
     */
    public void createNavigationBars(final boolean includeDefaultDisplay,
            RegisterStatusBarResult result) {
        createNavigationBars(includeDefaultDisplay, result, null);
    }

    public void createNavigationBars(final boolean includeDefaultDisplay,
            RegisterStatusBarResult result, SystemUiVisibility systemUiVisibility) {
        Display[] displays = mDisplayManager.getDisplays();
        for (Display display : displays) {
            if (includeDefaultDisplay || display.getDisplayId() != DEFAULT_DISPLAY) {
                createNavigationBar(display, result);
                createNavigationBar(display, result, systemUiVisibility);
            }
        }
    }
@@ -112,6 +137,11 @@ public class NavigationBarController implements Callbacks {
     */
    @VisibleForTesting
    void createNavigationBar(Display display, RegisterStatusBarResult result) {
        createNavigationBar(display, result, null);
    }

    void createNavigationBar(Display display, RegisterStatusBarResult result,
            SystemUiVisibility systemUiVisibility) {
        if (display == null) {
            return;
        }
@@ -154,6 +184,18 @@ public class NavigationBarController implements Callbacks {
                    : new AutoHideController(context, mHandler);
            navBar.setAutoHideController(autoHideController);
            navBar.restoreSystemUiVisibilityState();

            if (systemUiVisibility != null && systemUiVisibility.displayId == displayId) {
                navBar.setSystemUiVisibility(systemUiVisibility.displayId,
                        systemUiVisibility.vis,
                        systemUiVisibility.fullscreenStackVis,
                        systemUiVisibility.dockedStackVis,
                        systemUiVisibility.mask,
                        systemUiVisibility.fullscreenStackBounds,
                        systemUiVisibility.dockedStackBounds,
                        systemUiVisibility.navbarColorManagedByIme);
            }

            mNavigationBars.append(displayId, navBar);

            if (result != null) {
+46 −1
Original line number Diff line number Diff line
@@ -280,6 +280,9 @@ public class StatusBar extends SystemUI implements DemoMode,
    public static final String STATUS_BAR_BRIGHTNESS_CONTROL =
            "lineagesystem:" + LineageSettings.System.STATUS_BAR_BRIGHTNESS_CONTROL;

    public static final String FORCE_SHOW_NAVBAR =
            "lineagesystem:" + LineageSettings.System.FORCE_SHOW_NAVBAR;

    private static final String BANNER_ACTION_CANCEL =
            "com.android.systemui.statusbar.banner_action_cancel";
    private static final String BANNER_ACTION_SETUP =
@@ -698,6 +701,7 @@ public class StatusBar extends SystemUI implements DemoMode,
        mColorExtractor = Dependency.get(SysuiColorExtractor.class);
        mDeviceProvisionedController = Dependency.get(DeviceProvisionedController.class);
        mNavigationBarController = Dependency.get(NavigationBarController.class);
        mNavigationBarSystemUiVisibility = mNavigationBarController.createSystemUiVisibility();
        mBubbleController = Dependency.get(BubbleController.class);
        mBubbleController.setExpandListener(mBubbleExpandListener);
        mActivityIntentHelper = new ActivityIntentHelper(mContext);
@@ -713,9 +717,22 @@ public class StatusBar extends SystemUI implements DemoMode,
        mStatusBarStateController.addCallback(this,
                SysuiStatusBarStateController.RANK_STATUS_BAR);

        mNeedsNavigationBar = mContext.getResources().getBoolean(
                com.android.internal.R.bool.config_showNavigationBar);

        // Allow a system property to override this. Used by the emulator.
        // See also hasNavigationBar().
        String navBarOverride = SystemProperties.get("qemu.hw.mainkeys");
        if ("1".equals(navBarOverride)) {
            mNeedsNavigationBar = false;
        } else if ("0".equals(navBarOverride)) {
            mNeedsNavigationBar = true;
        }

        final TunerService tunerService = Dependency.get(TunerService.class);
        tunerService.addTunable(this, SCREEN_BRIGHTNESS_MODE);
        tunerService.addTunable(this, STATUS_BAR_BRIGHTNESS_CONTROL);
        tunerService.addTunable(this, FORCE_SHOW_NAVBAR);

        mDisplayManager = mContext.getSystemService(DisplayManager.class);

@@ -1202,7 +1219,8 @@ public class StatusBar extends SystemUI implements DemoMode,
    // TODO(b/117478341): This was left such that CarStatusBar can override this method.
    // Try to remove this.
    protected void createNavigationBar(@Nullable RegisterStatusBarResult result) {
        mNavigationBarController.createNavigationBars(true /* includeDefaultDisplay */, result);
        mNavigationBarController.createNavigationBars(true /* includeDefaultDisplay */, result,
                mNavigationBarSystemUiVisibility);
    }

    /**
@@ -2267,6 +2285,16 @@ public class StatusBar extends SystemUI implements DemoMode,
        if (displayId != mDisplayId) {
            return;
        }

        mNavigationBarSystemUiVisibility.displayId = displayId;
        mNavigationBarSystemUiVisibility.vis = vis;
        mNavigationBarSystemUiVisibility.fullscreenStackVis = fullscreenStackVis;
        mNavigationBarSystemUiVisibility.dockedStackVis = dockedStackVis;
        mNavigationBarSystemUiVisibility.mask = mask;
        mNavigationBarSystemUiVisibility.fullscreenStackBounds = fullscreenStackBounds;
        mNavigationBarSystemUiVisibility.dockedStackBounds = dockedStackBounds;
        mNavigationBarSystemUiVisibility.navbarColorManagedByIme = navbarColorManagedByIme;

        final int oldVal = mSystemUiVisibility;
        final int newVal = (oldVal&~mask) | (vis&mask);
        final int diff = newVal ^ oldVal;
@@ -4371,6 +4399,8 @@ public class StatusBar extends SystemUI implements DemoMode,
            = Dependency.get(DeviceProvisionedController.class);

    protected NavigationBarController mNavigationBarController;
    private NavigationBarController.SystemUiVisibility mNavigationBarSystemUiVisibility;
    private boolean mNeedsNavigationBar;

    // UI-specific methods

@@ -4724,6 +4754,21 @@ public class StatusBar extends SystemUI implements DemoMode,
                    == Settings.System.SCREEN_BRIGHTNESS_MODE_AUTOMATIC;
        } else if (STATUS_BAR_BRIGHTNESS_CONTROL.equals(key)) {
            mBrightnessControl = newValue != null && Integer.parseInt(newValue) == 1;
        } else if (FORCE_SHOW_NAVBAR.equals(key) && mDisplayId == Display.DEFAULT_DISPLAY &&
                mWindowManagerService != null) {
            boolean forcedVisibility = mNeedsNavigationBar ||
                    (newValue != null && Integer.parseInt(newValue) == 1);
            boolean hasNavbar = getNavigationBarView() != null;
            if (forcedVisibility) {
                if (!hasNavbar) {
                    mNavigationBarController.onDisplayReady(mDisplayId,
                            mNavigationBarSystemUiVisibility);
                }
            } else {
                if (hasNavbar) {
                    mNavigationBarController.onDisplayRemoved(mDisplayId);
                }
            }
        }
    }
    // End Extra BaseStatusBarMethods.
+1 −0
Original line number Diff line number Diff line
@@ -74,6 +74,7 @@ public class TunerServiceImpl extends TunerService {
            NotificationPanelView.STATUS_BAR_QUICK_QS_PULLDOWN,
            QSTileHost.TILES_SETTING,
            Settings.Secure.DOZE_ALWAYS_ON,
            StatusBar.FORCE_SHOW_NAVBAR,
            StatusBar.SCREEN_BRIGHTNESS_MODE,
            StatusBar.STATUS_BAR_BRIGHTNESS_CONTROL
    };
+28 −1
Original line number Diff line number Diff line
@@ -238,6 +238,7 @@ import com.android.server.wm.WindowManagerInternal.AppTransitionListener;

import dalvik.system.PathClassLoader;

import lineageos.hardware.LineageHardwareManager;
import lineageos.providers.LineageSettings;

import org.lineageos.internal.buttons.LineageButtons;
@@ -560,6 +561,8 @@ public class PhoneWindowManager implements WindowManagerPolicy {
    int mMetaState;
    int mInitialMetaState;

    private int mForceNavbar = -1;

    // Tracks user-customisable behavior for certain key events
    private Action mHomeLongPressAction;
    private Action mHomeDoubleTapAction;
@@ -718,6 +721,8 @@ public class PhoneWindowManager implements WindowManagerPolicy {
    private int mTorchTimeout;
    private PendingIntent mTorchOffPendingIntent;

    private LineageHardwareManager mLineageHardware;

    private class PolicyHandler extends Handler {
        @Override
        public void handleMessage(Message msg) {
@@ -870,6 +875,9 @@ public class PhoneWindowManager implements WindowManagerPolicy {
            resolver.registerContentObserver(LineageSettings.Secure.getUriFor(
                    LineageSettings.Secure.KILL_APP_LONGPRESS_BACK), false, this,
                    UserHandle.USER_ALL);
            resolver.registerContentObserver(LineageSettings.System.getUriFor(
                    LineageSettings.System.FORCE_SHOW_NAVBAR), false, this,
                    UserHandle.USER_ALL);
            resolver.registerContentObserver(LineageSettings.System.getUriFor(
                    LineageSettings.System.TORCH_LONG_PRESS_POWER_GESTURE), false, this,
                    UserHandle.USER_ALL);
@@ -2022,7 +2030,6 @@ public class PhoneWindowManager implements WindowManagerPolicy {
        mHandler = new PolicyHandler();
        mWakeGestureListener = new MyWakeGestureListener(mContext, mHandler);
        mSettingsObserver = new SettingsObserver(mHandler);
        mSettingsObserver.observe();

        // Lineage additions
        mAlarmManager = mContext.getSystemService(AlarmManager.class);
@@ -2251,6 +2258,10 @@ public class PhoneWindowManager implements WindowManagerPolicy {
    private void updateKeyAssignments() {
        int activeHardwareKeys = mDeviceHardwareKeys;

        if (mForceNavbar == 1) {
            activeHardwareKeys = 0;
        }

        final boolean hasMenu = (activeHardwareKeys & KEY_MASK_MENU) != 0;
        final boolean hasAssist = (activeHardwareKeys & KEY_MASK_ASSIST) != 0;
        final boolean hasAppSwitch = (activeHardwareKeys & KEY_MASK_APP_SWITCH) != 0;
@@ -2397,6 +2408,17 @@ public class PhoneWindowManager implements WindowManagerPolicy {
                updateWakeGestureListenerLp();
            }

            int forceNavbar = LineageSettings.System.getIntForUser(resolver,
                    LineageSettings.System.FORCE_SHOW_NAVBAR, 0,
                    UserHandle.USER_CURRENT);
            if (forceNavbar != mForceNavbar) {
                mForceNavbar = forceNavbar;
                if (mLineageHardware.isSupported(LineageHardwareManager.FEATURE_KEY_DISABLE)) {
                    mLineageHardware.set(LineageHardwareManager.FEATURE_KEY_DISABLE,
                            mForceNavbar == 1);
                }
            }

            updateKeyAssignments();

            // use screen off timeout setting as the timeout for the lockscreen
@@ -5435,6 +5457,11 @@ public class PhoneWindowManager implements WindowManagerPolicy {
            mVrManagerInternal.addPersistentVrModeStateListener(mPersistentVrModeListener);
        }

        mLineageHardware = LineageHardwareManager.getInstance(mContext);
        // Ensure observe happens in systemReady() since we need
        // LineageHardwareService to be up and running
        mSettingsObserver.observe();

        readCameraLensCoverState();
        updateUiMode();
        mDefaultDisplayRotation.updateOrientationListener();
+11 −1
Original line number Diff line number Diff line
@@ -781,6 +781,8 @@ public final class PowerManagerService extends SystemService
    private SensorEventListener mProximityListener;
    private android.os.PowerManager.WakeLock mProximityWakeLock;

    private boolean mForceNavbar;

    public PowerManagerService(Context context) {
        this(context, new Injector());
    }
@@ -974,6 +976,10 @@ public final class PowerManagerService extends SystemService
        resolver.registerContentObserver(LineageSettings.System.getUriFor(
                LineageSettings.System.PROXIMITY_ON_WAKE),
                false, mSettingsObserver, UserHandle.USER_ALL);
        resolver.registerContentObserver(LineageSettings.System.getUriFor(
                LineageSettings.System.FORCE_SHOW_NAVBAR),
                false, mSettingsObserver, UserHandle.USER_ALL);

        IVrManager vrManager = IVrManager.Stub.asInterface(getBinderService(Context.VR_SERVICE));
        if (vrManager != null) {
            try {
@@ -1116,6 +1122,10 @@ public final class PowerManagerService extends SystemService
                LineageSettings.System.PROXIMITY_ON_WAKE,
                mProximityWakeEnabledByDefaultConfig ? 1 : 0) == 1;

        mForceNavbar = LineageSettings.System.getIntForUser(resolver,
                LineageSettings.System.FORCE_SHOW_NAVBAR,
                0, UserHandle.USER_CURRENT) == 1;

        mDirty |= DIRTY_SETTINGS;
    }

@@ -2142,7 +2152,7 @@ public final class PowerManagerService extends SystemService
                            if (mButtonBrightnessOverrideFromWindowManager >= 0) {
                                buttonBrightness = mButtonBrightnessOverrideFromWindowManager;
                            } else {
                                buttonBrightness = mButtonBrightness;
                                buttonBrightness = !mForceNavbar ? mButtonBrightness : 0;
                            }

                            mLastButtonActivityTime = mButtonLightOnKeypressOnly ?
Loading