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

Commit 54279e44 authored by Michal Brzezinski's avatar Michal Brzezinski
Browse files

Fixing brightness slider jank in split shade

This jank was caused by two sliders - one in QS and one in QQS - being updated at the same time.
When sliding one, the other one register changes in brightness and is trying to animate itself into the new value. Because they share one mirror, seems like mirror is getting conflicting signals about current values - one mirror animates, the other doesn't.
Another issue this fixes is changing brightness significantly and quickly switching to collapsed or expanded QS - the animation would not end till new slider shows up and slider would be moving, even though the other slider was not moving.
Also renaming BrightnessSlider to BrightnessSliderController (because it seems to be naming convention for controllers) - that makes this change so wide-reaching.

Fixes: 196523321
Test: open split shade -> slide finger (not tap) on top of slider to change brightness -> lift finger and see no jank
Change-Id: Ie11e3670f1464e5f1c85e221ce09b6ebf6dd4d0c
parent 2a482869
Loading
Loading
Loading
Loading
+2 −2
Original line number Diff line number Diff line
@@ -41,7 +41,7 @@ import com.android.internal.widget.RemeasuringLinearLayout;
import com.android.systemui.R;
import com.android.systemui.plugins.qs.DetailAdapter;
import com.android.systemui.plugins.qs.QSTile;
import com.android.systemui.settings.brightness.BrightnessSlider;
import com.android.systemui.settings.brightness.BrightnessSliderController;
import com.android.systemui.statusbar.policy.BrightnessMirrorController;
import com.android.systemui.tuner.TunerService;
import com.android.systemui.tuner.TunerService.Tunable;
@@ -69,7 +69,7 @@ public class QSPanel extends LinearLayout implements Tunable {
    @Nullable
    protected View mBrightnessView;
    @Nullable
    protected BrightnessSlider mToggleSliderController;
    protected BrightnessSliderController mToggleSliderController;

    private final H mHandler = new H();
    /** Whether or not the QS media player feature is enabled. */
+8 −8
Original line number Diff line number Diff line
@@ -41,7 +41,7 @@ import com.android.systemui.qs.dagger.QSScope;
import com.android.systemui.qs.logging.QSLogger;
import com.android.systemui.settings.brightness.BrightnessController;
import com.android.systemui.settings.brightness.BrightnessMirrorHandler;
import com.android.systemui.settings.brightness.BrightnessSlider;
import com.android.systemui.settings.brightness.BrightnessSliderController;
import com.android.systemui.statusbar.CommandQueue;
import com.android.systemui.statusbar.policy.BrightnessMirrorController;
import com.android.systemui.tuner.TunerService;
@@ -63,7 +63,7 @@ public class QSPanelController extends QSPanelControllerBase<QSPanel> {
    private final FalsingManager mFalsingManager;
    private final CommandQueue mCommandQueue;
    private final BrightnessController mBrightnessController;
    private final BrightnessSlider mBrightnessSlider;
    private final BrightnessSliderController mBrightnessSliderController;
    private final BrightnessMirrorHandler mBrightnessMirrorHandler;

    private boolean mGridContentVisible = true;
@@ -99,8 +99,8 @@ public class QSPanelController extends QSPanelControllerBase<QSPanel> {
            QSTileRevealController.Factory qsTileRevealControllerFactory,
            DumpManager dumpManager, MetricsLogger metricsLogger, UiEventLogger uiEventLogger,
            QSLogger qsLogger, BrightnessController.Factory brightnessControllerFactory,
            BrightnessSlider.Factory brightnessSliderFactory, FalsingManager falsingManager,
            CommandQueue commandQueue) {
            BrightnessSliderController.Factory brightnessSliderFactory,
            FalsingManager falsingManager, CommandQueue commandQueue) {
        super(view, qstileHost, qsCustomizerController, usingMediaPlayer, mediaHost,
                metricsLogger, uiEventLogger, qsLogger, dumpManager);
        mQsSecurityFooter = qsSecurityFooter;
@@ -111,10 +111,10 @@ public class QSPanelController extends QSPanelControllerBase<QSPanel> {
        mCommandQueue = commandQueue;
        mQsSecurityFooter.setHostEnvironment(qstileHost);

        mBrightnessSlider = brightnessSliderFactory.create(getContext(), mView);
        mView.setBrightnessView(mBrightnessSlider.getRootView());
        mBrightnessSliderController = brightnessSliderFactory.create(getContext(), mView);
        mView.setBrightnessView(mBrightnessSliderController.getRootView());

        mBrightnessController = brightnessControllerFactory.create(mBrightnessSlider);
        mBrightnessController = brightnessControllerFactory.create(mBrightnessSliderController);
        mBrightnessMirrorHandler = new BrightnessMirrorHandler(mBrightnessController);
    }

@@ -125,7 +125,7 @@ public class QSPanelController extends QSPanelControllerBase<QSPanel> {
        mMediaHost.setShowsOnlyActiveMedia(false);
        mMediaHost.init(MediaHierarchyManager.LOCATION_QS);
        mQsCustomizerController.init();
        mBrightnessSlider.init();
        mBrightnessSliderController.init();
    }

    @Override
+4 −3
Original line number Diff line number Diff line
@@ -18,7 +18,7 @@ package com.android.systemui.qs

import androidx.annotation.VisibleForTesting
import com.android.systemui.settings.brightness.BrightnessController
import com.android.systemui.settings.brightness.BrightnessSlider
import com.android.systemui.settings.brightness.BrightnessSliderController
import com.android.systemui.settings.brightness.MirroredBrightnessController
import com.android.systemui.statusbar.policy.BrightnessMirrorController
import javax.inject.Inject
@@ -33,10 +33,11 @@ class QuickQSBrightnessController @VisibleForTesting constructor(

    @Inject constructor(
        brightnessControllerFactory: BrightnessController.Factory,
        brightnessSliderFactory: BrightnessSlider.Factory,
        brightnessSliderControllerFactory: BrightnessSliderController.Factory,
        quickQSPanel: QuickQSPanel
    ) : this(brightnessControllerFactory = {
            val slider = brightnessSliderFactory.create(quickQSPanel.context, quickQSPanel)
            val slider = brightnessSliderControllerFactory.create(quickQSPanel.context,
                    quickQSPanel)
            slider.init()
            quickQSPanel.setBrightnessView(slider.rootView)
            brightnessControllerFactory.create(slider)
+5 −32
Original line number Diff line number Diff line
@@ -51,8 +51,6 @@ import com.android.systemui.dagger.qualifiers.Background;
import com.android.systemui.settings.CurrentUserTracker;
import com.android.systemui.statusbar.policy.BrightnessMirrorController;

import java.util.ArrayList;

import javax.inject.Inject;

public class BrightnessController implements ToggleSlider.Listener, MirroredBrightnessController {
@@ -92,13 +90,9 @@ public class BrightnessController implements ToggleSlider.Listener, MirroredBrig
        @Override
        public void onDisplayChanged(int displayId) {
            mBackgroundHandler.post(mUpdateSliderRunnable);
            notifyCallbacks();
        }
    };

    private ArrayList<BrightnessStateChangeCallback> mChangeCallbacks =
            new ArrayList<BrightnessStateChangeCallback>();

    private volatile boolean mAutomatic;  // Brightness adjusted automatically using ambient light.
    private volatile boolean mIsVrModeEnabled;
    private boolean mListening;
@@ -114,11 +108,6 @@ public class BrightnessController implements ToggleSlider.Listener, MirroredBrig
        mControl.setMirrorControllerAndMirror(controller);
    }

    public interface BrightnessStateChangeCallback {
        /** Indicates that some of the brightness settings have changed */
        void onBrightnessLevelChanged();
    }

    /** ContentObserver to watch brightness */
    private class BrightnessObserver extends ContentObserver {

@@ -139,7 +128,6 @@ public class BrightnessController implements ToggleSlider.Listener, MirroredBrig
                mBackgroundHandler.post(mUpdateModeRunnable);
                mBackgroundHandler.post(mUpdateSliderRunnable);
            }
            notifyCallbacks();
        }

        public void startObserving() {
@@ -317,14 +305,6 @@ public class BrightnessController implements ToggleSlider.Listener, MirroredBrig
                Context.VR_SERVICE));
    }

    public void addStateChangedCallback(BrightnessStateChangeCallback cb) {
        mChangeCallbacks.add(cb);
    }

    public boolean removeStateChangedCallback(BrightnessStateChangeCallback cb) {
        return mChangeCallbacks.remove(cb);
    }

    public void registerCallbacks() {
        mBackgroundHandler.post(mStartListeningRunnable);
    }
@@ -375,10 +355,6 @@ public class BrightnessController implements ToggleSlider.Listener, MirroredBrig
                    }
                });
        }

        for (BrightnessStateChangeCallback cb : mChangeCallbacks) {
            cb.onBrightnessLevelChanged();
        }
    }

    public void checkRestrictionAndSetEnabled() {
@@ -435,8 +411,12 @@ public class BrightnessController implements ToggleSlider.Listener, MirroredBrig
    }

    private void animateSliderTo(int target) {
        if (!mControlValueInitialized) {
        if (!mControlValueInitialized || !mControl.isVisible()) {
            // Don't animate the first value since its default state isn't meaningful to users.
            // We also don't want to animate slider if it's not visible - especially important when
            // two sliders are active at the same time in split shade (one in QS and one in QQS),
            // as this negatively affects transition between them and they share mirror slider -
            // animating it from two different sources causes janky motion
            mControl.setValue(target);
            mControlValueInitialized = true;
        }
@@ -455,13 +435,6 @@ public class BrightnessController implements ToggleSlider.Listener, MirroredBrig
        mSliderAnimator.start();
    }

    private void notifyCallbacks() {
        final int size = mChangeCallbacks.size();
        for (int i = 0; i < size; i++) {
            mChangeCallbacks.get(i).onBrightnessLevelChanged();
        }
    }

    /** Factory for creating a {@link BrightnessController}. */
    public static class Factory {
        private final Context mContext;
+3 −3
Original line number Diff line number Diff line
@@ -41,14 +41,14 @@ import javax.inject.Inject;
public class BrightnessDialog extends Activity {

    private BrightnessController mBrightnessController;
    private final BrightnessSlider.Factory mToggleSliderFactory;
    private final BrightnessSliderController.Factory mToggleSliderFactory;
    private final BroadcastDispatcher mBroadcastDispatcher;
    private final Handler mBackgroundHandler;

    @Inject
    public BrightnessDialog(
            BroadcastDispatcher broadcastDispatcher,
            BrightnessSlider.Factory factory,
            BrightnessSliderController.Factory factory,
            @Background Handler bgHandler) {
        mBroadcastDispatcher = broadcastDispatcher;
        mToggleSliderFactory = factory;
@@ -77,7 +77,7 @@ public class BrightnessDialog extends Activity {
        // The brightness mirror container is INVISIBLE by default.
        frame.setVisibility(View.VISIBLE);

        BrightnessSlider controller = mToggleSliderFactory.create(this, frame);
        BrightnessSliderController controller = mToggleSliderFactory.create(this, frame);
        controller.init();
        frame.addView(controller.getRootView(), MATCH_PARENT, WRAP_CONTENT);

Loading