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

Commit 10d44bf3 authored by Alberto97's avatar Alberto97 Committed by Łukasz Patron
Browse files

SystemUI: Port statusbar brightness control



This is a squash of the following changes:

Author: Danesh Mondegarian <daneshm90@gmail.com>
Date:   Sun Nov 10 23:30:56 2013 -0800

    SystemUI : Port forward statusbar brightness control

    Brings back the status bar brightness control from cm-10.2/cm-11

    Change-Id: Icc04e7da3286e9925f8b90528c1e022b33d33e9d

Author: Roman Birg <roman@cyngn.com>
Date:   Mon Dec 1 16:08:21 2014 -0800

    SystemUI: improve brightness slider behavior

    Mimic the brightness slider behavior in the statusbar.
    This adds logic to make the statusbar slider also work with automatic
    brightness mode enabled and it will instead adjust the temporary automatic
    brightness overrride.

    Change-Id: I78814a785decc83df94844fcc2f489c8cbec2b65
    Signed-off-by: default avatarRoman Birg <roman@cyngn.com>

Author: Pawit Pornkitprasan <p.pawit@gmail.com>
Date:   Sun Dec 28 20:42:41 2014 +0700

    SystemUI: status bar brightness: store value as int

    Non-automatic brightness value is stored as int, not float.

    Symptom: adjust the brightness in the status bar, the brightness
             slider in the notification bar will always be set to full

    Change-Id: I5f9a6e97bae2c44c3aff7c9222186a6dbda5d902

Author: Zhao Wei Liew <zhaoweiliew@gmail.com>
Date:   Fri Oct 7 10:09:04 2016 +0800

    SystemUI: statusbar: Fix status bar brightness control feature

    Bring in the missing fixes from CM 13.

    This commit squashes the following commits from CM 13.0:
    6397527c SystemUI: fix status bar brightness slider eating events
    bbef4227 SystemUI : fix brightness slider for automatic brightness

    Change-Id: I85e0b99dc33468b36222128660707fe481cf8b33

Author: Zhao Wei Liew <zhaoweiliew@gmail.com>
Date:   Fri Oct 7 08:56:25 2016 +0800

    SystemUI: Use Tuner API for CM settings

    Get rid of all the excess code by implementing TunerService.Tunable
    and observing any changes made to the settings through it.

    Remove UserContentObserver as the Tuner API handles user switches.

    Also remove some unused imports that were introduced in earlier
    CM commits, but were never removed since.

    Change-Id: Iecafafabdaec82b3b3c72293bea865de48f0e90a

Change-Id: Ic8ded146dc8605e6140f4352cafa6f961ad3decc
parent befadc93
Loading
Loading
Loading
Loading
+146 −3
Original line number Diff line number Diff line
@@ -74,6 +74,7 @@ import android.content.res.Configuration;
import android.content.res.Resources;
import android.graphics.Point;
import android.graphics.PointF;
import android.hardware.display.DisplayManager;
import android.media.AudioAttributes;
import android.metrics.LogMaker;
import android.net.Uri;
@@ -103,6 +104,7 @@ import android.util.Log;
import android.util.MathUtils;
import android.util.Slog;
import android.view.Display;
import android.view.HapticFeedbackConstants;
import android.view.IRemoteAnimationRunner;
import android.view.IWindowManager;
import android.view.InsetsState.InternalInsetsType;
@@ -111,6 +113,7 @@ import android.view.MotionEvent;
import android.view.RemoteAnimationAdapter;
import android.view.ThreadedRenderer;
import android.view.View;
import android.view.ViewConfiguration;
import android.view.ViewGroup;
import android.view.WindowInsetsController.Appearance;
import android.view.WindowInsetsController.Behavior;
@@ -291,6 +294,10 @@ public class StatusBar extends SystemUI implements DemoMode,

    private static final String FORCE_SHOW_NAVBAR =
            "lineagesystem:" + LineageSettings.System.FORCE_SHOW_NAVBAR;
    public static final String SCREEN_BRIGHTNESS_MODE =
            "system:" + Settings.System.SCREEN_BRIGHTNESS_MODE;
    private static final String STATUS_BAR_BRIGHTNESS_CONTROL =
            "lineagesystem:" + LineageSettings.System.STATUS_BAR_BRIGHTNESS_CONTROL;

    private static final String BANNER_ACTION_CANCEL =
            "com.android.systemui.statusbar.banner_action_cancel";
@@ -334,6 +341,10 @@ public class StatusBar extends SystemUI implements DemoMode,
            .setUsage(AudioAttributes.USAGE_ASSISTANCE_SONIFICATION)
            .build();

    private static final float BRIGHTNESS_CONTROL_PADDING = 0.15f;
    private static final int BRIGHTNESS_CONTROL_LONG_PRESS_TIMEOUT = 750; // ms
    private static final int BRIGHTNESS_CONTROL_LINGER_THRESHOLD = 20;

    public static final int FADE_KEYGUARD_START_DELAY = 100;
    public static final int FADE_KEYGUARD_DURATION = 300;
    public static final int FADE_KEYGUARD_DURATION_PULSING = 96;
