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

Commit bc718db5 authored by Bruno Martins's avatar Bruno Martins
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: jhenrique09 <jhenrique09.mcz@hotmail.com>
Date:   Tue Mar 24 22:04:47 2020 -0300

    DisplayPolicy: Fix watchdog when adding new display

    * Fixes system crashing after connected to Android Auto or started screen record

    That was introduced on toggle navbar commit

    Only register content observer if default display

    Change-Id: Ia43a922251803be94de8618eb442dcf132e479e9

Change-Id: I4a6d3f89bc171c3921875b24c077cb78c03517ad
parent 31ec6b7b
Loading
Loading
Loading
Loading
+45 −2
Original line number Diff line number Diff line
@@ -219,8 +219,11 @@ import com.android.systemui.statusbar.policy.OnHeadsUpChangedListener;
import com.android.systemui.statusbar.policy.RemoteInputQuickSettingsDisabler;
import com.android.systemui.statusbar.policy.UserInfoControllerImpl;
import com.android.systemui.statusbar.policy.UserSwitcherController;
import com.android.systemui.tuner.TunerService;
import com.android.systemui.volume.VolumeComponent;

import lineageos.providers.LineageSettings;

import java.io.FileDescriptor;
import java.io.PrintWriter;
import java.io.StringWriter;
@@ -237,7 +240,8 @@ public class StatusBar extends SystemUI implements DemoMode,
        ActivityStarter, KeyguardStateController.Callback,
        OnHeadsUpChangedListener, CommandQueue.Callbacks,
        ColorExtractor.OnColorsChangedListener, ConfigurationListener,
        StatusBarStateController.StateListener, ActivityLaunchAnimator.Callback {
        StatusBarStateController.StateListener, ActivityLaunchAnimator.Callback,
        TunerService.Tunable {
    public static final boolean MULTIUSER_DEBUG = false;

    protected static final int MSG_HIDE_RECENT_APPS = 1020;
@@ -251,6 +255,9 @@ public class StatusBar extends SystemUI implements DemoMode,
    public static final String SYSTEM_DIALOG_REASON_RECENT_APPS = "recentapps";
    static public final String SYSTEM_DIALOG_REASON_SCREENSHOT = "screenshot";

    private 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 =
@@ -386,6 +393,7 @@ public class StatusBar extends SystemUI implements DemoMode,
    private final ExtensionController mExtensionController;
    private final UserInfoControllerImpl mUserInfoControllerImpl;
    private final DismissCallbackRegistry mDismissCallbackRegistry;
    private final TunerService mTunerService;
    private NotificationsController mNotificationsController;

    // expanded notifications
@@ -722,7 +730,8 @@ public class StatusBar extends SystemUI implements DemoMode,
            KeyguardIndicationController keyguardIndicationController,
            DismissCallbackRegistry dismissCallbackRegistry,
            Lazy<NotificationShadeDepthController> notificationShadeDepthControllerLazy,
            StatusBarTouchableRegionManager statusBarTouchableRegionManager) {
            StatusBarTouchableRegionManager statusBarTouchableRegionManager,
            TunerService tunerService) {
        super(context);
        mNotificationsController = notificationsController;
        mLightBarController = lightBarController;
@@ -799,6 +808,7 @@ public class StatusBar extends SystemUI implements DemoMode,
        mUserInfoControllerImpl = userInfoControllerImpl;
        mIconPolicy = phoneStatusBarPolicy;
        mDismissCallbackRegistry = dismissCallbackRegistry;
        mTunerService = tunerService;

        mBubbleExpandListener =
                (isExpanding, key) -> {
@@ -823,6 +833,19 @@ 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;
        }

        mTunerService.addTunable(this, FORCE_SHOW_NAVBAR);

        mWindowManager = (WindowManager) mContext.getSystemService(Context.WINDOW_SERVICE);
        mDreamManager = IDreamManager.Stub.asInterface(
                ServiceManager.checkService(DreamService.DREAM_SERVICE));
@@ -4044,6 +4067,7 @@ public class StatusBar extends SystemUI implements DemoMode,
    private final DeviceProvisionedController mDeviceProvisionedController;

    private final NavigationBarController mNavigationBarController;
    private boolean mNeedsNavigationBar;

    // UI-specific methods

@@ -4359,6 +4383,25 @@ public class StatusBar extends SystemUI implements DemoMode,
    public void startAssist(Bundle args) {
        mAssistManagerLazy.get().startAssist(args);
    }

    @Override
    public void onTuningChanged(String key, String newValue) {
        if (FORCE_SHOW_NAVBAR.equals(key) && mDisplayId == Display.DEFAULT_DISPLAY &&
                mWindowManagerService != null) {
            boolean forcedVisibility = mNeedsNavigationBar ||
                    TunerService.parseIntegerSwitch(newValue, false);
            boolean hasNavbar = getNavigationBarView() != null;
            if (forcedVisibility) {
                if (!hasNavbar) {
                    mNavigationBarController.onDisplayReady(mDisplayId);
                }
            } else {
                if (hasNavbar) {
                    mNavigationBarController.onDisplayRemoved(mDisplayId);
                }
            }
        }
    }
    // End Extra BaseStatusBarMethods.

    public NotificationGutsManager getGutsManager() {
+5 −2
Original line number Diff line number Diff line
@@ -97,6 +97,7 @@ import com.android.systemui.statusbar.policy.NetworkController;
import com.android.systemui.statusbar.policy.RemoteInputQuickSettingsDisabler;
import com.android.systemui.statusbar.policy.UserInfoControllerImpl;
import com.android.systemui.statusbar.policy.UserSwitcherController;
import com.android.systemui.tuner.TunerService;
import com.android.systemui.volume.VolumeComponent;

import java.util.Optional;
@@ -198,7 +199,8 @@ public interface StatusBarPhoneModule {
            KeyguardIndicationController keyguardIndicationController,
            Lazy<NotificationShadeDepthController> notificationShadeDepthController,
            DismissCallbackRegistry dismissCallbackRegistry,
            StatusBarTouchableRegionManager statusBarTouchableRegionManager) {
            StatusBarTouchableRegionManager statusBarTouchableRegionManager,
            TunerService tunerService) {
        return new StatusBar(
                context,
                notificationsController,
@@ -276,6 +278,7 @@ public interface StatusBarPhoneModule {
                keyguardIndicationController,
                dismissCallbackRegistry,
                notificationShadeDepthController,
                statusBarTouchableRegionManager);
                statusBarTouchableRegionManager,
                tunerService);
    }
}
+28 −1
Original line number Diff line number Diff line
@@ -227,6 +227,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;
@@ -545,6 +546,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;
@@ -697,6 +700,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) {
@@ -848,6 +853,9 @@ public class PhoneWindowManager implements WindowManagerPolicy {
            resolver.registerContentObserver(LineageSettings.System.getUriFor(
                    LineageSettings.System.KEY_HOME_DOUBLE_TAP_ACTION), 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.KEY_MENU_ACTION), false, this,
                    UserHandle.USER_ALL);
@@ -1989,7 +1997,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);
@@ -2214,6 +2221,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;
@@ -2360,6 +2371,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
@@ -5319,6 +5341,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();
+16 −5
Original line number Diff line number Diff line
@@ -898,6 +898,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());
    }
