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

Unverified Commit 86437ec3 authored by Roman Birg's avatar Roman Birg Committed by Michael Bestas
Browse files

SystemUI: Add quick settings pull down with one finger



Logic is currently set to use 1/3 of right hand side of the statusbar to
trigger a quick settings quick pull down, quickly.

Co-authored-by: default avatarBruno Martins <bgcngm@gmail.com>
Co-authored-by: default avatarOliver Scott <olivercscott@gmail.com>
Co-authored-by: default avatarpppig236 <priv@pppig236.com>
Co-authored-by: default avatarZhao Wei Liew <zhaoweiliew@gmail.com>
Change-Id: I3c5dcfc23f39bf8be6c402e25f61e6f57a8add2c
parent 7acddfad
Loading
Loading
Loading
Loading
+46 −2
Original line number Diff line number Diff line
@@ -34,9 +34,12 @@ import android.animation.AnimatorListenerAdapter;
import android.animation.ValueAnimator;
import android.app.Fragment;
import android.content.res.Resources;
import android.database.ContentObserver;
import android.graphics.Insets;
import android.graphics.Rect;
import android.graphics.Region;
import android.os.Handler;
import android.os.UserHandle;
import android.util.IndentingPrintWriter;
import android.util.Log;
import android.util.MathUtils;
@@ -100,10 +103,13 @@ import com.android.systemui.statusbar.phone.StatusBarKeyguardViewManager;
import com.android.systemui.statusbar.policy.CastController;
import com.android.systemui.statusbar.policy.KeyguardStateController;
import com.android.systemui.statusbar.policy.SplitShadeStateController;
import com.android.systemui.user.domain.interactor.SelectedUserInteractor;
import com.android.systemui.util.LargeScreenUtils;
import com.android.systemui.util.kotlin.JavaAdapter;
import com.android.systemui.utils.windowmanager.WindowManagerProvider;

import lineageos.providers.LineageSettings;

import dalvik.annotation.optimization.NeverCompile;

import dagger.Lazy;
@@ -280,6 +286,9 @@ public class QuickSettingsControllerImpl implements QuickSettingsController, Dum
    /** The duration of the notification bounds animation. */
    private long mNotificationBoundsAnimationDuration;

    private int mOneFingerQuickSettingsIntercept;
    private final ContentObserver mOneFingerQuickSettingsInterceptObserver;

    private final Region mInterceptRegion = new Region();
    /** The end bounds of a clipping animation. */
    private final Rect mClippingAnimationEndBounds = new Rect();
@@ -340,7 +349,8 @@ public class QuickSettingsControllerImpl implements QuickSettingsController, Dum
            SplitShadeStateController splitShadeStateController,
            Lazy<CommunalTransitionViewModel> communalTransitionViewModelLazy,
            Lazy<LargeScreenHeaderHelper> largeScreenHeaderHelperLazy,
            WindowManagerProvider windowManagerProvider
            WindowManagerProvider windowManagerProvider,
            SelectedUserInteractor selectedUserInteractor
    ) {
        SceneContainerFlag.assertInLegacyMode();
        mPanelViewControllerLazy = panelViewControllerLazy;
@@ -390,6 +400,17 @@ public class QuickSettingsControllerImpl implements QuickSettingsController, Dum
        mJavaAdapter = javaAdapter;

        mLockscreenShadeTransitionController.addCallback(new LockscreenShadeTransitionCallback());

        mOneFingerQuickSettingsInterceptObserver = new ContentObserver(null) {
            @Override
            public void onChange(boolean selfChange) {
                mOneFingerQuickSettingsIntercept = LineageSettings.System.getIntForUser(
                        mPanelView.getContext().getContentResolver(),
                        LineageSettings.System.STATUS_BAR_QUICK_QS_PULLDOWN, 0,
                        selectedUserInteractor.getSelectedUserId());
            }
        };

        dumpManager.registerDumpable(this);

        mWindowManagerProvider = windowManagerProvider;
@@ -590,7 +611,22 @@ public class QuickSettingsControllerImpl implements QuickSettingsController, Dum
                        MotionEvent.BUTTON_SECONDARY) || event.isButtonPressed(
                        MotionEvent.BUTTON_TERTIARY));

        return twoFingerDrag || stylusButtonClickDrag || mouseButtonClickDrag;
        final float w = mQs.getView().getMeasuredWidth();
        final float x = event.getX();
        float region = w * 1.f / 4.f; // TODO overlay region fraction?
        boolean showQsOverride = false;

        switch (mOneFingerQuickSettingsIntercept) {
            case 1: // Right side pulldown
                showQsOverride = mQs.getView().isLayoutRtl() ? x < region : w - region < x;
                break;
            case 2: // Left side pulldown
                showQsOverride = mQs.getView().isLayoutRtl() ? w - region < x : x < region;
                break;
        }
        showQsOverride &= mBarState == StatusBarState.SHADE;

        return twoFingerDrag || showQsOverride || stylusButtonClickDrag || mouseButtonClickDrag;
    }

    @Override
@@ -2215,12 +2251,20 @@ public class QuickSettingsControllerImpl implements QuickSettingsController, Dum
                mNotificationStackScrollLayoutController.setQsHeader((ViewGroup) mQs.getHeader());
            }
            mQs.setScrollListener(mQsScrollListener);
            mPanelView.getContext().getContentResolver().registerContentObserver(
                    LineageSettings.System.getUriFor(
                            LineageSettings.System.STATUS_BAR_QUICK_QS_PULLDOWN),
                    false, mOneFingerQuickSettingsInterceptObserver,
                    UserHandle.USER_ALL);
            mOneFingerQuickSettingsInterceptObserver.onChange(true);
            updateExpansion();
        }

        /** */
        @Override
        public void onFragmentViewDestroyed(String tag, Fragment fragment) {
            mPanelView.getContext().getContentResolver().unregisterContentObserver(
                    mOneFingerQuickSettingsInterceptObserver);
            // Manual handling of fragment lifecycle is only required because this bridges
            // non-fragment and fragment code. Once we are using a fragment for the notification
            // panel, mQs will not need to be null cause it will be tied to the same lifecycle.