@@ -481,6 +492,18 @@ public class StatusBar extends SystemUI implements DemoMode,

    private final List<ExpansionChangedListener> mExpansionChangedListeners;

    private DisplayManager mDisplayManager;

    private int mMinBrightness;
    private int mInitialTouchX;
    private int mInitialTouchY;
    private int mLinger;
    private int mQuickQsOffsetHeight;
    private boolean mAutomaticBrightness;
    private boolean mBrightnessControl;
    private boolean mBrightnessChanged;
    private boolean mJustPeeked;

    // for disabling the status bar
    private int mDisabled1 = 0;
    private int mDisabled2 = 0;
@@ -501,6 +524,15 @@ public class StatusBar extends SystemUI implements DemoMode,

    private final MetricsLogger mMetricsLogger;

    private final Runnable mLongPressBrightnessChange = new Runnable() {
        @Override
        public void run() {
            mStatusBarView.performHapticFeedback(HapticFeedbackConstants.LONG_PRESS);
            adjustBrightness(mInitialTouchX);
            mLinger = BRIGHTNESS_CONTROL_LINGER_THRESHOLD + 1;
        }
    };

    // ensure quick settings is disabled until the current user makes it through the setup wizard
    @VisibleForTesting
    protected boolean mUserSetup = false;
@@ -956,6 +988,10 @@ public class StatusBar extends SystemUI implements DemoMode,
        }

        mTunerService.addTunable(this, FORCE_SHOW_NAVBAR);
        mTunerService.addTunable(this, SCREEN_BRIGHTNESS_MODE);
        mTunerService.addTunable(this, STATUS_BAR_BRIGHTNESS_CONTROL);

        mDisplayManager = mContext.getSystemService(DisplayManager.class);

        mWindowManager = (WindowManager) mContext.getSystemService(Context.WINDOW_SERVICE);
        mDreamManager = IDreamManager.Stub.asInterface(
@@ -1144,6 +1180,9 @@ public class StatusBar extends SystemUI implements DemoMode,
        mNotificationShadeWindowViewController.setService(this, mNotificationShadeWindowController);
        mNotificationShadeWindowView.setOnTouchListener(getStatusBarWindowTouchListener());

        mMinBrightness = context.getResources().getInteger(
                com.android.internal.R.integer.config_screenBrightnessDim);

        // TODO: Deal with the ugliness that comes from having some of the statusbar broken out
        // into fragments, but the rest here, it leaves some awkward lifecycle and whatnot.
        mStackScrollerController =
@@ -2468,6 +2507,90 @@ public class StatusBar extends SystemUI implements DemoMode,
        }
    }

    private void adjustBrightness(int x) {
        mBrightnessChanged = true;
        float raw = ((float) x) / getDisplayWidth();

        // Add a padding to the brightness control on both sides to
        // make it easier to reach min/max brightness
        float padded = Math.min(1.0f - BRIGHTNESS_CONTROL_PADDING,
                Math.max(BRIGHTNESS_CONTROL_PADDING, raw));
        float value = (padded - BRIGHTNESS_CONTROL_PADDING) /
                (1 - (2.0f * BRIGHTNESS_CONTROL_PADDING));
        if (mAutomaticBrightness) {
            float adj = (2 * value) - 1;
            adj = Math.max(adj, -1);
            adj = Math.min(adj, 1);
            final float val = adj;
            mDisplayManager.setTemporaryAutoBrightnessAdjustment(val);
            AsyncTask.execute(new Runnable() {
                public void run() {
                    Settings.System.putFloatForUser(mContext.getContentResolver(),
                            Settings.System.SCREEN_AUTO_BRIGHTNESS_ADJ, val,
                            UserHandle.USER_CURRENT);
                }
            });
        } else {
            int newBrightness = mMinBrightness + (int) Math.round(value *
                    (PowerManager.BRIGHTNESS_ON - mMinBrightness));
            newBrightness = Math.min(newBrightness, PowerManager.BRIGHTNESS_ON);
            newBrightness = Math.max(newBrightness, mMinBrightness);
            final int val = newBrightness;
            mDisplayManager.setTemporaryBrightness(mDisplayId, val);
            AsyncTask.execute(new Runnable() {
                @Override
                public void run() {
                    Settings.System.putIntForUser(mContext.getContentResolver(),
                            Settings.System.SCREEN_BRIGHTNESS, val,
                            UserHandle.USER_CURRENT);
                }
            });
        }
    }

    private void brightnessControl(MotionEvent event) {
        final int action = event.getAction();
        final int x = (int) event.getRawX();
        final int y = (int) event.getRawY();
        mQuickQsOffsetHeight = mContext.getResources().getDimensionPixelSize(
                com.android.internal.R.dimen.quick_qs_offset_height);
        if (action == MotionEvent.ACTION_DOWN) {
            if (y < mQuickQsOffsetHeight) {
                mLinger = 0;
                mInitialTouchX = x;
                mInitialTouchY = y;
                mJustPeeked = true;
                mHandler.removeCallbacks(mLongPressBrightnessChange);
                mHandler.postDelayed(mLongPressBrightnessChange,
                        BRIGHTNESS_CONTROL_LONG_PRESS_TIMEOUT);
            }
        } else if (action == MotionEvent.ACTION_MOVE) {
            if (y < mQuickQsOffsetHeight && mJustPeeked) {
                if (mLinger > BRIGHTNESS_CONTROL_LINGER_THRESHOLD) {
                    adjustBrightness(x);
                } else {
                    final int xDiff = Math.abs(x - mInitialTouchX);
                    final int yDiff = Math.abs(y - mInitialTouchY);
                    final int touchSlop = ViewConfiguration.get(mContext).getScaledTouchSlop();
                    if (xDiff > yDiff) {
                        mLinger++;
                    }
                    if (xDiff > touchSlop || yDiff > touchSlop) {
                        mHandler.removeCallbacks(mLongPressBrightnessChange);
                    }
                }
            } else {
                if (y > mQuickQsOffsetHeight) {
                    mJustPeeked = false;
                }
                mHandler.removeCallbacks(mLongPressBrightnessChange);
            }
        } else if (action == MotionEvent.ACTION_UP
                || action == MotionEvent.ACTION_CANCEL) {
            mHandler.removeCallbacks(mLongPressBrightnessChange);
        }
    }

    public boolean interceptTouchEvent(MotionEvent event) {
        if (DEBUG_GESTURES) {
            if (event.getActionMasked() != MotionEvent.ACTION_MOVE) {
@@ -2494,16 +2617,30 @@ public class StatusBar extends SystemUI implements DemoMode,
            mGestureRec.add(event);
        }

        if (mStatusBarWindowState == WINDOW_STATE_SHOWING) {
        if (mBrightnessControl) {
            brightnessControl(event);
            if ((mDisabled1 & StatusBarManager.DISABLE_EXPAND) != 0) {
                return true;
            }
        }

        final boolean upOrCancel =
                event.getAction() == MotionEvent.ACTION_UP ||
                event.getAction() == MotionEvent.ACTION_CANCEL;

        if (mStatusBarWindowState == WINDOW_STATE_SHOWING) {
            if (upOrCancel && !mExpandedVisible) {
                setInteracting(StatusBarManager.WINDOW_STATUS_BAR, false);
            } else {
                setInteracting(StatusBarManager.WINDOW_STATUS_BAR, true);
            }
        }
        if (mBrightnessChanged && upOrCancel) {
            mBrightnessChanged = false;
            if (mJustPeeked && mExpandedVisible) {
                mNotificationPanelViewController.fling(10, false);
            }
        }
        return false;
    }

@@ -5000,6 +5137,12 @@ public class StatusBar extends SystemUI implements DemoMode,
                    mNavigationBarController.onDisplayRemoved(mDisplayId);
                }
            }
        } else if (SCREEN_BRIGHTNESS_MODE.equals(key)) {
            mAutomaticBrightness = Settings.System.SCREEN_BRIGHTNESS_MODE_AUTOMATIC ==
                    TunerService.parseInteger(newValue,
                            Settings.System.SCREEN_BRIGHTNESS_MODE_MANUAL);
        } else if (STATUS_BAR_BRIGHTNESS_CONTROL.equals(key)) {
            mBrightnessControl = TunerService.parseIntegerSwitch(newValue, false);
        }
    }
    // End Extra BaseStatusBarMethods.
+3 −1
Original line number Diff line number Diff line
@@ -43,6 +43,7 @@ import com.android.systemui.dagger.qualifiers.Main;
import com.android.systemui.demomode.DemoModeController;
import com.android.systemui.qs.QSTileHost;
import com.android.systemui.settings.UserTracker;
import com.android.systemui.statusbar.phone.StatusBar;
import com.android.systemui.statusbar.phone.StatusBarIconController;
import com.android.systemui.statusbar.phone.SystemUIDialog;
import com.android.systemui.util.leak.LeakDetector;
@@ -72,7 +73,8 @@ public class TunerServiceImpl extends TunerService {
            QSTileHost.TILES_SETTING,
            Settings.Secure.DOZE_ALWAYS_ON,
            Settings.Secure.MEDIA_CONTROLS_RESUME,
            Settings.Secure.MEDIA_CONTROLS_RECOMMENDATION
            Settings.Secure.MEDIA_CONTROLS_RECOMMENDATION,
            StatusBar.SCREEN_BRIGHTNESS_MODE,
    };

    private final Observer mObserver = new Observer();