@@ -1202,6 +1204,9 @@ 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) {
@@ -1353,6 +1358,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;
    }

@@ -2386,12 +2395,14 @@ public final class PowerManagerService extends SystemService
                        mUserActivitySummary = USER_ACTIVITY_SCREEN_BRIGHT;
                        if (getWakefulnessLocked() == WAKEFULNESS_AWAKE) {
                            float buttonBrightness = PowerManager.BRIGHTNESS_OFF_FLOAT;
                            if (!mForceNavbar) {
                                if (isValidButtonBrightness(
                                        mButtonBrightnessOverrideFromWindowManager)) {
                                    buttonBrightness = mButtonBrightnessOverrideFromWindowManager;
                                } else if (isValidButtonBrightness(mButtonBrightness)) {
                                    buttonBrightness = mButtonBrightness;
                                }
                            }

                            mLastButtonActivityTime = mButtonLightOnKeypressOnly ?
                                    mLastButtonActivityTime : mLastUserActivityTime;
+37 −1
Original line number Diff line number Diff line
@@ -130,10 +130,12 @@ import android.app.ActivityThread;
import android.app.LoadedApk;
import android.app.ResourcesManager;
import android.app.StatusBarManager;
import android.content.ContentResolver;
import android.content.Context;
import android.content.Intent;
import android.content.pm.PackageManager;
import android.content.res.Resources;
import android.database.ContentObserver;
import android.graphics.Insets;
import android.graphics.PixelFormat;
import android.graphics.Rect;
@@ -199,6 +201,8 @@ import com.android.server.statusbar.StatusBarManagerInternal;
import com.android.server.wallpaper.WallpaperManagerInternal;
import com.android.server.wm.utils.InsetUtils;

import lineageos.providers.LineageSettings;

import java.io.PrintWriter;
import java.util.function.Consumer;

@@ -286,6 +290,7 @@ public class DisplayPolicy {

    private volatile boolean mHasStatusBar;
    private volatile boolean mHasNavigationBar;
    private volatile int mForceNavbar = -1;
    // Can the navigation bar ever move to the side?
    private volatile boolean mNavigationBarCanMove;
    private volatile boolean mNavigationBarLetsThroughTaps;
@@ -401,6 +406,8 @@ public class DisplayPolicy {

    private PointerLocationView mPointerLocationView;

    private SettingsObserver mSettingsObserver;

    /**
     * The area covered by system windows which belong to another display. Forwarded insets is set
     * in case this is a virtual display, this is displayed on another display that has insets, and
@@ -455,6 +462,24 @@ public class DisplayPolicy {
        }
    }

    private class SettingsObserver extends ContentObserver {
        public SettingsObserver(Handler handler) {
            super(handler);

            ContentResolver resolver = mContext.getContentResolver();
            resolver.registerContentObserver(LineageSettings.System.getUriFor(
                    LineageSettings.System.FORCE_SHOW_NAVBAR), false, this,
                    UserHandle.USER_ALL);

            updateSettings();
        }

        @Override
        public void onChange(boolean selfChange) {
            updateSettings();
        }
    }

    DisplayPolicy(WindowManagerService service, DisplayContent displayContent) {
        mService = service;
        mContext = displayContent.isDefaultDisplay ? service.mContext
@@ -624,6 +649,9 @@ public class DisplayPolicy {
            } else if ("0".equals(navBarOverride)) {
                mHasNavigationBar = true;
            }

            // Register content observer only for main display
            mSettingsObserver = new SettingsObserver(mHandler);
        } else {
            mHasStatusBar = false;
            mHasNavigationBar = mDisplayContent.supportsSystemDecorations();
@@ -651,6 +679,14 @@ public class DisplayPolicy {
        }
    }

    public void updateSettings() {
        ContentResolver resolver = mContext.getContentResolver();

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

    private int getDisplayId() {
        return mDisplayContent.getDisplayId();
    }
@@ -710,7 +746,7 @@ public class DisplayPolicy {
    }

    public boolean hasNavigationBar() {
        return mHasNavigationBar;
        return mHasNavigationBar || mForceNavbar == 1;
    }

    public boolean hasStatusBar() {